有没有办法从基类实例中找出派生类的名称?
e.g:
class A{
....
}
class B extends A{
...
}
class c extends A{
...
}
现在,如果方法返回A
的对象,我可以查看它是B
还是C
?
答案 0 :(得分:19)
使用instanceof
或Class#getClass()
A returned = getA();
if (returned instanceof B) { .. }
else if (returned instanceof C) { .. }
getClass()
会返回:A.class
,B.class
,C.class
在if子句中,你需要向下转换 - 即
((B) returned).doSomethingSpecificToB();
尽管如此,有时候认为使用instanceof
或getClass()
是一种不好的做法。您应该使用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
,检查instanceof
或override
方法。
答案 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();