簡略談談java中匿名外部類結構函數。本站提示廣大學習愛好者:(簡略談談java中匿名外部類結構函數)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略談談java中匿名外部類結構函數正文
先看看上面的代碼能不克不及編譯經由過程:
public static void main(String[] args) { List l1 = new ArrayList(); List l2 = new ArrayList(){}; List l3 = new ArrayList(){{}}; System.out.println(l1.getClass() == l2.getClass() ); System.out.println(l2.getClass() == l3.getClass() ); System.out.println(l1.getClass() == l3.getClass() ); }
謎底是能經由過程編譯,輸入3個false。l1很輕易懂得,就是聲清楚明了一個
ArrayList對象,那末l2、l3是甚麼呢?
l2是一個匿名類外部類對象,繼續ArrayList;
l3語句有些怪僻,帶了兩個年夜括號,其實我們如許寫就會明確了,這也是一個匿名外部類的界說,它的代碼相似以下:
class Sub extends ArrayList { { //初始化代碼塊 } } List l3 = new Sub();
看到了吧,就是多了一個初始化代碼塊罷了,起到結構函數的功效。固然一個類中的結構代碼塊可以有多個,上面的代碼是可以編譯的:
List l4 = new ArrayList(){{}{}{}};
匿名外部類固然可以用一個初始化代碼塊來充任結構函數,但其結構函數照樣停止了特別的處置,它在初始化時直接挪用父類的同參結構函數,然後在挪用本身的代碼塊,例如:
List l5 = new ArrayList(5){ { System.out.println("我是匿名外部類"); } };
等價於:
class Sub extends ArrayList{ { System.out.println("我是匿名外部類"); } Sub(int num){ super(num); } } List l5 = new Sub(5);
我們來看段示例代碼
package testtest; public class Main { public static void main(String[] args) { InnerTest inner = new InnerTest(); Test t = inner.get(3); System.out.println(t.getI()); } } class Test { private int i; public Test(int i) { this.i = i; } public int getI() { return i; } } class InnerTest { public Test get(int x) { return new Test(x) { @Override public int getI() { return super.getI() * 10; } }; } }
編譯以後獲得4個class文件:Test.class,InnerTest.class,InnerTest$1.class和Main.class。輕易看出來,Main.class是測試類的class文件,Test.class是超類Test的class文件,InnerTest.class是InnerTest 的class文件,最值得存眷的就是匿名外部類的class文件InnerTest$1.class。