为什么您可以访问和操作您自己班级的私人会员

时间:2014-08-19 15:07:34

标签: java access-violation

当涉及到复制构造函数以及许多其他情况时,它是有道理的,是的。但为什么允许这样做呢?

如果在类中创建静态或非静态方法,则可以操纵变量的值。

public class CopyMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestClass tc = new TestClass(1); //val = 1
        TestClass.manipulate(tc); //val = 5
        TestClass.foo(tc); //print out 5

        TestClass tc2 = new TestClass(tc); //tc,s val will be 6 afterwards
        TestClass.foo(tc); //print out 6
    }
}


class TestClass{
    private int val;

    public TestClass(int val){
        this.val = val;
    }

    public TestClass(TestClass t){
        this.val = t.val;
        t.val = 6;
    }

    public static void foo(TestClass tc){
        System.out.println(tc.val);
    }

    public static void manipulate(TestClass tc){
        tc.val = 5;
    }
}

值的读写是在类(context?)中写的。但是它不会影响我想要私密的访问限制吗?我没有访问对象自己的值(比如getter / settter),但我是用参数给出的对象。

2 个答案:

答案 0 :(得分:1)

允许此访问的原因是允许您实现equalsclone之类的方法,这些方法必须访问同一类的另一个实例的私有数据成员才能执行此操作他们的工作。

示例:

public Object clone ()
{
    MyClass other = new MyClass ();
    other.somePrivateMember = this.somePrivateMember;
    ...
    return other;
}

答案 1 :(得分:0)

Java是经过精心设计的(作为对C ++的反应,其价值很高)。

如果你在课堂上,那么private有两种选择:

  1. 允许班级内部访问所有实例的私人内容。

  2. 仅允许访问此私人会员。

  3. 所以决定只在另一个实例的上下文中有意义。 禁止意味着您需要public方法,可能需要内部,非公开操作。

    因此1.做出了合乎逻辑的选择:不要暴露太多,不需要管道,而且它对JVM更有效,并且在编码时是对称的。