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

我有两个class, 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 ,该method给出编译时错误, cannot reduce visibility of a method这很好。

但是,为什么这个错误不适用于财产a ? 我也降低了a可见性,但它没有给出错误。

这是因为Parent.aChild.a是不同的东西。 Child#method() @Override s Parent#method() ,因为它们是方法。 inheritance不适用于字段。

从Oracle JavaTM教程 – inheritance ,它被写成:

您可以在子类中执行的操作

  • inheritance的字段可以直接使用,就像任何其他字段一样。
  • 您可以在子类中声明一个与超类中的字段同名的字段,从而隐藏它(不推荐)。
  • 您可以在子类中声明不在超类中的新字段。

你不能。 你没有降低a的可见性 – 你正在创建一个新的,单独的字段,也称为a

您实际上正在为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(ca + ", " + pa);//12, asd } }