La Web del Programador: Comunidad de Programadores
 
    Pregunta:  61812 - THIS, CON HERENCIA
Autor:  Chango ska
Hola amigos, resulta que estuve realizando unos ejercicios con gráficos en java, y en un ejemplo que me encontré en un libro aparecía el siguiente código:

import java.awt.Frame;

public class CreaVentana{
public static void main(String args[]){
Ventana v = new Ventana ("Nueva ventana", 30, 80, 400, 250);
}
}

class Ventana extends Frame{
public Ventana(String titulo, int x, int y, int ancho, int alto){
super(titulo);
this.setBounds(x,y,ancho,alto);
this.setVisible(true);
}
}

la verdad todo me queda muy claro excepto una cosa, la forma en que maneja el this, yo lo había usado para acceder desde un método a las variables de instancia (atributos de la clase), pero en este ejemplo me resulta mas lógico utilizar la palabra super en lugar de this debido a que según entiendo esta llamando a los métodos de la superclase, en este caso Frame.

Hice el cambio en el código para ver si me marcaba algún error de compilación o ejecución y resulto que todo fue de maravilla y me funciono perfectamente utilizando mi codigo de la siguiente manera:

import java.awt.Frame;

public class CreaVentana{
public static void main(String args[]){
Ventana v = new Ventana ("Nueva ventana", 30, 80, 400, 250);
}
}

class Ventana extends Frame{
public Ventana(String titulo, int x, int y, int ancho, int alto){
super(titulo);
super.setBounds(x,y,ancho,alto);
super.setVisible(true);;
}
}

Por este motivo me gustaría saber la causa del porque los dos códigos se comportan de la misma manera y cual es la funcionalidad de utilizar la palabra reservada this cuando se esta utilizando la herencia.

Saludos y de antemano muchas gracias.

  Respuesta:  alex
Hola, es curioso, pero no se me había ocurrido usar super como tú lo has hecho ... :)

... bueno, la cosa es que, a mi entender, "this" (y por lo que veo también "súper"), al usarlo, es como si hubieras creado un objeto de una clase para acceder a sus atributos y métodos, pero en el caso de "this", se trata de un objeto que pertenece a la misma clase en la que lo usas y no hace falta crearlo previamente. Es muy útil, porque hay muchas ocasiones en las que algún constructor de algún otro objeto pide a su vez un objeto de la misma clase donde lo has creado, y con sólo pasarle "this" se resuelve el aparente lío. O si el objeto pidiera un objeto de la clase superior de la que se deriva, le pasas "super" y listo.

En el caso de "super" sucede lo mismo, pero al usarlo accederás sólo a los atributos y métodos de la clase superior (Frame). Al poner "super(titulo);" estás usando uno de los constructores de la clase Frame, que pide un String. Pero no es lo mismo que si hubieras usado el constructor por defecto, que no pide nada, y hubieras puesto "super(); super.tittle = titulo;" porque, en el primer caso el atributo "título" variará cuando varíe el string "tittle" de la clase Frame, cosa que en el segundo caso no sucederá.

El comportamiento en ambos casos es el mismo porque simplemente estás usando sólamente los métodos de la clase Frame, y como tu clase Ventana deriva de Frame, heredará todos sus atributos y métodos. O sea, tanto desde "this" (objeto de la clase Ventana) como desde "super" (objeto de la clase Frame) estás llamando a los métodos de la clase Frame.
Si tu clase Ventana no extendiera de la clase Frame, no podrías acceder a los métodos de Frame (setBounds(), setVisible(), etc ... )

Bueno, y hasta aquí te puedo contar desde mi punto de vista ... suerte!