1.常量
許多其他編程語言都有常量,即值不能更改的變量。通常,它們用於表示某種基本事物,例如Pi
一年中的月份數或天數。也就是說,原則上,如果程序員認為有必要這樣做,他或她可以將任何變量設為常量。
那麼在Java中如何聲明一個不可變變量(常量)呢?為此有一個特殊的關鍵字:final
. 創建不可變變量看起來與創建普通變量一樣。唯一的區別是在變量類型之前你需要寫單詞final
,像這樣:
final Type name = value;
如果您嘗試為final
變量分配不同的值,那麼您的程序將無法編譯。
final
聲明變量時必須對其進行初始化(必須為其分配值)。此規則有一個例外:您可以將靜態類變量的初始化移動到構造函數中。但是您將在第 10 級中了解到這一點。
final
為了減少關鍵字的數量,Java 開發人員不僅僅將關鍵字用於聲明常量。final
也可以應用於方法甚至類。聲明為 as 的方法final
不能被覆蓋,聲明為 as 的類final
不能被繼承。
修飾符final
可以添加在任何變量之前:局部變量、方法參數、類字段和靜態類變量。
請注意,final
在變量名之前只是為了防止對該變量進行任何更改。如果一個變量存儲了一個對象的引用,那麼這個對象仍然可以被改變。
例子:
|
我們創建一個數組。 這是不允許的:變量 data 聲明為final . 但你可以做到這一點。 還有這個。 |
全局常量
如果你決定在你的程序中聲明全局常量,那麼你需要創建靜態類變量,並使它們public
和final
。這些變量的名稱有一種特殊的風格:它們全部用大寫字母書寫,並用下劃線字符分隔單詞。
例子:
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.可變陰影
正如我們之前所說,您不能在同一個方法中創建多個同名的局部變量。您可以使用不同的方法。
但您可能不知道:實例變量和局部方法變量可以同名。
例子:
代碼 | 可變可見性 |
---|---|
|
|
在該add
方法中,我們聲明了一個名為sum
. 在方法結束之前,它會隱藏(或屏蔽)sum
實例變量。
好吧,你說,這在某種意義上是可以預料的。但這還沒有結束。事實證明,如果一個實例變量被一個局部變量遮蔽,仍然有一種方法可以在方法中引用該實例變量。我們通過this
在其名稱前寫關鍵字來做到這一點:
this.name
這是成功解決名稱衝突的示例:
代碼 | 可變可見性 |
---|---|
|
|
和變量在count
任何sum
地方都可以使用或不使用this
關鍵字。sum
在局部變量覆蓋實例變量的行中sum
,sum
只能使用this
關鍵字訪問實例變量。
如果隱藏了靜態類變量而不是實例變量,那麼您需要通過類名而不是關鍵字來訪問它this
:
ClassName.name
例子:
代碼 | 可變可見性 |
---|---|
|
|
無論是否使用類名作為前綴,您都可以在任何地方訪問count
和靜態變量。在局部變量隱藏實例變量的那些行中,只有在用作前綴 時才能訪問實例變量。sum
Solution
sum
sum
sum
Solution
3.for
循環內的變量
還有一個小而有趣的事實。
還有一個變量以特殊方式聲明的地方——在循環for
中。
您可能還記得,for
循環通常在括號中有一個計數器變量。這個變量的可見性是什麼?畢竟,它不在循環體內。是整個方法嗎?或不?
for
正確答案是:在循環頭聲明的變量只在循環體和循環頭for
可見。
例子:
代碼 | 可變可見性 |
---|---|
|
|
因此,您始終可以在代碼中一個接一個地編寫循環並使用同名的計數器變量——這不會產生任何問題。
例子:
代碼 | 可變可見性 |
---|---|
|
|
GO TO FULL VERSION