Entendiendo la sobreescritura (override) y otros líos (en JAVA). Veamos el siguiente código de ejemplo: public class Padre { public int numero; public Padre(){} public void Imprimir(){ System.out.println(“ Oli “); } } public class Hijo extends Padre { public int numero; public Hijo(){} @Overrride public void Imprimir(){ System.out.println( “ Chau “); } public void Imprimir_2(){ System.out.println( “ Soy el hijo! “ ); } } public class Main(){ public static void main (){ Padre padre = new Padre(); Hijo hijo = new Hijo(); padre.numero = 1; hijo.numero = 2; padre.imprimir(); // 1 (imprime “Oli”) hijo.imprimir(); // 2 (imprime “Chau”) padre = hijo; // 3 (asignamos la memoria de hijo a padre) // Perdimos la referencia a la memoria de padre. padre.imprimir(); // 4 (imprime “Chau”, es decir, aunque padre es de tipo // Padre, se usa el método del hijo.) System.out.println( “Numero: “ + padre.numero ); // 5 ( Imprime “Numero: 0” // porque en el caso de variables con el mismo nombre, // siempre se llama a la variable según el tipo de la variable que // contiene la memoria. En JAVA los enteros se inicializan a cero, siendo así // podemos ver que se llamó a la variable <<numero>> de la super clase // que fue inicializada por JAVA. ) hijo = new Padre(); // 6 (Error, esto es ilegal, una variable de una subclase NO // puede contener una memoria de una super clase, no así // a la inversa, una super clase puede contener la memoria de // de una subclase (aunque se pierden temporalmente las // referencias a los métodos y variables exclusivas de la // subclase), para poder acceder a los métodos exclusivos de // la subclase se debe hacer un cast. ) padre.imprimir_2(); // 7 ( Error, como se dijo anteriormente, un variable de super // clase que apunta a una subclase no puede acceder a los // métodos exclusivos de la subclase, para ello debemos hacer // un cast explícito. ((Hijo) padre).imprimir_2(); // 8 (Esto imprimirá “Soy el hijo!”); } } Alejandro Porras – 2011.