2017年11月11日 星期六

Inner Class

Inner Class 
設計目的:假設事件處理的程式碼都在一個class,但是為了要讓這個事件處理的class在執行的時候可以很容易存取某個class的members(例如聊天室的文字方塊,介面..)。這時候就可以使用Outer class和Innter class有特殊連結關係的Innter class
  • Inner class就像是Outer class的member,所以可以存取Outer class的private instance variable
以下範例顯示如何在Outer class呼叫Innter class

class MyOuter {
 private int x = 1;
 public void testInner() {
  MyInner in = new MyInner(); // 建立內部類別的實體
  in.innerGo();
 }
 class MyInner {
  public void innerGo() {
   System.out.println("Outer x is " + x); // 可以使用private variable
  }
 }
}

若在其他的class要呼叫MyInner class的話,記住class type是[OuterClass].[InnerClass]

MyOuter.MyInner inner = new MyOuter().new MyInner();

就像是member,若要使用inner class,外部的static method也不能使用非static的inner class

class pockets {
    public static void main(String[] args){
        String[] sa = {"nickel", "button", "key", "lint"};
        Sorter s = new Sorter();// Compile error!!!!!不能在static method內使用非static的Sorter class
        
    }
    class Sorter implements Comparator<String>{
        @Override
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
    }
}

以下Modifier都適用在inner class上,對待inner class就像一個outer class的member
  • final
  • abstract
  • public
  • private
  • protected
  • static—但是 static 會將它轉變成static nested class,而不是inner class。
  • strictfp 
Method-Local Inner Class 
  • 只有在method內才能使用該inner class
  • 和Inner class一樣,就像是Outer class的member,所以可以存取Outer class的private instance variable
  • Java 1.8版後可以使用原method的variable(原本不能的原因是若method-local inner class 實體化後傳到外部還存在,但method內的variable卻會因為執行完畢而被剔除在stack中,如果不是final會存取不到這個variable)
  • 若外部method是static,則內部的class也不能夠存取外部非static的instance
以下Modifier可用在method-locla inner class上,不適用的剔除(規則和local variable相同)
  • final
  • abstract
  • public
  • private
  • protected
  • static
  • strictfp 

Static Nested Class 
根據Inner class的定義,static nested class不是inner class的一種
  • inner class和outer class的instance間有特殊的關聯,但static nested class沒有
  • 主要為name-space的解決方案,而非和outer class間的隱含關係
  • 單純位於outer class的非inner的class
  • 屬於outer class的一個static member
  • 並沒有所謂的static的class,使用static nested class只是為了表示是outer class的一個static member
  • 就像 static method無法存取instance variable和class中的非 static method一樣,static nested class也無法存取outer class的instance variable和class中的非 static method。
  • 表示可以像其他static member一樣被存取,outer class不需要new實體就可以取得,但內部的class還是需要new才能產生
  • new MyOuter.MyInner();
    
範例:

class BigOuter {
 static class Nest {
  void go() {
   System.out.println("hi");
  }
 }
}
class Broom {
 static class B2 {
  void goB2() {
   System.out.println("hi 2");
  }
 }
 public static void main(String[] args) {
  BigOuter.Nest n = new BigOuter.Nest(); // 兩個類別的名字都用到了 n.go();
  B2 b2 = new B2(); // 存取被包圍的類別
  b2.goB2();
 }
}

沒有留言:

張貼留言