一、instanof
创建以下几个类
Person(父类) Studengt(子类) Teacher(子类)
Student继承Person,Teacher继承Person
则有以下关系:
- Object->String
- Object->Person->Student
- Object->Person->Teacher
(在Java中,所有的类都默认直接或者间接继承Object类)
通过instanceof应用可以得到公式:
//System.out.println(X instanceof Y);
X,Y之间有父子关系编译通过,没有父子关系编译报错
X所指向的实际类型是不是Y的子类型
Object a = new Student();//祖父类
System.out.println(a instanceof Student);//True
System.out.println(a instanceof Person);//True
System.out.println(a instanceof Object);//True
System.out.println(a instanceof Teacher);//False
//Teacher不在Object->Person->Student这一条原型链上
//只在Object->Person->Teacher这一条链上
System.out.println(a instanceof String);//False
//String不在Object->Person->Student这一条原型链上
//只在Object->String这条链上
Student student = new Student();
System.out.println(student instanceof Student);//True
System.out.println(student instanceof Person);//True
System.out.println(student instanceof Object);//True
//System.out.println(student instanceof Teacher);//编译报错
//Student和Teacher没有父子关系,无法通过编译
//System.out.println(student instanceof String);//编译报错
//Student和String没有父子关系,无法通过编译
//Object->Person->Student
Person b = new Person();
System.out.println(b instanceof Student);//false
System.out.println(b instanceof Person);//True
System.out.println(b instanceof Object);//True
System.out.println(b instanceof Teacher);//false
//都能通过编译,但b不是Student的子类,所以false
//b不是Teacher子类,结果也是false
二、类型转换
低--->高 自动转化
高--->低 强制转化
在Java中强制转换会丢精度,同理在类型转换中强制转换会丢失一些方法。
父类:
public class Person {
public void run(){
System.out.println("run");
}
}
子类:
public class Student extends Person{
public void go(){
System.out.println("go");
}
}
类型之间的转化:基本类型转化 高——>低 强制转化 低——>高 自动转化
子类转换为父类会丢失自己的一些方法。
父(高) 子(低)
//父(高) 子(低)
//高转低 强制转化
Person obj = new Student();
Student obj1 = (Student) obj;
obj1.go();
//或者
((Student) obj).go();
//低转高 自动转化
Student student1 = new Student();
student1.go();
//子类转化为父类 可能丢失自己本类的一些方法
Person person1 = student1;
person1.run();//只能调用Person中的 run 方法
//person1.go(); 报错
丢失go();方法
1、父类的引用指向子类的对象 2、把子类转化为父类 向上转型:直接转化 3、把父类转化为子类 向下转型:强制转型(在Java中强制转换会丢失精度,在类型转换中,强制转换,会丢失一些方法。) 4、方便方法的调用,通过升级或者降级使用其他方法 可以减少重复的代码 提高代码利用率 抽象 : 封装 继承 多态