顧名思義,沒有名字的內部類。表面上看起來它們似乎有名字,實際那不是它們的名字。匿名內部類就是沒有名字的內部類。什麼情況下需要使用匿名內部類?如果滿足下面的一些條件,使用匿名內部類是比較合適的:
·只用到類的一個執行個體。
·類在定義後馬上用到。
·類非常小(SUN推薦是在4行代碼以下)
·給類命名並不會導致你的代碼更容易被理解。
在使用匿名內部類時,要記住以下幾個原則:
·匿名內部類不能有 構造方法 。
·匿名內部類不能定義任何 靜態成員 、方法和類。
·匿名內部類不能是public,protected,private,static。
·只能建立匿名內部類的一個執行個體。
·一個匿名內部類一定是在new的後面,用其隱含實現一個介面或實現一個類。
·因匿名內部類為局部內部類,所以局部內部類的所有限制都對其生效。
A、繼承式的匿名內部類
public class Car { public void drive(){ System.out.println("Driving a car!"); } public static void main(String[] args) { Car car = new Car(){ public void drive() { System.out.println("Driving anther car!"); } }; car.drive(); } }
結果輸出了:Driving another car! Car 引用變數 不是引用Car對象,而是Car匿名子類的對象。
B、介面式的匿名內部類。
interface Vehicle { public void drive(); } class Test{ public static void main(String[] args) { Vehicle v = new Vehicle(){ public void drive(){ System.out.println("Driving a car!"); } }; v.drive(); } }
上面的代碼很怪,好像是在執行個體化一個介面。事實並非如此,介面式的匿名內部類是實現了一個介面的匿名類。而且只能實現一個介面。
C、參數式的匿名內部類。
class Bar{ void doStuff(Foo f){} } interface Foo{ void foo(); }
class Test{ static void go(){ Bar b = new Bar(); b.doStuff(new Foo(){ public void foo(){ System.out.println("foofy"); } }); } }