subclases - superclase java ejemplo
Si sobrescribe un campo en una subclase de una clase, la subclase tiene dos campos con el mismo nombre(y tipo diferente). (2)
Las variables miembro no se pueden anular como los métodos. Las variables number
en sus clases Beta
y Gama
ocultan (no anulan) el number
de variable miembro de la superclase.
Al enviar contenido, puedes acceder al miembro oculto en la superclase.
Tengo 3 clases:
public class Alpha {
public Number number;
}
public class Beta extends Alpha {
public String number;
}
public class Gama extends Beta {
public int number;
}
¿Por qué compila el siguiente código? Y, ¿por qué pasa la prueba sin ningún error de tiempo de ejecución?
@Test
public void test() {
final Beta a = new Gama();
a.number = "its a string";
((Alpha) a).number = 13;
((Gama) a).number = 42;
assertEquals("its a string", a.number);
assertEquals(13, ((Alpha) a).number);
assertEquals(42, ((Gama) a).number);
}
Los campos no pueden ser anulados ; en primer lugar, no se accede polimórficamente; solo declaras un campo nuevo en cada caso.
Se compila porque en cada caso el tipo de expresión en tiempo de compilación es suficiente para determinar qué campo se llama number
que se refiere.
En la programación del mundo real, evitarías esto de dos maneras:
- Sentido común: los campos sombreados hacen que su código sea más difícil de leer, así que no lo hagas
- Visibilidad: si haces que todos tus campos sean privados, las subclases no los conocerán de todos modos