欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
java中final的用法
許多程序設計語(yǔ)言都有自己的辦法告訴編譯器某個(gè)數據是“常數”。常數主要應用于下述兩個(gè)方面:
(1) 編譯期常數,它永遠不會(huì )改變
(2) 在運行期初始化的一個(gè)值,我們不希望它發(fā)生變化
對于編譯期的常數,編譯器(程序)可將常數值“封裝”到需要的計算過(guò)程里。也就是說(shuō),計算可在編譯期間提前執行,從而節省運行時(shí)的一些開(kāi)銷(xiāo)。在Java中,這些形式的常數必須屬于基本數據類(lèi)型(Primitives),而且要用final關(guān)鍵字進(jìn)行表達。在對這樣的一個(gè)常數進(jìn)行定義的時(shí)候,必須給出一個(gè)值。
無(wú)論static還是final字段,都只能存儲一個(gè)數據,而且不得改變。
若隨同對象句柄使用final,而不是基本數據類(lèi)型,它的含義就稍微讓人有點(diǎn)兒迷糊了。對于基本數據類(lèi)型,final會(huì )將值變成一個(gè)常數;但對于對象句柄,final會(huì )將句柄變成一個(gè)常數。進(jìn)行聲明時(shí),必須將句柄初始化到一個(gè)具體的對象。而且永遠不能將句柄變成指向另一個(gè)對象。然而,對象本身是可以修改的。Java對此未提供任何手段,可將一個(gè)對象直接變成一個(gè)常數(但是,我們可自己編寫(xiě)一個(gè)類(lèi),使其中的對象具有“常數”效果)。這一限制也適用于數組,它也屬于對象。
下面是演示final字段用法的一個(gè)例子:
//: FinalData.java// The effect of final on fieldsclass Value {int i = 1;}public class FinalData {// Can be compile-time constantsfinal int i1 = 9;static final int I2 = 99;// Typical public constant:public static final int I3 = 39;// Cannot be compile-time constants:final int i4 = (int)(Math.random()*20);static final int i5 = (int)(Math.random()*20);Value v1 = new Value();final Value v2 = new Value();static final Value v3 = new Value();//! final Value v4; // Pre-Java 1.1 Error:// no initializer// Arrays:final int[] a = { 1, 2, 3, 4, 5, 6 };public void print(String id) {System.out.println(id + ": " + "i4 = " + i4 +", i5 = " + i5);}public static void main(String[] args) {FinalData fd1 = new FinalData();//! fd1.i1++; // Error: can‘t change valuefd1.v2.i++; // Object isn‘t constant!fd1.v1 = new Value(); // OK -- not finalfor(int i = 0; i < fd1.a.length; i++)fd1.a[i]++; // Object isn‘t constant!//! fd1.v2 = new Value(); // Error: Can‘t//! fd1.v3 = new Value(); // change handle//! fd1.a = new int[3];fd1.print("fd1");System.out.println("Creating new FinalData");FinalData fd2 = new FinalData();fd1.print("fd1");fd2.print("fd2");}} ///:~
由于i1和I2都是具有final屬性的基本數據類(lèi)型,并含有編譯期的值,所以它們除了能作為編譯期的常數使用外,在任何導入方式中也不會(huì )出現任何不同。I3是我們體驗此類(lèi)常數定義時(shí)更典型的一種方式:public表示它們可在包外使用;Static強調它們只有一個(gè);而final表明它是一個(gè)常數。注意對于含有固定初始化值(即編譯期常數)的fianlstatic基本數據類(lèi)型,它們的名字根據規則要全部采用大寫(xiě)。也要注意i5在編譯期間是未知的,所以它沒(méi)有大寫(xiě)。
不能由于某樣東西的屬性是final,就認定它的值能在編譯時(shí)期知道。i4和i5向大家證明了這一點(diǎn)。它們在運行期間使用隨機生成的數字。例子的這一部分也向大家揭示出將final值設為static和非static之間的差異。只有當值在運行期間初始化的前提下,這種差異才會(huì )揭示出來(lái)。因為編譯期間的值被編譯器認為是相同的。這種差異可從輸出結果中看出:
fd1: i4 = 15, i5 = 9Creating new FinalDatafd1: i4 = 15, i5 = 9fd2: i4 = 10, i5 = 9
注意對于fd1和fd2來(lái)說(shuō),i4的值是唯一的,但i5的值不會(huì )由于創(chuàng )建了另一個(gè)FinalData對象而發(fā)生改變。那是因為它的屬性是static,而且在載入時(shí)初始化,而非每創(chuàng )建一個(gè)對象時(shí)初始化。
從v1到v4的變量向我們揭示出final句柄的含義。正如大家在main()中看到的那樣,并不能認為由于v2屬于final,所以就不能再改變它的值。然而,我們確實(shí)不能再將v2綁定到一個(gè)新對象,因為它的屬性是final。這便是final對于一個(gè)句柄的確切含義。我們會(huì )發(fā)現同樣的含義亦適用于數組,后者只不過(guò)是另一種類(lèi)型的句柄而已。將句柄變成final看起來(lái)似乎不如將基本數據類(lèi)型變成final那么有用。

2. 空白final
Java1.1允許我們創(chuàng )建“空白final”,它們屬于一些特殊的字段。盡管被聲明成final,但卻未得到一個(gè)初始值。無(wú)論在哪種情況下,空白final都必須在實(shí)際使用前得到正確的初始化。而且編譯器會(huì )主動(dòng)保證這一規定得以貫徹。然而,對于final關(guān)鍵字的各種應用,空白final具有最大的靈活性。舉個(gè)例子來(lái)說(shuō),位于類(lèi)內部的一個(gè)final字段現在對每個(gè)對象都可以有所不同,同時(shí)依然保持其“不變”的本質(zhì)。下面列出一個(gè)例子:
//: BlankFinal.java// "Blank" final data membersclass Poppet { }class BlankFinal {final int i = 0; // Initialized finalfinal int j; // Blank finalfinal Poppet p; // Blank final handle// Blank finals MUST be initialized// in the constructor:BlankFinal() {j = 1; // Initialize blank finalp = new Poppet();}BlankFinal(int x) {j = x; // Initialize blank finalp = new Poppet();}public static void main(String[] args) {BlankFinal bf = new BlankFinal();}} ///:~
現在強行要求我們對final進(jìn)行賦值處理——要么在定義字段時(shí)使用一個(gè)表達 式,要么在每個(gè)構建器中。這樣就可以確保final字段在使用前獲得正確的初始化。

3. final自變量
Java 1.1允許我們將自變量設成final屬性,方法是在自變量列表中對它們進(jìn)行適當的聲明。這意味著(zhù)在一個(gè)方法的內部,我們不能改變自變量句柄指向的東西。如下所示:
//: FinalArguments.java// Using "final" with method argumentsclass Gizmo {public void spin() {}}public class FinalArguments {void with(final Gizmo g) {//! g = new Gizmo(); // Illegal -- g is finalg.spin();}void without(Gizmo g) {g = new Gizmo(); // OK -- g not finalg.spin();}// void f(final int i) { i++; } // Can‘t change// You can only read from a final primitive:int g(final int i) { return i + 1; }public static void main(String[] args) {FinalArguments bf = new FinalArguments();bf.without(null);bf.with(null);}} ///:~
注意此時(shí)仍然能為final自變量分配一個(gè)null(空)句柄,同時(shí)編譯器不會(huì )捕獲它。這與我們對非final自變量采取的操作是一樣的。
方法f()和g()向我們展示出基本類(lèi)型的自變量為final時(shí)會(huì )發(fā)生什么情況:我們只能讀取自變量,不可改變它。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java里的final變量
漫談.Net關(guān)鍵字系列之一Sealed與Final
java final 關(guān)鍵字
java中final關(guān)鍵字的使用及static final 和final的區別
Effective Java 筆記(四)
layUi
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久