匿名類~由一個貌似簡單的java面試題所想到的···
原題如下:
public class Tex {
public static void main(String[] args) {
if(___________){
System.out.println("world");
}
else{
System.out.println("hello");
}
}
}
只能在if(_____)裏面寫代碼,如何讓輸出結果是“hello world”?
答案有幾種(當然還應該有別的吧),如下:
NO1:if(new Tex(){{System.out.print("hello ");}}!=null)
NO2:if (System.out.append("hello ") != null)
NO3:if(System.out.printf("hello ")!=null)
對於答案1,用的是匿名類。個人覺得匿名類在寫程序時用的並不多,所以有時看見時覺得比較生僻,現整理如下:
一、匿名類的語法:
1、匿名類沒有名字(廢話)
2、不能給匿名類添加構造方法
3、匿名類無法顯式的繼承某個類或實現某個接口
4、匿名類沒有任何修飾符
二、現在介紹匿名類的3中用法:
1:通過接口使用匿名類
(1)先定義一個接口:
public interface AnInterface {
public void method();
}
(2)下面是測試用Cilent:
public class Client {
public static void main(String[] args) {
AnInterface anonymous = new AnInterface() {
public void method() {
System.out.println("hello world!");
}
public void method2() {
System.out.println("hello world!");
}
};
anonymous.method();
}
}
(3)輸出爲:hello world!
(4)總結:一般new關鍵字後面應該跟一個類名的,但現在我們看到new後面緊接着跟了個接口名!但再看後面有{},可以認爲它是匿名類的類體。因此,這個匿名類沒有名字,但它實現了接口AnInterface,並且在自己的類體中實現了接口AnInterface中的抽象方法method,事實上此匿名類必須實現接口所有的抽象方法。
2:通過抽象類使用匿名類:
(1)先定義一個抽象類:
public abstract class AnAbstractClass {
public AnAbstractClass(){
System.out.println("AnAbstractClass");
}
public void method1(){
System.out.println("method1");
}
public abstract void method2();
}
(2)下面是測試用Cilent:
public class Client {
public static void main(String[] args) {
AnAbstractClass anonymous=new AnAbstractClass(){
@Override
public void method2() {
System.out.println("method2");
}
};
anonymous.method1();
anonymous.method2();
}
}
(3)輸出爲:AnAbstractClass
method1
method2
(4)總結:其實和通過接口使用匿名類用法很相似,核心就是:對於抽象方法在匿名類中必須給予實現,使抽象的抽象類或接口不再抽象,也就可以創建類的實例了。
另外如果抽象類的構造方法有參數的話那麼匿名類也要加參數,即:
public AnAbstractClass(int n){
System.out.println("AnAbstractClass");
}
AnAbstractClass anonymous=new AnAbstractClass(1){};
3:通過類使用匿名類:
public class Tex {
public Tex(){
System.out.println("tex");
}
public static void main(String[] args) {
System.out.print("");
Tex t=new Tex(){{System.out.println("hello ");}};
Tex tt=new Tex();
System.out.print("");
}
}
輸出爲:
tex
hello
Tex
四: 總結:(只是個人猜想,不一定對)匿名類的構造原理:由以上的用法2和3的輸出可以看出在new新的匿名類時總是先調用父類的構造方法,因此匿名類匿名類 的其實就是類繼承的變種,只不過匿名類不能有構造方法,因此它不能像其他正常的類繼承那樣先調用父類的構造方法而後再調用自己的構造方法!因此匿名類通過 調用父類的構造方法進行構造。
但是當通過接口構造匿名類是我也不知道是怎麼構造出這個匿名類來的。?