java中动态绑定机制

在 Java 中,动态绑定(Dynamic Binding)也称为后期绑定(Late Binding)。它是多态的一种实现机制。当一个对象的引用调用一个方法时,Java 会根据对象的实际类型(而不是引用的类型)来决定调用哪个方法的实现。这意味着在运行时才能确定具体调用的方法,而不是在编译时。

class A{
    public int i = 10;
    // 动态绑定机制
    // 1. 调用对象方法,方法和运行类型绑定
    // 2. 调用属性 无动态绑定,哪里调用哪里使用

    public int sum(){
        return getl() + 10; // 20 + 10 20是子类的方法
    }
    public int sum1(){
        return i + 10; // 10 + 10  10是本类的i
    }
    public int getl(){
        return i;
    }
}
class B extends A{
  private int i = 20;
    public int sum(){
        return getl() + 20;
    }

    public int sum1(){
        return i + 10;
    }
    public int getl(){
        return i;
    }
}

main方法中

public static void main(String[] args) {
    //a的编译类型 A 运行类型 B
    A a = new B();//向上转型
    System.out.println(a.i);
    System.out.println(a.sum());// 40  ->30
    System.out.println(a.sum1());// 30 ->20
    System.out.println(a.getl());
}

1.当调用对象方法时,该方法会和该对象的内存地址、运行类型绑定

A是一个基类,B是它的派生类。在main方法中,a是A类型的引用,但它实际指向一个B对象;

调用a.sum(),a.sum1()方法时,要判断,父类中是否存在该方法,然后会根据其指向的对象来选择调用的方法,即调用B类的sum(),sum1(), 而B类的sum(),sum1(), 中的i是B类本身的i = 20,

所以a.sum() = 40, a.sum1() = 30

2.当调用对象属性时,没有动态绑定机制,那里声明,那里使用

如果要输出类的属性,就会直接输出A类的i属性,属性看 = 左边 ,方法看 = 右边

现在我们如果把B类的public int getl(){ return i; }  注释掉,此时sum会调用父类的getI(),而属性i也是父类里面的,此时sum() = 30,sum1()调用的还是本类的属性i, sum1() = 30

这就是动态绑定的体系,运行时,它会根据对象的实际类型来确定调用正确的方法,并且调用正确的属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值