Quelle est la différence entre Class.this et ceci en Java

121

Il existe deux façons de référencer l'instance d'une classe dans cette classe. Par exemple:

class Person {
  String name;

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

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

L'un utilise this.namepour référencer le champ objet, mais l'autre utilise className.thispour référencer le champ objet. Quelle est la différence entre ces deux références?

datauser
la source

Réponses:

165

Dans ce cas, ce sont les mêmes. La Class.thissyntaxe est utile lorsque vous avez une classe imbriquée non statique qui doit faire référence à l'instance de sa classe externe.

class Person{
    String name;

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

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

    }
}
StriplingGuerrier
la source
2
Si au lieu de Person.this.name vous venez de dire "return name", cela ne fonctionnera pas?
Amit G
7
@Amit G - dans cet exemple, oui, cela fonctionnera. cependant, il y a des moments où vous avez besoin de clarifier quel "ceci" vous utilisez (par exemple s'il y a des conflits dans les noms de var membres ou les noms de méthodes). voir la réponse de Michael pour un exemple pertinent.
jtahlborn le
1
Un exemple serait lorsque vous devez donner une référence Person.thisà un autre objet.
Bowi
85

Cette syntaxe ne devient pertinente que lorsque vous avez des classes imbriquées:

class Outer{
    String data = "Out!";

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

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

Vous devez uniquement utiliser className.this pour les classes internes. Si vous ne les utilisez pas, ne vous inquiétez pas.

artbristol
la source
4

Class.thisest utile pour référencer un non statique OuterClass.

Pour instancier un nonstatic InnerClass, vous devez d'abord instancier le OuterClass. Par conséquent, un non statique InnerClassaura toujours une référence de son OuterClasset tous les champs et méthodes de OuterClassest disponible pour le 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();
        ...
}

Dans cet exemple, les deux Innerclasssont instanciés à partir du même, par Outerclassconséquent, ils ont tous deux la même référence au Outerclass.

Espionnage
la source