
5.3 成员属性封装

面向对象的第一大特性指的就是封装性,而封装性最重要的特点就是内部结构对外不可见。在之前的操作中可以发现所有类中的成员属性都可以直接通过实例化对象在类的外部进行调用,而这样的调用是不安全的,那么此时最稳妥的做法就是利用private实现成员属性的封装处理。而一旦使用了private封装之后,是不允许外部对象直接访问成员属性的,而此时的访问则需要按照Java的开发标准定义setter()、getter()方法处理。
setter(以“private String name”属性为例):public void setName(String n)。
getter(以“private String name”属性为例):public String getName()。
提示:关于完整的封装性定义。
封装是本书为读者讲解的第一个面向对象特征,实际上在一个类之中不仅可以针对成员属性封装,还可以针对方法、内部类实现封装,本处暂时只讨论成员属性封装。
严格来讲,封装是程序访问控制权限的处理操作,在Java中访问控制权限一共有4种:public、protected、default(默认、什么都不写)、private,具体的概念将在本书第10章中为读者讲解。
范例:使用private实现封装


本程序利用了private关键字实现了Person类中成员属性的封装,这样对于name与age的使用就只能够限定在Person类之中。如果外部操作要修改对象成员属性的内容则就必须按照要求通过setter()或getter()方法进行调用。
提问:为什么现在没有在程序中使用getter()方法?
在本程序定义Person类的时候存在了getName()和getAge()方法,但是发现在程序中并没有使用这两个方法,那么定义它们还有什么用?
回答:虽然这两个方法在本程序未被使用,但它们确实是一个需要共同遵守的标准。
在类之中的属性定义setter()、getter()操作方法的目的就是为了设置和取得属性的内容,也许某一个操作暂时不需要使用到getter()操作,但并不表示以后不会使用,所以从开发角度来讲,必须全部提供。
对此,本书给出重要的开发规则:以后在定义类的时候,类中所有的普通成员属性都要通过private封装,封装之后的属性需要编写相应的setter()、getter()方法才可以被外部所使用。
另外,在编写setter()或getter()方法时是否添加一些逻辑验证并不是必需的,本书在setAge()方法上添加的逻辑判断,只是为了加强程序功能。