在任何開發語言中,都須要定義常量。在Java開發語言平臺中也不例外。不過在Java常量定義的時候,跟其餘語言有所不一樣。其有本身的特點。在這篇文章中,主要針對Java語言中定義常量的注意事項進行解析,幫助各位程序開發人員更好的掌握常量的定義與管理工做。 1、常量定義的基本注意事項 在Java語言中,主要是利用final關鍵字(在Java類中靈活使用Static關鍵字)來進行Java常量定義。當常量被設定後,通常狀況下就不容許再進行更改。如能夠利用以下的形式來定義一個常量:final double PI=3.1315。在定義這個常量時,須要注意以下內容: 一是Java常量定義的時候,就須要對常量進行初始化。也就是說,必需要在常量聲明時對其進行初始化。都跟局部變量或者成員變量不一樣。當在常量定義的時候初始化事後,在應用程序中就沒法再次對這個常量進行賦值。若是強行賦值的話,數據庫會跳出錯誤信息,並拒絕接受這一個新的值。 二是final關鍵字使用的範圍。這個final關鍵字不只能夠用來修飾基本數據類型的常量,還能夠用來修飾對象的引用或者方法。如數組就是一個對象引用。爲此可使用final關鍵字來定義一個常量的數組。這就是Java語言中一個很大的特點。一旦一個數組對象被final關鍵字設置爲常量數組以後,它只可以恆定的指向一個數組對象,沒法將其改變指向另一個對象,也沒法更改數組(有序數組的插入方法可以使用的二分查找算法)中的值。 三是須要注意常量的命名規則。不一樣的語言,在定義變量或者常量的時候,都有本身一套編碼規則。這主要是爲了提升代碼的共享程度與提升代碼的易讀性。在Java常量定義的時候,也有本身的一套規則。如在給常量取名的時候,通常都用大寫字符。在Java語言中,大小寫字符是敏感的。之因此採用大寫字符,主要是跟變量進行區分。雖說給常量取名時採用小寫字符,也不會有語法上的錯誤。可是,爲了在編寫代碼時可以一目瞭然的判斷變量與常量,最好仍是可以將常量設置爲大寫字符。另外,在常量中,每每經過下劃線來分隔不一樣的字符。而不想對象名或者類名那樣,經過首字符大寫的方式來進行分隔。這些規則雖然不是強制性的規則,可是爲了提升代碼友好性,方便開發團隊中的其餘成員閱讀,這些規則仍是須要遵照的。沒有規矩,不成方圓。 總之,Java開發人員須要注意,被定義爲final的常量須要採用大寫字母命名,而且中間最好使用下劃線做爲分隔符來進行鏈接多個單詞。在定義final的數據不管是常量、對象引用仍是數組,在主函數中都不能夠改變。不然的話,會被編輯器拒絕並提示錯誤信息。 2、Final關鍵字與static關鍵字同時使用 因爲Javal是面向對象的語言,因此在Java常量定義的時候還有與其它編程語言不一樣的地方。如一段程序代碼從編輯到最後執行,即便須要通過兩個過程,分別爲代碼的裝載與對象的創建。不一樣的過程對於常量的影響是不一樣的。如今假設有以下的代碼: Private static Random rd1=new Random(); //實例化一個隨機數生成對象。 Private final int int1=rd1.nestInt(10); //生成隨機數並賦值給常量int1 Private static final int int2=rd1.nestInt(10); //生成隨機數並賦值給常量int2 這上面的語句的大體含義是,經過Java語言提供的隨機數類對象,生成隨機數。並把生成的隨機數賦值給常量int1與int2。細心的讀者會發現,雖然一樣是賦值語句,可是以上兩個語句中有一個細小的差異,即在第二條語句中多了一個關鍵字static。關於關鍵字的用途,筆者在之前的文章中也有談到過。這個是一個靜態的概念。即當利用這個關鍵字來修飾一個變量的時候,在建立對象以前就會爲這個變量在內存中建立一個存儲空間。之後建立對對象若是須要用到這個靜態變量,那麼就會共享這一個變量的存儲空間。也就是說,在建立對象的時候,若是用到這個變量,那麼系統不會爲其再分配一個存儲空間,而只是將這個內存存儲空間的地址賦值給他。如此作的好處就是可讓多個對象採用相同的初始變量。當須要改變多個對象中變量值的時候,只須要改變一次便可。從這個特性上來講,其跟常量的做用比較相似。不過其並不可以取代常量的做用。 那麼以上兩條語句有什麼差異嗎?咱們首先來看Private final int int1=rd1.nestInt(10)這條語句。雖然int1也是一個常量,可是其是在對象創建的時候初始化的。如如今須要建立兩個對象,那麼須要對這個變量初始化兩次。而在兩次對象初始化的過程當中,因爲生成的隨機數不一樣,因此常量初始化的值也不一樣。最後致使的結果就是,雖然int1是常量,可是在不一樣對象中,其值有多是不一樣的。可見,使用final的Java常量定義並非恆定不變的。由於默認狀況下,定義的常量是在對象創建的時候被初始化。若是在創建常量時,直接賦一個固定的值,而不是經過其餘對象或者函數來賦值,那麼這個常量的值就是恆定不變的,即在多個對象中值也使相同的。可是若是在給常量賦值的時候,採用的是一些函數或者對象(如生成隨機數的Random對象),那麼每次創建對象時其給常量的初始化值就有可能不一樣。這每每是程序開發人員不原意看到的。有時候程序開發人員但願創建再多的對象,其在多個對象中引用常量的值都是相同的。 要是現這個需求的話,有兩個方法。一是在給常量賦值的時候,直接賦予一個固定的值,如abcd等等。而不是一個會根據環境變化的函數或者對象。像生成隨機數的對象,每次運行時其結果都有可能不能。利用這個對象來對常量進行初始化的時候,那麼結果可能每次建立對象時這個結果都有可能不一樣。最後這個常量只可以作到在一個對象內是恆定不變的,而沒法作到在一個應用程序內是恆定不變的。另一個方法就是將關鍵字static與關鍵字final同時使用。一個被定義爲final的對象引用或者常量只可以指向惟一的一個對象,不能夠將他再指向其餘對象。可是,正如上面舉的一個隨機數的例子,對象自己的內容的值是能夠改變的。爲了作到一個常量在一個應用程序內真的不被更改,就須要將常量聲明爲staitc final的常量。這是什麼意思呢?正如上面筆者所說的,當執行一個應用程序的時候,能夠分爲兩個步驟,分別爲代碼裝載與對象建立。爲了確保在全部狀況下(即建立多個對象狀況下)應用程序還可以獲得一個相同值的常量,那麼就最好告訴編譯器,在代碼裝載的時候就初始化常量的值。而後在後續建立對象的時候,只引用這個常量對象的地址,而不對其再進行再次初始化。就如同Private static final int int2=rd1.nestInt(10)這種形式來定義常量。如此,在後續屢次建立對象後,這個常量int2的值都是相同的。由於在建立對象時,其只是引用這個常量,而不會對這個常量再次進行初始化。 因爲加上這個static關鍵字以後,至關於改變了Java常量定義的做用範圍。爲此程序開發人員須要瞭解本身的需求,而後選擇是否須要使用這個關鍵字。在初始化常量的時候,若是採用函數(如系統當前時間)或者對象(如生成隨機數的對象)來初始化常量,能夠預見到在每次初始化這個常量時可能獲得不一樣的值,就須要考慮是否要採用這個static關鍵字。通常狀況下,若是隻須要保證在對象內部採用這個常量的話,那麼這個關鍵字就無關緊要的。可是反過來,若是須要在多個對象中引用這個常量,而且須要其值相同,那麼就必需要採用static這個關鍵字了。以確保不一樣對象中都只有一個常量的值。或者說,不一樣對象中引用的常量其實指向的是內存中的同一塊區域。