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类也有一个初始化和构建的过程。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 前言 YY:Kitty,我最近在看Thinking in Java 这本书Kitty:喔?是么,你不是一直觉得那本...
    LilacZiyun阅读 5,528评论 12 51
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,141评论 0 62
  • 曾经,我喜欢过一个人 却渐渐忘记了怎么去飞翔 离开了天空的蔚蓝 贪恋这绿林的柔光 还有他手里的庇护 甘愿让心停止流...
    蓝朵曦曦阅读 535评论 0 48
  • 无意中看到微信公众号里面有比赛,班长就毫不犹豫的报名参加了。评选的是最团结班级。 开始所有人看到班长发出来的投票操...
    金小卫l阅读 380评论 0 1