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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值