一、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 类时,只能通过instanceofObject -> Person -> Student -> MiddleSchoolStudent这条关系链比较。Teacher -> HighSchoolTeacher这条关系链不能比较,编译不通过。

比较结果 Person,Student, MiddleSchoolStudent都为true。

  • 比较结果看A这个引用变量指向的实例,即=右边的值(Student student = new MiddleSchoolStudent()右边new的对象),B类(要比较的类:Person,Student等)如果是这个实例的父类或者同类型,结果为true。

结论是:

  1. 能否用instanceof比较,引用变量A所处的关系链中必须存在B类;
  2. 比较结果看引用变量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();  //高转低要强转后再调用

类型转换总结

  • 子类转父类,向上转型,不用强制转换,低转高,会丢失方法
  • 父类转子类,向下转型,强制转换,高转低
  • 父类必须指向子类对象
文章目录