关于初始化块和构造方法的顺序问题一直是一个比较容易混淆的问题,很多初学者都会在此犯迷糊,今天博主就来给大家普及一下这方面的知识。我们首先需要了解初始化块和构造方法的定义。
一、初始化块
初始化块分为静态初始化块和普通初始化块,本质上是一个代码块和方法体:
1.静态初始化块
静态初始化块(静态代码块)的格式:static{ };
关键字 static:如果将域定义为 static,这个类的所有实例对象将共享这个域。
因此,静态代码块是属于类的,它不属于任何一个对象,它的作用就是给类进行初始化,它会随着类的加载而执行,而且只执行一次。
2.普通初始化块
初始化块就是构造代码块,它是类中的独立代码块,可以给所有对象进行初始化,随着创建对象时隐式调用。
二、构造方法(构造器)
在构造类的对象时,构造器就会运行,将实例域初始化为希望的状态。构造器会随着 new 操作符的执行而被调用,但是不能对一个已经存在的对象调用构造器。
构造器:
- 构造器和类同名
- 每个类可以有一个以上的构造器
- 构造器可以有0个、1个或者多个参数
- 不用定义返回值类型,也没有具体返回值
三、执行顺序
在创建对象的时候,会首先运行初始化块,然后运行构造器的主要部分,一般建议将初始化块定义在域的后面。
在类中是可以包含多个代码块的,静态代码块的执行顺序在普通代码块之前,同级别的代码块执行顺序的话,按照定义的先后进行。
当类中包含初始化块,构造器时,其记住执行顺序:
静态代码块/静态变量 > 普通代码块/普通变量 > 构造器
说了这么多,肯定有小伙伴感觉很迷茫,既然如此,上代码:
1 public class Test { 2 3 public static void main(String[] args){ 4 5 A a = new A(); 6 7 } 8 9 } 10 class A { 11 static{ 12 System.out.println("静态代码块"); 13 } 14 15 { 16 System.out.println("普通代码块1"); 17 } 18 { 19 System.out.println("普通代码块2"); 20 } 21 public A(){ 22 System.out.println("构造器"); 23 } 24 25 }
打印结果:
接下来,我们改变代码块顺序,再试一次:
1 public class Test { 2 3 public static void main(String[] args){ 4 5 A a = new A(); 6 7 } 8 9 } 10 class A { 11 { 12 System.out.println("普通代码块2"); 13 } 14 public A(){ 15 System.out.println("构造器"); 16 } 17 { 18 System.out.println("普通代码块1"); 19 } 20 21 22 static{ 23 System.out.println("静态代码块"); 24 } 25 26 } 27
打印结果:
通过上述代码,我们可以很轻松的得出初始化块和构造器的执行顺序,聪明的小伙伴们,相信你们应该学会了吧。