关于第一个init()和第二个init()

时间:2012-12-16 15:25:10

标签: java java-ee servlets

在部署项目之后,当客户端第一次向TestServlet发送请求时,服务器会创建testServlet对象,然后调用第一个init()方法(init(ServletConfig config))。然后JVM检查TestServlet中的第一个init()方法,因为它不可用,然后它检查超类HttpServlet还有第一个init方法不可用,然后JVM检查HttpServlet的超级类,即GenericServlet类,首先init()是可用的然后JVM执行它并调用第二个init(),因为第二个init()可直接在TestServlet中使用,然后JVM执行它。

问:请注意以上内容我想知道GenericServlet的第一个init()如何调用TestServlet类的第二个init(),因为在GenericServlet第一个init()内部调用的是init()为空。

1 个答案:

答案 0 :(得分:1)

这是多态性的基本原理。由于init()是一个可覆盖的方法,并且由于servlet是TestServlet的一个实例,它覆盖了init()方法,因此使用了该方法的TestServlet实现。

就像下面的例子一样:

public class Animal {
    public void saySomething() {
        // do nothing
    }

    public void saySomethingElse() {
        saySomething();
    }
}

public class Dog extends Animal {
    @Override
    public void saySomething() {
        System.out.println("bark!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
        animal.saySomething(); // bark!, because the animal is a dog

        animal.saySomethingElse(); // still bark!, because the animal is a dog
                                   // and saySomethingElse() calls the animal's
                                   // polymorphic saySomething() method.
    }
}