Qual è la differenza tra Class.this e this in Java


121

Esistono due modi per fare riferimento all'istanza di una classe all'interno di quella classe. Per esempio:

class Person {
  String name;

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

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

Uno utilizza this.nameper fare riferimento al campo oggetto, ma l'altro utilizza className.thisper fare riferimento al campo oggetto. Qual è la differenza tra questi due riferimenti?

Risposte:


165

In questo caso, sono gli stessi. La Class.thissintassi è utile quando si dispone di una classe nidificata non statica che deve fare riferimento all'istanza della sua classe esterna.

class Person{
    String name;

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

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

    }
}

2
Se invece di Person.this.name hai appena detto "return name" non funzionerà?
Amit G

7
@Amit G - in questo esempio, sì, funzionerà. tuttavia, ci sono momenti in cui è necessario chiarire quale "questo" si sta utilizzando (ad esempio, se ci sono conflitti nei nomi dei membri var o nei nomi dei metodi). vedere la risposta di Michael per un esempio pertinente.
jtahlborn

1
Un esempio potrebbe essere quando devi dare un riferimento Person.thisa un altro oggetto.
Bowi

85

Questa sintassi diventa rilevante solo quando hai classi nidificate:

class Outer{
    String data = "Out!";

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

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

13

Hai solo bisogno di usare className.this per le classi interne. Se non li usi, non preoccuparti.


4

Class.thisè utile per fare riferimento a un non statico OuterClass.

Per istanziare un non statico InnerClass, devi prima istanziare il file OuterClass. Quindi un non statico InnerClassavrà sempre un riferimento del suo OuterClasse tutti i campi e metodi di OuterClassè a disposizione del 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();
        ...
}

In questo esempio entrambi Innerclasssono istanziati dallo stesso, Outerclassquindi entrambi hanno lo stesso riferimento al file Outerclass.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.