日期:2014-05-20  浏览次数:20801 次

关于静态代码块的问题
本帖最后由 a1002002 于 2013-04-24 23:06:57 编辑
最近看视频在学习JDBC 发现问题:

      public final class JdbcUtils {
private static String url = "jdbc:mysql://localhost:3306/jdbc";
private static String user = "root";
private static String password = "";

private JdbcUtils() {
}

static {
try {//驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
}

这是代码的一部分: 老师建一个工具类,其目的是为了以后写项目时直接用驱动程序,不用在重新写。
 问题是 他写的一个类要用到这个工具类的驱动程序,可是新建的类跟工具类没有继承关系,怎么就能用到工具类里面的静态代码块了啊?
新手在学习,所以请大神能将仔细点,不甚感激!
JDBC 静态代码块

------解决方案--------------------
首先,静态区域里面的代码在虚拟机启动的时候就执行一次。
其次,其他类并没有用到这个区域,而是用到了这里面加载的驱动,这里面的驱动,其实就是一份字节码,这份字节码并不是某个类独有的,与类无关系,在内存中只有这要有了这一份字节码,大家都可以使用它,因此只需要加载一次就行了,不需要多次加载。

------解决方案--------------------
static代码块是在类被加载的时候就被执行的。
------解决方案--------------------
静态块的执行时机是在class文件装载的时候,由于class文件只会装载一次,因此静态块只会执行一次,后面再使用这个类时,不会再执行静态块中的代码。这种用法经常在常量或者某个变量的值需要在类加载的时候就初始化完毕,在new对象的时候可以直接使用。说起初始化,你或许会问,为什么不再构造函数中初始化呢,如果在构造函数中初始化,那么在每次new对象的时候都是执行一次初始化,使用每个实例的初始化值具有各自的特色,而静态块只是在类加载的时候初始化,也就是所有的实例使用同一个初始化数据。

工具类提供处静态方法,在业务类中可以直接使用:JdbcUtils.xxx()方法,而不是直接使用静态类JdbcUtils中的静态块内容。静态快内容目的是初始化JdbcUtils类,以便于在调用方法时不会报驱动找不到或者空指针异常等。