static代碼塊裏的內容是在類初次調用時就初始化的一堆代碼,若是代碼塊裏初始化的是對象,當後期改變對象的屬性時,代碼塊裏初始的這些對象的值會跟着改變嗎?!我預想的是跟着改變的,由於是同一個對象,即同一個引用。但素……我就寫一個簡單的測試小程序,結果就不如我願。
java
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:ide
package StaticTest; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class Test3 { private static Map<String, Person> map = new HashMap<String, Person>(); static { map.put("a", new Person("hui", 1)); map.put("b", new Person("bao", 2)); System.out.println("Test3" + map); } public static Collection<Person> getMap() { return map.values(); } public static Map<String, Person> change() { Map<String, Person> map1 = new HashMap<String, Person>(); map1.put("a", new Person("huihui", 3)); map1.put("b", new Person("baobao", 4)); map.putAll(map1); return map; } public static Map<String, Person> 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 Map<String, Person> map = new HashMap<String, Person>(); 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()); } }
測試結果以下:ui
Test3{a=hui--1, b=bao--2}this
Test33{bao=bao--2, hui=hui--1}spa
{a=huihui--3, b=baobao--4}code
[bao--2, hui--1]對象
{a=huihuihui--3, b=baobaobao--4}get
[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());註釋掉,想要的效果就會出來了。