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