Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Super关键字访问超类成员

使用Super关键字访问超类成员
EN

Software Engineering用户
提问于 2015-11-30 19:24:27
回答 3查看 47.7K关注 0票数 0

关于java中的超级关键字,我有以下问题:

下面有一个课程代码:

  • 扩展类不包含整数变量i。
  • B扩展A类包含整数变量I
  • C扩展类B包含整数变量I类A{ int I= 20;A() {System.out.println(“我在父类的构造函数中”);}}类B扩展A{ int i= 30;B() { System.out.println("I在子类构造函数中“);}}类C扩展B{ int i= 40;C() { System.out.println("I在主类的构造函数中“);} void (){ System.out.println(i);System.out.println(super.i);/* *我第一个想法是访问‘A’类间接继承的第三个变量'i‘*。*我以为它会印20张:System.out.println(super.super.i);*/ }公共静态void (String[] obj2 ){C obj2=新C();obj2 2显示();}
    1. 现在,由于类B继承了类A,所以它必须有两个整数变量i。类C继承类B,因此它将有两个来自B的整数变量,一个本身定义。

现在,我可以通过显示方法在类i中打印继承的超类变量C,当然还可以打印在类C本身中定义的变量。问题是如何打印值为"20“的第三个i

我知道我可以在类B中定义一个返回Super.i的方法,并通过它在A类中的对象调用它,该对象将打印第三个变量i,我也知道我可以创建一个A类的对象,但是使用Super或任何其他东西直接访问类C中的第三个变量,还有其他方法吗?

此外,产出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      I am in constructor of the parent class
      I am in constructor of the subclass
      I am in constructor of the main class
      40
      30
  1. 为什么像这个关键字一样,超级关键字不能在静态方法中使用?
  2. 为什么调用超类构造函数来初始化子类的继承变量?这没有任何意义,因为如果一个类扩展了另一个类,那么变量和方法就会像在类中本地声明的那样,换句话说,是它自己的成员。那么,为什么子类的构造函数不能初始化这些继承的成员,并且必须调用超类构造函数来初始化它们。
EN

回答 3

Software Engineering用户

回答已采纳

发布于 2015-12-01 07:14:48

除上述所有情况外,还应考虑以下情况:

  • 你从这两门课开始。类A{ int i= 20;A() {System.out.println(“我在父类的构造函数中”);}}类B扩展A{ int i= 30;B() { System.out.println("I在子类构造函数中“);}}
  • 编译这两个类,它会创建两个类文件:A.classB.class
  • 现在您改变主意,重写A:类A{ int = 10;A() {System.out.println(“我在父类的构造函数中”);}
  • 你重新编译A,所以你得到一个新的A.class,它用旧的A.class替换

现在的问题是:B怎么知道A**s的初始化代码已经改变了?**你没有重新编译B,也不应该被要求这么做。毕竟,B可能已经打包在一个不同的罐子中,甚至在您无法控制的不同产品中。

支持这种情况的唯一合理方法是,Bs的构造函数从调用As构造函数开始,让A初始化自己。

*一开始这听起来可能有些牵强,但当JDK类的内部实现细节发生变化时,情况正是如此。世界上所有以前编译的Java应用程序都应该与新的JDK无缝地运行。

票数 3
EN

Software Engineering用户

发布于 2015-11-30 19:52:43

在JLS 第15.11款中详细说明了其中的大部分内容:

15.11.2使用super 访问超类成员表单super.Identifier引用当前对象的名为标识符的字段,但将当前对象视为当前类超类的实例。

这里的关键词是当前对象的关键字。如果没有当前对象(例如静态方法的情况),则无法使用超级方法。

当涉及构造函数时,超类负责初始化它的字段。这是必要的,因为子类中可能有子类无法访问的私有字段。

此外,要求子类实例化超类的状态可能要求子类拥有比所需的更多的信息,还需要超类和子类之间的更紧密耦合--对超类中字段的任何更改都需要在所有子类中进行更改。这是件坏事。

因此,通过让子类在创建超类时调用超类的构造函数,可以防止这种糟糕的事情发生。

票数 4
EN

Software Engineering用户

发布于 2015-12-01 04:27:41

您的代码不完整-以下是Java为您添加的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A extends Object { /* <-- Added */ 
    int i = 20;
    A() {
        super(); /* <-- Added */ 
        System.out.println("I am in constructor of the parent class");
    }
}

你的其他课程也是这样。

所有类都扩展了其他类,即使它是“只是”对象。

"super“指当前实例的超类,但是静态方法没有实例;它们只是”附加“到类的代码块,但不引用实例本身中的任何数据。如果这是一个.Net问题,我会向您指出String类上的Split()和Join()方法;实例 Split方法分解了String对象中的当前值,但是静态连接方法使用分隔符和数组值作为参数,并将它们放在一起。

构造者在他们的行动中本质上是私人的。他们的工作是让对象本身做好工作准备,而不引用它的超类或任何子类(它根本不应该知道这些子类)。实例化在超类“链”上一直运行,一直到对象,并在“后退”的过程中对每个类执行构造函数。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/303965

复制
相关文章
PostgreSQL排序字段不唯一导致分页查询结果出现重复数据
pg单字段排序,排序字段中可能会出现重复,这样就会导致我们在进行分页查询时会出现一些和预期不相符的现象,如这个数据在第一页出现了,然后再第二页又出现。
翎野君
2023/09/25
6710
[包子分享]REST API Best practices: Where to put parameters?
在上一篇博客中,包子为您解说了REST设计风格的理论概念,相信有很多同学读完以后会有很多实际的问题需要进一步探讨。在这里,包子为大家转载了一个比较热门的最佳设计实践问题:如何设计REST风格的URI?从上篇文章里,我们知道URI是HTTP实现下的REST资源ID。URI一般包含了指向资源的路径,以及参数来指定请求获取的特定资源状态。那么到底什么应该是属于URI路径的一部分,而什么又该放入URI呢?这是一个值得大家思考的设计实践。 原文链接:http://stackoverflow.com/questions
包子面试培训
2018/04/20
7590
Vue 3 选项 API
其实我们经常使用到组件里面的数据,而这些数据是定义在 data 对象函数里面的,为什么要实现定义在 data 对象函数里面呢?在 data 对象函数中的数据,Vue 会对其进行响应式劫持,代理,使他们具有一修改就会相应地更新到页面上,也就是说这些数据是被监测着的。
公众号---人生代码
2020/11/26
2.7K0
python开发_tkinter_菜单的不同选项
E | hongtenzone@foxmail.com  B | http://www.cnblogs.com/hongten
Hongten
2018/09/13
8790
python开发_tkinter_菜单的不同选项
$_PUT?put数据获取
我们经常使用$_GET和$_POST来进行服务器交互,但是我们有的时候不得不被逼使用$_PUT方法获取数据 当然,php中是没有$_PUT的,但是我们可以使用 $_SERVER[‘REQUEST_METHOD’]来判断,因为我们这个服务器变量会是PUT 这样我们十一哦那个parse_str就可以分割开put的变量 put.php页面代码 $_PUT = array(); if (‘PUT’ == $_SERVER[‘REQUEST_METHOD’]) { parse_str(file_get_c
苦咖啡
2018/05/08
2.3K0
使用作者代码重复结果
第三单元第十二+十三讲:使用作者代码重复结果 课程链接在:http://jm.grazy.cn/index/mulitcourse/detail.html?cid=53 这一篇会是代码密集型,因为原文
生信技能树jimmy
2020/03/30
1.8K0
树和森林:深度学习不是唯一的选择
基于树的学习算法是十分流行且应用广泛的一类非参数化的有监督学习算法,这些算法既可用于分类又可用于回归。基于树的学习算法的基础是包含一系列决策规则(例如,“如果他们是男性……”)的决策树。这些决策规则看起来很像一棵倒置的树,第一个决策规则在顶部,随后的决策规则在其下面展开。在决策树中,每个决策规则产生一个决策节点,并创建通向新节点的分支。终点处没有决策规则的分支被称为叶子节点(leaf)。
用户1682855
2019/08/30
1.1K0
树和森林:深度学习不是唯一的选择
MYSQL IN EXISTS LEFT JOIN 结果不同的问题?
随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS 等,期待你的加入,加群请添加微信liuaustin3.
AustinDatabases
2023/02/28
1.8K0
MYSQL IN EXISTS LEFT JOIN 结果不同的问题?
MySQL | 如何去除结果集中的重复记录
数据操作语言:去除重复记录 结果集中的重复记录 假如我们要查询员工表有多少种职业,写出来的 SQL 语句如下: 去除重复记录 如果我们需要去除重复的数据,可以使用 DISTINCT 关键字来实现 SELECT DISTINCT 字段 FROM ......; SELECT job FROM t_emp; SELECT DISTINCT job FROM t_emp; 注意事项 使用 DISTINCT 的 SELECT 子句中只能查询一列数据,如果查询多列,去除重复记录就会失效。 DISTIN
Zkeq
2022/05/18
2.8K0
MySQL | 如何去除结果集中的重复记录
jenkins python api与json api不同
查看jenkins的python api与json api,感觉两者相差不多,但还是有所区别,所以用BeyondCompare进行对比分析。
donghui
2019/04/19
7930
jenkins python api与json api不同
MySQL使用distinct去掉查询结果重复的记录
使用 DISTINCT 关键字去掉重复记录具有较大的局限性。DISTINCT() 只能包含一个字段且查询结果也只返回该字段而非数据完整记录(如上例所示)。
用户7657330
2020/08/14
7.5K0
前端系列12集-全局API,组合式API,选项式API的使用
The setup() hook serves as the entry point for Composition API usage in components in the following cases: 在以下情况下, setup() 钩子用作组件中 Composition API 使用的入口点:
达达前端
2023/10/08
5270
一人企业:增长不是唯一的商业路径
我之前在互联网公司工作时,有一个让我困惑和痛苦的事情,就是“增长”是公司的头等要事,哪怕一开始是对用户有益的事情,增长到了一定阶段后,几乎必定会变成为了增长而增长,越来越远离初心,让人身心俱疲。
朱峰
2022/06/15
2950
注意:雪花算法并不是ID的唯一选择!
秋天,树上掉下两片叶子,你要和它们说再见。但你如何知道这片叶子,不是另外一片叶子?是通过它的形状,还是通过它的重量?
xjjdog
2022/09/26
2.4K0
让IIS支持.NET Web Api PUT和DELETE请求
    有很长一段时间没有使用过IIS来托管应用了,今天用IIS来托管一个比较老的.NET Fx4.6的项目。发布到线上后居然一直调用不同本地却一直是正常的,关键是POST和GET请求都是正常的,只有PUT和DELETE请求是有问题的。经过一番思考忽然想起来了IIS默认情况下拒绝处理PUT和DELETE请求,要支持这两种请求的话需要做一些配置。
追逐时光者
2023/07/09
5870
让IIS支持.NET Web Api PUT和DELETE请求
为什么PERMANOVA和ANOSIM结果不同?
https://www.researchgate.net/post/Why_do_I_obtain_different_results_using_PERMANOVA_or_ANOSIM
Listenlii-生物信息知识分享
2021/07/30
3.3K0
EasyGBS云端录像查询结果跟实际的查询结果不同调整方法
近期我们一直在对EasyGBS的云端录像做测试,其中一个重要原因就是广大用户对云端录像的要求不断提高,因此对于云端录像的检查仍然是必不可少的一个环节。在测试过程中,我们就发现在云端录像的查询结果跟想要查询的结果不同。
TSINGSEE青犀视频
2021/08/10
1.5K0
EasyGBS云端录像查询结果跟实际的查询结果不同调整方法
对mysql left join 出现的重复结果去重
简单说明问题出现的原因: MySQL left join 语句格式为: A LEFT JOIN B ON 条件表达式
马哥Python
2019/06/27
18.6K0
win和linux的php异或运算结果不同
作者:matrix 被围观: 3,383 次 发布时间:2015-06-17 分类:兼容并蓄 零零星星 | 3 条评论 »
HHTjim 部落格
2022/09/26
2.6K0
win和linux的php异或运算结果不同
点击加载更多

相似问题

通过Shopify API为PUT请求重定向302

15

Shopify API,406响应Google脚本UrlFetchApp的PUT请求

10

Hibernate SqlResultSetMapping相同的结果重复,而不是唯一的

14

发布到Shopify API,结果为400

11

API平台:连接表的PUT with级联选项

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文