Java | 欄位(Field)
Java 欄位
前言
- 本文原創作者為 Blume,版權歸原創作者所有。
- 本文主要內容根據 Java 官方教程中的《Declaring Member Variables》和《Referencing an Object’s Fields》編寫而成。
- 本文更新(修訂)於 2021 年 3 月 29 日。
- 本文網址為
https://blog.csdn.net/weixin_48390834/article/details/115301392
- 商業性轉載請聯絡原創作者,非商業性轉載請註明出處。
概述
欄位(Field),是 Java 中類的一個成員,用來儲存
在類中,具有下列幾種變數:
- 類中的成員變數,稱為欄位。
- 方法或程式碼塊中的變數,稱為區域性變數(Local Variable)。
- 方法宣告中的變數,稱為引數(Parameter)。
宣告欄位
/**
* 欄位示例
*
* @author Blume
*/
public class FieldDemo {
public static void main(String[] args) {
// 類中的常量欄位可以直接訪問而無需先建立物件。
System. out.println(MyField.CONSTANT_FIELD);
System.out.println("---- ---- ---- ---- ----");
// 類中的靜態欄位可以直接訪問而無需先建立物件。
MyField.staticField = "staticField:\n這是在 MyField 類中的字串靜態欄位。";
System.out.println(MyField.staticField);
System.out.println("---- ---- ---- ---- ----" );
// 類中的成員變數只有在建立物件後才能使用。
final MyField demo = new MyField();
demo.setName("name:\n這是在 MyField 類中的字串成員變數。");
System.out.println(demo.getName());
}
}
/**
* 定義 MyField 類
*
* @author Blume
*/
class MyField {
// 宣告一個常量欄位。
public static final String CONSTANT_FIELD =
"CONSTANT_FIELD:\n這是在 MyField 類中的字串常量欄位。";
// 宣告一個靜態欄位。
public static String staticField;
// 宣告一個成員變數。
private String name;
// 獲取成員變數值。
public String getName() {
return name;
}
// 設定成員變數值。
public void setName(String name) {
// 可插入用於更改成員變數值的條件判斷語句,
// 以防成員變數值被意外或非法更改。
this.name = name;
}
}
/* 輸出結果:
CONSTANT_FIELD:
這是在 MyField 類中的字串常量欄位。
---- ---- ---- ---- ----
staticField:
這是在 MyField 類中的字串靜態欄位。
---- ---- ---- ---- ----
name:
這是在 MyField 類中的字串成員變數。
*/
如上例所示,欄位宣告通常包括下列幾個部分,順序如下:
修飾符
可在欄位宣告的開頭部分新增 public
、protected
或 private
訪問修飾符或者不加,用來表示欄位的訪問控制權限。
也可在訪問修飾符之後新增其他修飾符:
- 若新增
final
修飾符,則表示該欄位的值在初始化後保持不變,即它只接受第一次(在新物件初始化時)賦予它的值,之後在其生命期內無法改變,類似於常量,可當作類的內部常量來使用。 - 若新增
static
修飾符,則表示該欄位可直接訪問而無需先建立物件,可當作類的對外欄位來使用。 - 提示:不允許新增
abstract
修飾符,因為欄位本質上是實體,不存在抽象欄位。否則,Java 編譯器將會生成一條類似於“此處不允許使用修飾符 abstract
”的錯誤訊息。
按照使用修飾符的不同,欄位可分為:
- 常量欄位:宣告為
public static final
的欄位,可視為常量(Constant),它可對所有類共享。由於常量欄位與物件是否建立無關,所以在定義類時就要給定其初始值。如前面示例中的 CONSTANT_FIELD 欄位。 - 靜態欄位:用
static
修飾符來宣告的欄位。如前面示例中的 staticField 欄位。常量欄位也屬於靜態欄位。 - 非靜態欄位:沒有用
static
修飾符來宣告的欄位。如前面示例中的 name 欄位。 - 成員變數:沒有用
final
修飾符來宣告的欄位。本著封裝的精神,將成員變數宣告為private
是值得提倡的。 - 提示:由於宣告為
final
的欄位並非真正意義上的“常量”,也非真正意義上的“變數”,故稱其為“似常量欄位”,也未嘗不可(僅供參考)。
型別
可使用原初型別(Primitive Type):
- boolean:表示一個布林值,它的取值只有兩個:true 和 false。
- char:表示一個單一的 16 位 Unicode 字元,它的取值範圍在 ‘\u0000’(0)至 ‘\uffff’(65535)之間。
- byte:表示一個 8 位有符號位元組,它的取值範圍在 -128 至 127 之間。
- short:表示一個 16 位有符號字(雙位元組),它的取值範圍在 -32768 至 32767 之間。
- int:表示一個 32 位有符號整數,它的取值範圍在 -2147483648 至 2147483647 之間。
- long:表示一個 64 位有符號長整數,它的取值範圍在 -9223372036854775808 至 9223372036854775807 之間。
- float:表示一個 32 位單精度浮點數。
- double:表示一個 64 位雙精度浮點數。
- 提示:“Primitive Type”,在不同的文章和資料中被翻譯為“原始型別”、“內建型別”、“簡單型別”、“基元型別”、“基礎型別”、“基本型別”等等。本文及筆者所寫的其他相關文章中統一稱之為“原初型別”。
也可使用引用型別(Reference Type):
- Boolean:表示一個 boolean 值。
- Character:表示一個 char 值。
- Byte:表示一個 byte 值。
- Short:表示一個 short 值。
- Integer:表示一個 int 值。
- Long:表示一個 long 值。
- Float:表示一個 float 值。
- Double:表示一個 double 值。
- String:表示一個字串。
- Calendar:表示一個精確到毫秒的時刻。
- GregorianCalendar:用公曆來表示一個精確到毫秒的時刻。
- ClassDesc,表示一個對類、介面、陣列或原初型別進行描述的標稱描述符。
- 提示:所有的類名和介面名都可作為引用型別,比如前面示例中的 MyField。
還可使用類、介面或原初型別的陣列型別(Array Type)。
欄位名
除常量欄位外的其他所有欄位,包括區域性變數和引數,都應遵循 Java 官方教程中《變數命名》所示的命名規則和約定。如前面示例中的 name 和 staticField 欄位。
變數的命名規則適用常量欄位名,但約定有所不同:名稱中的字母應全部大寫,單詞之間用下劃線(_
)分隔。如前面示例中的 CONSTANT_FIELD 欄位。
訪問欄位
欄位通過其名稱進行訪問。在訪問時,必須使用明確無誤的名稱。
在方法中,可使用一個簡單名稱來表示其所在類中的欄位:
public String getName() {
return name;
}
在這種情況下,name 是簡單名稱。
引用靜態欄位
由於靜態欄位與物件的建立無關,所以在它所在的類外訪問它時,使用類名或相關表示式,然後是點(.
)操作符,然後是靜態欄位的簡單名稱:
System.out.println(MyField.CONSTANT_FIELD);
System.out.println(MyField.staticField);
引用非靜態欄位
若非靜態欄位沒有宣告為 private
,則在它所在的類外訪問它時,必須使用物件引用或相關表示式,然後是點(.
)操作符,然後是非靜態欄位的簡單名稱。
- 提示:不建議用上述方式來訪問非靜態欄位,因為這違背了面向物件程式設計的基本原則,所以建議將非靜態欄位宣告為
private
。
更改成員變數值
建議將成員變數宣告為 private
,否則可能會產生麵條式程式碼(Spaghetti Code)。如果可在類外更改該類中的成員變數值,那麼該成員變數將會變得不確定,因為任何一段在類外的程式碼都有可能改變其值。
可使用方法來更改成員變數值:
public void setName(String name) {
// 可插入用於更改成員變數值的條件判斷語句,
// 以防成員變數值被意外或非法更改。
this.name = name;
}