Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java子类方法重写_Java_Inheritance_Overriding - Fatal编程技术网

Java子类方法重写

Java子类方法重写,java,inheritance,overriding,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); } } 我的理解是C2#relation()实际上并不凌驾于C1#

我很确定我有继承权,但我希望得到确认:

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#relation之上,因此以下陈述都是合法的:

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

如果我是对的,那太好了。否则,我想知道为什么…

我想说第一批的第二条指令:

MyC2_1.relation(MyC1_1); //Calls C1#relation()
是非法的,你怀疑非法的是正确的

这是因为C2比C1多(它拥有C1所拥有的一切,再加上更多),因为它
扩展了
C1-所以,无论你在哪里期望C1,C2都是可以的


同时,由于上述原因,C1小于C2,因此在预期C2的情况下,C1是不够的。

我认为第一批的第二条指令:

MyC2_1.relation(MyC1_1); //Calls C1#relation()
是非法的,你怀疑非法的是正确的

这是因为C2比C1多(它拥有C1所拥有的一切,再加上更多),因为它
扩展了
C1-所以,无论你在哪里期望C1,C2都是可以的


同时,由于上述原因,C1小于C2,因此在预期C2的情况下,C1是不够的。

所有方法都是正确的:

因为这不是覆盖,这是重载

“公共国际关系(C1 MyC2)”不会被“公共国际关系(C2 MyC2)”覆盖


您只需在“public int relation(C2 MyC2)”上面添加@override即可。

所有方法都是正确的:

因为这不是覆盖,这是重载

“公共国际关系(C1 MyC2)”不会被“公共国际关系(C2 MyC2)”覆盖


您只需在“public int relation(C2 MyC2)”上方添加@override即可。

为了覆盖一个方法,它必须具有一个签名,该签名是被覆盖方法签名的子签名。根据Java语言规范:

方法m1的签名是方法签名的子签名 m2,如果:

  • m2与m1具有相同的签名,或
  • m1的签名与m2签名的擦除相同
这基本上意味着方法必须具有相同的名称和参数(还考虑了类型擦除)


因此,在您的情况下,
关系(c1c1)
不能被
关系(c2c2)
覆盖。这意味着类C1只有第一个方法,而C2两者都有。这就是为什么你的假设是绝对正确的,除了最后一个(
MyC1\u 1.relation(MyC2\u 1)
),这也是一个正确的陈述。C2是C1的一个子类,因此C2可以在C1可以使用的任何地方使用。

为了覆盖方法,它必须有一个签名,该签名是被覆盖方法签名的子签名。根据Java语言规范:

方法m1的签名是方法签名的子签名 m2,如果:

  • m2与m1具有相同的签名,或
  • m1的签名与m2签名的擦除相同
这基本上意味着方法必须具有相同的名称和参数(还考虑了类型擦除)


因此,在您的情况下,
关系(c1c1)
不能被
关系(c2c2)
覆盖。这意味着类C1只有第一个方法,而C2两者都有。这就是为什么你的假设是绝对正确的,除了最后一个(
MyC1\u 1.relation(MyC2\u 1)
),这也是一个正确的陈述。C2是C1的一个子类,因此C2可以在C1可以使用的任何地方使用。

如果你在关系方法上使用
@Override
注释,编译器会告诉你它是否错误。如果你在关系方法上使用
@Override
注释,编译器会告诉你它是否错误。我不会否决你,但你错了,所有的陈述都是正确的。C2保留了超类中的方法,即使它们重载,调用它们也是完全有效的。是的,Malcolm,你是对的-该方法在C2中重载,而不是重写-我的错。谢谢你指出我不会投你反对票,但是你错了,所有的陈述都是正确的。C2保留了超类中的方法,即使它们重载,调用它们也是完全有效的。是的,Malcolm,你是对的-该方法在C2中重载,而不是重写-我的错。Thx指出这听起来很接近我的推理,它纠正了我将C2对象用作C1对象的失败实现。感谢您的详细评估。这听起来与我的推理非常接近,它纠正了我将C2对象用作C1对象的失败实现。谢谢你的详细评估。