直接上代码:
public class HttpServlet{
public void service(){
System.out.println("HttpServlet.service()");
doGet();
}
public void doGet(){
System.out.println("HttpServlet.doGet()");
}
}
public class MyServlet extends HttpServlet{
public void doGet(){
System.out.println("MyServlet.doGet");
}
}
public class Test{
public static void main(String[] args){
HttpServlet s = new MyServlet();
s.service();
}
}
输出结果为:
HttpServlet.service()
MyServlet.doGet()
解释之前先看看两个概念:
1、每个函数都会默认有两个隐式参数(this,super),调用方法时如果当前对象没有某方法则会向父类逐层寻找,一直找到object类若还没有此方法则会报错。
2、方法中的隐式参数(this,super)this永远指向调用该方法的对象,如Cat c=new Cat() ; c.run(this,super)中c的方法中的this和父类及更上层父类的方法中的this都指向c。也就是说,service() 方法调用了 doGet() 其实也可以写成 this.doGet(),this就是省略了的隐参
来看图解
this.doGet() 中的 this 其实指向的就是栈中 变量 s 指向的对象,就是图中最外层的对象
转载自:https://blog.csdn.net/blog_zyx/article/details/72528725和https://blog.csdn.net/HibernatePlus/article/details/46679899