2011-05-12 86 views
4

Java中的私有成员是否与其他编程语言私有成员不同?因为我很惊讶我只能将某种类型的对象传递给compareTo,然后访问该对象的私有成员而不使用任何getMethod。Java中的私人成员

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

在Smalltalk中,私有的边界不是类,而是对象(如预期的那样)。 – scravy 2012-06-20 21:26:13

回答

3

即使我为Java生活11年,当我在两年前发现这个事实时,我吓了一跳。我以前一定读过它,但不知怎的,它从来没有沉入其中。我同意这个看起来很奇怪,但是当你考虑一下它时,它会变得非常有意义。

什么是OO?关于问题和信息隐藏的分离,对吗?因此,在你的设计中,你总是(应该)尽量避免在你自己关心的事情之外“知道”事情,因为这等于做出了假设;在设计时你所“知道”的事情可能会在以后发生变化,并使你的班级正在制定的假设无效。

在这种情况下,您允许Foo访问另一个Foo的私人酒吧,这个酒吧最初感觉就像“知道”Foo关注的事情。但是因为我们正在谈论两个完全相同的类(Foo),所以这实际上并不在我们的担忧之外!例如,如果我们将bar从int更改为double,我们在同一个类中这样做,并且任何编译错误都会立即显示出来。

此外,想象这种访问被禁止。那么,如果Foo称自己的compareTo,传递'this'作为参数呢?那么我们将不得不禁止Foo访问它自己的私人酒吧?那么私人静态字段呢?这会很混乱,你不同意吗?

也许有点啰嗦,但我希望你能体会到第一次震动后,这实际上是有道理的! ( - :

10

是,在Java中的私有成员来自不同一些其他语言。例如,我不认为认为在C++中的等效代码将是有效的。

另一方面,它将在C#中有效。在从封闭或嵌套类访问私有成员方面,C#和Java之间仍然存在一些差异,但它们基本上是相似的。

你不应该期望任何两种语言具有相同的行为。值得咨询你真正感兴趣的语言规范 - 在这种情况下,它是section 6.6 of the JLS

+0

不,但它有点粉碎有私有变量的想法,不是吗? – starcorn 2011-05-12 08:25:18

+1

@starcom,为什么?我想,你有一间私人卧室,然而那种混乱并不意味着你必须睡在地板上。这只意味着没有人可以在那里睡觉。 – Ingo 2011-05-12 08:27:15

+1

那么,'private'具有词法范围,不是动态的。这是一个定义和实施的问题。 – musiKk 2011-05-12 08:27:38

1

在Java中,作用域基于类而不是对象。如果某些内容是私有的,则意味着它对该类中定义的代码可见 - 即使它是实例的字段,并且代码正在另一个实例中执行。

你也许可以将同一班级的对象想象成双胞胎一样彼此分享一切,但是谁又会将大多数事物都隐藏起来。

1

我可以只通过一些 类型的对象的compareTo

你没你通过Foo类型的对象的compareTo()的Java的允许访问的规则。到Foo类中的任何Foo的成员,C++更具限制性,因为您只能访问您自己的 Foo的私有成员。