当有人在其中的所有方法都是具体的时候声明一个类摘要时,是否有一些实际的编程情况?
答案 0 :(得分:15)
您可以使用模板方法模式,其中有多个覆盖点都具有默认实现,但组合的默认实现本身不合法 - 任何功能实现都必须是子类。
(是的,我不喜欢模板方法模式;))
答案 1 :(得分:5)
抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。它们无法实例化,所以如果你有一个带有具体方法的抽象类,那么它就可以被子类化,然后可以实例化子类。
答案 2 :(得分:4)
Immagine一个接口,其声明的方法在实现时通常显示相同的默认行为。编写需要支持接口的类时,必须反复定义所述默认行为。
为了便于实现具体类,您可能希望提供一个抽象类,为每个方法提供默认行为。要支持具体类中的接口,您可以从抽象类派生,并在它们偏离标准行为时覆盖方法。这样,您就可以避免重复执行相同(冗余)的默认行为。
答案 3 :(得分:2)
另一个可能的用例是装饰器,它将所有调用委托给包装的实例。具体的装饰器实现只能覆盖添加功能的那些方法:
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)。
答案 4 :(得分:2)
以前的答案已经解决了主要问题,但是可能值得一提的是一个小细节。
您可以拥有一个返回抽象类(隐藏)子类实例的工厂。抽象类定义了结果对象上的契约,并提供了默认实现,但是这个类是抽象的这一事实使它不能直接实例化,并且还表明“真实”实现类的身份不是公布
答案 5 :(得分:1)
想知道为什么没有人指出MouseAdapter的实际例子:
http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseAdapter.html
用于接收鼠标事件的抽象适配器类。方法中 这个班是空的。此类存在是为了方便创建 听众对象。
答案 6 :(得分:0)
好问题:)
有一件事是肯定的......这肯定是可能的。 krosenvold的模板建议是这样做的一个很好的理由。
我只是想说一个类不能仅仅为了阻止它的实例化而声明abstract
。
这在Java语言规范Section 8.1.1.1
中引用答案 7 :(得分:0)
如果您有一个重要的类,但系统无法为此类创建实例,因为
答案 8 :(得分:0)
Servlet示例:
所有方法都是具体的, 但是基类本身是没用的:
DeleteAuthor.java
DeleteAuthor 保留 Book.java
DeleteAuthor 刻录 Book.java