天天看點

java final關鍵字的了解與使用方法總結

注明出處:參照參照《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