Java代码块有四种类型:
普通代码块(本地代码块)
实例代码块(构造代码块)
静态代码块
同步代码块(在多线程中使用,还未学习,学习以后再补充)
普通代码块
普通代码块使用较少,就是在方法中用大括号定义的一个代码块
class A{
public int x;
private int y;
public static int z;
{
int x = 3;
System.out.println("普通代码块"+x);
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
}
}
普通代码块会在每次对象实例化时被调用,结果如下:
构造代码块
构造代码块和普通代码块几乎没有区别,只是在构造代码块中要给类成员赋值,在语法上和普通代码块没有任何区别,在功能上就是类内成员初始化。
class A{
public int x;
private int y;
{
this.x = 1;
this.y = 2;
System.out.println("实例代码块"+x);
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
}
}
构造代码块同样会在每次对象实例化时被调用,结果如下:
静态代码块
静态代码块与前面两个代码块有着显著区别,在语法上大括号前要加上static修饰符,在功能上和static函数一样,不能给类成员赋值,只能给static成员赋值,并且在多个对象实例化时只会被调用一次。而且由于静态成员是在JVM加载类时开辟空间并初始化的,所以静态代码块会先于普通代码块和构造代码块调用。
class A{
public int x;
private int y;
public static int z;
{
int x = 3;
System.out.println("普通代码块"+x);
}
{
this.x = 1;
this.y = 2;
System.out.println("实例代码块"+x);
}
static {
z = 3;
System.out.println("静态代码块"+z);
}
}
public class Test {
public static void main(String[] args) {
A a = new A();
A a2 = new A();
}
}
结果如下:
可以看到静态代码块只调用了一次
其实关于静态代码块为什么只调用了一次的问题其实很好解释,因为类静态成员是一个类共有的属性,因此静态代码块也是为类服务的,并不是为了哪个成员,这就是静态代码块只调用一次的原因。