static代码块里的内容是在类初次调用时就初始化的一堆代码,如果代码块里初始化的是对象,当后期改变对象的属性时,代码块里初始的这些对象的值会跟着改变吗?!我预想的是跟着改变的,因为是同一个对象,即同一个引用。但素……我就写一个简单的测试小程序,结果就不如我愿。
1.实体类Person.java:
package StaticTest;public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person() { } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return name + "--" + age; }}
2.测试类Test3.java:
package StaticTest;import java.util.Collection;import java.util.HashMap;import java.util.Map;public class Test3 { private static Mapmap = new HashMap (); static { map.put("a", new Person("hui", 1)); map.put("b", new Person("bao", 2)); System.out.println("Test3" + map); } public static Collection getMap() { return map.values(); } public static Map change() { Map map1 = new HashMap (); map1.put("a", new Person("huihui", 3)); map1.put("b", new Person("baobao", 4)); map.putAll(map1); return map; } public static Map change2() { Person a = map.get("a"); a.setName("huihuihui"); Person b = map.get("b"); b.setName("baobaobao"); return map; } public static void main(String[] args) { System.out.println(change()); System.out.println(map); System.out.println(change2()); System.out.println(map); }}
3.测试类Test33.java:
package StaticTest;import java.util.HashMap;import java.util.Map;public class Test33 { private static Mapmap = new HashMap (); static { for (Person o : Test3.getMap()) { map.put(o.getName(), o); } System.out.println("Test33" + map); } public static void main(String[] args) { System.out.println(Test3.change()); System.out.println(map.values()); System.out.println(Test3.change2()); System.out.println(map.values()); }}
测试结果如下:
Test3{a=hui--1, b=bao--2}
Test33{bao=bao--2, hui=hui--1}
{a=huihui--3, b=baobao--4}
[bao--2, hui--1]
{a=huihuihui--3, b=baobaobao--4}
[bao--2, hui--1]
即无论调用change()还是change2(),map.values始终是改变前的值。change()不改变正常,因为添加的Person对象是重新new的,但change2()不应该啊。多番思考、询问,最后发现问题出在:首先调用了change(),这导致map里指向的对象已经发生改变。
图如下:
map-->a-->p1
map-->b-->p2
然而当调用了change()后,a不再指向p1,b也不再指向p2了,所以,这时候,即便你再调用change2()方法,将拿到的对象重新set属性,set的也是后来指向的对象了,不再是修改的p1和p2的属性,故map.values始终不变。
这时将System.out.println(Test3.change());注释掉,想要的效果就会出来了。