Java'da Class.this ve this arasındaki fark nedir


121

Bu sınıf içindeki bir sınıfın örneğine başvurmanın iki yolu vardır. Örneğin:

class Person {
  String name;

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

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

Biri this.namenesne alanına başvurmak için kullanır , ancak diğeri className.thisnesne alanına başvurmak için kullanır . Bu iki referans arasındaki fark nedir?

Yanıtlar:


165

Bu durumda aynıdırlar. Class.thisEğer ihtiyaçları dış sınıfının örneğine başvurmak için bir statik olmayan iç içe sınıfı varken sözdizimi yararlıdır.

class Person{
    String name;

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

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

    }
}

2
Kişi.this.name yerine "dönüş adı" dediyseniz bu işe yaramaz mı?
Amit G

7
@Amit G - bu örnekte, evet, işe yarayacak. ancak, hangi "bunu" kullandığınızı açıklığa kavuşturmanız gereken zamanlar vardır (örneğin, üye değişken adlarında veya yöntem adlarında çelişkiler varsa). ilgili bir örnek için Michael'ın cevabına bakın.
jtahlborn

1
Person.thisBaşka bir nesneye atıfta bulunmanız gerektiğinde buna bir örnek verilebilir .
Bowi

85

Bu sözdizimi yalnızca sınıfları iç içe geçirdiğinizde alakalı hale gelir:

class Outer{
    String data = "Out!";

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

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

13

Yalnızca iç sınıflar için className.this kullanmanız gerekir. Bunları kullanmıyorsanız endişelenmeyin.


4

Class.thisstatik olmayan bir referans için kullanışlıdır OuterClass.

Statik olmayan bir örneğini oluşturmak için InnerClass, önce OuterClass. Dolayısıyla statik olmayan InnerClassher zaman bir referans olacak OuterClassve her alanda ve yöntemlere OuterClasskullanılabilir 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();
        ...
}

Bu örnekte her ikisi Innerclassde aynı şekilde somutlaştırılmıştır, bu Outerclassnedenle ikisi de Outerclass.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.