2010-01-31 79 views
6

虽然在类中没有任何抽象方法,但我对HttpServlet类是一个抽象类有疑问,所有方法都是具体的。 即使没有抽象方法,类也可以抽象吗?如果是的话有什么用?所以你要继承他们为了使用它即使没有抽象方法,类也可以抽象吗?如果是的话有什么用?

感谢

+0

请参阅http://stackoverflow.com/questions/362446/abstract-class-with-all-concrete-methods – 2010-01-31 13:08:04

回答

18

HttpServlet的情况下,问题在于servlet程序员通常不希望他们的servlet支持所有4种主要的HTTP方法(POST,GET,PUT,DELETE),所以这会让人烦恼doGet()doPost()等方法抽象,因为程序员将被迫实现他们不需要的方法。因此,HttpServlet为所有那些除了向客户端返回错误状态码都不做任何事情的方法提供了默认实现。程序员可以覆盖他们需要的方法,而不用担心其余的问题。但实际上使用HttpServlet类本身没有意义(因为它没有任何用处),所以它是abstract

有你有当它是有意义有一个抽象类,没有任何抽象方法一个很好的例子。

+0

这确实是一个很好的例子。它也被称为模板方法模式。 – BalusC 2010-02-02 15:20:31

6

一个不能实例化抽象类。
在子类中,您仍然可以实现自己的方法或覆盖父方法。

也许它没有意义使用HttpServlet作为独立的,但它在一定的范围内提供必要的默认功能。你可以子类HttpServlet来服务这个上下文,并有权访问它的功能。

HttpServlet子类没有实现,以使自己的功能的工作方法。

3

这是一个意图问题。如果该类是抽象的,则不能创建该类的实例 - 仅限于一个子类。

我不是Java的强,但我的猜测是,HttpServlet中提供它的方法的默认实现,但你希望覆盖其中的一些。拥有该类的非特化实例仍然没什么意义,所以它是抽象的,因此编译器会向任何尝试的人发出提示。

+0

+1,“HttpServlet”方法的默认行为将导致*非常枯燥的网页pages ... – 2010-01-31 12:11:25

+0

当然不会像http://www.cavaliers.org/john/boring.html那样无聊吗? – Steve314 2010-01-31 12:23:19

2

标记类作为一个抽象的,即使有一个具体的实现为所有方法是在你不知道的类设计完成后或有您计划稍后添加一些方法的机会的情况很有帮助。改变一个已被声明为抽象的类以后不会抽象,不会中断与预先存在的二进制文件的兼容性,因为其他方式会破坏兼容性。

相关问题