[Java] 內部類

1. 創建內部類

創建內部類的方式就是把類的定義置於外圍類的裏面,例如:

class Test1 {
  class Test2 {
    private int i = 1;
    public void value() {
      System.out.println(i);
    }
  }
  public void f() {
      Test2 t = new Test2();
      t.value();
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t = new Test1();
    t.f();
  }
}

更典型的情況是外部類將有一個方法,返回一個指向內部類的引用,例如:

class Test1 {
  class Test2 {
    private int i = 1;
    public void value() {
      System.out.println(i);
    }
  }
  public Test2 f() {
      return new Test2();
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t1 = new Test1();
    Test1.Test2 t2 = t1.f();
    t2.value();
  }
}


2. .this與.new

如果需要生成對外部類對象的引用,可以使用外部類的名字後緊跟.this,這樣產生的引用自動地具有正確的類型,例如:

class Test1 {
  class Test2 {
    public Test1 outer() {
      return Test1.this;
    }
  }
  public Test2 inner() {
    return new Test2();
  }
  public void f() {
    System.out.println("Hello World!");
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t1 = new Test1();
    Test1.Test2 t2 = t1.inner();
    t2.outer().f();
  }
}

有時可能想要告知某些其他對象去創建其某個內部類的對象,必須在new表達式中提供對其他外部類對象的引用,這時需要.new,例如:

class Test1 {
  class Test2 {
    public void f() {
        System.out.println("Hello World!");
    }
  }
}
public class Main {
  public static void main(String[] args) {
    Test1 t1 = new Test1();
    Test1.Test2 t2 = t1.new Test2();
    t2.f();
  }
}

在擁有外部類之前是不能創建內部類對象的,但是如果創建的是嵌套類(靜態內部類),那麼它就不需要對外部類對象的引用,例如:

class Test1 {
  static class Test2 {
    public void f() {
        System.out.println("Hello World!");
    }
  }
}
public class Main {
  public static void main(String[] args) {
    Test1.Test2 t = new Test1.Test2();
    t.f();
  }
}


3. 局部內部類

在方法的作用域內創建一個完整的類,這被稱作局部內部類,它在方法之外是不能訪問的,例如:

class Test1 {
  void f() {
    System.out.println("Hello World");
  }
}
class Test2 {
  void inner() {
    class Test3 extends Test1 {}
    Test3 t = new Test3();
    t.f();
  }
}
public class Main {
  public static void main(String[] args) {
    Test2 t = new Test2();
    t.inner();
  }
}


4. 匿名內部類

匿名內部類沒有名字,不能直接引用它,只能在創建時作爲new的一部分來聲明。要使用匿名內部類,必須繼承一個父類或實現一個接口,例如:

abstract class Test1 {
  abstract void f();
}
class Test2 {
  public Test1 inner() {
    return new Test1() {
      public void f() {
        System.out.println("Hello World");
      }
    };
  }
}
public class Main {
  public static void main(String[] args) {
    Test2 t2 = new Test2();
    Test1 t1 = t2.inner();
    t1.f();
  }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章