在部署项目之后,当客户端第一次向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()为空。答案 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.
}
}