我对java中的抽象类感到困惑。我知道,只要类编译器中有抽象方法,就强制开发人员标记类抽象。但即使我们在课堂上没有任何抽象方法,我们仍然将整个课程标记为抽象。我不明白为什么我们能做到这一点。当没有抽象方法时,允许开发人员标记类抽象的目的是什么。可以说,原因是我们不想创建该类的实例。如果那个原因然后标记类private的构造函数更合适而不是标记类abstract。
答案 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设计模式的示例,其中每个方法已经定义了行为。子类可以自由地覆盖其中的一个或多个而不是全部。