Java 在方法和作用域內的內部類


通常,如果所讀寫 的代碼包含了內部類,那么它們都是"平凡的"內部類,簡單並且容易理解,然而,內部類的語法覆蓋了大量其它的更加難以理解的計數,例如可以在一個方法里或者在任意的作用域里定義內部類.這么做有兩個理由

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();
  }
} ///:~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM