Static代碼塊引用問題

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());註釋掉,想要的效果就會出來了。

相關文章
相關標籤/搜索