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

【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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改表格字体颜色_word排版应用:如何创建文本样式和表格样式

样式,大家应该不陌生,在Word中是一个非常强大的功能,运用得好,可以节省很多时间和精力。但如果你不会用,关键时刻可以把你急哭了!在前面的“Word样式,简单又实用!”和“Word样式也有…

java流式传输对象_Java性能:面向教学与流式传输

java流式传输对象在for循环中向上或向下计数是最有效的迭代方式吗? 有时答案既不可行。 阅读这篇文章,了解不同迭代品种的影响。 迭代性能 关于如何以高性能进行迭代有很多观点。 Java中的传统迭代方式是一个for循环,该循环从零开始&#xf…

vue框架项目部署到服务器_在浏览器中在线尝试无服务器框架项目!

vue框架项目部署到服务器无服务器框架是无服务器工具的一致领导者。 但是,没有简单的方法可以在线试用无服务器框架项目。 您确实需要一个体面的开发人员设置,并且需要一些工作来设置sls , npm等。 确切地说,您确实做到了 –直到…

用python连接数据库_用Python连接MySQL

MySQL是当下最流行的关系型数据库管理系统之一,在用Python爬取网络数据的过程中也经常需要用到MySQL,Python中pymysql库提供了连接MySQL的接口,为Python连接和操作MySQL提供了便利.一,安装pymysql库直接使用pip工具进行安装:pip install pymysql二,连接mysql首先导入第三方库,然…

树的预备知识

【0】README 0.1) 本文总结于 数据结构与算法分析,旨在整理出 树的相关术语和概念(哥子始终记不住树的高度和深度,记着记着就混淆了,哎,所以分享出来); 【1】树相关 1.1&#xff…

arduino蓝牙通讯代码_蓝牙4.0模块 无线数据传输模块 无线蓝牙串口 Arduino

产品介绍:蓝牙4.0模块是专为智能无线数据传输而打造的。该模块遵循BT2.1EDR/3.0/4.0(BLE)蓝牙规范,支持SPP 蓝牙串口协议等。本模块集成了MCU 和蓝牙芯片,支持UART、SPI、I2C、I2S 等接口,包含4 个PWM 端口和6 个12bit ADC 通道&a…

后台审核管理 ergo_Kogito,ergo规则—第2部分:规则的全面执行模型

后台审核管理 ergo这是第二后 一系列更新的Kogito主动性和我们的努力,使Drools的云。 在本文中,我们将深入研究规则单元的详细信息,并向您展示为什么我们对它们感到兴奋。 规则的全包执行模型 如果您一直在仔细检查Drools手册,以…

不相交集ADT(联机算法 + 脱机算法)

【0】README 0.1)本文总结于 数据结构与算法分析, 旨在分享 不相交集ADT的相关概念; 0.2) 不相交集ADT 的知识涉及到: 等价关系、动态等价关系、不相交集ADT相关操作及其数据结构 ,还有我们最后分享的 不…

win7无法连接打印机拒绝访问_Win7系统”windows无法连接到打印机拒绝访问“怎么办?通过创建local port端口连接来搞定...

随着电脑的使用率越来越高,我们有时候可能会遇到Win7系统”windows无法连接到打印机拒绝访问“的问题,要怎么处理呢?详细解决方法如下:故障现象:按照XP的方式添加打印机,总是会出现“windows无法连接到打印…

spring boot测试_测试Spring Boot有条件的合理方式

spring boot测试如果您或多或少有经验的Spring Boot用户,那么很幸运,在某些时候您可能需要遇到必须有条件地注入特定bean或配置的情况 。 它的机制是很好理解的 ,但有时这样的测试条件下(以及它们的组合)可能会导致混乱…

不相交集的求并算法(按集合大小求并+按高度求并)

【0】README 0.1)本文总结于 数据结构与算法分析, 但源代码均为原创,旨在实现 不相交集ADT的两个操作:合并集合union查找集合find; 0.2) 不相交集ADT 的 Introduction , 参见 http://blog.csd…

及时复盘的好处_该如何复盘 先来说说复盘的好处: 复盘的好处简直太多了!就像你学习一样有一个总结的过程,复盘的最直接好处就是增强你的“股感”!在股市... - 雪球...

来源:雪球App,作者: 孜孜金融,(https://xueqiu.com/3493013654/135651359)先来说说复盘的好处:复盘的好处简直太多了!就像你学习一样有一个总结的过程,复盘的最直接好处就是增强你的“股感”&am…

posman mocks_使用Mocks进行需求驱动的软件开发

posman mocksjmock作者撰写的有关模拟框架的优秀论文 。 本文写于18年前的2004年,但其中有许多构建可维护软件系统的技巧。 在这篇文章中,我将重点介绍本文中的关键思想,但建议您阅读本文以获取有关模拟和编程实践的重要思想。 模拟对象是测…

不相交集合求并的路径压缩

【0】README 0.1)本文总结于 数据结构与算法分析, 源代码均为原创, 旨在实现 对不相交集合的路径压缩操作; 0.2)对求并后的集合进行路径压缩,目的是降低集合(合并树)的深度&#x…

python 动态加载与静态加载_python中的元类、静态方法、类方法,动态添加方法...

首先介绍几个概念:1、#所谓的静态方法就是这个方法任何类都可以调用,程序一加载就存在的方法2、所谓的类方法就是这个类一加载就存在的方法,不用实例化这个类就已经存在的方法3、所谓的元类就是创建类的类元类: type我们知道对象是…

flutter调用api_如何在Flutter(REST API)中进行API调用

flutter调用api在本文中,我们将看一下如何快速进行API调用并使用简单的REST API。 在这里查看我在Flutter上的其他一些帖子: Flutter vs React Native 了解Flutter中的BLoC架构 (强烈建议) 在Flutter中构建ListView&#xff0…

java重载与重写的区别+重写父类equals方法的完美实现

【0】README 0.1) 本文章节【1】和【2】的内容转自 http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html ; 旨在区分重载与重写以及他们的相关概念; 0.2) 本文章节【3】的内容转自 http://blog.csdn.net/pacoson…

checkpoint_通过Main的Checkpoint Restore加快Java启动速度

checkpointJava虚拟机为已编译为字节码 (但不一定是用Java编写)的应用程序提供了托管运行时环境。 与为特定平台静态编译的代码相比,这为应用程序开发人员提供了许多好处,并且通常可以提高性能。 JVM通过垃圾回收器 (G…

泛型数组列表ArrayList

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理清 java 中的 数组列表 ArrayList; 【2】数组列表 ArrayList 2.1)ArrayList: ArrayList 具有自动调节数组容量的功能, 而不需要为此…

大数据聚类分析用于预测_多模态数据中的非负矩阵分解用于分割和标签预测

引用Akata Z, Thurau C, Bauckhage C. Non-negative matrix factorization in multimodality data for segmentation and label prediction[C]. 2011.摘要随着 Internet 上带注释的多媒体数据的可用性不断提高,要求有一种技术可以实现不同类型数据的原则性联合处理。…