15-多态
程序员文章站
2022-07-12 16:56:17
...
多态(Polymorphism)
说在前边:
引用变量有两个类型:一个是编译时类型,一个是运行时类型。
1、编译时类型:编译时类型由声明该变量时使用的类型决定。
2、运行时类型:运行时类型由实际赋给该变量的对象决定。
多态的出现:
多态的出现:
如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
重要一段话:
当把一个子类变量直接赋值给父类引用变量时,例如Fu04 ployName3 = new Zi04();这个ployName3引用变量的编译时类型为Fu04,而运行时类型是Zi04,当运行时调用该引用变量的方法时,其方法行为总是表现出其子类方法的行为特征,而不是父类方法的行为特征。这就可能出现:相同类型的变量调用同一方法时呈现出不同的行为特征,这就是多态。
注意一点:
与方法不同的是,对象的实例变量不存在多态性。
引用变量的强制类型转换
引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它所引用的对象确实包含该方法。
如果需要让这个引用变量调用它运行时类型的方法,则必须把它强制类型转换为运行时类型。强制类型转换需要借助于类型转换运算符。
引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果是两个没有任何继承关系的类型,则无法进行类型转换,否则编译时会出现错误。
如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类类型,而运行时类型是子类类型),否则将在运行时引发ClassCastException异常。
示例代码:
package Class;
public class ConversionTest {
public static void main(String[] args) {
double d = 13.4;
long l = (long)d;
System.out.println(l);
int in = 5;
// 试图把一个数值类型的变量转换为boolean类型,下面代码编译出错
// 编译时会提示:不可转换的类型
//boolean b = (boolean) in;
Object obj = "Hello";
// obj 变量的编译时类型为Object,Object与String存在继承关系,可以强制类型转换
// 而且obj变量的实际类型是String,所以运行时也可以通过
String objStr = (String) obj;
System.out.println(objStr);
// 定义一个objPri变量,编译时类型为Object,实际类型为Integer
Object objPri = new Integer(5);
// objPri变量的编译时类型为Object,objPri的运行时类型为Integer
// Object与Integer存在继承关系
// 可以强制类型转换,而objPri变量的实际类型是Integer
// 所以下面代码运行时引发ClassCastException异常
//String str = (String)objPri;
// 在进行强制类型转换前,先用instanceof运算符判断是否可以成功转换。
if(objPri instanceof String){
String str1 = (String)objPri;
}else {
System.out.println("不可以成功转换");
}
}
}
instanceof运算符
上一篇: 淘宝技术这十年