Herencia de Java: anulación de variables de instancia

¿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).