<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### [final 數據](https://lingcoder.gitee.io/onjava8/#/book/08-Reuse?id=final-%e6%95%b0%e6%8d%ae) 許多編程語言都有某種方法告訴編譯器有一塊數據是恒定不變的。恒定是有用的,如: 1. 一個永不改變的編譯時常量。 2. 一個在運行時初始化就不會改變的值。 對于編譯時常量這種情況,編譯器可以把常量帶入計算中;也就是說,可以在編譯時計算,減少了一些運行時的負擔。在 Java 中,這類常量必須是基本類型,而且用關鍵字**final**修飾。你必須在定義常量的時候進行賦值。 一個被**static**和**final**同時修飾的屬性只會占用一段不能改變的存儲空間。 當用**final**修飾對象引用而非基本類型時,其含義會有一點令人困惑。對于基本類型,**final**使數值恒定不變,而對于對象引用,**final**使引用恒定不變。一旦引用被初始化指向了某個對象,它就不能改為指向其他對象。但是,對象本身是可以修改的,Java 沒有提供將任意對象設為常量的方法。(你可以自己編寫類達到使對象恒定不變的效果)這一限制同樣適用數組,數組也是對象。 下面例子展示了**final**屬性的使用: ~~~ // reuse/FinalData.java // The effect of final on fields import java.util.*; class Value { int i; // package access Value(int i) { this.i = i; } } public class FinalData { private static Random rand = new Random(47); private String id; public FinalData(String id) { this.id = id; } // Can be compile-time constants: private final int valueOne = 9; private static final int VALUE_TWO = 99; // Typical public constant: public static final int VALUE_THREE = 39; // Cannot be compile-time constants: private final int i4 = rand.nextInt(20); static final int INT_5 = rand.nextInt(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value VAL_3 = new Value(33); // Arrays: private final int[] a = {1, 2, 3, 4, 5, 6}; @Override public String toString() { return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5; } public static void main(String[] args) { FinalData fd1 = new FinalData("fd1"); //- fd1.valueOne++; // Error: can't change value fd1.v2.i++; // Object isn't constant fd1.v1 = new Value(9); // OK -- not final for (int i = 0; i < fd1.a.length; i++) { fd1.a[i]++; // Object isn't constant } //- fd1.v2 = new Value(0); // Error: Can't //- fd1.VAL_3 = new Value(1); // change reference //- fd1.a = new int[3]; System.out.println(fd1); System.out.println("Creating new FinalData"); FinalData fd2 = new FinalData("fd2"); System.out.println(fd1); System.out.println(fd2); } } ~~~ 輸出: ~~~ fd1: i4 = 15, INT_5 = 18 Creating new FinalData fd1: i4 = 15, INT_5 = 18 fd2: i4 = 13, INT_5 = 18 ~~~ 因為**valueOne**和**VALUE\_TWO**都是帶有編譯時值的**final**基本類型,它們都可用作編譯時常量,沒有多大區別。**VALUE\_THREE**是一種更加典型的常量定義的方式:**public**意味著可以在包外訪問,**static**強調只有一個,**final**說明是一個常量。 按照慣例,帶有恒定初始值的**final****static**基本變量(即編譯時常量)命名全部使用大寫,單詞之間用下劃線分隔。(源于 C 語言中定義常量的方式。) 我們不能因為某數據被**final**修飾就認為在編譯時可以知道它的值。由上例中的**i4**和**INT\_5**可以看出,它們在運行時才會賦值隨機數。示例部分也展示了將**final**值定義為**static**和非**static**的區別。此區別只有當值在運行時被初始化時才會顯現,因為編譯器對編譯時數值一視同仁。(而且編譯時數值可能因優化而消失。)當運行程序時就能看到這個區別。注意到**fd1**和**fd2**的**i4**值不同,但**INT\_5**的值并沒有因為創建了第二個**FinalData**對象而改變,這是因為它是**static**的,在加載時已經被初始化,并不是每次創建新對象時都初始化。 **v1**到**VAL\_3**變量說明了**final**引用的意義。正如你在`main()`中所見,**v2**是**final**的并不意味著你不能修改它的值。因為它是引用,所以只是說明它不能指向一個新的對象。這對于數組具有同樣的意義,數組只不過是另一種引用。(我不知道有什么方法能使數組引用本身成為**final**。)看起來,聲明引用為**final**沒有聲明基本類型**final**有用。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看