title=變數
| 導航 語言基礎 主題: |
在 Java 程式語言中,欄位 和 變數 是同一個東西。變數是用於儲存資料的裝置,例如數字或字元資料串。
Java 被認為是一種**強型別**程式語言。因此,Java 程式語言中的所有變數都應該有一個特定的**資料型別**。這要麼是宣告的,要麼是推斷的,Java 語言只允許程式在遵循型別約束的情況下執行。
如果您使用非數值型別的資料(例如文字內容)來表示數值型別,那麼此類宣告將違反 Java 的型別系統。這賦予了 Java **型別安全**的能力。Java 會檢查表示式或資料是否以不正確的型別或根本沒有型別出現。然後,它會自動在編譯時將此事件標記為錯誤。大多數型別相關錯誤會被 Java 編譯器捕獲,因此一旦程式完全成功地編譯,它就會更加安全可靠。有些語言(例如 C)對這類語句的解釋進行了定義,並使用該解釋而不會發出任何警告;另一些語言(例如 PL/I)對幾乎所有這類語句都定義了轉換,並執行轉換以完成賦值。某些型別錯誤仍然可能在執行時發生,因為 Java 支援型別轉換操作,這是一種將一個表示式的型別更改為另一種型別的操作。但是,Java 在進行此類轉換時會執行執行時型別檢查,因此不正確的型別轉換會導致執行時異常,而不是靜默地成功並允許資料損壞。
另一方面,Java 也被稱為**混合語言**。雖然支援面向物件程式設計 (OOP),但 Java 不是像Smalltalk 或Ruby 這樣的純面嚮物件語言。相反,Java 提供了物件型別和基本型別。基本型別用於布林值、字元和數值及操作。這允許在運算元值資料時獲得相對較好的效能,但以靈活性的代價為代價。例如,您無法對基本型別進行子類化並向它們新增新的操作。
在 Java 程式語言中,有四種類型的變數。
程式碼清單 3.9: ClassWithVariables.java
public class ClassWithVariables {
public int id = 0;
public static boolean isClassUsed;
public void processData(String parameter) {
Object currentValue = null;
}
}
|
在程式碼清單 3.9 中,是所有四種類型變數的示例。
- **例項變數**: 這些變數用於儲存物件的狀態(例如,
id)。從類定義中建立的每個物件都將擁有自己變數的副本。它在相應的物件在記憶體中存在的情況下有效並佔用儲存空間。 - **類變數**: 這些變數在類級作用域內使用
static修飾符顯式定義(例如,isClassUsed)。沒有其他變數可以附加static修飾符。由於這些變數使用static修飾符定義,因此無論類例項化多少次,它們始終只有一個副本。只要類載入到記憶體中,它們就會一直存在。 - **引數** 或 **引數**: 這些變數傳遞到方法簽名中(例如,
parameter)。回想一下在 main 方法中使用args變數的情況。它們沒有附加修飾符(即public、private、protected或static),並且可以在方法中的任何地方使用。它們在方法執行期間處於記憶體中,並且在方法返回後無法使用。 - **區域性變數**: 這些變數在方法級作用域內定義和使用(例如,
currentValue),但不在方法簽名中。它們沒有任何修飾符附加到它。方法返回後,它們就不再存在。
**問題 3.5**: 考慮以下程式碼
問題 3.5: SomeClass.java
public class SomeClass {
public static int c = 1;
public int a = c;
private int b;
public void someMethod(int d) {
d = c;
int e;
}
}
|
在上面的例子中,我們建立了五個變數:a、b、c、d 和 e。所有這些變數都具有相同的資料型別 int(整數)。但是,您能說出每個變數是什麼型別嗎?
a和b是**例項變數**;c是**類變數**;d是**引數**或**引數**; 並且,e是**區域性變數**。

變數及其儲存的所有資訊都儲存在計算機的記憶體中以供訪問。將計算機的記憶體想象成一張資料表——其中每個單元格對應一個變數。
在建立變數時,我們基本上會建立一個新的地址空間併為其指定一個唯一的名稱。Java 進一步允許您定義可以在變數中放置的內容——用 Java 的術語來說,您稱之為*資料型別*。因此,要建立變數,您基本上需要做兩件事
- 透過為變數指定一個唯一的名稱來建立變數; 並且,
- 為變數定義一個數據型別。
以下程式碼演示瞭如何建立一個簡單的變數。此過程稱為*變數宣告*。
程式碼部分 3.40: 一個簡單的變數宣告。
int a;
|
由於我們為變數提供了資料型別,因此我們知道變數可以儲存什麼,不能儲存什麼。我們知道 int(整數)資料型別支援正整數或負整數。因此,一旦變數建立完畢,我們就可以使用以下語法為它提供任何整數值。此過程稱為*賦值操作*。
程式碼部分 3.41: 變數宣告和賦值操作(在不同的行上)。
int a;
a = 10;
|
Java 為程式設計師提供了一種更簡單的方法,可以將變數宣告和賦值操作組合在一行中。考慮以下程式碼
程式碼部分 3.42: 變數宣告和賦值操作(在同一行上)。
int a = 10;
|
考慮以下程式碼
程式碼部分 3.43: 未分組的宣告。
int a;
int b;
String c;
a = 10;
b = 20;
c = "some text";
|
您可以透過多種方式來簡化此程式碼的編寫。例如,您可以將類似資料型別的宣告分組在一個語句中
程式碼部分 3.44: 分組宣告。
int a, b;
String c;
a = 10;
b = 20;
c = "some text";
|
或者,您可以透過將分組宣告和賦值組合在一起進一步簡化語法,例如
程式碼部分 3.45: 分組宣告和賦值。
int a = 10, b = 20;
String c = "some text";
|
雖然地址空間 有自己的地址——通常是雜湊數字,例如 0xCAD3 等——但是,如果我們能夠為變數指定一個可識別的名稱,那麼記住變數在記憶體中的位置會容易得多。**識別符號**是我們為變數指定的名稱。您可以將變數命名為任何名稱,例如 aVariable、someVariable、age、someonesImportantData 等。但是請注意:我們描述的這些名稱中都沒有空格。因此,很明顯,變數名稱中不允許出現空格。事實上,在變數名稱中還有很多其他不允許出現的東西。允許出現的東西包括
- 字元
A到Z及其小寫形式a到z。 - 數字
0到9。但是,數字不能出現在變數名稱的開頭。 - 最後,特殊字元,其中只包括
$(美元符號)和_(下劃線)。
**問題 3.6**: 以下哪個是正確的變數識別符號?
f_namelastnamesomeones name$SomeoneElsesName7daysTheAnswerIs42
我可以告訴你 3 和 5 不是在這裡做事的方法,其餘都是正確的識別符號。
任何有效的變數名稱都可能是正確的,但並非總是你應該用於變數的名稱,原因如下
- 變數的名稱應該反映它們內部的值。
- 識別符號的命名應該遵循命名指南或約定。我們將在稍後進行說明。
- 識別符號不應該是一個無意義的名稱,例如
lname,你應該始終正確地命名它:lastName是為變數命名的最佳方法。
在為識別符號命名時,您需要使用以下指南,以確保變數的命名準確。正如我們之前所討論的,我們應該始終以一種能夠告訴我們它們儲存什麼的方式來命名我們的變數。考慮以下示例
程式碼部分 3.46: 未知過程。
int a = 24;
int b = 365;
int c = a * b;
|
你知道這個程式是做什麼的嗎?嗯,它把兩個值相乘。這一點你猜對了。但是,你知道這兩個值是什麼嗎?確切地說,你不知道。現在看看這段程式碼
程式碼節 3.47:時間轉換。
int age = 24;
int daysInYear = 365;
int ageInDays = age * daysInYear;
|
現在你可以說出發生了什麼事了,不是嗎?然而,在我們繼續之前,請注意變數的大小寫。如果一個詞包含大寫字母,則它處於大寫狀態。如果一個詞包含小寫字母,則它處於小寫狀態。一個詞中同時出現大寫和小寫字母則被認為是混合大小寫。
我們到目前為止學習的變數都是混合大小寫。當有兩個或多個片語成變數名時,你需要使用一種叫做駝峰式命名法的特殊大小寫。就像駱駝的駝峰一樣,你的單詞需要突出顯示。使用這種技術,first 和 name 可以寫成 firstName 或 FirstName。
第一個例項,firstName 是我們用作變數名的。不過請記住,firstName 與 FirstName 不同,因為 Java 是區分大小寫的。區分大小寫基本上意味著你在寫一個詞時的字母大小寫必須與你在後面使用它時的大小寫一致。任何其他方式都與你的意圖不符。隨著你的學習,你會了解更多。你現在應該明白為什麼你被要求識別的變數不正確了。
字面量(值)
[edit | edit source]現在我們知道了變數應該如何命名,讓我們來看看這些變數的值。像數字這樣的簡單值被稱為字面量。本節將向你展示字面量是什麼以及如何使用它們。請看下面的程式碼
程式碼節 3.48:字面量。
int age = 24;
long bankBalance = 20000005L;
|
到目前為止,我們只看到了數字如何在賦值語句中工作。讓我們看看除了數字以外的其他資料型別。字元基本上是英文字母表中的字母。在寫單個字元時,我們使用單引號將其括起來。請看下面的程式碼
程式碼節 3.49:字元。
char c = 'a';
|
你問為什麼?嗯,解釋很簡單。如果在沒有引號的情況下寫,系統會認為它是一個變數識別符號。這就是你在區分變數及其字面量值時必須做出的區分。字元資料型別有點不尋常。首先,它們只能儲存單個字元。如果你需要在其中儲存一個完整的姓名,比如John,你會這樣寫嗎?
程式碼節 3.50:字元列表。
char firstChar = 'J';
char secondChar = 'o';
char thirdChar = 'h';
char fourthChar = 'n';
|
現在,這太糟糕了。謝天謝地,有一種資料型別可以處理大量的字元,它叫做String。字串可以像下面這樣初始化
程式碼節 3.51:字串。
String name = "John";
|
注意,使用雙引號而不是單引號。這是你需要注意的唯一一件事。