欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面向对象的访问控制基于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的了。

相关标签: Java 控制权限