多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。
发送消息给某个对象,让该对象自行决定相应何种行为,这一机制称为多态。
向上转型
通俗地讲就是子类转型为父类。
定义一个父类类型的引用指向子类对象。
Father father=new Son();//向上转型
- 父类引用可以调用父类中定义的所哟变量和方法,而对于子类中定义而父类中没有的方法,则无法调用。
- 父类中的一个方法只有在父类中定义而在子类中没有重写的时候才可调用,若子类重写了,则调用的是子类的这个方法。这就是 动态连接。
运行时绑定
将一个方法调用和一个方法主体连接到一起的机制称为绑定。
绑定可分为:
- 早期绑定(静态绑定或编译时绑定)
- 后期绑定(动态绑定或运行时绑定)
多态是依靠动态绑定实现的,即JVM在运行时确定调用哪个同名方法。
1. 在向上转型情况下的动态绑定
public class Son extends Father{
public String s="Son";
@Override
public void method(){
System.out.println("Son.method");
}
public void sonMethod(){
System.out.println("Son.sonMethod");
}
public static void main(String[] arg){
Father father=new Son();//向上转型
father.method();//Son.method
((Son) father).sonMethod();//Son.sonMetho
System.out.println( father.s);//Father
System.out.println(((Son) father).s);//Son
}
}
class Father{
public String s="Father";
public void method(){
System.out.println("Father.method");
}
}
2. 在处理Java类的成员变量时,并不是采用运行时绑定,而是采用静态绑定
对象的方法可以找到子类,而对象的成员变量仍是父类的。
多态具体的表现
多态有四种体现形式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
1.接口和接口的继承。
2.类和类的继承。
3.重载。
4.重写。
多态的实现方法
Java多态性实现的主要表现形式有继承多态、抽象多态、接口多态。
1.继承实现的多态
(1)方法的重写
子类重定义父类的方法,以提供不同形式的实现(多态性)
(2)方法的重载
在完成同一功能时,需要根据不同的具体情况,来实现不同的方法内容(多态性)
2.抽象类实现的多态
每一个实现抽象类的子类都可以对抽象方法进行不同的实现(多态性)
3.接口实现的多态
实现了多态性的“一个接口多种实现”