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 usoclass 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, at 7:05 AM
ese comentario lo hize yo
By
Anonymous, at 7:06 AM
que digo yo
By
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
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, at 7:49 PM
Mejor explicado creo que es dificil de encontrar. Muchas gracias.
By
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
Ruth, at 3:57 PM
buen post. entendi el uso de super y this. saludos de peru
By
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
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, at 9:00 AM
me parece que le esta pasando el parametro str al constructor de la clase Thread.....
By
mervin, at 7:58 PM
Gracias amigo
By
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
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
Angel Condorigt, at 1:58 PM
Gracias mi estimado, me ayudo bastante, mucha información en poco texto. Saludos.
By
Anonymous, at 9:16 AM
No se si estoy mal, pero es muy utilizada cuando tienes Override@
By
bruno diaz diaz, at 9:21 PM
Post a Comment
<< Home