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

Ste*_*ock 2 java inheritance information-hiding subclass superclass

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

例如:假设我们想boolean在超类中设置一个值并且你想从子类中隐藏它,有没有办法隐藏布尔值的修改?假设我们有以下基类BaseTest

public class BaseTest {
    private boolean mIsInitialized = false;

    public BaseTest() {
    }

    public void initialize() {
        mIsInitialized = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

及其子类Test:

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

    public void initialize() {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

rge*_*man 6

可以这样做,但不能覆盖initialize.在BaseTest课堂上,标记initializefinal无法覆盖.在initialize,调用另一个方法来进行任何子类初始化.

public final void initialize() {
    mIsInitialized = true;
    initializeFurther();
}
Run Code Online (Sandbox Code Playgroud)

你说没有abstract方法.但是,initializeFurther可以变得空虚.

protected void initializeFurther() {}
Run Code Online (Sandbox Code Playgroud)

然后,子类Test只需要覆盖initializeFurther.

public class Test extends BaseTest {
    @Override
    protected void initializeFurther() {
       // Initialize Test here.
    }
}
Run Code Online (Sandbox Code Playgroud)

基类的initialize方法保证设置mIsInitializedtrue,并且Test可以实现initializeFurther它想要的,而无需调用super.initialize(). Test无法阻止超类BaseTest进行初始化.

initialize调用任何BaseTest情况下,initialize逻辑将始终运行.