public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
D d = new D();
a.m(c);//AB
b.m(c);//BB
}
}
class A{
public void m(A a){
System.out.println("AA");
}
public void m(B b){
System.out.println("AB");
}
}
class B extends A{
public void m(A a){
System.out.println("BA");
}
public void m(B b){
System.out.println("BB");
}
}
class C extends B{}
class D extends B{}
什么地方不能理解吗?
这个你定义的四个类的关系图。B 继承了 A,并且重写了 A 的两个方法。所以 a.m(c) = AB,而 b.m(c)=BB。至于 C 为什么能作为参数传递进 m(B b) 和 m(A a)。是因为 C 继承了 B,B 继承了 A。那么 C 拥有了 B 和 A 的所有对外的方法和属性。所以就可以传递进去。
这个你要了解java的继承与多态的一些基本概念,A是B,C,D的基类,所有B,C,D类的实例或者叫变量都可以作为参数A传入(JAVA里面所有的子类都可以直接赋值给父类);但具体传了那个类的实例,就执行那个类的构造函数,这是多态重载的概念了,需要更详细的学习JAVA,可以参考该地址:https://edu.csdn.net/course/detail/2981
先说打印结果:
AB
BB
接下来我们开始反向分析:
首先A,B,C,D 构造方法中都是空方法执行,因此下面代码执行后不会打印任何内容。
A a = new A();
B b = new B();
C c = new C();
D d = new D();
然后当执行下面方法的时候,会涉及到继承,重载和重写的知识点。
a.mc(c);
总结如下:
同时需要注意的是,当前类的方法和父类的方法名称,参数,返回值等都一样的时候,触发方法重写,即子类的方法会覆盖了父类的方法,父类的方法不会被执行。
当类的方法名称一样,但是参数列表不一样的时候触发重载,即:子类增加了一个和父类中方法名称相同,但是参数列表不同的方法。
上面如果比较绕,那么我们举个例子:
示例中的儿子就相当于有父类的,父亲就相当于A 没有父类,自己就是顶级父类,他们的方法执行判断流程大致如下:
这样说不知道你能不能理解。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632