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

深入理解Java中的字段與屬性的區別

ring rgs name 私有變量 pub tail 博文 們的 方式

轉載出處 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的屬性,進而調用其屬性保存數據。

深入理解Java中的字段與屬性的區別