JAVA入门级教学之(匿名内部类)
?
看了本文章你將知道什么是匿名內部類,如何熟練掌握并使用匿名內部類。如果你已經是大??梢蕴^,沒有看的必要。
什么是匿名內部類What
先說類,我們都知道類用于描述客觀世界里某一類對象的共同特征,對象是其具體體現。類可以被被認為是一種自定義的數據類型,可以使用類來定義變量。也就是所說的類類型,是一種引用數據類型。
如果在一個類里面定義一個類,那么這個類就是內部類,外面的那個類就是外部類,這個很好理解。內部類就相當于外部類的一個成員,你可以把內部類看成一個整體。內部類分為:靜態內部類,非靜態內部類。匿名內部類是非靜態內部類的一種特殊情況,匿名內部類沒有類名,因此就不可能有構造函數,不能創建對象。除此之外還有局部內部類,就是定義在方法內的,這個一般不怎么用,不需要掌握,知道就好,本文主要說匿名內部類,其他內部類以后會說。
為什么會有匿名內部類
說白了,就是因為想偷懶,不想寫太多代碼。如果可以,程序員完全可以通過實現接口或者繼承抽象類的方式來實現而不用創建匿名內部類。但是使用匿名內部類的優點是顯而易見的,可以少些代碼,而且代碼更加簡潔。
匿名內部類的定義
先看匿名內部類的定義的語法格式:
?
new 實現接口() {//匿名內部類類體部分 }?
new 父類構造器(實參列表) {//匿名內部類類體部分 }為什么匿名內部類的定義有這兩種方式呢?這是因此這兩種方式的定義分別對應兩種方式,一種是接口,另一種是抽象類。
對于實現接口,由于接口是沒有構造函數的,注意這里一定是空參數。
第二種是調用父類的構造器,注意此處可以是空參數,也可以傳入參數。
如何使用匿名內部類
對于匿名內部類的使用,我將通過兩個具體的例子進行說明,如果你看懂了這兩個例子,就基本掌握了他的使用,建議多看幾遍例子。
第一種情況:實現接口
?
interfance Product {public double getPrice();public String getName(); }上面代碼定義一個接口,接口里面兩個抽象方法
?
public class Anonymous {public void test (Product p){System.out.println(p.getName()+"--------"+p.getPrice());}public static void main(String [ ] args ){Anonymous as= new Anonymous ();as.test(new Product( )//此處實現接口并實現抽象方法{public double getPrice( )//實現方法{return 8888;}public String getName( )//實現方法{return "I can do it ";}});} }上面代碼很簡單,就是定義了一個類Anonymous,在類里定義了一個test方法。然后就是創建Anonymous對象,調用他的實例方法test()。
不過調用test()方法時,要傳入一個Product對象。但是由于Product是一個接口,無法創建對象,所以要實現該接口。因此此處采用匿名內部類的方式進行,并實現接口中全部的抽象方法!
作者:pmThinker_以默
鏈接:https://www.jianshu.com/p/0950c6787c7d
package com.lbj.javase22;
/**
?* ?? ?匿名內部類:指的是類沒有名字,直接在調用的類體里面重寫實現繼承過來的方法,達到不知名卻知意的功能
?*?
?*?
?* ?? ?優點:代碼量減少,少定義一個類
?* ?? ?缺點:復用性太低,沒有名字可以進行重復使用
?* @author 14811
?*
?*/
public class Test {
?? ?//首先定義一個靜態方法
?? ?public static void t(CustomerService cs){
?? ??? ?cs.logout();
?? ?}
?? ?
?? ?
?? ?//程序入口
?? ?public static void main(String[] args){
?? ??? ?
?? ??? ?//如何調用t方法呢
?? ??? ?
?? ??? ?//方法1
?? ??? ?//編寫一個類實現CustomerService接口
?? ??? ?//調用t方法
?? ??? ?//順序main方法調用t方法,t方法調用logout方法,
?? ??? ?//t(new CustomerServiceImpl());
?? ??? ?
?? ??? ?//方法2
?? ??? ?//使用匿名內部類的方法執行t方法
?? ??? ?//整個new CustomerService(){} 就是匿名內部類
?? ??? ?t(new CustomerService(){public void logout(){System.out.println("系統退出");}});
?? ??? ?
?? ??? ?
?? ?}
?? ?
}
//定義一個接口
interface CustomerService{
?? ?//退出系統的抽象方法
?? ?void logout();
}
編寫一個類實現CustomerService接口,在沒有匿名內部類的時候還是寫一個子類實現接口的方法,這時候我們再用方法2來看看怎么處理,怎么方便
//這種多定義一個類優點就是可以重復利用,而匿名內部類是不可以重復利用的
//class CustomerServiceImpl implements CustomerService{
//?? ?public void logout(){
//?? ??? ?System.out.println("退出系統");
//?? ?}
//}
匿名內部類不能定義任何靜態成員、方法。
匿名內部類中的方法不能是抽象的;
匿名內部類必須實現接口或抽象父類的所有抽象方法。
匿名內部類訪問的外部類成員變量或成員方法必須用static修飾;
?
1、匿名內部類因為沒有類名,可知匿名內部類不能定義構造器。
2、因為在創建匿名內部類的時候,會立即創建它的實例,可知匿名內部類不能是抽象類,必須實現接口或抽象父類的所有抽象方法。
3、匿名內部類會繼承一個父類(有且只有一個)或實現一個接口(有且只有一個),實現父類或接口中所有抽象方法,可以改寫父類中的方法,添加自定義方法。
5、當匿名內部類和外部類有同名變量(方法)時,默認訪問的是匿名內部類的變量(方法),要訪問外部類的變量(方法)則需要加上外部類的類名。
總結
以上是生活随笔為你收集整理的JAVA入门级教学之(匿名内部类)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA入门级教学之(连接运算符)
- 下一篇: 软件项目周报_有关细节、效率、周报和扯淡