java 基础:static 与构造方法

本文深入探讨了静态代码块在Java中的作用,指出其在构造方法中的不当使用可能导致空指针异常,并介绍了如何使用静态代码块进行初始化以避免此类问题。同时,文章还提供了一个关于静态代码块的示例程序,并讨论了其在实际开发中的常见陷阱与解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解静态代码块,可以先抽几分钟时间看看链接

 http://blog.youkuaiyun.com/androidbluetooth/article/details/6454135


先给个示例程序

package it.mark;

import java.util.HashMap;

public class StaticDemo {
	public static HashMap<Integer, String> map;

	public StaticDemo() {
		System.out.println("construct StaticDemo-----");
		map = new HashMap<Integer, String>();
		map.put(1, "google");
		map.put(2, "baidu");
		map.put(3, "sina");

		// --------省略添加的 4~1113 项数据-----------

		map.put(1114, "souhu");
		map.put(1115, "git");
		map.put(1116, "svn");
	}
}

map 是 StaticDemo 类的静态成员

在 StaticDemo 的构造方法里面对 map 进行了实例化。


其他类可以直接访问这个 StaticDemo 类的 map,或者创建 StaticDemo 对象再访问 map

// 直接访问
		HashMap<Integer, String> map1 = StaticDemo.map;
		String value1 = map1.get(1);
		
		// 通过实例化类来访问
		HashMap<Integer, String> map2 = new StaticDemo().map;
		String value2 = map2.get(2);

仔细看看这段代码有甚麽问题。

从表面上看,没有任何问题。但是看看  StaticDemo 构造方法,你就会发现

String value1 = map1.get(1);
执行的时候,会报空指针异常的错误。


这是因为,map 对象根本没有被实例化。


那么,我们这样试一试

	// 通过实例化类来访问
		HashMap<Integer, String> map2 = new StaticDemo().map;
		String value2 = map2.get(2);

		// 直接访问
		HashMap<Integer, String> map1 = StaticDemo.map;
		String value1 = map1.get(1);

运行是没有错误的。

原因很简单,在

// 通过实例化类来访问
		HashMap<Integer, String> map2 = new StaticDemo().map;
		String value2 = map2.get(2);

调用了  StaticDemo 构造方法,从而示例化了 map,那么

// 直接访问
		HashMap<Integer, String> map1 = StaticDemo.map;
		String value1 = map1.get(1);

由于 map 是 static 的成员变量,已经被实例化,自然可以访问到!


上面的一个例子,其实是我工作当中遇到一个 bug 的缩影。


回过头来,我们可以想一想,在  StaticDemo 构造方法里面做了下面几件事情


1. 实例化 map


2. 为 map 对象添加数据(1000多条)


也就是说,我们每次 new  StaticDemo 对象的时候,都要重复上面的事情。


但是,既然 map 是 static 的,为什么不可以使用静态代码块?

package it.mark;

import java.util.HashMap;

public class StaticDemo {
	public static HashMap<Integer, String> map;

	static {
		map = new HashMap<Integer, String>();
		map.put(1, "google");
		map.put(2, "baidu");
		map.put(3, "sina");

		// --------省略添加的 4~1113 项数据-----------

		map.put(1114, "souhu");
		map.put(1115, "git");
		map.put(1116, "svn");
	}
}

这样做的话,我们可以在其它地方随心所欲的直接访问 map 对象。不用担心 null pointer !

另一个关于 static 的 bug

http://blog.youkuaiyun.com/androidbluetooth/article/details/6823430














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值