instanceof 和类型转换
instanceof (类型转换) 引用类型,判断一个对象是什么类型~
-
建立四个类来理解
-
Application类,得出一个万能公式:System.out.println(X instanceof Y);//能不能编译通过!取决于X和Y是否是父子关系,X和Y是否有关系,有关系但不是父子关系,编译通过,但是会输出False
public class Application { public static void main(String[] args) { //3条继承关系 //Object >String //Object> Person> Teacher // Object> Person> Student Object object = new Student(); System.out.println(object instanceof Student);//true System.out.println(object instanceof Person);//true System.out.println(object instanceof Object);//true System.out.println(object instanceof Teacher);//False 同级不同路线,且Object和Teacher是有关系的,才不会直接报错而是打印False System.out.println(object instanceof String);//False 直接就是不同路线,且Object和String(是在java包里面的)是有关系的,才不会直接报错而是打印False System.out.println("=================================="); Person person = new Student(); System.out.println(person instanceof Student);//true System.out.println(person instanceof Person);//true System.out.println(person instanceof Object);//true System.out.println(person instanceof Teacher);//False // System.out.println(person instanceof String);//编译直接报错 直接就是不同路线且是同级的 System.out.println("=================================="); 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);//编译直接报错 同级不同路线 // System.out.println(student instanceof String);//编译直接报错 直接就是不同路线 } }
-
Application类,类型之间的转换
public class Application { public static void main(String[] args) { //类型之间的转换: 父 子 //高 //低 Person obj = new Student(); //obj将这个对象转换为Student类型,我们就可以使用Student类的方法了! Student student = (Student) obj; student.go(); //((Student) obj).go();相当于上面两句 } }
-
Application类,类型之间的转换
public class Application { public static void main(String[] args) { //子类转换为父类,可能丢失自己的本来一些方法(强制转换的缺点) Student student = new Student(); student.go(); Person person=student;//低转高 是不用强制转换的 ((Student) person).go();//按刚刚来说,是可以不用强转就可以用go方法的,也说明了子类转换为父类,可能丢失自己的本来一些方法 } }
-
Person类
public class Person { public void run(){ System.out.println("run"); } }
-
Student类
public class Student extends Person { public void go(){ System.out.println("go"); } }
-
Teacher类
public class Teacher extends Person { }
-
-
在总结一下多态:
- 父类引用指向子类的对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型;强制转换(Eg:子类转换为父类,可能丢失自己的本来一些方法(强制转换的缺点)
- 方便方法的调用,减少重复的代码!简洁
- 抽象:封装 继承 多态! 抽象类,接口