<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## [組合語法](https://lingcoder.gitee.io/onjava8/#/book/08-Reuse?id=%e7%bb%84%e5%90%88%e8%af%ad%e6%b3%95) 在前面的學習中,“組合”(Composition)已經被多次使用。你僅需要把對象的引用(object references)放置在一個新的類里,這就使用了組合。例如,假設你需要一個對象,其中內置了幾個**String**對象,兩個基本類型(primitives)的屬性字段,一個其他類的對象。對于非基本類型對象,將引用直接放置在新類中,對于基本類型屬性字段則僅進行聲明。 ~~~ // reuse/SprinklerSystem.java // (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Composition for code reuse class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = "Constructed"; } @Override public String toString() { return s; } } public class SprinklerSystem { private String valve1, valve2, valve3, valve4; private WaterSource source = new WaterSource(); private int i; private float f; @Override public String toString() { return "valve1 = " + valve1 + " " + "valve2 = " + valve2 + " " + "valve3 = " + valve3 + " " + "valve4 = " + valve4 + "\n" + "i = " + i + " " + "f = " + f + " " + "source = " + source; // [1] } public static void main(String[] args) { SprinklerSystem sprinklers = new SprinklerSystem(); System.out.println(sprinklers); } } /* Output: WaterSource() valve1 = null valve2 = null valve3 = null valve4 = null i = 0 f = 0.0 source = Constructed */ ~~~ 這兩個類中定義的一個方法是特殊的:`toString()`。每個非基本類型對象都有一個`toString()`方法,在編譯器需要字符串但它有對象的特殊情況下調用該方法。因此,在 \[1\] 中,編譯器看到你試圖“添加”一個**WaterSource**類型的字符串對象 。因為字符串只能拼接另一個字符串,所以它就先會調用`toString()`將**source**轉換成一個字符串。然后,它可以拼接這兩個字符串并將結果字符串傳遞給`System.out.println()`。要對創建的任何類允許這種行為,只需要編寫一個**toString()**方法。在`toString()`上使用**@Override**注釋來告訴編譯器,以確保正確地覆蓋。\*\*@Override\*\* 是可選的,但它有助于驗證你沒有拼寫錯誤 (或者更微妙地說,大小寫字母輸入錯誤)。類中的基本類型字段自動初始化為零,正如**object Everywhere**一章中所述。但是對象引用被初始化為**null**,如果你嘗試調用其任何一個方法,你將得到一個異常(一個運行時錯誤)。方便的是,打印**null**引用卻不會得到異常。 編譯器不會為每個引用創建一個默認對象,這是有意義的,因為在許多情況下,這會導致不必要的開銷。初始化引用有四種方法: 1. 當對象被定義時。這意味著它們總是在調用構造函數之前初始化。 2. 在該類的構造函數中。 3. 在實際使用對象之前。這通常稱為*延遲初始化*。在對象創建開銷大且不需要每次都創建對象的情況下,它可以減少開銷。 4. 使用實例初始化。 以上四種實例創建的方法例子在這: ~~~ // reuse/Bath.java // (c)2017 MindView LLC: see Copyright.txt // We make no guarantees that this code is fit for any purpose. // Visit http://OnJava8.com for more book information. // Constructor initialization with composition class Soap { private String s; Soap() { System.out.println("Soap()"); s = "Constructed"; } @Override public String toString() { return s; } } public class Bath { private String // Initializing at point of definition: s1 = "Happy", s2 = "Happy", s3, s4; private Soap castille; private int i; private float toy; public Bath() { System.out.println("Inside Bath()"); s3 = "Joy"; toy = 3.14f; castille = new Soap(); } // Instance initialization: { i = 47; } @Override public String toString() { if(s4 == null) // Delayed initialization: s4 = "Joy"; return "s1 = " + s1 + "\n" + "s2 = " + s2 + "\n" + "s3 = " + s3 + "\n" + "s4 = " + s4 + "\n" + "i = " + i + "\n" + "toy = " + toy + "\n" + "castille = " + castille; } public static void main(String[] args) { Bath b = new Bath(); System.out.println(b); } } /* Output: Inside Bath() Soap() s1 = Happy s2 = Happy s3 = Joy s4 = Joy i = 47 toy = 3.14 castille = Constructed */ ~~~ 在**Bath**構造函數中,有一個代碼塊在所有初始化發生前就已經執行了。當你不在定義處初始化時,仍然不能保證在向對象引用發送消息之前執行任何初始化——如果你試圖對未初始化的引用調用方法,則未初始化的引用將產生運行時異常。 當調用`toString()`時,它將賦值 s4,以便在使用字段的時候所有的屬性都已被初始化。
                  <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>

                              哎呀哎呀视频在线观看