为什么我们可以降低扩展类中属性的可见性?

时间:2014-07-13 05:37:28

标签: java inheritance field visibility

我有两个班级,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的可见度,但它不会出错。

3 个答案:

答案 0 :(得分:24)

这是因为Parent.aChild.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

    }

}