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