熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

內部類和上溯造型

2013-11-23 19:14:00  來源: Java核心技術 

  迄今為止內部類看起來仍然沒什麼特別的地方畢竟用它實現隱藏顯得有些大題小做Java已經有一個非常優秀的隱藏機制——只允許類成為友好的(只在一個包內可見)而不是把它創建成一個內部類
  
  然而當我們准備上溯造型到一個基礎類(特別是到一個接口)的時候內部類就開始發揮其關鍵作用(從用於實現的對象生成一個接口句柄具有與上溯造型至一個基礎類相同的效果)這是由於內部類隨後可完全進入不可見或不可用狀態——對任何人都將如此所以我們可以非常方便地隱藏實施細節我們得到的全部回報就是一個基礎類或者接口的句柄而且甚至有可能不知道准確的類型就象下面這樣
  
  //: Parceljava
  // Returning a handle to an inner class
  package cparcel;
  
  abstract class Contents {
   abstract public int value();
  }
  
  interface Destination {
   String readLabel();
  }
  
  public class Parcel {
   private class PContents extends Contents {
    private int i = ;
    public int value() { return i; }
   }
   protected class PDestination
     implements Destination {
    private String label;
    private PDestination(String whereTo) {
     label = whereTo;
    }
    public String readLabel() { return label; }
   }
   public Destination dest(String s) {
    return new PDestination(s);
   }
   public Contents cont() {
    return new PContents();
   }
  }
  
  class Test {
   public static void main(String[] args) {
    Parcel p = new Parcel();
    Contents c = nt();
    Destination d = pdest(Tanzania);
    // Illegal cant access private class:
    //! ParcelPContents c = pnew PContents();
   }
  } ///:~
  
  現在Contents和Destination代表可由客戶程序員使用的接口(記住接口會將自己的所有成員都變成public屬性)為方便起見它們置於單獨一個文件裡但原始的Contents和Destination在它們自己的文件中是相互public的
  
  在Parcel一些新東西已經加入內部類PContents被設為private所以除了Parcel之外其他任何東西都不能訪問它PDestination被設為protected所以除了ParcelParcel包內的類(因為protected也為包賦予了訪問權也就是說protected也是友好的以及Parcel的繼承者之外其他任何東西都不能訪問PDestination這意味著客戶程序員對這些成員的認識與訪問將會受到限制事實上我們甚至不能下溯造型到一個private內部類(或者一個protected內部類除非自己本身便是一個繼承者)因為我們不能訪問名字就象在classTest裡看到的那樣所以利用private內部類類設計人員可完全禁止其他人依賴類型編碼並可將具體的實施細節完全隱藏起來除此以外從客戶程序員的角度來看一個接口的范圍沒有意義的因為他們不能訪問不屬於公共接口類的任何額外方法這樣一來Java編譯器也有機會生成效率更高的代碼
  
  普通(非內部)類不可設為private或protected——只允許public或者友好的
  
  注意Contents不必成為一個抽象類在這兒也可以使用一個普通類但這種設計最典型的起點依然是一個接口
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26501.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.