子类和父类之间如何判断子类的对象赋给父类引用的变量,是否属于子类的实例
父类
public class Animal {
public String age;
public void run(){
System.out.println("这是Animal的run方法...");
}
public void sleep(){
System.out.println("这是Animal的sleep方法...");
}
}
子类
public class Person extends Animal {
public String name;
public void run(){
System.out.println("这是Person类的run方法...");
}
}
/**
* 测试对象类是否属于人类
*/
public class Instance {
public static void main(String[] args) {
Animal animal=new Person();
if (animal instanceof Person) {
Person person = (Person) animal;
System.out.println("正确");
}
}
}
子类的对象赋给父类的引用可以通过instance方法判断是否属于某个实例
注意:子类的子类如果判断属于父类的实例,是正确的;代码如下
public class SuperMan extends Person{
}
测试结果如下:
public class Instance {
public static void main(String[] args) {
Animal animal=new SuperMan();
if (animal instanceof Person) {
Person person = (Person) animal;
System.out.println("正确");
}
}
}
答案仍是正确的。子类的子类的对象赋给父类的引用,则子类的子类数属于子类的实例的。
如果想要精确的匹配某个类的是否属于指定类的实例,代码如下:
public class Instance {
public static void main(String[] args) {
Animal animal=new SuperMan();
Class<? extends Animal> aClass = animal.getClass();
System.out.println(aClass);//class com.pfx.instance.Person 获取引用对象的Class对象
String name = aClass.getName();
System.out.println(name);//com.pfx.instance.Person 当前对象的全路径类名
System.out.println(SuperMan.class.getName());
if (name.equals(SuperMan.class.getName())){
System.out.println("对象是SuperMan的实例");
}else {
System.out.println("对象不是SuperMan的实例");
}
}
}
答案如下:
class com.pfx.instance.SuperMan
com.pfx.instance.SuperMan
com.pfx.instance.SuperMan
对象是SuperMan的实例
Animal animal=new SuperMan();替换为 Animal animal=new Person();
答案如下:
class com.pfx.instance.Person
com.pfx.instance.Person
com.pfx.instance.SuperMan
对象不是SuperMan的实例
结果证明需要精确的判断某个引用对象是具体类的实例,需要使用第二种方式。