示例代码
先看如下代码的执行结果
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");
}
}
执行结果
执行静态代码块...
----------------------
执行构造代码块...
执行无参构造函数...
----------------------
执行构造代码块...
执行有参构造函数...