针对What is your longest-held programming assumption that turned out to be incorrect?问题,错误的假设之一是:你能解释一下关于封装的东西吗?
私有成员变量是 私有的实例,而不是 类。
(Link)
我没听清楚他在说什么,任何人都可以解释一下什么是错/右关于用一个例子?
针对What is your longest-held programming assumption that turned out to be incorrect?问题,错误的假设之一是:你能解释一下关于封装的东西吗?
私有成员变量是 私有的实例,而不是 类。
(Link)
我没听清楚他在说什么,任何人都可以解释一下什么是错/右关于用一个例子?
public class Example {
private int a;
public int getOtherA(Example other) {
return other.a;
}
}
像这样。正如你所看到的,私有不会保护实例成员不被另一个实例访问。
顺便说一句,只要你有点小心,这并不全是坏事。 如果private不像上面的例子那样工作,编写equals()和其他类似的方法会很麻烦。
因此,私人成员对于该类是私有的,并且一个实例可以访问另一个实例的私有成员,对吗? – 2009-08-31 13:42:06
是的,这是正确的。 – 2009-08-31 13:51:04
好的,非常感谢! – 2009-08-31 13:53:00
示例代码(JAVA):
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return this.value == other.value; // <------------
}
}
如果假设“私有成员变量是私有的实例”是正确的,该标线会导致编译器错误,因为other.value
领域是私人和部分与正在调用equals()
方法的对象不同。
但由于在Java中(和有知名度的概念大多数其他语言)private
能见度每级,访问现场被允许在MutableInteger
的所有代码,不相关被用来调用它什么实例。
这里是Michael Borgwardt's answer你当等效不能够访问其他对象的私有字段:
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return other.valueEquals(this.value); // <------------
}
@Override // This method would probably also be declared in an interface
public boolean valueEquals(int oValue) {
return this.value == oValue;
}
}
如今这是熟悉的Ruby程序员,但我已经在Java中一直这样做一会儿。我不想依赖访问另一个对象的私有字段。请记住,另一个对象可能属于一个子类,它可以将值存储在不同的对象字段中,或存储在文件或数据库等中。
这与封装有关吗? – p4bl0 2009-08-31 13:41:31
私有可见性是如何在诸如Java,C++和C#语言中实现封装的。# – 2009-08-31 13:43:44
@ p4bl0封装和变量作用域如何相关?相当根本。 – meagar 2010-10-07 16:38:39