对于以下代码,为什么打印A,B?我希望它能打印B,B。而且,由JVM执行的方法调用是动态还是静态评估?
public class Main {
class A {
}
class B extends A {
}
public void call(A a) {
System.out.println("I'm A");
}
public void call(B a) {
System.out.println("I'm B");
}
public static void main(String[] args) {
Main m = new Main();
m.runTest();
}
void runTest() {
A a = new B();
B b = new B();
call(a);
call(b);
}
}
重载由编译器 静态 确定。 重写 是在执行时完成的,但这不是这里的因素。
的静态类型a
为A,因此第一个方法调用解析为call(A a)
。
我在超类中有一个重载方法的基本继承情况。 下面的类扩展了上面的类: main方法只是创建一个对象(静态和动态类型)并调用: 最后打印出来 看了这个,我想既然对象的静态和动态类型都是,它会调用Person中的重载方法,该方法将作为参数。由于我显然错了,我打开了一个调试器,假设类中的getWorkDetail(this)行中对“this”的引用一定已经变成了它的超级类。然而,这不是我发现的。 显然,在
问题内容: 谁能详细解释在我的测试代码段中使用实例时重载方法被调用的原因? 这里涉及虚拟方法或Java中方法重载/解析的特殊性吗?是否直接引用Java Lang Spec?哪个术语描述了这种行为?非常感谢。 问题答案: JLS在§8.4.9重载中规定: 调用方法时(第15.12节),实际参数(和任何显式类型参数)的数量以及参数的 编译时类型 在编译时用于确定将要调用的方法的签名( §15.12.2
我有一个Foo和Bar对象的列表,以及每个相应对象的转换器。 Convert-method需要有所不同,因为Bar1与Bar2和Bar3等有很大不同,但是我想创建一个方法来处理所有可能的列表。 是否可以创建一个泛型方法,根据列表的内容调用相应的非泛型方法? 到目前为止,我已经尝试过了: 但这并不能编译,因为"无法解析方法'Converts(T, S)'" 有什么想法吗?
Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。 如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。 例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。 这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之
我编写了下面的Scala代码来处理传入的字符串,格式化字符串,将其附加到中,并将带有转义unicode的格式化的返回给调用方进行其他处理。 Scala编译器在有调用的行中抱怨以下错误:
问题内容: 程序将返回3,而我的预期值为0。为什么方法f中的第一个强制转换什么都不做,而第二个有效?是因为在A和B类中,met方法被重载,因此使用静态绑定吗? 问题答案: 这就是多态性的工作方式。请考虑以下示例: 如预期的那样,将调用正确的方法。对象的方法表不仅仅因为更改存储在其中的变量的类型而改变,因为an 和它的方法之间的绑定比存储类型和与其相关的方法之间的绑定更强大。第二种类型起作用,因为输