一文详解Java类初始化顺序

目录

一、普通类

二、包含继承关系

三、包含接口、抽象类关系


本文将介绍三种情形下的类初始化顺序。

一、普通类

Java类:Animal.java

package ztt.继承接口多态.执行顺序测试;

public class Animal {
    private static String name = "动物";
    private String a = "hello";

    public Animal() {
        System.out.println("构造方法!");
    }

    
    static {
        // 如果能打印出来值,说明静态属性已经初始化了
        System.out.println("静态属性:" + name);
        System.out.println("静态代码块!");
    }

    
    {
        // 如果能打印出来值,说明普通属性已经初始化了
        System.out.println("普通属性:" + a);
        System.out.println("普通代码块");
    }

    
    public static void eat() {
        System.out.println("静态方法!");
    }

    
    public void sing() {
        System.out.println("普通方法!");
    }
    
}

Java类:AnimalTest.java

package ztt.继承接口多态.执行顺序测试;

public class AnimalTest {
    public static void main(String[] args) {
        new Animal();
    }
}

执行结果如下:

总结

普通类初始化的顺序为:

【1】静态属性:static 开头定义的属性

【2】静态代码块: static {} 圈起来的方法块

【3】普通属性: 未带static定义的属性

【4】普通代码块: {} 圈起来的方法块

【5】构造方法

 

二、包含继承关系

父类Fruit.java:

package ztt.继承接口多态.执行顺序测试;

public class Fruit {
    private static String name = "水果";
    private String a = "hello fruit";

    public Fruit() {
        System.out.println("父类Fruit构造方法!");
    }

    static {
        System.out.println("父类静态属性:" + name);
        System.out.println("父类静态代码块!");
    }

    {
        System.out.println("父类普通属性:" + a);
        System.out.println("父类普通代码块!");
    }


}

子类Apple.java:

package ztt.继承接口多态.执行顺序测试;

public class Apple extends Fruit{
    private static String name = "苹果";
    private String a = "Hello Apple";

    public Apple() {
        System.out.println("----子类Apple构造方法!");
    }

    static {
        System.out.println("----子类静态属性:" + name);
        System.out.println("----子类静态代码块!");
    }

    {
        System.out.println("----子类普通属性:" + a);
        System.out.println("----子类普通代码块!");
    }
}

测试类FruitTest.java:

package ztt.继承接口多态.执行顺序测试;

public class FruitTest {
    public static void main(String[] args) {
        new Apple();
    }
}

执行结果如下:

总结

包含继承关系,类的初始化顺序如下:

【1】父类静态变量

【2】父类静态代码块

【3】子类静态变量

【4】子类静态代码块

【5】父类普通变量

【6】父类普通代码块

【7】父类构造函数

【8】子类普通变量

【9】子类普通代码块

【10】子类构造函数

 

三、包含接口、抽象类关系

 

接口Shape.java:

package ztt.继承接口多态.执行顺序测试;

public interface Shape {
    static String a = "Shape接口";

}

抽象类BaseShape.java:

package ztt.继承接口多态.执行顺序测试;

public abstract class BaseShape {
    private static String a = "BaseShape a";
    private String b = "BaseShape b";

    public BaseShape() {
        System.out.println("抽象类BaseShape构造函数!");
    }

    static {
        System.out.println("----抽象类静态属性:" + a);
        System.out.println("----抽象类静态代码块!");
    }

    {
        System.out.println("抽象类普通属性:" + b);
        System.out.println("抽象类普通代码块!");
    }
}

子类Circle.java:

package ztt.继承接口多态.执行顺序测试;

public class Circle extends BaseShape implements Shape {
    private static String a = "Circle a";
    private String b = "Circle b";

    public Circle() {
        System.out.println("普通类Circle构造方法!");
    }

    static {
        System.out.println("====普通类类静态属性:" + a);
        System.out.println("====普通类静态代码块!");
    }

    {
        System.out.println("====普通类类普通属性:" + a);
        System.out.println("====普通类普通代码块!");
    }

}

测试类ShapeTest.java:

package ztt.继承接口多态.执行顺序测试;

public class ShapeTest {
    public static void main(String[] args) {
        new Circle();
    }
}

执行结果:

总结

包含接口、抽象类关系初始化顺序如下:

【1】接口静态属性

【2】抽象类静态属性

【3】抽象类静态代码块

【4】实现类静态属性

【5】实习类静态代码块

【6】抽象类普通属性

【7】抽象类普通代码块

【8】抽象类构造函数

【9】实现类普通属性

【10】实现类普通代码块

【11】实现类构造函数

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值