Java子类方法重写

时间:2011-11-19 21:21:38

标签: java inheritance override

我很确定我的继承优先权,但我希望得到确认:

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);

如果我是对的,那很好。否则,我很想知道为什么......

3 个答案:

答案 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将是不够的。