2011-04-14 11 views
98

Bu sınıftaki bir sınıf örneğine başvurmanın iki yolu vardır. Örneğin:Java içinde Class.this ve bu arasındaki fark nedir?

class Person { 
    String name; 

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

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

bir amacı, alan referans this.name kullanır, ancak diğer nesne alan referans className.this kullanır. Bu iki referans arasındaki fark nedir?

cevap

127

Bu durumda, aynıdır. Class.this sözdizimi, dış sınıfının örneğine başvurması gereken statik olmayan iç içe geçmiş bir sınıfa sahip olduğunuzda kullanışlıdır.

class Person{ 
    String name; 

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

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

    } 
} 
+2

Person.this.name yerine, "geri dönüş adı" dediyseniz, bu işe yaramayacak mı? –

+6

@Amit G - bu örnekte, evet, işe yarayacak. Bununla birlikte, hangi "bu" kullandığınızı açıklığa kavuşturmak istediğiniz zamanlar vardır (örneğin, üye var isimlerinde veya yöntem adlarında çakışma varsa). ilgili bir örnek için Michael'ın cevabına bakın. – jtahlborn

+1

ah evet, teşekkürler! –

13

Sadece iç sınıflar için className.this kullanmanız gerekir. Eğer onları kullanmıyorsan, endişelenme. Eğer sınıfları iç içe geçmiş zaman

70

Bu sözdizimi sadece ilgili dönüşür:

class Outer{ 
    String data = "Out!"; 

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

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

Ah, beni örnek için yendi –

3

Class.this statik değil OuterClass başvurmak faydalıdır.

Statik olmayan bir InnerClass örneğini başlatmak için önce OuterClass'u başlatmanız gerekir. Bu nedenle, InnerClass nonstatik bir OuterClass referansı ve alanları ve OuterClass metotları InnerClass için kullanılabilir. Bu örnekte, her ikisi de Innerclass de

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(); 
     ... 
} 

nedenle her ikisi de Outerclass aynı başvuru olması aynı Outerclass örneklenen.