JAVA基礎(chǔ)知識(shí)點(diǎn)

JAVA基礎(chǔ)知識(shí)點(diǎn)

這是篇文章會(huì)持續(xù)更新......

  1. 在程序設(shè)計(jì)中經(jīng)常用到一系列類型,它們需要特殊對(duì)待??梢园阉麄兿胂蟪苫绢愋?,之所以特殊對(duì)待,是因?yàn)閚ew將對(duì)象存儲(chǔ)在“堆”里,故用new創(chuàng)建一個(gè)對(duì)象,特別是小的,簡(jiǎn)單的變量,往往不是很有效。因此對(duì)于這些類型,JAVA采取與C/C++相同的方法,也就是說(shuō),不用new來(lái)創(chuàng)建變量,而是創(chuàng)建一個(gè)并非是引用的‘自動(dòng)’變量,這個(gè)變量直接存儲(chǔ)‘值’,并置于堆棧中,因此更高效。

2.當(dāng)創(chuàng)建一個(gè)數(shù)組對(duì)象時(shí),實(shí)際上就是創(chuàng)建了一個(gè)引用數(shù)組,并且每個(gè)引用都會(huì)被自動(dòng)初始化為一個(gè)特定值,該值擁有自己的關(guān)鍵字null,一旦JAVA看到這個(gè)null,就知道這個(gè)對(duì)象還沒(méi)有指向某個(gè)對(duì)象,在使用任何引用前,必須為其指定一個(gè)對(duì)象,如果試圖使用一個(gè)還是null的引用,在運(yùn)行時(shí)將會(huì)報(bào)錯(cuò),因此常犯的數(shù)組錯(cuò)誤在JAVA中就可以避免。還可以創(chuàng)建用來(lái)存放基本數(shù)據(jù)類型的數(shù)組,同樣編譯器也能確保這種數(shù)組的初始化,因?yàn)樗麜?huì)將這種數(shù)組所占的內(nèi)存全部置零。

3.JAVA對(duì)象不具備和基本類型一樣的生命周期,當(dāng)用new創(chuàng)建一個(gè)JAVA對(duì)象時(shí)它可以存活于作用域之外,在作用域外引用會(huì)消失,但是引用說(shuō)指向的對(duì)象仍繼續(xù)占據(jù)內(nèi)存空間。

4.通常來(lái)說(shuō),當(dāng)創(chuàng)建類時(shí),就是在描述那個(gè)類的對(duì)象的外觀和行為,除非用new創(chuàng)建那個(gè)類的對(duì)象,否則,實(shí)際上并未獲得任何對(duì)象,執(zhí)行new來(lái)創(chuàng)建對(duì)象時(shí),數(shù)據(jù)存儲(chǔ)空間才被分配,其方法才被外界調(diào)用。

5.無(wú)論創(chuàng)建多少個(gè)對(duì)象,靜態(tài)數(shù)據(jù)都只占用一份存儲(chǔ)區(qū)域,static不能應(yīng)用于局部變量,因此它只能作用于域。如果一個(gè)域是靜態(tài)的基本類型域,且也沒(méi)有對(duì)它進(jìn)行初始化,那么它就回獲得基本類型的標(biāo)準(zhǔn)初值,如果它是一個(gè)對(duì)象引用,那么它的默認(rèn)初始化值就是null。

6.總結(jié)一下對(duì)象的創(chuàng)建過(guò)程,假設(shè)有個(gè)名為Dog的類:

  1. 即使沒(méi)有顯式的使用static關(guān)鍵字,構(gòu)造器實(shí)際上也是靜態(tài)方法。因此,但首次創(chuàng)建類型為Dog的對(duì)象時(shí)(構(gòu)造器可以看成靜態(tài)方法),或者Dog類的靜態(tài)方法/靜態(tài)域首次被訪問(wèn)時(shí),JAVA解釋器必須查找類路徑,以定位Dog.class文件。
  2. 然后載入Dog.class(后面會(huì)學(xué)到,這將創(chuàng)建一個(gè)Class對(duì)象),有關(guān)靜態(tài)初始化的所有動(dòng)作都會(huì)執(zhí)行。因此靜態(tài)初始化只在Class對(duì)象首次加載的時(shí)候進(jìn)行一次。
  3. 當(dāng)用new Dog()創(chuàng)建對(duì)象的時(shí)候,首先將在堆上為Dog對(duì)象分配足夠的存儲(chǔ)空間。
  4. 這塊存儲(chǔ)空間會(huì)被清零,這就自動(dòng)地將Dog對(duì)象中的所有基本類型數(shù)據(jù)都設(shè)置成了默認(rèn)值(對(duì)數(shù)字來(lái)說(shuō)就是0,對(duì)布爾型和字符型也相同),而引用被設(shè)置成了null。
  5. 執(zhí)行所有出現(xiàn)于字段定義處的初始化動(dòng)作。
  6. 執(zhí)行構(gòu)造器,這可能會(huì)涉及到很多動(dòng)作,尤其是設(shè)計(jì)繼承的時(shí)候。
  1. 在JAVA中可以將一個(gè)數(shù)組賦值給另一個(gè)數(shù)組,其實(shí)真正做的只是復(fù)制了一個(gè)引用。(重點(diǎn)在于這是引用)
  1. 由于現(xiàn)在涉及基類和導(dǎo)出類這兩個(gè)類,而不是只有一個(gè)類,所以要試著想象導(dǎo)出類所產(chǎn)生的結(jié)果對(duì)象,會(huì)有點(diǎn)困惑。從外部來(lái)看,它就像是一個(gè)與基類具有相同接口的新類,或許還會(huì)有一些額外的方法和域,但繼承并不只是復(fù)制基類的接口。當(dāng)創(chuàng)建了一個(gè)導(dǎo)出類的對(duì)象時(shí),該對(duì)象包含了一個(gè)基類的子對(duì)象。這個(gè)子對(duì)象與你用基類直接創(chuàng)建的對(duì)象是一樣的。二者區(qū)別在于,后者來(lái)自于外部,而基類的子對(duì)象被包裝在導(dǎo)出類對(duì)象內(nèi)部。

9.“覆蓋”只有在某方法時(shí)基類的接口的一部分時(shí)才會(huì)出現(xiàn)。即,必須能將一個(gè)對(duì)象向上轉(zhuǎn)型為它的基本類型并調(diào)用相同的方法。如果某方法是private,它就不是基類的接口的一部分。它僅是一些隱藏與類中的程序代碼,只不過(guò)是具有相同的名稱而已。但如果在導(dǎo)出類中以相同的名稱生成一個(gè)public,protected或包訪問(wèn)權(quán)限方法的話,該方法就不會(huì)產(chǎn)生在基類中出現(xiàn)的“僅具有相同名稱”的情況。此時(shí)你并沒(méi)有覆蓋該方法,僅是生成了一個(gè)新的方法,由于private無(wú)法觸及而且能夠有效隱藏。所以除了把它看成是因?yàn)樗鶜w屬的類的組織結(jié)構(gòu)的原因而存在外,其它任何事物都不需要考慮它。

10.基類的構(gòu)造器總是在導(dǎo)出類的構(gòu)造過(guò)程中被調(diào)用,而且按照繼承層次逐漸向上鏈接,以使每個(gè)基類的構(gòu)造器都能得到調(diào)用,這樣做是有意義的,因?yàn)闃?gòu)造器具有一項(xiàng)特殊任務(wù),檢查對(duì)象是否被正確的構(gòu)造。導(dǎo)出類只能訪問(wèn)它自己的成員,不能訪問(wèn)基類中的成員(基類成員通常是private類型)。只有基類的構(gòu)造器才具有恰當(dāng)?shù)闹R(shí)和權(quán)限來(lái)對(duì)自己的元素進(jìn)行初始化。因此必須令所有構(gòu)造器都得到調(diào)用,否則就不能正確構(gòu)造完整對(duì)象。這正是每個(gè)導(dǎo)出類部分都必須調(diào)用構(gòu)造器的原因。在導(dǎo)出類的構(gòu)造器主體中,如果沒(méi)有明確指定調(diào)用某個(gè)基類構(gòu)造器,它就會(huì)“默默”的調(diào)用默認(rèn)構(gòu)造器,如果不存在默認(rèn)構(gòu)造器,編譯器就會(huì)報(bào)錯(cuò)(某個(gè)類沒(méi)有構(gòu)造器,編譯器會(huì)自動(dòng)合成出一個(gè)默認(rèn)構(gòu)造器)。

11.可以選擇在接口中顯式的將方法聲明為public的,但即使你不這么做,他們也是public的。因此,當(dāng)要實(shí)現(xiàn)一個(gè)接口時(shí),在接口中被定義的方法必須被定義為是public的;否則,他們將只能得到默認(rèn)的包訪問(wèn)權(quán)限,這樣在方法被繼承的過(guò)程中,其可訪問(wèn)權(quán)限就被降低了,這是Java編譯器所不允許的。

12.使用接口的核心原因:為了能夠向上轉(zhuǎn)型為多個(gè)基類型(以及由此而帶來(lái)的靈活性)。然而,使用接口的第二個(gè)原因卻是與使用抽象基類相同;防止客戶端程序員創(chuàng)建該類的對(duì)象,并確保這僅僅是建立一個(gè)接口。這就帶來(lái)了一個(gè)問(wèn)題:我們應(yīng)該使用接口還是抽象類?如果要?jiǎng)?chuàng)建不帶任何方法定義和成員變量的基類,那么就應(yīng)該選擇接口而不是抽象類。事實(shí)上,如果知道某事物應(yīng)該成為一個(gè)基類,那么第一選擇應(yīng)該是使它成為一個(gè)接口。

13.因?yàn)槟惴湃虢涌谥械娜魏斡蚨甲詣?dòng)是static 和final的,所以接口就成為了一種很便捷的用來(lái)創(chuàng)建常量組的工具。

14.內(nèi)部類自動(dòng)擁有對(duì)其外圍類所有成員的訪問(wèn)權(quán)。這是如何做到的呢?當(dāng)某個(gè)外圍類的對(duì)象創(chuàng)建了一個(gè)內(nèi)部類對(duì)象時(shí),此內(nèi)部類對(duì)象必定會(huì)秘密地捕獲一個(gè)指向外圍類對(duì)象的應(yīng)用。然后,在你訪問(wèn)此外圍類的成員時(shí),就是用那個(gè)引用來(lái)選擇外圍類的成員。幸運(yùn)的是,編譯器會(huì)幫你處理所有的細(xì)節(jié),但你現(xiàn)在可以看到,內(nèi)部類的對(duì)象只能在與其外圍類的對(duì)象相關(guān)聯(lián)的情況下才能被創(chuàng)建(就像你應(yīng)該看到的,在內(nèi)部類是非Static類時(shí)),構(gòu)建內(nèi)部類對(duì)象時(shí),需要一個(gè)指向其外圍類的對(duì)象的引用,如果編譯器訪問(wèn)不到這個(gè)引用就會(huì)報(bào)錯(cuò)。

15.在擁有外部類對(duì)象之前是不可能創(chuàng)建內(nèi)部類對(duì)象的,這是因?yàn)閮?nèi)部類對(duì)象會(huì)暗暗的連接到創(chuàng)建它的外部類對(duì)象上。但是,如果你創(chuàng)建的是靜態(tài)內(nèi)部類,那么它就不需要對(duì)外部類對(duì)象的引用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容