Java:多态(向上转型)
先来看一段代码:
class BaseClass{
public int book = 6;
public void base(){
System.out.println("父类的普通方法");
}
public void test(){
System.out.println("父类被覆盖的方法");
}
}
public class SubClass extends BaseClass{
//重新定义一个book实例成员变量隐藏父类的book实例成员变量
public String book = "轻量级Java EE企业应用实战";
public void test(){
System.out.println("子类的覆盖父类的方法");
}
public void sub(){
System.out.println("子类的普通方法");
}
public static void main(String[] args) {
//下面编译时类型和运行时类型完全一样,因此不存在多态
BaseClass bc = new BaseClass();
//输出6
System.out.println(bc.book);
//下面两次调用将执行BaseClass的方法
bc.base();
bc.test();
//下面编译时类型和运行时类型完全一样,因此不存在多态
SubClass sc = new SubClass();
//输出"轻量级Java EE企业应用实战"
System.out.println(sc.book);
//下面调用将执行从父类继承到的base方法
sc.base();
//下面调用将执行当前类的test方法
sc.test();
//下面编译时类型和运行时类型不一样,多态发生
BaseClass ploymophicBc = new SubClass();
//输出6 ----- 表明访问的是父类的成员变量
System.out.println(ploymophicBc.book);
//下面调用将执行父类继承到的base方法
ploymophicBc.base();
//下面调用将执行当前类的test方法
ploymophicBc.test();
}
}
public int book = 6;
public void base(){
System.out.println("父类的普通方法");
}
public void test(){
System.out.println("父类被覆盖的方法");
}
}
public class SubClass extends BaseClass{
//重新定义一个book实例成员变量隐藏父类的book实例成员变量
public String book = "轻量级Java EE企业应用实战";
public void test(){
System.out.println("子类的覆盖父类的方法");
}
public void sub(){
System.out.println("子类的普通方法");
}
public static void main(String[] args) {
//下面编译时类型和运行时类型完全一样,因此不存在多态
BaseClass bc = new BaseClass();
//输出6
System.out.println(bc.book);
//下面两次调用将执行BaseClass的方法
bc.base();
bc.test();
//下面编译时类型和运行时类型完全一样,因此不存在多态
SubClass sc = new SubClass();
//输出"轻量级Java EE企业应用实战"
System.out.println(sc.book);
//下面调用将执行从父类继承到的base方法
sc.base();
//下面调用将执行当前类的test方法
sc.test();
//下面编译时类型和运行时类型不一样,多态发生
BaseClass ploymophicBc = new SubClass();
//输出6 ----- 表明访问的是父类的成员变量
System.out.println(ploymophicBc.book);
//下面调用将执行父类继承到的base方法
ploymophicBc.base();
//下面调用将执行当前类的test方法
ploymophicBc.test();
}
}
说明:
当把一个子类对象直接赋给父类的引用变量是,例如上面的BaseClass ploymophicBc = new SubClass();,这个ploymophicBC应用变量的编译时类型是BaseClass,而运行时类型是SubClass,当运行时调用该引用变量的方法,其行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量,调用同一个方法时呈现出多种不同的行为特征,这就是多态。