2013-06-08 41 views
17

Trong lớp HashMap có một lớp bên trong KeySet có thể hiện được trả về bởi phương thức ví dụ HashMapkeySet(). Lớp bên trong này chứa phương thức sau.HashMap.this.clear() điều này có nghĩa là gì, làm thế nào để làm việc này

public void clear() { 
    HashMap.this.clear(); 
} 

Tôi hiểu ngữ nghĩa chung của "this"

  1. Đó là một tham chiếu đến đối tượng "hiện tại".
  2. Có thể được sử dụng trong các hàm tạo hoặc bất kỳ phương thức thể hiện nào mà nó hoạt động như một tham chiếu đến đối tượng đang được xây dựng hoặc đối tượng có phương thức đang được gọi.

Phong cách trên của việc sử dụng "this" dường như thú vị,

  1. Nó đang được sử dụng như thể nó là một biến tĩnh của một lớp.
  2. Nó vẫn phải đề cập đến một đối tượng có phương thức đang được gọi. Trong trường hợp này, nó phải là một cá thể HashMap.

Cho hai điều trên nên có thể có tham chiếu tĩnh cho bất kỳ đối tượng thể hiện được tạo động nào, nhưng điều đó là không thể vì có thể có vô số trường hợp trong thời gian chạy và không có cấu trúc ngôn ngữ nào để chỉ định mối quan hệ giữa một lớp và các thể hiện của nó.

Tôi chắc chắn thiếu điều gì đó, ai đó có thể giúp tôi hiểu điều này tốt hơn.

Trả lời

18

Khi một lớp bên trong không tĩnh được tạo, nó sẽ có tham chiếu đến thể hiện lớp bao quanh của nó. Để tham chiếu ví dụ đó, một cú pháp đặc biệt được sử dụng: từ khóa this được đặt trước bằng tên của lớp kèm theo. Khi được sử dụng mà không có tiền tố tên lớp, this từ khóa đề cập đến thể hiện của chính lớp bên trong.

Về cơ bản, cuộc gọi được thực hiện theo phương thức clear của lớp HashMap. Lưu ý rằng vì phương thức của lớp bên trong được gọi là clear, cuộc gọi không có HashMap.this sẽ được chuyển hướng đến lớp clear() bên trong lớp bên trong, gây ra đệ quy vô hạn.

Như đã nêu rõ bởi Roger Lindsjö trong nhận xét bên dưới Về mặt kỹ thuật, thành ngữ được gọi là đủ điều kiện xây dựng này. (JLS 15.8.4)

+0

Cảm ơn, điều đó có ý nghĩa, bạn có thể đưa ra một số tham chiếu không. – sandeepkunkunuru

+0

Siêu điều tra và mô tả tuyệt vời! –

+1

@kunkunur Xem phần về Đánh bóng tại đây: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html – Nick

3

HashMap.this.clear(); gọi phiên bản hiện tại là HashMap, bạn đã đề cập đến việc gọi từ InnerClass, vì vậy đó là cách tham chiếu lớp Outter.

Các vấn đề liên quan