1、第第3章章 类与对象类与对象(抽象与封装抽象与封装)教师:李云平教师:李云平nJAVA编程思想n掌握类和对象的概念n掌握构造方法及其重载n掌握封装的概念及其使用本章目标JAVA编程思想编程思想 面向过程面向过程和和面向对象面向对象的区别?的区别?JAVA程序结构?程序结构?面向对象程序设计的优点?面向对象程序设计的优点?为什么使用面向对象2-1n现实世界是由什么组成的?世界由对象组成世界由对象组成 为什么使用面向对象2-2n软件出现的目的是为了:n用计算机的语言描述现实世界n用计算机解决现实世界的问题n出现了软件危机,如何解决?用用面向对象面向对象的方式描述对象的世界的方式描述对象的世界 符合
2、人类符合人类思维习惯思维习惯 “问题问题”和和“解解”一致一致 1、易维护、易维护采用采用面向对象思想面向对象思想设计的结构,可读性高,由于设计的结构,可读性高,由于继承继承的存在,即使改变的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成低成本本的。的。2、质量高、质量高在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。统满足业务需求并具有较高的质量。3、效率高、效率高在在软件开发软件开发时,根据设计的
3、需要对现实世界的事物进行抽象,产生类。时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。高软件开发的效率和质量。4、易扩展、易扩展由于继承、封装、由于继承、封装、多态多态的特性,自然设计出的特性,自然设计出高内聚高内聚、低、低耦合耦合的系统结构,的系统结构,使得系统更灵活、更容易扩展,而且成本较低。使得系统更灵活、更容易扩展,而且成本较低。-面向对象程序设计的优点面向对象程序设计的优点面向对象的编程思维面向对象的编程思维nScoreCalc类 和
4、 Test类public static void main(String args)Scanner input=new Scanner(System.in);System.out.print(请输入请输入Java成绩:成绩:);int java=input.nextInt();/*计算并显示输出计算并显示输出*/int total=java+c+db;double avg=total/3;System.out.print(总成绩:总成绩:+total);System.out.print(n平均分平均分:+avg);一次还可以接受,如果一次还可以接受,如果还要再执行这个功能,还要再执行这个功能,
5、难道还要重复再写?难道还要重复再写?calcDiffTimecalcTotalScore()ScoreCalcshowTotalScore()calcAvg()showAvg()main()/程序入口程序入口 /计算并输出总成绩计算并输出总成绩 /计算并输出平均分计算并输出平均分 Test调用调用调用调用类的方法实现某个特定的功能,类的方法实现某个特定的功能,其他类不需要知道它如何实现!其他类不需要知道它如何实现!知道了实现此功能的类和它的方法名,知道了实现此功能的类和它的方法名,就可以直接调用了,不用重复写代码!就可以直接调用了,不用重复写代码!一个现实世界的问题 n宠物现实世界的对象n如何
6、在计算机中描述它?从现实中抽象出类分三步:从现实中抽象出类分三步:1.找出它的种类找出它的种类 2.找出它的属性找出它的属性 3.找出它的行为找出它的行为 用面向对象描述世界3-1n用面向对象的思想描述世界n第一步:发现类 根据根据”对象对象”抽象出抽象出“类类”class Dog 名词名词 各个狗对象各个狗对象 用面向对象描述世界3-2n第二步:发现类的属性 狗类共有的狗类共有的特征特征:1.品种品种2.年龄年龄3.昵称昵称4.健康情况健康情况5.跟主人的亲密度跟主人的亲密度 class Dog String name=旺财旺财;/昵称昵称 int health=100;/健康值健康值 in
7、t love=0;/亲密度亲密度 String strain=拉布拉多犬拉布拉多犬;/品种品种 只放我关心只放我关心的属性的属性名词名词用面向对象描述世界3-3n第三步:发现类的方法 狗类共有的狗类共有的行为行为:1.跑跑2.吠吠3.输出狗的信息输出狗的信息 动词动词class Dog String name=旺财旺财;/昵称昵称 int health=100;/健康值健康值 int love=100;/亲密度亲密度 String strain=拉布拉多犬拉布拉多犬;/品种品种 /*输出狗的信息输出狗的信息*/public void print()/输出狗信息的代码输出狗信息的代码 只放我关心
8、只放我关心的方法的方法类图n使用类图描述类n用于分析和设计“类”n直观、容易理解+name:String+health:int+love:int+strain:StringDog+print():void“+”:public“-”:private类名类名返回值返回值类型类型类型类型属性名属性名参数:参数:名字名字:类型类型,名字名字:类型类型方法名方法名class Penguin /属性属性 String name;String sex;int love;int health;/成员方法成员方法 public void print()System.out.println(我是一只企鹅我是一只企
9、鹅);定义一个企鹅类?定义一个企鹅类?构造方法 3-1n对象初始化Penguin pgn=new Penguin();pgn.name=qq;pgn.sex=Q仔仔;class Penguin /属性属性 /*无参构造方法无参构造方法 */public Penguin()name=qq;love=20;sex=Q仔仔;System.out.println(执行构造方法执行构造方法);使用构造方法:使用构造方法:Penguin pgn1=new Penguin();能否在创建对象的能否在创建对象的同时就完成赋值同时就完成赋值?构造方法构造方法构造方法 3-2n构造方法public 构造方法名构造
10、方法名()/初始化代码初始化代码与类名相同与类名相同没有返回值没有返回值类型类型public Penguin()name=qq;love=20;sex=Q仔仔;System.out.println(执行构造方法执行构造方法);可以指定可以指定参数参数 构造方法 3-3n阅读代码,说出运行结果,并指出原因class Penguin String name;String sex;int health;public void Penguin()health=10;sex=雄雄;System.out.println(执行构造方法执行构造方法);public void print()System.out
11、.println(企鹅的名字是企鹅的名字是+name +,健康值是健康值是+health +,性别是性别是+sex);Penguin pgn3=new Penguin();pgn3.print();有返回值类型,有返回值类型,不是构造方法不是构造方法 方法重载方法重载n一个类是否可以有多个构造方法?n方法重载,指同一个类中多个方法:n方法名相同n参数列表不同与返回值、访问修饰符无关与返回值、访问修饰符无关 public Penguin()/代码代码 public Penguin(String name,int health,int love,String sex)/代码代码 示例示例2 Sys
12、tem.out.println(45);System.out.println(true);System.out.println(狗在玩耍!狗在玩耍!);示例示例1 3.6 关键字thisn当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this3.6 关键字this1使用使用this区分区分成员变量成员变量和和局部变量局部变量局部变量:局部变量:在方法体中声明的变量以及方法的参数 方法的参数在整个方法内有效,局部变量从它定义的位置之后开始有效。成员变量:成员变量:在整个类内有效。为什么要使用封装 n下面代码有什么问题?n如何解决上面设计的缺陷
13、?Dog d=new Dog();d.health=1000;不合理的赋值不合理的赋值 使用使用封装封装 什么是封装n面向对象三大特征之一封装n封装的概念n封装的好处封装:将类的某些信息隐藏在类内部,不允许外部程序直接访封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 隐藏类的隐藏类的实现细节实现细节只能通过规只能通过规定方法访问定方法访问数据数据方便加入控方便加入控制语句制语句方便修改实现方便修改实现如何使用封装n封装的步骤 修改属性的可见性修改属性的可见性 创建创建getter
14、/setter方法方法 在在getter/setter方法中方法中加入属性控制语句加入属性控制语句 设为设为private用于属性的用于属性的读写读写 对属性值的对属性值的合法性合法性进行进行判断判断 class Dog private String name=旺财旺财;/昵称昵称 private int health=100;/健康值健康值 private int love=0;/亲密度亲密度 private String strain=拉布拉多犬拉布拉多犬;/品种品种 public int getHealth()return health;public void setHealth(int
15、 health)if(health 100|health 0)this.health=40;System.out.println(健康值应该在健康值应该在0和和100之间,默认值是之间,默认值是40);else this.health=health;/其它其它getter/setter方法方法this代表代表当前对象当前对象 1 1 2 2 2 2 3 3-name:String-health:int-love:int-strain:StringDog+print():void+setHealth():void+getHealth():int 练习用类图设计Dog和Penguin类 n需求说明
16、:n运用面向对象思想抽象出Dog类和Penguin类,画出对应类图n根据类图编写Dog类和Penguin类n添加构造方法完成时间:完成时间:20分钟分钟类型属性行为狗昵称健康值亲密度品种输出信息企鹅昵称健康值亲密度性别输出信息指导打印Dog信息2-1n训练要点:n类的结构,对象的创建,类的属性和方法的调用 n类的封装 n需求说明:n根据控制台提示信息选择领养宠物(狗),n输入昵称、品种、健康值n打印宠物信息n要保证健康值的有效性(在1到100之间)讲解需求说明讲解需求说明指导打印Dog信息2-2n实现思路:n修改Dog类n编写Test类完成时间:完成时间:30分钟分钟从控制台输入宠物信息从控制
17、台输入宠物信息打印宠物信息打印宠物信息保证健康值的有效性,否则取默认值保证健康值的有效性,否则取默认值60练习Dog类的带参构造方法 n需求说明:n增加带参构造方法n将setHealth()方法设为私有,注释掉其他setter方法n修改Test类,使用带参构造方法创建对象完成时间:完成时间:20分钟分钟Dog(String name,int health,int love,String strain)Penguin(String name,int health,int love,String sex)练习操作企鹅性别属性n需求说明:n给Penguin类提供SEX_MALE和SEX_FEMALE两个静态常量,分别取值“Q仔”或“Q妹”n修改Test类,使用静态常量对性别进行赋值n修改企鹅的性别只能取值“雄”或“雌”,通过修改静态常量值实现该需求完成时间:完成时间:15分钟分钟总结n使用面向对象的思想开发程序有什么好处?n如何从现实世界抽象出类?n方法重载的语法是什么?n如何实现封装?