0

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

Q.关于上面的段落,我想知道 GenericServlet 的第一个 init() 如何调用 TestServlet 类的第二个 init(),因为在 GenericServlet 中,第一个 init() 内部调用了空的 init()。

4

1 回答 1

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.
    }
}
于 2012-12-16T15:37:19.997 回答