更详细:https://www.cnblogs.com/jthr/p/15762527.html

1.子类重写父类方法

1.1父类

public class Father {

    public int num = 20;

    public int get()
{ System.out.println("father-get"); return num;
} public void fatherMethod(){ }
}

1.2子类

public class Son extends Father{

    public int num = 10;

    public int get(){
System.out.println("son-get");
return num;
} public static void main(String[] args) {
Father s = new Son();
System.out.println(s.num);
System.out.println(s.get()); }
}

1.3执行结果

20
son-get
10

可以看到s.num输出的是父类的值

get方法调用的是子类的方法,输出的是子类的值

1.4使用 javap -verbose查看Son.class文件

看main方法

可以看到,

s.num
s.get

都是父类的字段和方法

那么在执行时,却是父类的字段,子类的方法呢?

2.方法调用

2.1分类

Java 的方法调用有两类,动态方法调用与静态方法调用。静态方法调用是指对于类的静态方法的调用方式,是静态绑定的;而动态方法调用需要有方法调用所作用的对象,是动态绑定的。类调用 (invokestatic) 是在编译时刻就已经确定好具体调用方法的情况,而实例调用 (invokevirtual) 则是在调用的时候才确定具体的调用方法,这就是动态绑定,也是多态要解决的核心问题。

JVM 的方法调用指令有四个,分别是 invokestatic,invokespecial,invokesvirtual 和 invokeinterface。前两个是静态绑定,后两个是动态绑定的。本文也可以说是对于 JVM 后两种调用实现的考察。

2.2动态调用

上面的例子,编译时,s的类型是Father

invokevirtual 指令指向的是#10,也就是father的get方法

  而真正调用方法时,根据实例this得到对象实际上是Son,它会先去查找Son方法表中的方法,如果有,调用Son方法表中的方法,如果没有,向上查找父类的方法表,找到后,调用父类方法表中的方法。

最新文章

  1. [AngularJS] AngularJS系列(3) 中级篇之表单验证
  2. August 13th 2016 Week 33rd Saturday
  3. 初学Html
  4. 用了那么久居然没发现firefox快捷键有如此多
  5. Java基础(56):Java---Assertion的试用(华为OJ里的Java题目的用例检测就是用的断言)
  6. ant条件逻辑
  7. zendstudio 10下载汉化
  8. Erlang - Download and Install for Linux
  9. HDU4452 Running Rabbits
  10. STM32的USART DMA传输(转)
  11. 【JSP 标签】选择判断c:choose
  12. Python 3.6.3 利用 Dlib 19.7 和 opencv 实现人脸68点定位 进行人脸识别
  13. mybatis_SQL映射(1)
  14. java制作验证码(java验证码小程序)
  15. 等待activity出现(android特有的wait_activity)
  16. gulp入门指南
  17. (28)django的中间件(自定义中间件和防范跨站请求伪造攻击)-重要的概念
  18. tomcat中的类加载机制
  19. git 权限问题:insufficient permission for adding an object to repository database .git
  20. 卡西欧(casio)Fx-5800p程序调试器||模拟器V1.0

热门文章

  1. Linux下安装 SkyWalking 分布式追踪系统
  2. 修复 docker build 错误 "ERROR: No build stage in current context"
  3. Go实现常用软件设计模式二:工厂模式
  4. Java-数组工具类Arrays
  5. 基于python的数学建模---轮廓系数的确定
  6. i春秋Fuzz
  7. Day20:继承详解
  8. 【2022-11-28】Docker部署搭建Gitlab
  9. 【Java EE】Day05 JDBC概念、对象、控制事务
  10. 2022年Kubernetes CKA 认证真题解析完整版