2012-09-22 39 views
22

Đây là một câu hỏi nhiều hơn câu hỏi. Tôi có đoạn mã sau:phạm vi của hàm tạo riêng tư trong Lớp lồng nhau

public class PrivateBaseConstructor { 
    public static class BaseClass { 
     private BaseClass() { 
     } 

    } 

    public static class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 
} 

Đây là lời kêu gọi super(); tại 1 * được phép sự kiện mặc dù các nhà xây dựng lớp cơ sở là private. Nếu chúng ta viết các lớp học như các lớp riêng biệt trong cùng một gói:

BClass.java 
public class BClass { 
    private BClass() { 

    } 
} 

DClass.java 
public class DClass extends BClass { 
    public DClass() { 
     super(); // 2* 
    } 

Trình biên dịch một cách đúng đắn cho lỗi tại 2 * từ constructor lớp cơ sở là không nhìn thấy được.

Tại sao trình biên dịch không gửi lỗi trong kịch bản đầu tiên của tôi khi cả hai lớp được khai báo tĩnh trong một lớp?

Trả lời

1

Bởi vì mọi thứ được khai báo bên trong một lớp học đều có thể truy cập vào các thành viên riêng của nó, bao gồm cả các lớp bên trong. Tuy nhiên, nếu bạn chạy PMD trên lớp của mình, bạn sẽ thấy nó cho thấy bạn thay đổi khả năng hiển thị của hàm tạo thành không riêng tư.

4

Vì các lớp lồng nhau có thể nhìn thấy các thành viên khác. Điều này không liên quan gì đến các khai báo tĩnh. Xem ví dụ sau về mã của bạn với các lớp bên trong lồng nhau (không phải là tĩnh).

public class PrivateBaseConstructor { 
    public class BaseClass { 
     private BaseClass() {} 
    } 

    public class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 

    public static void main(String[] args) 
    { 
     new PrivateBaseConstructor(). new DerivedClass(); 
    } 
} 

Đọc thêm về các lớp lồng nhau ở đây: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html