子类的对象可以访问另一个子类的另一个对象的受保护字段吗?

时间:2015-10-18 11:26:41

标签: java inheritance protected

我从“核心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对象namee的受保护字段ex。这似乎与我在本书中引用的内容相矛盾,特别是我用粗体突出显示的部分。

如果这本书出错或者我的理解错了,有人可以解释一下吗?如果我的理解是错误的,你能否提出一个更好的例子来理解这本书的含义?

1 个答案:

答案 0 :(得分:2)

由于您的类都在同一个包中,因此受保护的内容与public相同。

  

protected修饰符指定只能访问该成员   在它自己的包中(与package-private一样),另外,通过   另一个包中其类的子类。

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html