怎樣用Java final 關(guān)鍵字,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
下面好好地講一講 final 關(guān)鍵字,也希望給更多的小伙伴一些幫助。
盡管 繼承可以讓我們重用現(xiàn)有代碼,但有時(shí)處于某些原因,我們確實(shí)需要對(duì)可擴(kuò)展性進(jìn)行限制,final 關(guān)鍵字可以幫助我們做到這一點(diǎn)。
如果一個(gè)類(lèi)使用了 final 關(guān)鍵字修飾,那么它就無(wú)法被繼承。如果小伙伴們細(xì)心觀察的話(huà),Java 就有不少 final 類(lèi),比如說(shuō)最常見(jiàn)的 String 類(lèi)。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {}
為什么 String 類(lèi)要設(shè)計(jì)成 final 的呢?原因大致有以下三個(gè):
為了實(shí)現(xiàn)字符串常量池
為了線(xiàn)程安全
為了 HashCode 的不可變性
更詳細(xì)的原因,可以查看我之前寫(xiě)的一篇 文章。
任何嘗試從 final 類(lèi)繼承的行為將會(huì)引發(fā)編譯錯(cuò)誤,為了驗(yàn)證這一點(diǎn),我們來(lái)看下面這個(gè)例子,Writer 類(lèi)是 final 的。
public final class Writer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
嘗試去繼承它,編譯器會(huì)提示以下錯(cuò)誤,Writer 類(lèi)是 final 的,無(wú)法繼承。
不過(guò),類(lèi)是 final 的,并不意味著該類(lèi)的對(duì)象是不可變的。
Writer writer = new Writer();
writer.setName("沉默王二");
System.out.println(writer.getName()); // 沉默王二
Writer 的 name 字段的默認(rèn)值是 null,但可以通過(guò) settter 方法將其更改為“沉默王二”。也就是說(shuō),如果一個(gè)類(lèi)只是 final 的,那么它并不是不可變的全部條件。
如果,你想了解不可變類(lèi)的全部真相,請(qǐng)查看我之前寫(xiě)的文章 這次要說(shuō)不明白immutable類(lèi),我就怎么地。突然發(fā)現(xiàn),寫(xiě)系列文章真的妙啊,很多相關(guān)性的概念全部涉及到了。我真服了自己了。
把一個(gè)類(lèi)設(shè)計(jì)成 final 的,有其安全方面的考慮,但不應(yīng)該故意為之,因?yàn)榘岩粋€(gè)類(lèi)定義成 final 的,意味著它沒(méi)辦法繼承,假如這個(gè)類(lèi)的一些方法存在一些問(wèn)題的話(huà),我們就無(wú)法通過(guò)重寫(xiě)的方式去修復(fù)它。
被 final 修飾的方法不能被重寫(xiě)。如果我們?cè)谠O(shè)計(jì)一個(gè)類(lèi)的時(shí)候,認(rèn)為某些方法不應(yīng)該被重寫(xiě),就應(yīng)該把它設(shè)計(jì)成 final 的。
Thread 類(lèi)就是一個(gè)例子,它本身不是 final 的,這意味著我們可以擴(kuò)展它,但它的 isAlive()
方法是 final 的:
public class Thread implements Runnable {
public final native boolean isAlive();
}
需要注意的是,該方法是一個(gè)本地(native)方法,用于確認(rèn)線(xiàn)程是否處于活躍狀態(tài)。而本地方法是由操作系統(tǒng)決定的,因此重寫(xiě)該方法并不容易實(shí)現(xiàn)。
Actor 類(lèi)有一個(gè) final 方法 show()
:
public class Actor {
public final void show() {
}
}
當(dāng)我們想要重寫(xiě)該方法的話(huà),就會(huì)出現(xiàn)編譯錯(cuò)誤:
如果一個(gè)類(lèi)中的某些方法要被其他方法調(diào)用,則應(yīng)考慮事被調(diào)用的方法稱(chēng)為 final 方法,否則,重寫(xiě)該方法會(huì)影響到調(diào)用方法的使用。
一個(gè)類(lèi)是 final 的,和一個(gè)類(lèi)不是 final,但它所有的方法都是 final 的,考慮一下,它們之間有什么區(qū)別?
我能想到的一點(diǎn),就是前者不能被繼承,也就是說(shuō)方法無(wú)法被重寫(xiě);后者呢,可以被繼承,然后追加一些非 final 的方法。沒(méi)毛病吧?看把我聰明的。
被 final 修飾的變量無(wú)法重新賦值。換句話(huà)說(shuō),final 變量一旦初始化,就無(wú)法更改。之前被一個(gè)小伙伴問(wèn)過(guò),什么是 effective final,什么是 final,這一點(diǎn),我在之前的文章也有闡述過(guò),所以這里再貼一下地址:
http://www.itwanger.com/java/2020/02/14/java-final-effectively.html
1)final 修飾的基本數(shù)據(jù)類(lèi)型
來(lái)聲明一個(gè) final 修飾的 int 類(lèi)型的變量:
final int age = 18;
嘗試將它修改為 30,結(jié)果編譯器生氣了:
2)final 修飾的引用類(lèi)型
現(xiàn)在有一個(gè)普通的類(lèi) Pig,它有一個(gè)字段 name:
public class Pig {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在測(cè)試類(lèi)中聲明一個(gè) final 修飾的 Pig 對(duì)象:
final Pig pig = new Pig();
如果嘗試將 pig 重新賦值的話(huà),編譯器同樣會(huì)生氣:
但我們?nèi)匀豢梢匀バ薷?Pig 的字段值:
final Pig pig = new Pig();
pig.setName("特立獨(dú)行");
System.out.println(pig.getName()); // 特立獨(dú)行
3)final 修飾的字段
final 修飾的字段可以分為兩種,一種是 static 的,另外一種是沒(méi)有 static 的,就像下面這樣:
public class Pig {
private final int age = 1;
public static final double PRICE = 36.5;
}
非 static 的 final 字段必須有一個(gè)默認(rèn)值,否則編譯器將會(huì)提醒沒(méi)有初始化:
static 的 final 字段也叫常量,它的名字應(yīng)該為大寫(xiě),可以在聲明的時(shí)候初始化,也可以通過(guò) static [代碼塊初始化]()。
4) final 修飾的參數(shù)
final 關(guān)鍵字還可以修飾參數(shù),它意味著參數(shù)在方法體內(nèi)不能被再修改:
public class ArgFinalTest {
public void arg(final int age) {
}
public void arg1(final String name) {
}
}
如果嘗試去修改它的話(huà),編譯器會(huì)提示以下錯(cuò)誤:
看完上述內(nèi)容,你們掌握怎樣用Java final 關(guān)鍵字的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!
當(dāng)前標(biāo)題:怎樣用Javafinal關(guān)鍵字-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)地址:http://chinadenli.net/article32/dihhpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、虛擬主機(jī)、網(wǎng)站導(dǎo)航、Google、電子商務(wù)、用戶(hù)體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容