大小的标准:引用类型-->有继承关系,父类为大,子类为小。
基本数据小型-->精度大的为大,精度小的为小。
1、子类转换父类类型;(小转大)--》自动转换
Animal a = new Person();--》直接把子类对象赋值给父类变量
2、把父类类型转换子类类型 (大转小)--》强制类型转换
Animal a = new Person();
Person p = (Person)a;
引用类型的强转条件
A x = (A)B; 只要B是A的父类,此句代码编译通过
强转的意义:把父类类型强转为子类类型,在编译期可以调用子类的字段与方法
(父类的字段与方法子类都能直接继承,但是子类有的父类有可能没有)
==>强转之后,父类与子类的字段与方法都可以使用
小结:在编译期,类型只要大小的关系可以不一致,在运行期,类型必须一致!
以后再把父类转成子类的时候,应该先判断!
instanceof(只能够用于引用类型)
A instanceof B
判断A是否是B的实例
A是一个变量或者对象, B 是一个类型(类 接口...)
A的运行时类型如果是B 或者是B的子类 结果都是true
ex:
class Test{
public static void main(String[] args){
Teacher t = new Teacher();
//Student s = (Student)t;//不能转,因为Student 与 Teacher没有继承关系
Person p = t;//引用类型 小转大,自动转换
Person ps = new Person();
//Student s = (Student)ps;//引用类型的 大转小,强制转换.
int i = 5;
//boolean b = i;//不能转,因为boolean与int 没有比较大小的标准
double d = 5.5;
i = (int)d;//基本数据类型 大转小,强制转换
byte b = 127;
i = b;//基本数据类型 小转大,自动转换
System.out.println("----------------------------------------------------");
Person p2 = new Student();
if(p2 instanceof Teacher){//判断p2是否是Teacher类型的对象
Teacher t2 = (Teacher)p2;//此行会运行错误。原因:在运行期,p2是Student类型,不能转换为Teacher类型
System.out.println(t2.name);
}else if(p2 instanceof Student){//判断p2是否是Student类型的对象
Student s2 = (Student)p2;
}
/*
在实际项目中,p2的值可能是 new Student()/new Teacher()/new Person(). 如果值是new Teacher()则把该对象p2
强转为Teacher类型
问题:如何判断p2的值到底是new的哪个类对象?
方案:使用instanceof. instanceof:判断指定变量是否是指定类型的对象。
当前场景:判断 p2 是否是 Teacher类型 的对象。
语法:指定变量 instanceof 指定类型。 返回false:不是指定类型的对象 , 反之则反
在运行期有效。
*/
}
}
class Person{}
class Student extends Person{
String name;
}
class Teacher extends Person{
String name;
}