类第一次初始化的时候,先执行里的语句。比如, public class Test3 { afkj ;lkasfj static{ System.exit(0); } public static void main(String args[]){ Test3 test3 = new Test3(); afjlfj sa } } 运行结果是直接退出。
public class Test { static { System.out.println("A"); } public static void main(String[] args) { System.out.println("b"); } }//类加载的时候 (先加载main方法所在类,会先运行static里面的代码)结果为 A,b
即
不用 new 对象就能自动运行
public class Test3 {
afkj ;lkasfj
static{
System.exit(0);
}
public static void main(String args[]){
Test3 test3 = new Test3();
afjlfj sa
}
}
运行结果是直接退出。
{
//java执行语句
}
这种你应该见过吧,这两个类似,就是执行时间不同而已,静态块是在第一次加载的时候用,而普通的代码块是在你调用这个块所在的域里面执行的。
public class Test {
static {
System.out.println("A");
}
public static void main(String[] args) {
System.out.println("b");
}
}//类加载的时候 (先加载main方法所在类,会先运行static里面的代码)结果为 A,b
静态初始化块是在类被加载的时候就执行的一块程序,并且一直存在直到程序关闭。
一般会设计到它的执行顺序:
静态变量、静态初始化块)>(变量、初始化块)>构造器
若存在父类的情况下则是: 父类的静态变量->父类的静态初始化块->子类的静态变量->子类的静态初始化块->父类构造器->子类构造器
与静态初始化块相对的是实例初始化块,就是在实例化一个对象时执行。
class{
{
//实例初始化
}
}
...
}
在Java中,代码块分四种:
1,普通代码块
最平常的代码块,比如方法,类,if语句等等后面跟的大括号{}就是普通代码快
2,构造代码块
格式:
{
...
}
就两个大括号,可以直接在其内部加入需要的代码,构造块优先于构造方法执行
3,静态代码块
格式上面说过了。他的主要用途是为静态属性初始化,他优先于主方法执行
可以理解为是编译的时候就准备好的
4,同步代码块
关于线程的块,具体我也不详例题(仅供娱乐,一般不会这样做):
怎样不用主方法就打印出Hello World?public class Test{
static{
System.out.println("Hello World");
System.exit(1);//告诉程序不用再去找主方法了,不写会报 找不到主方法的异常
}
}
一般有关静态变量的执行顺序:
父类的静态变量->父类的静态初始化块->子类的静态变量->子类的静态初始化块->父类构造器->子类构造器
JVM在类主动使用的时候才会将类加载进来,而new 是主动使用的一种方式,为什么会不执行呢?