为什么我们可以降低扩展类中属性的可见性?
我有两个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.a
和Child.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 } }