Tôi đã thấy nhiều bài viết về sự khác biệt giữa các phần bổ trợ riêng tư được bảo vệ và gói. Một điều tôi nhận thấy mâu thuẫn giữa hai bài viết nàysự khác biệt giữa các bộ sửa đổi truy cập được bảo vệ và gói riêng tư trong Java?
Isn't "package private" member access synonymous with the default (no-modifier) access?
Trong câu trả lời chấp nhận nói rằng
Các modifier bảo vệ xác định rằng các thành viên chỉ có thể được truy cập trong gói riêng của mình (như với gói-riêng) và, ngoài ra, bởi một lớp con của lớp của nó trong một gói khác.
Why the protected modifier behave differently here in Java subclass?
Trong câu trả lời chấp nhận nói rằng
Để đáp ứng truy cập ở mức bảo vệ hai điều kiện phải được đáp ứng:
- Các lớp phải nằm trong cùng một gói .
- Phải có mối quan hệ kế thừa.
Chẳng phải họ trái ngược nhau? từ sự hiểu biết của tôi về các bài viết khác, bài đăng đầu tiên đưa ra câu trả lời chính xác được bảo vệ == gói-riêng + phân lớp trong gói khác.
Nếu tuyên bố này là đúng, thì tại sao mã này không thành công với thông báo lỗi sau trên lớp con mèo của tôi trên đường dây 17
The method testInstanceMethod() from the type Animal is not visible
mã của tôi cho siêu và lớp dưới.
package inheritance;
public class Animal {
public static void testClassMethod() {
System.out.println("The class" + " method in Animal.");
}
protected void testInstanceMethod() {
System.out.println("The instance " + " method in Animal.");
}
}
package testpackage;
import inheritance.Animal;
public class Cat extends Animal{
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
myAnimal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Hãy làm rõ lý do mã ở trên không thành công. Điều đó sẽ rất hữu ích. Cảm ơn
Bạn phải là một Cat để sử dụng testInstanceMethod(). Casting to Animal hạn chế quyền truy cập vào phương thức đó đối với gói lavel và vì gói chính của bạn nằm trong gói khác nên mã không thành công. (Tôi nghĩ rằng nó thậm chí sẽ không biên dịch). Có phương pháp ở đó nhưng bạn không có quyền truy cập nó vì nó được khai báo trong Animal bằng cách bảo vệ. – PSIXO
Tuyên bố thứ hai nên được xây dựng là: * "Để thỏa mãn mức độ truy cập được bảo vệ, ** một trong hai điều kiện phải được đáp ứng ..." * (Xem thêm bình luận tôi đã đưa ra bên dưới câu trả lời đó.) – aioobe