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