Java 中 field 和 variable 區別及相關術語解釋
這是一個以前從沒仔細想過的問題——最近在閱讀《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 的範圍更大。
術語解釋:
-
域或欄位、例項變數、成員變數 (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)機制?
最後,總結一下國內目前的慣用法(英文取其一,序號對應上文):
- field -> 成員變數, instance variable / non-static field -> 例項變數/非靜態變數
- class variable -> 靜態變數
- local variable -> 本地變數
- input parameter -> 引數
- final variable -> 常量
- member -> 成員(用法同field)
- 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
相關文章
- oracle相關術語的解釋Oracle
- 西文字型相關術語解說及《乾貨分享》
- Java程式和執行緒關係及區別Java執行緒
- Linux中&&和&,|和||用法及區別詳解!Linux
- Java相關技術點及技術內容Java
- 資料庫中的相關術語資料庫
- 區塊鏈相關名詞解釋(一)區塊鏈
- BGP 相關術語
- 註解和註釋區別
- java中==和equlas區別Java
- 堆和棧的解釋和區別
- Java中陣列及相關類的使用Java陣列
- 解釋和編譯的區別編譯
- java 中equals和==的區別Java
- JAVA 中interface 和 abstract 區別Java
- Java中equals和==的區別Java
- java中size()和length區別Java
- 解釋型語言、編譯型語言 區別編譯
- 《區塊鏈常用術語解釋》彙總區塊鏈
- WebGL和OpenGL的區別及關係Web
- 關於機器學習和AI的區別最經典的解釋機器學習AI
- CountDownLatch和CyclicBarrier區別及詳解CountDownLatch
- 【機器學習】——白話入門及術語解釋機器學習
- Mybatis中#{}和${}傳參的區別及#和$的區別小結MyBatis
- 廣告系統相關術語
- Java中Vector和ArrayList的區別Java
- Java中 equals() 方法和 == 的區別Java
- java中的==和equal的區別Java
- 對於java中的"\"和"/" 區別Java
- Java中ArrayList和LinkedList區別Java
- 在java中“equals”和“==”的區別Java
- Java中throw和throws的區別Java
- Java中堆和棧的區別Java
- 解釋型語言與編譯型語言的區別?編譯
- 【Java初探01】——Java簡介及相關Java
- java 相關技術與框架Java框架
- MyBatis中#{}和${}的區別詳解MyBatis
- 大資料相關術語(1)大資料