class A {
public void fun(double d) {
System.out.println("A");
}
}
class B {
public void fun(int i) {
System.out.println("B");
}
}
class C extends A {
public void fun(int i) {
System.out.println("C");
}
}
class D extends B {
public void fun(double d) {
System.out.println("D");
}
}
class E extends B {
public void fun(double d) {
System.out.println("E");
}
public void fun(int i) {
System.out.println("F");
}
}
public class Test {
public static void main(String[] args) {
C c = new C(); c.fun(6); //line 1
D d = new D(); d.fun(6); //line 2
A x = new C(); x.fun(6); //line 3
B y = new D(); y.fun(6); //line 4
B z = new E(); z.fun(6); //line 5
}
}
该代码的输出是:
C
乙
A
乙
F
不知道为什么第 3 行的输出不是“C”而是“A”。由于正在发生动态绑定,不应该调用类中的方法吗?
对于第 5 行中的代码,发生动态绑定并且输出是“F”而不是“B”,但第 3 行不会发生同样的情况。
动态绑定适用于具有相同签名的方法。
当你调用变量的方法时x
,其编译时类型为A
,仅在类中定义的方法A
(或其超类)可以被编译器考虑(方法重载决策在编译时发生)。这意味着仅public void fun(double d)
被认为。
Since C
's public void fun(int i)
有不同的签名,它不会覆盖A
的方法,因此即使变量的运行时类型也无法执行x
is C
.
第 5 行的行为有所不同。这里的编译时类型z
is B
,和班级B
has a public void fun(int i)
方法。由于运行时类型为z
is E
, and E
还有一个带有签名的方法public void fun(int i)
, E
的方法覆盖B
的方法,因此E
的方法被执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)