具体的 subclass 不会覆盖 abstract class 中的抽象方法

Concrete subclass that does not override abstract methods from abstract class

假设我在一个抽象基类中有两个抽象方法 class:

    protected abstract void writeData(OutputStream stream);
    protected abstract void writeData(Writer writer);

我在实现的时候,必须重写这些方法,这样当需要写数据的时候,它才知道怎么写。
我需要知道的是,如果我可以使 subclass 只需要覆盖其中一个方法,而不是两个方法。
另外,我想知道如何确定哪个方法被覆盖了。
这甚至可能吗?

简短的回答是否定的。

长答案是:abstract class 中的 abstract 方法必须是子 class 中的 overridden。如果您不想在 subclass 中仅重写其中一个方法,则 subclass 也必须声明为 abstract。如果没有任何 static 字段或方法,这样的子 class 几乎没有用,因为它无法实例化,并且没有 class 的实例就无法访问实例字段或方法。

也就是说,Java 8 在 interface 中引入了默认方法的概念。您可以将摘要 class 转换为 interface 并将 writeData(OutputStream stream)writeData(Writer writer) 标记为 default :

public interface DataWriter {
    public default void writeData(OutputStream stream) {
        //no-behavior
    }

    public default void writeData(Writer writer) {
        //no-behavior
    }
}

以上代码类似于抽象class,不同于具体class,因为它不能被实例化。虽然这解决了您的问题,但我真的认为首先做这样的事情没有多大价值。

具体的子类必须覆盖所有 abstract 方法,或者必须更改为 abstract 本身。如果有多个 abstract 方法,则不能只覆盖一个。

根据您的要求,让一个具体的子类只覆盖其中一个重载的 abstract 方法是没有意义的。您可以尝试在您的抽象超类中仅使用 one writeData 方法,并使用泛型类型参数。

public abstract class MyClass<T extends Closeable & Flushable>
{
    protected abstract void writeData(T t);
}

我添加了表示 OutputStreamWriter 之间公共接口的上限,但它们通常不是必需的。

然后您的具体子类(只需要重写一个方法)可以选择使用哪个类型参数。

class MyOutputStreamClass extends MyClass<OutputStream>
{
    protected void writeData(OutputStream stream) { /* implement */ }
}

class MyWriterClass extends MyClass<Writer>
{
    protected void writeData(Writer writer) { /* implement */ }
}

我想你要做的是只将一个方法声明为抽象方法。您不希望 subclass 重写的方法,您可以在此摘要 class 中提供其实现。

像这样:

protected abstract void writeData(OutputStream stream);

//the method you don't want subclass to override.
public void writeData(Writer writer)
{ 
     //doSomething here 
}