为什么我可以访问并查看共享同一父级的类中的保护字段?我总是认为受保护只能通过父母或孩子本身访问,而不是以任何方式访问。
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,只是注意到了。
答案 0 :(得分:3)
这是因为课程Parent
,Brother
和Sister
位于同一个包中。除private
修饰符外,同一包中的成员始终可见。
此代码:
public class Sister {
void someMethod() {
Brother brother = new Brother();
brother.age = 18;
}
}
表示您正在使用Sister
课程,并且从那里开始,您正在尝试访问age
课程的Brother
成员。 Brother
与Sister
无关,除非他们意外地扩展同一个父类。
访问age
成员的唯一原因是有效的,因为Brother
和Sister
位于同一个包中。尝试将Brother
或Sister
移动到另一个包中,您将看到编译器开始抱怨。
答案 1 :(得分:2)
从documentation您可以看到以下行为:public, protected, and private
public
表示每个人都可以查看/更改它。
protected
表示它的包和子类可以查看/更改它
private
表示仅为了查看/更改它而在类中使用。
此外,check here示例和易于理解的说明
现在,他们同时是兄弟/姐妹和父母,导致你想要表现的一些混乱
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
兄弟,另一个兄弟,姐妹或任何其他父母,那无关紧要。