設計目的:假設事件處理的程式碼都在一個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
以下Modifier都適用在inner class上,對待inner class就像一個outer class的memberclass 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); } } }
- final
- abstract
- public
- private
- protected
- static—但是 static 會將它轉變成static nested class,而不是inner class。
- strictfp
Method-Local Inner Class
Static Nested 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
publicprivateprotectedstaticstrictfp
根據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(); } }
沒有留言:
張貼留言