超类的Java-instanceof

超类的Java-instanceof,java,inheritance,instanceof,Java,Inheritance,Instanceof,假设我有两门课: public Class1 { /* class body*/ } public Class2 extends Class1 { public Class2 (int var1, int var2) { super(var11, var2); } } 现在我需要确定我拥有哪个类对象。在这种情况下,如何确定是否有Class1或Class2对象 Object var1 = new Class1(1,2); Object var2 = new Class2(1,2);

假设我有两门课:

public Class1 {
/* class body*/
}

public Class2 extends Class1 {
 public Class2 (int var1, int var2) {
 super(var11, var2); 
 }
}
现在我需要确定我拥有哪个类对象。在这种情况下,如何确定是否有
Class1
Class2
对象

Object var1 = new Class1(1,2);
Object var2 = new Class2(1,2);

var2 instanceof Class2; /*true*/
var2 instanceof Class1 /*true*/

在这两种情况下,
instanceof
将返回true。

您可以使用
equals

if (this.getClass().equals(Class1.class) {
    // Do something...
}

测试它是否不是子类的实例:

   object instanceof Superclass
&& !(object instanceof Subclass)
或者,使用if/else链:

if (object instanceof Subclass) {
  // Do something.
} else if (object instanceof Superclass) {
  // Do something else.
}

选择取决于您实际使用它的目的。

使用getClass();返回所需的类型。getClass()返回对象的类。但是请注意,您几乎不必这样做。使用多态性。还要注意,如果对象不是Class2的实例,则Class2的某些对象实例肯定不会返回true。@user1209216“非直接实例”是什么意思?否决票很可能是因为你自己很少努力找到解决方案。不过我也不确定,因为我不知道这是个什么。告诉我们您真正需要什么,而不是一个您似乎不确定的模糊问题。该类不重写equals,因此使用==@Stultuske进行比较可能更好。我可以问一下您为什么这样认为吗?当
equals
未被覆盖时,这两个选项是等效的。@为其中一个选项禁用,如果equals未被覆盖,它将执行==比较。第二,使用.equals(…),一些不知道equals没有实现的人可能会认为有,并且可能会假设implementation@Stultuske我总是假设
equals()
会给出正确的结果,如果它是由核心API实现的。无论如何,
Class
Class是
final
,而
Object.getClass()
也是
final native
,除非你把反射搞砸了,否则它真的不会坏。@Jai谁在说什么坏东西?我指的是(没有经验的)开发人员必须维护代码的情况,他们可能有错误的期望。例如,“equals会比较整个路径,包括包,还是只比较名称”。。。毕竟,如果有平等的实施,这是可能的。通过实例调用静态方法也是可能的,也会产生正确的结果,但是仍然不建议这样做,因为如果您的类有很多子类,那么这会变得很混乱:)事实上,这就是我想要的avoid@user1209216在想要避免的情况下,你能更具体地说明“这”是什么吗?想要知道一个对象的类本身就是你应该尽量避免的东西,正如JBNizet所提到的。我有很多子类,所以这种方法会很混乱。