類在繼承關係上的初始化的順序問題

2021-06-05 15:24:45 字數 2101 閱讀 5126

示例1:

class one

}

class two

}

public class test

}

輸出結果:

test main() start... 

one-1 

one-2 

one-3 

two

在 main() 方法中例項化了乙個 two 類的物件。但程式在初始化 two 類的物件時,並非先呼叫two 類的構造方法,而是先初始化 two 類的成員變數。這裡 two 類有 3 個成員變數,它們都是 one類的物件,所以要先呼叫 3 次 one 類的相應的構造方法。最後在初始化 two 類的物件。

示例2:

class one

}

class two

}

public class test

}

輸出結果:  

test main() start... 

one-3 

one-1 

one-2 

two-1 

one-1 

one-2 

two-2

如果乙個類中有靜態物件,那麼它會在非靜態物件前初始化,但只初始化一次。非靜態物件每次呼叫時都要初始化。示例3:

class one

}

class two

}

public class test

}

輸出結果:  

one-3 

one-1 

one-2 

two-3 

test main() start... 

one-1 

one-2 

two-1 

one-1 

one-2 

two-2 

程式中主類的靜態變數會在 main() 方法執行前初始化。結果中只輸出了一次 one-3 ,這也說明:如果乙個類中有靜態物件,那麼它會在非靜態物件前初始化,但只初始化一次。非靜態物件每次呼叫時都要初始化。

示例4:

class one

}

class two

}

public class test

}

不僅第 1 次建立物件時,類中所有的靜態變數要初始化,第 1 次訪問類中的靜態變數(沒有建立物件)時,該類中所有的靜態變數也要按照它們在類中排列的順序初始化。

綜上所述:

在建立物件時,物件所在類的所有資料成員會首先進行初始化,如果其中的成員變數有物件,那麼它們也會按照順序執行初始化工作。在所有類成員初始化完成後,才呼叫物件所在類的構造方法建立物件。構造方法作用就是初始化。

靜態物件(變數)在非靜態物件前初始化。靜態物件(變數)只初始化一次,再次呼叫就不初始化了,但非靜態物件在每次呼叫時都要初始化。

程式中的主類的靜態變數會在 main() 方法執行前進行初始化工作。

不僅第 1 次建立物件時,類中所有的靜態變數要初始化,第 1 次訪問類中的靜態變數(沒有建立物件)時,該類中所有的靜態變數也要按照它們在類中排列的順序初始化。

初始化的順序包括構造方法呼叫的順序如下:  

1 .主類的靜態成員首先初始化。  

2 .主類的超類的構造方法按照從最高到最低的順序被呼叫。  

3 .主類的非靜態物件(變數)初始化。  

4 .呼叫主類的構造方法。

在乙個構造方法中只能呼叫一次其它的構造方法,並且呼叫構造方法的語句必須是第一條語句。 

多重繼承關係的初始化順序

多重繼承關係的初始化順序是 父類屬性 父類構造方法 子類屬性 子類構造方法 不能被子類繼承的父類成員 private成員 子類和父類不在同乙個包,使用預設訪問許可權的成員 構造方法 構造方法不會被重寫,因為不能被繼承。1 super關鍵字來訪問父類的成員 2 super只能出現在子類的方法和構造方法...

繼承類的初始化

執行時,先訪問main函式。載入器開始啟動並找出該類的編譯 載入時,由於extends知道有乙個基類,於是載入基類。如果基類仍舊有基類,那麼再載入。直到所有的基類載入完畢。很重要的一點是static方法是在載入類的時候就被執行了,而static域也在此時也會在此時進行初始化。所有的類載入完畢。開始建...

類的初始化順序

寫了這麼多類 還沒仔細考慮過初始化順序 今天特意看了點這方面的知識 照著寫了個例子 初始化順序是 靜態變數 靜態初始化快 變數 初始化塊 建構函式 例子如下 public class classinitorder public classinitorder public static void ma...