Java中的静态绑定与动态绑定事例

在这个例子中使用Java面向对象中的多态来简单介绍静态绑定和动态绑定的区别。

/*
* 创建一个Father类。
* 为了方便获取,成员变量a设置为public的。
* */
class Father{
    public int a = 10;
    public void saying(){
        System.out.println("Father");
    }
}

写一个父类Father,其中定义一个整型成员变量a并初始化为10;定义一个成员方法saying,输出为”Father“。

 

/*
* 创建一个Son类,并继承Father类。
* */
class Son extends Father{
    public int a = 15;
    public void saying(){
        System.out.println("Son");
    }
}

在Son类中定义了与Father中同样名称的成员变量和成员方法,但是所含的内容不同。

 

/*
* 测试程序。
* 实例化一个Son对象,并指向其父类Father的引用person。
* 然后用person分别打印和执行成员变量和成员方法的值。
* */
public class Testone {
    public static void main(String[] args) {
        Father person = new Son();
        System.out.println(person.a);
        person.saying();
    }
}
/*
* output:
* 10
* Son
* */

可以看到,person.a的值是10而person.saying()的输出为Son。显然person并没有因为被指向一个Son的实例而改变其成员变量的值,这是因为person本身是一个Father类的引用,而成员变量是静态绑定的,所以a仍然是Father类的a。而在多态的特性里,成员方法是动态绑定的,所以你可以看到在这里因为Father类的引用person指向了Son类的实例导致person.saying()输出的是”Son“而不是”Father“。

那么如何使person.a的值变为Son类a的值呢?

我们可以先将person强制转化为Son。

System.out.println(((Son)person).a);

这样输出的a值就是Son类中的a值了。

猜你喜欢

转载自blog.csdn.net/a810373329/article/details/84676678