就超类中定义的属性值而言,在子类中使用相同的属性并且该属性被定义为受保护,那么使用super
或this
没有任何区别,对吧?那么为什么语言确实有这些访问属性的方式呢?是否存在他们会有不同价值观的情况?
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)
在这种情况下,这没有任何区别。然而,一旦您更改为方法而不是变量,并引入另一种方法来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 节。