为什么我们使用init()而不是Constructor

时间:2012-02-21 16:36:27

标签: java servlets applet

为什么我们需要init()而不是constructor

请参考ServletApplet进行回答 init()的{​​{1}}与Applet的区别如何?

4 个答案:

答案 0 :(得分:10)

init()方法创建并加载servlet。但是servlet实例首先是通过构造函数创建的(由Servlet容器完成)。我们不能在servlet中用参数编写servlet类的构造函数(它会抛出异常)。因此,他们提供了一个init()方法,它接受ServletConfig对象作为参数。 ServletConfig对象为servlet提供有关其初始化(init)参数的信息。 Servlet类不能使用ServletConfig对象声明构造函数作为参数,也不能访问ServletConfig对象。

更多信息:http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets6.html

答案 1 :(得分:2)

你需要两者,但是他们执行不同的活动,你的构造函数在通过调用new创建对象时执行,但对于某些类型的对象,你不能控制它们的创建,或者你宁愿不仅在创建了对象之后执行了一些代码,而且是完全初始化的,那么你需要一个特殊的方法,有人打电话来表示对象已经准备就绪。

特别是对于不是由您管理的对象,而是服务器,框架或管理这些对象的人。

您应该将此方法视为在此对象将在构造函数上执行的代码顶部为您提供的商品

答案 2 :(得分:2)

这是一个设计选择。 servlet规范说你必须提供一个no-arg构造函数,你可以覆盖init()方法来执行初始化任务。他们本可以选择另外做,并要求servlet有一个参数构造函数(ServletConfig),可以选择抛出ServletException。从技术上讲,没有问题,因为反射API允许您调用类中声明的任何构造函数。

但是,使用init()方法允许servlet容器预先实例化对象并延迟其初始化。它有助于分离生命周期的不同阶段。

就个人而言,我认为这不是一个强有力的设计选择。让Web应用程序为servlet容器提供预先实例化的servlet,而不是让容器调用各种servlet的构造函数会更方便。

答案 3 :(得分:0)

init()方法仅被调用一次,因此将仅创建控件的一个实例。