若想生成外部類對象的句柄,就要用一個點號以及一個this來命名外部類。舉個例子來說,在Sequence.SSelector類中,它的所有方法都能產生外部類Sequence的存儲句柄,方法是采用Sequence.this的形式。結果獲得的句柄會自動具備正確的類型(這會在編譯期間檢查並核實,所以不會出現運行期的開銷)。
有些時候,我們想告訴其他某些對象創建它某個內部類的一個對象。為達到這個目的,必須在new表達式中提供指向其他外部類對象的一個句柄,就象下面這樣:
//: Parcel11.java // Creating inner classes package c07.parcel11; public class Parcel11 { class Contents { private int i = 11; public int value() { return i; } } class Destination { private String label; Destination(String whereTo) { label = whereTo; } String readLabel() { return label; } } public static void main(String[] args) { Parcel11 p = new Parcel11(); // Must use instance of outer class // to create an instances of the inner class: Parcel11.Contents c = p.new Contents(); Parcel11.Destination d = p.new Destination("Tanzania"); } } ///:~
為直接創建內部類的一個對象,不能象大家或許猜想的那樣——采用相同的形式,並引用外部類名Parcel11。此時,必須利用外部類的一個對象生成內部類的一個對象:
Parcel11.Contents c = p.new Contents();
因此,除非已擁有外部類的一個對象,否則不可能創建內部類的一個對象。這是由於內部類的對象已同創建它的外部類的對象“默默”地連接到一起。然而,如果生成一個static內部類,就不需要指向外部類對象的一個句柄。