博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Static代码块引用问题
阅读量:6349 次
发布时间:2019-06-22

本文共 2548 字,大约阅读时间需要 8 分钟。

hot3.png

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 Map
 map = 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 Map
 map = 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());注释掉,想要的效果就会出来了。

转载于:https://my.oschina.net/u/2430057/blog/670879

你可能感兴趣的文章
Facebook申请专利 或让好友及陌生人相互拼车
查看>>
电力“十三五”规划:地面光伏与分布式的分水岭
查看>>
美联社再告FBI:要求公开请黑客解锁iPhone花费
查看>>
三星电子出售希捷和夏普等四家公司股份
查看>>
任志远:当云计算遇上混合云
查看>>
思科联手发那科 用物联网技术打造无人工厂
查看>>
智慧城市首要在政府利用大数据的智慧
查看>>
2015年物联网行业:巨头展开专利大战
查看>>
以自动化测试撬动遗留系统
查看>>
网络安全初创公司存活之道
查看>>
《图解CSS3:核心技术与案例实战》——1.2节浏览器对CSS3的支持状况
查看>>
《Android应用开发》——2.4节应用类
查看>>
继 One Step 后,锤子科技 Big Bang 正式开源
查看>>
《数据科学:R语言实现》——2.5 使用Excel文件
查看>>
《淘宝店铺设计装修一册通》一2.5 抠图工具的简单运用
查看>>
《音乐达人秀:Adobe Audition实战200例》——实例4 收音机音乐节目转录到电脑里...
查看>>
《JavaScript应用程序设计》一一3.1 过时的类继承
查看>>
千万PV是什么意思?
查看>>
Amazon 推出 API 网关使用计划
查看>>
互联网流量超出路由器上限 或致全球断网
查看>>