Java - Diferencia al poner this. y no ponerlo

 
Vista:
sin imagen de perfil

Diferencia al poner this. y no ponerlo

Publicado por José Joaquín (3 intervenciones) el 11/12/2015 21:23:43
Buenas a todos, llevo un tiempo aprendiendo Java, pero hay algo que no me queda claro:

Cuando creamos un constructor de la clase, ¿que diferencia hay a la hora de poner this. y no ponerlo?

Pongo un código de ejemplo:

1
2
3
4
5
6
7
public class Jugador{
          protected int codJugador;
 
public Jugador(){
          codJugador=53;
          }
}

Bien, ahí está. ¿Que pasa o cual es la diferencia entre poner el atributo con y sin this?
Además, a la hora de crear los getter y los setter, ¿es necesario ponerlo?

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
sin imagen de perfil

Diferencia al poner this. y no ponerlo

Publicado por José Joaquín (3 intervenciones) el 11/12/2015 22:07:28
Ya he visto esa página. Aun así voy a volver a echarle un vistazo a ver si aclaro algo. Gracias de todas formas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 144
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Diferencia al poner this. y no ponerlo

Publicado por Thanatos (97 intervenciones) el 12/12/2015 20:34:41
En el ejemplo que pusiste, el constructor de la clase Jugador no tiene parámetros de entrada; como no hay ninguna ambigüedad, el uso de this es opcional.

En este ejemplo se muestra lo que sucede si las variables de instancia y los parámetros del constructor tienen los mismos identificadores y no se utiliza la palabra reservada this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Persona {
    private String nombre;   // variables
    private int edad;        //    de
    private float estatura;  // instancia
 
    public Persona(String nombre, int edad, float estatura) {
        nombre = nombre;     // variable_local = variable_local
        edad = edad;         // variable_local = variable_local
        estatura = estatura; // variable_local = variable_local
    }
 
    public static void main(String[] args) {
        Persona objPersona = new Persona("Carlos", 18, 1.75F);
        objPersona.mostrarDatos();
    }
 
    private void mostrarDatos() {
        System.out.println(
            "Nombre = " + nombre + "\n" +
            "Edad = " +  edad + "\n" +
            "Estatura = " + estatura);
    }
}
 
// SALIDA:
// Nombre = null
// Edad = 0
// Estatura = 0.0

Las líneas 7, 8 y 9 no tienen ningún efecto sobre las variables de instancia. Esto sucede porque las únicas variables que se utilizan en esas líneas, son las variables locales del constructor. En otras palabras, se está asignando cada variable local a sí misma. Algo similar a hacer esto:

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
    String nombre = "Carlos";
    int edad = 18;
    float estatura = 1.75F;
 
    nombre = nombre;
    edad = edad;
    estatura = estatura;
}

Por tanto, las variables de instancia de la clase no llegan a recibir los valores que se le pasan al constructor. En lugar de ello, al tratarse de variables de instancia, Java les asigna valores por defecto de acuerdo al tipo de cada variable:

1
2
3
4
5
6
7
8
9
10
11
12
13
byte   -> 0
short  -> 0
int    -> 0
long   -> 0L
float  -> 0.0F
double -> 0.0D
char   -> '\u0000'
boolean -> false
 
Como String no es un tipo de dato primitivo, sino una clase, el valor por defecto de una de sus intancias
es el mismo que tiene cualquier otro objeto:
 
String -> null

Debido a eso, los atributos del objeto objPersona que se declaró en el método main, nunca llegan a inicializarse con los argumentos ("Carlos", 18, 1.75F) y sólo mantienen los valores por defecto que corresponden a cada atributo.

La palabra reservada this, hace referencia a cada instancia u objeto de una clase. Desde el punto de vista del anterior ejemplo, this hace referencia al objeto objPersona.

Cuando las variables de instancia y los parámetros del constructor tienen los mismos identificadores, se necesita utilizar this, para referirnos a las variables de instancia, de esa forma las diferenciamos de las variables locales del contructor, así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Persona {
    private String nombre;   // variables
    private int edad;        //    de
    private float estatura;  // instancia
 
    public Persona(String nombre, int edad, float estatura) {
        this.nombre = nombre;     // variable_de_instancia = variable_local
        this.edad = edad;         // variable_de_instancia = variable_local
        this.estatura = estatura; // variable_de_instancia = variable_local
    }
 
    public static void main(String[] args) {
        Persona objPersona = new Persona("Carlos", 18, 1.75F);
        objPersona.mostrarDatos();
    }
 
    private void mostrarDatos() {
        System.out.println(
            "Nombre = " + nombre + "\n" +
            "Edad = " +  edad + "\n" +
            "Estatura = " + estatura);
    }
}
 
// SALIDA:
// Nombre = Carlos
// Edad = 18
// Estatura = 1.75

Si los atributos de la clase y los parámetros del constructor no tuvieran los mismos identificadores, el uso de this sería opcional, porque no existiría ninguna ambigüedad.

En los setters también puede darse la ambigüedad entre los identificadores de la variable local y la variable de instancia, en ese caso también debería utilizarse this o bien utilizar identificadores diferentes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
sin imagen de perfil

Diferencia al poner this. y no ponerlo

Publicado por José Joaquín (3 intervenciones) el 12/12/2015 20:44:37
Ok gracias por el aporte!! Ya lo entiendo mucho mejor.

Usamos this. para referirnos a los atributos propios de un objeto, los cuales se declaran al crear la clase. Y también para diferenciar los atributos propios del objeto de otros atributos que pueden llamarse igual.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar