多态绑定机制分为静态绑定和动态绑定。
- 静态绑定:编译器准确地知道应该调用哪个方法。即在程序执行前方法已经被绑定。比如private方法,static方法,final方法或者构造器。
- 动态绑定:在程序运行时能够自动地选择调用哪个方法。即在运行时根据具体对象的类型进行绑定。
通过引用类型变量访问所引用的方法和属性的绑定机制
基类:
package six;
public class Base {
String var = "BaseVar";
static String staticVar = "staticBaseVar";
public void method(){
System.out.println("BaseMethod");
}
static void staticMethod(){
System.out.println("staticMethod of Base");
}
}
子类:
package six;
public class Sub extends Base{
String var = "SubVar";
static String staticVar = "staticSubVar";
public void method(){
System.out.println("SubMethod");
}
static void staticMethod(){
System.out.println("staticMethod of Sub");
}
public static void main(String[] args) {
Base b = new Sub();//b被声明为base类型,引用Sub实例
b.method();//打印Sub实例的method()方法。如果父类没有method()方法,则会报错。
b.staticMethod();//打印Base类的staticMethod()方法
System.out.println("var="+b.var+"***********"+"staticVar="+b.staticVar);//打印Base类的成员变量
}
}
打印结果:
SubMethod
staticMethod of Base
var=BaseVar***********staticVar=staticBaseVar
由此可见
- 实例方法与引用变量所引用的对象的方法绑定;
- 静态方法与引用变量所声明的类型的方法绑定;
- 成员变量(实例变量、静态变量)与引用变量所声明的类型的成员变量绑定。
- 辣么,为啥子嘞?
当父类引用指向子类对象时,由于是父类对象,所以编译器会先从父类中寻找相应实例方法,如果没有该实例方法,则编译错误。如果父类有实例方法,子类中也有该实例方法,则会覆盖父类 的实例方法,执行子类的实例方法。
由于静态方法不能被覆盖,准确说应该是静态绑定,所以只能与所声明类型的方法绑定。
至于变量,更是没有覆盖这一说,所以只能与所声明的类型的成员绑定啦啦啦~~~~