OutterClass.InnerClass innerClass = new OutterClass().new InnerClass();
因?yàn)槟銢]有使用static修飾InnerClass,所以你必須new出來一個(gè)OutterClass的實(shí)例,才能在此基礎(chǔ)上new出內(nèi)部類的實(shí)例,因?yàn)閮?nèi)部類只能通過外部類的實(shí)例才能引用。如果你使用了static修飾,那么你就可以這樣使用內(nèi)部類。
OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass();
這兩種方式的區(qū)別就是,種方式,如果你想要獲得InnerClass的實(shí)例,你必須有一個(gè)OutterClass的實(shí)例,所有其實(shí)這種方式你創(chuàng)建了兩個(gè)實(shí)例,所以有兩個(gè)new關(guān)鍵字。而第二種方式就好理解一些,靜態(tài)內(nèi)部類不依賴于外部類的實(shí)例存在,因此只需要直接創(chuàng)建內(nèi)部類的實(shí)例就可以了,所以只有一個(gè)new關(guān)鍵字。
static說的有點(diǎn)多了,不過LZ其實(shí)不光說了static關(guān)鍵字,也一起連同內(nèi)部類的語法也大致都說了下。那么接下來,基礎(chǔ)部分還有一個(gè)比較考驗(yàn)人的東西,就是volatile關(guān)鍵字。
這個(gè)關(guān)鍵字的重點(diǎn)就三個(gè)字,就是可見性。但是面試的時(shí)候,你說出可見性三個(gè)字,基本上滿分100的話,多只能得到20分。剩下的那80分,就要靠你用硬功夫去獲得了。
所謂的硬功夫,其實(shí)就是要整明白,在并發(fā)當(dāng)中,可見性到底是什么意思。那么,為了弄明白可見性什么意思,就需要你了解什么叫主存和工作內(nèi)存。
只有把這些概念都搞明白了,你才會(huì)知道volatile的真正作用到底是什么。不過有一點(diǎn)要提醒你的是,volatile并不保證同步,這一點(diǎn)一定要記住。不光是應(yīng)付面試官,在真正使用volatile的時(shí)候,也要注意這一點(diǎn),否則很容易出現(xiàn)問題。
好了,基礎(chǔ)部分就說這么多吧,LZ挑了一些有代表性的說了下,歸根結(jié)底,這一部分就是要你非常清晰的了解Java當(dāng)中的關(guān)鍵字和語法,這里所謂的了解,是清晰的了解其實(shí)現(xiàn)原理,而非簡單的會(huì)用而已。
2)Java運(yùn)行時(shí)環(huán)境
Java運(yùn)行時(shí)環(huán)境就是JRE的中文翻譯,本質(zhì)上其實(shí)就是指JVM。
首先對于JVM必須要知道的是,JVM與Hotspot的關(guān)系。JVM更多的是指JVM規(guī)范,而Hotspot是JVM的一種實(shí)現(xiàn),也是我們常用的JVM實(shí)現(xiàn)。你可以把JVM規(guī)范當(dāng)做接口,Hotspot當(dāng)做實(shí)現(xiàn)類,這樣去理解會(huì)比較簡單一些。
此外,JVM重要的三個(gè)部分必須要非常清楚,內(nèi)存劃分、class加載機(jī)制以及GC策略。搞清楚這三部分不僅僅是為了面試,也是為了讓你對于Java有更深刻的理解,這對于你的Java生涯非常有幫助。
而且,關(guān)于內(nèi)存劃分,還有一點(diǎn)要注意,咱們常說的劃分方式,其實(shí)是指的Hotspot的劃分方式,而非JVM規(guī)范所規(guī)定的。
Hotspot的內(nèi)存劃分簡單說分為三個(gè)部分,Young Generation(年輕代)、Old Generation(年老代)以及Perm Generation(代)。其中的Young Generation(年輕代),又分為Eden、From和To,其中From和To又統(tǒng)稱為Survivor Spaces(幸存區(qū))。
未完待續(xù)。。。。。。