电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Java內(nèi)部類——匿名內(nèi)部類

瀏覽:7日期:2022-08-26 14:23:52

今天來看看另一個更加神奇的類——匿名內(nèi)部類。

就像它的名字表示的那樣,這個類是匿名的,用完之后,深藏功與名,就像掃地僧那樣默默潛藏于深山之中。匿名內(nèi)部類不僅沒有名字,連class關(guān)鍵字都省掉了,而且匿名內(nèi)部類必須繼承于某個類或者實現(xiàn)某個接口,長的就像這樣:

new 父類(參數(shù)列表)|實現(xiàn)接口() { //匿名內(nèi)部類的內(nèi)部定義 }

來看一個栗子:

public abstract class Human { public abstract void walk();}

這是一個抽象類,如果使用匿名內(nèi)部類來繼承的話是這樣的:

public class AnonymousTest { public static void main(String[] args) { Human human = new Human(){ public void walk(){System.out.println('AnonymousHuman can walk.'); }; }; human.walk(); }}

簡單粗暴,看起來就像局部內(nèi)部類的簡化版。如果不使用匿名內(nèi)部類,會是怎樣呢?

我們需要先創(chuàng)建一個類來繼承這抽象類:

public class Man extends Human { @Override public void walk() { System.out.println('Man can walk.'); }}

然后再來使用這個類:

public class AnonymousTest { public static void main(String[] args) { Human human = new Man(); human.walk(); }}

因為一個單獨的類往往放在一個單獨的文件中,如果這個類只需要創(chuàng)建一個對象,那未免有些大材小用了,從上面的栗子可以比較出匿名內(nèi)部類的一個優(yōu)勢:在類只需要創(chuàng)建一個對象的情況下更加簡單方便。

再舉一個實際一點的栗子:

public class AnonymousTest { public static void main(String[] args) { Thread t = new Thread() { public void run() {for (int i = 0; i < 10; i++) { try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i);} } }; t.start(); }}

這里創(chuàng)建了一個繼承于Thread的匿名內(nèi)部類,覆蓋了其中的 run方法,并創(chuàng)建了一個實例返回給了t,然后再調(diào)用run方法,可以看到,匿名內(nèi)部類只能存在一個實例對象,因為new過一次就無法再創(chuàng)建了,也許會覺得局部內(nèi)部類已經(jīng)很局限了,為什么要出現(xiàn)比局部內(nèi)部類適用范圍更小的匿名內(nèi)部類?、

這你就不懂了吧,在Java的實際使用中,匿名內(nèi)部類大有用處,為什么要使用匿名內(nèi)部類呢?

有時候,我們創(chuàng)建的類只需要一個實例,比如說在多線程中,要使用多線程,一般先繼承Thread類或者實現(xiàn)Runnable接口,然后再去調(diào)用它的方法,而每個任務(wù)一般都不一樣,每次都新建一個類顯然會很難管理,因為每個類只用一次就丟掉了,這個時候使用匿名內(nèi)部類就很方便了,不僅不需要管理一堆一次性類,而且創(chuàng)建起來簡單粗暴。就像上述栗子,還能簡化成這樣:

public class AnonymousTest { public static void main(String[] args) { new Thread() { public void run() {for (int i = 0; i < 10; i++) { try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i);} } }.start(); }}

創(chuàng)建實例后直接調(diào)用run方法,簡單粗暴。

匿名內(nèi)部類不僅可以繼承于類,也可以實現(xiàn)于接口,比如說這樣:

public class AnonymousTest { public static void main(String[] args) { new Thread(new Runnable() { public void run() {for (int i = 0; i < 10; i++) { try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i);} } }).start(); }}

當然,還有些不得不用內(nèi)部類的情況,類只能繼承于一個類,如果一個類需要使用到另一個包中的另一個類的一個protected方法,卻已經(jīng)繼承于另一個類,那么這個時候就不得不用內(nèi)部類來解決了。

比如說,還有一個Woman(女人)類:

public class Woman { protected void dance(){ System.out.println('Woman can dance.'); }}

這個時候,如果Man(男人)也難不住寂寞,想要dance(跳舞)一下,那該怎么辦呢?繼承Woman類?顯然不合乎邏輯,而且也無法實現(xiàn),因為已經(jīng)繼承于Human類了,但就是想要dance,該怎么辦?

內(nèi)部類的出現(xiàn)讓這個問題變得很簡單:

public class Man extends Human { @Override public void walk() { System.out.println('Man can walk.'); } public void dance(){ new Woman(){ public void manDance(){super.dance(); } }.manDance(); }}

因為在不同的包下,不能直接使用Woman的dance方法,但是可以用內(nèi)部類來繼承,從而調(diào)用protected方法,然后再放入Man的方法中,這樣,Man也能像Woman一樣dance了:

public class AnonymousTest { public static void main(String[] args) { Man human = new Man(); human.walk(); human.dance(); }}

當然,使用匿名內(nèi)部類還是有很多限制的:

1、匿名內(nèi)部類必須是繼承一個類或者實現(xiàn)一個接口,但是兩者不可兼得,同時也只能繼承一個類或者實現(xiàn)一個接口。

2、匿名內(nèi)部類不能定義構(gòu)造函數(shù)。

3、匿名內(nèi)部類中不能存在任何的靜態(tài)成員變量和靜態(tài)方法。

4、匿名內(nèi)部類是特殊的局部內(nèi)部類,所以局部內(nèi)部類的所有限制同樣對匿名內(nèi)部類生效。

5、匿名內(nèi)部類不能是抽象的,它必須要實現(xiàn)繼承的類或者實現(xiàn)的接口的所有抽象方法。

那么問題來了,怎樣初始化一個匿名內(nèi)部類呢?畢竟匿名內(nèi)部類是不能有構(gòu)造器的。

當然,首先,還是可以使用初始化塊來實現(xiàn)的,就像這樣:

public class AnonymousTest { public static void main(String[] args) { Human human = new Human() { private String name; {name = 'human'; } @Override public void walk() {System.out.println(name + ' walk.'); } }; human.walk(); }}

但是這樣顯然就比較呆板,不夠靈活,無法接受外部參數(shù),那么怎樣靈活使用呢?不要心急,方法總比問題多,還是有辦法解決的:

public class AnonymousTest { public static void main(String[] args) { Human human = new AnonymousTest().getHumanInstance('Frank'); human.walk(); } public Human getHumanInstance(final String name){ return new Human() { private String nameA; {nameA = name; } @Override public void walk() {System.out.println(nameA + ' walk.'); } }; }}

這里利用初始化塊來對匿名內(nèi)部類進行初始化,注意,如果匿名內(nèi)部類需要使用外部的參數(shù)或者變量,那么必須使用final修飾,因為內(nèi)部類使用的其實是參數(shù)的拷貝,并不是參數(shù)本身,為了更明顯的表明參數(shù)不可變,編譯器會要求使用final關(guān)鍵字來修飾需要使用的變量。

至此,匿名內(nèi)部類講解完畢,歡迎大家繼續(xù)關(guān)注!

以上就是詳解Java內(nèi)部類——匿名內(nèi)部類的詳細內(nèi)容,更多關(guān)于Java 匿名內(nèi)部類的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 蜂蜜瓶-玻璃瓶-玻璃瓶厂-玻璃瓶生产厂家-徐州贵邦玻璃制品有限公司 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 山东信蓝建设有限公司官网 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 丹佛斯变频器-Danfoss战略代理经销商-上海津信变频器有限公司 | 三板富 | 专注于新三板的第一垂直服务平台 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 市政路灯_厂家-淄博信达电力科技有限公司 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 环球周刊网| 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 节流截止放空阀-不锈钢阀门-气动|电动截止阀-鸿华阀门有限公司 | 牛奶检测仪-乳成分分析仪-北京海谊 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 科普仪器菏泽市教育教学仪器总厂 | 广州企亚 - 数码直喷、白墨印花、源头厂家、透气无手感方案服务商! | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 驾驶人在线_专业学车门户网站 | 学生作文网_中小学生作文大全与写作指导 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 |