语法:
//能不能编译通过
System.out.println(X instanceof Y);
例子:
- Object > Person > Student
- Object > Person > Teacher
- Object > String
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
import com.oop.demo06.Teacher;
import com.oop.demo08.Action;
public class Application {
public static void main(String[] args) {
//System.out.println(X instanceof Y);能不能编译通过
//Object > Person > Student
//Object > Person > Teacher
//Object > String
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
System.out.println(object instanceof String);//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);//false
}
}
输出结果:
注意:
- 能否编译通过,看X与Y的类,若纯真父子或者子父关系则可以通过
- 若X与Y没有父子关系,如Teacher与Student,就不可编译
- 编译过后T/F看引用指向对象,X指向的对象如果是后面Y的子类或是本身,即使T
instanceof判断后类型转换
例子:
public static void main(String[] args) {
//类型之间的转换:父——>子
//高 低
Person obj = new Student();
//obj.go(); 编译报错 需要强制转换
//将obj这个对象转换为Student类型,我们就可以使用Student类型的方法了
((Student)obj).go();
//类型之间的转换:子——>父
Student student = new Student();
student.go();
Person person = student;
//person.go(); 编译报错 ; 子类转换父类,可能丢失自己本来的一些方法
}
输出结果:
小结:
1.父类的引用指向子类的对象
2.把子类转换为父类,向上转型
3.把父类转换为子类,向下转型,强制转换
4.子类转换父类,可能丢失自己本来的一些方法
5.方便方法的调用建设重复代码