acceso a distintos metodos sobrescritos

Iniciado por kasiko, 27 Junio 2011, 19:26 PM

0 Miembros y 1 Visitante están viendo este tema.

kasiko

Tengo una duda,

Supongamos que tenemos este codigo:


class A{
    void imprimeA(String s){
        System.out.println("A: "+s);
    }
}

class B extends A{

   
     void imprimeAb(String s){

        System.out.println("B: "+s);
    }
}

class C extends B{

    @Override
     void imprimeA(String s){


        System.out.println("C: "+s);
    }
}
public class herencias extends C{
    public static void main(String[] as){
        A h= new C();
        h.imprimeA("antonio");
         h=(B)h;

       
           ((C) h).imprimeAb("juan");
            ((A)h).imprimeA("kiko");


    }

}





- Se que java va recorriendo de abajo hacia arriba los metodos y atributos heredados. Pero me preguntaba ¿como se puede invocar el metodo de la clase A, segun el codigo que he puesto?
Nos vemos...


Valkyr

La forma más evidente:

Código (javascript) [Seleccionar]

A prueba = new A();
prueba.imprimeA("PRUEBA");


xD. Otra forma, sin cambiar el código, no se me ocurre ninguna la verdad. Y eso de que java los recorre de abajo arriba...mejor dicho sería decir: java ejecuta los métodos por ligadura dinámica, sin embargo, los métodos los hace por la parte estática. (sí la memoria no me falla).

Saludos.

kasiko

pero esta sentencia no deberia funcionar?

((A)h).imprimeA("kiko");


Nos vemos...


klaine

Lo que tu estas haciendo se llama casting, si kieres llegar a la clase A haciendo casting no debes saltarte ningun eslabon de la herencia es decir, tienes C, pasas a B, luego a A, pero como dicen aqui arriba ¿no es mas sencillo instanciar la clase A y acceder directamente?

[Cast]

Saludos  ;)

ShotgunLogic

Cita de: kasiko en 28 Junio 2011, 18:51 PM
pero esta sentencia no deberia funcionar?

((A)h).imprimeA("kiko");




Lo voy a explicar que seguro que así todos nos aclaramos.

Java tiene dos "tipos" de clases: estáticas y dinámicas. Las clases estáticas son las que se ponen al declarar el objeto, y que son las que mirara el COMPILADOR de Java. Las dinámicas son las que pones al crear el objeto(que es distinto que declararlo), y que son las que funcionarán al ejecutar el programa.

Pasa que por ejemplo, la clase C, que deriva de A, puede hacerse así:

A obj = new C();

De hecho es correcto hacerlo, y se usa mucho a la hora de si quisieses por ejemplo hacer un Array con objetos de clase A, pero siendo más específico meter un objeto de clase C.

Hasta ahí bien, pero con el cast lo que haces es decirle al COMPILADOR: tú tranquilo, que aunque su clase estática sea la que sea, este objeto es de esta clase(vamos, tienes que estar seguro que su clase dinámica va a ser siempre la que indicas al castear, porque si no te puede dar errores de ejecución, o que el programa no funcione como esperabas).

Con lo cual, lo que estas haciendo es decirle al compilador que tu clase es A, algo que ya sabía por que su clase estática era esa. Pasa que a la hora de ejecutarlo, como su clase dinámica es otra, va a empezar a "buscar el método por abajo", y se va a encontrar primero el de la C en el caso de que sue clase dinámica sea esta.

Con lo cual simplemente podrías llamar al método de la clase A con un objeto de tipo estático A o B, ya que el C siempre te lo va a sobreescribir, por mucho que castees. Hay que darse cuenta que el casteo solo sirve para que el compilador no te tire errores, y hay que tener mucho cuidado con él porque puede romperte un programa.

Espero haberme explicado bien, un saludo! :laugh:

The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.