《疯狂Java讲义》7
?
昨天介紹了枚舉類的相關知識,并沒有講完,我們繼續!
枚舉類的成員變量、方法和構造器
先定義一個枚舉類,代碼如下:
下面通過一個程序講述對這個類的使用:
結果如下:
????上面的程序使用Gender枚舉類的時候與普通類沒有什么很大的差別,差別只是產生Gender對象的方式不同,枚舉類的實例只能是枚舉值,而不是通過new隨意的創建對象。
? ??之前提到過,枚舉類比較特殊,無論是寫法上還是含義上。所以,對枚舉類里的實例變量 也應該有一定的要求。舉個栗子:如果沒什么要求,那么上面的程序中我也可以把name實例變量賦值成“男”,但是這個顯然是有問題的。所以理論上枚舉類里的實例變量應該是封裝好的,也就是說要通過private進行修飾。此外,在枚舉類中還應該對實例變量的值進行一些限定。其實說白了,枚舉類就是我們描述集合所用到的列舉法,它的情況應該是有限且可知的。
看下面代碼:
上面框出來的就是解決的兩點。這樣子就不會發生與實際相悖的混亂。
結果如下:
????上述代碼看起來已經天衣無縫了,但是仍然不是最好的。枚舉類通常被設計成不可變類,也就是說,它的成員變量不應該改變,這樣更安全,而且代碼更加簡潔。因此建議將枚舉類的成員變量都用private final修飾。如果用final修飾,那么必須在構造器里為這些成員變量指定初始值。因此應該為枚舉類顯式定義帶參數的構造器。
代碼如下:
可能大家很不熟悉第42行的寫法。
這兩行相當于:
對象與垃圾回收
1. 垃圾回收機制特征:
(1)垃圾回收機制只負責回收內存中的對象,不會回收任何物理資源(例如數據庫連接,網絡ID等資源)
(2)程序無法精確控制垃圾回收的運行,垃圾回收會在合適的時候進行。當對象永久性的失去引用后,系統就會在合適的時候回收它。
(3)在垃圾回收機制回收任何對象之前,總會先調用它的finalize()方法,該方法可能使該對象重新復活(讓一個引用變量重新引用該對象),從而導致垃圾回收機制取消回收。
2. 對象在內存中的狀態:
(1)可達狀態:當一個對象被創建后,有引用變量引用它,則這個對象在程序中處于可達狀態;
(2)可恢復狀態:如果程序中某個對象不再有任何引用變量引用它,它就進入了可恢復狀態。在這種狀態下,垃圾回收機制就準備對它進行回收。但是在回收之前會調用finalize()方法進行資源清理,如果該對象被重新引用,就不回收,否則就回收。
(3)不可達狀態:系統調用finalize()方法之后該對象還是沒有被調用,該對象就到了不可達狀態,就進行回收。
?3. finalize方法
-
finalize()方法用來清理對象的資源;
-
方法原型為:
????????protected void finalize() throws Throwable
-
當finalize()方法返回后,對象消失,垃圾回收機制開始執行,方法原型中的throwsThrowable表示它可以拋出任何形式的異常。
-
垃圾回收機制何時調用對象的finalize()方法是完全透明的,只有當程序認為需要更多的額外內存時,垃圾回收機制才會進行垃圾回收。因此,完全有可能出現這樣一種情形:某個對象失去了引用,但是只占用了少量內存,而且系統沒有產生嚴重的內存需求,因此垃圾回收機制并沒有試圖回收該對象所占用的資源,所以該對象的finalize()方法不會得到調用。
-
finalize()方法有4個特點:
(1)永遠不要調用某個對象的finalize()方法,該方法應該交給垃圾回收機制調用。
(2)finalize()方法何時被調用,是否被調用具有不確定性,不要把finalize()方法當作一定會執行的方法。
(3)當JVM執行可恢復對象的finalize()方法時,可能使該對象或系統中其他對象重新變成可達狀態。
(4)當JVM執行finalize()方法時出現異常時,垃圾回收機制不會報告異常,程序繼續執行。
使用JAR文件
?1. JAR文件的全稱是JavaArchiveFile,意思就是Java檔案文件。通常JAR文件是一個壓縮文件,與常見的ZIP壓縮文件兼容,通常也被稱為JAR包。JAR文件與ZIP壓縮文件的區別是:JAR文件中默認包含了一個名為META-INF/MANIFEST.MF的清單文件,這個清單文件是生成JAR文件時由系統自動創建的。
2. JAR文件的作用:
????當開發了一個應用程序之后,這個應用程序包含了很多類,如果需要把這個應用程序提供給別人使用,通常會把這些類文件打包成一個JAR文件,把這個JAR文件給別人使用。只要別人在自己的系統里面的CLASSPATH環境變量中添加這個JAR文件,則Java虛擬機就可以自動在內存中解壓這個JAR包,然后進行使用。
3. JAR文件的好處:
(1)安全:能夠對JAR文件進行數字簽名,只讓能夠識別數字簽名的用戶使用里面的東西;
(2)加快下載速度:在網上使用Applet時,如果存在多個文件而不打包,為了能夠把每個文件都下載到客戶端,需要為每個文件單獨建立一個HTTP連接,這是非常耗時的工作。但是打包以后,只需要建立一個HTTP連接即可;
(3)壓縮
(4)包封裝
(5)可移植性
?
【2017.07】
好了,今天java就到這里吧,下面本來是JAR包的使用,可是我怎么就這么不想看呢。明天學習第七章吧——Java基礎類庫。感覺現在看起來學的都是些理論上的東西,但是還是有很大幫助的,知道了很多機理以后,無論是看代碼還是寫代碼都會考慮更多,讓程序更加健壯,所以還是有必要的。不希望自己一直紙上談兵,所以我把書上的程序都敲過一遍,會不會再說,首先混個手熟。加油吧,今天應該可以敲敲代碼,弄弄競賽題。對了,說個有意思的事情,我今天打開公眾號,發現老爸給了我個消息,是一個表情,頭暈眼花的那個,頓時覺得好好玩啊爸爸,太有意思了。不過這個可能在提醒我,只發專業東西不是太好的,可以多面性!get it!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的《疯狂Java讲义》7的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《疯狂java讲义》6
- 下一篇: 《疯狂Java讲义》8