通常,如果所讀寫 的代碼包含了內部類,那么它們都是"平凡的"內部類,簡單並且容易理解,然而,內部類的語法覆蓋了大量其它的更加難以理解的計數,例如可以在一個方法里或者在任意的作用域里定義內部類.這么做有兩個理由
1)如前所述,你實現了某類型的接口,於是可以創建並返回對其的引用
2)你要創建一個復雜的問題,想創建一個類來輔助你的解決方案,但是又不希望這個類是公共可用的.
在后面的例子中前面的代碼將被修改,以用來實現:
1)一個定義在方法中的類
2)一個定義在作用域內的類,此作用域在方法的內部
3)一個實現了接口的匿名類
4)一個匿名類,它擴展了有非默認構造器的類
5)一個匿名類,它執行字段初始化
6)一個匿名類,它通過實例初始化實現構造(匿名類不可以能有過構造器)
//: innerclasses/Destination.java package object; public interface Destination { String readLabel(); } ///:~ //: innerclasses/Parcel5.java // Nesting a class within a method. package object; public class Parcel5 { public Destination destination(String s) { class PDestination implements Destination {//在destination方法之外不可使用類,可以通過Destination使用 private String label; //PDestination類的public方法
private PDestination(String whereTo) { label = whereTo; } public String readLabel() { return label; } } return new PDestination(s); } class PDestination //可以定義和PDestination重名的類,但最好不這樣做 { } public static void main(String[] args) { Parcel5 p = new Parcel5(); Destination d = p.destination("Tasmania"); } } ///:~
//: innerclasses/Parcel6.java // Nesting a class within a scope. package object; public class Parcel6 { private void internalTracking(boolean b) { if(b) { class TrackingSlip { //在if域之外類TrackingSlip不可用,可以通過internalTracking方法調用,TrackingSlip類的方法 private String id; TrackingSlip(String s) { id = s; } String getSlip() { return id; } } TrackingSlip ts = new TrackingSlip("slip"); String s = ts.getSlip(); } // Can't use it here! Out of scope: //! TrackingSlip ts = new TrackingSlip("x"); } public void track() { internalTracking(true); } public static void main(String[] args) { Parcel6 p = new Parcel6(); p.track(); } } ///:~