Почему переменные экземпляра суперкласса не скрыты в наследовании?Наследование Java - переменные экземпляра overriding
ответ
Поскольку наследование предназначено для изменения поведения. Поведение проявляется через методы, и именно поэтому их можно переопределить.
Поля не являются поведением, а состоянием. Вам не нужно изменять это, а также частные методы, используемые суперклассом. Они предназначены для того, чтобы позволить суперклассу выполнять свою работу.
Вы можете скрыть a поле, но не переопределить it.
Скрытие означает, что поле будет иметь другое значение, в зависимости от того, к какому классу он обращается. Поле в подклассе «скроет» поле в суперклассе, но оба они существуют.
Это очень плохая практика, чтобы скрыть поле, но работает:
public class HideField {
public static class A
{
String name = "a";
public void doIt1() { System.out.println(name); };
public void doIt2() { System.out.println(name); };
}
public static class B extends A
{
String name = "b";
public void doIt2() { System.out.println(name); };
}
public static void main(String[] args)
{
A a = new A();
B b = new B();
a.doIt1(); // print a
b.doIt1(); // print a
a.doIt2(); // print a
b.doIt2(); // print b <-- B.name hides A.name
}
}
В зависимости от того, метод перекрываться, поле в A
или B
доступ.
Никогда не делайте этого! Это никогда не является решением вашей проблемы и создает очень тонкие ошибки, связанные с наследованием.
Потому что:
Это может нарушить
parent class
код. Для примера рассмотрим следующий код (Что бы поведение линииobB.getInt();
в следующем коде, если переменные экземпляра переопределяете разрешено):class A { int aInt; public int getInt() { return aInt; } } class B extends A { int aInt; public int getInt2() { return aInt; } public static void main(String[] args) { B obB = new B(); //What would be behavior in following line if, //instance variables overriding is allowed obB.getInt(); } }
Это не логично потому
child class
должны иметь/отражать все поведение отparent class
.
Таким образом, вы только можете скрыть наследуемые методы/переменные в child class
, но не может override
.
Ниже приводится выдержка из Java doc from Oracle указания какую операцию вы можете выполнить/ожидать от child class
:
Вы можете использовать унаследованные как заменить их, скрывать их, или дополнять их новыми членами :
- Унаследованные поля могут использоваться напрямую, как и любые другие поля.
- Вы можете объявить поле в подклассе с тем же именем, что и в суперклассе, тем самым скрывая его (не рекомендуется).
- 1. наследование - переменные экземпляра
- 2. Наследование переменные экземпляра в Actionscript
- 3. Переменные класса, переменные экземпляра и наследование
- 4. частные переменные статического экземпляра и наследование
- 5. Наследование и переменные Java
- 6. Переменные экземпляра класса Ruby и наследование
- 7. Переменные экземпляра Java
- 8. Переменные экземпляра Java-доступа
- 9. переменные asp.net session overriding
- 10. Наследование в java наследует переменные?
- 11. Переменные экземпляра в Java Memory Model
- 12. Java abstract class "переменные экземпляра"
- 13. Двойные переменные экземпляра в java
- 14. Переменные и наследование класса Python
- 15. Java Статические переменные и наследование и память
- 16. Наследование и частные переменные в Java
- 17. Overriding vs Hiding Java - Confused
- 18. Массивное наследование экземпляра
- 19. Наследование экземпляра PHP
- 20. java overriding не работает
- 21. Метод Java overriding proble
- 22. Java overriding equals, array
- 23. Java overriding static method
- 24. Java Overriding with Inheritance
- 25. Java overriding унаследованная строка
- 26. Java overriding и интерфейсы
- 27. java, overriding и equals
- 28. java Overriding не работает
- 29. Переменные экземпляра экземпляра и переменные экземпляра в Ruby
- 30. Java Интерфейсы и наследование
О, для множественных upvotes для императивного совета НЕ ДЕЛАЙТЕ ЭТО. Это похоже на злого повелителя, превращающегося в змею ... Это никогда не помогает. –
Есть тонкие причины, по которым вам может понравиться: особенно со статическими полями классов, к которым вы обращаетесь, специально используя имя супер или подкласса. «Никогда» никогда не бывает хорошо говорить;) – RichieHH
Использование статики - это совсем другое дело, Oracle имеет такое же предложение с @ewernli: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT