java的动态绑定机制

Java重要特性:动态绑定机制

案例1(引入)

public class DynamicBinding {

    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());	//40
        System.out.println(a.sum1());	//30
    }
}
class A {
    public int i = 10;
    public int sum(){
        return getl() + 10;
    }
    public int sum1(){
        return i + 10;
    }
    public int getl(){
        return i;
    }
}

class B extends A{
    public int i = 20;
    public int sum(){
        return i + 20;
    }
    public int getl(){
        return i;
    }
    public int sum1(){
        return i + 10;
    }
}

A a = new B();是向上转型,调用方法看运行类型
a.sum()和a.sum1()分别输出40和30,这一点毫无疑问

案例2(动态绑定机制-调用对象方法)

如果把上述子类中的sum()注释掉,结果会有什么不同?

public class DynamicBinding {

    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }
}
class A {
    public int i = 10;
    public int sum(){
        return getl() + 10;
    }
    public int sum1(){
        return i + 10;
    }
    public int getl(){
        return i;
    }
}

class B extends A{
    public int i = 20;
//    public int sum(){
//        return i + 20;
//    }
    public int getl(){
        return i;
    }
    public int sum1(){
        return i + 10;
    }
}

这个时候a.sum()访问子类,发现子类中没有sum方法,再去访问父类,父类中有sum方法,调用的过程中getl()出现了分歧,父类和子类中都有getl(),该调用哪一个?
这里就体现出java的动态绑定机制

java的动态绑定机制
1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用

所以该案例中的a.sum()和a.sum1()分别输出30和30

案例3(动态绑定机制-调用对象属性)

接着把子类中的sum1()注销

public class DynamicBinding {

    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }
}
class A {
    public int i = 10;
    public int sum(){
        return getl() + 10;
    }
    public int sum1(){
        return i + 10;
    }
    public int getl(){
        return i;
    }
}

class B extends A{
    public int i = 20;
//    public int sum(){
//        return i + 20;
//    }
    public int getl(){
        return i;
    }
//    public int sum1(){
//        return i + 10;
//    }
}

根据案例2中对动态绑定机制的描述,很容易分析出
a.sum()和a.sum1()分别输出30和20

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值