歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java關鍵字final使用詳解

根據程序上下文環境,Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而需要阻止改變:設計或效率。

  • final類不能被繼承,沒有子類,final類中的方法默認是final的。
  • final方法不能被子類的方法覆蓋,但可以被繼承。
  • final成員變量表示常量,只能被賦值一次,賦值後值不再改變。
  • final不能用於修飾構造方法。

注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。

1、final數據:

  • 一個永不改變的編譯時常量。
  • 一個在運行時被初始化的值,而之後無法被改變;
  • 一個既是static又是final的域:是一段不能改變的存儲空間;

final類型運用於數據:

  • 基本數據類型(int、double、char...)運用final時,使數值恆定不變;
  • 對象引用運用final時,final使得引用恆定不變,引用內部的數據若不是final型,可以進行修改。
  • 數組類型運用final時,final使得數組引用恆定不變,數組內部的數據若不是final型,可以進行修改。

final與static

  • final指明數據為一個常量,恆定無法修改;
  • static指明數據只占用一份存儲區域;

測試案例:

public class FinalData {
 private final int valueOne = 3;
 private int valueTwo = 4;
 private final Value v1 = new Value(4);
 private Value v2 = new Value(10);
 private final int[] a = {1,2,3,4,5,6,7,8,9};
 private int[] b = {1,2,3,4,5,6,7,8,9};
 private static final int VAL_TWO = 3;
 
 public static void main(String[] args) {
  FinalData finalData = new FinalData();
  /*-----------基本類型測試------------------------------------*/
//  finalData.valueOne = 4;//valueOne是常量,無法修改
  finalData.valueTwo = 14;//valueTwo不是常量,可以修改
 
  /*-----------對象類型測試------------------------------------*/
//  finalData.v1 = new Value(5);//v1對象是final型常量,其引用是無法修改的。
  finalData.v2 = new Value(20);//v2對象final型常量,其引用可以修改。
  finalData.v1.i = 5;//v1對象的成員變量不是final型,可以修改
 
  /*-----------數組類型測試------------------------------------*/
//  finalData.a = new int[3];//數組a是final型,無法修改a的引用
  finalData.b = new int[13];//數組b不是final型,可以對其引用進行修改
  for(int i=0;i<finalData.a.length;i++)
   finalData.a[i]++;//數組a內部數據是int型,不是final型,可以修改
 
  /*-----------static final類型測試------------------------------------*/
//  finalData.VAL_TWO = 4;
  //定義為private,只能被本類的方法調用;定義為static,則強調只有一份,且只被執行一次;定義為final,則說明它是一個常量,無法被修改。
 
 }
}

2、final方法

如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。

  • 把方法鎖定,防止任何繼承類修改它的意義和實現。
  • 高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。

測試案例:

public class FinalDemo {

 public void f(){
  System.out.println("FianlDemo.f()");
 }
 public final void g(){
  System.out.println("FianlDemo.g()");
 }
}

繼承類

public class FinalOverriding extends FinalDemo{

 public void f(){
  System.out.println("FinalOverriding.f()");
 }
 
// public void g(){//無法覆蓋父類的final方法g()
//  System.out.println("FinalOverriding.g()");
// }
}

3、final類

final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴展,那麼就設計為final類。

Copyright © Linux教程網 All Rights Reserved