java - programming - ¿Por qué cambiar el tipo lleva a un uso diferente de los miembros?
polymorphism in java (2)
La age
en Bar
sombrea la age
en Foo
.
Además, los campos no son polimórficos (cf. funciones).
Así que cuando escribes Foo bar = new Bar();
, el tipo estático de bar
se usa cuando se accede a la age
del campo, para regresar 2. Y el tipo dinámico de bar
se usa al decidir qué anulación de test()
llamar, y eso es un tipo de Bar
.
Así que estaba probando con algunos fragmentos de código para envolver mi cabeza en torno al concepto de herencia, cuando descubrí esto, para mí, un fenómeno extraño.
Así que primero estaba probando este código simple:
public class Main{
public static void main(String[] args) {
Bar bar = new Bar();
System.out.println("age = " + bar.age);
bar.test();
}
}
class Foo{
int age = 2;
void test(){
System.out.println("TEST FOO");
}
}
class Bar extends Foo{
int age = 4;
void test(){
System.out.println("TEST BAR");
}
}
Y la salida fue como esperaba:
age = 4
TEST BAR
Luego hice un pequeño cambio a la línea 3, donde cambié el tipo de Bar
a Foo
esta manera:
Foo bar = new Bar();
Ahora cuando ejecuto el código, me da una salida que creo que es rara:
age = 2
TEST BAR
¿Cómo sucede que el código bar.age
ahora use el miembro age
de la clase Foo
(lo que tiene sentido), mientras que bar.test();
¿Todavía usa el método de la clase Bar
(y no de Foo, ya que ese es el tipo)?
Porque ha definido dos campos de edad diferentes, uno en cada clase. Los campos no se anulan.