1.常量

許多其他編程語言都有常量,即值不能更改的變量。通常,它們用於表示某種基本事物,例如Pi一年中的月份數或天數。也就是說,原則上,如果程序員認為有必要這樣做,他或她可以將任何變量設為常量。

那麼在Java中如何聲明一個不可變變量(常量)呢?為此有一個特殊的關鍵字:final. 創建不可變變量看起來與創建普通變量一樣。唯一的區別是在變量類型之前你需要寫單詞final,像這樣:

final Type name = value;

如果您嘗試為final變量分配不同的值,那麼您的程序將無法編譯。

final聲明變量時必須對其進行初始化(必須為其分配值)。此規則有一個例外:您可以將靜態類變量的初始化移動到構造函數中。但是您將在第 10 級中了解到這一點

final為了減少關鍵字的數量,Java 開發人員不僅僅將關鍵字用於聲明常量。final也可以應用於方法甚至類。聲明為 as 的方法final不能被覆蓋,聲明為 as 的類final不能被繼承。

修飾符final可以添加在任何變量之前:局部變量、方法參數、類字段和靜態類變量。

請注意,final在變量名之前只是為了防止對該變量進行任何更改。如果一個變量存儲了一個對象的引用,那麼這個對象仍然可以被改變。

例子:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
我們創建一個數組。

這是不允許的:變量data聲明為final.

但你可以做到這一點。
還有這個。

全局常量

如果你決定在你的程序中聲明全局常量,那麼你需要創建靜態類變量,並使它們publicfinal。這些變量的名稱有一種特殊的風格:它們全部用大寫字母書寫,並用下劃線字符分隔單詞。

例子:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}


2.可變陰影

正如我們之前所說,您不能在同一個方法中創建多個同名的局部變量。您可以使用不同的方法。

但您可能不知道:實例變量和局部方法變量可以同名。

例子:

代碼 可變可見性
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

在該add方法中,我們聲明了一個名為sum. 在方法結束之前,它會隱藏(或屏蔽sum實例變量。

好吧,你說,這在某種意義上是可以預料的。但這還沒有結束。事實證明,如果一個實例變量被一個局部變量遮蔽,仍然有一種方法可以在方法中引用該實例變量。我們通過this在其名稱前寫關鍵字來做到這一點:

this.name

這是成功解決名稱衝突的示例:

代碼 可變可見性
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}


this.count
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

和變量在count 任何sum 地方都可以使用或不使用this關鍵字。sum 在局部變量覆蓋實例變量的行中sumsum 只能使用this關鍵字訪問實例變量。

如果隱藏了靜態類變量而不是實例變量,那麼您需要通過類名而不是關鍵字來訪問它this

ClassName.name

例子:

代碼 可變可見性
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

 無論是否使用類名作為前綴,您都可以在任何地方訪問count 和靜態變量。在局部變量隱藏實例變量的那些行中,只有在用作前綴 時才能訪問實例變量。sumSolutionsumsumsumSolution



3.for循環內的變量

還有一個小而有趣的事實。

還有一個變量以特殊方式聲明的地方——在循環for

您可能還記得,for循環通常在括號中有一個計數器變量。這個變量的可見性是什麼?畢竟,它不在循環體內。是整個方法嗎?或不?

for正確答案是:在循環頭聲明的變量只在循環體循環for可見。

例子:

代碼 可變可見性
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

因此,您始終可以在代碼中一個接一個地編寫循環並使用同名的計數器變量——這不會產生任何問題。

例子:

代碼 可變可見性
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a