访问同一 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和Parent
、Brother
和Sister
在同一个包里。同一包内的成员始终可见,但使用 private
修饰符除外。
此代码:
public class Sister {
void someMethod() {
Brother brother = new Brother();
brother.age = 18;
}
}
表示您正在 Sister
class 中工作,并且您正在尝试访问 Brother
class 的 age
成员]. Brother
与 Sister
无关,只是它们 意外地 扩展了同一个父 class.
访问 age
成员有效的唯一原因是因为 Brother
和 Sister
在同一个包中。尝试将 Brother
或 Sister
移动到另一个包,您会看到编译器开始报错。
为什么我可以访问和查看 类 内共享相同 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和Parent
、Brother
和Sister
在同一个包里。同一包内的成员始终可见,但使用 private
修饰符除外。
此代码:
public class Sister {
void someMethod() {
Brother brother = new Brother();
brother.age = 18;
}
}
表示您正在 Sister
class 中工作,并且您正在尝试访问 Brother
class 的 age
成员]. Brother
与 Sister
无关,只是它们 意外地 扩展了同一个父 class.
访问 age
成员有效的唯一原因是因为 Brother
和 Sister
在同一个包中。尝试将 Brother
或 Sister
移动到另一个包,您会看到编译器开始报错。