多态
Java 引用变量有两个类型:一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给该变量的对象决定。
如果编译时类型和支行时的类型不一致,这就有可能出现所谓的多态。
两个相同类型的引用变量,由于它们实际引用的对象的类型不同,当它们调用同名方式时,可能呈现出多种行为特征,这就是多态。
上面程序的main()方法中显式创建了三个引用变量,对于前两个引用变量bc和sc,它们编译时类型和运行时类型完全相同,因此调用它们的成员变量和方法非常正常,完全没有任何问题。但第三个引用变量ploymophicBc则比较特殊,它的编译时类型是BaseClass,而运行时类型是SubClass,当调用该引用变量的test()方法(BassClass类中定义了该方法,子类SubClass覆盖了父类的该方法)时,实际执行的是SubClass类中覆盖后的test()方法,这就可能出现多态了。
当把一个子类对象直接赋给父类引用变量时,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。
引用变量的强制类型转换
将一个子类对像赋给父类,这就是向上转型。向上转型是自动的。
强制类型转换: 类型转换运算符是小括号,语法如下(type)variable;
这个类型转换运算符还可以将一个引用类型变量转换成其子类类型。这种强制类型转换不是万能的,当进行强制类型转换时需要注意:
Ø 基本类型之间的转换只能在数值类型之间进行,这里所说的数值类型包括整数型、字符型和浮点型。但数值类型和布尔类型之间不能进行类型转换。
Ø 引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编;译时就会出现错误。
下面是进行强制类型转换的实例程序:
考虑到进行强制类型转换时可能出现异常,因此进行强制类型转换之前应先通过instanceof运算符来判断是否可以成功转换。
instanceof运算符
前一个操作通常是一个引用类型的变量,后一个操作通常是一个类(也可以是接口)。如果是返回true 否返回false。
在使用instanceof运算符是需要注意:instanceof运算符前面操作数的编译时类型要么与后面的类型相同,要么与后面的类具有父子继承关系,否则会引起编译错误。下面程序示范了instanceof运算符的用法: