日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java构造器、静态对象、非静态对象等的初始化顺序

發布時間:2025/3/15 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java构造器、静态对象、非静态对象等的初始化顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java創建類對象時對于構造器,靜態對象、非靜態對象的初始化有一定的順序,我簡單歸納一下:

class classes {public classes(String n) {System.out.println("classes constructor. " + n);} }class classOne {static classes class2 = new classes("class2");classOne() {System.out.println("classOne constructor");}classes class1 = new classes("class1"); }class classTwo extends classOne {classes class3 = new classes("class3");static classes class4 = new classes("class4");classTwo() {System.out.println("classTwo constructor");} }public class Test4 extends classTwo {classes class5 = new classes("class5");static classes class6 = new classes("class6");Test4() {System.out.println("Test4 constructor");}public static void main(String[] args) {Test4 test4 = new Test4();} }

在這個例子中,類classes是為了下面的類創建對象時能有一定的響應,因為在類中創建基本類型時無法在屏幕看到它被創建的消息,因此我使用了classes作為一個標記,當我創建了一個classes對象且在代碼中調用時,會得到相應的響應。

classOne是一個基類,它里面包含了一個靜態的classes對象,一個非靜態的classes對象,一個構造器。calssTwo繼承了classOne,同樣地,它也有基類的相同類型的數據定義,為了降低兩個類之間初始化順序的偶然性,我加入了主類Test4繼承了classTwo,以模擬多層次的繼承關系。

現在,在Test4中的main方法中創建一個Test4對象,在屏幕上的輸出如下:

classes constructor. class2
classes constructor. class4
classes constructor. class6
classes constructor. class1
classOne constructor
classes constructor. class3
classTwo constructor
classes constructor. class5

Test4? constructor

我簡單解讀Java對于這段代碼初始化的順序,首先,創建Test4對象指令發出后,Java查找到Test4還有基類ClassTwo,而classTwo還有基類calssOne,假如classOne還有基類(實際上classOne繼承了Java中的Object類,這里不做討論),它會一直查找,知道找到根本的那個類。找完(也可以稱作類的加載)之后,開始執行初始化,首先初始化基類的static成員,即是創建class2這個對象的這段代碼,接著是初始化基類的導出類中的static成員,這個初始化一直到最后層次的導出類,我們先稱它為過程1?,F在static成員被初始化完畢,接著再回到基類,也就是本例中的classOne這個類,初始化它的非static成員,然后調用它的構造器,請注意,這個過程一定是非static成員先于構造器,不管它們在代碼中的順序如何。調用完classOne構造器后,來到calssTwo,初始化它的非static成員,調用它的構造器,接著來到下一個導出類Test4,初始化它的非static成員,調用它的構造器,這樣一層一層地執行這種指令,如果從classOne到Test4中間還有多個中間類,那么都會執行這種指令。

至此,一個Test4對象的構建就完成了,歸納起來大概就是:

基類static成員 > 導出類1static成員 > 導出類1的導出類static成員 > ..... > 基類非static成員 >?
基類構造器 > 導出類1非static成員 > 導出類1構造器 > 導出類1的導出類非static成員 > 導出類1的導出類構造器

> ....非static成員 > ....構造器 > 最底層導出類非static成員 > 最底層導出類構造器

此外,記得我剛才標注的過程1,即初始化static成員的這個過程。當我們第一次創建對象時,這個static成員的初始化過程才會發生,此后如果再次創建對象,過程1不再發生,比如我在Test4的main方法種創建完test4這個對象之后,在它后面再加一行代碼:

Test4 test42 = new Test4();

那么針對這行的創建結果,響應就是:

classes constructor. class1
classOne constructor
classes constructor. class3
classTwo constructor
classes constructor. class5

Test4? constructor

也就是不再初始化static成員。

原因大概就是:static成員不屬于某個具體的類對象,它屬于整個類,因此,static成員的初始化只在類第一次加載時發生,對于本例中創建的test4對象,就是發生了類的第一次加載,因此它執行了初始化static,對于之后的test42對象,類不是第一次加載,因此不執行初始化static成員的指令。

以上代碼在命令行以及JavaIDE eclipse中均測試一致。

總結

以上是生活随笔為你收集整理的Java构造器、静态对象、非静态对象等的初始化顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。