Java 中 field 和 variable 區別及相關術語解釋

FreedomF2發表於2020-11-13

這是一個以前從沒仔細想過的問題——最近在閱讀《Java Puzzlers》,發現其大量使用了“域”這個詞,這個詞個人很少見到,在這本書中倒是時常出現,所以在好奇心的驅使下搜尋了一下相關的內容,順便複習了一下基礎,最後整理如下。

先說一下 field 和 variable 之間的區別:

class variables and instance variables are fields while local variables and parameter variables are not. All fields are variables.

成員變數(field)是指類的資料成員,而方法內部的區域性變數(local variable)、引數變數(parameter variable)不能稱作 field。field 屬於 variable,也就是說 variable 的範圍更大。

術語解釋:

  1. 域或欄位、例項變數、成員變數 (field, instance variable, member variable, non-static field)

    field: A data member of a class. Unless specified otherwise, a field is not static.

    • 非 static 修飾的變數。
    • 雖然有如上定義,但是一般在使用時,成員變數(field)包括 instance variable 和 class variable。為了區分,個人認為,用例項變數/非靜態變數(instance variable / non-static field)描述上面的定義更佳。
    • 成員變數與特定的物件相關聯,只能通過物件(new)訪問。
    • 宣告在類中,但不在方法或構造方法中。
    • 如果有多個物件的例項,則每一個例項都會持有一份成員變數,例項之間不共享成員變數的資料。
    • 作用域比靜態變數小,可以在類中或者非靜態方法中使用以及通過生成例項物件使用。(訪問限制則不可用)
    • JVM在初始化類的時候會給成員變數賦初始值。

    Example:

      public class FieldTest {
           private int Xvalue; // Xvalue  is a field
           public void showX() {
                System.out.println("X is: " + xValue);
           }
      }
    

2. 類欄位、靜態欄位、靜態變數(class variable, static field, staic variable)

  • 使用 static 修飾的欄位,一般叫做靜態變數。
  • 宣告在類中,但不在方法或構造方法中。
  • 多個例項物件共享一份靜態變數
  • JVM在準備類的時候會給靜態變數賦初始值。
  • 作用域最大,類中都可以訪問,或通過 類名.變數名 的方式呼叫(訪問限制則不可用)。

    Example:

    System.out.println(Integer.MAX_VALUE);
    

3. 區域性變數(local variable)

  • 定義在一個區塊內(通常會用大括號包裹),沒有訪問修飾符,區塊外部無法使用的變數。
  • 沒有預設值,所以必須賦初始值
  • 生命週期即為方法的生命週期

    Example:

    if(x > 10) {
        String local = "Local value";
    }
    

4. 引數(input parameter, parameter (variable), argument)

引數,這個就不多說了,要注意的是 argument 和 parameter 的區別(下文)。
另外,Oracle 官方將引數分為了構造引數、方法引數和異常引數三部分。 Example:

    public class Point {
        private int xValue;
        public Point(int x) {
            xValue = x;
        }
        public void setX(int x) {
            xValue = x;
        }
    }

Strictly speaking, a parameter is a variable within the definition of a method. An argument would be the data or actual value which is passed to the method. An example of parameter usage: int numberAdder(first, second) An example of argument usage: numberAdder(4,2)

5. 不可變數、常量(final variable, constant)

使用 final 關鍵詞修飾的變數。不可變數屬於成員變數。

6. 成員(member)

A field or method of a class. Unless specified otherwise, a member is not static.

指的是類中非靜態的成員變數或方法。(用法同field)

7. 屬性(property)

Characteristics of an object that users can set, such as the color of a window.

可被使用者設定或獲取的物件特徵即為屬性。
POJO 或 JavaBean 中的成員變數也稱作屬性(具有set、getter方法)。

補充了這些,想問問大家,重寫(Override)、過載(Overload)你掌握的如何?是否又聽說過 Java 中的隱藏(Hide)、遮蔽(Shadow)、遮掩(obscure)機制?

最後,總結一下國內目前的慣用法(英文取其一,序號對應上文):

  1. field -> 成員變數, instance variable / non-static field -> 例項變數/非靜態變數
  2. class variable -> 靜態變數
  3. local variable -> 本地變數
  4. input parameter -> 引數
  5. final variable -> 常量
  6. member -> 成員(用法同field)
  7. property -> 屬性

參考資料:

fields-vs-variables-in-java
http://docs.oracle.com/javase/tutorial/information/glossary.html https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12

相關文章