Java子类方法重写

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)

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

Mal*_*olm 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可以使用的任何地方使用.