java 动态绑定VS静态绑定

基本概念

绑定:指一个方法的调用与类或者类对象进行关联

静态绑定:编译期行为,在编译期进行绑定,java-->.class文件

动态绑定:运行时行为,程序在运行过程中,根据具体的类对象进行方法调用(绑定)


区别:

a.private,final,static 的方法和变量是静态绑定

b.静态绑定关联类信息,动态绑定关联类对象

c.重载是静态绑定,重写是动态绑定


示例:

public class DynamicStaticBindingTest {

    void method(String str) {
        PrintUtil.print("this is method reloading(String str),str =" + str);
    }

    void method(Integer o) {
        PrintUtil.print("this is method reloading(Integer o),o=" + o);
    }

    public static void main(String[] args) {
        A a = new B();
        PrintUtil.print(a.x);
        PrintUtil.print(a.getX());
        a.doSomething();
        DynamicStaticBindingTest dd = new DynamicStaticBindingTest();
        dd.method(123);
        dd.method("hello world");
    }
}

class A {
    int x = 5;

    public int getX() {
        return x;
    }

    public void doSomething() {
        PrintUtil.print("this is class A");
    }
}

class B extends A {
    int x = 6;

    @Override
    public int getX() {
        return x;
    }

    @Override
    public void doSomething() {
        PrintUtil.print("this is class B");
    }
}

运行结果:

5
6
this is class B
this is method reloading(Integer o),o=123
this is method reloading(String str),str =hello world


结果分析:

DynamicStaticBindingTest 中的method方法是重载方法,程序会根据传入参数的类型来调用(绑定)具体的方法,这个过程在编译期进行,即静态绑定

类B继承类A,doSomething()方法是重写方法,程序在调用a.doSomething()时,会根据a的实例类型进行方法调用,这里调用的是B类中的方法,这个过程就是动态绑定


变量可以进行静态绑定或者动态绑定吗?

java中的变量没有多态的概念,所以变量就不存在动态绑定,变量都是在编译期进行绑定。

因此,例子中

PrintUtil.print(a.x);

编译期a的类型是A,所以a.x=5;

如果对x属于类A还是类B有疑惑,可以将类B的 x变量更名为y,然后调用a.y,编译器会提示编译错误,所以说x属于类A


有办法实现变量的重写吗?

答案是肯定的,通过方法进行实现动态绑定,例子中通过getX()方法实现变量重写。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值