亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java中final關鍵字詳解及實例

2024-07-14 08:43:53
字體:
來源:轉載
供稿:網友

 final在Java中可以聲明成員變量、方法、類以及本地變量。一旦你將引用聲明作final,你將不能改變這個引用了,如果你試圖將變量再次初始化的話,編譯器會報編譯錯誤。
 final的含義在不同的場景下有細微的差別,但總體來說,它指的是“不可變”。

1. final變量

凡是對成員變量或者本地變量(在方法中的或者代碼塊中的變量稱為本地變量)聲明為final的都叫作final變量。final變量經常和static關鍵字一起使用,作為常量。用final關鍵字修飾的變量,只能進行一次賦值操作,并且在生存期內不可以改變它的值。
不過在針對基本類型和引用類型時,final關鍵字的效果存在細微差別。例如:

class Value {  int v;  public Value(int v) {    this.v = v;  }}public class FinalTest {  final int f1 = 1;  final int f2;  public FinalTest() {    f2 = 2;  }  public static void main(String[] args) {    final int value1 = 1;    // value1 = 4;    final double value2;    value2 = 2.0;    final Value value3 = new Value(1);    value3.v = 4;  }}

上面的例子中,main方法中被final修飾的數據,在給value1賦初始值之后,我們無法再對value1的值進行修改,final關鍵字起到了常量的作用。從value2我們可以看到,final修飾的變量可以不在聲明時賦值,即可以先聲明,后賦值。value3時一個引用變量,這里我們可以看到final修飾引用變量時,只是限定了引用變量的引用不可改變,即不能將value3再次引用另一個Value對象,但是引用的對象的值是可以改變的。
另一方面,我們看到了用final修飾成員變量時的細微差別,因為final修飾的數據的值是不可改變的,所以我們必須確保在使用前就已經對成員變量賦值了。因此對于final修飾的成員變量,我們有且只有兩個地方可以給它賦值,一個是聲明該成員時賦值,另一個是在構造方法中賦值,在這兩個地方我們必須給它們賦初始值。
最后我們需要注意的一點是,同時使用static和final修飾的成員在內存中只占據一段不能改變的存儲空間。

2. final方法參數

前面我們可以看到,如果變量是我們自己創建的,那么使用final修飾表示我們只會給它賦值一次且不會改變變量的值。那么如果變量是作為參數傳入的,我們怎么保證它的值不會改變呢?這就用到了final的第二種用法,即在我們編寫方法時,可以在參數前面添加final關鍵字,它表示在整個方法中,我們不會(實際上是不能)改變參數的值:

public class FinalTest {  /* ... */  public void finalFunc(final int i, final Value value) {    // i = 5; 不能改變i的值    // v = new Value(); 不能改變v的值    value.v = 5; // 可以改變引用對象的值  }}

3. final方法

 final也可以聲明方法。方法前面加上final關鍵字,代表這個方法不可以被子類的方法重寫。如果你認為一個方法的功能已經足夠完整了,子類中不需要改變的話,你可以聲明此方法為final。final方法比非final方法要快,因為在編譯的時候已經靜態綁定了,不需要在運行時再動態綁定。關于private和final關鍵字還有一點聯系,這就是類中所有的private方法都隱式地指定為是final的,由于無法在類外使用private方法,所以也就無法覆蓋它。下面是final方法的例子:

class PersonalLoan{  public final String getName(){    return "personal loan";  }}class CheapPersonalLoan extends PersonalLoan{  @Override  public final String getName(){    return "cheap personal loan"; //compilation error: overridden method is final  }}

4. final類

 使用final來修飾的類叫作final類。final類通常功能是完整的,它們不能被繼承。Java中有許多類是final的,譬如String, Interger以及其他包裝類。下面是final類的實例:

 final class PersonalLoan{  }  class CheapPersonalLoan extends PersonalLoan{ //compilation error: cannot inherit from final class

5. final關鍵字的好處

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

  1. final關鍵字提高了性能。JVM和Java應用都會緩存final變量。
  2. final變量可以安全的在多線程環境下進行共享,而不需要額外的同步開銷。
  3. 使用final關鍵字,JVM會對方法、變量及類進行優化。

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

6. 幾個易混點

(1)類的final變量和普通變量有什么區別?

當用final作用于類的成員變量時,成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變量一旦被初始化賦值之后,就不能再被賦值了。
那么final變量和普通變量到底有何區別呢?下面請看一個例子:

public class Test {  public static void main(String[] args) {    String a = "hello2";     final String b = "hello";    String d = "hello";    String c = b + 2;     String e = d + 2;    System.out.println((a == c));    System.out.println((a == e));  }}

輸出結果:

true
false

 大家可以先想一下這道題的輸出結果。為什么第一個比較結果為true,而第二個比較結果為fasle。這里面就是final變量和普通變量的區別了,當final變量是基本數據類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當于直接訪問的這個常量,不需要在運行時確定。這種和C語言中的宏替換有點像。因此在上面的一段代碼中,由于變量b被final修飾,因此會被當做編譯器常量,所以在使用到b的地方會直接將變量b 替換為它的 值。而對于變量d的訪問卻需要在運行時通過鏈接來進行。想必其中的區別大家應該明白了,不過要注意,只有在編譯期間能確切知道final變量值的情況下,編譯器才會進行這樣的優化,比如下面的這段代碼就不會進行優化:

public class Test {  public static void main(String[] args) {    String a = "hello2";     final String b = getHello();    String c = b + 2;     System.out.println((a == c));  }  public static String getHello() {    return "hello";  }}

這段代碼的輸出結果為false。

(2) 被final修飾的引用變量指向的對象內容可變嗎?

 在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內容可變嗎?看下面這個例子:

public class Test {  public static void main(String[] args) {    final MyClass myClass = new MyClass();    System.out.println(++myClass.i);  }}class MyClass {  public int i = 0;}

這段代碼可以順利編譯通過并且有輸出結果,輸出結果為1。這說明引用變量被final修飾之后,雖然不能再指向其他對象,但是它指向的對象的內容是可變的。

(3) final和static

很多時候會容易把static和final關鍵字混淆,static作用于成員變量用來表示只保存一份副本,而final的作用是用來保證變量不可變。看下面這個例子:

public class Test {  public static void main(String[] args) {    MyClass myClass1 = new MyClass();    MyClass myClass2 = new MyClass();    System.out.println(myClass1.i);    System.out.println(myClass1.j);    System.out.println(myClass2.i);    System.out.println(myClass2.j);  }}class MyClass {  public final double i = Math.random();  public static double j = Math.random();}

 運行這段代碼就會發現,每次打印的兩個j值都是一樣的,而i的值卻是不同的。從這里就可以知道final和static變量的區別了。

7.總結

關于final的重要知識點有:

final關鍵字可以用于成員變量、本地變量、方法以及類。
final成員變量必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。
你不能夠對final變量再次賦值。
本地變量必須在聲明時賦值。
在匿名類中所有變量都必須是final變量。
final方法不能被重寫。
final類不能被繼承。
final關鍵字不同于finally關鍵字,后者用于異常處理。
final關鍵字容易與finalize()方法搞混,后者是在Object類中定義的方法,是在垃圾回收之前被JVM調用的方法。
接口中聲明的所有變量本身是final的。
final和abstract這兩個關鍵字是反相關的,final類就不可能是abstract的。
final方法在編譯階段綁定,稱為靜態綁定(static binding)。
沒有在聲明時初始化final變量的稱為空白final變量(blank final variable),它們必須在構造器中初始化,或者調用this()初始化。不這么做的話,編譯器會報錯“final變量(變量名)需要進行初始化”。
將類、方法、變量聲明為final能夠提高性能,這樣JVM就有機會進行估計,然后優化。
按照Java代碼慣例,final變量就是常量,而且通常常量名要大寫:

private final int COUNT = 10;

對于集合對象聲明為final指的是引用不能被更改,但是你可以向其中增加,刪除或者改變內容。譬如:

private final List Loans = new ArrayList();list.add(“home loan”); //validlist.add("personal loan"); //validloans = new Vector(); //not valid

以上所述是小編給大家介紹的Java中final關鍵字詳解及實例整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久久久久| 性夜试看影院91社区| 欧美成年人网站| 日韩精品免费一线在线观看| 久久综合88中文色鬼| 俺也去精品视频在线观看| 亚洲品质视频自拍网| 欧美成人免费观看| 国产精品高清在线观看| 精品国产网站地址| 日韩av电影手机在线| 欧美激情a在线| 色一区av在线| 亚洲日韩中文字幕| 精品中文字幕久久久久久| 欧美日韩国产一中文字不卡| 欧美日韩国产精品一区| 久久久噜噜噜久久中文字免| 日韩大片免费观看视频播放| 亚洲一区二区三区视频播放| 午夜精品福利电影| 色偷偷91综合久久噜噜| 中文字幕国产精品久久| 亚洲国产精品小视频| 91高潮在线观看| 欧美精品精品精品精品免费| 亚洲日本中文字幕| 欧美亚洲一级片| 欧美性xxxx极品高清hd直播| 欧美高清理论片| 亚洲精品久久久久久久久| 久久人91精品久久久久久不卡| 日韩精品免费在线观看| 亚洲最大的成人网| 亚洲影院在线看| 成人激情电影一区二区| 美女av一区二区| 91精品国产电影| 亚洲人成在线观看| 日韩av片永久免费网站| 在线视频免费一区二区| 久久人人97超碰精品888| 久久久精品视频在线观看| 国产成人jvid在线播放| 亚洲成人激情图| 成人欧美一区二区三区在线| www.国产一区| 亚洲精品ady| 国产人妖伪娘一区91| 日韩在线视频网站| 欧美午夜电影在线| 97香蕉久久超级碰碰高清版| 国内自拍欧美激情| 亚洲品质视频自拍网| 欧美成人免费在线观看| 亚洲国产欧美自拍| 亚洲人午夜精品| 国产一区二区三区日韩欧美| 亚洲国产精久久久久久久| 91视频国产高清| 久久国产精品首页| 精品动漫一区二区三区| 欧美激情图片区| 日韩高清欧美高清| 国产在线拍偷自揄拍精品| 国产精品第3页| 日韩av在线电影网| 国产视频亚洲精品| 国产精品久久二区| 欧美乱大交xxxxx| 日韩禁在线播放| 国产精品一区二区三区免费视频| 欧美精品少妇videofree| 久久亚洲精品国产亚洲老地址| 国产精品爱啪在线线免费观看| 在线亚洲午夜片av大片| 亚洲a级在线播放观看| 久久久999精品免费| 欧美在线亚洲一区| 久久久女人电视剧免费播放下载| 久久天天躁狠狠躁夜夜躁| 国产精品成人一区| 欧美情侣性视频| 色综合老司机第九色激情| 精品中文字幕在线| 国内精品国产三级国产在线专| 欧美xxxx综合视频| 国产精品久久久av| 欧美电影在线观看网站| 国产精品伦子伦免费视频| 992tv成人免费影院| www.亚洲成人| 日韩最新av在线| 欧美精品电影在线| 97av在线视频免费播放| 亚洲精品国精品久久99热一| 久久亚洲成人精品| 成人免费午夜电影| 91香蕉亚洲精品| 久久久久久久香蕉网| 一本一道久久a久久精品逆3p| 久久露脸国产精品| 曰本色欧美视频在线| 久久婷婷国产麻豆91天堂| 热re99久久精品国产66热| 国产在线播放不卡| 欧美另类69精品久久久久9999| 欧美区在线播放| 久久久久久久久国产| 欧美日韩国产精品专区| 欧美午夜久久久| 精品一区二区三区三区| 日韩在线观看免费高清完整版| 国产精品日韩在线一区| 欧美韩日一区二区| 日韩免费电影在线观看| 2025国产精品视频| 日韩精品视频在线免费观看| 国产精品欧美在线| 欧美裸身视频免费观看| 国产一区二区欧美日韩| 91精品国产高清久久久久久91| 欧美人与物videos| 欧美精品在线看| 亚洲色图综合久久| 亚洲激情第一页| 国内精品久久久久久久久| 亚洲欧美精品suv| 国内精品久久久久久中文字幕| 久久久久久亚洲精品| 亚洲精品国产欧美| 欧美精品久久久久| 日韩国产高清视频在线| 亚洲自拍偷拍色片视频| 午夜精品久久久久久99热| 精品久久久香蕉免费精品视频| 九九热这里只有在线精品视| 久久精品视频在线播放| 国产剧情日韩欧美| 亚洲欧美日韩久久久久久| 国产精品扒开腿做爽爽爽的视频| 97久久精品国产| 91精品久久久久久久久不口人| 免费91麻豆精品国产自产在线观看| 日韩av电影国产| 国产mv久久久| 久久精品中文字幕一区| 久久久久日韩精品久久久男男| 亚洲第一免费播放区| 久久免费精品视频| 欧美激情一级精品国产| 国产精品av在线| 久久久久国色av免费观看性色| 亚洲大胆人体av| 日韩成人在线免费观看| 亚洲影院色无极综合| 91精品国产91久久久久久| 欧美激情中文字幕在线| 26uuu另类亚洲欧美日本老年| 国产亚洲欧美aaaa| 久久精品99久久香蕉国产色戒| 日韩欧美在线视频| 国语自产偷拍精品视频偷| 欧美一区二区影院|