下面的代码完整阐述了多态的产生过程和其特性:
import static java.lang.System.*;
class BaseClass{
public int book=6;
public void base(){
out.println("BaseClass类的base()方法!");
}
public void test(){
out.println("BaseClass类的test()方法!");
}
}
public class SubClass extends BaseClass{
//-重写,但是类型不一样
public String book="这是字符类型的book变量!";
public void sub(){
out.println("SubClass类的sub()方法!");
}
//-重写
public void test(){
out.println("SubClass类覆写BaseClass类的test()方法");
}
public static void main(String[] args){
//-编译类型和运行类型完全一样,不存在多态
BaseClass b=new BaseClass();
out.println(b.book);
b.base();
b.test();
//-编译类型和运行类型完全一样,不存在多态
SubClass s=new SubClass();
out.println(s.book);
s.sub();
s.test();
//-编译类型和运行类型不一样,出现多态:
//-编译类型为BaseClass类,运行类型为SubClass类
BaseClass bs=new SubClass();
//-变量在程序编译时,已经由编译类型确定,所以这里输出BaseClass 类中的book变量:6
out.println(bs.book);
//-方法的调用在程序编译时,由运行类型指定,所以这里调用的是SubClass类中继承自BaseClass类中的base()方法
bs.base();
//-方法的调用在程序编译时,由运行类型指定,所以这里调用的是SubClass类中覆写的base()方法
bs.test();
//-BaseClass类中不存在sub()方法,编译时就会报错,编译不通过
//bs.sub();
}
}
运行结果:
总结:
1、java引用变量有两种类型:编译时类型、运行时类型
2、编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象类型决定
3、如果编译时类型和运行时类型不一致,就出现了所谓的多态
如上代码所示,在声明bs变量的时候:
BaseClass bs:声明bs的类型为BaseClass类型
=new SubClass():赋给bs的对象类型为SubClass类型
所以 bs这个对象就存在多态!!!
3.1、变量:由编译类型决定
3.2、方法:编译阶段只能调用编译类型所具有的方法,运行时则执行运行类型所执行的方法