JavaSE 初始化块 和 静态初始化块

时间:2022-01-23 19:41:47

初始化块

class Person{
    private String name;
    private int age;
    /* 初始化块 作用:给对象进行初始化 对象一建立就运行,而且优先于构造函数执行。 和构造函数的区别: 构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化 构造代码块汇中定义的是不同对象共性的初始化内容。 *///代码块 
        cry();  
    }  

    Person(){
    System.out.println("A.name"+name+",,age="+age);
    }

    Person(String n){
        name=n;
        System.out.println("B.name="+name+",,age="+age);
    } 

    public void cry(){
        System.out.println("cry...............");
    }
}

public class PersonDemo
{
    public static void main(String[] args)
    {
        person P1=new Person();
        person P2=new Person(Jack);
    }
}   

输出
cry…………..
name=null,,age=0
cry………..
name=Jack,,age=0


静态初始化块

如果定义初始化块的时候使用了static修饰符,则这个初始化块就变成了静态初始化块。也称为类初始化块。

class Root{

    static{
        System.out.println("Root的静态初始化块");
    }

    {
        System.out.println("Root的普通初始化块");
    }

    public Root() {
        System.out.println("Root的无参数构造器");
    }
}

class Mid extends Root {
    static{
        System.out.println("Mid的静态初始化块");
    }

    {
        System.out.println("Mid的普通初始化块");
    }

    public Mid() {
        System.out.println("Mid的无参数构造器");
    }

    public Mid(String msg) {
        this();                    //通过this调用同一类中重载的构造器
        System.out.println("Mid的带参数构造器"+msg);
    }
}

class Leaf extends Mid{
    static{
        System.out.println("Leaf的静态初始化块");
    }

    {
        System.out.println("Leaf的普通初始化块");
    }

    public Leaf(){
        super("java学习");              //通过super调用父类中有一个字符串的构造器 
        System.out.println("执行Leaf的构造器");;
    }
}

public class test{
    public static void main(String[] args)  {
        new Leaf();
        new Leaf();
    }
}

输出结果
JavaSE 初始化块 和 静态初始化块

第一次创建一个Leaf对象时,因为系统中还不存在Leaf类,因此需要先加载并初始化Leaf类,初始化Leaf类时会先执行其顶层父亲的静态初始化块,在执行其直接父亲的静态初始化块,最后执行Leaf本身的静态初始化块。
一旦Leaf类初始化成功之后,Leaf类在该须立即里将一直存在,因此当第二次创建Leaf实例时无需再次对Leaf类进行初始化。
每次创建一个Leaf对象,都需要先执行最顶层的初始化块,构造器,然后执行其父亲的初始化块,构造器。。。。最后执行Leaf类的初始化块,构造器。