2011-04-14 17 views
98

Istnieją dwa sposoby odwoływania się do instancji klasy w tej klasie. Na przykład:Jaka jest różnica między klasą Class.This a klasą Java w języku Java?

class Person { 
    String name; 

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

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

używa this.name odwoływać się do pola obiektu, ale z drugiej strony wykorzystuje className.this odwoływać się do pola obiektu. Jaka jest różnica między tymi dwoma odniesieniami?

Odpowiedz

127

W tym przypadku są one takie same. Składnia Class.this jest przydatna, gdy masz klasę zagnieżdżoną, która musi odwoływać się do jej klasy zewnętrznej.

class Person{ 
    String name; 

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

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

    } 
} 
+2

Jeśli zamiast Person.this.name właśnie powiedziałeś "Zwróć nazwę", czy to nie zadziała? –

+6

@Amit G - w tym przykładzie tak, to zadziała. jednak są chwile, kiedy trzeba wyjaśnić, które "to", którego używasz (np. jeśli występują konflikty w nazwach członków zestawu lub nazwach metod). zobacz odpowiedź Michaela na odpowiedni przykład. – jtahlborn

+1

ah tak, dzięki! –

13

Musisz tylko użyć className.this dla klas wewnętrznych. Jeśli ich nie używasz, nie martw się o to.

70

Ta składnia staje się istotne tylko gdy masz zagnieżdżone klasy:

class Outer{ 
    String data = "Out!"; 

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

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

Ah pobili mnie do przykładu –

3

Class.this jest przydatna odwołać nie statyczny OuterClass.

Aby utworzyć instancję niestatyczną InnerClass, należy najpierw utworzyć instancję OuterClass. Dlatego też niestatyczny InnerClass zawsze będzie miał odniesienie do jego OuterClass, a wszystkie pola i metody są dostępne dla 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(); 
     ... 
} 

W tym przykładzie zarówno Innerclass są wystąpienia w tym samym Outerclass stąd oba mają te same odnośniki do Outerclass.

Powiązane problemy