java.子类和父类初始化的顺序

实例:

import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;

class X {

    public static int x = getX();

    static {
        System.out.println("父类的静态代码块");
    }

    {
        System.out.println("父类的非静态代码块");
    }

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

    public static int getX() {
        System.out.println("父类的静态变量");
        return 1;
    }
}

class Y extends X {

    public static int y = getY();

    static {
        System.out.println("子类的静态代码块");
    }

    {
        System.out.println("子类的非静态代码块");
    }

    public Y() {
        System.out.println("子类的构造方法");
    }

    public static int getY() {
        System.out.println("子类的静态变量");
        return 2;
    }
}


public class NormalTest {
    public static void main(String[] args) {
        new Y();
    }
}

// 运行结果如下:
// 父类的静态变量
// 父类的静态代码块
// 子类的静态变量
// 子类的静态代码块
// 父类的非静态代码块
// 父类的构造方法
// 子类的非静态代码块
// 子类的构造方法

java程序的初始化可以看做是代码块的执行,他们的执行顺序如下:

(1)父类的静态变量

(2)父类的静态代码块

(3)子类的静态变量

(4)子类的静态代码块

(5)父类非静态变量

(6)父类非静态代码块

(7)父类构造函数

(5)子类非静态变量

(6)子类非静态代码块

(7)子类构造函数

这其中有这以下几点规则:

(1)因为在代码块中可能会对变量进行赋值操作,所以变量初始化操作优先于代码块初始化

(2)因为在构造函数中可能会对变量进行赋值操作,所以变量初始化优先于构造函数的初始化

(3)静态的初始化优先于非静态的初始化

发布了340 篇原创文章 · 获赞 2 · 访问量 8299

猜你喜欢

转载自blog.csdn.net/qq_45239139/article/details/104045135