java——重载解析、静态绑定、动态绑定
重载解析:
a被声明为A类型的对象,调用method()方法时,如果有多个同名方法,参数不同,编译器将列举所用类A的method()方法和所用父类中public类型的method()方法,编译器查看这些方法的参数列表,选择完全匹配的,调用该方法。
静态绑定(编译时绑定):
当程序的方法运行采用静态绑定,虚拟机一定调用对象的实际类型最合适的类的方法。
动态绑定(运行时绑定):
所有父类类型的引用可以调用父类的所有(这里和静态绑定不同)属性和方法,但是子类定义而父类没有定义的方法是不可以调用的(这里也不同)。
public class exp { public static void main(String[] args) { BaseClass sub = new SubClass(); sub.method1();//baseclass method1 sub.method3();//subclass method3 // sub.method2();//报错:The method method2() is undefined for the type BaseClass System.out.println(); SubClass sub2 = new SubClass(); sub2.method1();//baseclass method1 sub2.method2();//subclass method2 sub2.method3();//subclass method3 } } class BaseClass{ public void method1() { System.out.println("baseclass method1"); } public void method3() { System.out.println("baseclass method3"); } } class SubClass extends BaseClass{ public void method2() { System.out.println("subclass method2"); } public void method3() { System.out.println("subclass method3"); } }
从这个例子可以看出,使用父类类型的引用指向子类的对象时,该引用只能调用父类中已经定义的方法和变量,子类中新创建的方法不能用。如果子类重载父类方法,该引用调用的就是子类的方法。
这样来看,好像静态绑定就是这种:
Dog dog = new Dog();
而动态绑定就是这种:
Animal a = new Dog();
emmm, 目前来看我是这样理解的。