鉴于以下内容:
class ClassA
class ClassA1 extends ClassA
class ClassA2 extends ClassA
class ClassA3 extends ClassA
ClassA1 a1 = new ClassA1()
ClassA2 a2 = new ClassA2()
ClassA3 a3 = new ClassA3()
ClassA a = either a1, a2, or a3 (programmed to be randomly chosen by JVM)
如果对子类对象('a1','a2'或'a3')的引用仅在运行时分配给超类引用变量'a',那么如何编写实现的'if'语句:如果'a'引用a1,访问a1的指定字段(不是从a继承)?对此有任何帮助将不胜感激。
答案 0 :(得分:1)
使用instanceof
运算符和强制转换。
if (a instanceof ClassA1) {
((ClassA1) a).someMethodThatsOnlyInA1();
}
答案 1 :(得分:0)
或者您可以使用instanceof运算符。
if(a instanceof ClassA1) { ... }
或者您可以使用Class<>的isAssignableFrom方法类型。
if(ClassA1.class.isAssignableFrom(a.getClass())) { ... }
两种方式似乎都是一样的,但是使用instancof你应该在编译时知道类型,使用isAssignableFrom可以在运行时动态检查类型,例如:
if(a1.getClass().isAssignableFrom(a2.getClass())) { ... }
无法使用instanceof运算符编写最后一个示例。
虽然知道NullPointerExceptions,因为getClass()是一个方法!