请问这段代码该怎么解释

 
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