java - 不使用 super 的子类方法的默认行为是什么?

标签 java inheritance subclass superclass information-hiding

是否有可能为子类中的方法定义一些默认行为,而不必调用 super

例如:假设我们要设置 boolean父类(super class)中的值,并且您想对子类隐藏它,有没有办法隐藏 boolean 值的修改?假设我们有以下基类 BaseTest

public class BaseTest {
    private boolean mIsInitialized = false;

    public BaseTest() {
    }

    public void initialize() {
        mIsInitialized = true;
    }
}

及其子类Test :

public class Test extends BaseTest {
    public Test() {
    }

    public void initialize() {
    }
}

我想调用 Test.initialize()设置mIsInitialized值为 true无需调用super.initialize() 。我同样希望避免在父类(super class)中定义抽象函数。 这可能吗?

最佳答案

可以做到这一点,但不能通过重写initialize。在BaseTest类中,将initialize标记为final,这样它就不能被覆盖。在initialize中,调用另一个方法来执行任何子类初始化。

public final void initialize() {
    mIsInitialized = true;
    initializeFurther();
}

你说没有抽象方法。但是,initializeFurther 可以直接清空。

protected void initializeFurther() {}

然后,子类Test只需要重写initializeFurther即可。

public class Test extends BaseTest {
    @Override
    protected void initializeFurther() {
       // Initialize Test here.
    }
}

基类的initialize方法保证将mIsInitialized设置为true,并且Test可以实现initializeFurther 但它想要,而不调用 super.initialize()Test 无法阻止父类(super class) BaseTest 进行初始化。

当在任何 BaseTest 实例上调用 initialize 时,initialize 逻辑将始终运行。

关于java - 不使用 super 的子类方法的默认行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22363845/

相关文章:

java - iCalendar 文件中的时区问题

angular - 为什么 TypeScript 在实现时允许重复组件?

java - 结果在 Android 中不是随机的

java - FindBugs 扫描外部 jar

java - 当流包含不同类型的 channel 时,如何调用 sendAndReceive?

c++ - 仅在类的第一个实例初始化时调用的成员函数 (C++)

c# - 继承中的方法调用

java - 使用反射获取方法;找不到接口(interface)类型的方法参数

iphone - 子类化 UINavigationItem

java - 如何使用 Jena OntModel.listClasses() 方法?