例如,我们有班级Man
如果Man.age
受到保护,那么我不明白为什么chuckNorris
(类Man
的实例)可以更改对象的受保护/私有属性age
{ {1}}(类jackBauer
的另一个实例)。他不应该这样做(IMO)。
在我看来,受保护/私有属性的值应该只属于对象本身,而不属于类。 ..
我想要一些解释,我很困惑。
答案 0 :(得分:2)
Matthieu是对的。 cuckNorris可以做jackBauer.age
但是没有问题。如果您在Man中引用Man实例属性,那意味着您正在编写Man类,因此您知道自己在做什么。
问题是如果你传给我Man类,我可以访问Man属性而不知道Man类是如何编码的。
Setter和getter可能正在做一些我不知道的业务逻辑,我不需要知道。但编码Mam的人确实知道。
答案 1 :(得分:1)
考虑这个Java类:
public class Base {
private int a
protected int b;
public Base(int a,int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
}
...
Base foo = new Base(1,2);
Base bar = new Base(3,4);
foo
实例无法改变bar
中的受保护或私有变量
如果你愿意,你可以允许它,
public class Base {
private int a
protected int b;
public Base(int a,int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
public void changeB(int newB,Base other) {
other.b = newB;
}
}
...
Base foo = new Base(1,2);
Base bar = new Base(3,4);
foo.changeB(5,bar);
您无法保护changeB
方法不会更改other
对象[*]中的内容,您只需要注意程序的功能。对于某些语言,您可以将other
参数标记为不可更改,但不能用Java标记 - 我认为这不是什么大问题。
[*}你可以通过将Base
的所有字段标记为final,尽管在构造对象之后甚至实例本身都不能更改成员。
答案 2 :(得分:0)
私有属性只能通过类中的方法访问。 受保护的属性仅在后代类中是accessibe。因此,对象jackbauer不能修改私人或受保护的对象chuckNorris类Man。希望这会有所帮助