垃圾回收
與C++一樣,Java也需要進行垃圾回收,但是它們之間是有不同之處的。C++允許你為一個類定義一個撤消函數(destructor ),它在對象正好出作用域之前被調用。Java不支持這個想法也不提供撤消函數。finalize() 方法只和撤消函數的功能接近。當你對Java 有豐富經驗時,你將看到因為Java使用垃圾回收子系統,幾乎沒有必要使用撤消函數。
這里有三個要點值得注意:
(1).對象不一定會被回收
(2).垃圾回收不是析構函數
(3).垃圾回收只與內存有關
總而言之,垃圾回收和finalize() 并不一定會執行。也就是說,除非虛擬機真的到了沒有內存運行的地步,否則它不會浪費時間進行垃圾回收以恢復內存。
final修飾符
final可以應用到數據、方法和類,下面逐一闡釋。
final數據
將final應用到數據,無外乎2個原因:
1.創建一個編譯時常量并且之后不再改變
2.創建一個運行時變量并且之后不再改變
第一種情況編譯器會在編譯時就進行內聯,降低運行成本。此種情況在Java中必須是帶final修飾符的基本數據類型,并且在創建時賦值。
被static和final同時修飾的變量只會擁有一塊存儲空間,它不會改變。
值得注意的是,當final修飾的是對象時,實際上是對指向該對象的引用進行限制,一旦初始化后,其不能被修改為指向其他對象,但是對象本身仍可以被修改。所以相比于修飾原始數據類型,使用final修飾對象顯得不是很重要。
空白final
所謂空白final,即在創建時不賦值。這樣極大地提高了final的靈活性,比如類中的每個對象都擁有含有不同值的final字段。但是要注意的是,因為final字段必須在使用前進行賦值,所以空白final字段必須在構造器中進行初始化操作。
final參數
方法中的參數也可以使用final修飾,代表著此參數在方法中不能改變它的引用。此種用法通常用于傳遞數據到匿名內部類中。
final方法
使用final修飾的方法意味著其不可被重寫。通常,如果在設計上考慮不想讓某個方法在子類中被修改,可以將它定義為final。
除此之外,final方法還有另一個優點是可以提高效率。在早期實現中,編譯器會將所有final方法調用替換為內聯調用,大大減少了系統開銷。但在最近版本的Java中,JVM可以自動探測并優化內聯機制,這使得人工標注優化點變得不再需要。現在已經不提倡使用final幫助優化器工作了,將效率問題全權交給編譯器和JVM會是更好的選擇。
總而言之,只在你想顯式地指明方法不能被重寫時使用final方法。
final與private
任何private方法都包含隱式的final,因為private不可被訪問,自然也不可被重寫。你可以為private方法加上final,但是這并不會為它賦予更多含義。
在此有一個奇怪的地方:如果你試圖重寫一個private方法,編譯器不會報錯,而且看起來也確實可行。之所以會發生這樣的情況,其實是因為你實際上是在創建一個新方法,而不是重寫一個舊方法。還記得“重寫”的條件嗎?只有父類接口中的方法可以重寫。private方法不在接口中,相當于隱藏在類里面,只不過恰巧名字和你創建的方法一樣。
final類
使用final修飾的類不可被繼承,類中任何東西都不能被修改。類中字段可以是final也可以不是,但是所有方法都是隱式final的。
容器
relegate