Java -7 对象转型和多态性
对象转型
基本数据类型转换:
float f = 1.21F;
int a = (int) f; //强制转换
double d = f; //自动转换
引用数据类型转换:
Student s1 = new Student(20,"张三",“电子科技大学中山学院”);
Person p=s1; //将子类引用变量的值赋给父类引用变量 ,可以自动转换
s1 = (Student) p; //将父类引用变量的值赋给子类引用变量,需要强制转换
转型类型分两种:
向上转型:让一个父类引用类型变量指向一个子类的对象,可以自动转换,而且,向上转型肯定是安全的。
向下转型:让子类引用类型变量指向父类的对象,需要强制转换,而且,向下转型不一定是安全的。而且如果发生错误,也是程序运行时出现异常。
因为向下转型不一定是安全的,所以在进行向下转型之前,可以通过运算符 “instanceof” 来事先判断:一个引用类型变量所指向的对象,是否是某个类的对象,或是否是某个子类的子对象。
“instanceof” 运算符使用的语法是: “引用类型变量名 instanceof 类名” ,这个表达式的值是一个布尔值。
如果这个表达式的值等于true ,则表明:这个引用类型变量所指向的对象是这个类的对象,或者是这个类的子类对象。
如果这个表达式的值等于false , 则表明:这个引用类型变量所指向的对象既不是这个类的对象,也不是这个类的子类对象。
多态性
在程序的运行期间,而非编译期间,才能判断引用所指向的对象的实际类型,并根据这个对象的实际类型,来调用实际类型中定义的方法.这种语言特性称之为多态.
只有当使用一个父类引用指向一个子类对象时,也就是当一个引用的编译时类型和运行时类型不一致的时候,而且子类覆盖了父类成员方法的时候,才会出现多态的语法现象.
- 与方法不同的是,对象的属性并不具备多态性.
- 静态成员变量和静态成员方法同样不具备多态性.
- 一个Java的引用具有两种特性类型:编译时类型和运行时类型。
- 编译时类型是指声明该引用时所用的类型,运行时类型是该引用实际指向的对象所属的类型。
- 一个引用的编译时类型和运行时类型有时是相同的,比如代码“A a= new A ()”中,引用a 的编译时类型和运行时类型都是A。
- 一个引用的编译时类型和运行时类型有时是不同的,比如A类是B类的父类,则代码“ A a=new B ()”中,引用a 的编译时类型就是A ,运行时类型就是B。
- 在程序的编译阶段,编译器检查一个引用能够访问哪些成员时,是由这个引用的编译时类型决定的。