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
相關文章
- 樹的定義及相關術語
- Linux中&&和&,|和||用法及區別詳解!Linux
- Java程式和執行緒關係及區別Java執行緒
- 區塊鏈相關名詞解釋(一)區塊鏈
- 註解和註釋區別
- BGP 相關術語
- java中==和equlas區別Java
- 堆和棧的解釋和區別
- 解釋型語言、編譯型語言 區別編譯
- 樹的相關術語
- Java中陣列及相關類的使用Java陣列
- 《區塊鏈常用術語解釋》彙總區塊鏈
- WebGL和OpenGL的區別及關係Web
- CountDownLatch和CyclicBarrier區別及詳解CountDownLatch
- java 中equals和==的區別Java
- JAVA 中interface 和 abstract 區別Java
- java中size()和length區別Java
- Java中 equals() 方法和 == 的區別Java
- Java中Vector和ArrayList的區別Java
- 【Java初探01】——Java簡介及相關Java
- 圖解Linux的IO模型和相關技術圖解Linux模型
- 廣告系統相關術語
- java語言相關的問題Java
- 編譯語言、解釋語言與指令碼語言之間的區別編譯指令碼
- MyBatis中#{}和${}的區別詳解MyBatis
- Java中抽象類和介面的區別Java抽象
- GO語言中string和[]byte的區別及轉換Go
- python語言中類和函式的作用及區別!Python函式
- 關於機器學習和AI的區別最經典的解釋機器學習AI
- 解讀數倉中的資料物件及相關關係物件
- http中session和cookie的區別和關係HTTPSessionCookie
- 關於java的引用和c++的區別JavaC++
- Go 語言 new 和 make 關鍵字的區別Go
- 【機器學習】——白話入門及術語解釋機器學習
- windows memeory 記憶體相關術語Windows記憶體
- Java中類與物件的關係與區別Java物件
- Java中 識別符號、關鍵字、保留字的一些解釋Java符號
- 閒說: Java 中Comparable 和 Comparator 的區別Java