不覆盖抽象类

时间:2015-05-04 16:42:45

标签: java abstract-class method-overriding

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

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

当我进行实现时,我必须覆盖这些方法,以便在需要编写数据时,它知道如何执行。
我需要知道的是,如果我可以创建一个子类,只需要覆盖其中一个方法,而不是两个方法 另外,我想知道如何确定哪一种方法被覆盖 这甚至可能吗?

3 个答案:

答案 0 :(得分:2)

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

对于您的要求,让具体的子类只覆盖其中一个重载的abstract方法是没有意义的。您可以尝试在抽象超类中使用一个 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 */ }
}

答案 1 :(得分:1)

简短的回答是否定的。

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

话虽如此,Java 8在interface中引入了默认方法的概念。您可以将抽象类转换为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
    }
}

上面的代码类似于抽象类,与具体类不同,因为它无法实例化。虽然这解决了你的问题,但我真的没有看到做这样的事情的重要性。

答案 2 :(得分:0)

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

这样的事情:

protected abstract void writeData(OutputStream stream);

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