1

为什么我可以访问和查看共享同一父级的类中的保护区域?我一直认为 protected 只能通过父级或子级本身访问,而不能以任何方式在外部访问。

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.
    }
}

所以我想它只受到家庭之外的保护。为什么会这样?我怎么能对除了直接父母和孩子以外的家庭成员隐藏一些东西?在我看来,我们似乎缺少访问成员修饰符。除了孩子和父母之外,应该对所有人隐藏类似family应该和受保护的东西。protected我不是要求任何人重写 Java,只是注意到。

4

4 回答 4

3

那是因为类Parent,BrotherSister在同一个包中。同一个包中的成员总是可见的,除了private修饰符。

这段代码:

public class Sister {

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

表示您正在Sister课堂上工作,并从那里尝试访问该课堂的age成员。与 无关,只是它们意外扩展了同一个父类。BrotherBrotherSister

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

于 2015-07-27T14:15:57.040 回答
2

文档中,您可以看到以下行为:public, protected, and private

public意味着每个人都可以查看/更改它。

protected意味着它的包和子类可以查看/更改它

private意味着它只能让班级查看/更改它。

此外,请在此处查看示例和易于理解的描述

编辑:

根据经验,当“oneClass”是“anotherClass”时,认为一个类扩展了另一个,你写的意思是“兄弟”是“父母”,而应该是“兄弟”是“人” ”和“姐姐”是一个“人”。

现在,两者同时是兄弟/姐妹和父母,导致您对要执行的操作有些困惑

编辑2:

class parent{
   private String age;
}
于 2015-07-27T14:07:22.033 回答
2

如果 Brother 和 Sister 与 Parent 不在同一个包中,则age 其他实例的 protected 变量是不可见的。请参阅为什么我的子类在不同的包中时不能访问其超类的受保护变量?

例子:

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

于 2015-07-27T14:11:56.920 回答
0

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

于 2015-07-27T13:51:22.417 回答