Java:类文件程序执行顺序

只要按照这个步骤,遇到这一类问题就可以解决了。

1.类中所有属性的默认值(一举而成)

2. 父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)

3. 子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)

4. 调用父类的构造方法,

首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)

然后父类构造方法

5. 调用子类的构造方法,

首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)

然后子类构造方法
      
说明: 1-3:类加载过程,不涉及构造方法

1-5: 实例化过程,涉及构造方法

参考问题:执行下列代码,输出是什么?

class A {
    public A() {
        System.out.println("A的构造方法");
    }

    public static int j = print();

    public static int print() {
        System.out.println("A print");
        return 521;
    }
}

public class Test1 extends A {
    public Test1() {
        System.out.println("Test1的构造方法");
    }

    public static int k = print();

    public static int print() {
        System.out.println("Test print");
        return 522;
    }

    public static void main(String[] args) {
        System.out.println("main start");
        Test1 t1 = new Test1();
    }
}

看看是不是这个?如果是那么执行顺序掌握的不错。

A print
Test print
main start
A的构造方法
Test1的构造方法

再来个上题加强版:问输出顺序是什么?

public class Test1 extends A {
    public Test1() {
        System.out.println("Test1的构造方法");
    }

    public static int k = print();

    {
      System.out.println(k);
    }
    
    public static int print() {
        System.out.println("Test print");
        return 522;
    }

    public static void main(String[] args) {
        System.out.println("main start");
        Test1 t1 = new Test1();
        Test1 t3;
        Test1 t2 = new Test1();
    }
}

class A {
    public A() {
        System.out.println("A的构造方法");
    }

    {
      System.out.println(j);
    }

    public static int j = print();

    static {
      System.out.println(j);
    }

    public static int print() {
        System.out.println("A print");
        return 521;
    }
    static{
      System.out.println("A的static block");
    }

}

看看输出是不是:

A print
521
A的static block
Test print
main start
521
A的构造方法
522
Test1的构造方法
521
A的构造方法
522
Test1的构造方法

重复输出的部分:

521
A的构造方法
522
Test1的构造方法

来自于第二次new过程中:运行父类构造体与构造方法->子类构造体与构造方法
而且也可以看出 类的申明不会调用类的构造体

原文转载自:https://www.cnblogs.com/greatfish/p/5771548.html

猜你喜欢

转载自blog.csdn.net/OliverZang/article/details/84974571
今日推荐