1. 程式人生 > >java之final的各種用法

java之final的各種用法

轉載請註明出處

http://blog.csdn.net/pony_maggie/article/details/44317505

作者:小馬


final型別的成員變數



先看一段程式碼,

class Value
{
	int i = 1;
}

public class FinalData 
{

	final int i1 = 9;
	static final int VAL_TWO = 99;
	public static final int VAL_THREE = 39;
	final int i4 = (int)(Math.random()*20);
	static final int i5 = (int)(Math.random()*20);
	final int i6;
	
	Value v1 = new Value();
	final Value v2 = new Value();
	static final Value v3 = new Value();
	//arrays
	final int[] a = {1, 2, 3, 4, 5, 6};
	
	public FinalData()
	{
		i6 = 0;
	}
	
	public void print(String id)
	{
		System.out.println(id + ": " + "i4 = " + i4 +
				", i5 = " + i5);
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		FinalData fd1 = new FinalData();
		//fd1.i1++; //error: can't change value
		fd1.v2.i++; //object is not constant.
		fd1.v1 = new Value(); // ok, not final
		for(int i = 0; i < fd1.a.length; i++)
		{
			fd1.a[i]++;//object is not constant.
			//fd1.v2 = new Value(); // can't change reference.
			//fd1.v3 = new Value(); // can't change reference.
			//fd1.a = new int[3];
			
			fd1.print("fd1");
			System.out.println("creating new finalData");
			FinalData fd2 = new FinalData();
			fd1.print("fd1");
			fd2.print("fd2");
			
		}

	}

}


輸出結果:
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 18, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 9, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 10, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 7, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 1, i5 = 11
fd1: i4 = 0, i5 = 11
creating new finalData
fd1: i4 = 0, i5 = 11
fd2: i4 = 4, i5 = 11


i1 是final,編譯時就確定,所以不能更改。VAL_TWO和VAL_THREE是同樣的道理,除此之外它還是static,意味著它是屬於類本身,還不是例項。

i4和i5表明,final型別的變數值不一定要在編譯時確定,執行時賦值也是OK的。它倆的區別還在於,i4的值每次執行都不同(因為是隨機數),而i5則是一樣的(都是第一次獲取到的隨機數),這是static在起作用,它讓i5只被賦值一次。

另外,關於i5,還有一點值得關注,就是fd2中的i5和fd1一樣,這是因為只初始化一次的機制是針對整個程式載入而言,而不是例項的建立。i6表明final變數在定義時可以不用馬上初始化,但是使用前一定要,所以編譯器會提示你在建構函式裡初始化,否則會報錯。

v1 是普通的類引用變數,可以隨意更改。v2和v3因為用了final修飾,它們的引用不能更改。
fd1.v2.i++
這一行表明,對於v2只是引用不能更改,但是它的值還是可以改的,也就是說,reference是常量,object不是。同樣的原量也適用於陣列a,畢竟陣列在java裡也是引用。

未完待續。


                                                                          

相關推薦

javafinal各種用法

轉載請註明出處 http://blog.csdn.net/pony_maggie/article/details/44317505 作者:小馬 final型別的成員變數 先看一段程式碼,class Value { int i = 1; } public cl

java final用法

final 修飾符分兩種情況:如果是修飾基本型別,如果整形,浮點型,如 final int i=100,這裡的i的值是不能變的如果修飾的是物件,如final String s = "dddd";,這裡的引用是不能變的,比如你不能這樣寫:s = "bbbbb";但物件的值可以

Javafinal用法總結

++ 標識符 ali 相同 即使 調用方法 理由 new 3.1 1. 修飾基礎數據成員的final 這是final的主要用途,其含義相當於C/C++的const,即該成員被修飾為常量,意味著不可修改。如java.lang.Math類中的PI和E是final

解析Javafinal關鍵字的各種用法

col 後序 blog str 訪問 人類 依然 fin 可能 首先,我們可以從字面上理解一下final這個英文單詞的中文含義:“最後的,最終的; 決定性的; 不可更改的;”。顯然,final關鍵詞如果用中文來解釋,“不可更改的”更為合適。當你在編寫程序,可能

java語法final

隱式 子類 引用 語法 private 指向 static 所有 繼承 final作用於類 表示該類不可繼承。其中所有方法默認final。 final作用於方法 表示該方法不可被子類復寫。private 隱式指定final。 final作用於變量 表示該變量不可變。(對於引

Java基礎final和static關鍵字

推薦 構造方法 其他 如果 靈活 位置 map 機制 lis 一、final 根據程序上下文環境,它可以修飾非抽象類、非抽象類成員方法和變量。 final類不能被繼承,沒有子類,final類中的方法默認是final的。 final

Java類的執行順序、final用法

java final 面向對象 繼承 類的初始化順序 類的初始化順序1、靜態變量 2、靜態代碼塊 3、main方法 4、類的屬性 5、代碼塊 6、構造方法如果有父類則是1、父類–靜態變量 2、父類–靜態代碼塊 3、子類–靜態變量 4、子類–靜態代碼塊 5、父類–屬性 6、父類–代碼塊 7、

Java學習筆記二十二】解析接口在Java繼承中的用法及實例分析

ani 復制代碼 ads compute 現在 target body 常量 實現接口 一、定義 Java接口(Interface),是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具

JAVA 基礎--final 關鍵字的用法

hang change nal class end strong rdquo gin java 基礎 在java中,final的含義在不同的場景下有細微的差別,in a word,它指的是“不可變的” 1.修飾數據。這裏的可以看到被final修飾的

JavaHashMap用法

nsvalue 隨機 random pac ring highlight pap span true 源碼: 1 package test_demo; 2 3 import java.util.HashMap; 4 import java.util.Iterat

Java函數Split的用法

java 基礎 最近在寫課程設計,需要用到將輸入的用逗號分割的整數字符串轉換成數組進行排序,所以就發現了這個在我看來簡直超神的函數: stringObj.split(String regex,int limit) 其中StringObj表示需要分割的字符串對象,且使用split方法後該對象不會被改變

Java學習final淺談

重寫 四種方法 變量 無法 設計 三種 fin 改變 img final的意思就是“這個值不能變”。 Final修飾變量時: final的變量可以直接賦值; 可以先聲明,後賦值; 也可以指向一個引用,但是一旦指向一個引用後則不能更改到其他的引用。 用來修飾數據,包括成員

javafinal用法

C# nal ava ID 一個 類型 默認 關系 值類型 java的final是一個非常靈活的存在,它可以在三個地方使用:類、變量、方法。 類: final用在類上面的話相當於C#中的sealed的用法。就是避免其他類的繼承。 變量: 當final用在變量上面的時候相當於

Django路——form modelform formset modelformset的各種用法

tab primary 快速 super() 叠代 成績 ret 單個 else 首先上結論:   form適用於對單個表單的操作,並且需要對每個字段的驗證規則自定義。   modelform:適用於對用戶提交的單個表單操作,字段可以用model中的表的字段來作為驗證規

java成神——java中string的用法

基本 ble sta first stand pat concat lower a+b java中String的用法 String基本用法 String分割 String拼接 String截取 String換行符和format格式化 String反轉字符串和去除空白字符

JAVA常用集合框架用法詳解基礎篇一Colletion介面

首先,在學習集合之前我們能夠使用的可以儲存多個元素的容器就是陣列。 下面舉幾個例子主要是引出集合類的: 1、8,4,5,6,7,55,7,8  像這樣的型別相同的可以使用陣列來儲存,本例可以用int[] arr來儲存。 2、”zhnagsan”,true,68 像這樣的可以使

JAVA常用集合框架用法詳解基礎篇三Colletion子介面Set

這一篇我們來介紹Collection介面的另一個子介面,Set介面。Set是個介面,元素不可以重複,是無序的。Set介面中的方法和Collection的一致。 A、Set的子類: 1、HashSet:此類實現的Set介面,由雜湊表(實際上是一個HashMap)例項支援,它不保證Set的迭代順

JAVA常用集合框架用法詳解基礎篇二Colletion子介面List

接著上一篇,接著講講集合的知識。上一篇講了Collection介面。它可以說是集合的祖先了,我們這一篇就說說它的子孫們。 一、Collection的子介面 List:有序(存入和取出的順序一致),元素都有索引(即角標),元素可以重複。 Set:元素不能重複,無序的。 首先講講L

java 繼承 super關鍵籽 this關鍵字 final關鍵字

繼承 語法: 使用 extends 來繼承 class子類    extends父類{ 子類屬性 子類方法 } 繼承的特點: 1、子類會把父類所有的屬性和方法繼承下來,final修飾的類是不可以被繼承的 2、子類還可以·擁有自己獨特的屬性和方法 3、父類更

Java教程35—Java中的final關鍵字用法

在本教程中,我們將學習final關鍵字的用法。 final關鍵字可以與變數,方法和類一起使用。 我們將詳細介紹以下主題。 1)final變數 2)final方法 3)final變數 1)final變數 final變數是常量。 初始化後,我們無法更改