class AP{ public AP() { g();//这里到底会调用哪一个函数呢》是父类AP的,仍是子类A } public void f() { System.out.println("AP f()"); } public void g() { System.out.println("AP g()"); } } public class A extends AP{ @Override public void f() { System.out.println("A f()"); } @Override public void g() { System.out.println("A g()"); } public static void main(String[] args) { AP instance = new A(); instance.f(); instance.g(); } }
这个的输出结果为:java
A g() A f() A g()
结果分析: 运行结果告诉咱们,在建立子类时,同时也会调用父类的构造函数, 但,当咱们在构造函数 public AP()中调用g()时,代码运行的是 子类中覆盖的g()方法。 原理: 这个是因为java的动态绑定机制致使的,(绑定指的是讲一个方法调用和一个方法主体链接 到一块儿),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象 方法。由于此时内存中存在的对象为 A class,因此在AP() {g();} 这里调用的g()方法 实体为 @Override public void g() { System.out.println("A g()"); }
补充:程序员
只有类中的方法才有多态的概念,类中的成员没有,下面举个例子
class AP{ public String string = "AP"; } public class A extends AP{ public String string = "A"; public static void main(String[] args) { AP instance = new A(); System.out.println(instance.string); } }
这段代码的输出结果为:面试
AP//而不是 A
参考资料:《Java程序员面试笔试》
ide