Jer*_*gan 1 java oop inheritance class
说我有3个这样的课程:
class A {}
class B extends A {}
class C extends A {}
Run Code Online (Sandbox Code Playgroud)
难道那么有可能确定一个特定的对象是否是他的一个实例A,B或C?
我认为这样的事情可能有用:
if (myObject.getClass().isInstance(B.class)) {
// do something for B
} else (myObject.getClass().isInstance(C.class)) {
// do something for C
} else {
// do something for A
}
Run Code Online (Sandbox Code Playgroud)
但是在阅读了一下之后,我认为它总是会评估为B,因为它只是测试一个演员是否有效并且它们之间没有实质性差异.
更简单,更快速的代码是:
if (myObject instanceof B) {
} else if (myObject instanceof C) {
} else if (myObject instanceof A) {
}
Run Code Online (Sandbox Code Playgroud)
注意顺序很重要:你必须有用于测试A最后,因为这会为实例成功B,并C为好.
但是,您的原始代码几乎可以正常工作.Class.isInstance检查值是否真的是给定类或任何超类的实例.因此,如果myObject是实例C,则B.class.isInstance(myObject)返回false.所有你有错的是你调用getClass()上myObject不必要的,而不是使用B.class等.
如果您在编译时不知道您感兴趣的类,那么这是您将采用的方法 - instanceof只有在您可以在代码中静态指定类型时,运算符才有效.
现在,如果你想知道是否myObject是一个确切 的实例B(而不是一个子类),那么只需使用:
if (myObject.getClass() == B.class)
Run Code Online (Sandbox Code Playgroud)
(myObject当然,如果是空引用,这将会爆炸.)
做这个:
if (myObject instanceof B) {
// do something for B
} else (myObject instanceof C) {
// do something for C
} else {
// do something for A
}
Run Code Online (Sandbox Code Playgroud)