Java匿名內部類深究

2021-07-23 20:21:28 字數 2429 閱讀 4632

匿名內部類深究

接著剛才的內部類總結,我們一起來討論匿名內部類這個小怪獸。

首先,我們要知道,匿名內部類適合建立那種只需要一次使用的類,建立匿名內部類時會立即建立乙個該類的例項,這個類定義立即消失,匿名內部類不能重複使用。

定義匿名內部類的格式如下:

new 實現介面()||父類構造器(實參列表)

;//注意這裡有乙個分號

匿名內部類的兩條規則:

1.匿名內部類不能是抽象類,因為系統在建立匿名內部類時,會立即建立匿名內部類的物件。因此不允許將匿名內部類定義為抽象類;

2.匿名內部類不能定義構造器。(

注意:其他內部類可用有自己的構造器!!

由於匿名內部類沒有類名,所以無法定義構造器,但匿名內部類可用定義初始化塊,可以通過例項初始化塊來完成構造器需要完成的事情。

問:匿名內部類這麼複雜,那麼它有什麼作用呢?

答:最常用的建立匿名內部類的方式是需要建立某個介面型別的物件。

說到這裡,可能還是不太明白,我們先通過乙個例子來使用匿名內部類,再來介紹它的作用:

inte***ce product

public class test1

public static void main(string args)

public string getname()

});}}

上面的這個程式中的test1類定義了乙個test()方法,該方法需要乙個product物件來作為引數,但product只是乙個介面,無法直接建立物件,因此此處考慮建立乙個product介面實現類的物件傳入該方法---如果這個product介面實現類只需要一次使用,則可採用上面程式中的方式,定義乙個匿名內部類。

正如上述中的程式,定義匿名內部類時無須class關鍵字,而是在定義匿名類時直接生成該類的匿名內部類的物件。上面**中的粗體部分就是匿名內部類的類體部分。

由於匿名內部類不能是抽象類,所以匿名內部類必須實現它的抽象父類或者介面裡包含的所有抽象方法。

對於剛才建立product實現類物件的**,也可以拆分成如下**:

class test1 implements product

public string getname()

}ta.test(new test1());

對比上述**和前面的匿名內部類的類體,我們可以發現,它們完全一樣,但顯然,採用匿名內部類的寫法更為簡潔!!

當通過實現介面來建立匿名內部類時,匿名內部類也不能顯式建立構造器,因此匿名內部類只有乙個隱式的構造器,故new 介面名後的括號裡不能傳入引數值。

但如果通過繼承父類來建立匿名內部類時,匿名內部類將擁有和父類相似的構造器,此處的相似指的是擁有相同的形參列表。

abstract class device

public device(string name)

public string getname()

public void setname(string name)

}public class test1

public static void main(string args)

});//呼叫無引數的構造器建立device匿名實現類的物件

device d = new device()

//實現抽象方法public double getprice()

//重寫父類的例項方法

public string getname()

};tt.test(d);

}}

上述程式中建立了乙個抽象父類device類,這個抽象父類裡包含了兩個構造器:乙個無引數的和乙個有引數的。當建立以device為父類的匿名內部類時,既可以傳入引數(第一塊粗體部分),也可以不傳入引數(第二塊粗體部分),代表呼叫父類的無引數的構造器。

當建立匿名內部類時,必須實現介面或者抽象父類裡的所有抽象方法。如果有需要,也可以重寫父類中的普通方法,如上面程式中的第二段粗體**部分,匿名內部類重寫了抽象父類device類的getname()方法,其中getname()方法並不是抽象方法。。

如果區域性變數被匿名內部類訪問,則該區域性變數相當於自動使用了final修飾。

inte***ce a

public class atest

};a.test();

}}

注:由於樓主的jdk版本還是8以前的,所以仍然需要使用final修飾哈!

JAVA匿名內部類

abstract class base public abstract void f public class anonymousconstructor public void f public static void main string args 在此例中,不要求變數i 一定是final 的。...

Java 匿名內部類

內部類定義在區域性時,1,不可以被成員修飾符修飾 2,可以直接訪問外部類中的成員,因為還持有外部類中的引用。但是不可以訪問它所在的區域性中的變數。只能訪問被final修飾的區域性變數。非靜態,沒物件,不執行 class outer new inner function class innerclas...

java匿名內部類

匿名內部類 匿名內部類 1 匿名內部類即沒有名字的內部類 2 正因為沒有名字,所以匿名內部類只能使用一次,它通常用來簡化 編寫 3 但使用匿名內部類還有個前提條件 必須繼承乙個父類或實現乙個介面 示例1 不使用匿名內部類來實現抽象方法 abstract class people class chil...