【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在加深对 super 和 this关键字 的用法比较;
0.2) 最后还补充了 多态和动态绑定 的定义 以及对动态绑定进行了详细分析,这两个定义给的非常棒;


【1】super 和 this 的比较:

1.1) 有人认为super 和 this 引用是类似的概念,实际上,这样比较并不太恰当;因为super不是一个对象引用, 不能将super 赋给另一个对象变量,它只是一个编译器调用超类方法的特殊关键字;
1.2)我们再看super在构造器中的应用:

public Manager(String n, double s, int year, int month, int day)
{
super(n, s, year, month, day);
bonus = 0;
}
  • 这里的super含义是: super(n, s, year, month, day) 是“调用超类Employee中含有 n、s、year、month 和 day” 参数的构造器的简写形式;
  • 这是由于: Manager类的构造器不能访问 Employee类 的私有域, 所以必须利用 Employee类的构造器对这部分私有域 进行初始化;

Attention)

  • A1)而且 使用 super调用构造器的语句必须是 子类构造器的第一条语句;
  • A2)如果子类的构造器没有显式地 调用超类的构造器,则将自动地调用超类默认构造器;

Annotation)关键字this + super 有两个用途:

  • A1)this的用途:一是引用隐式参数+二是调用该类其它的构造器;
  • A2)super的用途:一是调用超类 的方法 + 而是调用超类都构造器;

【2】调用构造器

2.1)调用构造器的注意事项 : 调用构造器的语句只能作为 另一个构造器的第一条语句出现, 构造参数既可以传递给本类的其他构造器, 也可以传递给超类的构造器;

2.2)看个荔枝(利用this调用其他构造器):

2.3)Complementary

  • C1)多态: 一个对象变量可以指示多种实际类型的现象 被称为多态;(如上述代码中的 e 即可以指向 Manager类 也可以指向 Employee类)
  • C2)动态绑定:在运行时能够自动地选择调用哪个方法的现象称为动态绑定

【3】 动态绑定

3.1)定义: 在运行时能够自动地选择调用哪个方法的现象称为 动态绑定
如:

Manager boss = new Manager("tangrong", 80000, 1987, 12, 15):
staff[0] = boss;
staff[1] = new Employee("tangtang", 1, 2, 3, 4);
staff[2] = new Employee("rongrong", 4, 3, 2, 1);
for(Employee e: staff)
System.out.println(e.getName() + " " + e.getSalary() );
  • e.getSalary() 调用能够确定应该执行哪个 getSalary 方法, 请注意, 这里虽然将e 声明为 Employee 类型,但实际上 e 既可以引用Employee 类型的对象,也可以引用Manager 类型的对象;

3.2)看一下对象方法的执行过程,调用过程的详细描述(Description):

  • D1)编译器查看对象的声明类型和方法名:例如可能存在方法 f(int) 和 方法 f(String), 编译器将会一一列举所有C类中名为f的方法和其超类中访问属性为public 且名
    为f的方法;
  • D2)编译器将查看调用方法时提供的参数类型:
    重载解析:如果在所有名为f 的方法中存在一个与提供的参数类型完全匹配, 就选择这个方法,这个过程叫做重载解析;
  • D3)如果是private、static、final 方法或者构造器, 那么编译器将可以正确地知道应该调用哪个方法;我们将这种调用方式叫做静态绑定;与此对应的是,调用的方法依赖于隐式参数的实际
    类型,并且在运行时实现动态绑定;
  • D4)当程序运行, 并且采用动态绑定调用方法时, 虚拟机一定调用与x 所引用对象的实际类型最合适的那个类的方法;假设x 的实际类型为D, 它是C类的子类, 如果 D类定义了 方法f(string), 就直接调用它,否则将在D类的超类中寻找f(string), 以此类推;

3.3)方法表:每次调用方法都要进行搜索, 时间开销相当大, 因此虚拟机预先为每个类创建了一个方法表(method table), 其中列出了所有方法的签名和实际调用 的方法;
Annotation)

  • A1)方法签名:方法的名字和参数列表称为方法的签名; 如,f(int) 和 f(String) 是两个具有相同名字、不同签名的方法;如果在子类中定义了一个与超类签名相同的方法,那么子类中的这个方法就覆盖了超类中的这个相同签名的方法;
  • A2)返回类型不是方法签名的一部分:因此,在覆盖方法时, 一定要保证返回类型的兼容性;允许子类将覆盖方法的返回类型定义为原返回类型的子类型;
    如父类有: public Employee getBuddy(){}, 子类可以覆盖它, public Manager getBuddy(){} ;我们说,这两个 getBuddy 方法具有 可协变的返回类型

3.4)在运行的时候, 调用 e.getSalary() 的解析过程(Procedure):

  • P1)首先,虚拟机提取e 的实际类型的方法表: 既可能是Employee、Manager的方法表,也可能是 Employee 类的其他子类的方法表;
  • P2)接下来, 虚拟机搜索定义 getSalary 签名的类, 此时,虚拟机已经知道应该调用哪个方法;
  • P3)最后,虚拟机调用方法;

3.5)动态绑定有一个重要的特性:无需对现在的代码进行修改, 就可以对程序进行扩展。
Alert)在覆盖一个方法的时候, 子类方法不能低于超类方法的可见性;特别是, 如果超类方法是public, 子类方法一定要声明为public;

super 和 this 关键字的比较+调用构造器(this)+动态绑定相关推荐

  1. 【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 / 接口 方法 super )

    文章目录 I . 子类调用父类总结 II . 子类调用父类方法 ( super ) III . 子类内部类调用父类方法 ( super@ ) IV . 子类选择调用不同的 父类 / 接口方法 ( su ...

  2. 继承,方法重写,super,final关键字

    继承 *     子承父业  *   * 为什么要继承:  *     为了提高代码的服用性  * 如何使用继承:  *     子类  extends 父类  使用继承  *   * 注意:  * ...

  3. Java的this、super和final关键字

    this:(this表示当前对象) 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 在类的方法定义中使用this关键字代表使用该方法的对象的引用 当必 ...

  4. Java学习(静态static关键字,数组工具类Arrays,数学相关工具类(绝对值,向上取整,向下取整),继承,super和this关键字,抽象)

    2022/1/2 (1/6)Java学习 1.静态Static关键字概述 一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所以凡是本类的对象,都共享同一份. 2.静态stat ...

  5. Java黑皮书课后题第7章:7.16(执行时间)编写程序,随机产生一个包含100 000个整数的数组和一个关键字。估算调用程序清单7-6中的linearSearch方法的执行时间

    7.16(执行时间)编写程序,随机产生一个包含100 000个整数的数组和一个关键字.估算调用程序清单7-6中的linearSearch方法的执行时间 题目 题目描述 程序清单7-6的linearSe ...

  6. 使用反射调用构造器创建对象

    构造器最大的作用:创建对象. 为什么使用反射创建对象,为什么不直接来new呢? 在框架中,提供给我们的都是字符串. ------------------------------------------ ...

  7. Java 调用构造器一定产生新对象吗

    搞Java开发三年多了,工作换了几份.目前又到了一个多事之秋,估计马上又要换工作了.目前有点闲,写写技术博客. 言归正传,最近对一个问题有点疑惑,就是调用构造器会不会一定产生新对象,如果一定会,那么一 ...

  8. Java笔记013-IDEA、包、访问修饰符、封装、继承、多态、Super、方法重写/覆盖(override)、java的动态绑定机制

    目录 面向对象编程(中级部分) IDE(集成开发环境)-IDEA IDEA介绍 IDE(集成开发环境)-Eclipse Eclipse介绍 IDEA的安装 IDEA的基本介绍和使用 创建一个java项 ...

  9. super和this关键字详解

    super关键字: ① java中提供了访问父类的成员变量,成员方法的关键字super super.成员变量 super.成员方法([参数1,参数2***]) ② super关键字调用父类的构造方法 ...

最新文章

  1. 是男人就过8题!楼教主出题,请接招!
  2. ASP.NET简化编辑界面 V3
  3. Nginx 为什么快到根本停不下来?
  4. C#之 VS2008 之 Extension Methods
  5. git pull 报错:The following untracked working tree files would be overwritten by merge
  6. 要闻君说:微软拿下五角大楼超大云服务订单!恒大玩儿起了充电桩and新能源汽车?苹果公司要放弃自动驾驶业务?...
  7. A - 饭卡(动态规划 01背包)
  8. hfss matlab api,HFSS-Matlab-API实践体会与HFSS Scripting快速入门
  9. c语言教材课后习题答案,C语言课后习题答案(最终).doc
  10. 小程序框架kbone与Hybird混合开发
  11. 图片右侧加文字html完整代码,怎么用css在图片右下方添加文字
  12. 矩阵乘法实现卷积运算
  13. 液晶拼接处理器_你想了解的LCE拼接屏幕都在这里
  14. iOS游戏开始者从零开始:6个月的学习编程经历
  15. 侧脸生成正脸概论与精析(一)Global and Local Perception GAN
  16. 【每日一读】Pro-GNN:Graph Structure Learning for Robust Graph Neural Networks
  17. Ubuntu 18.04 LTS 桌面版 WPS 安装字体
  18. weblogic11g 后台无需密码启动设置
  19. 关系数据理论(回顾关系模式、数据依赖、不规范的关系模式存在的问题、 函数依赖、非平凡函数依赖/平凡函数依赖、完全函数依赖/部分函数依赖定义、传递函数依赖,码)
  20. stm32f103系列开发板控制对数码管来显示自定义时间(自主学习)

热门文章

  1. 牛客练习赛75 D 减数游戏(队列优化(需要取模的)堆)
  2. Strange Memory Gym - 102832F
  3. 牛客题霸 [ 求二叉树的层序遍历] C++题解/答案
  4. hdu5909-Tree Cutting【FWT】
  5. YbtOJ#20063-[NOIP2020模拟赛B组Day4]古老谜题【统计】
  6. AT4352-[ARC101C] Ribbons on Tree【dp,容斥】
  7. 背包例题【dp练习】
  8. 行列式、LGV、矩阵树学习笔记
  9. 2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love counting(Trie树)
  10. [XSY] 智慧树(线性同余方程组,线段树/树状数组)