Java 从父类获取子类名称

Java 从父类获取子类名称,java,android,inheritance,Java,Android,Inheritance,我的所有活动都有一个基类(ActivityBase),它本身派生自android.app.Activity。在onCreate中,我想基于当前执行的子类执行一些条件逻辑。如果SomeCustomActivity和AnotherCustomActivity都扩展了ActivityBase,我如何在父类(ActivityBase)中确定这两个活动中的哪一个是当前正在执行的活动?使用运算符 假设您有一个基类和两个子类,分别名为base、SubOne和SubTwo,如果要检查变量ref是否是SubOne

我的所有活动都有一个基类(
ActivityBase
),它本身派生自
android.app.Activity
。在onCreate中,我想基于当前执行的子类执行一些条件逻辑。如果
SomeCustomActivity
AnotherCustomActivity
都扩展了
ActivityBase
,我如何在父类(
ActivityBase
)中确定这两个活动中的哪一个是当前正在执行的活动?

使用运算符

假设您有一个基类和两个子类,分别名为
base
SubOne
SubTwo
,如果要检查变量
ref
是否是
SubOne
SubTwo
的实例,您应该说:

if(ref instanceof SubOne){
}
else if(ref instanceof SubTwo){
}

请注意:
(ref instanceof Base)
将始终返回
true

我认为您需要使用instanceof操作符,例如:

if(this instanceof SomeCustomActivity) {
    // do stuff
} else if (this instanceof AnotherCustomActivity) {
    // do other stuff
}

这就是它的全部。

您应该为条件逻辑创建一个抽象方法,而不是使用if语句。然后让子类运行正确的代码


这还可以避免每次创建新的子类时都必须修改基类。

在某些情况下,父类中的这一行就解决了这个问题。它返回“子”类的名称(不是父类):


请参阅此处以了解进一步的讨论:

在负责回答问题的条件的超类创建方法中-是类型X的子类之一。在处理逻辑中,使用此方法确定要执行的代码块。每个子类都可以覆盖决策方法并根据需要进行回答。因此,您的超类不了解子类,子类也不必担心实际的处理实现

abstract class A {

    abstract boolean isItX();

    void doX() { ... }

    void doY() { ... }

    void process() {
        if (isItX()) {
            doX();
        } else {
            doY();
        }
    }
}

class B extends A {
    boolean isItX() {
        return true;
    }
}

class C extends A {
    boolean isItX() {
        return false;
    }
}

有关更多信息,请参见。

您也可以使用父级的.getClass()方法,然后按如下方式进行检查

if(parent.getClass().equals(childObj.class)){
//to do ..
}
这基本上是有效的,因为它返回运行时对象类。
这在抽象类的情况下尤其有效——我最近在我的项目中尝试并测试了这些抽象类。

问题和标题不匹配。您根本不需要子类名称。相反,您希望测试该是否是特定子类的实例。超级类是否也被称为“父类”?我听过定义为A的关系是从B派生的-B是父类,A是子类。是的,超类被称为父类,但你不需要特别知道子类的名称,你只需要知道子类是哪个类的实例。我理解我的语义错了,但我个人确实想要这个名称。我想让我的活动以两种方式之一运行,因此我想在BaseActivity中声明一个活动列表,并说“如果当前正在执行的活动是此列表中的活动之一,请执行此代码块”。我在想,保留一份名单是最干净的解决办法。我不需要所有的活动来实现它,因为它是同一件事(可能是重复的代码)。我想我可以做一个列表或类似的东西,而不是比较名字。不过我不需要一遍又一遍地重新实现任何东西。我只是想知道这个活动是否应该执行某段代码,否则就跳过它。比如说,15个做和15个不做。所有15个都应该执行相同的代码块…应该在基类中完成,并且只是有条件地执行它。这不是一个面向对象的解决方案。最好使用这个.getClass().getSimpleName()。这样,您就不必在每次引入新的子类时修改父代码。或者给父对象一个名为getName()的抽象方法,这样每个子对象都会返回自己的名称。
if(parent.getClass().equals(childObj.class)){
//to do ..
}