Estoy frente a algunas dificultades al tratar de entender, lo que realmente sucede cuando se inicia una instancia de una clase hija.
public class A {
2. public int x, y;
3. public A () { x=1; y=2; }
4. public int getx () { return x; }
5. }
6. public class B extends A {
7. public int x, z;
8. public B () { super(); x=3; y=4; z=5; }
9. public int getx () { return x; }
10. public int getz () { return z; }
11. }
12. public class Prob1 {
13. public static void main (String[] args){
14. A o1 = new A();
15. A o2 = new B();
16. B o3 = new B();
17. System.out.println(o1.x);
18. System.out.println(o1.getx());
19. System.out.println(o1.y);
20. System.out.println(o1.getz());
21. System.out.println(o2.x);
22. System.out.println(o2.getx());
23. System.out.println(o2.y);
Me encanta aquí una explicación detallada de lo que está pasando aquí exactamente, pero lo principal que no puedo entender es por qué la línea '21' imprime el número 1, y la línea '23' imprime el número 4.
El polimorfismo se aplica a los métodos, no a las variables de instancia.
Ambas líneas 21 y 23 se imprimen el valor de las variables de instancia de la clase A
, ya que ese es el tipo de tiempo de compilación o2
(a pesar de su tipo en tiempo de ejecución es B
).
21. System.out.println(o2.x);
El valor de A
's x
miembro es 1
(fijado por el constructor public A () { x=1; y=2; }
).
23. System.out.println(o2.y);
El valor de A
's y
miembro es 4
(fijado por el constructor public B () { super(); x=3; y=4; z=5; }
).
Tenga en cuenta el B
tiene una x
variable de instancia que los cueros A
variable 's del mismo nombre. Por lo tanto, B
's constructor no cambia A
' s x
variable 3
. Por otra parte, B
no tiene una y
variable de instancia, por lo que y=4;
cambia el valor de A
's y
variable 4
.
Por cierto, la línea 20 tiene un error de compilación. Tenía que comentar a cabo con el fin de ejecutar su código.
También nota que o2.getx()
da un resultado diferente que o2.x
, ya que getx()
es un método anulado por clase B
, de modo que devuelve B
's variable de instancia x
, cuyo valor es 3
(ya que el tipo de tiempo de ejecución de o2
es B
).