<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/10-Interfaces?id=%e6%8e%a5%e5%8f%a3%e9%80%82%e9%85%8d) 接口最吸引人的原因之一是相同的接口可以有多個實現。在簡單情況下體現在一個方法接受接口作為參數,該接口的實現和傳遞對象則取決于方法的使用者。 因此,接口的一種常見用法是前面提到的*策略*設計模式。編寫一個方法執行某些操作并接受一個指定的接口作為參數。可以說:“只要對象遵循接口,就可以調用方法” ,這使得方法更加靈活,通用,并更具可復用性。 例如,類**Scanner**的構造器接受的是一個**Readable**接口(在“字符串”一章中學習更多相關內容)。你會發現**Readable**沒有用作 Java 標準庫中其他任何方法的參數——它是單獨為**Scanner**創建的,因此**Scanner**沒有將其參數限制為某個特定類。通過這種方式,**Scanner**可以與更多的類型協作。如果你創建了一個新類并想讓**Scanner**作用于它,就讓它實現**Readable**接口,像這樣: ~~~ // interfaces/RandomStrings.java // Implementing an interface to conform to a method import java.nio.*; import java.util.*; public class RandomStrings implements Readable { private static Random rand = new Random(47); private static final char[] CAPITALS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); private static final char[] LOWERS = "abcdefghijklmnopqrstuvwxyz".toCharArray(); private static final char[] VOWELS = "aeiou".toCharArray(); private int count; public RandomStrings(int count) { this.count = count; } @Override public int read(CharBuffer cb) { if (count-- == 0) { return -1; // indicates end of input } cb.append(CAPITALS[rand.nextInt(CAPITALS.length)]); for (int i = 0; i < 4; i++) { cb.append(VOWELS[rand.nextInt(VOWELS.length)]); cb.append(LOWERS[rand.nextInt(LOWERS.length)]); } cb.append(" "); return 10; // Number of characters appended } public static void main(String[] args) { Scanner s = new Scanner(new RandomStrings(10)); while (s.hasNext()) { System.out.println(s.next()); } } } ~~~ 輸出: ~~~ Yazeruyac Fowenucor Goeazimom Raeuuacio Nuoadesiw Hageaikux Ruqicibui Numasetih Kuuuuozog Waqizeyoy ~~~ **Readable**接口只需要實現`read()`方法(注意`@Override`注解的突出方法)。在`read()`方法里,將輸入內容添加到**CharBuffer**參數中(有多種方法可以實現,查看**CharBuffer**文檔),或在沒有輸入時返回**\-1**。 假設你有一個類沒有實現**Readable**接口,怎樣才能讓**Scanner**作用于它呢?下面是一個產生隨機浮點數的例子: ~~~ // interfaces/RandomDoubles.java import java.util.*; public interface RandomDoubles { Random RAND = new Random(47); default double next() { return RAND.nextDouble(); } static void main(String[] args) { RandomDoubles rd = new RandomDoubles(){}; for (int i = 0; i < 7; i++) { System.out.println(rd.next() + " "); } } } ~~~ 輸出: ~~~ 0.7271157860730044 0.5309454508634242 0.16020656493302599 0.18847866977771732 0.5166020801268457 0.2678662084200585 0.2613610344283964 ~~~ 我們可以再次使用適配器模式,但這里適配器類可以實現兩個接口。因此,通過關鍵字**interface**提供的多繼承,我們可以創建一個既是**RandomDoubles**,又是**Readable**的類: ~~~ // interfaces/AdaptedRandomDoubles.java // creating an adapter with inheritance import java.nio.*; import java.util.*; public class AdaptedRandomDoubles implements RandomDoubles, Readable { private int count; public AdaptedRandomDoubles(int count) { this.count = count; } @Override public int read(CharBuffer cb) { if (count-- == 0) { return -1; } String result = Double.toString(next()) + " "; cb.append(result); return result.length(); } public static void main(String[] args) { Scanner s = new Scanner(new AdaptedRandomDoubles(7)); while (s.hasNextDouble()) { System.out.print(s.nextDouble() + " "); } } } ~~~ 輸出: ~~~ 0.7271157860730044 0.5309454508634242 0.16020656493302599 0.18847866977771732 0.5166020801268457 0.2678662084200585 0.2613610344283964 ~~~ 因為你可以以這種方式在已有類中增加新接口,所以這就意味著一個接受接口類型的方法提供了一種讓任何類都可以與該方法進行適配的方式。這就是使用接口而不是類的強大之處。
                  <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>

                              哎呀哎呀视频在线观看