2011-04-14 3 views
98

Có hai cách để tham chiếu cá thể của một lớp trong lớp đó. Ví dụ:Sự khác nhau giữa Class.this và điều này trong Java

class Person { 
    String name; 

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

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

Một sử dụng this.name để tham khảo các lĩnh vực đối tượng, nhưng khác sử dụng className.this để tham khảo các lĩnh vực đối tượng. Sự khác nhau giữa hai tham chiếu này là gì?

Trả lời

127

Trong trường hợp này, chúng giống nhau. Cú pháp Class.this hữu ích khi bạn có một lớp lồng nhau không tĩnh cần tham chiếu đến cá thể của lớp ngoài của nó.

class Person{ 
    String name; 

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

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

    } 
} 
+2

Nếu thay vì Person.this.name bạn vừa nói "return name" sẽ không hoạt động? –

+6

@Amit G - trong ví dụ này, có, nó sẽ hoạt động. tuy nhiên, có những lúc bạn cần phải làm rõ "điều này" bạn đang sử dụng (ví dụ: nếu có xung đột trong tên var thành viên hoặc tên phương thức). xem câu trả lời của Michael cho một ví dụ có liên quan. – jtahlborn

+1

ah vâng, cảm ơn! –

13

Bạn chỉ cần sử dụng className.này cho lớp bên trong. Nếu bạn không sử dụng chúng, đừng lo lắng về nó.

70

Cú pháp này chỉ trở nên có liên quan khi bạn đã lồng các lớp:

class Outer{ 
    String data = "Out!"; 

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

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

Ah đánh tôi với ví dụ –

3

Class.this rất hữu ích để tham khảo một không tĩnh OuterClass.

Để khởi tạo một non2atic InnerClass nonstatic, trước tiên bạn phải khởi tạo OuterClass. Do đó, InnerClass nonstatic sẽ luôn có tham chiếu đến OuterClass và tất cả các trường và phương pháp của OuterClass có sẵn cho 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(); 
     ... 
} 

Trong ví dụ cả Innerclass này được khởi tạo so với cùng Outerclass vì thế cả hai đều có tài liệu tham khảo cùng với Outerclass.