基本概念
绑定:指一个方法的调用与类或者类对象进行关联
静态绑定:编译期行为,在编译期进行绑定,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()方法实现变量重写。