Sự khác biệt giữa Class.this và this trong Java là gì


121

Có hai cách để tham chiếu đến thể hiện của một lớp trong lớp đó. Ví dụ:

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 chiếu trường đối tượng, nhưng cách kia sử dụng className.thisđể tham chiếu trường đối tượng. Sự khác biệt giữa hai tài liệu tham khảo này là gì?

Câu trả lời:


165

Trong trường hợp này, chúng giống nhau. Các Class.thiscú pháp rất hữu ích khi bạn có một lớp lồng nhau không tĩnh mà cần phải tham khảo ví dụ lớp bên 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" thì sẽ không hoạt động phải không?
Amit G

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

1
Một ví dụ là khi bạn phải cung cấp một tham chiếu Person.thisđến một đối tượng khác.
Bowi

85

Cú pháp này chỉ trở nên phù hợp khi bạn có các lớp lồng nhau:

class Outer{
    String data = "Out!";

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

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

13

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


4

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

Để khởi tạo một nonstatic InnerClass, trước tiên bạn phải khởi tạo OuterClass. Do đó, một nonstatic InnerClasssẽ luôn có tham chiếu của nó OuterClassvà tất cả các trường và phương thức của OuterClassđều 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ụ này, cả hai đều Innerclassđược khởi tạo từ cùng một Outerclassdo đó cả hai đều có cùng tham chiếu đến Outerclass.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.