Java中的私有成员是否与其他编程语言私有成员不同?因为我很惊讶我可以将某种类型的Object传递给compareTo,然后在不使用任何getMethod的情况下访问该Object的私有成员。
E.g。
public class Foo implements Comparable<Foo>{
private int bar;
public Foo() { bar = 1; }
public int compareTo(Foo o) {
if(bar == o.bar)
return 0;
return 1;
}
}
答案 0 :(得分:10)
是的,Java中的私有成员与某些其他语言不同。例如,我不认为 C ++中的等效代码是有效的。
另一方面,它在C#中有效。在从封闭类或嵌套类访问私有成员方面,C#和Java之间仍然存在一些差异,但它们基本相似。
您不应该期望任何两种语言具有相同的行为。值得查阅您实际感兴趣的语言的规范 - 在这种情况下,它是section 6.6 of the JLS。
答案 1 :(得分:3)
尽管我为Java谋生11年,但是当我在两年前发现这个事实时,我吓坏了。我以前一定读过它,但不知何故它从未沉入其中。我同意这一点看起来很怪异,但是当你想到它时,它会变得非常有意义。
OO到底是什么?关于关注点和信息隐藏的分离,对吧?所以在你的设计中,你总是(应该)尽量避免“了解”你自己关心的事情,因为这等于做出假设;你在设计时所知道的事情可能会在以后改变,并使你的班级所做的假设无效。
在这种情况下,你允许Foo访问另一个Foo的私人酒吧,起初感觉就像'了解'Foo之外的事情。但是因为我们正在谈论完全相同类(Foo)的两个实例,所以这实际上不在我们关注的范围之内!例如,如果我们将bar从int更改为double,则我们在同一个类中执行此操作,并且任何编译错误都将立即显示。
另外,想象一下这种访问是被禁止的。那么如果Foo调用自己的compareTo,将'this'作为参数传递呢?然后我们必须禁止Foo访问它自己的私人酒吧?私有静态字段怎么样?那会很混乱,你不同意吗?
也许有点啰嗦,但我希望你能体会到第一次震惊之后,这实际上是有意义的! ( - :
答案 2 :(得分:1)
在Java中,范围基于类,而不是对象。如果某些东西是私有的,则意味着它对该类中定义的代码是可见的 - 即使它是实例的字段,并且代码在另一个实例中执行。
你或许可以认为同一类的对象就像双胞胎彼此分享一切,但是谁会让大多数东西都隐藏在其他人之外。
答案 3 :(得分:1)
我可以传递一些对象 要比较的类型
你没有。您将类型为Foo的对象传递给compareTo()。 Java规则允许访问Foo类中任何Foo的任何成员。 C ++更具限制性,因为您只能访问您自己的 Foo的私有成员。