在对象中可以访问到另一个同类对象的私有属性

今天看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

猜你喜欢

转载自blog.csdn.net/czx2018/article/details/84935933