对象中存有静态对象。

173 阅读1分钟

前些天再看对象的初始化,发现了一个很有意思的点。

创建对象时,对象初始化,正常顺序,如果对象中有静态代码块,先执行静态代码块,再执行代码块,再执行构造器。

class Demo{
    static {
        System.out.println("静态代码块");
    }
    {
        System.out.println("普通代码块");
    }
    Demo(){
        System.out.println("构造器");
    }
}
class Test{
    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}

输出:

静态代码块
普通代码块
构造器

但是如果我们在类中创建一个静态对象时,就会先执行代码块。

class Demo {
    static Demo d=new Demo();
    static {
        System.out.println("静态代码块");
    }
    
    {
        System.out.println("普通代码块");
    }

    Demo() {
        System.out.println("构造器");
    }
}

class Test {
    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}

输出:

普通代码块
构造器
静态代码块
普通代码块
构造器

如果在类中创建其他类的静态对象就不会出现这种现象。

class Demo1 {
    static Demo2 d2=new Demo2();
    static {
        System.out.println("Demo1静态代码块");
    }

    {
        System.out.println("Demo1普通代码块");
    }

    Demo1() {
        System.out.println("Demo1构造器");
    }
}
class Demo2{
    {
        System.out.println("Demo2普通代码块");
    }
   static  {
        System.out.println("Demo2静态代码块");
    }
    Demo2(){
        System.out.println("Demo2构造器");
    }
}
class Test {
    public static void main(String[] args) {
        Demo1 demo = new Demo1();
    }
}

输出:

Demo2静态代码块
Demo2普通代码块
Demo2构造器
Demo1静态代码块
Demo1普通代码块
Demo1构造器