注明出處:參照參照《Java從入門到精通》11.2章節
以下是對final變量的說明,之後還有final方法的說明
1、一般final關鍵字用于聲明一個變量(常量也看作一個特殊的變量)。例如數學中的PI,E。
2、final關鍵字修飾變量時必須在聲明時對其進行指派。或者定義空白final,空白final必須在構造函數中,或構造函數執行之前(例如:構造代碼塊)對其指派。
final關鍵字修飾對象時,隻能在聲明是對其進行指派。
3、final既可以修飾基本資料類型,也可以修飾對象引用。
4、我們通常認為final修飾的變量不能被改變,但這個不能被改變需要深入了解。
- 4.1對實體(對象引用)進行修飾時,隻能指向一個、聲明時(沒有其他)、固定的對象。
- 4.2對常量進行修飾時,将不再能改變常量的值,一般final修飾的常量需要使用大寫字母命名,且語義單詞間用下劃線進行連接配接。
- 4.3對數組進行修飾時,不能對數組進行再次指派。
- 4.4前面說了修飾對象時,不能改變指向的對象,但指向對象本身的值可以改變(下面有例子)。
- 4.5final定義的常量都是恒定不變的?NO。例如:final int a=Random.nextInt(10);// 對,沒錯,這是常量。
- 4.6那麼為了是一個常量真正做到不可改變,可以将常量生命為static final。(下面例子)
- 4.7既然常量可以做到真正不能改變,那麼在final對象前面加static是否不能改變對象本身的值的。不可行,依然可以改變。
下面使用程式說明final修飾變量可以出現的位置。
package cn.vicky.channel.aa;
public class TestStatic {
// final成員變量不可更改
final int VALUE_ONE = 1;
// 在聲明final成員變量時沒有複制,稱為空白final
final int BLANK_FINALVALUE;
// 空白final必須在構造函數中,或構造函數執行之前(例如:構造代碼塊)對其指派
public TestStatic() {
BLANK_FINALVALUE = 1;
}
// 設定參數為final,不可以改變x的值
int doIt(final int x) {
x = x+1;// 這句編譯錯誤
return x+1;
}
// 局部變量定義為final,不可改變i的值
public void doSomeThing() {
final int i = 1;
i++;// 這句編譯錯誤
}
}
為了深入的了解final和上面的理論知識,請仔細閱讀下面的程式
package com.lzw;
import static java.lang.System.*;
import java.util.*;
class Test {
int i = 0;
}
public class FinalData {
static Random rand = new Random();
private final int VALUE_1 = 9; // 聲明一個final常量
private static final int VALUE_2 = 10; // 聲明一個final、static常量
private final Test test = new Test(); // 聲明一個final引用
private Test test2 = new Test(); // 聲明一個不是final的引用
private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 聲明一個定義為final的數組
private final int i4 = rand.nextInt(20);
private static final int i5 = rand.nextInt(20);
public String toString() {
return i4 + " " + i5 + " ";
}
public static void main(String[] args) {
FinalData data = new FinalData();
// data.test=new Test();
//可以對指定為final的引用中的成員變量指派
//但不能将定義為final的引用指向其他引用
// data.value2++;
//不能改變定義為final的常量值
data.test2 = new Test(); // 可以将沒有定義為final的引用指向其他引用
for (int i = 0; i < data.a.length; i++) {
// a[i]=9;
// //不能對定義為final的數組指派
}
out.println(data);
out.println("data2");
out.println(new FinalData());
// out.println(data);
}
}
package com.lzw;
import static java.lang.System.*;
import java.util.*;
public class FinalStaticData {
private static Random rand = new Random(); // 執行個體化一個Random類對象
// 随機産生0~10之間的随機數賦予定義為final的a1
private final int a1 = rand.nextInt(10);
// 随機産生0~10之間的随機數賦予定義為static final的a2
private static final int a2 = rand.nextInt(10);
public static void main(String[] args) {
FinalStaticData fdata = new FinalStaticData(); // 執行個體化一個對象
// 調用定義為final的a1
out.println("重新執行個體化對象調用a1的值:" + fdata.a1);
// 調用定義為static final的a2
out.println("重新執行個體化對象調用a1的值:" + fdata.a2);
// 執行個體化另外一個對象
FinalStaticData fdata2 = new FinalStaticData();
out.println("重新執行個體化對象調用a1的值:" + fdata2.a1);
out.println("重新執行個體化對象調用a2的值:" + fdata2.a2);
}
}
為了寫太長,final方法和final類,另起一篇文章。
連接配接位址如下:http://blog.csdn.net/lidachao01/article/details/53791570