摘要:局部變量和方法的參數(shù)都是被聲明在方法中,它們是暫時(shí)的,且生命周期只限于方法在放在棧上的這段期間也就是方法調(diào)用至執(zhí)行完畢為止。讓一個(gè)類(lèi)不被實(shí)例化的方法有兩種一種是將類(lèi)聲明稱(chēng)抽象類(lèi),第二種是將其構(gòu)造函數(shù)標(biāo)記為私有的。
前言:
今天要分享的是關(guān)于 《Head First Java》這本書(shū)的讀后感,這本書(shū)有點(diǎn)小厚差不多有七百頁(yè)左右,所以我花了幾乎整個(gè)國(guó)慶的時(shí)間去閱讀,學(xué)習(xí)。讀完之后發(fā)現(xiàn),受益頗多。正如書(shū)名所說(shuō)的,它是一本重視大腦的學(xué)習(xí)指南。無(wú)論你是Java開(kāi)發(fā)工程師,還是android開(kāi)發(fā)工程師,這本書(shū)都是良師益友。下面讓我們一起看看,我會(huì)以零碎的列表方式呈現(xiàn),并以通俗的方式講解那些你迷糊不清的細(xì)節(jié)?
正文:[1]程序員會(huì)在乎內(nèi)存中的兩種區(qū)域:對(duì)象的生存空間堆(heap)和方法調(diào)用及變量的生存空間(stack)。實(shí)例變量存在于所屬的對(duì)象中,所以自然是在堆上面。局部變量和方法的參數(shù)都是被聲明在方法中,它們是暫時(shí)的,且生命周期只限于方法在放在棧上的這段期間(也就是方法調(diào)用至執(zhí)行完畢為止)。
[2]當(dāng)你調(diào)用一個(gè)方法時(shí),該方法會(huì)放在調(diào)用棧的棧頂。實(shí)際上被堆上棧的是堆棧塊,它帶有方法的狀態(tài),包括執(zhí)行到哪一行程序以及所有的局部變量的值。
[3]無(wú)論對(duì)象是在哪里聲明的,它總是運(yùn)行在堆上。
[4]到底為什么要知道棧跟堆的機(jī)制?答案:如果想要了解變量的有效范圍(scope),對(duì)象的建立,內(nèi)存管理,線(xiàn)程(thread)和異常處理,則認(rèn)識(shí)棧跟堆是很重要的。
[5]關(guān)于構(gòu)造器的知識(shí):Duck myDuck = new Duck();看起來(lái)像是在調(diào)用Duck();方法,其實(shí)并不是,我們是在調(diào)用的Duck的構(gòu)造函數(shù)。注:唯一能夠調(diào)用構(gòu)造函數(shù)的方法就是新建一個(gè)類(lèi)。public Duck(){};構(gòu)造函數(shù)的規(guī)則:名字一定要跟類(lèi)的名稱(chēng)相同,而且沒(méi)有放回類(lèi)型。
[6]特別注意,當(dāng)你沒(méi)有寫(xiě)構(gòu)造函數(shù)的時(shí)候,編譯器會(huì)幫你寫(xiě)一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù)。不過(guò)如果你已經(jīng)自己寫(xiě)了一個(gè)構(gòu)造函數(shù),還想要一個(gè)沒(méi)有參數(shù)的構(gòu)造函數(shù)的話(huà),不好意思,你必須自己寫(xiě)一個(gè),因?yàn)檫@個(gè)時(shí)候,編譯器是不會(huì)幫你寫(xiě)無(wú)參數(shù)的構(gòu)造函數(shù)了。
[7]有時(shí)候有默認(rèn)值的無(wú)參數(shù)構(gòu)造函數(shù)是不合理的,因?yàn)榭勺x性太差,也沒(méi)有太大實(shí)際意義。在Java API中有些類(lèi)就沒(méi)有無(wú)參數(shù)的構(gòu)造函數(shù),如Color類(lèi)。
[8]在創(chuàng)建新對(duì)象時(shí),所有繼承下來(lái)的構(gòu)造函數(shù)都會(huì)執(zhí)行,這樣的過(guò)程被稱(chēng)為“構(gòu)造函數(shù)鏈(Constructor Chaining)“,調(diào)用父類(lèi)構(gòu)造函數(shù)的唯一方法就是調(diào)用super();但是你會(huì)說(shuō)我好像自己沒(méi)寫(xiě)啊,相信你已經(jīng)猜到了,對(duì)!就是偉大的編譯器幫忙加的,而且只會(huì)執(zhí)行父類(lèi)沒(méi)有參數(shù)的構(gòu)造函數(shù)。
[9]一個(gè)類(lèi)有多個(gè)構(gòu)造函數(shù)的話(huà),從某個(gè)構(gòu)造函數(shù)調(diào)用重載版的另一個(gè)構(gòu)造函數(shù)也是可行的,好處是可以減少很多重復(fù)的代碼。做法就是:調(diào)用this()或this(aString)就行。this就是個(gè)對(duì)對(duì)象本身的引用。this()只能用在構(gòu)造函數(shù)中,且她必須是第一行語(yǔ)句!每個(gè)構(gòu)造函數(shù)可以選擇調(diào)用super()或this(),但不能同時(shí)調(diào)用!
[10]實(shí)例變量的壽命與對(duì)象相同。如果對(duì)象還活著,則實(shí)例變量也會(huì)是活的。
[11]如果一個(gè)方法運(yùn)行在堆棧的時(shí)候,她里面的變量時(shí)活著的,它的狀態(tài)會(huì)被保存,但是只有這個(gè)方法在棧頂時(shí)候才能使用,這才是他真正的使用范圍。也就是說(shuō)局部變量只能在聲明它的方法在執(zhí)行中才能被使用。
[12]一個(gè)對(duì)象什么時(shí)候會(huì)從堆里面消失,就是這個(gè)對(duì)象失去了所有的引用,就被會(huì)被垃圾回收給干掉。
[13]當(dāng)你把引用設(shè)為null時(shí),你就等于是抹除遙控器的功能。換句話(huà)說(shuō)你找不到你的遙控的對(duì)象了。對(duì)null引用使用圓點(diǎn)運(yùn)算符會(huì)在執(zhí)行期遇到NullPointerException這樣的錯(cuò)誤。
[14]什么是靜態(tài)的方法,有一種說(shuō)法就是:一種不依靠實(shí)例變量也就不需要對(duì)象的行為,它只要類(lèi)名去調(diào)用即可。
[15]讓一個(gè)類(lèi)不被實(shí)例化的方法有兩種:一種是將類(lèi)聲明稱(chēng)abstract抽象類(lèi),第二種是將其構(gòu)造函數(shù)標(biāo)記為私有的。
[16]靜態(tài)的方法不能調(diào)用非靜態(tài)的變量,無(wú)法引用到該類(lèi)的任何實(shí)例變量。
[17]靜態(tài)變量:它的值對(duì)所有的實(shí)例來(lái)說(shuō)都相同,這就是靜態(tài)變量的功用:被同類(lèi)的所有實(shí)例共享的變量。實(shí)例變量:每個(gè)實(shí)例一個(gè)。靜態(tài)變量:每個(gè)類(lèi)一個(gè)。切記!
[18]靜態(tài)的final變量時(shí)常數(shù),常數(shù)變量的名稱(chēng)應(yīng)該要都是大寫(xiě)字母!一個(gè)被標(biāo)記為final的變量代表他一旦被初始化就不會(huì)改動(dòng)。有個(gè)比較好玩東西叫靜態(tài)初始化程序(static initializer)是一段在加載類(lèi)時(shí)會(huì)執(zhí)行的程序代碼,它會(huì)在其他程序可以使用該類(lèi)之前就執(zhí)行,所以很適合放靜態(tài)final變量的起始程序。如:class Foo{final static int x;static{x=42;}}。
[19] final的變量代表你不能改變它的值。final的method代表你不能覆蓋掉該method。final的類(lèi)代表你不能繼承該類(lèi)。
[20]在java5之后開(kāi)始加入的autoboxing功能能夠自動(dòng)地將primitive主數(shù)據(jù)類(lèi)型轉(zhuǎn)換成包裝過(guò)的對(duì)象!
[21]關(guān)于日期類(lèi),Calendar cal = new Calendar();無(wú)法通過(guò)編譯,因?yàn)槭浅橄箢?lèi)。你可以Calendar cal = Calendar.getInstance();其實(shí)是取了他的一個(gè)子類(lèi)?。
[22]靜的最高點(diǎn)!靜態(tài)的import,如果你直接import static java.lang.System.out;class WithStatic{ public static void main(String[] arg){ out.printIn("");}}。就可以這么寫(xiě),不過(guò)完全不推薦這個(gè)寫(xiě)法,程序會(huì)變的更易混淆,代碼的可讀性太差。
[23]如果try或catch塊有return指令,finally還是會(huì)執(zhí)行!流程會(huì)跳到finally然后再回到return指令。看見(jiàn)沒(méi)有,finally就是這么牛逼!
[24]自己在寫(xiě)方法,內(nèi)部自己throw異常的話(huà),throw下面的代碼都不執(zhí)行了,切記!
[25]異常也是多態(tài)的,如果你throws的是一個(gè)父類(lèi)的異常,這代表此方法同樣可以?huà)伋鏊淖宇?lèi)。
[26] catch的技巧,異常要從小寫(xiě)到大,這樣才會(huì)讓你的異常獲取的處理的更準(zhǔn)確合理,因?yàn)?b>catch從上往下執(zhí)行,如果catch到了,就不執(zhí)行下去了,切記!。
[27]如果你自己方法有異常,卻不想處理,你也可以繼續(xù)throws出去(也叫做duck),這樣調(diào)用你方法的人就要處理了,哈哈。
[28]異常處理規(guī)則:1.catch與finally不能沒(méi)有try。2.try與catch之間不能有程序。3.try一定要有catch或finally。4.只帶有finally的try必須要聲明異常。
[29] GUI方面的開(kāi)發(fā),主要用的包javax.swing,不過(guò)實(shí)在是真沒(méi)什么人用,看看就好了。里面對(duì)一些按鈕或者事件的監(jiān)聽(tīng)注冊(cè),對(duì)于android開(kāi)發(fā)程序員來(lái)說(shuō),非常的基礎(chǔ)。
[30]內(nèi)部類(lèi)可以把外部的方法或變量當(dāng)作自己的,這就是為什么內(nèi)部的類(lèi)非常好用的原因,除了跟正常的類(lèi)沒(méi)有差別之外,還多了特殊的存取權(quán)。使用場(chǎng)合就是在一個(gè)類(lèi)里面對(duì)不同的按鈕寫(xiě)不同的內(nèi)部監(jiān)聽(tīng)類(lèi)來(lái)解決不同的響應(yīng)問(wèn)題。
?這是第二篇,里面會(huì)有不少你想弄清楚的事情,只有真的弄清了你才能慢慢走出碼奴的陰影,走向美好的程序世界!加油各位攻城獅們,未完待續(xù)!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64661.html
摘要:對(duì)象本身已知的事物被稱(chēng)為實(shí)例變量俗稱(chēng)屬性。對(duì)象可以執(zhí)行的動(dòng)作稱(chēng)為方法。變量根據(jù)作用域分為全局變量,局部變量。對(duì)象有狀態(tài)和行為兩種屬性,狀態(tài)影響行為,行為影響狀態(tài)。 前言: 今天要分享的是關(guān)于《Head First Java》這本書(shū)的讀后感,這本書(shū)有點(diǎn)小厚差不多有七百頁(yè)左右,所以我花了幾乎整個(gè)國(guó)慶的時(shí)間去閱讀,學(xué)習(xí)。讀完之后發(fā)現(xiàn),受益頗多。正如書(shū)名所說(shuō)的,它是一本重視大腦的學(xué)習(xí)指南。無(wú)論...
摘要:一旦線(xiàn)程執(zhí)行線(xiàn)程會(huì)進(jìn)入可執(zhí)行狀態(tài),它會(huì)在可執(zhí)行與執(zhí)行中兩種狀態(tài)中來(lái)來(lái)去去,同時(shí)也有另外一種狀態(tài)暫時(shí)不可執(zhí)行又稱(chēng)為被堵塞狀態(tài)。當(dāng)對(duì)象有一個(gè)或多個(gè)同步化的方法時(shí),線(xiàn)程只有在取得對(duì)象鎖的鑰匙時(shí)才能進(jìn)入同步化的方法。 前言: 今天要分享的是關(guān)于 《Head First Java》這本書(shū)的讀后感,這本書(shū)有點(diǎn)小厚差不多有七百頁(yè)左右,所以我花了幾乎整個(gè)國(guó)慶的時(shí)間去閱讀,學(xué)習(xí)。讀完之后發(fā)現(xiàn),受益頗多。...
閱讀 3155·2021-10-08 10:04
閱讀 1098·2021-09-30 09:48
閱讀 3466·2021-09-22 10:53
閱讀 1684·2021-09-10 11:22
閱讀 1697·2021-09-06 15:00
閱讀 2156·2019-08-30 15:56
閱讀 719·2019-08-30 15:53
閱讀 2288·2019-08-30 13:04