2013-03-18 39 views
6

Tôi đã tạo ra một lớp bên trong một lớp bên trong:Cách java thực hiện truy cập vào lớp bao ngoài từ một lớp bên trong bên trong?

public class EnclosingClass { 

    public class InnerClass { 
     private EnclosingClass getEnclosing() { 
      return EnclosingClass.this; 
     } 

     public class InnerInnerClass { 
      private InnerClass getEnclosing() { 
       return InnerClass.this; 
      } 

      private EnclosingClass getEnclosingOfEnclosing() { 
       return EnclosingClass.this; 
      } 
     }   
    } 
} 

Tôi đã ngạc nhiên rằng java cho phép InnerInnerClass để truy cập trực tiếp các EnclosingClass. Mã này được Java thực hiện như thế nào trong nội bộ?

Các InnerInnerClass giữ hai con trỏ (một trên InnerClass và các khác trên EnclosingClass) hoặc InnerInnerClass truy cập EnclosingClass qua InnerClass?

+0

Với * "Mã này được triển khai như thế nào?" *, Ý của bạn là cách Java thực hiện bên trong các lớp bên trong? – m0skit0

+0

Tôi nghĩ anh ấy có ý đó. – ITroubs

+0

xem http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class – ITroubs

Trả lời

11

Bạn chỉ cần tháo rời các lớp kết quả với javap để xem những gì đang xảy ra:

private EnclosingClass getEnclosingOfEnclosing(); 
    Code: 
    0: aload_0 
    1: getfield  #1     // Field this$1:LEnclosingClass$InnerClass; 
    4: getfield  #3     // Field EnclosingClass$InnerClass.this$0:LEnclosingClass; 
    7: areturn 

Vì vậy, lần đầu tiên nó được thể hiện của lớp kèm theo trực tiếp, sau đó nó được "cấp cao" kèm theo lớp từ đó.

+1

+1 Câu trả lời duy nhất thực sự trả lời câu hỏi. – m0skit0

+0

@ m0skit0 có. Có thể anh ta là người duy nhất hiểu tiếng Anh của tôi. – gontard

+0

Thật không may tôi chỉ có thể upvote một lần ...: D –

1

Nếu các lớp bên trong không phải là 'tĩnh', chúng chứa tham chiếu nội bộ đến lớp mà chúng được chứa trong đó.

1

Trừ khi bạn tạo một lớp bên trong tĩnh, thì có, nó có tham chiếu đến cá thể tồn tại bên trong, và có thể tham chiếu đến các thành viên (bao gồm cả riêng), tương tự cho các lớp bên trong bên trong, các lớp bên trong bên trong và Sớm.

+2

Tôi nghĩ câu hỏi là về ** cách ** được thực hiện trong nội bộ. – m0skit0

0

công khai và riêng tư là một vấn đề về con trỏ, đó là vấn đề về trình biên dịch.

Câu hỏi là một trong các trình biên dịch thực thi phạm vi của lớp/biến/phương pháp. Bởi vì phương pháp riêng getEnclosing() rơi với phạm vi InnerClass, nó có thể được truy cập trong suốt lớp đó.

Lưu ý rằng con trỏ không liên quan gì đến vấn đề này.
Sử dụng reflection bạn vẫn có thể truy cập các thành viên riêng tư của một lớp học.

+0

Tôi nghĩ rằng anh ta có nghĩa là ngược lại: làm thế nào 'InnerClass' có thể truy cập' EnclosingClass'. – m0skit0

+0

@ m0skit0, vâng, bởi vì bên trong là một phần của bên trong, nó có thể truy cập mọi thứ xung quanh nó, điều đó có ý nghĩa. – Johan

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