Java中的字段和属性到底有什么区别?

Java中的字段和属性到底是什么?他们的含义真的是相同的吗?如果不同,那他们到底又分别是何含义呢?
相信上面的问题,对于很多Java初学者都是相当困惑的,但是好像把他们理解为一个含义也没啥问题,很多Javaer也就这么放过这个问题了,但是遇到如下两个问题,你能正确解决并给出问题出现的原因吗?
先给出如下的一个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;
    }
}

问题一

假设我们现在要在spring的配置文件中配置上述JavaBean的一个实例,如下。暂时不设置除Id外其他属性值。

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

当我们启动spring容器时,我们将得到如下错误,这个错误具有很强的误导性,明明类中定义了aGe,也提供了setter方法,为什么报错说找不到?

问题二

在使用JSP的时候,页面返回ModelAndView,且返回一个UserInfo实例类,在JSP页面中使用isCool时,页面报错说找不到,或者返回json数据时。


企业微信截图_0bb7396f-fbb9-4296-8a99-b5fc7957d44d.png

解决方案

很多有经验的Javaer对于上述两个问题都能很好的解决,但很少有人能给出问题出现的原因。这里我们也先给出这两个问题的解决方案,之后再给出问题出现的原因。

  1. 字段名的前两个字母要么全大写,要么全小写
  2. boolen类型的字段不要以is开头(这里阿里巴巴的开发者手册也重点强调了)

问题出现的原理

对于这两个问题出现的原理,归根结底就是开发者对于Java中字段和属性的含义模糊不清导致的。

字段

Java中字段的含义就是Java类中定义的成员变量,可以通过Java的反射机制获取所有的字段名,Class#getFields()方法或者Class#getDeclaredFields()方法,这里可以看出field其实就是字段的意思。

属性

Java中的属性,其实是相对于JavaBean来说的。所以在Java中,正确的说法应该是JavaBean中有XXX属性,Java类中有OOO字段或成员变量。属性的英文翻译是property

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

如上代码就会输出UserInfo类对应的JavaBean的所有属性名


输出结果

可以看出一共有class、cool、dizhi、id四个属性,其中class属性我们暂时先不管。在XML中的配置或者JSP页面以及JSON序列化,其实都是使用的JavaBean的属性,而不是Java中定义的字段。那么对于前面说的两个问题也就很容易解释了。对于问题一,我们在XML中配置了iD值,但JavaBean中确实是没有这个属性的,只有id属性。对于问题二也是一样,JavaBean中只有cool属性。

总结

在Java中很少有直接操作类字段的情况,大部分都是操作JavaBean的属性,所以要了解好属性名的规则,牢记上面的解决方案,真不小心遇到问题,知道了背后的原理,相信也会很容易解决的。
JavaBean的属性名其实就是Java类中定义的setter或者getter方法名,去掉set或者get或者is得到的字符串,判断首字母是否是小写,如是,则该字符串就是属性名,否则再判断第二个字母是否是大写,如是,则该字符串就是属性名,否则将首字母小写得到的名称就是属性名,比如getDizhi()方法属性名就是dizhigetdizhi()方法属性名也是dizhigetdIzhi()方法属性名就是dIzhi,getDIzhi()方法属性名就是DIzhi,其中bool类型的属性的get方法名不是以get开头,而是以is开头。对于只有get或者只有set方法的属性,我们就说他是只读或只写属性。之所以规定Java的字段定义不准以is开头且首两个字母要么都大写要么都小写,就是为了让JavaBean的属性名与字段名一致,这样对于初学者就不会造成一定的困惑,即是不了解也能正常使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342