¿Por qué las variables de instancia de una superclase no están superpuestas en Herencia?Herencia de Java: variables de instancia que reemplazan a
Respuesta
Porque la herencia tiene la intención de modificar el comportamiento. El comportamiento se expone a través de métodos, y es por eso que pueden ser anulados.
Los campos no son de comportamiento sino de estado. No necesita modificar eso, ni los métodos privados empleados por la superclase. Están destinados a permitir que la superclase haga su trabajo.
Puede ocultar un campo, pero no anular it.
Ocultar significa que un campo tendrá un valor diferente según la clase a la que se acceda. El campo en la subclase "ocultará" el campo en la superclase, pero ambos existen. Se accede
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
}
}
Dependiendo de si el método se overriden, el campo en A
o B
:
Esa es una muy mala práctica de ocultar campo, pero funciona.
¡Nunca hagas eso! Nunca es la solución a su problema y crea errores muy sutiles relacionados con la herencia.
Porque:
Se puede romper el código
parent class
. Por ejemplo considere siguiente código (¿Cuál sería el comportamiento de la líneaobB.getInt();
en el seguimiento de código si, se permite variables de instancia primordiales):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(); } }
No es lógica porque
child class
deberían tener/reflejar todos los comportamientos deparent class
.
Por lo tanto, sólo se puede ocultar los métodos/las variables heredadas en child class
pero no puedo override
.
que sigue es un extracto de Java doc from Oracle especificando qué operación se puede realizar/esperar de child class
:
Se pueden utilizar los miembros heredados como es, reemplazarlos, ocultarlos, o complementarlos con los nuevos miembros :
- Los campos heredados se pueden usar directamente, como cualquier otro campo.
- Puede declarar un campo en la subclase con el mismo nombre que el de la superclase, de modo que lo oculte (no se recomienda).
- 1. Implementando métodos/variables de instancia en la herencia de prototipales
- 2. Variables de instancia de la clase Ruby y herencia
- 3. Variables de instancia de Java contra variables locales
- 4. Carriles - Variables locales frente a variables de instancia
- 5. Java Dónde hacen Variables locales, referencias a objetos, variables de instancia
- 6. Java - Variables de referencia
- 7. Valores predeterminados de variables de instancia y variables locales
- 8. iOS 5 variables de instancia
- 9. ¿Cuáles son las reglas que dictan la herencia de variables estáticas en Java?
- 10. Enum como variables de instancia
- 11. ¿Inicializar automáticamente variables de instancia?
- 12. Herencia de Java - constructores
- 13. Do subclases Heredar instancia privada variables a partir de Superclases
- 14. copyWithZone configurando variables de instancia?
- 15. Herencia de Java
- 16. Herencia en Core Java
- 17. Acceso a variables de clase heredadas en java
- 18. Hacer referencia a variables de instancia de AppDelegate
- 19. Colocación de declaraciones de variables de instancia
- 20. variables de instancia de clase python y variables de clase
- 21. Variables C++: declarar y definir. Herencia
- 22. Rieles activos Variables de registro de instancia
- 23. ¿Herencia de campos finales en Java?
- 24. Variables de instancia vs. variables de clase en Python
- 25. C# reemplazan caracteres \"
- 26. ¿Utiliza 'esto' delante de variables de instancia?
- 27. Problema de herencia de Java
- 28. Herencia de Constructor de Java
- 29. Asignación compuesta a la clase Python y variables de instancia
- 30. Extensión similar a una categoría para las variables de instancia
Oh, para múltiples votaciones por el consejo imperativo de NO HACER ESTO. Es como un señor supremo malvado transformándose en una serpiente ... Nunca ayuda. –
Hay razones sutiles por las que le gustaría: especialmente con los campos de clases estáticas a los que accede mediante el uso específico del nombre de la superclase o de la subclase. "Nunca" nunca es bueno decir;) – RichieHH
Usar estática es otra cosa, Oracle tiene la misma sugerencia con @ewernli: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT