java多态基础入门Word下载.docx
- 文档编号:18343896
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:14
- 大小:19.53KB
java多态基础入门Word下载.docx
《java多态基础入门Word下载.docx》由会员分享,可在线阅读,更多相关《java多态基础入门Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
{
System.out.println("
fushow"
);
}
}
classZiextendsFu
zishow"
publicvoidmethod()
zimethod"
classTest
publicstaticvoidmain(String[]args)
Fuf=newZi();
f.method();
2:
classA
{
publicvoidshow()
{
show2();
}
publicvoidshow2()
我"
}
classBextendsA
爱"
classCextendsB
super.show();
你"
publicclassTest
publicstaticvoidmain(String[]args)
Aa=newB();
a.show();
Bb=newC();
b.show();
多态的好处和弊端
●多态的好处
•提高了程序的维护性(由继承保证)
•提高了程序的扩展性(由多态保证)
●多态的弊端
•不能访问子类特有功能
•那么我们如何才能访问子类的特有功能呢?
•多态中的转型
提高程序的扩展性。
3多态中的转型问题
●向上转型
•从子到父
•父类引用指向子类对象
●向下转型
•从父到子
•父类引用转为子类对象
•多态成员访问及转型的理解
•孔子装爹案例
案例演示时,子类提供一个父类没有功能。
案例演示完毕后,画图解释。
●动物和猫,狗案例
●2:
多态成员访问及转型的理解。
孔子装爹案例
●3:
判断下面的赋值哪些是正确的:
最后,总结从右,往左看,是否能够读通。
如果可以,就正确,否则就错误。
●classAnimal{}
●classDogextendsAnimal{}
●classCatextendsAnimal{}
●以及
●Animalp0=newAnimal();
●Dogp1=newDog();
●Catp2=newCat();
●Animalp3=newDog();
●Animalp4=newCat();
●p0=p1;
●p1=p2;
●p1=(Dog)p3;
●p2=(Cat)p4;
4多态练习
●猫狗案例练习多态版
●不同地方饮食文化不同的案例
•Person
•eat()
•SouthPerson
•NorthPerson
人要吃饭
南方人吃炒菜和米饭
北方人吃烩菜和馒头
●先基本的调用,后多态调用。
5抽象类概述
●抽象类概述
•回想前面我们的猫狗案例,提取出了一个动物类。
并且我们在前面也创建过了动物对象,其实这是不对的。
为什么呢?
因为,我说动物,你知道我说的是什么动物吗?
只有看到了具体的动物,你才知道,这是什么动物。
所以说,动物本身并不是一个具体的事物,而是一个抽象的事物。
只有真正的猫,狗才是具体的动物。
同理,我们也可以推想,不同的动物吃的东西应该是不一样的,所以,我们不应该在动物类中给出具体体现,而是应该给出一个声明即可。
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
●抽象类特点
•抽象类和抽象方法必须用abstract关键字修饰
•格式
•abstractclass类名{}
•publicabstractvoideat();
•抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
•抽象类不能实例化
•那么,抽象类如何实例化呢?
•按照多态的方式,由具体的子类实例化。
其实这也是多态的一种,抽象类多态。
•抽象类的子类
•要么是抽象类
•要么重写抽象类中的所有抽象方法
5抽象类的成员特点
•可以是变量
•也可以是常量
●构造方法
•有构造方法,但是不能实例化
•那么,构造方法的作用是什么呢?
•用于子类访问父类数据的初始化
•可以有抽象方法限定子类必须完成某些动作
•也可以有非抽象方法提高代码服用性
测试成员变量的时候,一定要定义两个,分别是变量,常量
●然后去访问,发现,变量是可以修改值的,而常量不能。
●由此可见,它里面的变量真的既可以是变量也可以是常量。
●并且,用类名调用一下,发现不可以,因为他们不是静态的。
可以有抽象方法,也可以有非抽象方法。
分别定义两种类型的方法,然后测试。
●最后提出一个问题:
就是抽象类的非抽象方法有什么用?
抽象方法有什么用?
●抽象类的抽象方法:
用于限定子类必须完成某些动作
●抽象类的非抽象方法:
用于提高代码的服用性
抽象类练习
●猫狗案例
•具体事物:
猫,狗
•共性:
姓名,年龄,吃饭
●老师案例
基础班老师,就业班老师
姓名,年龄,讲课。
●学生案例
•具体事务:
基础班学员,就业班学员
姓名,年龄,班级,学习,吃饭
●员工案例(备注部分)
●假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:
姓名、工号以及工资。
●经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
●请使用继承的思想设计出员工类和经理类。
要求类中提供必要的方法进行属性访问。
抽象类的几个小问题
●一个类如果没有抽象方法,可不可以定义为抽象类?
如果可以,有什么意义?
●abstract不能和哪些关键字共存
•private冲突
•final冲突
•static无意义
6接口概述
●接口概述
•继续回到我们的猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了,对不。
但是,现在有很多的驯养员或者是驯兽师,可以训练出:
猫钻火圈,狗跳高,狗做计算等。
而这些额外的动作,并不是所有猫或者狗一开始就具备的,这应该属于经过特殊的培训训练出来的,对不。
所以,这些额外的动作定义到动物类中就不合适,也不适合直接定义到猫或者狗中,因为只有部分猫狗具备这些功能。
所以,为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能,并不给出具体实现,将来哪些猫狗需要被培训,只需要这部分猫狗把这些额外功能实现即可。
●接口特点
•接口用关键字interface表示
●格式:
interface接口名{}
•类实现接口用implements表示
class类名implements接口名{}
•接口不能实例化
●那么,接口如何实例化呢?
●按照多态的方式,由具体的子类实例化。
其实这也是多态的一种,接口多态。
•接口的子类
●要么是抽象类
●要么重写接口中的所有抽象方法
在AnimalArain接口中定义两个功能:
●jump():
跳高
●compute():
计算
7接口成员特点
•只能是常量
•默认修饰符publicstaticfinal
•没有,因为接口主要是扩展功能的,而没有具体存在
•只能是抽象方法
默认修饰符publicabstract
类与类,类与接口以及接口与接口的关系
●类与类
•继承关系,只能单继承,但是可以多层继承
●类与接口
•实现关系,可以单实现,也可以多实现。
还可以在继承一个类的同时实现多个接口
●接口与接口
继承关系,可以单继承,也可以多继承
8抽象类和接口的区别
●成员区别
•抽象类变量,常量;
有抽象方法;
抽象方法,非抽象方法
•接口常量;
抽象方法
●关系区别
•类与类继承,单继承
•类与接口实现,单实现,多实现
•接口与接口继承,单继承,多继承
●设计理念区别
•抽象类被继承体现的是:
”isa”的关系。
共性功能
•接口被实现体现的是:
”likea”的关系。
扩展功能
接口练习
●猫狗案例,加入跳高的额外功能
●老师和学生案例,加入抽烟的额外功能
●教练和运动员案例(学生分析然后讲解)
•乒乓球运动员和篮球运动员。
•乒乓球教练和篮球教练。
•为了出国交流,跟乒乓球相关的人员都需要学习英语。
•请用所学知识:
•分析,这个案例中有哪些抽象类,哪些接口,哪些具体类。
●1:
写代码的时候,所有的东西都加上。
(分析,实现,测试)
●动物类:
姓名,年龄,吃饭,睡觉。
●动物培训接口:
●猫继承动物类
●狗继承动物类
●部分猫继承猫类并实现跳高接口
●部分狗继承狗类并实现跳高接口
●通过抽象类测试基本功能。
●通过接口测试扩展功能。
●只测试猫,狗的测试留给学生自己练习
●人类:
●吸烟接口:
吸烟
●老师继承人类
●学生继承人类
●部分老师继承人类并实现吸烟接口
●部分学生继承人类并实现吸烟接口
●只测试老师,学生的测试留给学生自己练习
10式参数和返回值问题案例
●形式参数
•基本类型
•引用类型
●返回值类型
•链式编程
形式参数的问题在前面匿名对象的时候已经讲解过了。
●但是,今天又多了抽象类和接口类型作为形式参数。
●形式参数
●类:
需要的是该类的对象
●抽象类:
需要的是该抽象类的子类对象
●接口:
需要的是接口的子类对象
●具体类作为形式参数:
●classStudent{
●publicvoidshow(){
●System.out.println(“show”);
●}
●}
●classStudentDemo{
●//如果参数是一个类名,那么实际需要的是一个具体的对象
●publicvoidmethod(Students){
●s.show();
●}
●classStudentTest{
●publicstaticvoidmain(String[]args){
●//如何调用StudentDemo中的method方法呢?
●StudentDemosd=newStudentDemo();
●Students=newStudent();
●sd.method(s);
●抽象类作为形式参数:
●abstractclassPerson{
●publicabstractvoidshow();
●classPersonDemo{
●publicvoidmethod(Personp){
●p.show();
●//自己定义类继承自Person类
●classPersonTest{
●//如何调用PersonDemo中的method方法呢?
●PersonDemopd=newPersonDemo();
●Personp=newStudent();
●pd.method(p);
●接口作为形式参数,类似抽象类作为形式参数。
返回值的问题
●基本类型返回什么就用什么接收。
●引用类型
其实返回的是该类的对象
其实返回的是该类的子类对象
其实返回的是该接口的子类对象
●具体类作为返回值类型:
●publicStudentgetStudent(){
●//Students=newStudent();
●//returns;
●returnnewStudent();
●//如何测试呢?
●//原本我可以直接通过Student创建对象,调用功能
●//但是现在不让这样做,怎么办呢?
●Students=sd.getStudent();
●抽象类作为返回值类型:
●publicPersongetPerson(){
●Personp=new?
?
();
●returnp;
●
●returnnew?
●//自己定义类继承自Person类,否则PersonDemo代码无法完成?
●Personp=pd.getPerson();
//其实调用的是Student的
●接口作为返回值类型,类似抽象类作为返回值类型
链式编程的案例演示
●newPersonDemo().getPerson().show();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 基础 入门
![提示](https://static.bdocx.com/images/bang_tan.gif)