我正在玩抽象的方法和类......有时候你需要这样的东西,而不仅仅是创建一个具体的类吗?
public abstract class AbstractClass{
public String nonAbstractMethodOne(String param1,String param2){
String param = param1 + param2;
return param;
}
public static void nonAbstractMethodTwo(String param){
System.out.println("Value of param is "+param);
}
}
答案 0 :(得分:5)
抽象类可以提供默认实现。
考虑Java API中的MouseListener
和相应的抽象类MouseAdapter
。
使用“纯”(非抽象)MouseAdapter
没有意义:所有方法都是作为no-ops实现的。但是,该类非常便于用作具体侦听器的抽象父类,因为您只需要覆盖您感兴趣的一个方法,而不必重新实现许多方法,因为没有 - OPS。
没有必要使MouseAdapter
抽象。这是一个完整的课程。它只是没有使 sense 使用它而不重写至少一个方法。但是,如果您希望它至少有一个MouseListenerWithoutMouseClicked
方法,则需要abstract
。
另一个例子是state pattern。该接口定义了实际的API。抽象类将实现(部分或全部)转换函数作为默认操作。每个州只会覆盖那些偏离默认行为的方法。
通常,任何“抽象”方法声明都可以(通常:应该)移动到接口。我经常将它们声明为@Override abstract
的唯一原因是文档目的,以强调需要为具体实例实现哪些方法。
从接口继承的任何方法都将有效地声明一个抽象方法。
答案 1 :(得分:2)
你可以这样做,但我会反对它。类层次结构非常不灵活,并且由于此代码不利用抽象方法,我会寻找另一种方法来实现它。
抽象类的要点是它提供了一个模板,其中超类定义了抽象方法并在它自己的方法中调用它们,因此子类指定了细节的发生方式。这个例子没有什么需要继承,所以我没有它。
example Bohemian brings up是适配器类的,它提供了多种方法的默认实现,因此您编写的类不必提供您不关心的方法的实现。这将是没有抽象方法的抽象类的最佳时间(尽管适配器是抽象的并不是那么重要)。
答案 2 :(得分:2)
如果要为子类应覆盖的方法提供默认实现。特别是当默认实现是“什么都不做”或拥有“未实现”的异常时。
JDK的一个例子是HttpServet
,它有方法来处理四个http方法(get,post,put和delete)中的每一个,其默认实现抛出ServletException
,强制子类为覆盖他们想要实现的那些方法,但只覆盖那些方法。如果被调用,未实现的方法会爆炸。这很有道理,因为如果Web客户端使用意外的Web方法命中服务器,它会干净地抛出异常。