Почему мы можем уменьшить видимость свойства в расширенном классе?
У меня есть два класса, 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
}
}