Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
package 多态;
class PClass{
public int age=40;
public void test(){
System.out.println("这是父类的test方法");
}
}
public class CClass extends PClass {
public int age=18;
public void test(){
System.out.println("这是子类的test方法");
}
public static void main(String[] args) {
PClass plo=new CClass();
plo.test();
System.out.println(plo.age);
}
}
PClass plo=new CClass();由这条语句可以看出,plo变量有一定的特殊性,它在编译时的类型是PClass,而运行时类型却是CClass,当调用test()方法(PClass类中定义了该方法,子类CClass覆盖了父类的方法)时,实际执行的是CClass类中覆盖后的test()方法,这就出现了多态。
也就是说,当运行时调用该引用变量(也就是程序中的plo)的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。
与方法不同的是,对象的实例变量则不具备多态性,比如上面的程序中输出的age变量时父类的age,而非子类。