Java 中类的实例可以访问其自身类型的不同实例的私有字段,如以下列表所示:
public class Foo {
private int secret;
public void bar(final Foo foo) {
foo.secret = 100;
}
}
这种语义的论据是什么(在设计语言时)?
首先你必须问“为什么要有私有字段?”
私有字段主要用于封装:类的使用者不必知道该类实现的内部结构,事实上,这些内部结构应该主动对使用者隐藏。否则,如果用户依赖这些内部结构,那么实现者将被迫支持它们或破坏向后兼容性。换句话说,它保护了类的用户和设计者:
但是类不需要保护其自身;它可以是类的一部分。它不需要担心其代码的一位发生更改,但另一位(使用第一位)无法更改的情况。向后兼容性不是问题,因为该类是作为单个原子代码块开发和部署的。换句话说,上述两种保护都不需要。
由于不需要保护字段,并且经常需要查看它们(例如,比较两个对象是否相等),因此它们在类中可见。
private
字段的目的是告诉其他程序员不要搞乱它。
想必,在单个类中工作的每个人都知道所有变量的作用。
private
字段不会对您隐藏您自己的代码,只是对外部隐藏。
您可以复制/比较值而无需额外的 getter 并更改字段而无需 setter。不知道 JVM 中是否对这种简单的方法调用进行了优化,但如果没有,则会产生一些开销。
人们可能认为保持这种“开放”访问可能会导致一些安全问题,但是在实现类时,您提供了操作这些变量的所有方法。没有人可以从扩展此类的类中更改它们。事实上,它们仍然是私有的 - 只能通过您的代码访问。
还要记住,从逻辑上讲,一个类通常注定要做一项工作。共享一些信息并方便访问可能是有益的,特别是在生成大量实例的情况下。在处理需要更多控制的情况时,总是可以使用包访问修饰符(从某种意义上来说,这更“私有”......)或使用单例/工厂模式限制实例数量。
要添加其他正确且已接受的答案,此页面在此主题/问题中包含有用的信息:
新的 Java 程序员可能会问一个 Alpha 对象是否可以访问另一个 Alpha 对象的私有成员。以下示例对此进行了说明。假设 Alpha 类包含一个实例方法,该方法根据 iamprivate 变量将当前 Alpha 对象 (this) 与另一个对象进行比较:
class Alpha {
private int iamprivate;
boolean isEqualTo(Alpha anotherAlpha) {
if (this.iamprivate == anotherAlpha.iamprivate)
return true;
else
return false;
}
}
这是完全合法的。同一类型的对象可以访问彼此的私有成员。这是因为访问限制适用于类或类型级别(类的所有实例),而不是对象级别(类的特定实例)。