Java程序设计-----封装性主讲人:黄承宁接下来课堂时间讲解关于封装性的三个内容:封装性产生的目的;封装的实现;setter与getter方法的实现。►课程介绍Introduction为什么要使用封装下面代码有什么缺陷?如何解决上面设计的缺陷?Dogd=newDog();d.health=-1000;属性随意访问,不合理的赋值使用封装什么是封装面向对象三大特征之一——封装封装的概念封装的好处封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问隐藏类的实现细节只能通过规定方法访问数据方便加入控制语句方便修改实现如何使用封装封装的步骤修改属性的可见性1在getter/setter方法中加入属性控制语句3创建公有的getter/setter方法2设为private用于属性的读写对属性值的合法性进行判断为什么要有封装classPerson{Stringname;//声明姓名属性intage;//声明年龄属性publicvoidtell(){//取得信息的方法System.out.println(姓名:+name+,年龄:+age);}}publicclassEncDemo01{publicstaticvoidmain(Stringargs[]){Personper=newPerson();//声明并实例化对象per.name=张三;//为name属性赋值per.age=-30;//为age属性赋值per.tell();//调用方法}}封装的实现为属性封装:private属性类型属性名称;为方法封装:private方法返回值方法名称(参数列表){}classPerson{privateStringname;//声明姓名属性privateintage;//声明年龄属性publicvoidtell(){//取得信息的方法System.out.println(姓名:+name+,年龄:+age);}}publicclassEncDemo02{publicstaticvoidmain(Stringargs[]){Personper=newPerson();per.name=张三;//错误,无法访问封装属性per.age=-30;//错误,无法访问封装属性per.tell();}}setter及getterclassPerson{privateStringname;privateintage;publicvoidtell(){System.out.println(姓名:+getName()+,年龄:+getAge());}publicStringgetName(){returnname;}publicvoidsetName(Stringn){name=n;}publicintgetAge(){returnage;}publicvoidsetAge(inta){age=a;}}加入验证•可以在setter方法中对设置的内容进行验证publicvoidsetAge(inta){//设置年龄if(a=0&&a150){//在此处加上验证代码age=a;}}总结2-1使用面向对象的思想开发程序的好处客户和软件设计开发人员之间、软件设计开发人员内部交流更加顺畅提高软件设计和开发效率从现实世界抽象出类找出名词确定类、属性找出动词确定方法剔除与业务无关的属性和方法方法重载的规则方法名相同参数项不同与访问修饰符和返回值无关总结2-2static可以修饰属性、方法、静态块static、非private修饰非static、private修饰属性类属性、类变量实例属性、实例变量方法类方法实例方法调用方式类名.属性类名.方法()对象.属性对象.方法()对象.属性对象.方法()归属类单个对象实现封装的步骤修改属性的可见性创建公有的getter/setter方法在getter/setter方法中加入属性控制语句►课程回顾封装性产生的原因;如何实现封装性;封装后如何操作属性。练习-设计学生类类设计与封装操作定义并测试一个名为Student的类,包括属性有“学号”、“姓名”,以及3门课程“数学”、“英语”和“计算机”的成绩,包括的方法有计算3门课程的“总分”、“平均分”、“最高分”及“最低分”。程序分析思路设计实现思路:1、根据要求写出类所包含的属性;2、所有的属性都必须进行封装(private);3、封装之后的属性通过setter和getter设置和取得;4、如果需要可以加入若干构造方法;5、再根据其他要求添加相应的方法;6、类中的所有方法都不要直接输出,而是交给被调用处输出。属性及类型No.属性属性类型属性名称1学号Stringstuno2姓名Stringname3数学成绩floatmath4英语成绩floatenglish5计算机成绩floatcomputer定义出方法(普通方法、构造方法)No.方法名称返回值类型作用1publicvoidsetStuno(Strings)void设置学生编号2publicvoidsetName(Stringn)void设置学生姓名3publicvoidsetMath(floatm)void设置数学成绩4publicvoidsetEnglish(floate)void设置英语成绩5publicvoidsetComputer(floatc)void设置计算机成绩6publicStringgetStuno()String取得学生编号7publicStringgetName()String取得学生姓名8publicfloatgetMath()float取得数学成绩9publicfloatgetEnglish()float取得英语成绩10publicfloatgetComputer()float取得计算机成绩11publicfloatsum()float计算成绩总和12publicfloatavg()float计算平均成绩13publicfloatmax()float求出最高成绩14publicfloatmin()float求出最低成绩15publicStudent(){}-无参构造方法16publicStudent(Stringstuno,Stringname,floatmath,floatenglish,floatcomputer)-在对象实例化的时候直接将学号、姓名、数学成绩、英语成绩、计算机成绩设置进去设计类图Student-----stunonamemathenglishcomputer:String:String:float:float:float++++++++++++++++ConstructorConstructorStudent()Student(Stringstuno,Stringname,floatmath,floatenglish,floatcomputer)setStuno(Strings)setName(Stringn)setMath(floatm)setEnglish(floate)setComputer(floatc)getStuno()getName()getMath()getEnglish()getComputer()sum()avg()max()min():void:void:void:void:void:String:String:float:float:float:float:float:float:float练习1—类图设计Dog和Penguin类需求说明:运用面向对象思想抽象出Dog类和Penguin类,画出对应类图根据类图编写Dog类和Penguin类添加默认构造方法练习类型属性行为狗昵称健康值亲密度品种输出信息企鹅昵称健康值亲密度性别输出信息练习2—打印Dog信息2-1训练要点类的结构类的封装对象的创建,类的属性和方法的调用需求说明:根据控制台提示信息选择领养宠物(狗),输入昵称、品种、健康值打印宠物信息要保证健康值的有效性(在1到100之间)指导练习3—Dog类的带参构造方法需求说明:增加带参构造方法修改Test类,使用带参构造方法创建对象Dog(Stringname,Stringstrain)练习练习4—操作企鹅性别属性需求说明:给Penguin类提供SEX_MALE和SEX_FEMALE两个静态常量,分别取值“Q仔”或“Q妹”修改Test类,使用静态常量对性别进行赋值修改企鹅的性别只能取值“雄”或“雌”,通过修改静态常量值实现该需求练习ThankYou!