今天看String的equals源码的时候发现了一个问题
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
//对象的私有属性居然可以被访问到
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
String的value是一个私有的成员,但是上面代码中anotherString对象的value居然可以被访问到。
虽然不知道这是为什么,就当一个规则来记住吧:在对象中可以访问到另一个同类对象的私有属性。
为了确定这个规则在所有类中都实用,我又写了两个测试来验证。
测试1:
public class Practice {
private String str;
private Practice pra;
public void test() {
//能访问到另一个对象的私有属性
String s = pra.str;
}
}
测试2
public class Practice {
private int score;
public int compareTo(Practice pra) {
//pra的私有成员score也可以被访问到
return this.score - pra.score;
}
}
嗯,测试通过。
话说。。。实际开发中虽然成员变量是私有的,但是一般都会公开对应的get方法。。。像上面的第二个测试,即使不能直接访问score成员,但是可以公开一个getScore方法,其实可以用get方法来访问pra的score。。。这次的发现大概也是没啥实际意义了吧。。。
over