java 靜態類 初始化 java靜態對象初始化

<div class="con editor-preview-side" id="result" data-version="1"><div class="editor-container container am-engine" id="container" data-element="root"><p><br></p><p>一、<strong>對象的初始化順序</strong></p><p>(1)加載父類(以下序號相同,表明初始化是按代碼從上到下的順序來的)</p><p>  1.爲父類的靜態屬性分配空間並賦於初值</p><p>  1.執行父類靜態初始化塊;</p><p>(2)加載子類</p><p>  2.爲子類的靜態屬性分配空間並賦於初值</p><p>  2.執行子類的靜態的內容;</p><p>(3)加載父類構造器</p><p>  3.初始化父類的非靜態屬性並賦於初值</p><p>  3.執行父類的非靜態代碼塊;</p><p>  4.執行父類的構造方法;</p><p>(4)加載子類構造器</p><p>  5.初始化子類的非靜態屬性並賦於初值</p><p>  5.執行子類的非靜態代碼塊;</p><p>  6.執行子類的構造方法.</p><p>總之一句話,靜態代碼塊內容先執行(父先後子),接着執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。</p><p>二、<strong>靜態變量和靜態代碼塊的初始化順序</strong>:</p><p>  誰在前面先初始化誰(這個也比較容易理解,初始化的時候,不可能跳着去初始化吧,比如說靜態代碼塊在靜態變量的前面,不可能先跳過靜態代碼塊的初始化先去執行靜態變量的初始化吧。)</p><p>注意:子類的構造方法,不管這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用</p><p>父類帶參數的構造方法,否則編譯不能通過。</p><p> </p><p> </p><p>    <strong>三、類裝載步驟</strong>   </p><p> </p><p> </p><p>       在Java中,類裝載器把一個類裝入Java虛擬機中,要經過三個步驟來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:   </p><p> </p><p> </p><p>    裝載:查找和導入類或接口的二進制數據;   </p><p> </p><p> </p><p>    鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;   </p><p> </p><p> </p><p>    校驗:檢查導入類或接口的二進制數據的正確性;   </p><p> </p><p> </p><p>    準備:給類的靜態變量分配並初始化存儲空間;   </p><p> </p><p> </p><p>    解析:將符號引用轉成直接引用;   </p><p> </p><p> </p><p>    初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊。   </p><p> </p><p> </p><p>    初始化類中屬性是靜態代碼塊的常用用途,但只能使用一次。   </p><p> </p><p> </p><p>        </p><p> </p><p> </p><p>    <strong>對象的初始化順序測試代碼</strong>   </p><p> </p><p>  </p><p>   </p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194626_64e1fd12eb50126073.gif" alt="java 靜態類 初始化 java靜態對象初始化_父類" style="visibility: visible; width: 11px;"></p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194627_64e1fd130907b43101.gif" alt="java 靜態類 初始化 java靜態對象初始化_java 靜態類 初始化_02" style="visibility: visible; width: 11px;"></p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_0" class="copy_btn disable">登錄後複製</button> <a title="登錄後一鍵下載全文代碼" class="downloadCode"><i class="iconblog blogimport  "></i></a> </div><pre class="language-plain prettyprint" tabindex="0"><code class="language-plain has-numbering" id="code_id_0">  StaticIniBlockOrderTest class Parent { static String name = " hello " ; { System.out.println( " parent block " ); } static { System.out.println( " parent static block " ); }

public Parent() { System.out.println( " parent constructor " ); } }

class Child extends Parent { static String childName = " hello " ; { System.out.println( " child block " ); } static { System.out.println( " child static block " ); }

public Child() { System.out.println( " child constructor " ); } }

public class StaticIniBlockOrderTest {

public static void main(String[] args) { new Child(); // 語句(*) } }</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li><li>8.</li><li>9.</li><li>10.</li><li>11.</li><li>12.</li><li>13.</li><li>14.</li><li>15.</li><li>16.</li><li>17.</li><li>18.</li><li>19.</li><li>20.</li><li>21.</li><li>22.</li><li>23.</li><li>24.</li><li>25.</li><li>26.</li><li>27.</li><li>28.</li><li>29.</li><li>30.</li><li>31.</li><li>32.</li><li>33.</li><li>34.</li><li>35.</li></ul></pre></div><div class="toolbar"></div></div></div><p>  </p><p>    運行結果:   </p><p>  </p><p>    </p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_1" class="copy_btn disable">登錄後複製</button> <a title="登錄後一鍵下載全文代碼" class="downloadCode"><i class="iconblog blogimport  "></i></a> </div><pre class="language- language-none prettyprint" tabindex="0"><code class="language-none has-numbering" id="code_id_1">parent static block       child static block      parent block      parent constructor      child block      child constructor</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li></ul></pre></div><div class="toolbar"></div></div></div><p>  </p><p>  </p><p>   <strong>靜態變量和靜態代碼塊的初始化順序測試代碼</strong>  </p><p>      </p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194626_64e1fd12eb50126073.gif" alt="java 靜態類 初始化 java靜態對象初始化_父類" style="visibility: visible; width: 11px;"></p><p style="text-align:center;"><img src="https://s2.51cto.com/images/blog/202308/20194627_64e1fd130907b43101.gif" alt="java 靜態類 初始化 java靜態對象初始化_java 靜態類 初始化_02" style="visibility: visible; width: 11px;"></p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_2" class="copy_btn disable">登錄後複製</button> <a title="登錄後一鍵下載全文代碼" class="downloadCode"><i class="iconblog blogimport  "></i></a> </div><pre class="language-plain prettyprint" tabindex="0"><code class="language-plain has-numbering" id="code_id_2">  TestOrder public class TestOrder { // 靜態變量 public static TestA a = new TestA();

// 靜態初始化塊 static { System.out.println( " 靜態初始化塊 " ); }

// 靜態變量 public static TestB b = new TestB();

public static void main(String[] args) { new TestOrder(); } }

class TestA { public TestA() { System.out.println( " Test--A " ); } }

class TestB { public TestB() { System.out.println( " Test--B " ); } }</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li><li>8.</li><li>9.</li><li>10.</li><li>11.</li><li>12.</li><li>13.</li><li>14.</li><li>15.</li><li>16.</li><li>17.</li><li>18.</li><li>19.</li><li>20.</li><li>21.</li><li>22.</li><li>23.</li><li>24.</li><li>25.</li><li>26.</li><li>27.</li><li>28.</li><li>29.</li></ul></pre></div><div class="toolbar"></div></div></div><p> 運行結果:   </p><p>  Test--A </p><p>   靜態初始化塊 </p><p>   Test--B</p><p>再加一個經典的測試代碼</p><p>   </p><div><div class="code-toolbar"><div class="hljs-cto"><div class="operation_box"><button data-clipboard-target="#code_id_3" class="copy_btn disable">登錄後複製</button> <a title="登錄後一鍵下載全文代碼" class="downloadCode"><i class="iconblog blogimport  "></i></a> </div><pre class="language-plain prettyprint" tabindex="0"><code class="language-plain has-numbering" id="code_id_3">package static測試;

class insect{     int i=9;     int j;

static {         prt("static block first,because it's begin of the static variable");     }          insect(){         System.out.println("insect initialized");

prt("i= "+i+" j="+j);

j=39;

}

static int x1=prt("static insect x1 initialized");

static int prt(String s){

System.out.println(s);

return 47;

}

}

public class Wps extends insect{          Wps(){         System.out.println("wps initialized");

prt("k="+k);

prt("j="+j);

}     int k=prt("the member k in wps be initialized");

static int x2=prt("static wps x2 initialized");

static int prt(String s){

System.out.println(s);

return 63;

}

public static void main(String[] args){

insect.prt("initialized constructor");

//       Wps w=new Wps();

}

}</code><ul class="pre-numbering" style=""><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li><li>8.</li><li>9.</li><li>10.</li><li>11.</li><li>12.</li><li>13.</li><li>14.</li><li>15.</li><li>16.</li><li>17.</li><li>18.</li><li>19.</li><li>20.</li><li>21.</li><li>22.</li><li>23.</li><li>24.</li><li>25.</li><li>26.</li><li>27.</li><li>28.</li><li>29.</li><li>30.</li><li>31.</li><li>32.</li><li>33.</li><li>34.</li><li>35.</li><li>36.</li><li>37.</li><li>38.</li><li>39.</li><li>40.</li><li>41.</li><li>42.</li><li>43.</li><li>44.</li><li>45.</li><li>46.</li><li>47.</li><li>48.</li><li>49.</li><li>50.</li><li>51.</li><li>52.</li><li>53.</li><li>54.</li><li>55.</li><li>56.</li><li>57.</li><li>58.</li><li>59.</li><li>60.</li><li>61.</li><li>62.</li></ul></pre></div><div class="toolbar"></div></div></div><p>   </p><p>  </p><p> </p><p><br></p></div></div>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章