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

时间:2015-07-27 13:49:50

标签: java access-levels

为什么我可以访问并查看共享同一父级的类中的保护字段?我总是认为受保护只能通过父母或孩子本身访问,而不是以任何方式访问。

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 个答案:

答案 0 :(得分:3)

这是因为课程ParentBrotherSister位于同一个包中。除private修饰符外,同一包中的成员始终可见。

此代码:

public class Sister {

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

表示您正在使用Sister课程,并且从那里开始,您正在尝试访问age课程的Brother成员。 BrotherSister无关,除非他们意外地扩展同一个父类。

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

答案 1 :(得分:2)

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

public表示每个人都可以查看/更改它。

protected表示它的包和子类可以查看/更改它

private表示仅为了查看/更改它而在类中使用。

此外,check here示例和易于理解的说明

编辑:

根据经验,认为一个类在" oneClass"是一个"另一个类",你所写的意味着"兄弟"是一个父母",而它应该是"兄弟"是一个" person"和姐姐"是一个"人"。

现在,他们同时是兄弟/姐妹和父母,导致你想要表现的一些混乱

编辑2:

class parent{
   private String age;
}

答案 2 :(得分:2)

如果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

的年龄

答案 3 :(得分:0)

修饰符适用于类。你的兄弟也是父母,所以它可以访问parent.age,因为该字段受到保护。如果所讨论的实际对象是this兄弟,另一个兄弟,姐妹或任何其他父母,那无关紧要。