程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 簡略談談java中匿名外部類結構函數

簡略談談java中匿名外部類結構函數

編輯:關於JAVA

簡略談談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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved