所以前几天我正在创建一个类,当我意识到它生成了以下工作代码时,使用Eclipse的方法创建了equals方法:
class Test {
private int privateInt;
[...]
public boolean equals(Object obj) {
[...]
Test t = (Test) obj;
if ( t.privateInt == privateInt ) {
[...]
}
}
t.privateInt .. ????它假设是私人的!所以我想除了private,protected,package protected和public之外,还有一个字段可见性。
那么这里发生了什么?怎么称呼? 有人会在哪里使用它?这不会破坏封装吗?如果班级没有改变者并且我改变了这个怎么办?这也发生在C ++上吗?这是一个OO成语吗?如果没有,那为什么Java会这样做呢?
一般来说,我在哪里可以找到相关信息?
谢谢。
答案 0 :(得分:24)
可以从同一个班级的不同实例访问它。
根据this page(bolding mine):
在成员级别,您也可以使用public修饰符或no修饰符(package-private),就像使用顶级类一样,并且具有相同的含义。对于成员,还有两个额外的访问修饰符:private和protected。 private修饰符指定只能在自己的类中访问该成员。
为清楚起见,我会改写这一行:
if ( t.privateInt == this.privateInt )
我们可以同意允许“this.privateInt”:您正在类Test的实例中访问它,消息“equals”已被发送到。
“t.privateInt”应该是可见的不太清楚,因为t是Test类的一个单独实例,我们不在其equals方法中执行。但是java允许这样做,因为两个对象(t和this)属于同一类Test,并且可以看到彼此的私有成员。
答案 1 :(得分:4)
我记得当我刚接触Java时,对此感到惊讶。
答案 2 :(得分:3)
您正在同一个类中引用它。因此,您知道自己在做什么,不需要保护自己。
答案 3 :(得分:3)
允许访问其他实例的私有成员的一个重要原因是允许“复制”功能 - 否则它们几乎是不可能的。另外,如果您不允许其他实例访问,那么您允许使用静态方法?
答案 4 :(得分:1)
可以访问同一个类的另一个实例的私有变量。这是因为您正在直接处理类的实现,这需要您了解其内部的“私有”变量。
答案 5 :(得分:0)
这种混淆的简单答案是要记住私有字段只能在它们初始化(和定义)的类中可见....所以当你在类中创建类的对象时,你可以始终通过对象引用访问该类的私有字段。可能你感觉很困难但只是认为私人领域就像一个公共领域,当你在定义它的类中使用它时。