Java內建了很好的隱藏機制:只給予某個類"包訪問權"(僅在同一個包內可見),而用不著把類建立為內部類.
當將內部類向上轉型為其基類,尤其轉型為一個介面的時候,內部類就有了用武之地.
從實現了某個介面的對象,得到對此介面的引用,與向上轉型為這個對象的基類,實質上效果是一樣的.
這是因為此內部類(某個介面的實現)對於其他人來說能夠完全不可見(而不只是包外不可見)且不可用.所得到的只是指向基類or介面的引用,所以能夠很方便的隱藏實現細節.class Parcel_Upcast...{
private class Pcontents implements Contents...{
private int value;
private Pcontents(int value)...{
this.value = value;
}
public int readValue()...{
return value;
}
}
private class Pdestination implements Destination...{
private String label;
private Pdestination(String toWhere)...{
label = toWhere;
}
public String readLabel()...{
return label;
}
}
public Contents getContents(int value)...{
return new Pcontents(value);
}
/**//*傳回型別最好設定為基類or介面,名稱get基類,return的是內部類就ok了.這可以理解為是一種規範.*/
public Destination getDestination(String label)...{
return new Pdestination(label);
}
}
main方法必須在一個獨立的類中,才能示範出私人內部類的性質
private內部類給類的設計者提供了一種途徑,通過這種方式可以完全阻止任何依賴於類型的編碼,並且完全隱藏了實現的細節.
從用戶端程式員的角度看,由於不能訪問任何新增加的,原來不屬於公用介面的方法,所以擴充介面是沒有價值的.這給編譯器提供了產生更高效代碼的機會.
普通的(非內部的)類,不能申明為private和protected,它們只可以被賦予public或者包訪問權.class TestParcel_Upcast...{
public static void main(String[] args) ...{
Parcel_Upcast par = new Parcel_Upcast();
Contents con = par.getContents(20);
Destination des = par.getDestination("NanJing");
}
}
/**//*重名問題*/
class Outer1...{
private int size;
class Inner...{
private int size;
public void doStuff(int size)...{
size++;//引用的是doStuff函數的形參
this.size++;//引用的是Inner類中的成員變數
Outer1.this.size++;//引用的是Outer1類中的成員變數
}
}
}