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()
方法, 但是实际情况好像并非如此, 因此比较迷惑.
希望能有前辈可以指点一二, 不胜感激.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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()时发现自己没有覆写,便会一层层向上找