课时7:成员属性分装
摘要:我们先来了解一下属性封装。在Java中,成员由属性和方法构成,一般来说,方法是对外提供服务的,通常不会进行封装处理,而属性由于需要较高的安全性,往往要对其加以保护,也就是要用封装性来处理、保护属性。
举个例子,就像给同学改名字,得经过民政、公安等一层层手续,档案也要改,可见名字的安全性要求比较高,不能随意改动。
在默认情况下,Java里的类的属性可以被其他类通过对象进行调用。比如看这样一个简单的代码示例,定义“Person per
”,代码编译执行后,我们能发现,在外部可以直接修改或者访问属性,这就意味着属性并没有得到保护。
虽然代码编译执行结果可能看起来正常,像显示“张三,18
”,但要是把年龄改成“-18”,对于普通人来说,这显然不符合实际情况,也就是说在属性不封装的情况下,存在外部可能设置错误数据的问题,因为在“Person”类中提供的像“Name”“Age”这些属性并没有进行封装处理,外部能直接调用。
要是想解决这类问题,就可以利用Perivate关键字对属性进行封装处理。比如在代码里,把之前的代码拿过来,然后在相应地方增加“Perivate”关键字,在代码里追加这两个关键字来进行处理。
在追加“Perivate”关键字完成对属性的封装后,再进行编译会发现,外部不能直接访问这些属性了,也就是对外部不可见,但在类的内部是可见的。
要是想让外部程序可以访问已封装的属性,在开发规范中有相应要求,可以通过设置(Setter)或获取(Getter)属性的方法来实现,设置或取得属性的方法写成“setXxx(),getXxx()
,以Perivate String Name
为例,设置属性为获取属性的方法写成Public void set name(string n)
这样的形式,获取属性方法写成Public string get nam()
。
在代码里具体操作时,像给属性赋值就不用直接用属性了,而是用对应的方法,比如“setName(...)
”“setAge(...)
”这些。如果想对赋值做检测也是可以的,比如规定年龄“a”大于等于0时才赋值,不然就赋值为0。
要记住,以后在进行Java开发定义时,类中的所有属性基本都要用“Perivate”进行封装,这适用于绝大多数情况,而且属性若要被访问,必须提供Setter与Getter方法。
另外,封装性是面向对象的第一大主要特征,它不光是简单的属性封装,还和访问权限有关,不过关于访问权限后续会再做说明,总之在开发过程中,把属性加上“Perivate”封装是标准做法。