2009-08-30 59 views

Trả lời

472

Lớp bên trong, by definition, không thể tĩnh, vì vậy tôi sẽ lặp lại câu hỏi của bạn là "Sự khác biệt giữa các lớp lồng nhau tĩnh và không tĩnh là gì?"

Lớp lồng nhau không tĩnh có quyền truy cập đầy đủ vào các thành viên của lớp mà nó được lồng vào nhau. Một lớp lồng nhau tĩnh không có tham chiếu đến một thể hiện lồng nhau, do đó một lớp lồng nhau tĩnh không thể gọi các phương thức không tĩnh hoặc truy cập các trường không tĩnh của một cá thể của lớp trong đó nó được lồng vào nhau.

+3

câu trả lời hay. truy cập các thành viên tĩnh từ các cá thể là vô lý. nó chỉ nên có thể truy cập các thành viên tĩnh thông qua 'SomeClass.StaticMember' hoặc, bên trong' SomeClass', thông qua 'StaticMember' (không có' this.') thì chúng ta sẽ không nhận được những câu hỏi này chút nào. –

+4

@Brandon: Khi bạn nói "lớp lồng nhau tĩnh không thể gọi các phương thức không tĩnh hoặc truy cập các trường không tĩnh của một cá thể của lớp trong đó nó được lồng vào nhau." ... Nó có nghĩa là không tạo ra một đối tượng của lớp kèm theo phải không? Kể từ khi tôi nhìn thấy nó, lớp lồng nhau tĩnh là hành vi một lớp cấp cao nhất đã được lồng trong một lớp cấp cao nhất để tiện lợi bao bì. Vì vậy, có thể truy cập các thành viên không tĩnh thông qua một đối tượng. – Shatu

105

Hãy nhìn vào nguồn gốc của sự khôn ngoan cho các câu hỏi như: Joshua Bloch của Effective Java:

Về mặt kỹ thuật, không có những điều như một lớp bên trong tĩnh. Theo Hiệu quả Java, thuật ngữ chính xác là lớp lồng nhau tĩnh. Lớp lồng nhau không tĩnh thực sự là một lớp bên trong, cùng với các lớp ẩn danh và các lớp địa phương.

Và bây giờ trích dẫn:

Mỗi thể hiện của một không tĩnh [lồng nhau] lớp được ngầm liên với một kèm theo ví dụ của lớp chứa của nó ... Có thể để gọi các phương pháp trên kèm theo ví dụ.

Lớp lồng nhau tĩnh không có quyền truy cập vào cá thể kèm theo. Nó cũng sử dụng ít không gian hơn.

+10

Tôi vừa đọc nó. Mục 22: Ủng hộ các lớp thành viên tĩnh trên nonstatic –

+5

Ngoài ra Bloch lưu ý rằng tham chiếu đến cá thể kèm theo trong một lớp bên trong không tĩnh không cần thiết có thể ngăn chặn việc thu thập rác nếu được giữ lại. –

+1

Khi nào được ưu tiên hơn người kia? –

10

Thảo luận lồng nhau lớp ...

Sự khác biệt là một khai báo lớp lồng nhau đó cũng là tĩnh có thể được khởi tạo bên ngoài của lớp kèm theo.

Khi bạn có khai báo lớp lồng nhau là không phải là tĩnh, Java sẽ không cho phép bạn khởi tạo nó ngoại trừ thông qua lớp kèm theo. Đối tượng được tạo ra từ lớp bên trong được liên kết với đối tượng được tạo ra từ lớp bên ngoài, vì vậy lớp bên trong có thể tham chiếu đến các trường bên ngoài. Nhưng nếu nó tĩnh, thì liên kết không tồn tại, các trường bên ngoài không thể được truy cập (ngoại trừ thông qua một tham chiếu thông thường giống như bất kỳ đối tượng nào khác) và do đó bạn có thể tự khởi tạo lớp lồng nhau một cách chính xác.

3

lớp bên trong tĩnh: có thể khai báo static & thành viên không tĩnh nhưng chỉ có thể truy cập các thành viên tĩnh của lớp cha mẹ.

lớp bên trong không tĩnh: chỉ có thể khai báo thành viên không tĩnh nhưng có thể truy cập thành viên tĩnh và không tĩnh của lớp cha.

+3

Không có "lớp bên trong tĩnh" và lớp bên trong (không tĩnh) có thể khai báo một số loại thành viên tĩnh. [JLS 8.1.3] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3 "Lớp bên trong và các trường hợp bao vây"): 'Một lớp bên trong là một lồng nhau lớp không được khai báo một cách rõ ràng hoặc ngầm. [...] Các lớp bên trong có thể không khai báo các thành viên tĩnh, trừ khi chúng là các trường liên tục biên dịch (§15.28). ' –

3

Lớp lồng nhau tĩnh tương tác với các thành viên thể hiện của lớp ngoài của nó (và các lớp khác) giống như bất kỳ lớp cấp cao nhất nào khác. Trong thực tế, một lớp lồng nhau tĩnh là hành vi một lớp cấp cao nhất đã được lồng trong một lớp cấp cao nhất để thuận tiện cho việc đóng gói.

49

Có hai sự khác biệt giữa lớp bên trong tĩnh và không tĩnh.

  1. Trong trường hợp khai báo trường và phương thức thành viên, không tĩnh lớp bên trong không thể có trường và phương thức tĩnh. Nhưng, trong trường hợp lớp bên trong tĩnh, có thể có các trường tĩnh và không tĩnh và phương thức.

  2. Ví dụ của lớp bên trong không tĩnh được tạo với tham chiếu đối tượng của lớp ngoài, trong đó nó đã xác định, điều này có nghĩa là nó có trường hợp kèm theo. Nhưng trường hợp của lớp bên trong tĩnh là được tạo mà không có tham chiếu của lớp bên ngoài, có nghĩa là nó không có trường hợp kèm theo.

Xem ví dụ này

class A 
{ 
    class B 
    { 
     // static int x; not allowed here 
    } 

    static class C 
    { 
     static int x; // allowed here 
    } 
} 

class Test 
{ 
    public static void main(String… str) 
    { 
     A a = new A(); 

     // Non-Static Inner Class 
     // Requires enclosing instance 
     A.B obj1 = a.new B(); 

     // Static Inner Class 
     // No need for reference of object to the outer class 
     A.C obj2 = new A.C(); 
    } 
} 
+0

Vì một trong số chúng không tồn tại, sự khác biệt là vô hạn. – EJP

+3

Ví dụ thực sự giúp =) – Micro

+0

Giải quyết Cả hai nghi ngờ (Tĩnh/không tĩnh) trong một Ví dụ, rất gọn gàng! – user3833732

4

Một lớp bên trong không thể tĩnh, vì vậy tôi sẽ viết lại câu hỏi của bạn là "sự khác biệt giữa các lớp lồng nhau tĩnh và không tĩnh là gì?".

như bạn đã nói ở đây lớp bên trong không thể tĩnh ... tôi đã tìm thấy mã bên dưới đang được đưa ra tĩnh .... lý do? hoặc đó là chính xác ....

Có, không có gì trong ngữ nghĩa của loại lồng nhau tĩnh sẽ ngăn bạn làm điều đó. Đoạn mã này chạy tốt.

public class MultipleInner { 
     static class Inner { 
     } 
    public static void main(String[] args) { 
     for (int i = 0; i < 100; i++) { 
      new Inner(); 
     } 
    } 
} 

này là một mã được đăng tại trang web này ...

cho câu hỏi ---> Có thể một tĩnh Nested class được instantiated Nhiều lần?

câu trả lời là --->

Bây giờ, tất nhiên kiểu lồng nhau có thể làm kiểm soát dụ riêng của mình (ví dụ nhà xây dựng tư nhân, Singleton pattern, vv) nhưng điều đó không có gì để làm với thực tế rằng đó là một lồng nhau kiểu. Ngoài ra, nếu kiểu lồng nhau là một enum tĩnh, tất nhiên bạn không thể khởi tạo nó ở tất cả.

Nhưng nói chung, có, loại lồng nhau tĩnh có thể được khởi tạo nhiều lần.

Lưu ý rằng về mặt kỹ thuật, loại lồng nhau tĩnh không phải là loại "bên trong".

11
  1. Lớp bên trong tĩnh không thể truy cập các thành viên không tĩnh của lớp kèm theo. Nó có thể trực tiếp truy cập các thành viên tĩnh (trường instance và các phương thức) kèm theo lớp giống như kiểu thủ tục nhận giá trị mà không tạo đối tượng.

  2. Lớp bên trong tĩnh có thể khai báo cả thành viên tĩnh lẫn không tĩnh. Các phương thức tĩnh có quyền truy cập vào các thành viên tĩnh của lớp chính. Tuy nhiên, nó không thể truy cập các thành viên lớp bên trong không tĩnh. Để truy cập các thành viên của lớp bên trong không tĩnh, nó phải tạo đối tượng của lớp bên trong không tĩnh.

  3. Lớp bên trong không tĩnh không thể khai báo trường tĩnh và phương thức tĩnh. Nó phải được khai báo ở dạng tĩnh hoặc cấp cao nhất. Bạn sẽ nhận được lỗi này khi làm như vậy nói rằng "các trường tĩnh chỉ được khai báo ở dạng tĩnh hoặc cấp cao nhất".

  4. Lớp bên trong không tĩnh có thể truy cập cả thành viên tĩnh và không tĩnh của lớp kèm theo theo kiểu thủ tục nhận giá trị, nhưng không thể truy cập các thành viên của lớp bên trong tĩnh.

  5. Lớp kèm theo không thể truy cập các thành viên của các lớp bên trong cho đến khi nó tạo ra một đối tượng của các lớp bên trong. NẾU lớp chính trong việc truy cập các thành viên của lớp không tĩnh, nó có thể tạo đối tượng của lớp bên trong không tĩnh.

  6. Nếu lớp học chính trong việc tiếp cận các thành viên của lớp bên trong tĩnh nó có hai trường hợp:

    • Trường hợp 1: Đối với các thành viên tĩnh, nó có thể sử dụng tên lớp của lớp bên trong tĩnh
    • Trường hợp 2: Đối với phi thành viên -static, nó có thể tạo ra thể hiện của lớp bên trong tĩnh.
+0

Bạn vui lòng sửa ngữ pháp ở những nơi như "NẾU lớp chính trong việc truy cập các thành viên của lớp không tĩnh" hoặc "Nếu lớp chính trong việc truy cập các thành viên của lớp bên trong tĩnh". Tôi không biết bạn đang cố nói gì ở đó. – nhahtdh

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