介紹
Java匿名內部類是一種嵌套類。它沒有名字,只是被創建並實例化了一次。通常用於在某處需要一個類但不想使用更嚴格的抽象類。
匿名內部類可以作為一個類的成員變量、方法參數、返回值等。它的語法比較簡潔易懂,但使用時需要注意一些細節。
正文
1、定義及使用方式
匿名內部類可以實現一個接口或繼承一個類,並且可以直接定義並實例化,使用方式如下:
interface InterfaceA { void print(); } class Test { public static void main(String[] args) { InterfaceA a = new InterfaceA() { @Override public void print() { System.out.println("I am A"); } }; a.print(); } }
在這個例子中,定義了一個InterfaceA接口,並在Test類中使用一個匿名內部類來實現這個接口,並在實現的print()方法中輸出”I am A”。在使用時,直接定義了一個InterfaceA類型的變量,並將其實例化為一個匿名內部類。
2、限制
匿名內部類雖然使用比較方便,但有以下幾個限制:
(1)不能顯式定義構造函數
匿名內部類沒有構造函數,因為它沒有名字。因此,如果需要傳遞參數等,可以在定義內部類時使用實例初始化塊來替代構造函數的功能。如下:
interface InterfaceB { void print(); } class Test { public static void main(String[] args) { InterfaceB b = new InterfaceB() { private String name; { this.name = "B"; } @Override public void print() { System.out.println("I am " + name); } }; b.print(); } }
在這個例子中,我們需要在內部類中定義一個String類型的name,並在print()方法中使用。由於匿名內部類不能顯式定義構造函數,我們可以使用實例初始化塊的方式來完成這個功能。
(2)不能定義靜態成員或方法
由於匿名內部類沒有名字,因此無法定義靜態成員或方法。如下代碼將無法通過編譯:
interface InterfaceC { static void print() { // 編譯錯誤 System.out.println("I am C"); } }
3、多重嵌套
匿名內部類也可以在其他類的內部類或方法中使用,實現多重嵌套的效果。如下:
interface InterfaceA { void print(); } class Test1 { private static class TestInner { public void test() { InterfaceA a = new InterfaceA() { { System.out.println("inner"); } @Override public void print() { System.out.println("I am A"); } }; a.print(); } } public static void main(String[] args) { TestInner testInner = new TestInner(); testInner.test(); } }
在這個例子中,內部類TestInner中的test()方法使用了一個匿名內部類實現了InterfaceA接口,並在實現的print()方法中輸出”I am A”。在Test1類的main()方法中,我們實例化了TestInner並調用test()方法,從而觸發了匿名內部類的實例化與使用。
4、Lambda表達式與匿名內部類的關係
Java 8引入了Lambda表達式,使得代碼更加簡潔和易讀。Lambda表達式本質上是一個函數式接口的實例,與匿名內部類類似。
但是,Lambda表達式與匿名內部類確實有所不同。特別是在定義與使用時,Lambda表達式比匿名內部類更加容易理解和使用。如果您使用的是Java 8及以上版本,建議使用Lambda表達式而不是匿名內部類。
代碼部分
以下是上述討論過的例子的完整代碼:
interface InterfaceA { void print(); } class Test { public static void main(String[] args) { InterfaceA a = new InterfaceA() { @Override public void print() { System.out.println("I am A"); } }; a.print(); } } interface InterfaceB { void print(); } class Test { public static void main(String[] args) { InterfaceB b = new InterfaceB() { private String name; { this.name = "B"; } @Override public void print() { System.out.println("I am " + name); } }; b.print(); } } interface InterfaceC { static void print() { // 編譯錯誤 System.out.println("I am C"); } } interface InterfaceA { void print(); } class Test1 { private static class TestInner { public void test() { InterfaceA a = new InterfaceA() { { System.out.println("inner"); } @Override public void print() { System.out.println("I am A"); } }; a.print(); } } public static void main(String[] args) { TestInner testInner = new TestInner(); testInner.test(); } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/193268.html