直接上代码:

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就是省略了的隐参

 来看图解

java中多态的内存分析学习

this.doGet() 中的 this 其实指向的就是栈中 变量 s 指向的对象,就是图中最外层的对象

转载自:https://blog.csdn.net/blog_zyx/article/details/72528725https://blog.csdn.net/HibernatePlus/article/details/46679899

 

相关文章:

  • 2021-09-08
  • 2021-11-12
  • 2021-05-04
  • 2021-06-26
  • 2021-10-29
  • 2021-12-12
  • 2021-09-17
  • 2021-07-02
猜你喜欢
  • 2021-05-08
  • 2021-04-19
  • 2022-12-23
  • 2021-12-16
  • 2021-07-04
  • 2021-11-10
  • 2022-01-13
相关资源
相似解决方案