questions programming example about java class inheritance member

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.