elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  acceso a distintos metodos sobrescritos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: acceso a distintos metodos sobrescritos  (Leído 3,325 veces)
kasiko

Desconectado Desconectado

Mensajes: 218



Ver Perfil
acceso a distintos metodos sobrescritos
« 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?


En línea

Nos vemos...

Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: acceso a distintos metodos sobrescritos
« Respuesta #1 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.


En línea

kasiko

Desconectado Desconectado

Mensajes: 218



Ver Perfil
Re: acceso a distintos metodos sobrescritos
« Respuesta #2 en: 28 Junio 2011, 18:51 pm »

pero esta sentencia no deberia funcionar?

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

En línea

Nos vemos...

klaine

Desconectado Desconectado

Mensajes: 112



Ver Perfil WWW
Re: acceso a distintos metodos sobrescritos
« Respuesta #3 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]

Saludos  ;)
En línea

ShotgunLogic

Desconectado Desconectado

Mensajes: 233


Claws so razor sharp


Ver Perfil
Re: acceso a distintos metodos sobrescritos
« Respuesta #4 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:

En línea

The clans are marching against the law, bagpipers play the tunes of war, death or glory I will find, rebellion on my mind.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problemas con 3 decos de O*O distintos
Electrónica
marciano40 0 2,616 Último mensaje 24 Mayo 2008, 20:02 pm
por marciano40
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines