您的位置:首页 > 编程语言 > Java开发

Java多态机制的特点

2016-03-10 00:00 274 查看
摘要: 通过一道题目来深入理解多态中的动态绑定

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程序员面试笔试》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JavaSE 多态 动态绑定