java 多态多个继承的疑惑?

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

// 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()方法, 但是实际情况好像并非如此, 因此比较迷惑.

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

阅读 2.9k
3 个回答

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

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

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

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

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题