Java - 绕过多态?

111*_*001 2 java polymorphism

可以说我有这样一个类:

public class Base
{

    public void foo()
    {
        System.out.println("base foo");
    }

    public Base()
    {
        foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的派生类:

public class Derived extends Base
{
    public void foo()
    {
        System.out.println("derived foo");
    }
}
Run Code Online (Sandbox Code Playgroud)

由于多态性,当我创建派生类的实例时,当基本构造函数被隐式调用时,基本构造函数将调用派生方法foo而不是基本foo.有没有办法"强制"基础构造函数调用自己的foo?

Jon*_*eet 9

有没有办法"强制"基础构造函数调用自己的foo?

否(假设你希望能够覆盖fooDerived)的在其中一个虚拟方法的调用将不被执行的多态是当你调用情况super.whatever()从一个子类-这将调用父类的实现,即使子类覆盖它.这在你的情况下没用,因为你想在同一个类中调用实现.

但是,您可以使用模板方法模式的变体(它不一样,但它让人想起它......)来获得您想要的效果.

public class Base
{
    public void foo()
    {
        fooImpl();
    }

    private void fooImpl()
    {
        System.out.println("base foo");
    }

    public Base()
    {
        fooImpl();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在foo()它本身就像正常一样多态 - 但是如果(在Base之内)你想要执行" foo()如果它没有被覆盖会怎么做"你可以调用fooImpl().