Foro de elhacker.net

Programación => Java => Mensaje iniciado por: kasiko en 27 Junio 2011, 19:26 pm



Título: acceso a distintos metodos sobrescritos
Publicado por: kasiko en 27 Junio 2011, 19:26 pm
Tengo una duda,

Supongamos que tenemos este codigo:
Código:

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?


Título: Re: acceso a distintos metodos sobrescritos
Publicado por: Valkyr en 28 Junio 2011, 16:52 pm
La forma más evidente:

Código
  1. A prueba = new A();
  2. prueba.imprimeA("PRUEBA");
  3.  

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.


Título: Re: acceso a distintos metodos sobrescritos
Publicado por: kasiko en 28 Junio 2011, 18:51 pm
pero esta sentencia no deberia funcionar?

Código:
((A)h).imprimeA("kiko");



Título: Re: acceso a distintos metodos sobrescritos
Publicado por: klaine en 28 Junio 2011, 23:47 pm
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] (http://analista1.forogratuito.org/t22-cast-tiipos-de-datos-en-java-y-conversiones)

Saludos  ;)


Título: Re: acceso a distintos metodos sobrescritos
Publicado por: ShotgunLogic en 29 Junio 2011, 11:06 am
pero esta sentencia no deberia funcionar?

Código:
((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í:

Código:
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: