Яка різниця між Class.this та цим у Java


121

Є два способи посилання на екземпляр класу в межах цього класу. Наприклад:

class Person {
  String name;

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

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

Один використовує this.nameдля посилання на об’єктне поле, а інший використовує className.thisдля посилання на об’єктне поле. Яка різниця між цими двома посиланнями?

Відповіді:


165

У цьому випадку вони однакові. Class.thisСинтаксис корисний , коли у вас є нестатичних вкладений клас , який повинен звернутися до примірника його зовнішній класу.

class Person{
    String name;

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

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

    }
}

2
Якщо замість Person.this.name ви просто сказали "повернути ім'я", це не спрацює?
Аміт G

7
@Amit G - у цьому прикладі так, це спрацює. однак, бувають випадки, коли вам потрібно уточнити, яке «це» ви використовуєте (наприклад, якщо є конфлікти в іменах членів var або іменах методів). див відповідь Майкла на відповідний приклад.
jtahlborn

1
Одним із прикладів може бути посилання Person.thisна інший об’єкт.
Бові

85

Цей синтаксис стає релевантним лише тоді, коли ви вклали класи:

class Outer{
    String data = "Out!";

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

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

13

Потрібно лише використовувати className.this для внутрішніх класів. Якщо ви їх не використовуєте, не хвилюйтеся з цього приводу.


4

Class.thisкорисно посилатися на нестатичну OuterClass.

Щоб створити екземпляр нестатичного InnerClass, спочатку потрібно інстанціювати OuterClass. Отже, нестатичний InnerClassзавжди матиме посилання на його, OuterClassі всі поля та методи OuterClassдоступні для 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();
        ...
}

У цьому прикладі обидві Innerclassописуються однаково, Outerclassтому обидва мають однакове посилання на Outerclass.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.