2008-12-04 55 views
6

Xin lỗi cho tiêu đề xấu, nhưng tôi không thể nghĩ ra một cái nào tốt hơn.Hai câu hỏi về các lớp bên trong trong Java (lớp A {class B {}})

Tôi đang gặp một lớp A và lớp B mà là loại một lớp con của A, như vậy:?

(Có thực sự là một tên chính xác cho nó không phải là "sub class" reserved cho thừa kế?)

class A { 
    int i = 0; 
    class B { 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     B b = a.new B(); 
     A c = ??? b ??? // get "a" back 
    } 
} 

Từ B mỗi tài sản của A có thể được truy cập, do đó cả hai, ai và bi, trở về 0. Bây giờ, tôi đang tự hỏi cho dù đó là bằng cách nào đó có thể lấy các đối tượng ban đầu của loại A ra của b, như b chứa tất cả mọi thứ có chứa? Đúc đơn giản dường như không làm trò lừa.

Second một:

class A { 

    void print() { 
     System.out.println("This is class A."); 
    } 

    class B { 
     void print() { 
      // <--- How to access print() of class A (like this.A.print() or smth)? 
      System.out.println("This is class B."); 
     } 
    } 
} 

Bạn có thể cách khác cũng cung cấp cho tôi với một số tài nguyên tốt về chủ đề này, như tôi đã quá ngu ngốc để tìm một tốt nhất cho đến nay.

Xin cảm ơn trước. :)

+0

Tên đúng là lớp bên trong, tôi tin. – tvanfosson

+0

Tôi tin rằng đây là bản sao của câu hỏi này (http://stackoverflow.com/questions/309737/how-to-refer-to-the-outer-class-in-another-instance-of-a-non- static-inner-class) –

+0

Cảm ơn Dan, điều này đã giúp tôi rất nhiều!:) – balu

Trả lời

20

Dường như không có cách nào để truy cập lớp ngoài từ bên ngoài. Nhưng bạn có thể làm điều đó như thế này:

class A { 
    int i = 0; 
    class B { 
     final A outer = A.this; 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     A.B b = a.new B(); 
     A c = b.outer // get "a" back 
    } 
} 

ClassName.this sẽ là thể hiện của các outerclass liên quan đến việc thể hiện của một lớp bên trong.

+0

Tôi nghĩ rằng B b = ... là sai. Bạn không thể khai báo một loại B mà không sử dụng AAB b = ... Sẽ tốt hơn .. – OscarRyz

+0

vâng tôi cũng nghĩ như vậy –

+0

Tôi muốn khai báo 'final A outer = A.this;' để ở bên an toàn –

2

[Edit:. Câu trả lời của tôi là thích hợp cho các lập trình C#, nhưng tôi không thể đảm bảo rằng áp dụng nó để Java]

B là một lớp bên trong, không phải là một lớp con của A. Ngoài ra, B thì không giữ một thể hiện của A, do đó, mã của bạn như là không thể trở về bất kỳ trường hợp của A.

bạn cần phải cơ cấu lại các lớp học của bạn như sau:

class A 
{ 
    public class B 
    { 
     public A Parent; 
     public B(A parent) 
     { 
      this.Parent = parent; 
     } 
    } 
} 

Bây giờ lớp B của bạn có một trường 'Chánh 'trả về giá trị gốc của nó. Bạn có thể sử dụng các lớp này như sau (đây là C# cú pháp, bởi vì tôi không biết nếu Java có cú pháp khác nhau cho instantiating lớp bên trong):

public static void Main(String[] args) 
{ 
    A parent = new A(); 
    A.B child = new A.B(child); 
    A backToParent = child.Parent; 
} 

Tất nhiên, việc tạo ra lớp B của bạn theo cách này có vẻ ít hài hước: về mặt kỹ thuật, bạn có thể vượt qua bất kỳ phụ huynh nào. Có thể tốt hơn là viết lại lớp A của bạn với phương thức trả về B:

class A 
{   
    public class B 
    { 
     public A Parent; 
     public B(A parent) 
     { 
      this.Parent = parent; 
     } 
    } 

    public B getChild() 
    { 
     return new B(this); 
    } 
} 

public static void Main(String[] args) 
{ 
    A parent = new A(); 
    A.B child = A.getChild(); 
    A backToParent = child.Parent; 
} 
+0

Trong thực tế, nó giữ một thể hiện của A. Xem thêm: http://stackoverflow.com/questions/309737/how-to-refer-to-the-outer-class-in-another-instance-of-a -non-static-inner-class Tuy nhiên, cảm ơn câu trả lời của bạn. Cách bạn mô tả chắc chắn là một giải pháp khác. – balu

+1

Có vẻ như "lớp bên trong" đề cập đến một khái niệm khác với trong Java (xấp xỉ những gì Java sẽ gọi là "lớp lồng nhau"). –

7

Bạn có thể truy cập bằng cú pháp ParentClass.this từ bên trong lớp bên trong.

ví dụ:

public class Outter 
{ 
    class Inner { 
     public Outter getOutter() 
     { 
      return Outter.this; 
     } 
    } 

    public Inner getInner(){ 
     return new Inner(); 
    } 
} 

class Runner{ 
    public static void main(String[] args){ 
     Outter out = new Outter(); 
     Outter.Inner inner = out.getInner(); 

     System.out.println(inner.getOutter().toString()); 
    } 
} 
1

này dường như làm việc cho tôi

class A { 
    int i = 0; 
    class B { 
     int j = 1; 
    } 
} 

class Test { 
    public static void main() { 
     A a = new A(); 
     A.B b = a.new B(); 
     A c = (A)b.getClass().getDeclaredField("this$0").get(b); 
    } 
} 
Các vấn đề liên quan