依定義的方式不同,內部類別分為靜態內部類別、成員內部類別、局部內部類別、匿名內部類別四種。
1.靜態內部類別
定義在類別內部的靜態類,就是靜態內部類別。
public class Out { private static int a; private int b; public static class Inner { public void print() { System.out.println(a); } } }
1)靜態內部類別可以存取外部類別所有的靜態變數和方法,即使是private的也一樣。
(推薦影片:java影片教學#)
2)靜態內部類別和一般類別一致,可以定義靜態變數、方法、建構方法等。
3)其他類別使用靜態內部類別需要使用「外部類別.靜態內部類別」方式。如下圖所示:Out.Inner inner = new Out.Inner(); inner.print();
4)Java集合類別HashMap內部就有一個靜態內部類別Entry。 Entry是HashMap存放元素的抽象,HashMap內部維護Entry陣列用來存放元素,但是Entry對使用者是透明的。像這種和外部類別關係密切的,且不依賴外部類別實例的,都可以使用靜態內部類別。
2.成員內部類別
定義在類別內部的非靜態類,就是成員內部類別。成員內部類別不能定義靜態方法和變數(final修飾的除外)。這是因為成員內部類別是非靜態的,類別初始化的時候先初始化靜態成員,如果允許成員內部類別定義靜態變數,那麼成員內部類別的靜態變數初始化順序是有歧義的。
public class Out { private static int a; private int b; public class Inner { public void print() { System.out.println(a); System.out.println(b); } } }
3.局部內部類別(定義在方法中的類別)
定義在方法中的類,就是局部類別。如果一個類別只在某個方法中使用,則可以考慮使用局部類別。
public class Out { private static int a; private int b; public void test(final int c) { final int d = 1; class Inner { public void print() { System.out.println(c); } } } }
4.匿名內部類別(要繼承一個父類別或實作一個介面、直接使用new來產生一個物件的參考)
匿名內部類,我們必須要繼承一個父類或實作一個接口,當然也只能只繼承一個父類或實作一個接口。同時它也是沒有class關鍵字,這是因為匿名內部類別是直接使用new來產生一個物件的參考。
1)匿名內部類別只能能使用一次,在建立匿名內部類別時,它會立即建立一個該類別的實例,該類別的定義會立即消失,所以匿名內部類別時不能夠被重複使用的。
2)匿名內部類別不能定義建構函數,不能存在任何的靜態成員變數和靜態方法。
3)匿名內部類別中的方法不能是抽象的,它必須要實作介面或繼承父類別的所有抽象方法。
4)匿名內部類別存取的外部類別成員變數或成員方法必須以static修飾,內部類別可以存取外部類別私有變數和方法。
public abstract class Bird { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract int fly(); } public class Test { public void test(Bird bird){ System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米"); } public static void main(String[] args) { Test test = new Test(); test.test(new Bird() { public int fly() { return 10000; } public String getName() { return "大雁"; } }); } }
本文來自php中文網,java教學欄目,歡迎學習!
以上是10分鐘搞懂Java內部類的詳細內容。更多資訊請關注PHP中文網其他相關文章!