在Java中强制使用基类方法

时间:2014-05-06 01:53:45

标签: java inheritance

假设我有两个课程BaseDerived

public class Base {
    public Base() { }
    public void methodA() {
        System.out.println("Base: methodA");
        methodB();
    }
    public void methodB() {
        System.out.println("Base: methodB");
    }
}
public class Derived extends Base {
    public Derived() { }
    public void methodA() {
        super.methodA();
        System.out.println("Derived: methodA");
    }
    public void methodB() {
        System.out.println("Derived: methodB");
    }
}

现在有了这个:

Base d = new Derived();
d.methodA();

将打印:

Base: methodA
Derived: methodB
Derived: methodA

我的问题是:是否可以强制d.methodA()使用Base.methodB()我希望代码打印出来:

Base: methodA
Base: methodB
Derived: methodA

对于那些在C ++中知识渊博的人来说,这可以通过Base类中的Base::methodB()来完成。 Java中是否有等价物?

我几乎肯定以前曾经问过,但是我找不到任何东西,如果这是重复的话,我很抱歉。

3 个答案:

答案 0 :(得分:6)

如果基类中的方法可以有覆盖,并且派生类提供了一个方法,则无法强制调用基类的方法。

如果基类需要调用基类中的功能,则可以将其放入单独的方法中,并将其声明为final。然后它可以在它自己的实现和派生的实现之间做出决定,如下所示:

public class Base {
    public Base() { }
    public void methodA() {
        System.out.println("Base: methodA");
        // Call the derived method
        methodB();
        // Call the base method
        methodB_impl();
    }
    public final void methodB_impl() {
        System.out.println("Base: methodB");
    }
    public void methodB() {
        methodB_impl();
    }
}

答案 1 :(得分:0)

不能这样做。在C ++中 - 说,所有Java方法都是“虚拟的”。所以这样做:

public class Base {

    public void methodA() {
        System.out.println("Base: methodA");
        baseMethodB();
    }

    public void methodB() {
        baseMethodB();
    }

    private void baseMethodB() {
        System.out.println("Base: methodB");
    }
}

答案 2 :(得分:0)

我认为你可以通过将父类中的功能分解为它自己的方法来实现你想要的。不是您正在寻找的方向,而是达到您想要的目标:

public class Base {
    public Base() { }
    public void methodA() {
        System.out.println("Base: methodA");
        methodBInner();
    }

    public void methodB() {
        methodBInner();
    }

    private void methodBInner() {
        System.out.println("Base: methodB");        
    }
}