【问题标题】:Can an object of a subclass access protected field of another object of another subclass?一个子类的对象可以访问另一个子类的另一个对象的受保护字段吗?
【发布时间】:2016-01-16 19:06:13
【问题描述】:

我从 Core Java, Volume I-Fundamentals (8th Edition) > Chapter 5: Inheritance > 'Protected Access' section (Page 205) 一书中学到了以下内容。

但是,有时您希望将方法限制为 仅允许子类访问,或者不太常见的情况下,允许子类方法访问 超类字段。在这种情况下,您将类功能声明为 受保护。例如,如果超类 Employee 声明 hiredDay 字段为受保护而不是私有,然后是经理 方法可以直接访问它。

但是,Manager 类的方法可以窥探hiredDay 字段的内部 仅包含 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 对象eex 的受保护字段name。这似乎与我上面从书中引用的内容相矛盾,尤其是我用粗体突出显示的部分。

如果这本书有误或我的理解有误,有人可以解释一下吗?如果我的理解有误,您能否提出一个更好的例子来理解这本书的意思?

【问题讨论】:

    标签: java inheritance protected


    【解决方案1】:

    由于您的类都在同一个包中,因此 protected 与 public 相同。

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

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

    【讨论】:

    • 是的,你绝对可以做到。
    猜你喜欢
    • 2011-12-08
    • 2010-12-19
    • 2012-07-22
    • 2016-09-05
    • 2020-01-19
    • 2013-06-06
    相关资源
    最近更新 更多