3

例如,我们有类Man

如果Man.age受保护,那么我不明白为什么chuckNorris(类的实例Man)可以更改对象的受保护/私有属性agejackBauer类的另一个实例Man)。他不应该这样做(IMO)。

在我看来,受保护/私有属性的应该只属于对象本身,而不是......

我想我需要一些解释,我很困惑。

4

3 回答 3

2

马修是对的。cuckNorris 可以做 jackBauer.age

但这没有问题。如果您在 Man 中引用 Man 实例属性,则意味着您正在编写 Man 类,因此您知道自己在做什么。

问题是如果你把 Man 类传给我,我可以在不知道 Man 类是如何编码的情况下访问 Man 属性。

Setter 和 getter 可能正在做一些我不知道也不需要知道的业务逻辑。但是给妈妈编码的人确实知道。

于 2012-01-22T10:56:57.647 回答
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参数标记为 unchangeable ,但在 Java 中则不然——我觉得这没什么大不了的。

[*} 您可以通过将 的所有字段标记Base为最终字段,但在构造对象后,即使实例本身也无法更改成员。

于 2010-10-08T20:20:31.393 回答
0

私有属性只能通过类中的方法访问。受保护的属性只能在后代类中访问。因此,对象jackbauer 不能修改Man 类对象chuckNorris 中的任何私有或受保护的内容。希望这会有所帮助

于 2010-10-07T18:18:13.153 回答