欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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值了。