面向对象的访问控制基于class而不是对象

        最近遇到个很有意思的问题,原来一直没太注意。这个问题是面向对象的访问控制是基于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的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值