Diario de un Aprendiz de Java

Saturday, May 28, 2005

Las palabras reservadas THIS y SUPER

Después de un tiempo sin postear (y sin dedicarle demasiado a Java) por culpa de determinadas obligaciones académicas, vuelvo a la carga para explicar una cosa muy sencilla.
Java nos da estas herramientas para poder hacer nuestro codigo más entendible. La palabra reservada this permite especificar que la variable que señala (y la señala haciendo this.nombreVariable) es de la misma clase en la que se usa.
Os podeis preguntar .. ¿para que me sirve esto, si ya se sobreentiende? ¡Yo nunca voy a usar dos variables con el mismo nombre!
Pues yo os voy a comentar un caso en el que this nos permite crear codigo mucho más facil de entender para aquel que lo lee (y por tanto, más sencillo para nosotros cuando lo tengamos que releer/modificar/mejorar). Mirad el siguiente codigo :
class RGB {
  int red, green, blue;

  RGB(int red, int green, int blue) {
   this.red = red;
   this.green = green;
   this.blue = blue;
  }
}

Como veis, el nombre de los argumentos que se pasan en el constructor son los mismos que las variables de la clase, así que para asignar los valores sin hacer tonterias (tipo red = red, :D) debemos usar this. En este caso, el poder usar los nombres red/green/blue en los argumentos nos permite evitar comentar el codigo para indicar que eso es el constructor principal y tal (como nos pasaría si hicieramos algo como RGB(int x, int y, int z)), ya que solo dandole un vistazo al codigo se entiende perfectamente su función.

No me cansaré de decirlo. Para lograr un buen source es importante no repetir fragmentos de codigo, usar tipos de variables acorde a la necesidad (si vas a hacer un bucle que solo se repita 50 veces, ¿porque usar un int como contador, cuando puedes usar un byte y ahorrar memoria?), establecer nombres de variables que expresen con claridad lo que van a contener, y comentar solo cuando haga falta. Estas son las claves más sencillas, pero también las más fundamentales.

La palabra reservada super sirve para indicar que una variable o un método es de la superclase (espero que os acordeis de nuestra querida heréncia :D). Os pongo un codigo para que entendais su uso
class SuperClase {
  boolean variableBool;

  void setVariableBool() {
   variableBool = true;
  }
}

class SubClase extends SuperClase {
  boolean variableBool;

  void setVariableBool() {
   variableBool = false;
   super.setVariableBool();

   System.out.println("La variable de aqui es " + variableBool);
   System.out.println("La de la superclase es " + super.variableBool);
  }
}

class Codigo {
  public static void main(String[] args) {
   SubClase objetoPrueba = new SubClase();
   objetoPrueba.setVariableBool();
  }
}

Como veis, en este codigo la superclase y la subclase tienen una variable y un método que tienen el mismo nombre, pero que hacen funciones diferentes, y los distingimos usando super.
Aún asi, el poner el mismo nombre a dos variables diferentes no es una buena manera de hacer las cosas, porque puede llevar a confusiones, e incluso el JavaCompiler nos indica warning cuando compilamos el codigo

servomac@ubuntu:~/coding/java $ javac Codigo.java

Issued 1 semantic warning compiling "Codigo.java":

10. boolean variableBool;
^----------^
*** Semantic Warning: Field "variableBool" shadows a field of the same name in "SuperClase".

De nuevo me limpio las manos, y dejo a elección del programador el uso de distintos métodos/variables con el mismo nombre.
Espero que tanto this como super os ayuden a entender un poco mejor a Java. ¡Saludos!

16 Comments:

  • joda loco gracias nesecitaba saber oye chino ya se que se utiliza super
    apue cule vaina obvio

    By Anonymous Anonymous, at 7:05 AM  

  • ese comentario lo hize yo

    By Anonymous Anonymous, at 7:06 AM  

  • que digo yo

    By Anonymous naitel, at 7:06 AM  

  • Dude, "Thank You", más simple imposible, lo que no entiendo es porque en los libros de texto no lo explican tan simple como tú.

    Ahora lo entiendo (Sonido de coro celestial para iluminación aquí).

    By Anonymous Daipop, at 8:19 PM  

  • tu solo explicas el uso del this en
    la inicializacion del dato miembro el uso del this no solo su uso se basa en ello, hay otros casos como en el llamado de constructores y en los propios metodos
    podrias explicar mas sobre ese asunto....

    By Anonymous Anonymous, at 7:49 PM  

  • Mejor explicado creo que es dificil de encontrar. Muchas gracias.

    By Anonymous Oscar, at 5:50 PM  

  • Gracias eso lo sabía, pero igual me gustaría q siguieras explicando más cosas de esa manera simple y entendible.

    By Blogger Ruth, at 3:57 PM  

  • buen post. entendi el uso de super y this. saludos de peru

    By Blogger victor, at 10:38 AM  

  • una consulta. tengo este codigo:

    class ThreadEjemplo extends Thread {
    public ThreadEjemplo(String str) {
    super(str);
    }
    public void run() {
    // long t;
    System.out.println("Termina thread " + getName());
    String cadenaTexto = getName();
    }

    public static void main (String [] args) {

    new ThreadEjemplo("UNO").start();

    System.out.println("Termina thread main");



    }
    }

    CUAL ES LA EXPLICACION DEL SUPER? NO ENTIENDO

    By Blogger victor, at 10:59 AM  

  • He probado sin el "super" en una herencia donde las clases tienen constructor que inicializan variables con valores y funciona...

    Inicializan los variables sin necesidad de siquiera crear el objeto para las respectivas clases, sólo se crea un objeto y todas las variables de las superclases, incluso las de los constructores están inicializadas.

    By Anonymous Anonymous, at 9:00 AM  

  • me parece que le esta pasando el parametro str al constructor de la clase Thread.....

    By Blogger mervin, at 7:58 PM  

  • Gracias amigo

    By Anonymous jahuso, at 12:23 PM  

  • Ola: Necesito saber si esta super clase funciona o salta algun error y cual es el error o que esta mal ...

    class Uno{
    protected Uno yoMismo(){ return this;}
    }
    class Dos extends Uno{
    public Dos yoMismo(){
    return super.yoMismo();
    }
    }

    By Anonymous Angel Condorigt, at 1:58 PM  

  • Ola: Necesito saber si esta super clase funciona o salta algun error y cual es el error o que esta mal ...

    class Uno{
    protected Uno yoMismo(){ return this;}
    }
    class Dos extends Uno{
    public Dos yoMismo(){
    return super.yoMismo();
    }
    }

    By Anonymous Angel Condorigt, at 1:58 PM  

  • Gracias mi estimado, me ayudo bastante, mucha información en poco texto. Saludos.

    By Anonymous Anonymous, at 9:16 AM  

  • No se si estoy mal, pero es muy utilizada cuando tienes Override@

    By Blogger bruno diaz diaz, at 9:21 PM  

Post a Comment

<< Home