如何从基类实例中找出子类?

时间:2010-05-18 09:50:26

标签: java oop reflection inheritance

有没有办法从基类实例中找出派生类的名称?

e.g:

class A{
    ....
}
class B extends A{
    ...
}
class c extends A{
    ...
}

现在,如果方法返回A的对象,我可以查看它是B还是C

6 个答案:

答案 0 :(得分:19)

使用instanceofClass#getClass()

A returned = getA();

if (returned instanceof B) { .. }
else if (returned instanceof C) { .. }

getClass()会返回:A.classB.classC.class

在if子句中,你需要向下转换 - 即

((B) returned).doSomethingSpecificToB();

尽管如此,有时候认为使用instanceofgetClass()是一种不好的做法。您应该使用polymorphism来避免检查具体的子类,但我不能告诉您更多信息。

答案 1 :(得分:4)

您是否尝试过使用instanceof

e.g。

Class A aDerived= something.getSomethingDerivedFromClassA();

if (aDerived instanceof B) {

} else if (aDerived instanceof C) {

}

//Use type-casting where necessary in the if-then statement.

答案 2 :(得分:2)

简短回答你的问题

  

有没有办法从基类对象中找出派生类的名称?

没有,超类无法告诉子类的名称/类型。

你必须询问对象(它是一个子类的实例)并询问它是否是:instanceof一个特定的子类,或者称之为getClass()方法。

答案 3 :(得分:1)

  

有没有办法从基类实例中找出派生类的名称?

根据here的回答,您可以使用极其简单的方法。

abstract class A {
    public final String getName() {
         return this.getClass().getName();
    }
}

class B extends A { }

class C extends A { }

然后只需打印当前的class名称:

B b = new B();
C c = new C();

System.out.println(b.getName());
System.out.println(c.getName());

输出:

com.test.B
com.test.C

无需在任何子类中存储其他Strings,检查instanceofoverride方法。

答案 4 :(得分:0)

我有两种方法可以想到 1)使用Java反射API 2)其他人将使用instanceOf

其他方法可以是比较对象的对象,我不知道它是怎么回事,你可以试试这个

答案 5 :(得分:0)

您可以在子类'constructor

中执行此操作
class A {
    protected String classname;
    public A() { this.classname = "A"; }
    public String getClassname() { return this.classname; }
}
class B extends A {
    public B() {
        super();
        this.classname = "B";
    }
}

所以

A a = new A();
a.getClassname(); // returns "A"
B b = new B();
b.getClassname(); // returns "B"
((A)b).getClassname(); // Also returns "B"

因为它被转换为“A”对象,它将调用“A”getClassname()函数,但将返回由“B”构造函数构造函数设置的值。

注意:在设置之前调用super();