匿名內部類
匿名內部類,就是沒有名字的一種嵌套類。它是Java對類的定義方式之一。
為什么要使用匿名內部類
在實際開發中,我們常常遇到這樣的情況:一個接口/類的方法的某個實現方式在程序中只會執行一次,但為了使用它,我們需要創建它的實現類/子類去實現/重寫。此時可以使用匿名內部類的方式,可以無需創建新的類,減少代碼冗余。
下面詳細說明一下
假設當前有一個接口,接口中只有一個方法
public interface Interface01 {
void show();
}
為了使用該接口的show方法,我們需要去創建一個實現類,同時書寫show方法的具體實現方式
public class Interface01Impl implements Interface01{
@Override
public void show() {
System.out.println("I'm a impl class...");
}
}
如果實現類Interface01Impl全程只使用一次,那么為了這一次的使用去創建一個類,未免太過麻煩。我們需要一個方式來幫助我們擺脫這個困境。匿名內部類則可以很好的解決這個問題。
我們使用匿名內部類
public static void main(String[] args) {
Interface01 interface01 = new Interface01() {
@Override
public void show() {
System.out.println("這里使用了匿名內部類");
}
};
//調用接口方法
interface01.show();
}
成功運行結果
這里使用了匿名內部類
如何使用匿名內部類
基本格式
new 接口/類名(參數1, 參數2...){
實現方法1(){
}
實現方法2(){
}
......
};
在上文的使用中,我們沒有創建實現類就實現了具體的show方法。同時定義了接口的對象變量interface01。我們發現,這個變量和平常使用多態后的使用方式沒有區別。
通常,我們也習慣用這樣的方式創建並啟動線程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我是一個線程");
}
}).start();
常見問題
-
匿名內部類是怎么實現的
在上文代碼編譯后,我們查看一下class文件的路徑
再反編譯一下看看
至此,我們可以得知,匿名內部類在編譯期間,會生成一個名稱以
$編號
結尾的class文件,即它被識別為一個真實的類,僅在編譯前(java文件)為匿名的形態。 -
匿名內部類只可以使用在接口上嗎
不是的。匿名內部類可以用在具體類、抽象類、接口上,且對方法個數沒有要求。
舉例說明:設存在具體類Class01,抽象類AbstractClass01,接口Interface01
//具體類 public class Class01 { public void show(String s){ System.out.println("啦啦啦"); } }
//抽象類 public abstract class AbstractClass01 { abstract void show(String s); }
//接口 public interface Interface01 { void show(String s); }
測試類TestInner
public class TestInner { public static void main(String[] args) { //重寫具體類的方法 new Class01(){ @Override public void show(String s) { System.out.println("我是一個" + s); } }.show("具體類"); //重寫抽象類的抽象方法 new AbstractClass01(){ @Override void show(String s) { System.out.println("我是一個" + s); } }.show("抽象類"); //實現接口的抽象方法 new Interface01(){ @Override public void show(String s) { System.out.println("我是一個" + s); } }.show("接口"); } }
運行結果
我是一個具體類
我是一個抽象類
我是一個接口