在子类中使用 super 或 this 访问超类中的属性?

Pho*_*nix 2 java inheritance

就超类中定义的属性值而言,在子类中使用相同的属性并且该属性被定义为受保护,那么使用superthis没有任何区别,对吧?那么为什么语言确实有这些访问属性的方式呢?是否存在他们会有不同价值观的情况?

class A {
    protected int a = 15; 
}
        
class B extends A { 
    public void printA() {
        System.out.print(super.a) // prints 15
        System.out.print(this.a) // prints 15
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

这种情况下,这没有任何区别。然而,一旦您更改为方法而不是变量,并引入另一种方法来B隐藏 中的方法A那么就会产生不同:

class A { 
    protected int a = 15; 
}

class B extends A { 
    private int a = 10;

    public void printA() {
       System.out.println(super.a); // prints 15
       System.out.println(this.a); // prints 10
    }
}
Run Code Online (Sandbox Code Playgroud)

不过,这在方法中比在字段中更常见 - 通常重写实现需要调用超类实现作为其实现的一部分:

public void foo() {
    super.foo();
    // Now do something else
}
Run Code Online (Sandbox Code Playgroud)

我个人建议避免非私有字段,此时字段部分变得无关紧要。

有关阴影的更多信息,请参阅JLS 第 6.4.1 节。