访问随机分配的对象

Accessing a randomly-assigned object

鉴于以下情况:

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 继承的)?如有任何帮助,我们将不胜感激。

使用 instanceof 运算符和转换。

if (a instanceof ClassA1) {
    ((ClassA1) a).someMethodThatsOnlyInA1();
}

或者您可以使用 instanceof 运算符。

if(a instanceof ClassA1) { ... }

或者您可以使用 Class<> 类型的 isAssignableFrom 方法。

if(ClassA1.class.isAssignableFrom(a.getClass())) { ... }

这两种方式似乎都是一样的,但是使用 instancof 你应该在编译时知道类型,使用 isAssignableFrom 你可以在运行时动态检查类型,p.e.:

 if(a1.getClass().isAssignableFrom(a2.getClass())) { ... }

最后一个例子不能用instanceof运算符写。

尽管注意 NullPointerExceptions,因为 getClass() 是一种方法!