一、Java Instanceof 操作符
Java中用于检验某个对象是否是别外一个类的对象时,使用操作符instanceof
语法格式:
A instanceof B
, 返回值是boolean
型。
- A是对象,B是一个类
A对象所对应引用变量,必须与B类在同一条关系线上(存在父子关系),否则编译不通过。如:
// 关系网: // Object -> Person -> Teacher -> HighSchoolTeacher // Object -> Person -> Student -> MiddleSchoolStudent
按上面关系,定义 Person,Teacher , HighSchoolTeacher, Student, MiddleSchoolStudent几个类:
//Person package com.zctou.oop.demo08; public class Person { } //Teacher package com.zctou.oop.demo08; public class Teacher extends Person{ } //HighSchoolTeacher package com.zctou.oop.demo08; public class HighSchoolTeacher extends Teacher{ } //Student package com.zctou.oop.demo08; public class Student extends Person{ } //MiddleSchoolStudent package com.zctou.oop.demo08; public class MiddleSchoolStudent extends Student{ }
测试1:引用变量为Person类
Person person2 = new Student(); //引用变量为Person类
System.out.println(person2 instanceof Person); //true
System.out.println(person2 instanceof Teacher); //false
System.out.println(person2 instanceof HighSchoolTeacher); //false
System.out.println(person2 instanceof Student); //true
System.out.println(person2 instanceof MiddleSchoolStudent); //false
//以上编译全部通过
引用变量为Person类时,可以通过instanceof
与 Person,Teacher , HighSchoolTeacher, Student, MiddleSchoolStudent 比较。比较结果只有 Person 为true, 其他为false。
测试2:引用变量为 Student类
Student student = new MiddleSchoolStudent(); //引用变量为Student类
System.out.println(student instanceof Person); //true
System.out.println(student instanceof Student); //true
System.out.println(student instanceof MiddleSchoolStudent); //true
//System.out.println(student instanceof Teacher); //报错,与Student不在同一条关系线上
//System.out.println(student instanceof HighSchoolTeacher); //报错,与Student不在同一条关系线上
//Person, Student,MiddleSchoolStudent 为 true,其他为false
//System.out.println(student instanceof String); //报错,与Student类不在一条关系线上
引用变量为 MiddleSchoolStudent 类时,只能通过instanceof
与Object -> Person -> Student -> MiddleSchoolStudent
这条关系链比较。Teacher -> HighSchoolTeacher
这条关系链不能比较,编译不通过。比较结果 Person,Student, MiddleSchoolStudent都为true。
- 比较结果看A这个引用变量指向的实例,即
=
右边的值(Student student = new MiddleSchoolStudent()右边new的对象),B类(要比较的类:Person,Student等)如果是这个实例的父类或者同类型,结果为true。
结论是:
- 能否用instanceof比较,引用变量A所处的关系链中必须存在B类;
- 比较结果看引用变量A所指向的实例,如果B类是A实例对应类的父类或相同类型,结果为ture。
二、Java 对象类型转换
父类要想调用子类的方法,就要对父类进行强制转换。
这里涉及父类与子类的转换,从高到低就是:父类到子类(Object -> Person -> Teacher -> HighSchoolTeacher)
//高 --------------------------------------------------------- 低
//Object -> Person -> Teacher -> HighSchoolTeacher
与基本数据类型一样,高转低要强转(父类转子类)。
如:person为父类,要调用子类student的方法go(),要先把Person的类型强制转为Student类再调用子类的方法:
Person person = new Student() ; //person为父类,要调用子类student的方法go()
((Student) student)).go(); //高转低要强转后再调用
类型转换总结:
- 子类转父类,向上转型,不用强制转换,低转高,会丢失方法
- 父类转子类,向下转型,强制转换,高转低
- 父类必须指向子类对象