访问同一 parent 字段中的受保护字段?

Access to protected field in field of same parent?

为什么我可以访问和查看 类 内共享相同 parent 的保护区域?我一直认为 protected 只能通过 parent 或 child 本身访问,不能以任何方式从外部访问。

class Parent {

    protected int age;
}

class Sister extends Parent { }

class Brother extends Parent {

    public void myMethod(Sister sister) {
        //I can access the field of my sister,
        // even when it is protected.
        sister.age = 18;
        // Every protected and public field of sister is visible
        // I want to reduce visibility, since most protected fields
        // also have public getters and some setters which creates
        // too much visibility.
    }
}

所以我猜它只受到家庭以外的保护。为什么会这样,除了直接的 parent 和 child 之外,我怎么能对家人隐藏一些东西呢?在我看来,我们似乎缺少访问成员修饰符。像 family 这样的东西实际上应该是 protected 并且应该对除 child 和 parent 之外的所有人隐藏。我没有要求任何人重写 Java,只是注意到。

修饰符用于 类。你的兄弟也是 parent,所以它可以访问 parent.age,因为那个字段是受保护的。所讨论的实际 object 是 this 兄弟、另一个兄弟、姐妹或任何其他 parent 都没有关系。

documentation 您可以看到以下行为:public, protected, and private

public表示每个人都可以view/alter。

protected表示它的包和子classes可以view/alter它

private表示其为class只为view/alter而已。

此外,check here 提供示例和易于理解的描述

编辑:

根据经验,当 "oneClass" 是 "anotherClass" 时,认为 class 扩展了另一个,你所写的意思是 "brother" 是 "parent",而它应该是 "brother" 是 "person" 而 "sister" 是 "person".

现在,两者同时是 brother/sister 和父级,导致您对要执行的操作有些困惑

编辑 2:

class parent{
   private String age;
}

如果Brother和Sister与Parent不在同一个包中,则其他实例的受保护变量age不可见。参见 Why can't my subclass access a protected variable of its superclass, when it's in a different package?

示例:

package test.family.parent;

public class Parent {
    protected int age;
}


package test.family.child;
import test.family.parent.Parent;

public class Brother extends Parent {

public void test(){
        this.age = 1;
        Brother brother = new Brother();
        brother.age = 44; // OK
        Sister sister = new Sister();
        sister.age = 44;  // does not compile
    }
}

package test.family.child;
import test.family.parent.Parent;

public class Sister extends Parent {

    public void test(){
        this.age = 1;
        Brother brother = new Brother();
        brother.age = 44;  // does not compile
        Sister sister = new Sister();
        sister.age = 44;   // OK
    }
}

在此示例中,Sister 可以访问自己和其他实例的年龄,但不能访问 Brother

的年龄

那是因为class和ParentBrotherSister在同一个包里。同一包内的成员始终可见,但使用 private 修饰符除外。

此代码:

public class Sister {

    void someMethod() {
        Brother brother = new Brother();
        brother.age = 18;
    }
}

表示您正在 Sister class 中工作,并且您正在尝试访问 Brother class 的 age 成员]. BrotherSister 无关,只是它们 意外地 扩展了同一个父 class.

访问 age 成员有效的唯一原因是因为 BrotherSister 在同一个包中。尝试将 BrotherSister 移动到另一个包,您会看到编译器开始报错。