多态(动态绑定):是指在执行的过程中判断引用的实际类型,然后调用相应的方法。
多态的三要素:
1.继承
2.重写
3.基类引用指向子类对象
举个例子:
package demo.polymorphism;
class Person{
private String name;
Person(String name){
this.name = name;
}
public void display(){
System.out.println("I'm a Person");
}
}
class Student extends Person{//继承
private String school;
Student(String name,String school){
super(name);
this.school = school;
}
public void display(){//重写
System.out.println("I'm a Student");
}
}
public class Polymorphism{
public static void main(String [] args){
Person p = new Student("wujl","www.tcu.edu.cn");//基类引用指向子类对象
p.display();
}
}
运行的结果为:
I'm a Student
下图为此段代码运行完成后的内存分配情况:
由以上例子可以知道。
code区中应有两个display方法。但是当Person对象p去调用这个方法时究竟调用哪一个呢?首先,调用哪一个不是由这个对象的引用来决定的,而是看你实际new出来的对象是什么类型的。这里new出来的是Studnet对象,所有调用的Student中display的实现。
解释一下上图中Student对象中Person基类中的Display。这个Display其实是指向这段代码中的Display方法地址的一个引用。当没有new处新的对象的时候,它是指向Person对象的那个Display方法。当真正new出来一个Student对象的时候,这个引用就指向了新new出来的那个对象类型的Display方法的地址。这个过程其实就是动态绑定的过程。所以在最后调用的时候,其实调用的是Student的Display方法,而不是Person类的。
目前就知道这么多,也不知道说清楚了没有。如果有什么不对的地方,还请大家指教。