Java—当继承、多态、重载和重写都涉及时,调用哪个函数?
我有一个涉及继承、多态、重载和重写的问题。我理解所有这些术语,但不确定它们在这里是如何工作的。代码如下:Java—当继承、多态、重载和重写都涉及时,调用哪个函数?,java,inheritance,polymorphism,overriding,overloading,Java,Inheritance,Polymorphism,Overriding,Overloading,我有一个涉及继承、多态、重载和重写的问题。我理解所有这些术语,但不确定它们在这里是如何工作的。代码如下: class A { public String show(D obj) {return "A and D";} public String show(A obj) {return "A and A";} } class B extends A { public String show(B obj) {return "B and B";} public Stri
class A {
public String show(D obj) {return "A and D";}
public String show(A obj) {return "A and A";}
}
class B extends A {
public String show(B obj) {return "B and B";}
public String show(A obj) {return "B and A";}
}
class C extends B{}
class D extends B{}
public class whatever {
public static void main(String[] args) {
A a = new B(); // note the B here
B b = new B();
C c = new C();
D d = new D();
System.out.println(a.show(a)); // B and A
System.out.println(a.show(b)); // B and A
System.out.println(a.show(c)); // B and A
System.out.println(a.show(d)); // A and D
}
}
所以这里的任务是找到输出。我已经有了答案,这些是我的评论
我理解第一个,因为Java自动执行动态绑定,所以a.show()从B类调用show(),a是a类型,所以调用B.show(a obj)
最后一个也是有意义的,show()方法是重载的,因为d是d类型,所以调用了从A类继承的A.show(d obj)
另外两个我有麻烦。我明白这是有道理的,因为从技术上讲,b和c都是A类型的对象,但为什么它与“b和A”一起出现在“b和b”之上呢?声明的
A
类型是A
A只有两个方法:一个采用A(b和c都是A的实例),另一个采用D(b和c都不是D的实例)
所以第一个方法匹配,第二个不匹配。因此,编译器选择了第一种方法
此方法在B中被重写,并且a
的具体类型为B,因此打印“B和a”
方法
B.show(B)
不会重写方法A.show(A)
,因为它不采用与参数相同的类型。声明的A
类型是A
A只有两个方法:一个采用A(b和c都是A的实例),另一个采用D(b和c都不是D的实例)
所以第一个方法匹配,第二个不匹配。因此,编译器选择了第一种方法
此方法在B中被重写,并且a
的具体类型为B,因此打印“B和a”
方法
B.show(B)
不会重写方法A.show(A)
,因为它不采用与参数相同的类型。这里有两个概念,一个是重载,另一个是重写。当您创建一个A=新B()时;意思是a是B的对象,有a的类型。因此,当执行a.show(a)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后将参数与类型匹配,但“a”是B的实例,因此执行类B的方法show(a obj)
现在,当执行a.show(c)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后在类a内找不到与c类型参数匹配的任何方法,但仍然执行它,因为类c扩展了B,而B扩展了a
简而言之,我们可以这样说
a、 show(a)相当于a.show(b)和a.show(c)。这里有两个概念,一个是重载,另一个是重写。当您创建一个A=新B()时;意思是a是B的对象,有a的类型。因此,当执行a.show(a)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后将参数与类型匹配,但“a”是B的实例,因此执行类B的方法show(a obj) 现在,当执行a.show(c)时,它首先遇到类a的show(a obj)和show(B obj)方法,然后在类a内找不到与c类型参数匹配的任何方法,但仍然执行它,因为类c扩展了B,而B扩展了a 简而言之,我们可以这样说
a、 show(a)相当于a.show(b)和a.show(c)。Oh,因此它首先查看声明的类型,然后选择重写的方法。我倒过来想,我想它只是马上看具体的类型。谢谢你的帮助!哦,它首先查看声明的类型,然后选择重写的方法。我倒过来想,我想它只是马上看具体的类型。谢谢你的帮助!