我很确定我的继承优先权,但我希望得到确认:
class C1 {
public int relation( C1 MyC2 ){
//Do stuff
}
}
class C2 extends C1{
public int relation( C2 MyC2){
//Do stuff
return super.relation((C1) MyC2);
}
}
我的理解是C2#relation()实际上不会覆盖C1#关系,因此以下语句都是合法的:
MyC1_1.relation(MyC1_2); //Calls C1#relation()
MyC2_1.relation(MyC1_1); //Calls C1#relation()
MyC2_1.relation(MyC2_2); //Calls C2#relation()
以下是错误的
MyC1_1.relation(MyC2_1);
如果我是对的,那很好。否则,我很想知道为什么......
答案 0 :(得分:6)
为了覆盖方法,它必须具有签名,该签名是被覆盖方法签名的子签名。根据Java语言规范:
方法m1的签名是方法签名的子签名 如果是,则为m2:
- m2与m1具有相同的签名,或
- m1的签名与m2签名的擦除相同。
这基本上意味着方法必须具有相同的名称和参数(并且还要考虑类型擦除)。
因此,在您的情况下,relation(C1 c1)
无法覆盖relation(C2 c2)
。这意味着C1类只有第一种方法,C2都有。这就是为什么你的假设绝对正确,除了最后一个(MyC1_1.relation(MyC2_1)
),这也是一个正确的陈述。 C2是C1的子类,因此C2可以在C1可以的任何地方使用。
答案 1 :(得分:1)
所有方法都是正确的:
因为这不是覆盖,所以这是重载
“public int relation(C1 MyC2)”不会被“public int relation(C2 MyC2)”覆盖。
你可以在“public int relation(C2 MyC2)”
之上添加@override答案 2 :(得分:0)
我会说第一批的第二条指令:
MyC2_1.relation(MyC1_1); //Calls C1#relation()
是非法的,您怀疑是非法的是正确的。
这是因为C2 超过 C1(它具有C1所有的,加上更多的东西),因为它extends
C1 - 所以,你想要的任何地方都是C1,C2也没关系。
同时,C1 小于 C2,对于上述原因的'revert',所以在预期C2的情况下,C1将是不够的。