詳解Java中final的用法
概念
final 具有“不可改變的”的含義,可以修飾 非抽象類、非抽象成員方法和變量。
- 用 final 修飾的類不能被繼承,沒有子類。
- 用 final 修飾的方法不能被子類的方法覆蓋(重寫)。
- 用 final 修飾的變量表示常量,只能被賦一次值(聲明變量的時(shí)候)。
注:
final 不能用來修飾構(gòu)造方法,因?yàn)椤胺椒ǜ采w”這一概念僅適用于類的成員方法,而不適用于類的構(gòu)造方法,父類的構(gòu)造方法和子類的構(gòu)造方法之間不存在覆蓋的關(guān)系,因此用final修飾構(gòu)造方法沒有任何意義。
父類中用 private 修飾的方法不能被子類的方法所覆蓋,因此可以理解為 private 類型的方法默認(rèn)是 final 類型的。
final 類
把類定義為 final,使這個(gè)類不能被繼承。具體使用場(chǎng)景如下:
- 不是專門為繼承而設(shè)計(jì)的類,類本身的方法之間有復(fù)雜的調(diào)用關(guān)系。如果隨意創(chuàng)建這些類的子類,子類有可能會(huì)錯(cuò)誤的修改了父類的實(shí)現(xiàn)細(xì)節(jié)。
- 處于安全的原因,類的實(shí)現(xiàn)細(xì)節(jié)不允許在被擴(kuò)展。
- 在創(chuàng)建對(duì)象模型時(shí),確信這個(gè)類不會(huì)再被擴(kuò)展。
例如:JDK中的java.lang.String 類被定義為 final 類型。
public final class String{...}
final 方法
在某些情況下,出于安全原因,父類不允許子類覆蓋某個(gè)方法,此時(shí)可以把這個(gè)方法聲明為 final 類型。
例如:JDK中的java.lang.Object 類中,getClass()方法為 final 類型,而 equals() 方法不為 final 類型。
所有 Object 的子類都可以覆蓋 equals() 方法,但不能覆蓋 getClass() 方法。
final 變量
用 final 修飾的變量表示取值不會(huì)改變的常量。
例如:JDK中 java.lang.Integer 類中定義了兩個(gè)常量。
public static final int MIN_VALUE = 0x80000000;
public static final int MAX_VALUE = 0x7fffffff;
final 變量具有以下特征:
- final修飾符可以修飾靜態(tài)變量、成員變量和局部變量,分別表示靜態(tài)常量、實(shí)例常量和局部常量。
public class Demo{ public static final int MAX_VALUE = 23; //靜態(tài)常量 public static final int MIN_VALUE = 10; //靜態(tài)常量 private final Date birthday = new Date(); //成員常量 }
靜態(tài)常量一般以大寫字母命名,單詞之間以“_”符號(hào)分開。
- final修飾的成員變量必須初始化。
public class FinalTest { final int a = 1; //成員常量 默認(rèn)初始化 static final int b = 2; //靜態(tài)常量 默認(rèn)初始化 final int c; //成員常量 static final int d; //靜態(tài)常量 public FinalTest(){ c = 3; //成員常量 未默認(rèn)初始化,可在構(gòu)造函數(shù)中初始化 } static { d = 4; //靜態(tài)常量 未默認(rèn)初始化,可在靜態(tài)代碼塊中初始化 } }
final 變量只能賦一次值,如果將引用類型的變量用 final 修飾,該變量只能始終引用一個(gè)對(duì)象,但可以改變對(duì)象的內(nèi)容。
public class FinalTest { String str = ""; public void print(){ System.out.println(str); } public static void main(String[] args){ final FinalTest finalTest = new FinalTest(); finalTest.str = "xixihaha"; finalTest.print(); } }
總結(jié):
實(shí)際程序中,通過 final 修飾符來定義常量,目的為:
- 提高程序的安全性。
- 提高代碼可維護(hù)性。
- 提供代碼可讀性。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- 淺談Java之終止繼承:Final類和Fianl方法
- Java修飾符 abstract,static,final 的區(qū)別詳解
- java中final關(guān)鍵字使用示例詳解
- java關(guān)鍵字final使用方法詳解
- Java反射如何有效的修改final屬性值詳解
- Java中final變量使用總結(jié)
- Java中final關(guān)鍵字的用法總結(jié)
- Java final 修飾符知識(shí)點(diǎn)總結(jié)(必看篇)
- 深入解析Java編程中final關(guān)鍵字的作用
- Java中final作用于變量、參數(shù)、方法及類該如何處理
- Java中final與繼承操作實(shí)例分析
相關(guān)文章
Java經(jīng)典快排思想以及快排的改進(jìn)講解
今天小編就為大家分享一篇關(guān)于Java經(jīng)典快排思想以及快排的改進(jìn)講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01解決springSecurity 使用默認(rèn)登陸界面登錄后無法跳轉(zhuǎn)問題
這篇文章主要介紹了解決springSecurity 使用默認(rèn)登陸界面登錄后無法跳轉(zhuǎn)問題,項(xiàng)目環(huán)境springboot下使用springSecurity 版本2.7.8,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12Spring?Data?Redis切換底層Jedis和Lettuce實(shí)現(xiàn)源碼解析
這篇文章主要為大家介紹了Spring?Data?Redis切換底層Jedis和Lettuce實(shí)現(xiàn)方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11IntelliJ IDEA中ajax開發(fā)實(shí)現(xiàn)分頁(yè)查詢示例
這篇文章主要介紹了IntelliJ IDEA中ajax開發(fā)實(shí)現(xiàn)分頁(yè)查詢,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03詳解Spring?中?Bean?對(duì)象的存儲(chǔ)和取出
由于?Spring?擁有對(duì)象的管理權(quán),所以我們也需要擁有較為高效的對(duì)象存儲(chǔ)和取出的手段,下面我們來分別總結(jié)一下,對(duì)Spring?中?Bean?對(duì)象的存儲(chǔ)和取出知識(shí)感興趣的朋友跟隨小編一起看看吧2022-11-11java字符串?dāng)?shù)組進(jìn)行大小排序的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨ava字符串?dāng)?shù)組進(jìn)行大小排序的簡(jiǎn)單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09