1. 程式人生 > >深入理解Java中的欄位與屬性的區別

深入理解Java中的欄位與屬性的區別

1、Java中的屬性和欄位有什麼區別?  答:Java中的屬性(property),通常可以理解為get和set方法。 而欄位(field),通常叫做“類成員”,或 "類成員變數”,有時也叫“域”,理解為“資料成員”,用來承載資料的。

這兩個概念是完全不同的。

2、屬性和欄位詳解

 ◆◆欄位(filed) ------------------------------------------------------------------------------------ 類成員(欄位),通常是在類中定義的類成員變數,例如: public class A{     private String s = "123"; } 我們可以說A類中有一個成員變數叫做s,A類有一個欄位s 。

欄位一般用來承載資料,所以為了安全性,一般定義為私有的。

欄位和常量描述了類的資料(域),當這些資料的某些部分不允許外界訪問時, 根據 “物件封裝” 的原則,應儘量避免將一個型別的欄位以公有方式提供給外部。除了final修飾的常量。 一般將其設定為private型別。既然是私有,那外界怎麼訪問呢? 當然是通過Java的屬性方法!

 ◆◆屬性(property) ------------------------------------------------------------------------- 屬性只侷限於類中方法的宣告,並不與類中其他成員相關,屬於JavaBean的範疇。例如: void setA(String s){} String getA(){} 當一個類中擁有這樣一對方法時,我們可以說,這個類中擁有一個可讀寫的a屬性(注意是小寫a)。如果去掉了set的方法,則是可讀屬性,反之亦然。

其規則是:去掉get或set後其剩餘的字串, 如果第二個字母是小寫的,則把第一個字母也變成小寫  getAge---->age  getCPU---->CPU 

比如有下面這個類:  注:下面的User類不是JavaBean。

關於JavaBean、PO、DTO等概念的區別,請參考我的另外一篇博文《什麼是JavaBean、Bean、POJO?》

public class User {     private String id; //私有欄位     private String name; //私有欄位     private String identifier = "440282199008098076"; //私有欄位     public String getId() { //id的可讀屬性         return id;     }     public void setId(String id) { //id的可寫屬性         this.id = id;     }     public String getName() { //name的可讀屬性         return name;     }     public void setName(String name) { //name的可寫屬性         this.name = name;     }     public String getIdentifier() { //identifier只有一個get方法,所以它是隻讀屬性         return identifier;     }     public final static Integer SHOW_STATUS_YES = 1; //公共欄位     public final static Integer SHOW_STATUS_No = 0; //公共欄位 }

當我操作這個類時,比如呼叫getName()方法時,我們要說是獲得name屬性,呼叫setName(String name)方法時要說設定name屬性,因為對我們來說name欄位是私有的,我們操作該Person類時根本看不到有這個name欄位 。 一個類主要包括欄位、屬性和方法。屬性在此時指的就是get/set訪問器。

同時我們可以看到,這個類有3個屬性,5個欄位。 SHOW_STATUS_YES 為公用欄位,一般修飾為final static型別,可以通過User類直接訪問該欄位。  getIdentifier為只讀屬性,只能讀取私有的identifier欄位,這樣就起到了保護資料的安全性的作用。 id和name為私有欄位,且有兩個操作他們的public屬性。可以通過getId()、setId(String id)、getName()、setName(String name)來讀取和設定他們的值。

更形象的說就是:屬性是對欄位的封裝,供外部訪問。 通常屬性將相應的私有欄位通過封裝成公共屬性,以便於外界訪問和修改。當然你在封裝成屬性時,也可以設定該屬性為只讀,可讀寫等等許可權。

為了便於測試加上toString方法:

public class User {    //其他程式碼同上...         @Override     public String toString() { //只有擁有屬性的欄位,才會被toString方法呼叫         return "User [id=" + id + ", name=" + name + ", identifier=" + identifier + "]";     } }

測試類:

public class UserTest {     public static void main(String[] args) {         User user = new User();         user.setId("100");         user.setName("chunlynn");         String identifier = user.getIdentifier();         System.out.println("identifier==" + identifier);         // 4402322BDFV323230001         System.out.println(user);         // User [id=100, name=chunlynn, identifier=4402322BDFV323230001]         Integer status = User.SHOW_STATUS_YES; // public欄位的訪問         System.out.println(status);         // 1     } }

雖然在實際專案的開發過程中,公共欄位和屬性在合適的條件下都可以使用,但是我們應該儘可能的使用屬性(property),而不是資料成員(field);

把所有的欄位都設定為私有欄位,如果要暴露它們,則把它們封裝成屬性,這也是最佳實踐推薦的方式。除了一些常量不能修改的欄位,可以設定為public final static型別。

3、總結:

區別開屬性與欄位是為了更好的實現資料安全,比如當我們想給一個類的屬性賦值或者其他類用到了,就需要將這個欄位設定為public,然而這樣可以對欄位進行任意的讀寫操作,非常不利於資料安全。於是就加上了屬性,簡單說屬性實現了欄位的封裝,屬性有get、set 方法來控制欄位,該欄位的屬性只有set方法沒有get方法,就只可以對該方法進行賦值操作,沒有讀操作,反之亦然。就是對對欄位的操作通過屬性來控制。

可以建立屬性,將欄位和屬性封裝在一起。通過屬性可以像訪問欄位一樣訪問資料成員,實現資料的封裝,避免使用非法資料賦值,保證資料完整性,同時類內部發生修改時,避免整個程式的修改。

基於get,set方法的反射不會破壞物件資料,IDE可以通過約定做些智慧提示。如果你自己用反射,你想做些通用處理,去遍歷每個欄位,沒人跟你說哪個欄位能寫,那個能讀,你沒法處理嘛。

在我們專案中用到屬性和欄位的多半就是POJO、JavaBean、DTO、VO等等了。 標準的JavaBean: JavaBean是一種特殊的類,主要用於傳遞資料資訊,這種類中的方法主要用於訪問私有的欄位,且方法名符合某種命名規則。如果在兩個模組之間傳遞資訊,可以將資訊封裝進JavaBean中,這種物件稱為“值物件”(Value Object),或“VO”,有時也叫DTO(資料傳輸物件)。方法比較少。這些資訊儲存在類的私有變數中,通過set()、get()獲得。

JavaBean在Java EE開發中,通常用於封裝資料,對於遵循以上寫法的JavaBean元件,其它程式可以通過反射技術例項化JavaBean物件(內省機制),並且通過反射那些遵循命名規範的方法,從而獲知JavaBean的屬性,進而呼叫其屬性儲存資料。