我正在尝试以下代码:
interface Callee {
public void foo(Object o);
public void foo(String s);
public void foo(Integer i);
}
class CalleeImpl implements Callee
public void foo(Object o) {
logger.debug("foo(Object o)");
}
public void foo(String s) {
logger.debug("foo(\"" + s + "\")");
}
public void foo(Integer i) {
logger.debug("foo(" + i + ")");
}
}
Callee callee = new CalleeImpl();
Object i = new Integer(12);
Object s = "foobar";
Object o = new Object();
callee.foo(i);
callee.foo(s);
callee.foo(o);
打印foo(Object o)
三遍。我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?是否有修改此代码,以便它会打印的方式foo(12)
,foo("foobar")和foo(Object o)?
我希望方法选择要考虑实际的(而不是声明的)参数类型。我想念什么吗?
是。您的期望是错误的。在Java中,动态方法分派仅发生在调用方法的对象上,而不发生在重载方法的参数类型上。
引用Java语言规范:
调用方法时(第15.12节),实际参数(和任何显式类型参数)的数量以及参数的编译时类型 在编译时用于确定将被调用的方法的签名( §15.12.2)。如果要调用的方法是实例方法,则将在运行时使用动态方法查找(第15.12.4节)确定要调用的实际方法。
本文向大家介绍基于Java中参数顺序的方法重载,包括了基于Java中参数顺序的方法重载的使用技巧和注意事项,需要的朋友参考一下 在方法重载中,该类可以有多个具有相同名称的方法,但方法的参数列表不应相同。确保参数列表不同的一种方法是更改方法中参数的顺序。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程序。 在方法重载的实现中,使用两个方法创建PrintValues类。其中的第一个分别
问题内容: 我试图弄清楚Java如何选择执行哪种方法: 我在这里学到的是 方法签名是根据编译时数据类型确定的 实际调用的方法取决于调用该方法的对象的动态类型。 基于此,前两个调用的结果符合预期。但是,我不理解示例3和4的结果。 它似乎是在Java语言规范中指定的,但我不理解。 问题答案: 但是,我不理解示例3和4的结果。 好吧,让我们单独看一下。 例子3 重要的部分是表达式和的 编译时 类型。 仅
问题内容: 示例代码为: 输出为: 的第一个调用会调用带有String参数的方法,根据可以理解。 1)谁能解释我在先前的调用中是基于什么来调用的? 2)再说一次,说一个if条件: 它总是使用 调用方法。 编译器在编译时会计算表达式吗?我想知道表达式是在编译时还是在运行时计算的。谢谢。 问题答案: Java使用早期绑定。在编译时选择最具体的方法。根据参数数量和参数类型选择最具体的方法。在这种情况下,
我读了一篇关于使用选项作为方法参数的文章,大家一致认为永远不要使用选项作为方法参数。 Guava可选作为可选参数的方法参数 这种使用作为方法参数的情况合法吗?如果不是,我如何使这是可列举的?
本文向大家介绍Java基于高精度整型实现fibonacci数列的方法,包括了Java基于高精度整型实现fibonacci数列的方法的使用技巧和注意事项,需要的朋友参考一下 本文以实例形式讲述了Java基于高精度整型实现fibonacci数列的方法,分享给大家供大家参考之用。具体方法如下: 希望本文所述对大家的Java程序设计有所帮助。
本文向大家介绍我们可以在Java中基于不同的返回类型但参数类型和数字相同的方法重载吗?,包括了我们可以在Java中基于不同的返回类型但参数类型和数字相同的方法重载吗?的使用技巧和注意事项,需要的朋友参考一下 当一个类具有两个或多个具有相同名称但参数不同的方法时,在基于传递的参数进行调用时,将调用相应的方法(或相应的方法主体将与调用行动态绑定)。这种机制称为方法重载。 示例 具有相同参数和不同返回类