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

Bhu*_*van 16 java inheritance visibility field

我有两节课Parent:

public class Parent {
    public String a = "asd";

    public void method() {

    }
}
Run Code Online (Sandbox Code Playgroud)

而且Child:

public class Child extends Parent{
    private String a = "12";

    private void method() {

    }
}
Run Code Online (Sandbox Code Playgroud)

Child,我尝试覆盖父method,它给出了编译时错误,cannot reduce visibility of a method其中没有问题.

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

Uni*_*ron 24

这是因为Parent.a并且Child.a是不同的事情.Child#method() @Overrides Parent#method(),因为它们是方法.继承不适用于字段.

Oracle JavaTM教程 - 继承,它被写成:

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

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


use*_*751 11

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

  • 这种违反Liskov替换原则的不是吗?或者该原则仅适用于方法? (2认同)
  • @WandMaker在使用基类引用时,只能访问基类的字段. (2认同)