Java中的静态绑定与动态绑定事例
程序员文章站
2024-03-21 12:01:34
...
在这个例子中使用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值了。