首先要理解Static是对于一个类来说的,包括静态变量,静态方法和静态类。
这里重点介绍一下静态块static block
static { }这一部分就是静态块,当类加载器载入类的时候,这一部分代码被执行,常用于对静态变量进行初始化工作。如果去掉static,{ }中的代码则会在创建类对象的时候才执行,(相当于把这部分代码复制到各个构造函数中)这样可以实现块中的内容在多个构造函数中的复用。
举个例子:
public class Main {
{System.out.println("I am in {}");}
public static String string ;
public static void main(String[] args) {
new Main();
new Main();
new Main();
}
static{
System.out.println("I am in first static {}");
}
static{
System.out.println("I am in second static {}");
string = "I am static string";
System.out.println(string);
}
}
输出结果为:
I am in first static {}
I am in second static {}
I am static string
I am in {}
I am in {}
I am in {}
可见static{ }中的代码只执行一次,而{ }中的代码每当创建一个新对象的时候就会被执行。{ } 这样的代码块也被称为构造函数块(Constructor Block)
当然,静态块也有它的局限性,比如静态块代码大小不能超过JVM规定的某个值,不能用this,super关键字,不能从静态块中返回值,增加调试难度等等。因此,必须小心处理静态块中可能出现的异常
思考下面图片,根据阴影部分给定的代码,白色区域部分为什么要这样写?
关于Java Static 的详细总结可以参考博文
Java Static用法总结