在Java中,字段的初始化方式有三种:
- 就地初始化
- 使用构造方法初始化
- 使用代码块初始化
前两种方式非常简单,接下来介绍一下工程中常用的第三种方式:使用代码块初始化。
什么是代码块?
使用{}
定义的一段代码.
根据代码块定义的位置以及关键字,又可分为以下四种:
- 普通代码块
- 构造块
- 静态块
- 同步代码块(涉及多线程知识后面再讲解)
普通代码块
普通代码块:定义在方法中的代码块。
public class Main{
public static void main(String[] args) {
{ //普通方法块
int x = 10 ;
System.out.println("x1 = " +x);
}
int x = 100 ;
System.out.println("x2 = " +x);
}
}
// 执行结果
x1 = 10
x2 = 100
构造代码块
定义:定义在类中的代码块(不加修饰符)。也叫:实例代码块、构造块。
构造代码块一般用于初始化实例成员变量,类似于C++中的初始化成员列表。
class Person{
private String name; //实例成员变量
private int age;
private String sex;
public Person() {
System.out.println("I am Person init()!");
}
{ //实例代码块
this.name = "giturtle";
this.age = 21;
this.sex = "man";
System.out.println("I am instance init()!");
}
public void show(){
System.out.println("name: "+name
+" age: "+age
+" sex: "+sex
);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
p1.show();
}
}
// 运行结果
I am instance init()!
I am Person init()!
name: giturtle age: 21 sex: man
从执行结果可以看到:实例代码块优先于构造函数执行。
静态代码块
定义:使用static
定义的代码块。一般用于初始化静态成员属性。
class Person{
private String name; //实例成员变量
private int age;
private String sex;
private static int count = 0; //静态成员变量 由类共享数据、方法区
public Person(){
System.out.println("I am Person init()!");
}
{ //实例代码块
this.name = "giturtle";
this.age = 21;
this.sex = "man";
System.out.println("I am instance init()!");
}
static { //静态代码块
count = 10; //只能访问静态数据成员
System.out.println("I am static init()!");
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person(); //静态代码块不会执行
//只会在最开始执行一次
}
}
// 运行结果
I am static init()!
I am instance init()!
I am Person init()!
I am instance init()!
I am Person init()!
注:
- 静态代码块不管生成多少个对象,其只会执行一次,且是最先执行的。
- 静态代码块执行完毕后, 实例代码块(构造块)执行,再然后是构造函数执行。