Java內(nèi)部類真的很難理解,但有必要搞懂,因?yàn)閮?nèi)部類讓外部類更豐富多彩了,就好像一個(gè)人的心中還可以住著另外一個(gè)人。
在瓊海等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷推廣,外貿(mào)營(yíng)銷網(wǎng)站建設(shè),瓊海網(wǎng)站建設(shè)費(fèi)用合理。昨天晚上,我把車停好以后就回家了?;丶液蟛虐l(fā)現(xiàn)手機(jī)落在車?yán)锩媪耍饷嫣?,冷到骨頭都能感受到寒意——實(shí)在是不想返回一趟去取了(小區(qū)的安保還不錯(cuò),不用擔(dān)心被砸車玻璃),于是打定主意過(guò)幾個(gè)小時(shí)的“世外桃源”生活——?jiǎng)e人找不到我,我也找不到別人,這種與世隔絕的狀態(tài)非常適合讀書(shū)寫(xiě)作。
把厚厚的《Java編程思想》擺在桌子上,正襟危坐,認(rèn)認(rèn)真真地讀起了第十章——內(nèi)部類。盡管我已經(jīng)非常耐心和用心了,但內(nèi)部類的這一章非常的枯燥,并且難以理解,我整個(gè)人幾乎處于崩潰的邊緣。
很早之前,有想要轉(zhuǎn)行學(xué)習(xí)Java的朋友咨詢我,有哪方面的書(shū)可以推薦,我鄭重其事地介紹了《Java編程思想》,并且一再叮囑他這是一本Java入門(mén)級(jí)的經(jīng)典書(shū),必須耐著性子讀完它。現(xiàn)在想想,自己當(dāng)時(shí)的推薦真是輕率!
我這樣說(shuō),并不是為了否認(rèn)《Java編程思想》這本書(shū)的價(jià)值,因?yàn)檎驹跁?shū)本的角度,它可能會(huì)感慨說(shuō):這王二的學(xué)習(xí)能力有問(wèn)題啊,讀我竟然這么困難!
不是有那樣一句話嘛:“如果你手里有一把錘子,所有東西看上去都像釘子?!蔽艺J(rèn)為“內(nèi)部類”這一章很難懂,其根本的原因在于我對(duì)“內(nèi)部類”沒(méi)有很好的理解。想要繼續(xù)扎實(shí)Java的基礎(chǔ)知識(shí),唯一要做的就是——想盡一切辦法搞懂“內(nèi)部類”,并梳理成文。
顧名思義,內(nèi)部類就是放在另外一個(gè)類的內(nèi)部定義的類。非常重要的一點(diǎn)是,內(nèi)部類能夠訪問(wèn)外部類的所有成員,包括private
修飾的。
來(lái)看程序清單1-1:
public?class?Wanger?{
????private?int?age;
????public?Wanger(int?age)?{
????????this.age?=?age;
????}
????class?Thought?{
????????public?void?know()?{
????????????System.out.println("沉默王二的年齡"?+?age);
????????}
????}
????public?Thought?getThought()?{
????????return?new?Thought();
????}
????public?static?void?main(String[]?args)?{
????????Wanger?wanger?=?new?Wanger(29);
????????Wanger.Thought?thought?=?wanger.getThought();
????????thought.know();?//?輸出:沉默王二的年齡29
????????//?使用.new的形式創(chuàng)建內(nèi)部類對(duì)象
????????Wanger.Thought?thought1?=?wanger.new?Thought();
????????thought1.know();
????}
}
程序清單1-1要表達(dá)什么意思呢?
答案是:我,沉默王二,已經(jīng)29歲了,89年出生(有人說(shuō)89年出生明明是30歲)。上了年紀(jì)了,總想裝點(diǎn)嫩,理解一下。我讀書(shū)不多,但特別愛(ài)思考,于是我就給自己創(chuàng)建了一個(gè)會(huì)思考的內(nèi)部類Thought。
從程序清單1-1可以看得出,盡管Thought是內(nèi)部類,但可以訪問(wèn)外部類Wanger的私有成員變量age。
如果想創(chuàng)建內(nèi)部類的對(duì)象,需要先指明對(duì)象引用的類型,格式為 OuterClassName.InnerClassName
,就像main()方法中的Wanger.Thought
那樣。
緊接著,就要來(lái)創(chuàng)建內(nèi)部類對(duì)象了,有兩種形式。第一種形式是先在外部類中定義一個(gè)方法Thought getThought()
,返回使用new
關(guān)鍵字創(chuàng)建的內(nèi)部類對(duì)象,然后使用外部類對(duì)象調(diào)用該方法wanger.getThought()
;第二種形式是直接通過(guò)外部類對(duì)象.new
創(chuàng)建wanger.new Thought()
。
以我的編程經(jīng)驗(yàn)來(lái)看,匿名內(nèi)部類使用最頻繁的場(chǎng)合就是在創(chuàng)建線程的時(shí)候。
來(lái)看程序清單2-1:
public?class?Demo?{
????public?void?test(String?title)?{
????????Thread?thread?=?new?Thread(new?Runnable()?{
????????????@Override
????????????public?void?run()?{
????????????????//?title?=?"我不要吃雞";
????????????????//?改變時(shí)會(huì)提示錯(cuò)誤
????????????????//?在封閉范圍中定義的局部變量必須是final的。
????????????????System.out.println(title);
????????????}
????????});
????????thread.start();
????}
????public?static?void?main(String[]?args)?{
????????for?(int?i?=?0;?i?<?10;?i++)?{
????????????Demo?demo?=?new?Demo();
????????????demo.test("我要吃雞"?+?i);
????????}
????}
}
在程序清單2-1中,test()方法內(nèi)部有一個(gè)線程對(duì)象thread,是通過(guò)new Thread()創(chuàng)建的。new Thread()
可以接收一個(gè)實(shí)現(xiàn)了Runnable接口類型的對(duì)象,這個(gè)對(duì)象要怎么創(chuàng)建呢?可以通過(guò)匿名內(nèi)部類的形式來(lái)創(chuàng)建——new Runnable() {public void run(){......}}
——這段簡(jiǎn)短的代碼等同于:
//?實(shí)現(xiàn)Runnable接口
class?MyRunnable?implements?Runnable?{
????@Override
????public?void?run()?{
????}
}
//?向上轉(zhuǎn)型
Runnable?myRunnable?=?new?MyRunnable();
匿名內(nèi)部類的好處就在于不僅節(jié)省了定義實(shí)現(xiàn)類的過(guò)程,還能夠自動(dòng)向上轉(zhuǎn)型。
在程序清單2-1中,test()方法還有一個(gè)參數(shù)title,JDK1.8之前,編譯器要求它必須是final類型的。但JDK1.8之后,如果我們?cè)谀涿麅?nèi)部類中需要訪問(wèn)局部變量,那么這個(gè)局部變量不再需要用final
關(guān)鍵字修飾了。
但如果想要在匿名內(nèi)部類中改變局部變量的值,編譯器就會(huì)提醒你不能這樣做,它會(huì)提示:“在封閉范圍中定義的局部變量必須是final的?!?/p>
Java的內(nèi)部類讓我很容易的想起來(lái)JavaScript的閉包,閉包就是定義在一個(gè)函數(shù)內(nèi)部的函數(shù)——這聽(tīng)起來(lái)和Java的內(nèi)部類定義一樣一樣的。本質(zhì)上,閉包是將函數(shù)內(nèi)部與函數(shù)外部連接起來(lái)的橋梁。內(nèi)部類一樣,它是將內(nèi)部類與外部類連接起來(lái)的橋梁。
來(lái)看看什么是閉包吧:
function?wanger()?{
????var?age?=?30;
????function?know()?{
????????console.log(age);
????}
}
wanger();
//?控制臺(tái)輸出30
除此之外,內(nèi)部類最引人注意的原因是:
內(nèi)部類可以獨(dú)立地繼承一個(gè)抽象類或者實(shí)現(xiàn)一個(gè)接口,無(wú)論外部類是否也這樣做了,對(duì)內(nèi)部類都沒(méi)有影響。
上一篇:Java代碼復(fù)用的三種常用方式:繼承、組合和代理
下一篇:Java String,看這篇就夠了
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文標(biāo)題:Java內(nèi)部類-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://aaarwkj.com/article42/jcihc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司、電子商務(wù)、Google、用戶體驗(yàn)、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容