對 Java 的匿名內部類理解
阿新 • • 發佈:2018-12-23
對 Java 的匿名內部類理解
JAVA面向物件三大特性:封裝、繼承、多型。
多型:可以理解為大千世界中的物件在不同的環境下可能會有多種形態。
Java中多型存在的前提:必須存在繼承、父類的引用指向子類的物件。
匿名內部類:就是沒有名字的內部類,所以匿名內部類只能使用一次。
通常使用匿名內部類來簡化程式碼編寫,但使用匿名內部類有個前提條件:必須繼承一個父類或實現一個介面。
案例1:不使用匿名內部類來實現抽象方法
/** * @ Author: LightningLi * @ Date: 18/12/23 10:04 * @ Description: 不使用匿名內部類來實現抽象方法 */ public class Demo { public static void main(String[] args) { Person p=new Child(); p.eat(); } } abstract class Person{ public abstract void eat(); } class Child extends Person{ @Override public void eat() { System.out.println("吃東西"); } }
執行結果:吃東西。
可以看到,我們用Child繼承了Person類,然後實現了Child的一個例項,將其向上轉型為Person類的引用,而Child類就是我們在匿名內部類中隱藏的類;如果此處的Child類只使用一次,而將其編寫為獨立的一個類豈不是很麻煩?
當然我們可以使用匿名內部類解決。
案例2:匿名內部類的基本實現
/** * @ Author: LightningLi * @ Date: 18/12/23 10:54 * @ Description: 匿名內部類的基本實現 */ public class Demo2 { public static void main(String[] args) { People people=new People() { @Override public void play() { System.out.println("玩耍耍"); } }; people.play(); } } abstract class People{ public abstract void play(); }
執行結果:玩耍耍。
可以看到,我們直接將抽象類Person中的方法在大括號中實現了,這樣便可以省略一個類的書寫。匿名內部類還能用於介面上。
案例3:在介面上使用匿名內部類
/** * @ Author: LightningLi * @ Date: 18/12/23 11:01 * @ Description:在介面上使用匿名內部類 */ public class Demo3 { public static void main(String[] args) { Man m=new Man() { @Override public void sleep() { System.out.println("睡覺覺"); } }; m.sleep(); } } interface Man{ public void sleep(); }
執行結果:睡覺覺。
由上面的例子可以得出結論,只要一個類是抽象的或是一個介面,那麼其子類中的方法都可以使用匿名內部類來實現。
最常用的情況就是在多執行緒的實現上,因為要實現多執行緒必須繼承Thread類或是繼承Runnable介面。
案例4:Thread類的匿名內部類實現
/**
* @ Author: LightningLi
* @ Date: 18/12/23 11:06
* @ Description:Thread類的匿名內部類實現
*/
public class Demo4 {
public static void main(String[] args) {
Thread t=new Thread(){
public void run(){
for (int i=0;i<=5;i++){
System.out.print(i);
}
}
};
t.start();
}
}
案例5:Runnable介面的匿名內部類實現
/**
* @ Author: LightningLi
* @ Date: 18/12/23 11:09
* @ Description:Runnable介面的匿名內部類實現
*/
public class Demo5 {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}
可以參考這篇文章有關於匿名內部類中多型的理解:http://blog.csdn.net/zahngjialiang/article/details/68946631