自己在学习多态的时候有看到这么一个例子, 但是不是很理解, 如下:
// 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()
方法, 但是实际情况好像并非如此, 因此比较迷惑.
希望能有前辈可以指点一二, 不胜感激.
new C()
创建的就是一个C的对象,跟你把它赋值给什么变量没有关系,不管是A还是B还是C还是Object。调用
c.add
就是调用c对象的add方法,与c被声明成什么类型无关。C没有重写add
方法,则它的add
方法继承自它的直接父类B