Qual é a diferença entre Class.this e this em Java

121

Existem duas maneiras de referenciar a instância de uma classe dentro dessa classe. Por exemplo:

class Person {
  String name;

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

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

Um usa this.namepara referenciar o campo do objeto, mas o outro usa className.thispara referenciar o campo do objeto. Qual é a diferença entre essas duas referências?

datauser
fonte

Respostas:

165

Nesse caso, eles são os mesmos. A Class.thissintaxe é útil quando você tem uma classe aninhada não estática que precisa se referir à instância de sua classe externa.

class Person{
    String name;

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

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

    }
}
StriplingWarrior
fonte
2
Se, em vez de Person.this.name, você acabou de dizer "return name", isso não funcionará?
quer
7
@Mit G - neste exemplo, sim, ele funcionará. no entanto, há momentos em que você precisa esclarecer qual "isso" está usando (por exemplo, se houver conflitos nos nomes dos membros ou nos nomes dos métodos). veja a resposta de Michael para um exemplo relevante.
precisa saber é o seguinte
1
Um exemplo seria quando você deveria dar uma referência Person.thisa outro objeto.
Bowi
85

Essa sintaxe só se torna relevante quando você aninha classes:

class Outer{
    String data = "Out!";

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

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

Você só precisa usar className.this para classes internas. Se você não estiver usando, não se preocupe.

artbristol
fonte
4

Class.thisé útil referenciar um não estático OuterClass.

Para instanciar um não estático InnerClass, você deve primeiro instanciar o OuterClass. Portanto, um não estático InnerClasssempre terá uma referência a ele OuterClasse a todos os campos e métodos de OuterClassestá disponível para o 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();
        ...
}

Neste exemplo, ambos Innerclasssão instanciados a partir do mesmo, Outerclassportanto, ambos têm a mesma referência ao Outerclass.

Espionagem
fonte