为什么在没有抽象方法的情况下标记class抽象
Why mark class abstract when there is no abstract method
我对 java 中的摘要 class 有点困惑。我知道只要 class 编译器中有一个抽象方法,就会强制开发人员标记 class 抽象。但是即使我们在 class 中没有任何抽象方法,我们仍然将整个 class 标记为抽象。我不明白为什么我们可以这样做。当没有抽象方法时,允许开发人员标记 class 抽象的目的是什么。可以说原因是我们不想创建 class 的实例。如果是这个原因,那么标记 class private 的构造函数比标记 class abstract.
更合适
我认为它允许创建子classes 但不允许创建主class。
我猜你的 class 里面有方法存根,否则你没有理由不实例化它。通常最好使用抽象方法。
用于限制class被实例化..例子HttpServlet
class..它定义抽象但没有abstract methods
..我们可以使用这些方法在 subclasses 但创建 class httpservlet 本身是无用的..这就是我认为的原因..
HTH!
One can say that reason is that we don't want to create instance of
that class. If that the reason then marking constructor of the class
private is more suitable rather than marking class abstract.
没有完全不适合
下面这个例子将消除你的疑虑,如果你使用私有构造函数,不仅你的对象创建被阻止而且你甚至不能创建父对象的子classclass
class ParentClass{
private ParentClass(){
}
}
class Subclass extends ParentClass{
static{
System.out.println("Hello");
}
}
你会得到编译时错误
error: ParentClass() has private access in ParentClass
但是 Marking
a class as abstract
将阻止对象创建但不会阻止 java
中的继承
更新
正如您在评论中所问的那样,您可以使其受到保护,但是您的 class 可以很容易地实例化,因为 protected
成员可以从 same class
访问,也可以在SubClass in same package
以及 sub class in another package
.
如前所述,这可能是为了防止实例化。我非常喜欢私有或受保护的构造函数,因为我觉得它们更清楚地传达了意图。
此外,在 class 层次结构中,如果 class A
是抽象的并且包含一个抽象方法,则不需要在 class B
中定义该方法 class A
=].在这种情况下,class B
被标记为抽象并且没有抽象成员。
有一个没有抽象方法的抽象 class 的一个非常有用的理由:为可覆盖方法提供默认实现。
JDK本身就有几个完美的例子。查看 - 例如 - 在 WindowAdapter
. It implements the WindowListener
接口(以及其他接口)中,但提供空的不做任何事情的方法实现。在大多数情况下,您希望注册一个 window 侦听器,它只覆盖一个或两个接口方法。然后你自己的 class 只是扩展 WindowAdapter
而不是实现 WindowListener
.
请注意,在接口中有 Java 8 个默认方法的情况下,这个原因不再成立,事实上,没有抽象方法的抽象 classes 不再有意义。
防止 class 的实例化并将其用作基础 class。例如,HttpServlet class, an example of template method 设计模式,其中每个方法都已经定义了一个行为。 child class 可以自由覆盖其中的一个或多个,而不是全部。
我对 java 中的摘要 class 有点困惑。我知道只要 class 编译器中有一个抽象方法,就会强制开发人员标记 class 抽象。但是即使我们在 class 中没有任何抽象方法,我们仍然将整个 class 标记为抽象。我不明白为什么我们可以这样做。当没有抽象方法时,允许开发人员标记 class 抽象的目的是什么。可以说原因是我们不想创建 class 的实例。如果是这个原因,那么标记 class private 的构造函数比标记 class abstract.
更合适我认为它允许创建子classes 但不允许创建主class。 我猜你的 class 里面有方法存根,否则你没有理由不实例化它。通常最好使用抽象方法。
用于限制class被实例化..例子HttpServlet
class..它定义抽象但没有abstract methods
..我们可以使用这些方法在 subclasses 但创建 class httpservlet 本身是无用的..这就是我认为的原因..
HTH!
One can say that reason is that we don't want to create instance of that class. If that the reason then marking constructor of the class private is more suitable rather than marking class abstract.
没有完全不适合
下面这个例子将消除你的疑虑,如果你使用私有构造函数,不仅你的对象创建被阻止而且你甚至不能创建父对象的子classclass
class ParentClass{
private ParentClass(){
}
}
class Subclass extends ParentClass{
static{
System.out.println("Hello");
}
}
你会得到编译时错误
error: ParentClass() has private access in ParentClass
但是 Marking
a class as abstract
将阻止对象创建但不会阻止 java
更新
正如您在评论中所问的那样,您可以使其受到保护,但是您的 class 可以很容易地实例化,因为 protected
成员可以从 same class
访问,也可以在SubClass in same package
以及 sub class in another package
.
如前所述,这可能是为了防止实例化。我非常喜欢私有或受保护的构造函数,因为我觉得它们更清楚地传达了意图。
此外,在 class 层次结构中,如果 class A
是抽象的并且包含一个抽象方法,则不需要在 class B
中定义该方法 class A
=].在这种情况下,class B
被标记为抽象并且没有抽象成员。
有一个没有抽象方法的抽象 class 的一个非常有用的理由:为可覆盖方法提供默认实现。
JDK本身就有几个完美的例子。查看 - 例如 - 在 WindowAdapter
. It implements the WindowListener
接口(以及其他接口)中,但提供空的不做任何事情的方法实现。在大多数情况下,您希望注册一个 window 侦听器,它只覆盖一个或两个接口方法。然后你自己的 class 只是扩展 WindowAdapter
而不是实现 WindowListener
.
请注意,在接口中有 Java 8 个默认方法的情况下,这个原因不再成立,事实上,没有抽象方法的抽象 classes 不再有意义。
防止 class 的实例化并将其用作基础 class。例如,HttpServlet class, an example of template method 设计模式,其中每个方法都已经定义了一个行为。 child class 可以自由覆盖其中的一个或多个,而不是全部。