为什么在没有抽象方法时标记类抽象

时间:2015-02-12 06:47:49

标签: java oop abstract-class

我对java中的抽象类感到困惑。我知道,只要类编译器中有抽象方法,就强制开发人员标记类抽象。但即使我们在课堂上没有任何抽象方法,我们仍然将整个课程标记为抽象。我不明白为什么我们能做到这一点。当没有抽象方法时,允许开发人员标记类抽象的目的是什么。可以说,原因是我们不想创建该类的实例。如果那个原因然后标记类private的构造函数更合适而不是标记类abstract。

6 个答案:

答案 0 :(得分:4)

有一个没有抽象方法的抽象类有一个非常有用的理由:为可覆盖的方法提供默认实现。

JDK本身有几个完美的例子。看 - 例如 - 在WindowAdapter。它实现了WindowListener接口(以及其他接口),但提供了空的not-doing-anything方法实现。在大多数情况下,您希望注册仅覆盖一个或两个接口方法的窗口侦听器。然后,您自己的班级只是扩展WindowAdapter而不是实施WindowListener

请注意,在接口中使用Java 8默认方法时,这个原因不再适用,实际上没有抽象方法的抽象类不再有意义了。

答案 1 :(得分:0)

我认为是允许创建子类而不是主类。 我猜你的类中有方法存根,否则tyere没有理由不实例化它。通常最好使用抽象方法。

答案 2 :(得分:0)

用于限制要实例化的类。示例HttpServlet类..它被定义为abstract但没有abstract methods ..我们可以在子类中使用这些方法但是创建类httpservlet本身是没用..那就是我想的原因..

HTH!

答案 3 :(得分:0)

  

可以说原因是我们不想创建实例   那个班。如果那个原因那么标记类的构造函数   private更适合而不是标记类抽象。

它根本不适合

以下示例将清除您的疑虑,如果您使用私有构造函数,不仅您的对象创建被阻止,而且您甚至无法创建父类的子类

    class ParentClass{
             private ParentClass(){

             }
   }
    class Subclass extends ParentClass{
    static{
    System.out.println("Hello");
    }

  }

您将收到编译时错误

error: ParentClass() has private access in ParentClass

Marking一个类abstract将阻止对象创建但不会阻止java中的继承


<强>更新

正如您在评论中提到的那样,您可以对其进行保护,但之后可以轻松实例化您的课程,因为protected成员可以从same class以及SubClass in same package访问以及sub class in another package

答案 4 :(得分:0)

如上所述,这可以防止实例化。我非常喜欢私有或受保护的构造函数,因为我觉得他们更清楚地传达了意图。

此外,在类层次结构中,如果class A是抽象的并且包含抽象方法,则不需要在扩展class B的{​​{1}}中定义该方法。在这种情况下,class A被标记为抽象,并且没有抽象成员。

答案 5 :(得分:0)

防止实例化类并将其用作基类。例如,HttpServlet类,template method设计模式的示例,其中每个方法已经定义了行为。子类可以自由地覆盖其中的一个或多个而不是全部。