1.面向对象的三大特征
其中继承和多态放在后面讲,今天只聊封装
.
2.封装的介绍
举例
如果要我们处理一堆学生的数据,我们可以直接设计一个类,将我们需要处理的数据封装到类当中变为成员变量,然后我们直接创建两个对象,再将数据封装到对象中即可
.
3.封装的好处
1.便于我们维护数据。例如刚才处理学生数据,如果直接定义一大包变量十分臃肿
2.方便使用者使用。使用者无需关心内部实现,只要知道如何使用就行
.
举例:如同一辆车,使用者完全不需要知道汽车内部如何构建运作,使用者只需要知道怎么开车就行
.
4.封装的设计规范
依旧拿汽车举例,商家会把引擎,发动机给使用者看吗,商家只会把拉杆,方向盘暴露出给使用者,而其他没必要的东西都会用壳子包裹隐藏,这就是合理隐藏,合理暴露
.
举例:
如上图,savelog方法是完全服务于call方法的,打完一次电话就会记录,那么savelog方法就应该被隐藏,为什么? 如图
我们如果没有隐藏savelog方法,那么使用者就有可能直接调用savelog方法而略过call方法,但是savelog是服务于call方法的,你连电话都没打,你记录什么?因此,savelog需要被隐藏。但该怎么隐藏呢?
我们只需要把public改成private即可,修改完以后,savelog就只能在Phone这个类里使用,而无法在测试类使用
.
6.权限修饰符
权限修饰符可以修饰成员,即成员变量和成员方法
不同的权限修饰符,所修饰的成员的权限访问大小不同
.
1.private
修饰的成员的访问权限只能在同一个类中 如图
age只能在Student类中使用,无法在测试类中调用,而name可以在测试类中调用
当我们在Student类中调用age没有报错,并且可以在测试类中使用
.
2.(defalut)
修饰的成员的访问权限只能在同一个类中,同一个包中
(defalut) 是默认权限,并不是在变量前面写这个,而是什么都不写 如图
当Student和测试Student同在project包中,访问没问题。当把测试类放到test的包中,访问就报错了
.
3.protected
修饰的成员的访问权限在同一个类中,同一个包中,不同包的子类中
这个之后再说
.
4.public
任意位置,但别太过分,别跨模块就行(day7和day8不同模块)
.
7.案例
如图
年龄为-28明显是错误的,但程序这里不报错,因此,为了数据的安全性,我们必须私有个人信息
错误的数据进不来了,但正确的数据也进不来了,怎么办?先别急,这里我们需要学习两个新的方法
.
针对私有的成员变量,提供对应的set xxx 和get xxx方法
set:设置
get:获取
如图,我们写了一个setAge方法,在该方法里进行判断年龄是否符合常理,符合则给予赋值,否则提示
1000不符合常理,所有就打印了提升,29则给予赋值,没有提示
.
写完setAge还没有结束,我们会发现现在只是给用户提供了设置年龄的渠道,但用户现在没有获取年龄的渠道,无法拿着数据进行其他操作
setAge仅能用于设置,并没有数据返回给setAge,无法用来操作
所以我们还要写一个getAge方法