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();
}
}
这个的输出结果为:
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程序员面试笔试》