访问随机分配的对象
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() 是一种方法!
鉴于以下情况:
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() 是一种方法!