- 示例代码
- 静态代码块、构造代码块、构造函数执行顺序
- 测试
先看如下代码的执行结果
public class CodeBlock {
public static void main(String[] args) {
new Test();
System.out.println("----------------");
new Test("1");
}
}
class Test {
// 构造代码块
{
System.out.println("执行构造代码块...");
}
public Test() {
System.out.println("执行无参构造函数...");
}
public Test(String id) {
System.out.println("执行有参构造函数...");
}
}
运行结果
执行构造代码块... 执行无参构造函数... ---------------- 执行构造代码块... 执行有参构造函数...
从上面的运行结果可以看出在
- new 一个对象的时候总是先执行构造代码块,再执行构造函数
- 构造代码块不是在构造函数之前运行的,它是 依托 构造函数执行的
- 静态代码块,它是随着 类的加载而被执行,只要类被加载了就会执行,而且 只会加载一次,主要用于给类进行初始化
- 构造代码块,每 创建一个对象时就会执行一次,且 优先于构造函数,主要用于初始化不同对象共性的初始化内容和初始化实例环境
- 构造函数,每 创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而 构造代码是给所有对象进行初始化,作用区域不同
- 三者的执行顺序应该为:静态代码块 > 构造代码块 > 构造函数
public class CodeBlock {
// 静态代码块
static{
System.out.println("执行静态代码块...");
}
// 构造代码块
{
System.out.println("执行构造代码块...");
}
public CodeBlock(){
System.out.println("执行无参构造函数...");
}
public CodeBlock(String id){
System.out.println("执行有参构造函数...");
}
public static void main(String[] args) {
System.out.println("----------------------");
new CodeBlock();
System.out.println("----------------------");
new CodeBlock("1");
}
}
执行结果
执行静态代码块... ---------------------- 执行构造代码块... 执行无参构造函数... ---------------------- 执行构造代码块... 执行有参构造函数...



