Java 字段
前言
- 本文原創作者為 Blume,版權歸原創作者所有。
- 本文主要內容根據 Java 官方教程中《課程:語言基礎》和《課程:類和對象》的相關章節編寫而成。
- 本文更新(修訂)於 2021 年 4 月 3 日。
- 本文網址為
https://www.cnblogs.com/blume/p/14593737.html
- 商業性轉載請聯系原創作者,非商業性轉載請注明出處。
概述
字段(Field),是 Java 編程語言中類的一個成員,主要用來存儲對象的狀態(如同某些編程語言中的變量),所以有時也可稱為成員字段或成員變量。
聲明字段
/** * 字段示例 * * @author Blume */ public class FieldDemo { public static void main(String[] args) { // 類中的常量字段可直接訪問而無需創建對象。 System.out.println(MyField.CONSTANT_FIELD); System.out.println("---- ---- ---- ---- ----"); // 類中的靜態字段可直接訪問而無需創建對象。 MyField.sharedField = "sharedField:\n這是在 MyField 類中的字符串靜態字段。"; System.out.println(MyField.sharedField); 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 sharedField; // 聲明一個實例變量。 private String name; // 獲取實例變量值。 public String getName() { return name; } // 設置實例變量值。 public void setName(String name) { // 可插入用於更改實例變量值的條件判斷語句, // 以防實例變量值被意外或非法更改。 this.name = name; } } /* 輸出結果: CONSTANT_FIELD: 這是在 MyField 類中的字符串常量字段。 ---- ---- ---- ---- ---- sharedField: 這是在 MyField 類中的字符串靜態字段。 ---- ---- ---- ---- ---- name: 這是在 MyField 類中的字符串實例變量。 */
如上例所示,字段聲明通常包括下列幾個部分,順序如下:
修飾符
可在字段聲明的開頭部分添加 public、protected 或 private 訪問修飾符或者不加,用來表示字段的訪問控制級別。
也可在訪問修飾符之后添加其他修飾符:
- 若添加
final
修飾符,則表示該字段的值在初始化后保持不變,即它只接受首次分配給它的值,之后在其生命期內無法改變,類似於常量,可作為對字段值的一種限定和保護。 - 若添加
static
修飾符,則表示該字段可直接訪問而無需創建對象。或者說,這是在告訴 Java 編譯器,無論該字段所在的類被實例化了多少次,該字段始終都存在,故可作為該類所有實例的共有字段。 - 提示:不允許添加
abstract
修飾符,因為字段本質上是實體,不存在抽象字段。否則,Java 編譯器將會生成一條類似於“此處不允許使用修飾符 abstract”的錯誤消息。
分類
按使用修飾符的不同,字段可分為:
- 常量字段:聲明為 static final 的字段,可視為常量(Constant)。由於常量字段與對象是否創建無關,所以在定義類時就要給定其初始值。如前面示例中的 CONSTANT_FIELD 字段。
- 靜態字段(Static Field):聲明為 static 的字段。常量字段和類變量都屬於靜態字段。
- 非靜態字段(Non-Static Field):沒有聲明為 static 的字段。又可稱為實例變量。
- 成員變量(Member Variable):除常量字段外的其他所有字段。
類型
可使用原初類型(Primitive Type):
- boolean:表示一個布爾值,它的取值只有兩個:
true
和false
。 - char:表示一個單一的 16 位 BMP 字符,它的取值范圍在
'\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:表示一個字符串。
- ClassDesc,表示一個對類、接口、數組或原初類型進行描述的標稱描述符。
- 提示:所有的類名和接口名都可作為引用類型,比如前面示例中的 MyField。
還可使用類、接口或原初類型的數組類型(Array Type)。比如,int[] 表示一個 int 原初類型的一維數組類型(請參閱 arrayType(int) 示例)等。
字段名
所有變量,無論是成員變量、局部變量還是參數,都應遵循以下的命名規則和約定:
- 變量名可以是任何合法的標識符:
- 字母(
a
-z
、A
-Z
):長度不限。 - 數字(
0
-9
):長度不限。 - 美元符(
$
):按慣例,根本不使用美元符。一些自動生成的名稱中可能會包含美元符(請參閱 nested(String) 示例),但變量名應始終避免使用它。 - 下划線(
_
):按慣例,變量名不使用下划線。下划線只用於常量字段名。 - 不允許使用空格符。
- 字母(
- 按慣例,變量名以字母開頭,后續字符可以是字母或數字。
- 從技術上講,以美元符或下划線開頭是合法的,但不鼓勵這種做法。
- 后續字符應避免使用美元符和下划線,盡管這樣做也是合法的。
- 不允許以數字開頭。
- 為變量選擇名稱時,請使用完整單詞,這樣做可使代碼更易於閱讀和理解。
- 應避免使用晦澀難懂的縮寫。
- 不允許將關鍵字或保留字用作變量名。如
package
、import
、class
、interface
、default
等等。
- 變量名對大小寫敏感,如
demo
和DEMO
將視為兩個名稱。
除下列兩項外,變量的命名規則和約定適用常量字段:
- 名稱中的字母應全部大寫。
- 若由多個單詞組成,則單詞之間用下划線分隔。如前面示例中的 CONSTANT_FIELD 字段。
訪問字段
字段通過其名稱進行訪問。在訪問時,必須使用明確無誤的名稱。
在方法中,可使用一個簡單名稱來表示其所在類中的字段:
public String getName() { return name; }
在這種情況下,name 是簡單名稱。
引用靜態字段
由於靜態字段與對象的創建無關,所以在訪問它時,使用類名或相關表達式,然后是點(.
)操作符,然后是靜態字段的簡單名稱:
System.out.println(MyField.CONSTANT_FIELD);
System.out.println(MyField.sharedField);
引用非靜態字段
若非靜態字段沒有聲明為 private,則在它所在的類外訪問它時,必須使用對象引用或相關表達式,然后是點(.
)操作符,然后是非靜態字段的簡單名稱。
- 提示:不建議用上述方式來訪問非靜態字段,因為這違背了面向對象編程的基本原則,所以建議將非靜態字段聲明為 private。
更改實例變量值
建議將實例變量聲明為 private,否則可能會產生面條式代碼(Spaghetti Code)。如果可在類外更改該類中的實例變量值,那么該實例變量將會變得不確定,因為任何一段在類外的代碼都有可能改變其值。
可使用方法來更改實例變量值:
public void setName(String name) { // 可插入用於更改實例變量值的條件判斷語句, // 以防實例變量值被意外或非法更改。 this.name = name; }