web-dev-qa-db-fra.com

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

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;
  }
}

On utilise this.name pour référencer le champ objet, mais l'autre utilise className.this pour référencer le champ objet. Quelle est la différence entre ces deux références?

117
datauser

Dans ce cas, ce sont les mêmes. La syntaxe Class.this 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; 
        }

    }
}
151
StriplingWarrior

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!"
        }
    }
}
82
Michael Borgwardt

Vous avez seulement besoin d'utiliser className.this pour les classes internes. Si vous ne les utilisez pas, ne vous en faites pas.

13
artbristol

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

Pour instancier un InnerClass non statique, vous devez d'abord instancier le OuterClass. Par conséquent, un InnerClass non statique aura toujours une référence de son OuterClass et tous les champs et méthodes de OuterClass sont disponibles 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 Innerclass sont instanciés à partir du même Outerclass, ils ont donc tous deux la même référence au Outerclass.

4
Espionage