摘要:閱讀原文小而有料的想聽文章核心內(nèi)容語音對話版,請到微信公眾號碼上實戰(zhàn),閱讀原文這塊肉雖然小,但不可不知,因為不僅面試可能會問,實際中也常使用。參考書籍編程思想深入理解虛擬機更多精彩技術(shù)文章盡在微信公眾號碼上實戰(zhàn)
閱讀原文:小而有料的final(想聽文章核心內(nèi)容語音對話版,請到微信公眾號——碼上實戰(zhàn),閱讀原文)
final這塊肉雖然小,但不可不知,因為不僅面試可能會問,實際中也常使用。
就問你常量聲明時你為什么要加final?它有哪些作用?你思考過嗎?
final通常指被修飾的東西不能被改變的,不能被改變的原因旺往往出于設(shè)計和效率的考慮。
先看final能修飾什么?
修飾變量
修飾方法
修飾類
修飾參數(shù)
不同的修飾有什么不同的作用呢?下面慢慢道來:
final常量final修飾的常量必須在被使用前進行初始化,初始化的方式無非兩種:定義時賦值或構(gòu)造函數(shù)內(nèi)賦值
final修飾常量基本類型和引用類型有些不同,我分開講。
基本數(shù)據(jù)類型public class Test { private final int A; private final int B = 3; private final int C = new Random().nextInt(); public Test() { this.A = 5; } public Test(int a) { this.A = a; } }
為什么常量B要用final修飾?
因為這種確定值(定義便立即賦值)的final常量,編譯器會在編譯時將該常量值帶入到任何可能用到它的計算式中,這會減輕運行時的一些負(fù)擔(dān)。
比如 int d = 3 * B; 那么編譯后相當(dāng)于 int d = 9;
final修飾的常量值是在編譯期間被確定的嗎?
注意上面的變量C,我們并不能以為final修飾的就能在編譯時知道它的值,C的值只有在運行時被初始化時才會顯現(xiàn)。
引用類型引用類型不能改變指的是引用被初始化指向一個對象后,就再也無法改為指向其他對象,但其指向的對象本身是可以被修改的。
public class B { //final常量d指向了對象D private final D d =new D(); //這個方法改變了對象D的內(nèi)容 public D change(){ this.d.setS("change"); return d; } //注意這個方法,將常量d的引用改變了 public D refnewD(){ this.d = new D(); return d; } class D { private String s= "init"; public String getS() { return s; } public void setS(String s) { this.s = s; } } }
上面代碼是無法編譯的,因為this.d=new D()會提示Cannot assign a value to final variable "d",但是你卻可以調(diào)用change()方法來改變d對象的s變量值。
final方法為什么使用final修飾方法
設(shè)計:把方法鎖定,防止繼承類修改它的含義。
效率:早期編譯器會將final方法所有的調(diào)用轉(zhuǎn)為內(nèi)嵌調(diào)用,隨著JVM的提高,這種方式已被丟棄。
final和private
當(dāng)一個方法被private修飾,這會隱式的指定為final,這也會使得子類無法覆蓋此方法,可以對private方法增加final修飾,但對該方法并不能增加任何意義。
final類String類是final應(yīng)用的典型例子,可去查看面試別再問我String了。
為什么要把類指定為final?
出于安全考慮或其他原因,你不希望該類有任何變動或被繼承。
一旦類被final修飾,即代表final類中的所有成員變量和方法都會隱式的final.final參數(shù)
在方法的參數(shù)列表中將參數(shù)指定為final,即代表該參數(shù)引用所指向的對象是無法改變的;
若為基本類型,則表示值可以讀取,但無法修改。修飾情況和final常量類似。也可結(jié)合這題不會!別說你懂值傳遞與引用傳遞看。
static強調(diào)的是該數(shù)據(jù)只存在一份,且是屬于類的,不是屬于對象。
final強調(diào)該數(shù)據(jù)不可變,且是屬于對象的。
public class C { private final double A = 3.14D; private static double b = 3.14D; public static void main(String[] args) { new C(); new C(); new C(); } }
上面代碼運行后,A會存在3個,但b只有一個。
final,finally和finalizefinally
是在異常處理時配合try-catch執(zhí)行清理操作,需要清理的資源包括:打開的文件或網(wǎng)絡(luò)連接等,它會把內(nèi)存之外的資源恢復(fù)到他們的初始狀態(tài)。無論try中是否有異常出現(xiàn),finally里的操作都會被執(zhí)行。
finalize
這是Object基類的一個方法,垃圾收集器在將對象清除出內(nèi)存之前調(diào)用的清理資源方法,且此方法只會被系統(tǒng)調(diào)用一次,其實finalize能做的工作,try-finally能做的更好,《深入理解Java虛擬機》中建議大家忘掉這個方法的存在。
參考書籍Java編程思想
深入理解Java虛擬機
更多精彩技術(shù)文章盡在微信公眾號:碼上實戰(zhàn)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/74036.html
摘要:區(qū)塊鏈教程是我寫的一個區(qū)塊鏈教程,最初譯自的系列文章,這個系列主要針對。隨著對區(qū)塊鏈的認(rèn)識不斷深入,我后續(xù)計劃加入很多其他內(nèi)容,比如,,,,,等等我感興趣的項目。不過要想了解鏈,還是我上面的教程內(nèi)容更豐富一點。 區(qū)塊鏈教程 blockchain-tutorial 是我寫的一個區(qū)塊鏈教程,最初譯自 Jeiwan/blockchain_go 的系列文章,這個系列主要針對 Bitcoin。隨...
摘要:介紹是以和為基礎(chǔ)搭建的開源的和應(yīng)用程序平臺。在官網(wǎng)上聲稱在中,用搭建數(shù)據(jù)驅(qū)動的網(wǎng)站應(yīng)用程序和是最容易的。這樣實現(xiàn)一個網(wǎng)站只要定義和寫前端代碼就好了。這應(yīng)該是前端猴子接外包的一個利器吧。 介紹 Keystone是以Express和MongoDB為基礎(chǔ)搭建的開源的Node.js CMS和web應(yīng)用程序平臺。 Keystone在官網(wǎng)上聲稱:在Node.js中,用Keystone搭建數(shù)據(jù)驅(qū)動的...
閱讀 1907·2023-04-26 01:55
閱讀 1149·2021-09-30 09:47
閱讀 1745·2019-08-30 15:54
閱讀 802·2019-08-30 15:53
閱讀 757·2019-08-30 15:52
閱讀 1198·2019-08-30 15:44
閱讀 2483·2019-08-30 14:06
閱讀 1120·2019-08-29 16:39