Java面试相关(三)--Java程序代码执行顺序示例分析

关于Java程序代码执行的时刻详细,可以参考Java面试相关(一)-- Java类加载全过程。

示例代码如下:

public class Test {
    //静态成员
    private static int A;
    //成员块
    {
        System.out.println("成员块1");
    }
    //静态成员块
    static{
        System.out.println("静态代码块");
        A = 2;
    }
    //成员对象point
    private Point point = new Point();
    /**
     * 构造方法
     */
    public Test(){
        System.out.println("Test的构造方法");
    }
    {
        System.out.println("成员块2");
    }
    public static class Point{
        public Point(){
            System.out.println("Point的构造方法");
        }
    }
    public static void main(String[] args){
        Test test = new Test();
    }
}

运行结果:

静态代码块
成员块1
Point的构造方法
成员块2
Test的构造方法

解析:
 当程序在找到main方法入口并准备执行前,Test类本身需要进行编译、加载和初始化 这三个过程:

  1. 编译:如果Test.class没有生成或者代码更新了,就会重新将.java文件编译成.class文件,准备加载。
  2. 加载:加载这个过程要细分的话,包含:验证、准备、解析、对主动引用类的情况做处理,这几个过程,详细可以看本文前言的文章链接。可以理解为:加载过程主要是保证编译好的.class文件的数据顺利被JVM理解并可控。
  3. 初始化:首先就将Test类整体扫描一遍,并将所有静态成员附上初始值和静态代码块都执行一遍【所以,类静态代码,也称为初始化块,在初始化使被执行】,之后,再通过这个入口方法,执行main方法中的代码。
  4. 执行main方法,new Test()构建一个新的Test类对象,所以,所有的类成员方法块(包括成员变量的赋值),都会按照代码先后顺序执行。在这些成员代码块执行完成后,才会调用类的构造方法。
  5. Point point = new Point();就是因为new Test()而执行成员代码块所以触发的,于是这里Point类也有一个初始化和构建的过程。

你可能感兴趣的:(Java面试相关(三)--Java程序代码执行顺序示例分析)