JAVA多态的动态绑定机制(重要知识)

java的多态相信大家并不陌生,但说到多态的动态绑定机制,可能就不有所不解了

下面有段代码可以让你了解什么是动态绑定机制

package com.hmdstu.poly_.dynamic_;

/**
 * @author XXX
 * @version 1.0
 */
public class DynamicBinding_Stu {
    public static void main(String[] args) {
        //编译类型为 A,运行类型为 B
        A a = new B();
        a.sum();
    }
}
class A{
    private int n1 = 10;

    public void sum(){
        System.out.println(getN1() + n1);
    }

    public int getN1() {
        return n1;
    }
}
class B extends A {
    private int n1 = 100;

    public void sum(){
        System.out.println(getN1() + n1);
    }

    @Override
    public int getN1() {
        return n1;
    }
}

 代码解读:

有一个类A,以及一个类B并且继承了类A,并且子类B重写了父类A中的sum()方法,并且同时拥有一个int类型的属性n1。main()方法中用多态的形式 A类对象的引用a指向了子类对象B的一块堆空间,这个时候用引用a调用了sum()方法,这里首先会看编译类型A中是否存在sum()方法,如果存在,在看运行类型B中是否存在sum()方法,如存在,就调用,反之调用更具继承关系去找父类中找,直到找到为止。最后通过B类sum()方法得到 B类中getN1()+n1 为 200

如将B类中sum()方法去掉,会有什么结果?

package com.hmdstu.poly_.dynamic_;

/**
 * @author XXX
 * @version 1.0
 */
public class DynamicBinding_Stu {
    public static void main(String[] args) {
        //编译类型为 A,运行类型为 B
        A a = new B();
        a.sum();
    }
}
class A{
    private int n1 = 10;

    public void sum(){
        System.out.println(getN1() + n1);
    }

    public int getN1() {
        return n1;
    }
}
class B extends A {
    private int n1 = 100;

//    public void sum(){
//        System.out.println(getN1() + n1);
//    }

    @Override
    public int getN1() {
        return n1;
    }
}

去除B类中sum()方法后的代码解读:

这个时候你会发现变成了110,为什么不是20呢?

因为这个时候再通过引用a来调用sum()方法时,因为对象B中没有,所以根据继承关系找到父类A中的sum()方法,关键来了,这个时候输出调用的getN1()方法会更具动态绑定机制的原理也会先从运行类型B中寻找是否有getN1()方法,然后在去更具继承关系向上查找,所以得到的getN1的值就为100,因为属性看编译类型,所以这个sum方法中的n1调用的就是编译类型A中的属性n1,自然n1就等于10所以最后结果为110

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值