¿Cuál es la diferencia entre Class.this y esto en Java?

121

Hay dos formas de hacer referencia a la instancia de una clase dentro de esa clase. Por ejemplo:

class Person {
  String name;

  public void setName(String name) {
    this.name = name;
  }

  public void setName2(String name) {
    Person.this.name = name;
  }
}

Uno usa this.namepara hacer referencia al campo de objeto, pero el otro usa className.thispara hacer referencia al campo de objeto. ¿Cuál es la diferencia entre estas dos referencias?

usuario de datos
fuente

Respuestas:

165

En este caso, son lo mismo. La Class.thissintaxis es útil cuando tiene una clase anidada no estática que necesita referirse a la instancia de su clase externa.

class Person{
    String name;

    public void setName(String name){
        this.name = name;
    }

    class Displayer {
        String getPersonName() { 
            return Person.this.name; 
        }

    }
}
StriplingWarrior
fuente
2
Si en lugar de Person.this.name acaba de decir "return name", ¿no funcionará?
Amit G
77
@Amit G: en este ejemplo, sí, funcionará. sin embargo, hay momentos en los que necesita aclarar qué "esto" está utilizando (por ejemplo, si hay conflictos en los nombres de miembros o métodos). Vea la respuesta de Michael para un ejemplo relevante.
jtahlborn
1
Un ejemplo sería cuando tiene que dar una referencia Person.thisa otro objeto.
Bowi
85

Esta sintaxis solo se vuelve relevante cuando tiene clases anidadas:

class Outer{
    String data = "Out!";

    public class Inner{
        String data = "In!";

        public String getOuterData(){
            return Outer.this.data; // will return "Out!"
        }
    }
}
Michael Borgwardt
fuente
13

Solo necesita usar className.this para las clases internas. Si no los está utilizando, no se preocupe por eso.

artbristol
fuente
4

Class.thisEs útil para hacer referencia a un no estático OuterClass.

Para crear una instancia no estática InnerClass, primero debe crear una instancia de OuterClass. Por lo tanto, un no estático InnerClasssiempre tendrá una referencia de él OuterClassy todos los campos y métodos de los que OuterClassestá disponible InnerClass.

public static void main(String[] args) {

        OuterClass outer_instance = new OuterClass();
        OuterClass.InnerClass inner_instance1 = outer_instance.new InnerClass();
        OuterClass.InnerClass inner_instance2 = outer_instance.new InnerClass();
        ...
}

En este ejemplo, ambos Innerclassse instancian de la misma, Outerclasspor lo tanto, ambos tienen la misma referencia a Outerclass.

Espionaje
fuente