我从“核心Java,第一卷 - 基础知识(第8版)”一书中了解到以下内容。第5章:继承> “受保护的访问”部分(页205)。
但是,有时您希望将方法限制为 仅限子类,或者不太常见,允许子类方法访问 一个超类字段。在这种情况下,您将类功能声明为 保护。例如,如果超类Employee声明了 hireDay字段作为受保护而非私有,然后是经理 方法可以直接访问它。
然而, Manager类方法可以窥视hireDay字段 仅限Manager对象,而不是其他Employee对象。这 限制是为了使您不能滥用受保护机制 并形成子类只是为了获得对受保护字段的访问。
我编写了以下代码来测试它。
class Employee
{
protected String name;
public Employee(String name) {
this.name = name;
}
}
class Manager extends Employee
{
public Manager(String name) {
super(name);
}
public void peekName(Employee e) {
System.out.println("name: " + e.name);
}
}
class Executive extends Employee
{
public Executive(String name) {
super(name);
}
}
public class TestProtectedAccess
{
public static void main(String[] args) {
Employee e = new Employee("Alice Employee");
Manager m = new Manager("Bob Manager");
Executive ex = new Executive("Charles Executive");
// Manager object accessing protected name of Employee object
m.peekName(e);
// Manager object accessing protected name of Executive object
m.peekName(ex);
}
}
代码的输出是:
$ java TestProtectedAccess
name: Alice Employee
name: Charles Executive
Manager对象m
能够访问其他Employee对象name
和e
的受保护字段ex
。这似乎与我在本书中引用的内容相矛盾,特别是我用粗体突出显示的部分。
如果这本书出错或者我的理解错了,有人可以解释一下吗?如果我的理解是错误的,你能否提出一个更好的例子来理解这本书的含义?
答案 0 :(得分:2)
由于您的类都在同一个包中,因此受保护的内容与public相同。
protected修饰符指定只能访问该成员 在它自己的包中(与package-private一样),另外,通过 另一个包中其类的子类。
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html