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

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

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

轉載出處 http://blog.csdn.net/chenchunlin526/article/details/69939337

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的屬性,進而呼叫其屬性儲存資料。

學習使我充實,分享給我快樂!