java 多态多个继承的疑惑?

发布于 2022-09-11 20:31:48 字数 1282 浏览 23 评论 0

自己在学习多态的时候有看到这么一个例子, 但是不是很理解, 如下:

// Test.java
public class Test {
    public static void main(String[] args) {
        A c = new C();
        c.add(); // "C"
    }
}

class A {
    public void add() {
        System.out.println("A");
    }
}

class B extends A {
    public void add() {
        System.out.println("B");
    }
}

class C extends B {
    public void add() {
        System.out.println("C");
    }
}

有三个类, 关系为 C 继承 B, B 继承 C, 同时三个类里面都有一个add()方法, 此时如果创建A c = new C();以后, 再调用c.add();输出是 "C", 说明是调用了 C 里面的add()方法

但是如果我改成这样:

public class Test {
    public static void main(String[] args) {
        A c = new C();
        c.add(); // "B"
    }
}

class A {
    public void add() {
        System.out.println("A");
    }
}

class B extends A {
    public void add() {
        System.out.println("B");
    }
}

class C extends B {
//    public void add() {
//        System.out.println("C");
//    }
}

即 C 里面没有add()方法了, 为什么输出是 "B", 而不是 "A"?

我自己的理解是: 我在创建 c 这个对象的时候是使用的 A 类似, 那么如果 C 里面没有add()方法, 就无法重写, 应该直接调用 A 里面的add()方法, 但是实际情况好像并非如此, 因此比较迷惑.

希望能有前辈可以指点一二, 不胜感激.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

请远离我 2022-09-18 20:31:48

new C()创建的就是一个C的对象,跟你把它赋值给什么变量没有关系,不管是A还是B还是C还是Object。

调用c.add就是调用c对象的add方法,与c被声明成什么类型无关。C没有重写add方法,则它的add方法继承自它的直接父类B

爱要勇敢去追 2022-09-18 20:31:48

首先Java原则上没有多继承,只有类与类之间的单继承,因此Class C继承Class B只需要关注B的方法有没有被C重写,如果没有则完全继承B的所有方法实现。同理Class B和Class A的关系也是如此。

如果想要输出A,那上述的情况是B也不重写add()方法,完全继承A的add()方法

╭ゆ眷念 2022-09-18 20:31:48

java继承的方法有覆写的概念,且方法的调用是动态绑定的,因此c在调用add()时发现自己没有覆写,便会一层层向上找

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文