1. 程式人生 > 實用技巧 >Java 關鍵字:final

Java 關鍵字:final

一、final 關鍵字

  1、概述

    子類繼承父類後,可以改寫父類內容,如方法重寫。但是我們卻不能隨意的去繼承 API 中提供的類,然後改寫其內容。

    這是因為 Java 提供了final關鍵字,用於修飾不可改變內容。

  2、作用範圍

    在Java中宣告類、 變數方法時, 可使用關鍵字final來修飾,表示“最終的” 。

    (1)final 標記的類不能被繼承。

      被 final 修飾的類,不能被繼承。提高安全性, 提高程式的可讀性。

      可以用來修飾 外部類 和 內部類

    (2)final 標記的方法不能被子類重寫。

       final 可以用來修飾靜態方法 和 非靜態方法,不能被重寫,可以被繼承。

    (3)final 標記的變數(成員變數或區域性變數)即稱為常量。

      final 可以用來修飾變數(成員變數(類變數、例項變數)、區域性變數)

二、修飾類

  1、使用方式

    定義格式:

final class 類名 {
   //  方法體
}

    像 Java 中的 String,Math,System,Scanner 這些類都是宣告為 final 類,目的就是供使用,而不讓隨意改變其內容。

  2、注意點

    final 修飾的類一定不能被繼承。

三、修飾方法

  1、使用方式

    定義格式:

其他修飾符 final 返回值型別 方法名(引數列表){
    //方法體
}

  2、注意點

    (1)如果重寫 final 修飾的方法,編譯會報錯;

    (2)對於類、方法來說,abstract關鍵字和final關鍵字不能同時使用,因為矛盾。

四、修飾變數

  1、修飾成員變數

    final修飾屬性:可以考慮賦值的位置有:顯式初始化、程式碼塊中初始化、構造器中初始化

    ① 顯示初始化

1 public class User {
2     final String USERNAME = "張三";
3     private int age;
4 }

    ② 程式碼塊中初始化

1 public class User {
2     final
String USERNAME; 3 { 4 USERNAME = "張三"; 5 } 6 private int age; 7 }

    ③ 構造器中初始化

1 public class User {
2     final String USERNAME ;
3     private int age;
4     public User(String username, int age) {
5         this.USERNAME = username;
6         this.age = age;
7     }
8 }

   注意:

    (1)對於final的成員變數,要麼使用直接賦值,要麼通過程式碼塊或者構造方法賦值。三者選其一。

    (2)必須保證類當中所有過載的構造方法,都最終會對 final 的成員變數進行賦值。

    (3)static final 用來修飾屬性:全域性常量

  2、修飾區域性變數

    (1)修飾區域性變數——基本資料型別

        基本型別的區域性變數,被 final 修飾後,只能賦值一次,不能再更改。

        Demo:

 1 public class FinalDemo1 {
 2     public static void main(String[] args) {
 3         // 宣告變數,使用final修飾
 4         final int a;
 5         // 第一次賦值
 6         a = 10;
 7         // 第二次賦值
 8         a = 20; // 報錯,不可重新賦值
 9         // 宣告變數,直接賦值,使用final修飾
10         final int b = 10;
11         // 第二次賦值
12         b = 20; // 報錯,不可重新賦值
13     }
14 }

    (2)修飾區域性變數——引用型別

      引用型別的區域性變數,被 final 修飾後,只能指向一個物件,地址不能再更改。但是不影響物件內部的成員變數值的修改

      Demo:

 1 public class FinalDemo2 {
 2     public static void main(String[] args) {
 3         // 建立 User 物件
 4         final User u = new User();
 5         // 建立 另一個 User物件
 6         u = new User(); // 報錯,指向了新的物件,地址值改變。
 7         // 呼叫setName方法
 8         u.setName("張三"); // 可以修改
 9      }
10 }

      注意:尤其是使用final修飾形參時,表明此形參是一個常量。當我們呼叫此方法時,給常量形參賦一個實參。一旦賦值以後,就只能在方法體內使用此形參,但不能進行重新賦值。

    Demo:

 1 public class Something {
 2     public static void main(String[] args) {
 3         Other o = new Other();
 4         new Something().addOne(o);
 5     }
 6     public void addOne(final Other o) {
 7         // o = new Other();   錯誤的 形參只能指向原來的物件,不能指向新的物件
 8         o.i++;
 9     }
10 }
11 class Other {
12     public int i;
13 }

  3、注意

   (1)被 final 修飾的常量名稱,一般都有書寫規範,所有字母都大寫。

   (2)final 用來修飾變數:此時的"變數"就稱為是一個常量。

    

五、