程序员

Java程序执行顺序

2018-12-24  本文已影响0人  ThunderWho

执行顺序大致分类:

  1. 静态属性,静态方法声明,静态块。
  2. 动态属性,普通方法声明,构造块。
  3. 构造方法。

详细介绍:

  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 Text extends A {
    public Text() {
        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");
        Text t1 = new Text();
        A.print();
    }
}
运行结果:
A print
Test print
main start
A的构造方法
Test1的构造方法
A print

加载被打断(阿里面试题):

public class Text {
    public static int k = 0;
    public static Text t1 = new Text("t1");
    public static Text t2 = new Text("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");

    {
        print("构造块");
    }
    static {
        print("静态块");
    }

    public Text(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++i;
        ++n;
    }

    public static int print(String str) {
        System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String [] args) {
        Text t = new Text("init");
    }
}
运行结果:
1:j   i=0    n=0
2:构造块   i=1    n=1
3:t1   i=2    n=2
4:j   i=3    n=3
5:构造块   i=4    n=4
6:t2   i=5    n=5
7:i   i=6    n=6
8:静态块   i=7    n=99
9:j   i=8    n=100
10:构造块   i=9    n=101
11:init   i=10    n=102

上一篇 下一篇

猜你喜欢

热点阅读