Java核心逻辑第7章_封装、继承、多态
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
✓ 向上转型
Pet pet = new Dog();
实现多态的两种形式
▪ 使用父类作为方法形参实现多态 ▪ 使用父类作为方法返回值实现多态
如何实现多态
实现多态的两个要素 自动类型转换
第三十六页,编辑于星期四:十点 三十四分。
使用多态优化主人给宠物喂食
使用多态
public class Master {
问题
▪ 如果再领养XXX宠物,就需要给XXX喂食,怎么办?
✓ 添加XXX类,继承Pet类,实现吃食方法 ✓ 修改Master类,添加给XXX喂食的方法
第三十三页,编辑于星期四:十点 三十四分。
为什么使用多态
主人类
public class Master {
public void feed( Dog dog ) { dog.eat();
super()思考题
第十九页,编辑于星期四:十点 三十四分。
super()总结
每一个子类的构造方法在没有显示调用super()系统都会提 供一个默认的super()
super() 书写在第一行 可以在子类构造方法中显示调用super(),完成对特定父类构
造方法的调用 ✓super不能访问父类的private成员
第七页,编辑于星期四:十点 三十四分。
封装练习
需求说明
▪ 使用封装描述宠物信息,小猫和企鹅 ▪ 小猫:昵称、健康值、亲密度、种类和自身信息显示
▪ 企鹅:昵称、健康值、亲密度、性别和自身信息显示
第八页,编辑于星期四:十点 三十四分。
分析代码
Dog - name:String - health:int - love:int - strain:String + print():void + getName():String + getHealth ():int + getLove():int + getStrain:String + Dog()
封装的好处
只能通过规定方法访问数据
隐藏类的实现细节
方便加入控制语句
方便修改实现
第四页,编辑于星期四:十点 三十四分。
封装步骤
使用封装
设为private
用于属性的读写
对属性值的合法性 进行判断
第五页,编辑于星期四:十点 三十四分。
使用封装
第六页,编辑于星期四:十点 三十四分。
使用封装
输出结果:100.0
}
父类到子类的转换
企鹅类
public class Penguin extends Pet {
public void swimming () { ……
} }
……
测试类
Pet pet = new Dog();
Master master = new Master();
master.pet(pet);
……
第四十二页,编辑于星期四:十点 三十四分。
在子类构造方法中调用且必 须是第一句
第十二页,编辑于星期四:十点 三十四分。
java中的继承的特点
▪ 单继承
java中单继承的好处
▪ 代码复用 ▪ 利于维护
使用场合
▪ 符合is-a关系 ▪ 需要解决代码重复
小结
第十三页,编辑于星期四:十点 三十四分。
Dog类 extends Animal类
第二十页,编辑于星期四:十点 三十四分。
抽象类
问题:实例化Pet是否的意义 ?
Pet pet = new Pet ("贝贝",20,40); pet.print();
Java中使用抽象类,限制实例化
public abstract class Pet {
}
abstract也可用于方法——抽象方法
▪ 抽象方法没有方法体 ▪ 抽象方法必须在抽象类里
车型
日租费 (元/天)
轿车
别克商务 宝马 舱GL8 550i
600
500
客车(金杯、金龙)
别克林 荫大道
<=16座
>16座
300
800
1500
第二十九页,编辑于星期四:十点 三十四分。
提示
▪ 类: Vehicle 机动车(父类) Car 轿车 Bus 客车
综合练习
▪ 属性:Vehicle
- no(车牌号)
class Dog extends Pet {
//子类特有的属性和方法
}
继承
第十一页,编辑于星期四:十点 三十四分。
子类访问父类成员
▪ 访问父类构造方法 super (); super (name);
▪ 访问父类属性
;
▪ 访问父类方法
super.print();
使用继承
使用super关键字, super代表父类对象
第四十一页,编辑于星期四:十点 三十四分。
代码实现
小猫类 public class Dog extends Pet {
public void catchingFlyDisc() {
……
}
}
主人类
public class Master { public void play(Pet pet){ pet.catchingFlyDisc(); }
使用父类作为 返回值类型
主人类
public class Master { public Pet getPet(String typeId ){
…… } }
第三十九页,编辑于星期四:十点 三十四分。
Dog d = new Dog();
▪ Pet a = new Dog();
多态的特点
▪ 对象类型不可变,引用类型可变 ▪ 只能调用其引用类型中定义的方法 ▪ 运行时会运行子类覆盖的方法
需求说明
▪ 使用多态实现喂养宠物功能 ▪ 增加宠物猫并喂食,其健康值增加4
多态练习1
第三十八页,编辑于星期四:十点 三十四分。
多态练习2
需求说明
▪ 使用多态实现领养宠物
✓ 使用父类作为方法返回值
▪ 实现思路
▪ 在Master类添加领养方法getPet(String typeId ) ▪ 创建测试类,根据主人选择宠物类型编号来领养宠物
使用继承后效果 如何实现如下效果呢?
方法的覆盖(Override)
调用父类的print()方法, 不能显示Dog的strain信息 和Peguin的sex信息
子类重写父类方法
第十六页,编辑于星期四:十点 三十四分。
方法的覆盖(Override)
方法重写的规则
▪ 方法名相同 ▪ 参数列表相同 ▪ 返回值类型相同或者是其子类; ▪ 访问权限不能严于父类
}
public void feed( Penguin pgn ) { pgn.eat();
}
测试方法
……
Master master = new Master(); master.feed(dog);
maste参r.f数ee都d(p是ePngeut类in的); 子类 master.feed(xxx);
public abstract void print();
▪ 抽象方法必须在子类中被实现,除非子类是抽象类
第二十一页,编辑于星期四:十点 三十四分。
需求说明:
▪ 修改Pet类为抽象类 ▪ 修改Pet类的print()方法为抽象方法 ▪ 输出Dog信息
抽象类练习
第二十二页,编辑于星期四:十点 三十四分。
Consumer cons = new Consumer();
cons.age = -1000;
属性随意访问,不合理的赋值
使用封装
第三页,编辑于星期四:十点 三十四分。
封装的概念
什么是封装
▪ 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通 过该类提供的方法来实现对隐藏信息的操作和访问
JAVA核心逻辑
第七章:封装、继承、多态
第一页,编辑于星期四:十点 三十四分。
封装的概念 继承的概念 访问修饰符 方法的覆盖(Override) super关键字 多态的概念 强制类型转换与instanceof关键字
目录
第二页,编辑于星期四:十点 三十四分。
为什么要使用封装
下面代码有何缺陷?
Animal
sex
age
Dog call() 对象的创建: new Dog();
▪ 分配空间 (父类对象空间,子类对象空间) ▪ 递归的构造父类对象 ▪ 初始化属性 ▪ 调用构造方法
理解继承
第十四页,编辑于星期四:十点 三十四分。
java中的访问修饰符
Java中的访问修饰符
第十五页,编辑于星期四:十点 三十四分。
抽象类的特点
抽象类可以用于声明,但不允许创建对象 抽象类可以被子类继承,从而创建子类对象
第二十三页,编辑于星期四:十点 三十四分。
拥有抽象方法的类必须是抽象类
抽象方法的特点
第二十四页,编辑于星期四:十点 三十四分。
抽象方法由子类实现
抽象方法的特点
非抽象类继承抽象 类,必须实现父类 的所有抽象方法
小猫 健康值增加3
为什么使用多态
企鹅
吃鱼
企鹅
健康值增加5
第三十一页,编辑于星期四:十点 三十四分。
分析
▪ 小猫类
✓ 增加小猫吃食的方法
▪ 企鹅类
✓ 增加企鹅吃食的方法
▪ 创建主人类
✓ 编写给小猫喂食的方法
✓ 编写给企鹅喂食的方法
为什么使用多态
第三十二页,编辑于星期四:十点 三十四分。
为什么使用多态
多态的概念
黑白打印机
打印
彩色打印机
同一种事物,由于条件不同,产生的结果也不同
▪ 程序中的多态
父类引用,子类对象
多态:同一个引用类型,使用不同的实例而执行不同操作
第三十五页,编辑于星期四:十点 三十四分。
使用多态实现思路
▪ 编写父类 ▪ 编写子类,子类重写父类方法 ▪ 运行时,使用父类的类型,子类的对象
方法重载与方法重写
方法重写 方法重载
方法名 相同 相同
参数表 相同
不相同
返回值
相同或是 其子类
无关
访问修饰符
不能比父类更 严格
无关
第十七页,编辑于星期四:十点 三十四分。
需求说明
▪ 优化描述宠物信息的功能 ▪ 使用继承实现Dog类和Penguin类 ▪ 打印宠物信息
继承练习
第十八页,编辑于星期四:十点 三十四分。
Car
- type(型号)
Bus - seatCount(座位数)
▪ 方法:Vehicle - calculate(int days) :double
第三十页,编辑于星期四:十点 三十四分。
问题思考
▪ 宠物饿了,需要主人给宠物喂食 ▪ 不同宠物吃的食物不一样
小猫 吃狗粮
▪ 不同宠物恢复后体力值不一样
……
public void feed( XXX xxx ) {
xxx.eat(); }
可否使用一个feed(Pet pet)实现 对所有宠物的喂食?
……
}
频繁修改代码,代码可扩展性、可维护性差,如何
优化?
使用多态优化பைடு நூலகம்计
第三十四页,编辑于星期四:十点 三十四分。
生活中的多态
▪ 不同类型的打印机打印效果不同
为什么使用继承
Penguin - name:String - health:int - love:int - sex:String + print():void + getName():String + getHealth ():int + getLove():int + getSex():String + Penguin()
多态的作用
▪ 提高代码的通用性
多态的特点
第四十页,编辑于星期四:十点 三十四分。
父类到子类的转换
问题
▪ 实现主人与宠物玩耍功能
✓ 和小猫玩接飞盘游戏,小猫的健康值减少10,与主人亲密度增加5 ✓ 和企鹅玩游泳游戏,企鹅的健康值减少10,与主人亲密度增加5
分析
▪ 给Dog添加接飞盘方法catchingFlyDisc( ) ▪ 给Penguin添加游泳方法swimming( ) ▪ 给主人添加play(Pet pet)方法
将重复代码 抽取到父类中
使用继承优化设计
第九页,编辑于星期四:十点 三十四分。
使用继承后
为什么使用继承
方便修改代码
子类与父类是is-a关系
减少代码量
第十页,编辑于星期四:十点 三十四分。
继承关键字
▪ extends
示例
▪ 编写父类
class Pet {
只能继承一个父类
//公共的属性和方法
}
▪ 子类继承
第二十五页,编辑于星期四:十点 三十四分。
抽取共性
抽象的作用
第二十六页,编辑于星期四:十点 三十四分。
不同实现
抽象的作用
第二十七页,编辑于星期四:十点 三十四分。
抽象类是更高层次的抽象
抽象的作用
第二十八页,编辑于星期四:十点 三十四分。
综合练习
需求说明
▪ 编写程序实现计算租赁价 某汽车租赁公司出租多种车辆,车型及租金情况如下:
主人类
public void feed( Pet pet ) {
pet.eat();
}
}
使用父类作为
方法形参
……
测试方法
Pet pet = new Dog();
Master master = new Master();
master.feed( pet );
……
同一种操作方式, 不同的操作对象
第三十七页,编辑于星期四:十点 三十四分。
Pet pet = new Dog();
实现多态的两种形式
▪ 使用父类作为方法形参实现多态 ▪ 使用父类作为方法返回值实现多态
如何实现多态
实现多态的两个要素 自动类型转换
第三十六页,编辑于星期四:十点 三十四分。
使用多态优化主人给宠物喂食
使用多态
public class Master {
问题
▪ 如果再领养XXX宠物,就需要给XXX喂食,怎么办?
✓ 添加XXX类,继承Pet类,实现吃食方法 ✓ 修改Master类,添加给XXX喂食的方法
第三十三页,编辑于星期四:十点 三十四分。
为什么使用多态
主人类
public class Master {
public void feed( Dog dog ) { dog.eat();
super()思考题
第十九页,编辑于星期四:十点 三十四分。
super()总结
每一个子类的构造方法在没有显示调用super()系统都会提 供一个默认的super()
super() 书写在第一行 可以在子类构造方法中显示调用super(),完成对特定父类构
造方法的调用 ✓super不能访问父类的private成员
第七页,编辑于星期四:十点 三十四分。
封装练习
需求说明
▪ 使用封装描述宠物信息,小猫和企鹅 ▪ 小猫:昵称、健康值、亲密度、种类和自身信息显示
▪ 企鹅:昵称、健康值、亲密度、性别和自身信息显示
第八页,编辑于星期四:十点 三十四分。
分析代码
Dog - name:String - health:int - love:int - strain:String + print():void + getName():String + getHealth ():int + getLove():int + getStrain:String + Dog()
封装的好处
只能通过规定方法访问数据
隐藏类的实现细节
方便加入控制语句
方便修改实现
第四页,编辑于星期四:十点 三十四分。
封装步骤
使用封装
设为private
用于属性的读写
对属性值的合法性 进行判断
第五页,编辑于星期四:十点 三十四分。
使用封装
第六页,编辑于星期四:十点 三十四分。
使用封装
输出结果:100.0
}
父类到子类的转换
企鹅类
public class Penguin extends Pet {
public void swimming () { ……
} }
……
测试类
Pet pet = new Dog();
Master master = new Master();
master.pet(pet);
……
第四十二页,编辑于星期四:十点 三十四分。
在子类构造方法中调用且必 须是第一句
第十二页,编辑于星期四:十点 三十四分。
java中的继承的特点
▪ 单继承
java中单继承的好处
▪ 代码复用 ▪ 利于维护
使用场合
▪ 符合is-a关系 ▪ 需要解决代码重复
小结
第十三页,编辑于星期四:十点 三十四分。
Dog类 extends Animal类
第二十页,编辑于星期四:十点 三十四分。
抽象类
问题:实例化Pet是否的意义 ?
Pet pet = new Pet ("贝贝",20,40); pet.print();
Java中使用抽象类,限制实例化
public abstract class Pet {
}
abstract也可用于方法——抽象方法
▪ 抽象方法没有方法体 ▪ 抽象方法必须在抽象类里
车型
日租费 (元/天)
轿车
别克商务 宝马 舱GL8 550i
600
500
客车(金杯、金龙)
别克林 荫大道
<=16座
>16座
300
800
1500
第二十九页,编辑于星期四:十点 三十四分。
提示
▪ 类: Vehicle 机动车(父类) Car 轿车 Bus 客车
综合练习
▪ 属性:Vehicle
- no(车牌号)
class Dog extends Pet {
//子类特有的属性和方法
}
继承
第十一页,编辑于星期四:十点 三十四分。
子类访问父类成员
▪ 访问父类构造方法 super (); super (name);
▪ 访问父类属性
;
▪ 访问父类方法
super.print();
使用继承
使用super关键字, super代表父类对象
第四十一页,编辑于星期四:十点 三十四分。
代码实现
小猫类 public class Dog extends Pet {
public void catchingFlyDisc() {
……
}
}
主人类
public class Master { public void play(Pet pet){ pet.catchingFlyDisc(); }
使用父类作为 返回值类型
主人类
public class Master { public Pet getPet(String typeId ){
…… } }
第三十九页,编辑于星期四:十点 三十四分。
Dog d = new Dog();
▪ Pet a = new Dog();
多态的特点
▪ 对象类型不可变,引用类型可变 ▪ 只能调用其引用类型中定义的方法 ▪ 运行时会运行子类覆盖的方法
需求说明
▪ 使用多态实现喂养宠物功能 ▪ 增加宠物猫并喂食,其健康值增加4
多态练习1
第三十八页,编辑于星期四:十点 三十四分。
多态练习2
需求说明
▪ 使用多态实现领养宠物
✓ 使用父类作为方法返回值
▪ 实现思路
▪ 在Master类添加领养方法getPet(String typeId ) ▪ 创建测试类,根据主人选择宠物类型编号来领养宠物
使用继承后效果 如何实现如下效果呢?
方法的覆盖(Override)
调用父类的print()方法, 不能显示Dog的strain信息 和Peguin的sex信息
子类重写父类方法
第十六页,编辑于星期四:十点 三十四分。
方法的覆盖(Override)
方法重写的规则
▪ 方法名相同 ▪ 参数列表相同 ▪ 返回值类型相同或者是其子类; ▪ 访问权限不能严于父类
}
public void feed( Penguin pgn ) { pgn.eat();
}
测试方法
……
Master master = new Master(); master.feed(dog);
maste参r.f数ee都d(p是ePngeut类in的); 子类 master.feed(xxx);
public abstract void print();
▪ 抽象方法必须在子类中被实现,除非子类是抽象类
第二十一页,编辑于星期四:十点 三十四分。
需求说明:
▪ 修改Pet类为抽象类 ▪ 修改Pet类的print()方法为抽象方法 ▪ 输出Dog信息
抽象类练习
第二十二页,编辑于星期四:十点 三十四分。
Consumer cons = new Consumer();
cons.age = -1000;
属性随意访问,不合理的赋值
使用封装
第三页,编辑于星期四:十点 三十四分。
封装的概念
什么是封装
▪ 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通 过该类提供的方法来实现对隐藏信息的操作和访问
JAVA核心逻辑
第七章:封装、继承、多态
第一页,编辑于星期四:十点 三十四分。
封装的概念 继承的概念 访问修饰符 方法的覆盖(Override) super关键字 多态的概念 强制类型转换与instanceof关键字
目录
第二页,编辑于星期四:十点 三十四分。
为什么要使用封装
下面代码有何缺陷?
Animal
sex
age
Dog call() 对象的创建: new Dog();
▪ 分配空间 (父类对象空间,子类对象空间) ▪ 递归的构造父类对象 ▪ 初始化属性 ▪ 调用构造方法
理解继承
第十四页,编辑于星期四:十点 三十四分。
java中的访问修饰符
Java中的访问修饰符
第十五页,编辑于星期四:十点 三十四分。
抽象类的特点
抽象类可以用于声明,但不允许创建对象 抽象类可以被子类继承,从而创建子类对象
第二十三页,编辑于星期四:十点 三十四分。
拥有抽象方法的类必须是抽象类
抽象方法的特点
第二十四页,编辑于星期四:十点 三十四分。
抽象方法由子类实现
抽象方法的特点
非抽象类继承抽象 类,必须实现父类 的所有抽象方法
小猫 健康值增加3
为什么使用多态
企鹅
吃鱼
企鹅
健康值增加5
第三十一页,编辑于星期四:十点 三十四分。
分析
▪ 小猫类
✓ 增加小猫吃食的方法
▪ 企鹅类
✓ 增加企鹅吃食的方法
▪ 创建主人类
✓ 编写给小猫喂食的方法
✓ 编写给企鹅喂食的方法
为什么使用多态
第三十二页,编辑于星期四:十点 三十四分。
为什么使用多态
多态的概念
黑白打印机
打印
彩色打印机
同一种事物,由于条件不同,产生的结果也不同
▪ 程序中的多态
父类引用,子类对象
多态:同一个引用类型,使用不同的实例而执行不同操作
第三十五页,编辑于星期四:十点 三十四分。
使用多态实现思路
▪ 编写父类 ▪ 编写子类,子类重写父类方法 ▪ 运行时,使用父类的类型,子类的对象
方法重载与方法重写
方法重写 方法重载
方法名 相同 相同
参数表 相同
不相同
返回值
相同或是 其子类
无关
访问修饰符
不能比父类更 严格
无关
第十七页,编辑于星期四:十点 三十四分。
需求说明
▪ 优化描述宠物信息的功能 ▪ 使用继承实现Dog类和Penguin类 ▪ 打印宠物信息
继承练习
第十八页,编辑于星期四:十点 三十四分。
Car
- type(型号)
Bus - seatCount(座位数)
▪ 方法:Vehicle - calculate(int days) :double
第三十页,编辑于星期四:十点 三十四分。
问题思考
▪ 宠物饿了,需要主人给宠物喂食 ▪ 不同宠物吃的食物不一样
小猫 吃狗粮
▪ 不同宠物恢复后体力值不一样
……
public void feed( XXX xxx ) {
xxx.eat(); }
可否使用一个feed(Pet pet)实现 对所有宠物的喂食?
……
}
频繁修改代码,代码可扩展性、可维护性差,如何
优化?
使用多态优化பைடு நூலகம்计
第三十四页,编辑于星期四:十点 三十四分。
生活中的多态
▪ 不同类型的打印机打印效果不同
为什么使用继承
Penguin - name:String - health:int - love:int - sex:String + print():void + getName():String + getHealth ():int + getLove():int + getSex():String + Penguin()
多态的作用
▪ 提高代码的通用性
多态的特点
第四十页,编辑于星期四:十点 三十四分。
父类到子类的转换
问题
▪ 实现主人与宠物玩耍功能
✓ 和小猫玩接飞盘游戏,小猫的健康值减少10,与主人亲密度增加5 ✓ 和企鹅玩游泳游戏,企鹅的健康值减少10,与主人亲密度增加5
分析
▪ 给Dog添加接飞盘方法catchingFlyDisc( ) ▪ 给Penguin添加游泳方法swimming( ) ▪ 给主人添加play(Pet pet)方法
将重复代码 抽取到父类中
使用继承优化设计
第九页,编辑于星期四:十点 三十四分。
使用继承后
为什么使用继承
方便修改代码
子类与父类是is-a关系
减少代码量
第十页,编辑于星期四:十点 三十四分。
继承关键字
▪ extends
示例
▪ 编写父类
class Pet {
只能继承一个父类
//公共的属性和方法
}
▪ 子类继承
第二十五页,编辑于星期四:十点 三十四分。
抽取共性
抽象的作用
第二十六页,编辑于星期四:十点 三十四分。
不同实现
抽象的作用
第二十七页,编辑于星期四:十点 三十四分。
抽象类是更高层次的抽象
抽象的作用
第二十八页,编辑于星期四:十点 三十四分。
综合练习
需求说明
▪ 编写程序实现计算租赁价 某汽车租赁公司出租多种车辆,车型及租金情况如下:
主人类
public void feed( Pet pet ) {
pet.eat();
}
}
使用父类作为
方法形参
……
测试方法
Pet pet = new Dog();
Master master = new Master();
master.feed( pet );
……
同一种操作方式, 不同的操作对象
第三十七页,编辑于星期四:十点 三十四分。