Tôi cố gắng hiểu tại sao có sự khác biệt giữa khả năng truy cập của các thành viên lớp khi nói về các nhà xây dựng.Khả năng hiển thị của các nhà xây dựng tư nhân Java
Hãy xem xét ví dụ sau:
class A {
static class B {
private B(String s) {}
private void foo() {}
}
static class C extends B {
public C(String s) {
super(s); // call B(String), which is private, and obviously accessible
}
void bar() {
foo(); // compilation error (symbol unknown), as B.foo() is private
}
}
}
cá nhân các thành viên của A
, như là tư nhân, không nên truy cập từ B
. Đối với các trường và phương thức, đúng là như vậy, nhưng có vẻ như các hàm tạo không tuân theo cùng một quy tắc.
Từ JLS-8 (6.6.1. Determining Accessibility), chúng ta có thể đọc:
[...]
Một thành viên (lớp, giao diện, lĩnh vực, hoặc phương pháp) của một loại tài liệu tham khảo, hoặc một constructor của một kiểu lớp, có thể truy cập chỉ khi loại có thể truy cập và thành viên hoặc constructor được khai báo cho phép truy cập:
[...]
Nếu không, thành viên hoặc hàm tạo được khai báo
private
và quyền truy cập chỉ được phép nếu và chỉ khi nó xảy ra trong phần thân của lớp cấp cao nhất (§7.6) bao quanh khai báo của thành viên hoặc hàm tạo.
thể bất cứ ai giải thích cho tôi lý do tại sao các nhà xây dựng có thể truy cập từ C
, ngay cả khi được tuyên bố private
?
Chỉ vì bạn có thể gọi siêu không có nghĩa là hàm tạo có thể truy cập – michaelsnowden
Bất cứ ai có thể giải thích tại sao hàm tạo có thể truy cập từ C, ngay cả khi được khai báo riêng tư? -> Bởi vì cả hai B và C là lớp bên trong của A. Sẽ không làm việc nữa nếu bạn di chuyển B và C bên ngoài A. –
@ JörnBuitink: Nếu đó là trường hợp, thì tại sao 'foo()' * không * có thể truy cập? Dường như có sự mâu thuẫn ở đây. –