Java基础——多态与instanceof的逻辑关系
众所周知,在Java中,类型的向上转型是自动的,而向下转型是需要进行强制类型转换的,而instanceof正好用于判断能否进行向下转型(强制类型转换),若多态与instanceof概念还不是很清晰,请参考Java基础——多态与instanceof关键字的使用。
举个栗子
//定义父类Person与子类Student
class Person{
public void show(){
System.out.println("This is person");
}
}
class Student extends Person{
public void show(){
System.out.println("This is student");
}
}
先看这段代码
Person person = new Student();
System.out.println(person instanceof Person);
System.out.println(person instanceof Student);
if(person instanceof Student){
Student student = (Student)person;
student.show();
}
将Student(子类对象)赋值给了person(父类引用),这是一个典型的"向上转型",向上转型是自动且合理的,虽然当前的person是个父类引用,但实际上它所指向的是一个子类对象(判断对象是根据new后面的类),因此:
person instanceof Person --> true (因为此时的person指向的是Student对象,该对象是Person子类的实例对象)
person instanceof Student–> true (因为此时的person指向的是Student对象,该对象是Student类的实例对象)
instanceof只是在判断 对象是否是该类或该类子类的实例对象,并以此来决定能否进行向下转型,若返回结果为true,说明可以进行向下转型,若返回结果为false,则说明不能进行向下转型(运行时异常:ClassCastException)
由于此时的person是Student的实例化对象,因此可以进行向下转型。
第5行的Student student = (Student) person就是在进行向下转型。
在判断当前引用具体指向哪个对象,不要看引用前面的类(由于多态产生了很大的迷惑性),一定要看new后面的类(是什么类,该引用就指向该类的对象)
再举一个例子加深理解(Student还是Person的子类)
Person person = new Person();
System.out.println(person instanceof Person);
if(!(person instanceof Student)){
person = new Student();
System.out.println(person instanceof Student);
}
这个例子与上面那个例子有所不同,这个例子是将Person(父类对象)赋值给了person(父类引用),再次判断当前引用指向的是什么对象,因此
person instanceof Person --> true (因为此时的person指向的是Person对象,该对象是Person类的实例对象)
而此时的 person instanceof Student --> false(因为此时的person指向的是Person对象,而该对象并不是Student或其子类的实例对象)
if循环的条件(!(person instanceof Student))恒为true,进入if语句,将Student(子类对象)赋值给person(父类引用),此时的person就指向了一个Student对象,因此再判断(person instanceof Student)的结果就为true了。
总结一下