今天在修一个 feature 的时候,掉进了一个很初级的坑中而不自觉,debug 了好久才发现的,汗颜
问题简化
求解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Person { private Map<String , Integer> map;
public Map<String, Integer> getMap() { return map; } }
public class TestScope { public static void main(String[] args) { Person person = new Person();
Map<String, Integer> tmp = person.getMap(); System.out.println(tmp); System.out.println(person.getMap());
tmp = new HashMap<>(); tmp.put("jack", 31);
System.out.println(tmp); System.out.println(person.getMap()); } }
|
debug 的时候还一直纳闷,怎么 person 引用没有被赋值。。。作为对比看下面的例子应该就很清楚了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Person { private Map<String , Integer> map = new HashMap<>();
public Map<String, Integer> getMap() { return map; } }
public class TestScope { public static void main(String[] args) { Person person = new Person();
Map<String, Integer> tmp = person.getMap(); System.out.println(tmp); System.out.println(person.getMap());
tmp.put("jack", 31);
System.out.println(tmp); System.out.println(person.getMap()); } }
|
在特殊化一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class TestScope { public static void main(String[] args) { Person person = new Person();
Map<String, Integer> tmp = person.getMap(); System.out.println(tmp); System.out.println(person.getMap());
tmp.put("jack", 31); tmp = new HashMap<>(); tmp.put("jerry", 21);
System.out.println(tmp); System.out.println(person.getMap()); } }
|
总结一下就是,改变引用类型的值没什么问题,但是如果一开始是 null 的话它就不会随着一起改了