1. 程式人生 > 其它 >Java | 欄位(Field)

Java | 欄位(Field)

Java 欄位欄位

前言


【目錄】

概述


欄位(Field),是 Java 中類的一個成員,用來儲存

物件的狀態(如同某些程式語言中的變數),所以有時也可稱為成員欄位或成員變數(Member Variable)。

在類中,具有下列幾種變數:

  • 類中的成員變數,稱為欄位。
  • 方法或程式碼塊中的變數,稱為區域性變數(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 類中的字串成員變數。 */

如上例所示,欄位宣告通常包括下列幾個部分,順序如下:

  1. 零個、一個或多個修飾符,如 publicprivatestaticfinal 等。
  2. 型別
  3. 欄位名

【目錄】

修飾符

可在欄位宣告的開頭部分新增 publicprotectedprivate 訪問修飾符或者不加,用來表示欄位的訪問控制權限。

也可在訪問修飾符之後新增其他修飾符:

  • 若新增 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,否則可能會產生麵條式程式碼(Spaghetti Code)。如果可在類外更改該類中的成員變數值,那麼該成員變數將會變得不確定,因為任何一段在類外的程式碼都有可能改變其值。

可使用方法來更改成員變數值:

    public void setName(String name) {

        // 可插入用於更改成員變數值的條件判斷語句,
        // 以防成員變數值被意外或非法更改。
        this.name = name;
    }

【目錄】