Почему мы можем уменьшить видимость свойства в расширенном классе?

У меня есть два класса, 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, но это не дает ошибки.

Ответы

Ответ 1

Это потому, что Parent.a и Child.a - разные вещи. Child#method() @Override Parent#method(), поскольку они являются методами. Наследование не применяется к полям.

Из Oracle JavaTM Tutorials - Inheritance было написано, что:

Что вы можете сделать в подклассе

  • Унаследованные поля могут использоваться напрямую, как и любые другие поля.
  • Вы можете объявить поле в подклассе с тем же именем, что и в суперклассе, тем самым скрывая его (не рекомендуется).
  • Вы можете объявить новые поля в подклассе, которые не находятся в суперклассе.

Ответ 2

Вы не можете. Вы не уменьшаете видимость a - вы создаете новое отдельное поле, которое также называется a.

Ответ 3

Фактически вы создаете приватную переменную для Child. Итак, у ребенка есть две, одна частная и одна публика. В приведенном ниже коде показано, как получить доступ к обоим. Методы предназначены для всего класса (родительского) и его подклассов. Следовательно, вы получаете ошибку для метода.

Попробуйте этот код, чтобы увидеть два 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

    }

}