Tengo una pregunta sobre herencia y conversión en Java. Tengo las siguientes dos clases de ejemplo y una clase de prueba, y declaro mi pregunta después de las clases:Herencia y conversión en Java
public class Automobile {
public int var;
public Automobile() {
var = 1;
}
public String toString() {
return "AUTOMOBILE: " + var;
}
}
public class Porsche extends Automobile {
public int var;
public Porsche() {
var = 2;
}
public String toString() {
return "PORSCHE: " + var;
}
}
public class Test {
public static void main (String [] args) {
Porsche p = new Porsche();
Automobile a = new Automobile();
System.out.println ("(Automobile) p = " + (Automobile)p);
System.out.println ("(Automobile) p.var = " + ((Automobile)p).var);
}
}
La salida es:
(Automobile) p = PORSCHE: 2
(Automobile) p.var = 1
No entiendo por qué en la segunda sentencia que tengo 1. ¿No debería ser 2? Porque después yo echo p para automóvil en la primera declaración sigo teniendo PORSCHE: 2
como la representación de p
- Entiendo que esto de la siguiente manera:
, sin embargo, he fundido p
al automóvil p
mantiene la "naturaleza original" - p
es un objeto de la clase Porsche, pero como Porsche amplía Automobile, podríamos decir que p también es un automóvil. Y, por lo tanto, cuando lo lanzamos explícitamente a Automobile, continúa usando sus métodos: en nuestro caso es el método toString()
definido en Porsche.
Por otro lado, si lo que escribo es correcta, entonces la segunda sentencia print debe dar 2 y no 1.
Ahora bien, esto parece como una contradicción a mí, pero ya que este funciona en Java, parece que no entiendo lo que sucede durante el casting y el proceso de herencia.