本帖最后由 li385805776 于 2014-05-18 09:49:56 编辑

解决方案 »

  1.   

    我觉得这是一个关于JAVA深拷贝和浅拷贝的问题。
    public Object clone() {
            try {
                HashSet<E> newSet = (HashSet<E>) super.clone();  //(1)
                newSet.map = (HashMap<E, Object>) map.clone();   //   (2)
                return newSet;
            } catch (CloneNotSupportedException e) {
                throw new InternalError();
            }
        }
    其中(1)处是产生一个和当前HashSet对象一样的对象newSet,但是这个newSet对象里面的map引用指向的仍然是当前对象的map。所以需要(2)这行代码重新拷贝一个HashMap<E,Object>对象。这才算拷贝完成!
    至于你说的测试代码,我说一下程序执行流程,你可以设置断点跟一下!
    new Test().visitNewA()
    等价于:
    创建一个Test对象,其中a=10。
    然后这个对象调用visitNewA()方法——new   Test(11).a
    方法内部创建一个Test局部对象,按照JAVA对象的初始化流程,a先等于10,然后等于11。然后这个局部对象访问它的成员属性a即为11.
      

  2.   

    1楼差不多都解释了,我个人的理解,a作为类的一个私有属性,在当前类中,当然可以访问a了,如果在其它类的,实例Test类,那么,此时就访问不了,要设置为公共属性才行。
      

  3.   

    “a作为类的一个私有属性,在当前类中,当然可以访问a了”,有没有权威一点的出处,主要是为什么可以new Test().a 可以访问a
      

  4.   

    这是Java语言的规定,就是这样的
    详见Java Language Specification
    http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6
    其中说明了明确了在包括这个private成员的最顶级Class里都是可以访问这个private成员的
      

  5.   

    Exactly,it's a simple question about access control of fields.
      

  6.   

    明确了在包括这个private成员的最顶级Class里都是可以访问这个private成员的大概有点感觉了,谢谢