概念:

多种形态

编译时多态

1.方法重载。
2.编译阶段就能确定某个名称的方法有多种形态。

运行时多态

两种类型:

编译时类型:声明变量时指定的类型 编译时类型决定了通过当前引用变量可以访问哪些字段和方法。
运行时类型:运行期所指向的对象类型 可以通过getClass()方法来获取运行时类型

前提:

子类重写了从父类继承的方法
父类类型的引用变量 指向了子类类型的对象

效果

运行期间父类类型的引用变量指向哪个子类类类型的实例,就调用哪个实例的方法

引用类型的类型转换

public class Human {
public void eat( String foodName ) {
System.out.println( “人可以吃” + foodName );
}
}

public class Sinaean extends Human {
public void eat( String foodName ) {
System.out.println( “中国人用筷子吃” + foodName );
}
public void taiChi(){
System.out.println( “许多中国人喜欢打太极拳” );
}
}

public class HumanTest3 {
public static void main(String[] args) {
// 父类类型的引用变量 指向 子类类型的对象
Object o = new Sinaean();
// o.eat( “藜蒿炒腊肉” ); //【错误】变量 o 的编译时类型是 Object ,其中并没有声明 eat 方法
if( o instanceof Human ) {
Human h = (Human) o ;
h.eat( “藜蒿炒腊肉” ); // 变量 h 的编译时类型是 Human ,其中是包含被调用的 eat 方法
System.out.println( o == h ); // true
}
if( o instanceof Sinaean ) {
Sinaean s = (Sinaean) o ;
s.eat( “宫爆鸡丁” );
s.taiChi(); // 变量 s 的编译时类型是 Sinaean ,其中是包含被调用的 taiChi 方法
System.out.println( o == s ); // true
}
}
}