有没有时间你需要一个没有任何抽象方法的抽象类

时间:2013-12-28 19:51:08

标签: java methods abstract

我正在玩抽象的方法和类......有时候你需要这样的东西,而不仅仅是创建一个具体的类吗?

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);
    }
}

3 个答案:

答案 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方法命中服务器,它会干净地抛出异常。