多态性--虚拟方法调用
1.正常的方法调用
Person e = new Person();
e.getlnfo();
Student e = new Student();
e.getlnfo();
2.虚拟方法调用(多态情况下)
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法,这样的方法调用在编译期是无法确定的。
Person e = new Student();
e.getlnfo(); //调用Student类的getlnfo()方法
3.编译时类型和运行时类型
编译时 e 为Person类型,而方法的调用是在运行时确定,所以调用的是Student类的getlnfo()方法。-----动态绑定
小结:从编译与运行的角度看方法重载与方法重写
重载,是指允许存在多个同名方法, 而这些方法的参数不同。编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定了。Java的重载是可以包括父类和子类的,即子类可以重载父类的同名不同参数的方法。
所以:对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或"静态绑定
而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”
引用一句Bruce Eckel的话: “不要犯傻,如果它不是晚绑定,它就不是多态。
此为本人学习笔记,若有错误,请不吝赐教