面向对象的访问控制基于class而不是对象
程序员文章站
2022-07-14 15:32:25
...
最近遇到个很有意思的问题,原来一直没太注意。这个问题是面向对象的访问控制是基于class还是对象。先写个例子。现在有个一类A如下:
class A {
private String str;
public A(String str) {
this.str = str;
}
public void print(A a) {
a.private_method();
}
private void private_method() {
System.out.println(str);
}
}
在方法里调用如下:
public static void main(String[] args) {
A a1 = new A("a1");
A a2 = new A("a2");
a2.print(a1);
a1.print(a2);
}
这么做编译通过,并且顺利执行。这就出现了一个很有意思的现象,实例a1和a2都能调用对方的private_method()方法。无论是Java还是C++,都是这样的情况。
从程序的实现角度来说,调用方法和类属性的本质,是通过“特征”在对象所加载的堆区寻找合适的方法和属性。而“特征”则是由class模板定义的,所以无论根据同一个class模板new出多少个新对象,所包含的“特征”都是相同的。这就是访问控制是根据class来而不是Object来的。参考了JDK的文档,的确也是这么说的。
针对刚刚的例子略做修改就更容易理解了:
class A {
private String str;
public A(String str) {
this.str = str;
}
public static void print(A a) {
a.private_method();
}
private void private_method() {
System.out.println(str);
}
}
调用如下:
public static void main(String[] args) {
A a1 = new A("a1");
A a2 = new A("a2");
A.print(a1);
A.print(a2);
}
这样就可以很清楚的知道,访问权限的控制是基于class的了。
上一篇: SpringBoot———@注解