深入理解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的屬性,進而調用其屬性保存數據。