public class Test {
//非静态块:每次初始化一个对象,都会导致一次非静态块的执行;在构造函数执行之前执行
//继承关系:父类的非静态块->父类的构造函数->自己的自由块->自己的构造函数
{
System.out.println("before");
}
static int x = 10;
static{
x+=5;
System.out.println("static1");
}
public static void main(String[] args) {
new Test();
new Test();
System.out.println(x);
static {
x/=3;
System.out.println("static2");
}
public Test(){
System.out.println("构造函数");
}
//非静态块:每次初始化一个对象,都会导致一次非静态块的执行;在构造函数执行之前执行
//继承关系:父类的非静态块->父类的构造函数->自己的自由块->自己的构造函数
{
System.out.println("before");
}
static int x = 10;
static{
x+=5;
System.out.println("static1");
}
public static void main(String[] args) {
new Test();
new Test();
System.out.println(x);
}
static {
x/=3;
System.out.println("static2");
}
public Test(){
System.out.println("构造函数");
}
}
注意:
1.静态代码块会在类被加载时自动执行。且优先于非静态代码块和实例方法之前执行,有且只执行一次
2.静态代码块只能定义在类里面,不能定义在方法里面。
3.静态代码块里的变量都是局部变量,只在块内有效。
4.一个类中可以定义多个静态代码块,按顺序执行,且先执行完所有的静态块,在进行调用
5.静态代码块只能访问类的静态成员,而不允许访问实例成员。
6.java中的自由块分为两种:静态块和非静态块
7.当创建Test类的一个对象的时候,比如new Test()首先是类加载,然后才能new对象,静态块在类加载的时候就执行了,这就说明静态块在new对象之前就会执行,而且一个 类在第一次被使用的时候会被加载,然后在整个应用程序的生命周期当中不会再次被加载了,就加载这一次,所以这就说明,静态块就执行一次,不会执行第二遍!
输出结果:
static1
static2
before
构造函数
before
构造函数
5