天天看點

Java關鍵字(四)——final

  對于Java中的 final 關鍵字,我們首先可以從字面意思上去了解,百度翻譯顯示如下:

  

Java關鍵字(四)——final
  也就是說 final 英文意思表示是最後的,不可更改的。那麼對應在 Java 中也是表達這樣的意思,可以用 final 關鍵字修飾變量、方法和類。不管是用來修飾什麼,其本意都是指 “它是無法更改的”,這是我們需要牢記的,為什麼要無法更改?無非就是設計所需或者能提高效率,與前面介紹 static 關鍵字需要記住其與對象無關的理念一樣,牢記 final 的不可變的設計理念後再來了解 final 關鍵字的用法,便會順其自然了。

1、修飾變量

  稍微有點Java基礎的都知道用final關鍵字修飾的變量稱為常量,常量的意思是不可更改。變量為基本資料類型,不可更改很容易了解,那麼對于引用類型呢?不可能改的是其引用位址,還是對象的内容?

  我們首先構造一個實體類:Person

Java關鍵字(四)——final
Java關鍵字(四)——final
1 package com.ys.bean;
 2 
 3 /**
 4  * Create by YSOcean
 5  */
 6 public class Person {
 7     private  String name;
 8 
 9     public Person(String name) {
10         this.name = name;
11     }
12 
13     public String getName() {
14         return name;
15     }
16 
17     public void setName(String name) {
18         this.name = name;
19     }
20 }      

View Code

  接着根據建立一個 Person 對象:

Java關鍵字(四)——final

  可以看到,首先通過 final 關鍵字修飾一個對象 p,然後接着将 p 對象指向另一個新的對象,發現報錯,也就是說final修飾的引用類型是不能改變其引用位址的。

  接着我們改動 p 對象的 name 屬性:

Java關鍵字(四)——final

  發現程式沒有報錯。

  結論:被 final 修飾的變量不可更改其引用位址,但是可以更改其内部屬性。

2、修飾方法

  final 關鍵字修飾的方法不可被覆寫。

  在《Java程式設計思想》第 4 版 7.8.2 章節 final 方法p176 頁這樣描述:使用 final 方法原因有兩個:

  ①、第一個原因是把方法鎖定,以防止任何繼承類修改它的含義,這是出于設計的考慮:想要確定在繼承中使方法的行為保持不變,并且不會被覆寫。

  ②、第二個原因是效率,在 Java 的早期實作中,如果将一個方法聲明為 final,就是同意編譯器将針對該方法的所有調用都轉為内嵌調用,内嵌調用能夠提高方法調用效率,但是如果方法很大,内嵌調用不會提高性能。而在目前的Java版本中(JDK1.5以後),虛拟機可以自動進行優化了,而不需要使用 final 方法。

  是以final 關鍵字隻有明确禁止覆寫方法時,才使用其修飾方法。

  PS:《Java程式設計思想》中指出類中所有的 private 方法都隐式指定為 final 的,是以對于 private 方法,我們顯式的聲明 final 并沒有什麼效果。但是我們建立一個父類,并在父類中聲明一個 private 方法,其子類中是能夠重寫其父類的private 方法的,這是為什麼呢?

  父類:Parent.class

package com.ys.bean;
/**
 * Create by YSOcean
 */
public class Parent {
    private void say(){
        System.out.println("parent");
    }
}      

  子類:Son.class

package com.ys.bean;
/**
 * Create by YSOcean
 */
public class Son extends Parent {

    private void say(){
        System.out.println("son");
    }

}      

  其實仔細看看,這種寫法是方法的覆寫嗎?我們通過多态的形式并不能調用到父類的 say() 方法:

Java關鍵字(四)——final

  并且,如果我們在子類的 say() 方法中,添加 @Override 注解也是會報錯的。

Java關鍵字(四)——final

  是以這種形式并不算方法的覆寫。

3、修飾類

  final 修飾類表示該類不可被繼承。

  也就是說不希望某個類有子類的時候,用final 關鍵字來修飾。并且由于是用 final 修飾的類,其類中所有的方法也被隐式的指為 final 方法。

  在 JDK 中有個最明顯的類 String ,就是用 final 修飾的,将 String 類用 final 修飾很重要的一個原因是常量池。關于 String 類的描述,可以

參考我的這篇部落格

Java關鍵字(四)——final

作者:

YSOcean

出處:

http://www.cnblogs.com/ysocean/

本文版權歸作者所有,歡迎轉載,但未經作者同意不能轉載,否則保留追究法律責任的權利。

繼續閱讀