final關鍵字在java中比較重要,也比較基礎。塔通常指的是“這是無法改變的”,不想做改變可能有兩種原因:設計或效率。
final關鍵字可以修飾數據,方法和類。
1、修飾數據
在final修飾數據時,表示此數據不可改變。修飾數據又分爲兩種情況:修飾基本類型變量和對象變量。
在修飾基本類型時,表示此變量的值不可改變:
在修飾對象變量時,表示引用不可邊,而對象值可變
/*
* 結果如下:
fd1 : i4 = 15, INT_5 = 18
Create New FinalTest
fd1 : i4 = 15, INT_5 = 18
fd2 : i4 = 13, INT_5 = 18
*/
class Value
{
int i;//包類可見
public Value(int i)
{
this.i = i;
}
}
public class FinalTest
{
private static Random rand = new Random(47);
private String id;
public FinalTest(String id)
{
this.id = id;
}
//編譯時期初始化
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
public static final int VALUE_THREE = 39;
//運行時被初始化,並不是編譯時初始化
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
//數組
private final int[] a = {1,2,3,4,5};
public String toString()
{
return id+" : "+" i4 = "+i4+", INT_5 = "+INT_5;
}
public static void main(String[] args)
{
FinalTest fd1 = new FinalTest("fd1");
//fd1.valueOne++;不能被重新賦值
fd1.v2.i++; //v2是final類型的變量,但是他是對象變量,final修飾對象變量時,對象的引用不能改變,但是對象值可以改變
fd1.v1 = new Value(9);//正確,對象v1的引用可以改變
//fd1.v2 = new Value(9);//錯誤,對象v2的引用不能改變,因爲v2是final類型的
//fd1.VAL_3 = new Value(9);//錯誤,對象VAL_3是final類型的,不能改變其引用,同時給出警告,靜態變量應以靜態變量的方式訪問。
//fd1.a = new int[6];錯誤,數組也是對象,不能改變其引用
//但是可以改變對象的值
for(int i = 0;i<fd1.a.length;i++)
{
fd1.a[i]++;
}
System.out.println(fd1);
System.out.println("Create New FinalTest");
FinalTest fd2 = new FinalTest("fd2");
//i4的值是唯一的,但INT_5的值不會隨着創建新對象而改變,因爲它是static,在類轉載的時候就被初始化了,而不是每次創建新對象時都被初始化
System.out.println(fd1);
System.out.println(fd2);
}
}
2、修飾方法
被final修飾的方法在繼承類中不能被修改。
final class A
{
public final void methodA()
{
System.out.println("A 的方法");
}
}
//被final修飾的類不能被繼承
/*class B extends A
{
//錯誤,不能覆蓋final方法
public final void methodA()
{
}
}
*/
public class FinalTest1
{
}