<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 6.9 初始化和類裝載 在許多傳統語言里,程序都是作為啟動過程的一部分一次性載入的。隨后進行的是初始化,再是正式執行程序。在這些語言中,必須對初始化過程進行慎重的控制,保證`static`數據的初始化不會帶來麻煩。比如在一個`static`數據獲得初始化之前,就有另一個`static`數據希望它是一個有效值,那么在C++中就會造成問題。 Java則沒有這樣的問題,因為它采用了不同的裝載方法。由于Java中的一切東西都是對象,所以許多活動變得更加簡單,這個問題便是其中的一例。正如下一章會講到的那樣,每個對象的代碼都存在于獨立的文件中。除非真的需要代碼,否則那個文件是不會載入的。通常,我們可認為除非那個類的一個對象構造完畢,否則代碼不會真的載入。由于`static`方法存在一些細微的歧義,所以也能認為“類代碼在首次使用的時候載入”。 首次使用的地方也是`static`初始化發生的地方。裝載的時候,所有`static`對象和`static`代碼塊都會按照本來的順序初始化(亦即它們在類定義代碼里寫入的順序)。當然,`static`數據只會初始化一次。 ## 6.9.1 繼承初始化 我們有必要對整個初始化過程有所認識,其中包括繼承,對這個過程中發生的事情有一個整體性的概念。請觀察下述代碼: ``` //: Beetle.java // The full process of initialization. class Insect { int i = 9; int j; Insect() { 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 Beetle extends Insect { int k = prt("Beetle.k initialized"); Beetle() { prt("k = " + k); prt("j = " + j); } static int x2 = prt("static Beetle.x2 initialized"); static int prt(String s) { System.out.println(s); return 63; } public static void main(String[] args) { prt("Beetle constructor"); Beetle b = new Beetle(); } } ///:~ ``` 該程序的輸出如下: ``` static Insect.x initialized static Beetle.x initialized Beetle constructor i = 9, j = 0 Beetle.k initialized k = 63 j = 39 ``` 對`Beetle`運行`java`時,發生的第一件事情是裝載程序到外面找到那個類。在裝載過程中,裝載程序注意它有一個基類(即`extends`關鍵字要表達的意思),所以隨之將其載入。無論是否準備生成那個基類的一個對象,這個過程都會發生(請試著將對象的創建代碼當作注釋標注出來,自己去證實)。 若基類含有另一個基類,則另一個基類隨即也會載入,以此類推。接下來,會在根基類(此時是`Insect`)執行`static`初始化,再在下一個派生類執行,以此類推。保證這個順序是非常關鍵的,因為派生類的初始化可能要依賴于對基類成員的正確初始化。 此時,必要的類已全部裝載完畢,所以能夠創建對象。首先,這個對象中的所有基本數據類型都會設成它們的默認值,而將對象引用設為`null`。隨后會調用基類構造器。在這種情況下,調用是自動進行的。但也完全可以用`super`來自行指定構造器調用(就象在`Beetle()`構造器中的第一個操作一樣)。基類的構建采用與派生類構造器完全相同的處理過程。基礎順構造器完成以后,實例變量會按本來的順序得以初始化。最后,執行構造器剩余的主體部分。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看