Java中的字段和屬性到底有什么區(qū)別栽惶?

Java中的字段和屬性到底是什么?他們的含義真的是相同的嗎疾嗅?如果不同外厂,那他們到底又分別是何含義呢?
相信上面的問題代承,對(duì)于很多Java初學(xué)者都是相當(dāng)困惑的汁蝶,但是好像把他們理解為一個(gè)含義也沒啥問題,很多Javaer也就這么放過這個(gè)問題了论悴,但是遇到如下兩個(gè)問題掖棉,你能正確解決并給出問題出現(xiàn)的原因嗎?
先給出如下的一個(gè)JavaBean

public class UserInfoVo {

    private boolean isCool;
    private String Name;
    private String aGe;
    private String BIrthday;
    private String address;

    public String getaddress() {
        return address;
    }

    public void setaddress(String address) {
        this.address = address;
    }

    public boolean isCool() {
        return isCool;
    }

    public void setCool(boolean cool) {
        isCool = cool;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getaGe() {
        return aGe;
    }

    public void setaGe(String aGe) {
        this.aGe = aGe;
    }

    public String getBIrthday() {
        return BIrthday;
    }

    public void setBIrthday(String BIrthday) {
        this.BIrthday = BIrthday;
    }
}

問題一

假設(shè)我們現(xiàn)在要在spring的配置文件中配置上述JavaBean的一個(gè)實(shí)例膀估,如下幔亥。暫時(shí)不設(shè)置除Id外其他屬性值。

<bean id="userInfo" class="com.dfz.UserInfoVo">
   <property name="aGe" value="xxxxxxxx"/>
</bean>

當(dāng)我們啟動(dòng)spring容器時(shí)察纯,我們將得到如下錯(cuò)誤帕棉,這個(gè)錯(cuò)誤具有很強(qiáng)的誤導(dǎo)性,明明類中定義了aGe饼记,也提供了setter方法香伴,為什么報(bào)錯(cuò)說(shuō)找不到?

問題二

在使用JSP的時(shí)候握恳,頁(yè)面返回ModelAndView瞒窒,且返回一個(gè)UserInfo實(shí)例類,在JSP頁(yè)面中使用isCool時(shí)乡洼,頁(yè)面報(bào)錯(cuò)說(shuō)找不到,或者返回json數(shù)據(jù)時(shí)匕坯。


企業(yè)微信截圖_0bb7396f-fbb9-4296-8a99-b5fc7957d44d.png

解決方案

很多有經(jīng)驗(yàn)的Javaer對(duì)于上述兩個(gè)問題都能很好的解決束昵,但很少有人能給出問題出現(xiàn)的原因。這里我們也先給出這兩個(gè)問題的解決方案葛峻,之后再給出問題出現(xiàn)的原因锹雏。

  1. 字段名的前兩個(gè)字母要么全大寫,要么全小寫
  2. boolen類型的字段不要以is開頭(這里阿里巴巴的開發(fā)者手冊(cè)也重點(diǎn)強(qiáng)調(diào)了)

問題出現(xiàn)的原理

對(duì)于這兩個(gè)問題出現(xiàn)的原理术奖,歸根結(jié)底就是開發(fā)者對(duì)于Java中字段和屬性的含義模糊不清導(dǎo)致的礁遵。

字段

Java中字段的含義就是Java類中定義的成員變量轻绞,可以通過Java的反射機(jī)制獲取所有的字段名,Class#getFields()方法或者Class#getDeclaredFields()方法佣耐,這里可以看出field其實(shí)就是字段的意思政勃。

屬性

Java中的屬性,其實(shí)是相對(duì)于JavaBean來(lái)說(shuō)的兼砖。所以在Java中奸远,正確的說(shuō)法應(yīng)該是JavaBean中有XXX屬性,Java類中有OOO字段或成員變量讽挟。屬性的英文翻譯是property

BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
    System.out.println(propertyDescriptor.getName());
}

如上代碼就會(huì)輸出UserInfo類對(duì)應(yīng)的JavaBean的所有屬性名


輸出結(jié)果

可以看出一共有class懒叛、cool、dizhi耽梅、id四個(gè)屬性薛窥,其中class屬性我們暫時(shí)先不管。在XML中的配置或者JSP頁(yè)面以及JSON序列化眼姐,其實(shí)都是使用的JavaBean的屬性拆檬,而不是Java中定義的字段。那么對(duì)于前面說(shuō)的兩個(gè)問題也就很容易解釋了妥凳。對(duì)于問題一竟贯,我們?cè)赬ML中配置了iD值,但JavaBean中確實(shí)是沒有這個(gè)屬性的逝钥,只有id屬性屑那。對(duì)于問題二也是一樣,JavaBean中只有cool屬性艘款。

總結(jié)

在Java中很少有直接操作類字段的情況持际,大部分都是操作JavaBean的屬性,所以要了解好屬性名的規(guī)則哗咆,牢記上面的解決方案蜘欲,真不小心遇到問題,知道了背后的原理晌柬,相信也會(huì)很容易解決的姥份。
JavaBean的屬性名其實(shí)就是Java類中定義的setter或者getter方法名,去掉set或者get或者is得到的字符串年碘,判斷首字母是否是小寫澈歉,如是,則該字符串就是屬性名屿衅,否則再判斷第二個(gè)字母是否是大寫埃难,如是鉴扫,則該字符串就是屬性名园蝠,否則將首字母小寫得到的名稱就是屬性名,比如getDizhi()方法屬性名就是dizhigetdizhi()方法屬性名也是dizhi涯贞,getdIzhi()方法屬性名就是dIzhi,getDIzhi()方法屬性名就是DIzhi,其中bool類型的屬性的get方法名不是以get開頭热监,而是以is開頭展姐。對(duì)于只有g(shù)et或者只有set方法的屬性矾飞,我們就說(shuō)他是只讀或只寫屬性。之所以規(guī)定Java的字段定義不準(zhǔn)以is開頭且首兩個(gè)字母要么都大寫要么都小寫座泳,就是為了讓JavaBean的屬性名與字段名一致惠昔,這樣對(duì)于初學(xué)者就不會(huì)造成一定的困惑,即是不了解也能正常使用挑势。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镇防,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子潮饱,更是在濱河造成了極大的恐慌来氧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件香拉,死亡現(xiàn)場(chǎng)離奇詭異啦扬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凫碌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門扑毡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人盛险,你說(shuō)我怎么就攤上這事瞄摊。” “怎么了苦掘?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵换帜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鹤啡,道長(zhǎng)惯驼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任递瑰,我火速辦了婚禮祟牲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泣矛。我一直安慰自己疲眷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布您朽。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哗总。 梳的紋絲不亂的頭發(fā)上几颜,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音讯屈,去河邊找鬼蛋哭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涮母,可吹牛的內(nèi)容都是我干的谆趾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼叛本,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沪蓬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起来候,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跷叉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后营搅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體云挟,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年转质,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了园欣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡休蟹,死狀恐怖沸枯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸡挠,我是刑警寧澤辉饱,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站拣展,受9級(jí)特大地震影響彭沼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜备埃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一姓惑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧按脚,春花似錦于毙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脖旱。三九已至,卻和暖如春介蛉,著一層夾襖步出監(jiān)牢的瞬間萌庆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工币旧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留践险,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓吹菱,卻偏偏與公主長(zhǎng)得像巍虫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳍刷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348