代码块
作用
对Java类或对象进行初始化 。
分类
- 静态代码块: 一个类中代码块若有修饰符,则只能被static修饰
- 可以有输出语句。
- 可以对类的属性、类的声明进行初始化操作。
- 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
- 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
- 静态代码块的执行要先于非静态代码块。
- 静态代码块随着类的加载而加载,且只执行一次。
- 非静态代码块:没有使用static修饰的
- 可以有输出语句。
- 可以对类的属性、类的声明进行初始化操作。
- 除了调用非静态的结构外,还可以调用静态的变量或方法。
- 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
- 每次创建对象时,都会执行一次。且先于构造器执行。
成员变量在代码块中的执行顺序
结合以下代码解释:
public class CodeBlock {
static int i = 5;
public CodeBlock() {
i = 30;
System.out.println("构造器中的i="+i);
}
{
i = 10;
System.out.println("非静态代码块i="+i);
}
static{
i = 20;
System.out.println("静态代码块i="+i);
}
public static void main(String[] args) {
System.out.println("main中创建对象之前的i="+i);
CodeBlock cd = new CodeBlock();
System.out.println("main中创建对象之后的i="+i);
cd.i = 40;
System.out.println("main中通过对象.属性后i="+i);
}
}
输出:
静态代码块i=20
main中创建对象之前的i=20
非静态代码块i=10
构造器中的i=30
main中创建对象之后的i=30
main中通过对象.属性后i=40
步骤
1.默认初始化
2.显式初始化
3.静态代码块被执行
4.对象被创建后,首先非静态代码块被执行
5.接着构造器方法被执行
6.对象.属性对i进行赋值。