顾名思义:对象的类型转换
- 对象的类型转换限制于子类父类之间的转换。
例如:人这一父类与学生这一子类的相互转换
但是要明白,不同转型方式会伴随不同的问题产生。 - 先介绍转型类型
向上转型
形式:父类 obj = new 子类() ;
理解为将实例化的子类对象赋值于父类类型变量obj
这就是向上转型操作。
举例:
学生和人,将学生转型为人,这没问题,学生是人
向下转型
形式:子类 obj = new 父类() ;
理解为将实例化的父类对象赋值于子类类型变量obj
但是将人转型为学生,所有人人都是学生。这个说法肯定有问题的。
结论:可实例化的类,父类总是比子类抽象,
但是可以强制类型转换将父类对象转换为子类对象。
两种转型实验分析
完整代码,向下转型
package com.test;
class Person{
Person(){
System.out.println("父类构造" + Person.class.hashCode());
}
void m(){
System.out.println("父类m方法执行");
}
}
class Students extends Person {
Students(){
System.out.println("子类构造" + Students.class.hashCode());
}
void n(){
System.out.println("子类n方法执行");
}
}
public class Test {
public static void main(String[] args) {
// -------------分割--------------
//实例化子类,父类指向
Person p_2 = new Person();
//实例化父类,子类指向
try {
Students s_2 = (Students)p_2;
s_2.n(); //强制类型转换了之后再调用子类方法
s_2.m(); //父类方法调用
}catch(Exception c){
c.printStackTrace();
}
}
}
运行结果
部分代码,向上转型:
public class Test {
public static void main(String[] args) {
// -------------分割--------------
//实例化子类,父类指向
Person p_2 = new Students();
//实例化父类,子类指向
Students s_2 = (Students)p_2;
s_2.n();
s_2.m();
}
}
结果
结果分析:
- 出现了ClassCastException即类强制类型转换异常
父类虽然强制转换成为了子类,但是在父类与子类的属性、方法体中存在的差异用强制转换是始终解决不了的。由此Java给出了instanceof操作符(见下文)先来判断父子类的对象。 - 只执行了父类的构造方法,强制类型转换了之后再调用子类方法无效。
- 向下转型需要谨慎使用
- 向上转型没出问题,验证子类转型父类(将一个具体的类变得抽象起来,因此这也使得这样的一个类型转换更安全)
instanceof操作符判断对象类型,为向上转型服务或作单纯判断
用途:判断父类是否为子类对象的实例
语法格式:
某类对象的引用 instanceof 某个类
upobject instanceof ExampleClass
实例:
package com.test;
class Person{
}
class Students extends Person {
}
public class Test {
public static void main(String[] args){
Person p_1 = new Person();
Students s_1 = new Students();
System.out.println(p_1 instanceof Students);
System.out.println(s_1 instanceof Person);
}
}
结果: