Fra*_*Man 1 java inheritance overriding
我很确定我有继承权,但我希望得到确认:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的理解是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()
Run Code Online (Sandbox Code Playgroud)
虽然以下是错误的
MyC1_1.relation(MyC2_1);
Run Code Online (Sandbox Code Playgroud)
如果我是对的,那很好.否则,我很想知道为什么......
为了覆盖方法,它必须有一个签名这是一个子签名的重载方法的签名.根据Java语言规范:
方法m1的签名是方法m2的签名的子签名,如果:
- m2与m1具有相同的签名,或
- m1的签名与m2的签名擦除相同.
这基本上意味着方法必须具有相同的名称和参数(并且还要考虑类型擦除).
因此在你的情况下relation(C1 c1)不能被覆盖relation(C2 c2).这意味着C1类只有第一种方法,C2都有.这就是为什么你的假设绝对正确,除了最后一个(MyC1_1.relation(MyC2_1)),这也是一个正确的陈述.C2是C1的子类,因此C2可以在C1可以使用的任何地方使用.