Tôi muốn hiểu những gì đang xảy ra trong ví dụ bên dưới (nơi một thành viên được bảo vệ đang được truy cập từ bên ngoài gói thông qua một lớp con).Java: truy cập được bảo vệ qua các gói
Tôi biết đối với các lớp bên ngoài gói, lớp con chỉ có thể xem thành viên được bảo vệ thông qua kế thừa.
Có hai gói: package1
và package2
.
package1
:ProtectedClass.java
package org.test.package1; public class ProtectedClass { protected void foo() { System.out.println("foo"); } }
package2
:ExtendsprotectedClass.java
package org.test.package2; import org.test.package1.ProtectedClass; public class ExtendsprotectedClass extends ProtectedClass { public void boo() { foo(); // This works, // since protected method is visible through inheritance } public static void main(String[] args) { ExtendsprotectedClass epc = new ExtendsprotectedClass(); epc.foo(); // Why is this working? // Since it is accessed through a reference, // foo() should not be visible, right? } }
package2
:UsesExtendedClass.java
package org.test.package2; public class UsesExtendedClass { public static void main(String[] args) { ExtendsprotectedClass epc = new ExtendsprotectedClass(); epc.foo(); // CompilationError: // The method foo() from the type ProtectedClass // is not visible } }
Điều này được hiểu rằng boo()
phương pháp trong ExtendsprotectedClass
có thể truy cập foo()
, kể từ khi các thành viên bảo vệ có thể được truy cập thông qua thừa kế duy nhất.
Câu hỏi của tôi là, tại sao phương pháp foo()
làm việc tốt khi truy cập thông qua một tài liệu tham khảo trong phương pháp main()
của ExtendsprotectedClass
nhưng sẽ không làm việc khi truy cập thông qua epc
tham chiếu trong UsesExtendedClass
?
@Jon Cảm ơn. Tôi hiểu rằng các thành viên lớp của phân lớp có thể truy cập các thành viên được bảo vệ (như được chỉ rõ trong phương thức 'boo()'). Nhưng đã tò mò muốn biết tại sao nó được phép truy cập vào thành viên được bảo vệ thông qua một tham chiếu của lớp con, ** CHỈ ** trong các phương thức lớp con? bất kỳ lý do nào đằng sau nó? – JWhiz
@JWhiz: Chỉnh sửa ... –
2) Hoạt động vì phương pháp được bảo vệ được truy cập bởi một con trỏ của lớp riêng của nó. Điều này sẽ không thành công:
void tĩnh công khai ExtendsprotectedClass.main (String [] args) { ProtectedClass epc = new ExtendsprotectedClass(); // upcast
epc.foo(); // nên là lỗi biên dịch?
} –