如下:
一种带有static
static{
//代码内容
//........
//代码结束
}
还有就是花括号前面啥也没有的。
{
//代码内容
//........
//代码结束
}
static{
//代码内容
//........
//代码结束
}
静态代码域,在类的加载的时候调用一次,整个生命周期只会调用一次。
{
//代码内容
//........
//代码结束
}
普通代码域,在类的每个对象创建的时候调用。
代码域中定义的变量都是局部的,只有域中的代码可以调用。
或者也称为 “静态代码块”和“非静态代码块”
static{}静态代码块,在类第一次被调用或实例化的时候就会被执行。
静态代码块只会执行一次,一般会用来初始化一些值,并且在所有对象中全局共享。
{}非静态代码块,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。
在网上搜了下,有人举了个这样的例子进行说明,感觉非常到位:
举个例子:
public class TestStaticCon {
public static int a = 0;
static {
a = 10;
System.out.println("父类的非静态代码块在执行a=" + a);
}
{
a = 8;
System.out.println("父类的非静态代码块在执行a=" + a);
}
public TestStaticCon() {
this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
}
public TestStaticCon(String n) {
System.out.println(n);
System.out.println(a);
}
public static void main(String[] args) {
TestStaticCon tsc = null;
System.out.println("!!!!!!!!!!!!!!!!!!!!!");
tsc = new TestStaticCon();
}/*Output:
父类的非静态代码块在执行a=10
!!!!!!!!!!!!!!!!!!!!!
父类的非静态代码块在执行a=8
a在父类带参构造方法中的值:10
8
8
父类无参构造方法在执行a=8
*/
}
public class TestStaticCon {
public static int a = 0;
static {
a = 10;
System.out.println("父类的非静态代码块在执行a=" + a);
}
{
a = 8;
System.out.println("父类的非静态代码块在执行a=" + a);
}
public TestStaticCon() {
this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法
System.out.println(a);
System.out.println("父类无参构造方法在执行a=" + a);
}
public TestStaticCon(String n) {
System.out.println(n);
System.out.println(a);
}
public static void main(String[] args) {
TestStaticCon tsc = null;
System.out.println("!!!!!!!!!!!!!!!!!!!!!");
tsc = new TestStaticCon();
}/*Output:
父类的非静态代码块在执行a=10
!!!!!!!!!!!!!!!!!!!!!
父类的非静态代码块在执行a=8
a在父类带参构造方法中的值:10
8
8
父类无参构造方法在执行a=8
*/
}
这里代码块{} 插入代码的理解的要点,在于两点:
1. static {} 这种代码块在类被引用的时候就会被调用并执行a=10,无论创建对象与否。
2. {...} 代码块在创建对象时,进入构造函数开始执行第一条语句之前调用该代码块并执行修改a=8。
无论是哪种代码块方式, 都会对全局变量进行修改!!!!