假设我在抽象基类中有两个抽象方法:
protected abstract void writeData(OutputStream stream);
protected abstract void writeData(Writer writer);
当我进行实现时,我必须覆盖这些方法,以便在需要编写数据时,它知道如何执行。
我需要知道的是,如果我可以创建一个子类,只需要覆盖其中一个方法,而不是两个方法
另外,我想知道如何确定哪一种方法被覆盖
这甚至可能吗?
答案 0 :(得分:2)
具体的子类必须覆盖所有abstract
方法,或者必须将其更改为abstract
本身。如果有多个abstract
方法,则不能只覆盖一个。
对于您的要求,让具体的子类只覆盖其中一个重载的abstract
方法是没有意义的。您可以尝试在抽象超类中使用一个 writeData
方法,并使用泛型类型参数。
public abstract class MyClass<T extends Closeable & Flushable>
{
protected abstract void writeData(T t);
}
我添加了代表OutputStream
和Writer
之间通用接口的上限,但它们通常不是必需的。
然后,您的具体子类(只需要覆盖一个方法)可以选择要使用的类型参数。
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
}