alm*_*art 2 java compiler-construction polymorphism inheritance
给出以下Java代码:
class mainul {
public static void main(String[] args) {
/*block 1*/
B b1 = new B();
A a1 = b1;
a1.m1(b1);
/*block 2*/
B b2 = new B();
B a2 = b2;
b2.m1(a2);
}
}
class A {
public static void p(Object o) {
System.out.println(o.toString());
}
public void m1(A a) {
p("m1(A) in A");
}
}
class B extends A {
public void m1(B b) {
p("m1(B) in B");
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这个程序的输出是
m1(A) in A
m1(B) in B
Run Code Online (Sandbox Code Playgroud)
由于a1的动态类型是B,我们可以预期块1的输出为"m中的m1(B)".我注意到A和B中的函数签名对于m1不匹配(一个期望一个对象类型A和另一个B作为其参数)和A中的方法似乎获得优先级但不能真正将其链接到我的输出,因为它似乎与block2的输出不一致.
谢谢你的时间
正如您所注意到的,B.m1(B)
不会覆盖A.m1(A)
,因为它们采用不同的参数(尝试添加@Override
注释,您将看到编译器抱怨).所以它永远不能通过引用来调用A
.
但是,它可以通过引用来调用B
.
归档时间: |
|
查看次数: |
184 次 |
最近记录: |