关于HashSet的一个奇葩问题 本帖最后由 li385805776 于 2014-05-18 09:49:56 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我觉得这是一个关于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. 1楼差不多都解释了,我个人的理解,a作为类的一个私有属性,在当前类中,当然可以访问a了,如果在其它类的,实例Test类,那么,此时就访问不了,要设置为公共属性才行。 “a作为类的一个私有属性,在当前类中,当然可以访问a了”,有没有权威一点的出处,主要是为什么可以new Test().a 可以访问a 这是Java语言的规定,就是这样的详见Java Language Specificationhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6其中说明了明确了在包括这个private成员的最顶级Class里都是可以访问这个private成员的 Exactly,it's a simple question about access control of fields. 明确了在包括这个private成员的最顶级Class里都是可以访问这个private成员的大概有点感觉了,谢谢 文字编码转换 super.paintComponent(g)绘制的背景上如何添加组件 ``二维数组上的小问题..请教高手.. 新手超级简单问题,白送分 简单问题 在javabean中,为什么SET方法前面有this,而get方法却没有? HelloWorld级的问题 在applet中增加了任何一个控件的事件监听代码框架后,发布到weblogic后,访问时IE报错。 再问一个弱问题???????????????????????? 怎样用Java编程调用微软的Word? 有没有人愿意加入开源项目db-unifier 一道老题 求详解
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.
详见Java Language Specification
http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6
其中说明了明确了在包括这个private成员的最顶级Class里都是可以访问这个private成员的