viernes, 17 de abril de 2009

Una pregunta interesante


Hoy estaba preparando una guía de ejercicios para mi curso de Programación Orientada a Objetos y dentro de mis inventos elaboré el código que se encuentra en la figura (clic para ampliar la imagen)



Primero, se puede preguntar si es válido el tratar de ejecutar el código de la figura de la izquieda.

Luego, se puede preguntar si es válido el código de la imagen anterior y responder luego por lo que imprime y, como siempre, la pregunta más interesante de todas ... ¿podemos justificar la respuesta?

Responder a este tipo de preguntas justifica el conocimiento REAL que se tiene de los conceptos de OO aplicados a un lenguaje de programación.

Saludos

3 comentarios:

  1. Hola yazna, me desvele asi que decidi hacer algo de flood en tu blog hehe

    Nunca he profundizado en Java y tiendo a olvidar las caracteristicas espeficas de cada lenguaje, en este caso : cuales son las caracteristicas de OO que implementa JAVA.

    El segundo codigo deberia ejecutar sabiendo que A implementa a I por lo que B tambien lo implementa implicitamente.

    El tercer codigo tambien deberia ser valido, puesto que un Padre puede "apuntar" a cualquier hijo. Ahora, lo que muestra el segundo codigo .. no estoy seguro porque desconsco como actua Java estos casos.

    Lo que sucede es que B, cuando definio metodoA no utilizo ninguna palabra clave para decir que estaba sobreescrbiendo a A.metodoA. (como new, override, etc). Por lo que creo que ejecutaria ambos metodoA. Si Java es inteligente como C (hehe) ejecutara el metodoA de B, reconociendo el tipo "real" apuntado por A. Pero insisto en que no se si como implementa JAVA la sobreescritura de metodos.

    Eso, puro flood sin sentido, =D nos vemos

    ResponderEliminar
  2. la verdad... tengo tuto mañana lo veo con calma, llege aca buscando material de java no sabia que tenia un blog tecnico, voy a sacarle provecho :D

    Sergio Neira

    ResponderEliminar
  3. Hola profe , soi francisco agurto jejejeje,em encontre bastante interesante la pregunta...
    creo que la respuesta seria la siguiente..

    el codigo.. compilaria sin ningun error, puesto que a la variable x se le asigna una instancia de B , y B hereda de A y esta Implementa la interfaz I , por otra parte nos encontramos con la sobre escritura del metodo "metodoA" en la clase B, pero el cuerpo que posee es el mismo que el de A por tanto tendrian el mismo comportamiento.. ahora java es ultra inteligente XD y sabe cuando un metodo esta siendo sobre escrito.. pero para los ojos del programador no lo es.. por tanto en una de las ultimas versiones del jdk se incorparon las "annotation" que cumplen la funcion especificar que dicho metodo esta siendo sobre escrito ejemplo
    @Override
    public int metodoA( int x)
    {
    return a+x;
    }

    a diferencia de c# que se hace explicita la sobre escritura de un metodo a travez de la palabra reservada "override" , a la segunda interrogante , "que es lo que imprime?" la respuesta es 3 puesto que la variable es de ti po A pero su instancia es perteneciente a la clase B , ahora si nos fijamos el metodoA retorna x+a , la variable "a" a la que se referencia en el metodo, es al atributo que posee la misma clase B la cual en ningun momento es inicializada , la variable "a" que se inicializa atravez del constructor de la clase b, es la correspondiente a la clase A debido a la llamada del super(x), y ademas la variable a de la clase A no puede ser accedida por B ya que su visibilidad es privada, para haber subsanado esa situacion la visibilidad de a en la clase A deberia haber sido "protected" y haber obviado la declaracion de a en la clase B , para haber logrado "10" el constructor de b deberia haber sido mas o menos asi
    public B(int x)
    {

    super( x);
    a=x;

    }


    espero haber acertado :P eso seria saludos profe.. que dios la bendiga

    ResponderEliminar