方法调用的过程

寻找要执行的实例方法的时候,是从对象的实际类型信息开始查找的,找不到的时候,再查找父类类型信息。

动态绑定,而动态绑定实现的机制就是根据对象的实际类型查找要执行的方法,子类型中找不到的时候再查找父类。

变量访问的过程

对变量的访问是静态绑定的,无论是类变量还是实例变量。代码中演示的是类变量:b.s和c.s,通过对象访问类变量,系统会转换为直接访问类变量Base.s和Child.s。

示例代码:

  1. package com.xc.xcspringboot.chapter4.chapter4_3_1;
  2.  
  3. /**
  4. * Created by xc on 2019/10/6
  5. * 代码清单4-7 演示继承原理:Base类
  6. */
  7. public class Base {
  8.  
  9. /**
  10. * 静态变量s
  11. */
  12. public static int s;
  13. /**
  14. * 实例变量a
  15. */
  16. private int a;
  17.  
  18. // 静态初始化代码块
  19. static {
  20. System.out.println("基类静态代码块, s: " + s);
  21. s = 1;
  22. }
  23.  
  24. // 实例初始化代码块
  25. {
  26. System.out.println("基类实例代码块, a: " + a);
  27. a = 1;
  28. }
  29.  
  30. /**
  31. * 构造方法
  32. */
  33. public Base() {
  34. System.out.println("基类构造方法, a: " + a);
  35. a = 2;
  36. }
  37.  
  38. /**
  39. * 方法step
  40. */
  41. protected void step() {
  42. System.out.println("base s: " + s + ", a: " + a);
  43. }
  44.  
  45. /**
  46. * 方法action
  47. */
  48. public void action() {
  49. System.out.println("start");
  50. step();
  51. System.out.println("end");
  52. }
  53. }
  1. package com.xc.xcspringboot.chapter4.chapter4_3_1;
  2.  
  3. /**
  4. * Created by xc on 2019/10/6
  5. * 代码清单4-8 演示继承原理:Child类
  6. */
  7. public class Child extends Base {
  8. /**
  9. * 和基类同名的静态变量s
  10. */
  11. public static int s;
  12. /**
  13. * 和基类同名的实例变量a
  14. */
  15. private int a;
  16.  
  17. static {
  18. System.out.println("子类静态代码块, s: " + s);
  19. s = 10;
  20. }
  21.  
  22. {
  23. System.out.println("子类实例代码块, a: " + a);
  24. a = 10;
  25. }
  26.  
  27. public Child() {
  28. System.out.println("子类构造方法, a: " + a);
  29. a = 20;
  30. }
  31.  
  32. protected void step() {
  33. System.out.println("child s: " + s + ", a: " + a);
  34. }
  35. }
  1. package com.xc.xcspringboot.chapter4.chapter4_3_1;
  2.  
  3. /**
  4. * Created by xc on 2019/10/6
  5. */
  6. public class Chapter4_3_1 {
  7. public static void main(String[] args) {
  8. System.out.println("---- new Child()");
  9. Child c = new Child();
  10. System.out.println("\n---- c.action()");
  11. c.action();
  12. Base b = c;
  13. System.out.println("\n---- b.action()");
  14. b.action();
  15. System.out.println("\n---- b.s: " + b.s);
  16. System.out.println("\n---- c.s: " + c.s);
  17. }
  18. }
  1. ---- new Child()
  2. 基类静态代码块, s: 0
  3. 子类静态代码块, s: 0
  4. 基类实例代码块, a: 0
  5. 基类构造方法, a: 1
  6. 子类实例代码块, a: 0
  7. 子类构造方法, a: 10
  8.  
  9. ---- c.action()
  10. start
  11. child s: 10, a: 20
  12. end
  13.  
  14. ---- b.action()
  15. start
  16. child s: 10, a: 20
  17. end
  18.  
  19. ---- b.s: 1
  20.  
  21. ---- c.s: 10

java继承实现的基本原理的更多相关文章

  1. Java编程的逻辑 (17) - 继承实现的基本原理

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  2. 关于java继承的哪些事

    引言 本文结合一个例子来说明继承实现的基本原理. 基类Base代码如下所示: public class Base { public static int s; private int a; stati ...

  3. Java继承与组合

    Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...

  4. JAVA继承时构造函数的问题

    今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...

  5. Java继承和接口

    接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...

  6. Java继承的初始化

    /** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...

  7. Java—继承、封装、抽象、多态

    类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...

  8. java继承关系中成员变量,构造方法,成员方法的关系

    Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...

  9. JAVA继承时this和super关键字

    JAVA继承时this和super关键字 本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数. 在子类中指定this关键字.首先在本类中查找,如果本类中找不到,再在父 ...

随机推荐

  1. xadmin引入drf-yasg生成Swagger API文档

    一.安装drf-yasg: 由于django-rest-swagger已经废弃了 所以引入了drf-yasg pip install drf-yasg 安装install drf-yasg库 http ...

  2. SQL注入中的WAF绕过

    1.大小写绕过 这个大家都很熟悉,对于一些太垃圾的WAF效果显著,比如拦截了union,那就使用Union UnIoN等等绕过. 2.简单编码绕过 比如WAF检测关键字,那么我们让他检测不到就可以了. ...

  3. python中的特殊注释#todo与#type

    0904自我总结 python中的特殊注释 一.#TODO 这个注释用来快熟找到内容 #todo这里的todo不用区分大小写 写法标记的位置,#todo 备注内容 二.#type a = 1 #typ ...

  4. 项目Beta冲刺(团队) —— 凡事预则立

    1.讨论组长是否重选的议题和结论 讨论: 我们采取匿名群投票的方式进行 投票结果如下: 成员共7人 投票7人 投票率100% 结果有效 结论: 不需要重选组长 2.下一阶段需要改进完善的功能 完善游戏 ...

  5. HDU6625: three arrays (字典树处理xor)

    题意:给出A数组,B数组,你可以对A和B分别进行重排列,使得C[i]=A[i]^B[i]的字典序最小. 思路:对于这类题,显然需要建立字典树,然后某种形式取分治,或者贪心.  假设现在有了两颗字典树A ...

  6. windows命令查看端口占用情况

    打开cmd 查看端口占用情况:netstat -aon 查看PID对应的进程:tasklist /FI "PID eq 16948"

  7. 16、Python面向对象进阶

    一.对象的继承 Python中支持一个类同时继承多个父类 class Parent1: pass class Parent2: pass class Sub1(Parent1, Parent2): p ...

  8. 前端性能----TCP协议

    TCP属于OSI七层模型中的传输层协议,位于网络边缘,提供端到端的可靠数据传输,其有着承上启下的作用,协议数据单元为报文段(Message Segment). TCP需要提供以下功能: 分组和复用 应 ...

  9. 【CF765F】Souvenirs

    [CF765F]Souvenirs 题面 洛谷 题解 我们可以发现,对于某个右端点\(i\),左端点\(j\)在由\(i\rightarrow 1\)的过程中,每一段的答案是单调不增的,由这个性质,我 ...

  10. 洛谷2320 bzoj1192 鬼谷子的钱袋

    题目链接 题意概述:把正整数n分为m个正整数,m个正整数中不允许出现复数个非1的正整数,保证所有小于n的正整数都可以用一部分正整数的和表示,并且使m尽量小. 这道题不知道为啥bzoj上没有要求输出方案 ...