6继承.docx
- 文档编号:12532004
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:17
- 大小:26.16KB
6继承.docx
《6继承.docx》由会员分享,可在线阅读,更多相关《6继承.docx(17页珍藏版)》请在冰豆网上搜索。
6继承
继承和多态
一、本章知识点
●知识点1:
继承的概念及语法
类和类之间的关系:
is—alike—ahas--a
1.0)继承就是基于已存在的类扩展新类
2.0)子类扩展父类,将获得父类的全部成员变量和方法(构造器除外)
Java类只有一个直接的父类,可以有多个间接父类
//语法
publicclassChildextendsFather{
}
//继承注意事项:
1.父类私有的属性和方法不可以被继承
2.父类的构造方法不能被继承
1.1.1【案例1:
练习、讲解、重现】继承语法(视频—继承1)(继承综合练习)
//需求:
创建person类,属性:
姓名性别年龄;行为:
吃饭睡觉;创建学生类继承person类,添加学生的属性:
学号、成绩;学生行为:
学习、考试;并测试输出学生的信息和相应的行为。
classPerson{//创建Person类父类
Stringname;//定义属性字段
Stringsex;
intage;
publicPerson(){//创建构造方法(包括有参和无参)
}
//setgettoString()方法
publicvoideat(){//定义行为(方法体略)
}
publicvoidsleep(){
}
}
classStudentextendsPerson{//创建学生类继承Person类
intid;
intscore;//添加学生私有属性
publicStudent(Stringname,Stringsex,intage,intid,intscore){//添加子类构造方法
super(name,sex,age);
this.id=id;
this.score=score;
}
publicvoidhaveClass(){//定义子类扩展的方法学生学习(方法体略)、考试
}
publicvoidtest(){
}
}
classTest{//测试类
psvm{
Students=newStudent();
s.eat();
s.sleep();//测试父类里包含的方法
s.haveClass();
s.test();
}
}
●知识点2:
子类和父类构造方法
super关键字:
代表父类空间的引用(结合内存图)
super()写在子类构造方法中,调用父类有参或无参构造方法(如不写,则默认调用
父类无参,父类无参默认要写),调用语句必须在子类方法的第一句;指定调用父
类带相同参数的构造方法
super.写在子类实例方法中,用于指定访问子类中与父类同名的实例属性和方法
super关键字与this关键字的区别:
1.0代表的一个事物不一致Super代表的是父类空间的引用;this代表所属函数的调用对象
2.0使用前提不一致:
super关键字必须要有继承关系才可以使用,this关键字不需要有继承关系也可以使用
3.0调用构造函数的区别:
super关键字是调用父类的构造函数,而this关键字是调用本类的构造函数
2.1.1【案例3:
演示、讲解、重现】父类子类构造顺序和super关键字
父类子类构造顺序,先创建父类对象,再创建子类对象----先执行父类构造方法,再执
行子类构造方法(图示子类父类的关系)
//需求:
编程演示子类父类构造方法执行顺序
classCreature{
publicCreature(){
sout(“造物者无参构造方法”);
}
}
classAnimalextendsCreature{//创建动物类继承造物者类
privateStringname;
privateintage;
publicAnimal(Stringname){
sout(“Animal类带一个参数的构造方法”+name);
}
publicAnimal(Stringname,intage){
sout(“Animal类带两个参数的构造方法”+name+”\t”+age);
}
}
classWolfextendsAnimal{//创建狼类继承动物类
publicWolf(Stringname,intage){
sout(“狼类带有两个参数的构造方法”+super.name+”\t”+super.age);
}
}
classTest{//创建测试类
psvm{
Wolfwolf=newWolf(“狼”,1);//创建狼对象,观察执行结果
}
}
●知识点3:
方法重载和重写
重载(overload):
同一类模板中,同名不同参的方法,仅有返回类型不同的不能称为重载,无参和有参构造方法是典型的重载
重写(override):
子类模板中,重写父类同名同参的方法,访问修饰符必须大于等于父类方法(调用时,如有子类重写方法,则调用重写方法,如无,则调用父类方法)
3.1.1【案例4:
演示、讲解】方法重写
子类根据需要对父类继承来的方法进行改写,是多态机制的前奏
//测试重写父类方法的原因
calssBird{
publicvoidflay(){
System.out.println("我是鸟我能飞");
}
}
classOstrichextendsBird{
publicvoidfly(){
System.out.println("我是鸟但我不能飞");
}
publicstaticvoidmain(String[]args){
Ostrichos=newOstrich();
os.fly();
super.fly();
}
}
3.1.1【案例4:
练习、讲解、重现】方法重写
//需求:
创建Teacher类,属性:
姓名性别工号,行为:
上课;分别创建CTeacher、JTeacher类继承Teacher类,重写上课方法,输出不同的结果
classTeacher{
Stringname;
Stringsex;
intid;
//setget等略
publicvoidhaveClass(){
sout(“老师上课”);//父类的上课方法
}
}
classCTeacherextendsTeacher{
publicvoidhaveClass(){
sout(“CTeacher在上课”);//改写父类的方法
}
}
classJTeacher{
publicvoidhaveClass(){
super.haveClass();//在子类重写的方法中继续调用父类被重写的方法
//super.函数名获取
sout(“JTeacher在上课”);//改写父类的方法
}
}
classTest{
psvm{
CTeacherct=newCTeacher();
ct.haveClass();//如果子类重写父类的方法,执行子类里重写的方法,如//果子类里未重写父类的方法,执行父类里的方法
JTeacherjt=newJTeacher();
jt.haveClass();
}
}
●知识点4:
Object类
Object类是所有类的根类,java中的任何类,都继承了Object类中的方法
最常用的是toString和equals方法
通用方法包括equals,hashCode,getClass,toString
结论:
如果想改变对象在输出语句中的内容,需要重写toString方法,如果想按自己的逻辑比较两个相同对象,需要重写equals方法。
4.1.1【案例5:
练习、讲解、重现】继承和object
//需求定义一个(Person)类,包含属性:
姓名,年龄,性别;写好相关的方法,能够构
造的时候初始化或者后续修改属性值。
定义一个Employee类继承于Person类,包含新的属性:
职位;写好相关的方法,能够构造的时候初始化或者后续修改属性值,重写equals方法,规则:
当两个对象的姓名,年龄,性别,职位都相等时返回true,否则返回false。
写一个测试类进行相关测试(要求可以打印对象的信息,能够比较对象是否"相等")。
calssPerson{
Stringname;
intage;
Stringsex;
publicPerson(){
}
publicPerson(Stringname,intage,Stringsex){
this.name=name;
this.age=age;
this.sex=sex;
}
//setget方法
//重写toString方法
publicStringtoString(){
return“姓名:
”+name+”,年龄:
”+age+”,性别:
”+sex;
}
}
classEmployeeextendsPerson{
privateStringposition;
publicPerson(Stringname,intage,Stringsex,Stringposition){
super(name,age,sex);
this.position=position;
}
//setget方法
publicStringtoString(){//重写toString()
returnsuper.toString+”,职位:
”+position;
}
publicbooleanequals(Objectobj){
if(this==obj){//如果传回来的是同一个对象
returntrue;
}
if(obj==null){
returnfalse;
}
if(this.getClass()!
=obj.getClass){
returnflase;
}
Employeeep=(Employee)obj;
if(this.getName()!
=ep.getName){
returnfalse;
}elseif(this.getAge!
=ep.getAge){
returnfalse;
}elseif(this.getSex!
=ep.getSex){
returnfalse;
}elseif(this.getPosition!
=ep.getPosition){
returnfalse;
}
returntrue;
}
}
classTest{
psvm{
Employeeep1=newEmployee(“lsisi”,19,”nan”,”zhuli”);
Employeeep1=newEmployee(“sisi”,20,”nv”,”zheli”);
booleanflag=ep1.equals(ep2);
sout(flag);
}
}
●知识点5:
多态
多态,是指同一操作,作用于某一类对象,可以有不同的解释产生不同的执行结果。
实现多态的三个必要条件
1.要有继承和实现
2.方法重写
3.父类的引用指向子类的对象
5.1.1【案例6:
练习、讲解、重现】多态
//天下的鸟都到会搭巢,但是搭出来的巢却是千差万别---多态
//创建猫类和狗类继承动物类,重写动物吃的方法,实现不同结果
calssAnimal{//创建动物类
Stringname;
publicAnimal(){
}
publicAnimal(Stringname){
this.name=name;
}
publicvoideat(){
sout(“吃”);
}
}
classDogextendsAnimal{//创建狗类继承动物类
publicDog(Stringname){
super(name);
}
eat(){
sout(“狗啃骨头”);
}
}
classCatextendsAnimal{//创建毛类继承动物类
publicCat(Stringname){
super(name);
}
eat(){
sout(“猫吃鱼”);
}
}
classTest{
psvm{
Animalcat=newCat(“小花”);
Animaldog=newDog(”旺财“);
cat.eat();
dog.eat();
}
}
5.1.1【案例6:
练习、讲解、重现】多态
//需求:
编写电器父类,属性name,方法on,off;编写子类Fan风扇,直接重写on,off
方法,编写子类Light电灯,不重写任何方法,测试类使用对象数组,两个电器一
个风扇一个点灯,测试开关电器方法
classElectrical{//创建电器父类
Stringname;
publicElectrical(Stringname){//无参构造方法省略
this.name=name;
}
on(){
sout(“电器开始工作”);
}
off(){
sout(“电器停止工作”);
}
}
classFanextendsElectrical{//创建风扇子类继承电器父类
publicFan(Stringname){
super(name);
}
on(){//重写父类on方法
sout(“风扇开始转动”);
}
off(){//重写父类off方法
sout(“风扇停止转动”);
}
}
classLightextendsElectrical{
publicLight(Stringname){
super(name);
}
}
classTest{
psvm{
Electrical[]electricals=newElectrical[2];//创建对象数组
electricals[0]=newFan("风扇");//赋值初始化
electricals[1]=newLight("电灯");
for(inti=0;i electricals[i].on(); electricals[i].off(); } } } ●知识点6: 对象上下转型(里氏替换原则) Java程序,引用变量只能调用编译时的类型而不能调用运行时的类型 Java类型转换运算符,(type)变量名 1.基本类型转换 2.引用类型转换: 只能在具有继承关系的两个类之间进行转换,如果是在两个没有关系的类型之间转换,会报编译错误(ClassCastException),如果需要转换,用instanceof运算符进行判断 3.Instanceof用法: result=objectinstanceofclass result: 布尔类型的结果 object: 引用型变量 class: 一个类 如果object是class或其一个子类的实例,则结果返回true,如果不是,或者object为空则返回false; 6.1.1【案例6: 演示、练习、讲解】上下转型 //以猫狗为例,演示上、下转型 publicclassAnimalTest{ publicstaticvoidmain(String[]args){ //向上转型—由子类指向父类(父类的引用指向子类的对象),是安全 //的,会损失子类的方法 Animalanimal=newDog("小黑"); animal.eat(); //向下转型—子类指向父类(子类对象指向父类的引用),不安全 If(animalinstanceofCat){ Catcat=(Cat)animal; cat.eat(); } } } ●知识点7: 继承和多态的综合运用 7.1.1【案例6: 练习、讲解、重现】继承和多态综合运用 //需求: 学校中心配备一台打印机(可以是黑白打印机,也可以是彩色打印机)。 中 心可以通过打印机打印学员的个人信息(张三和李四等)。 通过继承和多态来设计这个程序,使程序具有更好的扩展性和维护性。 classPrinter{ Stringbrand;//定义品牌属性 publicPrinter(Stringbrand){ this.brand=brand; } publicvoidprintContent(Stringcontent){//定义打印方法 } } classColorPrinter{//定义彩色打印机类,继承打印机类 publicColorPrinter(Stringbrand){ this.brand=brand; } publicvoidprintContent(Stringcontent){//定义打印方法 sout(this.getBrand+”彩色打印机打印: ”+content); } } classBlackPrinter{//定义黑白打印机类,继承打印机类 publicBlackPrinter(Stringbrand){ this.brand=brand; } publicvoidprintContent(Stringcontent){//定义打印方法 sout(this.getBrand+”黑白打印机打印: ”+content); } } classSchool{ privatePrinterprinter;//聚合(hasa)将另一个类的对象作为本类的属性 publicSchool(){ } publicvoidsetPrinter(Printerprinter){//为学校设置打印机 this.printer=printer; } publicvoidprint(Objectcontent){ if(this.printer==null){ sout(”请安装打印机“); } this.printer.printContent(content.toString); } } classTest{ psvm{ Schoolsc=newSchool(); Printercp=newColorPrinter(“惠普”); Printerbp=newBlackPrinter(“松下”); sc.setPrinter(cp); sc.print(”lisi“); } } ●知识点8: 今日内容总结 ●继承 ●多态 ●知识点9: 作业布置 1.0用Java程序完成以下场景: 有一个主人(Master类),他养了两只宠物(Pet类),一只宠物是狗(Dog类),名字叫“旺财”,另一只宠物是猫(Cat类),名字叫“小花”,现在有两种食物(Food类),分别是骨头(Bone)和鱼(Fish)。 主人分别给两只宠物喂食物,两只宠物厌食,狗只吃骨头(如果主人为够吃别的食物,就显示“狗不吃某某食物”);猫只吃鱼(如果主人为猫吃别的食物,就显示“猫不吃某某食物”) 运行结果如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 继承