欢迎来到天天文库
浏览记录
ID:34504536
大小:149.56 KB
页数:4页
时间:2019-03-07
《黑马程序员【java基础】面向对象-类的封装》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、封装是指隐藏对象的属性和实现细节,仅仅对外公开接口。封装能为软件系统带来以下优点:1:便于正确方便的理解和使用系统,防止使用者错误修改系统的属性。以供电系统为例,过去房屋隔壁的上方都是电线,现在的房屋电线都看不见了,在墙壁上只露出一些电源插口,为啥要把电线隐藏起来呢?理由很简单,暴露在外面的电线既不安全也不美观。再比如电视剧系统,尽管本身的实现很复杂,但用户很方便,电视剧的实现细节都被藏在壳子里面,没有必要向用户公开。2:有助于建立各个系统之间的松耦合关系,提供系统的独立性。当一个系统的实现发送变化时,只要它的接口不变,就不会影响其他的系统
2、。3:提供软件的可重用性,每个系统都是一个相对独立的整体,可以在多种环境下得到重用。例如,干电池就是独立的,它可以在手电筒,相机中都能发挥作用。4:降低构建大型系统的风险,即使整个系统不成功,个别独立的系统可能仍然有价值。例如相机坏了,里面的电池还是有用的,还可以安装到手电筒中。在java面向对象编程语言中,主要是通过访问控制机制来进行封装,这种机制能控制对象的属性和方法的可访问性。在Java中提供了以下四种访问控制级别。lpublic:对外公开,访问级别最高lprotected:只对同一个包中的类或者子类公开l默认:只对同一个包中的类公开
3、。lprivate:不对外公开,只能在对象内部访问,访问级别最低。灵活运用这四种访问级别可以有效的控制对象的封装程度,那么到底哪些对象的属性和法应该公开,哪些应该隐藏呢?这必须具体分析,下面是封装的两个大致原则:1:把尽可能多的东西藏起来,对外提供简捷的接口 系统的封装度越高,那么它的独立性就越高,而且使用起来越方便,例如半自动洗衣机HalfAutoWasher和全自动洗衣机AutoWasher就是个明显的例子。以下程序演示的是半自动洗衣机的过程。HalfAutoWasher washer=new HalfAutoWasher();//开
4、始洗衣服washer.on();//开机//洗涤washer.inputWater();//放水washer.setTimer(5);//定时5分钟washer.wash();//洗涤washer.dischargeWater();//排水//第一次清洗washer.inputWater();//放水washer.setTime(5);//定时5分钟washer.wash();//洗涤washer.dischargeWater();//排水//第二次清洗washer.inputWater();//放水washer.setTime(5);//
5、定时5分钟washer.wash();//洗涤washer.dischargeWater();//排水//为衣服脱水washer.setTime(8);//定时八分钟washer.dehydrate();//脱水washer.off();//关机以下程序演示全自动洗衣机洗衣服的过程。AutoWasher washer=new AutoWasher();//开始洗衣服washer.on();//开机washer.setMode("标准模式");//设置洗衣机模式washer.start();//开始洗衣服,洗衣结束后,30分钟内洗衣机会自动关
6、机对比以上代码,可以看出全自动洗衣机封装了进水,排水和定时等洗衣服的细节,为使用者提供了更加简单易用的接口,所以用全自动洗衣机洗衣服更方便。2:把所有的属性藏起来假如某种属性允许外界访问,那么提供访问该属性的公开方法,假如电视剧有个音量属性volume,这是允许使用者访问的。使用者通过setVolume()和getVolume()方法来访问这个属性。private int volume;/**设置音量*/public void setVolume(int volume){ this.volume=volume;}/**查看当前音量*/p
7、ublic int getVolume(){ returnvolume;}为什么volume属性要设置为public呢?其实这样做有以下原因:(1) 更符合真实世界中外因通过内因起作用的客观规律,一个对象的属性发生变化应该是外因和内因共同作用的。外因就是使用者可以向电视机发送消息,请求调解音量。内因就是电视机本身有音量控制装置来调解音量。(2) 能够灵活的控制属性的读和修改的访问级别。对象的有些属性只允许使用者读,但不允许使用者修改,而只有内部对象才能修改,例如电表的用电度数。(3) 防止使用者错误的修改属性。例如银行账号Accou
8、nt对象有一个密码口令,当用户设置密码口令时,要求密码必须是6位数。如下所示:public voidsetPassword(Stringpassword){if(password
此文档下载收益归作者所有