java编译时类型与运行时类型
java引用变量有两个类型:一个是编译时的类型,一个是运行时类型。
如果编译时类型与运行时类型不一致,就可能出现——多态。
如下面的程序:
class BaseClass{
publicintbook=6;
publicvoid base(){
System.out.println("父类基本方法");
}
publicvoid test(){
System.out.println("父类的被覆盖方法");
}
}
publicclass SubClass extends BaseClass{
public String book="java实战演练";
publicvoid test(){
System.out.println("子类的被覆盖方法");
}
publicvoid sub(){
System.out.println("子类普通方法");
}
publicstaticvoid main(String[]args){
BaseClass bc=new SubClass();
System.out.println(bc.book);
bc.test();
bc.base();
}
}
其输出结果为:
6
子类的被覆盖方法
父类基本方法
如上所示,SubClass类继承了BaseClass类。引用变量bc编译时类型为BaseClass,而运行时类型为SubClass。当bc调用test()方法时执行的是SubClass类的覆盖方法。
结论:
①对象的属性则不具备多态性。通过引用变量来访问其包含的实例属性时,系统总是试图访问它编译时类所定义的属性,而不是它运行时所定义的属性。
②引用变量只能用编译类型有的方法,但执行时会使用执行时类型同名的方法。引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法,因此,编写Java代码时,引用变量只能调用声明该变量所用类里包含的方法(父类包含的方法)。