资源描述
第1页/共46页第六章类和对象第一单元第一单元第2页/共46页本课目标 学完本门课程后,你能够:使用Java编写面向对象的程序 使用集合存取对象 使用Java异常处理编写程序 使用JDBC操作数据库 使用Java流操作文件第3页/共46页课程项目展示 项目案例:宠物商店 演示课程项目演示课程项目第4页/共46页相关课程回顾 什么是类,什么是对象?如何创建对象?如何在程序中接收控制台的输入?提问提问第5页/共46页学习方法第6页/共46页预习检查 如何从现实世界中抽象出类?构造方法的作用和特点是什么?什么是方法重载?提问提问第7页/共46页本章任务 用类图设计Dog和Penguin类 领养宠物并打印宠物信息第8页/共46页本章目标 使用类图描述设计 掌握面向对象设计基本步骤 掌握类和对象的概念 掌握构造方法及其重载 掌握封装的概念及其使用第9页/共46页为什么使用面向对象2-1 现实世界是由什么组成的?世界由对象组成世界由对象组成第10页/共46页为什么使用面向对象2-2 软件出现的目的 用计算机的语言描述现实世界 用计算机解决现实世界的问题面向对象设计和开发程序的好处 交流更加流畅 提高设计和开发效率 面向对象的思想面向对象的思想符合人类思维习惯符合人类思维习惯 面向对象的世界面向对象的世界描述描述第11页/共46页一个现实世界的问题 宠物现实世界的对象 如何在计算机中描述它们?从现实中抽象出类分三步:从现实中抽象出类分三步:1.找出它的种类找出它的种类 2.找出它的属性找出它的属性 3.找出它的行为找出它的行为 问题问题第12页/共46页用面向对象描述世界3-1 用面向对象的思想描述世界 第一步:发现类 根据根据“对象对象”抽象出抽象出“类类”class Dog 名词名词 各个狗对象各个狗对象 第13页/共46页用面向对象描述世界3-2 第二步:发现类的属性 狗类共有的特征:狗类共有的特征:1.品种品种2.年龄年龄3.昵称昵称4.健康情况健康情况5.跟主人的亲密度跟主人的亲密度 class Dog String name=旺财旺财;/昵称昵称 int health=100;/健康值健康值 int love=0;/亲密度亲密度 String strain=拉布拉多犬拉布拉多犬;/品种品种 只放和业务相关的属性只放和业务相关的属性名词名词第14页/共46页用面向对象描述世界3-3 第三步:发现类的方法 狗类共有的行为:狗类共有的行为:1.跑跑2.吠吠3.输出狗的信息输出狗的信息 动词动词只放和业务相关的方法只放和业务相关的方法class Dog String name=旺财旺财;/昵称昵称 int health=100;/健康值健康值 int love=0;/亲密度亲密度 String strain=拉布拉多犬拉布拉多犬;/品种品种 /*输出狗的信息输出狗的信息*/public void print()/输出狗信息的代码输出狗信息的代码 第15页/共46页类图 使用类图描述类 用于分析和设计“类”直观、容易理解+name:String+health:int+love:int+strain:String Dog+print():void“+”:public“-”:private类名类名返回值类型返回值类型类型类型属性名属性名参数:参数:名字名字:类型类型,名字名字:类型类型方法名方法名第16页/共46页小结 面向对象设计的过程是什么?抽象的原则是什么?为什么说类图是面向对象设计的好工具?提问提问第17页/共46页实现领养宠物 实现领养宠物功能 编写宠物类Dog和Penguin 创建宠物对象,输入领养的宠物信息并输出演示示例演示示例1:领养宠物:领养宠物第18页/共46页构造方法 2-1 对象初始化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();能否在创建对象的能否在创建对象的同时就完成赋值同时就完成赋值?构造方法构造方法第19页/共46页构造方法 2-2 构造方法访问修饰符访问修饰符 构造方法名构造方法名 ()/初始化代码初始化代码与类名相同与类名相同无返回值类型无返回值类型可以指定参数可以指定参数 语法语法public Penguin()系统提供默认无参构造方法系统提供默认无参构造方法 示例示例第20页/共46页构造方法重载2-1 自定义构造方法public Penguin()name=qq;love=20;sex=Q仔仔;示例示例public Penguin(String name,int health,int love,String sex)this.name=name;this.health=health;this.love=love;this.sex=sex;系统不再提供默认无参构造方法系统不再提供默认无参构造方法 方法名相同方法名相同参数项不相同参数项不相同方法方法重载重载 与返回值、与返回值、访问修饰符无关访问修饰符无关 System.out.println(45);System.out.println(true);System.out.println(狗在玩耍!狗在玩耍!);this关键字关键字是对一个对象是对一个对象的默认引用,的默认引用,这里用以区分这里用以区分同名成员变量同名成员变量第21页/共46页构造方法重载2-2 构造方法重载的调用pgn=new Penguin();pgn.print();pgn=new Penguin(美美美美,80,20,Q仔仔);pgn.print();public Penguin(String name,int health,int love,String sex)this.name=name;this.health=health;this.love=love;this.sex=sex;public Penguin()name=qq;love=20;sex=Q仔仔;第22页/共46页构造方法 阅读代码,说出运行结果,并指出原因class Penguin String name=null;/昵称昵称 int health=0;/健康值健康值 String sex=null;/性别性别 public void Penguin()health=10;sex=雄雄;System.out.println(执行构造方法执行构造方法);public void print()System.out.println(企鹅的名字是企鹅的名字是+name+,健康值是健康值是 +health+,性别是性别是+sex);Penguin pgn3=new Penguin();pgn3.print();有返回值类型,有返回值类型,不是构造方法不是构造方法 代码阅读代码阅读调用默认调用默认无参构造方法无参构造方法 第23页/共46页常见错误 请指出下面代码的错误class Dog private String name=旺财旺财;/昵称昵称 private int health=100;/健康值健康值 private int love=0;/亲密度亲密度 public void play(int n)int localv;health=health-n;System.out.println(name+localv+health+love);public static void main(String args)Dog d=new Dog();d.play(5);局部变量没有初始化局部变量没有初始化第24页/共46页static关键字2-1Penguin pgn1=new Penguin();pgn1.sex=Penguin.SEX_MALE;class Penguin static final String SEX_MALE=Q仔仔;static final String SEX_FEMALE=Q妹妹;static void print()用类名调用:用类名调用:Penguin.print();使用使用static定义变量定义变量 使用使用static定义方法定义方法 可否通过类名直接访问成员变量可否通过类名直接访问成员变量?问题问题演示示例演示示例2:静态常量:静态常量用用final修饰的变量称为修饰的变量称为常量,其值固定不变常量,其值固定不变第25页/共46页static关键字2-2 static还可以用来修饰什么?使用static修饰成员时,如何分配内存空间?演示示例演示示例3:static修饰代码块修饰代码块问题问题 static可以用来修饰属性、可以用来修饰属性、方法和代码块方法和代码块第26页/共46页小结static修饰与非修饰与非static修饰的区别修饰的区别static、非、非private修饰修饰 非非static、private修饰修饰属性属性类属性、类变量类属性、类变量实例属性、实例变量实例属性、实例变量方法方法类方法类方法实例方法实例方法调用方式调用方式类名类名.属性属性类名类名.方法方法()对象对象.属性属性对象对象.方法方法()对象对象.属性属性对象对象.方法方法()归属归属类类单个对象单个对象第27页/共46页常见错误 请指出下面代码的错误class Dog private String name=旺财旺财;/昵称昵称 private int health=100;/健康值健康值 private int love=0;/亲密度亲密度 public void play(int n)static int localv=5;health=health-n;System.out.println(name+localv+health+love);public static void main(String args)Dog d=new Dog();d.play(5);在方法里不可以定义在方法里不可以定义static变量变量 代码阅读代码阅读第28页/共46页为什么要使用封装 下面代码有什么缺陷?如何解决上面设计的缺陷?Dog d=new Dog();d.health=-1000;属性随意访问,不合理的赋值属性随意访问,不合理的赋值 使用封装使用封装 问题问题第29页/共46页什么是封装 面向对象三大特征之一 封装 封装的概念 封装的好处封装:将类的某些信息隐藏在类内部,不允许外部程序直接访封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 隐藏类的实现细节隐藏类的实现细节只能通过规定方法访问数据只能通过规定方法访问数据方便加入控制语句方便加入控制语句方便修改实现方便修改实现第30页/共46页如何使用封装 封装的步骤修改属性的可见性修改属性的可见性 在在getter/setter方法中加方法中加入属性控制语句入属性控制语句创建公有的创建公有的getter/setter方法方法设为设为private用于属性的读写用于属性的读写 对属性值的对属性值的合法合法性性进行判断进行判断 演示示例演示示例3:类的封装:类的封装第31页/共46页小结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 health)if(health 100|health 0)this.health=40;System.out.println(健康值应该在健康值应该在0和和100之间,默认值是之间,默认值是40);else this.health =health;/其它其它getter/setter方法方法this代表代表当前对象当前对象-name:String-health:int-love:int-strain:StringDog+print():void+setHealth():void+getHealth():String 技巧技巧添加添加getter/setter方法的快捷键:方法的快捷键:Shift+Alt+S+R第32页/共46页this的用法 this关键字的用法 调用属性 调用方法 调用构造方法this.health=100;this.name=大黄大黄;this.print();this();如果使用,必须是构造方法如果使用,必须是构造方法中的第一条语句中的第一条语句 this(小黑小黑,100,100,雄雄);第33页/共46页小结 分析需求,用封装方式设计类,画出类图 汽车销售人员销售汽车,可售款式有凯越、君威 每款汽车有款式和编号,款式、编号不能修改 汽车销售人员有姓名,姓名不能修改 销售人员有两种销售方式:按车辆销售,每次一辆 按车型销售(凯越),要同时告诉销售人员购买数量-type:String-id:StringExcelle+Excelle(id:String,type:String)+getType():String+getId():String-type:String-id:StringRegal+Regal(id:String,type:String)+getType():String+getId():String-name:StringSeller+getName():String+setName(name:String):void+sell(car:Excelle):void+sell(car:Regal):void+sell(car:Excelle,num:int):void 凯越凯越 君威君威 销售员销售员 现场编程现场编程第34页/共46页学员操作用类图设计Dog和Penguin类 需求说明:运用面向对象思想抽象出Dog类和Penguin类,画出对应类图 根据类图编写Dog类和Penguin类 添加默认构造方法练习练习完成时间:完成时间:20分钟分钟类型类型属性属性行为行为狗狗昵称昵称健康值健康值亲密度亲密度品种品种输出信息输出信息企鹅企鹅昵称昵称健康值健康值亲密度亲密度性别性别输出信息输出信息第35页/共46页学员操作打印Dog信息2-1 训练要点 类的结构 类的封装 对象的创建,类的属性和方法的调用 需求说明:根据控制台提示信息选择领养宠物(狗),输入昵称、品种、健康值 打印宠物信息 要保证健康值的有效性(在1到100之间)指导指导讲解需求说明讲解需求说明第36页/共46页学员操作打印Dog信息2-2 实现思路:创建Dog类 编写Test类从控制台输入宠物信息从控制台输入宠物信息打印宠物信息打印宠物信息保证健康值的有效性,否则取默认值保证健康值的有效性,否则取默认值60指导指导完成时间:完成时间:30分钟分钟第37页/共46页共性问题集中讲解 常见问题及解决办法 代码规范问题 调试技巧第38页/共46页学员操作Dog类的带参构造方法 需求说明:增加带参构造方法 修改Test类,使用带参构造方法创建对象Dog(String name,String strain)练习练习完成时间:完成时间:20分钟分钟第39页/共46页练习操作企鹅性别属性 需求说明:给Penguin类提供SEX_MALE和SEX_FEMALE两个静态常量,分别取值“Q仔”或“Q妹”修改Test类,使用静态常量对性别进行赋值 修改企鹅的性别只能取值“雄”或“雌”,通过修改静态常量值实现该需求练习练习完成时间:完成时间:15分钟分钟第40页/共46页总结2-1 使用面向对象的思想开发程序的好处 客户和软件设计开发人员之间、软件设计开发人员内部交流更加顺畅 提高软件设计和开发效率 从现实世界抽象出类 找出名词确定类、属性 找出动词确定方法 剔除与业务无关的属性和方法 方法重载的规则 方法名相同 参数项不同 与访问修饰符和返回值无关第41页/共46页总结2-2 static可以修饰属性、方法、静态块static、非、非private修饰修饰 非非static、private修饰修饰属性属性类属性、类变量类属性、类变量实例属性、实例变量实例属性、实例变量方法方法类方法类方法实例方法实例方法调用方式调用方式类名类名.属性属性类名类名.方法方法()对象对象.属性属性对象对象.方法方法()对象对象.属性属性对象对象.方法方法()归属归属类类单个对象单个对象实现封装的步骤实现封装的步骤 修改属性的可见性修改属性的可见性 创建公有的创建公有的getter/setter方法方法 在在getter/setter方法中加入属性控制语句方法中加入属性控制语句第42页/共46页相关学习资源学习资料学习资料使用使用Java实现面向对象编程实现面向对象编程“使用使用Java实现面向对象编程实现面向对象编程”课程课程学生用书学生用书学习平台学习平台第43页/共46页作业 课后作业 教员备课时根据班级情况在此添加内容,应区分必做、选做内容,以满足不同层次学员的需求 预习作业 预习目标 了解什么是继承,子类可以从父类继承哪些资源 预习下一章学生用书,完成预习作业第44页/共46页
展开阅读全文