¿Por qué las variables de instancia de una superclase no están superpuestas en Herencia?
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 comportamiento sino 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 anularlo .
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.
Esa es una práctica extremadamente mala para ocultar el campo, pero funciona:
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 fue anulado , se accede al campo en A
o B
¡Nunca hagas eso! Esa nunca es la solución a su problema y crea errores muy sutiles relacionados con la herencia.
Porque:
Puede romper el código de parent class
. Por ejemplo, considere seguir el código (¿Cuál sería el comportamiento de la línea obB.getInt();
en el siguiente código, si se permite la invalidación de variables de instancia ):
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ógico porque child class
debe tener / reflejar todos los comportamientos de parent class
.
Por lo tanto, solo puede ocultar los métodos / variables heredados en child class
pero no puede override
.
A continuación, se incluye un extracto del documento de Java de Oracle que especifica qué operación puede realizar / esperar de child class
:
Puede usar los miembros heredados tal como están, reemplazarlos, ocultarlos o complementarlos con nuevos miembros:
- Los campos heredados se pueden usar directamente, al igual que cualquier otro campo.
- Puede declarar un campo en la subclase con el mismo nombre que el de la superclase, escondiéndolo así (no recomendado).