访问父类字段 "this.field" VS "super.field"



我想知道使用thissuper访问父级字段之间的区别。

我们有以下名为ListItem的抽象类,该类扩展了节点类。

public abstract class ListItem {
        protected ListItem rightLink=null;
        abstract ListItem next();
    }

和节点类中的以下代码:

public class Node extends ListItem {
@Override
    ListItem next() {
        return this.rightLink;
    }

但是,如果我们使用代码super.rightlink,我在编译时或运行时不会遇到任何错误。我只想知道两者之间有什么区别,并且有最佳实践可以完成任务?

说明

在这种情况下,这无关紧要,没有区别。

该字段在父类中声明。因此,从技术上讲,super.rightLink将是最有意义的。但是, superthis仅与解决模棱两可的情况相关。

在这种情况下,最好的是遗漏任何前缀,而只是键入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


JLS

让我们看看Java语言规范如何定义this.super.

对于this.,请参阅JLS§15.8.3:

用作主要表达式时,关键字 this表示一个值引用对象的值,该是调用实例方法或默认方法的值(§15.12),或对对象的。建。在lambda体内表示的价值与在周围环境中所表示的价值相同。

对于super.,请参阅JLS§15.11.2:

表格 super.Identifier是指当前对象的名为 Identifier的字段,但使用当前对象被视为 superclass 的实例当前课程。

除非rightLink标记为私有,否则在ListItem派生的所有类中都可以访问。因此,调用super.rightLingthis.rightLink等效。

通常,super是指基础类,this是指您所在的课程。适当地使用它们。

通常在覆盖方法时使用,即。

@Override
public void DoSomething(){
  // Execute base imlpementation of a method
  super.DoSomething();
  // some additional code to add extra functionality to base class
}

最新更新