执行顺序--优先级从高到低:静态代码块 > mian方法 > 构造代码块 > 构造方法
1 、普通代码块:在方法或语句中出现的{}就称为普通代码块
普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”;
2、 构造代码块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块
构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数;
3 、静态代码块:在java中使用static关键字声明的代码块
静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次!!!由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行!!!
注:
(1)如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行";
(2) 静态代码块不能存在于任何方法体内,必须是单独定义的;
(3) 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问;
4、对于构造代码块以及构造函数(构造器)的区别:
(1) 构造代码块:见上述;
(2)构造函数:用于给对象进行初始化,它具有针对性,属于函数中的一种;
特点:1>该函数的名称和所在类的名称相同
2>不需要定义返回值类型
3>该函数没有具体的返回值
通过查阅资料,得知底层分析:通过反编译可以看到,构造代码块中的代码 也是在构造方法中执行的,
且从反编译工具中得知,编译时会默认将将构造代码块中的代码移动到构造方法中,并且移动到构造方法内容的前面!!
小例子:
class HelloA {
public HelloA() {
System.out.println("HelloA"); //4
}
{ System.out.println("I'm A class"); } //3
static { System.out.println("static A"); } //1
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");//6
}
{ System.out.println("I'm B class"); }//5
static { System.out.println("static B"); }//2
public static void main(String[] args) {
new HelloB();
}
}
解答须知:
(1)执行优先级:静态代码块 > mian方法 > 构造代码块 > 构造方法
(2)子类的构造器 默认 调用 父类的构造器 super()
(3) 底层分析得知,构造代码块在构造方法中执行,且在构造方法内容前面执行!!!
最终的执行结果:static A static B I'm A class HelloA I'm B class HelloB