java - 访问父类字段“this.field”VS“super.field”
问题描述
我想知道使用this
和访问父类字段之间的区别super
。
我们有以下名为 ListItem 的抽象类,它扩展了 Node 类。
public abstract class ListItem {
protected ListItem rightLink=null;
abstract ListItem next();
}
以及 Node 类中的以下代码:
public class Node extends ListItem {
@Override
ListItem next() {
return this.rightLink;
}
但是如果我们使用代码 super.rightLink,我不会在编译时或运行时收到任何错误。我只想知道两者之间有什么区别,是否有完成任务的最佳实践?
解决方案
解释
在这种情况下没关系,没有区别。
该字段在父类中声明。所以从技术super.rightLink
上讲是最有意义的。但是,super
仅this
与解决具有可变阴影的模棱两可的情况有关。
在这种情况下,最好的办法是省略任何前缀,只需键入rightLink
. 但这有点基于意见。
例子
假设我们有以下
public class Parent {
int variable = 1; // Field
}
public class Child extends Parent {
int variable = 2; // Field
public void foo() {
int variable = 3; // Local variable
System.out.println(variable); // 3
System.out.println(this.variable); // 2
System.out.println(super.variable); // 1
}
}
深入
因此,我们遇到了 3 个不同变量的情况,它们都位于不同的范围内,但它们具有相同的名称。当您键入variable
时,Java 将引用具有最低范围的变量。这将是方法中的局部变量。如果你想访问你的领域,你需要做this.variable
. 如果要访问父级的字段,则需要执行super.variable
.
同样,我们在这里有三个不同的变量。
- 无前缀:最低范围
this
: 范围最小的字段super
: 范围最小的字段,从直接父级开始
但是,在您的具体示例中,我们根本没有名称阴影。只有一个名为 的变量rightLink
。因此,所有三个变体都指的是完全相同的变量。
在这种情况下,最好的办法是完全不使用前缀,只使用rightLink
.
捷豹路虎
让我们看看 Java 语言规范是如何定义this.
和super.
.
对于this.
,请参阅JLS§15.8.3:
当用作主要表达式时,关键字
this
表示一个值,该值是对为其调用实例方法或默认方法(第 15.12 节)的对象或正在构造的对象的引用。在 lambda 主体中由 this 表示的值与在周围上下文中由 this 表示的值相同。
对于super.
,请参阅JLS§15.11.2:
表单
super.Identifier
引用Identifier
当前对象命名的字段,但当前对象被视为当前类的超类的一个实例。
推荐阅读
- clickatell - Clickatell - Whatsapp 集成
- angular - 将纯文本从 Web 服务返回到 Angular Typescript
- java - 如何动态调整 List 类型变量的输入?
- javascript - 使用 javascript 和 ajax 读取 json 对象由于 CORS 策略而出现错误
- reactjs - React Native 应用程序使用 EXPO 从 API 下载文件,并获取每个文件的链接
- sqlite - 在 Delphi/FireDAC 中加载 SQLite 扩展
- php - 为什么这个 php 脚本总是返回“True” html/php
- webots - 如何通过代码设置传感器噪声/分辨率?
- arrays - Swift For Tensorflow 中的极坐标图和饼图
- firebase - 将请求转发到 Cloud Functions 时,Firebase 托管自定义域 404