我有两个班级,Parent
:
public class Parent {
public String a = "asd";
public void method() {
}
}
Child
:
public class Child extends Parent{
private String a = "12";
private void method() {
}
}
在Child
中,我尝试覆盖父method
,它会产生cannot reduce visibility of a method
的编译时错误,这很好。
但是,为什么此错误不适用于属性a
?我也在降低a
的可见度,但它不会出错。
答案 0 :(得分:24)
这是因为Parent.a
和Child.a
是不同的事情。 Child#method()
@Override
s Parent#method()
,因为它们是方法。继承不适用于字段。
从Oracle JavaTM Tutorials - Inheritance开始写道:
您可以在子类中执行的操作
- 可以直接使用继承的字段,就像任何其他字段一样。
- 您可以在子类中声明一个与超类中的字段同名的字段,从而将其隐藏(不推荐)。
- 您可以在子类中声明不在超类中的新字段。
答案 1 :(得分:11)
你不能。您没有降低a
的可见度 - 您正在创建一个新的单独字段,也称为a
。
答案 2 :(得分:4)
您实际上正在为Child创建一个私有变量。所以,儿童有两个,一个私人和一个公共。下面的代码显示了如何访问这两个。这些方法适用于整个类(Parent)及其子类。因此,您得到该方法的错误。
尝试使用此代码查看两个a:
public class Child extends Parent{
private String a = "12";
//private void method() {}
public static void main(String[]args){
Child c = new Child();
Parent p = c;
System.out.println(c.a + ", " + p.a);//12, asd
}
}