1. 程式人生 > >Java程式碼執行順序

Java程式碼執行順序

JAVA是一門面向物件的程式語言,這裡考慮“類”裡面在程式開始執行時的執行順序。
先看一個例項:

class Person{
    static {
        System.out.println("執行Person靜態程式碼塊");
    }
    {
        System.out.println("執行Person構造程式碼塊");
    }
    public Person(){
        System.out.println("執行Person無參構造方法");
    }
    public Person(String name){
        System.out.println("執行Person構造方法"
+ name); } } class Student extends Person{ static { System.out.println("執行Student靜態程式碼塊"); } { System.out.println("執行Student構造程式碼塊"); } public Student(String name){ super(name); System.out.println("執行Student構造方法" + name); } public Student(){ super(); System.out.println("執行Student無參構造方法"
); } } public class ExtendsStaticConstruct { public static void main(String args[]){ Student student1 = new Student("lili"); System.out.println("--------------------"); Student student2 = new Student(); } }

執行結果:
這裡寫圖片描述

說明:
一般的類裡面包含:
1、靜態程式碼塊(靜態區、靜態變數等)
2、構造程式碼塊({ }中間的內容)
3、構造方法

其執行順序也是1、2、3先後執行,這裡需要注意的是:考慮繼承特性。
子類與父類的執行順序是:
1、先執行父類的靜態程式碼塊(父1)
2、子類的靜態程式碼塊(子1)
3、父類構造程式碼塊(父2)
4、父類構造方法(父3)
5、子類構造程式碼塊(子2)
6、子類構造方法(子3)

當一個類從被JVM裝載開始,各種程式碼的執行順序大致如下:

被JVM裝載->
執行父類的相關程式碼->
如果有靜態初始化,先執行靜態初始化,且只執行一次,以後即使有該類例項化,也不會再執行->
如果有靜態程式碼塊,以與靜態初始化一樣的方式執行->
如果有new語句帶來的例項化,先為成員變數分配空間,並繫結引數列表,隱式或顯式執行super(),即父類的構造方法->
執行非靜態程式碼塊->
執行本類的建構函式->
執行其他程式碼。

這裡的執行順序同子類構造中有一個預設的父類構造super()無關,不是執行到隱藏的super()才開始初始化父類的,類的初始化是分層初始化,即先初始化父類,再初始化子類,初始化每個類的過程中,進行類的初始化工作,先進性成員變數的初始化,成員變數的初始化順序是:預設初始化,即int為0這種->顯示初始化,例如給int型顯示初始化了值->構造方法初始化,所以是這裡執行到了構造方法。

但是一定要注意,父類初始化選擇的構造方法卻和子類中super 選擇的構造相關,下面程式碼很好的解釋了這點。