Java类的初始化

147 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

当只有一个类时,不涉及到继承关系。

Java类初始化顺序为:类的静态代码块->类的普通代码块->类的构造方法
示例一

public class ClassInit {

     public ClassInit(){
         System.out.println("类的构造方法...");
     }
    {
        System.out.println("类的普通代码块...");
    }
    static
    {
        System.out.println("类的静态代码块...");
    }
    public static void main(String[] args) {
        ClassInit classInit=new ClassInit();
    }

当new一个ClassInit对象时,控制台输出为:类的静态代码块....类的普通代码块....类的构造方法。
由此可见先后顺序为:类的静态代码块 ->类的普通代码块->类的构造方法

当有两个类时,且这两个类具有继承关系。

类的初始化顺序为:父类的静态代码块 ->子类的静态代码块 ->父类的普通代码块 ->父类的构造方法 ->子类的普通代码块 ->子类的构造方法
示例二:

public class ClassInitSon extends  ClassInit
{
    public ClassInitSon(){
        System.out.println("子类的构造方法...");
    }
    {
        System.out.println("子类的普通代码块...");
    }
    static
    {
        System.out.println("子类的静态代码块...");
    }

    public static void main(String[] args) {
        ClassInitSon son=new ClassInitSon();
    }
}

当具有继承关系时,此时new一个子类对象,控制台输出为:父类的静态代码块...子类的静态代码块...父类的普通代码块...父类的构造方法...子类的普通代码块...子类的构造方法...
具有继承关系类的先后顺序为:父类的静态代码块 ->子类的静态代码块 ->父类的普通代码块 ->父类的构造方法 ->子类的普通代码块 ->子类的构造方法

解释:先执行父类的构造方法再执行子类的构造方法。因为子类的非静态变量和方法的初始化有可能调用到父类的属性和方法,所以子类构造默认的属性和方法之后不应该进行赋值,而要跳转到父类的构造方法完成父类对象的构造之后,才来对自己的属性和方法进行初始化。
解释:先执行静态代码块然后再执行其他方法。因为静态代码块是类级别的,而构造代码块和构造方法是实例级别的,因而静态代码块先执行;又因构造代码块是独立的,必须依附载体才能运行,因而构造代码块需放到构造方法前。