日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java中的final变量、final方法和final类

發(fā)布時(shí)間:2023/12/14 java 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的final变量、final方法和final类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、final變量

final關(guān)鍵字可用于變量聲明,一旦該變量被設(shè)定,就不可以再改變?cè)撟兞康闹怠Mǔ?#xff0c;由final定義的變量為常量。例如,在類(lèi)中定義PI值,可以使用如下語(yǔ)句:

final double PI=3.14;

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

public static final double PI_VAULE = 3.14;

規(guī)范:被定義為final的常量定義時(shí)需要使用大寫(xiě)字母命名,并且中間使用下劃線(xiàn)進(jìn)行連接。

常量示例:

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; // 聲明一個(gè)final常量private static final int VALUE_2 = 10; // 聲明一個(gè)final、static常量private final Test test = new Test(); // 聲明一個(gè)final引用private Test test2 = new Test(); // 聲明一個(gè)不是final的引用private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 聲明一個(gè)定義為final的數(shù)組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();// 報(bào)錯(cuò):不能改變定義為final的常量值// data.VALUE_1 = 8;// 報(bào)錯(cuò):不能改變定義為final的常量值// data.VALUE_2 = 9;// 報(bào)錯(cuò):不能將定義為final的引用指向其他引用// data.test = new Test();// 正確: 可以對(duì)指定為final的引用中的成員變量賦值data.test.i = 1;// 正確: 可以將沒(méi)有定義為final的引用指向其他引用data.test2 = new Test();// 報(bào)錯(cuò):不能對(duì)定義為final的數(shù)組賦值// int b[] = { 7, 8, 9 };// data.a = b;// 但是final的數(shù)組中的每一項(xiàng)內(nèi)容是可以改變的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());} }

執(zhí)行結(jié)果:

?

從上述執(zhí)行結(jié)果中可以發(fā)現(xiàn)i5的值是相同的。

全局常量:

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

示例:在項(xiàng)目中創(chuàng)建FinalStaticData類(lèi),在該類(lèi)中創(chuàng)建Random類(lèi)的對(duì)象,在主方法中分別輸出類(lèi)中定義的final變量a1與a2。

import static java.lang.System.out;import java.util.Random;/*** FinalStaticData類(lèi)* * @author pan_junbiao**/ public class FinalStaticData {private static Random rand = new Random(); // 實(shí)例化一個(gè)Random類(lèi)對(duì)象// 隨機(jī)產(chǎn)生0~10之間的隨機(jī)數(shù)賦予定義為final的a1private final int a1 = rand.nextInt(10);// 隨機(jī)產(chǎn)生0~10之間的隨機(jī)數(shù)賦予定義為static final的a2private static final int a2 = rand.nextInt(10);public static void main(String[] args){FinalStaticData fdata = new FinalStaticData(); // 實(shí)例化一個(gè)對(duì)象// 調(diào)用定義為final的a1out.println("重新實(shí)例化對(duì)象調(diào)用a1的值:" + fdata.a1);// 調(diào)用定義為static final的a2out.println("重新實(shí)例化對(duì)象調(diào)用a2的值:" + fdata.a2);// 實(shí)例化另外一個(gè)對(duì)象FinalStaticData fdata2 = new FinalStaticData();out.println("重新實(shí)例化對(duì)象調(diào)用a1的值:" + fdata2.a1);out.println("重新實(shí)例化對(duì)象調(diào)用a2的值:" + fdata2.a2);} }

運(yùn)行結(jié)果:

?

從本示例運(yùn)行結(jié)果中可以看出,定義為final的常量不是恒定不變的,將隨機(jī)數(shù)賦予定義為final的常量,可以做到每次運(yùn)行程序時(shí)改變a1的值。但是a2與a1不同,由于它被聲明為static final形式,所以在內(nèi)存中為a2開(kāi)辟了一個(gè)恒定不變的區(qū)域,當(dāng)再次實(shí)例化一個(gè)FinalStaticData對(duì)象時(shí),仍然指向a2這塊內(nèi)存區(qū)域,所以a2的值保存不變。a2是在裝載時(shí)被初始化,而不是每次創(chuàng)建新對(duì)象時(shí)被初始化;而a1會(huì)重新實(shí)例化對(duì)象時(shí)被更改。

最后總結(jié)一下在程序中final數(shù)據(jù)可以出現(xiàn)的位置,如下程序。

/*** 總結(jié)一下在程序中final數(shù)據(jù)可以出現(xiàn)的位置* * @author pan_junbiao**/ public class FinalDataTest {// final成員變量不可更改final int VALUE_ONE = 6;// 在聲明final成員變量時(shí)沒(méi)有賦值,稱(chēng)為空白finalfinal int BLANK_FINALVAULE;// 在構(gòu)造方法中為空白final賦值public FinalDataTest(){BLANK_FINALVAULE = 8;}// 設(shè)置final參數(shù),不可以改變參數(shù)x的值int doIt(final int x){return x + 1;}// 局部變量定義為final,不可以改變i的值void doSomething(){final int i = 7;} }

?

2、final方法

首先,我們應(yīng)該了解定義為final的方法不能被重寫(xiě)

將方法定義為final類(lèi)型可以防止任何子類(lèi)修改該類(lèi)的定義與實(shí)現(xiàn)方式,同時(shí)定義為final的方法執(zhí)行效率要高于非final方法。在修飾權(quán)限中曾經(jīng)提到過(guò)private修飾符,如果一個(gè)父類(lèi)的某個(gè)方法被設(shè)置為private修飾符,子類(lèi)將無(wú)法訪(fǎng)問(wèn)該方法,自然無(wú)法覆蓋該方法,所以一個(gè)定義為private的方法隱式被指定為final類(lèi)型,這樣無(wú)須將一個(gè)定義為private的方法再定義為final類(lèi)型。

語(yǔ)法:

private final void test() { }

?

3、final類(lèi)

定義為final的類(lèi)不能被繼承。

如果希望一個(gè)類(lèi)不允許任何類(lèi)繼承,并且不允許其他人對(duì)這個(gè)類(lèi)有任何改動(dòng),可以將這個(gè)類(lèi)設(shè)置為final形式。

final類(lèi)的語(yǔ)法如下:

final 類(lèi)名{}

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

示例:在項(xiàng)目中創(chuàng)建FinalClass類(lèi),在類(lèi)中定義doit()方法和變量a,實(shí)現(xiàn)在主方法中操作變量a自增。

/*** 定義final類(lèi)* * @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); // 結(jié)果:4} }

?

4、總結(jié)

下面總結(jié)了一些使用final關(guān)鍵字的好處:

(1)final關(guān)鍵字提高了性能。JVM和Java應(yīng)用都會(huì)緩存final變量。

(2)final變量可以安全的在多線(xiàn)程環(huán)境下進(jìn)行共享,而不需要額外的同步開(kāi)銷(xiāo)。

(3)使用final關(guān)鍵字,JVM會(huì)對(duì)方法、變量及類(lèi)進(jìn)行優(yōu)化。

不可變類(lèi):

創(chuàng)建不可變類(lèi)要使用final關(guān)鍵字。不可變類(lèi)是指它的對(duì)象一旦被創(chuàng)建了就不能被更改了。String是不可變類(lèi)的代表。不可變類(lèi)有很多好處,譬如它們的對(duì)象是只讀的,可以在多線(xiàn)程環(huán)境下安全的共享,不用額外的同步開(kāi)銷(xiāo)等等。

關(guān)于final的重要知識(shí)點(diǎn):

(1)final關(guān)鍵字可以用于成員變量、本地變量、方法以及類(lèi)。

(2)final成員變量必須在聲明的時(shí)候初始化或者在構(gòu)造器中初始化,否則就會(huì)報(bào)編譯錯(cuò)誤。

(3) 你不能夠?qū)inal變量再次賦值。

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

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

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

(7)final類(lèi)不能被繼承。

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

(9)final關(guān)鍵字容易與finalize()方法搞混,后者是在Object類(lèi)中定義的方法,是在垃圾回收之前被JVM調(diào)用的方法。

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

(11)final和abstract這兩個(gè)關(guān)鍵字是反相關(guān)的,final類(lèi)就不可能是abstract的。

(12)final方法在編譯階段綁定,稱(chēng)為靜態(tài)綁定(static binding)。

(13)沒(méi)有在聲明時(shí)初始化final變量的稱(chēng)為空白final變量(blank final variable),它們必須在構(gòu)造器中初始化,或者調(diào)用this()初始化。不這么做的話(huà),編譯器會(huì)報(bào)錯(cuò)“final變量(變量名)需要進(jìn)行初始化”。

(14)將類(lèi)、方法、變量聲明為final能夠提高性能,這樣JVM就有機(jī)會(huì)進(jìn)行估計(jì),然后優(yōu)化。

(15)按照J(rèn)ava代碼慣例,final變量就是常量,而且通常常量名要大寫(xiě)。
?

總結(jié)

以上是生活随笔為你收集整理的Java中的final变量、final方法和final类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。