对于在超类中定义的属性的值,在子类中使用相同的属性并且属性被定义为protected,那么使用super或者这没有任何区别对吗? 那么为什么语言真的有这些访问属性的方式?是否存在具有不同值的方案。
class A{ protected int a = 15;
}
class B{
public void printA()
{
System.out.print(super.a) // prints 15
System.out.print(this.a) // prints 15
}
}
答案 0 :(得分:4)
在此情况下,它没有任何区别。但是,只要您更改为方法而不是变量,并在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
}
}
这种方法比使用字段更常见 - 通常,重写实现需要将超类实现作为其实现的一部分来调用:
public void foo() {
super.foo();
// Now do something else
}
我个人建议避免非私人字段,此时字段部分变得无关紧要。
有关遮蔽的更多信息,请参阅section 6.4.1 of the JLS。