[轉載] Java中的final變量、final方法和final類

參考鏈接: Java中的final數組 | Final arrays

1、final變量?

final關鍵字可用于變量聲明,一旦該變量被設定,就不可以再改變該變量的值。通常,由final定義的變量為常量。例如,在類中定義PI值,可以使用如下語句:?

final double PI=3.14;?

在Java中定義全局常量,通常使用public static final修飾,這樣的常量只能在定義是被賦值。?

public static final double PI_VAULE = 3.14;?

規范:被定義為final的常量定義時需要使用大寫字母命名,并且中間使用下劃線進行連接。?

常量示例:?

import java.util.Random;

?

class Test

{

? ? int i = 0;

}

?

/**

?* 常量示例

?*?

?* @author pan_junbiao

?*

?*/

public class FinalData

{

? ? static Random rand = new Random();

? ? private final int VALUE_1 = 9; // 聲明一個final常量

? ? private static final int VALUE_2 = 10; // 聲明一個final、static常量

? ? private final Test test = new Test(); // 聲明一個final引用

? ? private Test test2 = new Test(); // 聲明一個不是final的引用

? ? private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 聲明一個定義為final的數組

? ? private final int i4 = rand.nextInt(20);

? ? private static final int i5 = rand.nextInt(20);

?

? ? public String toString()

? ? {

? ? ? ? return "i4值:" + i4 + " i5值:" + i5 + " ";

? ? }

?

? ? public static void main(String[] args)

? ? {

? ? ? ? FinalData data = new FinalData();

?

? ? ? ? // 報錯:不能改變定義為final的常量值

? ? ? ? // data.VALUE_1 = 8;

?

? ? ? ? // 報錯:不能改變定義為final的常量值

? ? ? ? // data.VALUE_2 = 9;

?

? ? ? ? // 報錯:不能將定義為final的引用指向其他引用

? ? ? ? // data.test = new Test();

?

? ? ? ? // 正確: 可以對指定為final的引用中的成員變量賦值

? ? ? ? data.test.i = 1;

?

? ? ? ? // 正確: 可以將沒有定義為final的引用指向其他引用

? ? ? ? data.test2 = new Test();

?

? ? ? ? // 報錯:不能對定義為final的數組賦值

? ? ? ? // int b[] = { 7, 8, 9 };

? ? ? ? // data.a = b;

?

? ? ? ? // 但是final的數組中的每一項內容是可以改變的

? ? ? ? for (int i = 0; i < data.a.length; i++)

? ? ? ? {

? ? ? ? ? ? data.a[i] = 9;

? ? ? ? }

?

? ? ? ? System.out.println(data);

? ? ? ? System.out.println("data2");

? ? ? ? System.out.println(new FinalData());

? ? }

}?

執行結果:?

??

從上述執行結果中可以發現i5的值是相同的。?

全局常量:?

我們知道一個被定義為final的對象引用只能指向唯一一個對象,不可以將它再指向其它對象,但是一個對象的值卻是可以改變的,那么為了使一個常量真正做到不可更改,可以將常量聲明為static final。?

示例:在項目中創建FinalStaticData類,在該類中創建Random類的對象,在主方法中分別輸出類中定義的final變量a1與a2。?

import static java.lang.System.out;

?

import java.util.Random;

?

/**

?* FinalStaticData類

?*?

?* @author pan_junbiao

?*

?*/

public class FinalStaticData

{

? ? private static Random rand = new Random(); // 實例化一個Random類對象

? ? // 隨機產生0~10之間的隨機數賦予定義為final的a1

? ? private final int a1 = rand.nextInt(10);

? ? // 隨機產生0~10之間的隨機數賦予定義為static final的a2

? ? private static final int a2 = rand.nextInt(10);

?

? ? public static void main(String[] args)

? ? {

? ? ? ? FinalStaticData fdata = new FinalStaticData(); // 實例化一個對象

? ? ? ? // 調用定義為final的a1

? ? ? ? out.println("重新實例化對象調用a1的值:" + fdata.a1);

? ? ? ? // 調用定義為static final的a2

? ? ? ? out.println("重新實例化對象調用a2的值:" + fdata.a2);

? ? ? ? // 實例化另外一個對象

? ? ? ? FinalStaticData fdata2 = new FinalStaticData();

? ? ? ? out.println("重新實例化對象調用a1的值:" + fdata2.a1);

? ? ? ? out.println("重新實例化對象調用a2的值:" + fdata2.a2);

? ? }

}?

運行結果:?

??

從本示例運行結果中可以看出,定義為final的常量不是恒定不變的,將隨機數賦予定義為final的常量,可以做到每次運行程序時改變a1的值。但是a2與a1不同,由于它被聲明為static final形式,所以在內存中為a2開辟了一個恒定不變的區域,當再次實例化一個FinalStaticData對象時,仍然指向a2這塊內存區域,所以a2的值保存不變。a2是在裝載時被初始化,而不是每次創建新對象時被初始化;而a1會重新實例化對象時被更改。?

最后總結一下在程序中final數據可以出現的位置,如下程序。?

/**

?* 總結一下在程序中final數據可以出現的位置

?*?

?* @author pan_junbiao

?*

?*/

public class FinalDataTest

{

? ? // final成員變量不可更改

? ? final int VALUE_ONE = 6;

?

? ? // 在聲明final成員變量時沒有賦值,稱為空白final

? ? final int BLANK_FINALVAULE;

?

? ? // 在構造方法中為空白final賦值

? ? public FinalDataTest()

? ? {

? ? ? ? BLANK_FINALVAULE = 8;

? ? }

?

? ? // 設置final參數,不可以改變參數x的值

? ? int doIt(final int x)

? ? {

? ? ? ? return x + 1;

? ? }

?

? ? // 局部變量定義為final,不可以改變i的值

? ? void doSomething()

? ? {

? ? ? ? final int i = 7;

? ? }

}?

??

2、final方法?

首先,我們應該了解定義為final的方法不能被重寫。?

將方法定義為final類型可以防止任何子類修改該類的定義與實現方式,同時定義為final的方法執行效率要高于非final方法。在修飾權限中曾經提到過private修飾符,如果一個父類的某個方法被設置為private修飾符,子類將無法訪問該方法,自然無法覆蓋該方法,所以一個定義為private的方法隱式被指定為final類型,這樣無須將一個定義為private的方法再定義為final類型。?

語法:?

private final void test()

{

}?

??

3、final類?

定義為final的類不能被繼承。?

如果希望一個類不允許任何類繼承,并且不允許其他人對這個類有任何改動,可以將這個類設置為final形式。?

final類的語法如下:?

final 類名{}?

如果將某個類設置為final形式,則類中的所有方法都被隱式設置為final形式,但是final類中的成員變量可以被定義為final或非final形式。?

示例:在項目中創建FinalClass類,在類中定義doit()方法和變量a,實現在主方法中操作變量a自增。?

/**

?* 定義final類

?*?

?* @author pan_junbiao

?*

?*/

final class FinalClass

{

? ? int a = 3;

?

? ? void doit()

? ? {

? ? }

?

? ? public static void main(String args[])

? ? {

? ? ? ? FinalClass f = new FinalClass();

? ? ? ? f.a++;

? ? ? ? System.out.println(f.a); // 結果:4

? ? }

}?

??

4、總結?

下面總結了一些使用final關鍵字的好處:?

(1)final關鍵字提高了性能。JVM和Java應用都會緩存final變量。?

(2)final變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。?

(3)使用final關鍵字,JVM會對方法、變量及類進行優化。?

不可變類:?

創建不可變類要使用final關鍵字。不可變類是指它的對象一旦被創建了就不能被更改了。String是不可變類的代表。不可變類有很多好處,譬如它們的對象是只讀的,可以在多線程環境下安全的共享,不用額外的同步開銷等等。?

關于final的重要知識點:?

(1)final關鍵字可以用于成員變量、本地變量、方法以及類。?

(2)final成員變量必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。?

(3) 你不能夠對final變量再次賦值。?

(4)本地變量必須在聲明時賦值。?

(5)在匿名類中所有變量都必須是final變量。?

(6)final方法不能被重寫。?

(7)final類不能被繼承。?

(8)final關鍵字不同于finally關鍵字,后者用于異常處理。?

(9)final關鍵字容易與finalize()方法搞混,后者是在Object類中定義的方法,是在垃圾回收之前被JVM調用的方法。?

(10)接口中聲明的所有變量本身是final的。?

(11)final和abstract這兩個關鍵字是反相關的,final類就不可能是abstract的。?

(12)final方法在編譯階段綁定,稱為靜態綁定(static binding)。?

(13)沒有在聲明時初始化final變量的稱為空白final變量(blank final variable),它們必須在構造器中初始化,或者調用this()初始化。不這么做的話,編譯器會報錯“final變量(變量名)需要進行初始化”。?

(14)將類、方法、變量聲明為final能夠提高性能,這樣JVM就有機會進行估計,然后優化。?

(15)按照Java代碼慣例,final變量就是常量,而且通常常量名要大寫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540179.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux基礎篇_01_計算機概論

學習資料&#xff1a;《鳥哥的Linux私房菜&#xff08;基礎篇&#xff09;》部分&#xff1a;Linux的規劃與安裝 時間&#xff1a;20130225 學習筆記&#xff1a;計算機定義&#xff1a;接受使用者輸入指令與數據&#xff0c; 經由中央處理器的數學與邏輯單元運算處理后&#x…

[轉載] java中的經典問題:傳值與傳引用

參考鏈接&#xff1a; 有關Java中數組分配的有趣事實 參數傳遞的秘密 知道方法參數如何傳遞嗎&#xff1f; 記得剛開始學編程那會兒&#xff0c;老師教導&#xff0c;所謂參數&#xff0c;有形式參數和實際參數之分&#xff0c;參數列表中寫的那些東西都叫形式參數&#x…

[3/21]Windows Server 2008時鐘方面的改進展示

在Windows Server 2008中的時鐘顯示和以往Windows Server 2003及以前的版本顯示有很大的差別。如果要顯示并進行簡單的時間修改可以在時鐘上雙擊&#xff0c;會出現如下圖所示的界面。在上圖中可以調整但無法進行真正的修改&#xff0c;徹底修改需要點擊&#xff02;更改日期和…

[轉載] 黑馬程序員_學習筆記8_C#基礎歸納之數組

參考鏈接&#xff1a; Java中的鋸齒數組Jagged array ---------------------- Windows Phone 7手機開發、.Net培訓、期待與您交流&#xff01; ---------------------- 什么是數組&#xff1f; 數組是一組數據結構&#xff0c;它可以包含同一類型的多個元素。C#用特殊記號還…

2Python全棧之路系列之MysQl基本數據類型

Python全棧之路系列之MySQL基本數據類型 MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。 MySQL支持多種類型&#xff0c;大致可以分為三類&#xff1a; 數字類型 日期和時間類型 字符串類型 數字類型 類型大小用途BIT-二進制TINYINT1字節小整數值INT or INTEGER4字…

[轉載] JAVA筆記_(Day04,Day05)函數數組

參考鏈接&#xff1a; 了解Java中的數組IndexOutofbounds異常 文章目錄 函數定義練習誤區重載&#xff08;overload&#xff09;重載選擇題練習函數的內存調用問題 數組定義數組的內存圖解數組的常見問題應用求和最大值將數組轉成字符串查表法轉十六進制查表版&#xff08;十六…

VDI序曲二 RemotoAPP部署

首先&#xff0c;我們需要準備如下角色&#xff1a;沿用VDI序曲一的2臺物理服務器以及角色我們在物理服務器1的hyper-v上&#xff0c;我們利用之前我介紹的“服務器虛擬化之準備母盤VHD”的方法再創建如下虛擬機&#xff1a;WIN-RDAPP&#xff1b;WIN-RDWA&#xff1b;WIN-RDCB…

[轉載] Java ArrayList toArray(T[] a) 解惑

參考鏈接&#xff1a; Java中的Array vs ArrayList 先看一個小的代碼片段 ArrayList<Integer> arrayList new ArrayList<>(); Collections.addAll(arrayList, 11, 21, 31, 41, 51); Integer[] a new Integer[0]; Integer[] b new Integer[arrayList.size()]; …

CentOS7使用firewalld打開關閉防火墻與端口(轉載)

1、firewalld的基本使用 啟動&#xff1a; systemctl start firewalld 查看狀態&#xff1a; systemctl status firewalld 停止&#xff1a; systemctl disable firewalld 禁用&#xff1a; systemctl stop firewalld 2.systemctl是CentOS7的服務管理工具中主要的工具&#xff…

多任務管理類 MutilTaskManager

計算和計算所需的數據能被較為平均的非配到若干task的時候&#xff0c;下面的任務管理類可以提供在大數據大計算量的情況下非精確的控制task的執行數量來限制計算量和內存占用量.下面是代碼&#xff08;非線程安全版本&#xff09;&#xff1a; public class MutilTaskManager{…

[轉載] Scanner和bufferreader讀取控制臺字符的區別

參考鏈接&#xff1a; Java中Scanner和BufferReader類之間的區別 從開始學習Java就用了scanner&#xff0c;因為比較簡單每當遇到空格鍵或者換行鍵則讀取下一個字符&#xff0c;一般用法 while(input.hasNextInt()){ int n input.nextInt(); int t input.nextInt(); int c …

Node.js meitulu圖片批量下載爬蟲1.051

原有1.05版程序沒有斷點續傳模式&#xff0c;現在在最近程序基礎上改寫一版1.051. // // meitulu圖片批量下載爬蟲1.051 // 用最近的斷點續傳框架改寫原有1.05版程序 // 2017年11月21日 //// 內置https模塊 var httpsrequire("https");// 內置http模塊 var httprequi…

[轉載] Java實現歸并排序(超詳細,新手請進)

參考鏈接&#xff1a; Java中將數組合并為的新數組 歸并排序 大家好&#xff0c;這是我第一次在CSDN上寫東西&#xff0c;因為我一直覺得有需要就去找別人的blog看看就好&#xff0c;但我發現自己寫出來的東西確實能加深記憶。我半路出家&#xff0c;屬實是個菜鳥&#xff0…

centos6設置靜態IP

#編輯配置文件,添加修改以下內容 vim /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTOstatic #啟用靜態IP地址 ONBOOTyes #開啟開機自動啟用網絡連接 IPADDR192.168.21.129 #設置IP地址 NETMASK255.255.255.0 #設置子網掩碼 GATEWAY192.168…

[轉載] 1022 D進制的A+B (20分)【java題解】【80ms】

參考鏈接&#xff1a; Java流Stream 題解 使用 toUnsignedString&#xff08;&#xff09;即可 我有仔細讀過toUnsignedString&#xff08;&#xff09;&#xff0c;有興趣可以看看 第3章 java的基本程序設計結構【補缺學習】【注釋與數據類型】【核心技術卷I】 impor…

mysql 5.6.4以上版本innodb支持全文索引的測試

對于mysql 5.6.4以上版本innodb支持全文索引的測試 在mysql官網&#xff0c;innodb引擎在5.6.4版本提供了對全文索引的支持&#xff0c;筆者對此做了測試&#xff0c;發現對中文全文檢索的支持依然不理想&#xff0c;但卻確實提供了對英文的全文支持。 12.9.5 Full-Text Restri…

[轉載] Java字符串分割方法

參考鏈接&#xff1a; Java中的StringTokenizer方法的示例 2 [sizemedium]1.用split()方法進行分割&#xff0c;分割開的子字符串放入數組&#xff0c;然后進行處理。 示例代碼如下&#xff1a; public class SplitTest { /** * param args * author colin */ …

[轉載] Java StringBuilder StringJoiner

參考鏈接&#xff1a; 何時在StringBuilder上使用StringJoiner 1. StringBuilder Java編譯器對String做了特殊處理&#xff0c;使得我們可以直接用拼接字符串。 雖然可以直接拼接字符串&#xff0c;但是&#xff0c;在循環中&#xff0c;每次循環都會創建新的字符串對象&a…

EMC VMAX的磁盤構成,fast policy(重要)

首先是流程&#xff0c; 不同種類的磁盤&#xff08;sata&#xff0c;fc&#xff0c;flah&#xff09;->disk group->raid->DATA volume->thin pool->TDEV and BCVDEV (lun) 然后細看&#xff1a; 1&#xff09; 不同種類的磁盤叫做disk&#xff0c;這是可見的物…