所有具体方法的抽象类

是否存在一些实际的编程情况,当有人在其中的所有方法都具体时声明一个类抽象?

那么你可以使用模板方法模式,其中有多个覆盖点都具有默认实现,但组合的默认实现本身并不合法 – 任何function实现必须是子类。

(是的,我不喜欢模板方法模式;))

抽象类是一个声明为抽象的类 – 它可能包含也可能不包含抽象方法。 它们无法实例化,因此如果您有一个具有特定方法的抽象类,那么它可以被子类化,然后可以实例化子类。

Immagine一个接口,其声明的方法通常在实现时显示相同的默认行为。 编写需要支持接口的类时,必须反复定义所述默认行为。

为了便于实现具体类,您可能希望提供一个抽象类,为每个方法提供默认行为。 要支持具体类中的接口,您可以从抽象类派生,并在它们偏离标准行为时覆盖方法。 这样您就可以避免重复执行相同(冗余)的默认行为。

另一个可能的用例是装饰器,它将所有调用委托给包装的实例。 具体的装饰器实现只能覆盖添加function的方法:

public interface Foo { public void bar(); } public abstract class FooDecorator implements Foo { private final Foo wrapped; public FooDecorator(Foo wrapped) { this.wrapped = wrapped; } public void bar() { wrapped.bar(); } } public class TracingFoo extends FooDecorator { //Omitting constructor code... public void bar() { log("Entering bar()"); super.bar(); log("Exiting bar()"); } } 

虽然我没有真正看到将FooDecorator声明为抽象的必要性(非抽象示例: HttpServletRequestWrapper )。

以前的答案已经解决了主要问题,但有一个小细节可能值得一提。

您可以拥有一个返回抽象类(隐藏)子类实例的工厂。 抽象类定义了生成对象的契约,并提供了默认实现,但是这个类是抽象的这一事实使得它不能直接实例化,并且还表明“真实”实现类的身份不是出版。

想知道为什么没有人指出MouseAdapter的实际例子:

http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseAdapter.html

用于接收鼠标事件的抽象适配器类。 此类中的方法为空。 此类用于创建侦听器对象。

好问题:)

有一件事是肯定的……这当然是可能的。 krosenvold的模板建议是这样做的一个很好的理由。

我只是想说一个类不能被声明为abstract只是为了防止它的实例化。

这在Java语言规范第8.1.1.1节中引用

当你有一个重要的类,但系统无法为这个类创建一个实例,因为

  • 这个类是系统很多类的父类;
  • 对于域名的要求,这有很多责任(许多类使用的方法);
  • 这个类不代表具体的对象;

Servlet示例:

所有方法都是具体的,但基类本身是无用的:

DeleteAuthor.java

  1. 具体的doGet方法的抽象类。
  2. doGet调用受保护字符串sql_path中指向的文件。
  3. sql_path为null

DeleteAuthor Keep Book.java

  1. 扩展抽象类DeleteAuthor
  2. 将sql_path设置为delete_author_ KEEP _BOOK.sql

DeleteAuthor Burn Book.java

  1. 扩展抽象类DeleteAuthor
  2. 将sql_path设置为delete_author_ BURN _BOOK.sql