8.7 静态代码块

最后更新于:2022-04-01 14:11:39

这一节我们看一个比较特殊的概念,那就是静态代码块。 前面我们也提到过代码块,就是一段独立的代码空间,那么什么是静态代码块呢?说白了,**就是用static关键字修饰的代码块。** 我们来看一个例子: ~~~ class StaticBlock { static { System.out.println("静态代码块被执行"); } void myPrint() { System.out.println("myPrint方法执行"); } } class StaticBlockTest { public static void main(String[] args) { new StaticBlock().myPrint(); } } ~~~ 我们来看一看运行结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c422a62405.jpg) 从结果我们看到了我们调用的myPrint函数被调用执行了,并且在此函数被调用之前,静态代码块就已经被执行。 这就是我们要说的特别之处,静态代码块是特殊的代码块,它被static关键字修饰,并且拥有静态的所有特征,最主要的是它有一个比较自然独特的特点:我们之前说,**静态随着类的加载而加载,而静态代码块随着着类的加载而执行,只要类被加载,那么该静态代码块就会被执行,并且只执行一次。** 我们看下面的测试: ~~~ class StaticBlockTest { public static void main(String[] args) { new StaticBlock().myPrint(); new StaticBlock().myPrint(); } } ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c422a7351b.jpg) 我们看到,静态代码块只执行了一次,而我们的myPrint方法被调用了两次执行了两次。所以当类加载时,静态方法就已经加载并且执行一次。 通过上面的例子让我们明确了静态代码块的实际作用:**用于给类进行初始化。** 这就相当于我们之前学习的构造函数,构造函数是用于给对象进行初始化,而静态代码块是用来给类进行初始化。 这里我们也许会有疑问,既然构造函数能够进行初始化,那么我们为什么还要用静态代码块来初始化呢,其实不是所有的类都能创建对象,因为有些类有可能不需要被创建对象的,比如我们在一个类中定义的全部是静态成员,那么创建对象就没有意义。 我们再看一个静态代码块的用法,我们看下面的代码: ~~~ class StaticBlock { static int num; static { num = 10; num = num * 3; } void myPrint() { System.out.println("num = "+num); } } class StaticBlockTest { public static void main(String[] args) { new StaticBlock().myPrint(); } } ~~~ 我们来看运行结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-18_573c422a86ac0.jpg) 从结果我们直接可以看到,我们在静态代码块中对静态变量进行了多次运算和赋值,所以当我们需要对静态变量进行多次运算时我们可以运用静态代码块。 不过这个在开发中用的并不多,在一些底层的框架开发中会专门用到。 这一节我们就简单的学到这里。
';