继承关系判断
Class.java # public native boolean isInstance(Object obj);
Class[] list={Child.class, Parent.class};
System.out.println(list[0].isInstance(new Child()));//true
System.out.println(list[0].isInstance(new Parent()));//false
System.out.println(list[1].isInstance(new Child()));//true
System.out.println(list[1].isInstance(new Parent()));//true
System.out.println(list[0].isInstance(Child.class));//false
System.out.println(list[0].isInstance(Parent.class));//false
System.out.println(list[1].isInstance(Child.class));//false
System.out.println(list[1].isInstance(Parent.class));//false
说明:
- 参数obj的参数类型若为.class,返回 false
- 当参数强转为调用者对象不会报异常时,返回true(即调用者为参数的类或父类)
Class.java#public native boolean isAssignableFrom(Class<?> cls);
Class[] list={Child.class, Parent.class};
System.out.println(list[0].isAssignableFrom(Child.class));//true
System.out.println(list[0].isAssignableFrom(Parent.class));//false
System.out.println(list[1].isAssignableFrom(Child.class));//true
System.out.println(list[1].isAssignableFrom(Parent.class));//true
说明:
- 调用者和参数都是.class类型;
- 调用者为参数的类或父类
Class.java#public T cast(Object obj);
Class[] list={Child.class, Parent.class};
System.out.println(list[0].cast(new Child()));//不可调用Child对象中的方法,因为是数组而不是泛型,com.Child@7cdbc5d3
// System.out.println(list[0].cast(new Parent()));//报错
System.out.println(list[1].cast(new Child()));//不可调用Child对象中的方法,因为是数组而不是泛型,com.Child@3aa9e816
System.out.println(list[1].cast(new Parent()));//不可调用Child对象中的方法,因为是数组而不是型,com.Parent@17d99928
System.out.println(Child.class.cast(new Child()));//可调用Child对象中的方法
System.out.println(((Child) list[0].cast(new Child())));//可调用Child对象中的方法
说明:
- 父类不可以强转为子类,但是double可以强转为int;
- 参数obj的参数类型若为.class,报错;
- 调用者为参数的类或子类,否则报错;
- 使参数转化为调用的对象;
instance of 关键字
用法:
A isntance of B:判断左边对象是否是右边类的实例;
Child child = new Child();
Parent parent = new Parent();
System.out.println(child instanceof Child);//true
System.out.println(parent instanceof Child);//false
System.out.println(child instanceof Parent);//true
System.out.println(parent instanceof Parent);//true