09-java-多态

上传人:慢*** 文档编号:235927049 上传时间:2022-01-06 格式:PPT 页数:33 大小:1.93MB
返回 下载 相关 举报
09-java-多态_第1页
第1页 / 共33页
09-java-多态_第2页
第2页 / 共33页
09-java-多态_第3页
第3页 / 共33页
09-java-多态_第4页
第4页 / 共33页
09-java-多态_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《09-java-多态》由会员分享,可在线阅读,更多相关《09-java-多态(33页珍藏版)》请在金锄头文库上搜索。

1、Java程序设计-多态主讲人:黄承宁n接下来课堂时间讲解多态性的三个内容: 方法的重载与覆写; 对象的多态性; instanceof关键字。课程介绍 Introduction为什么使用多态4-1宠物饿了,需要主人给宠物喂食u不同宠物吃的东西不一样u不同宠物恢复后体力值不一样 吃狗粮 吃鱼 狗狗 企鹅 问题健康值增加3 狗狗 健康值增加5 企鹅 为什么使用多态4-2狗狗类u增加狗狗吃食的方法企鹅类u增加企鹅吃食的方法创建主人类u编写给狗狗喂食的方法u编写给企鹅喂食的方法编写测试方法u调用主人类给狗狗喂的方法u调用主人类给企鹅喂的方法分析为什么使用多态4-3 如果再领养XXX宠物,就需要给XXX看

2、病,怎么办?u添加XXX类,继承Pet类,实现吃食方法u修改Master类,添加给XXX喂食的方法问题为什么使用多态4-3public class Master public void feed( Dog dog ) dog.eat(); public void feed( Penguin pgn ) pgn.eat(); public void feed( XXX xxx ) xxx.eat(); 主人类 Master master = new Master();master.feed(dog);master.feed(penguin);master.feed(xxx); 测试方法 频繁修改

3、代码,代码可扩展性、可维护性差,如何优化? 参数都是Pet类的子类可否使用一个feed(Pet pet)实现对所有宠物的喂食? 使用多态优化设计 什么是多态 生活中的多态u不同类型的打印机打印效果不同 程序中的多态多态:同一个引用类型,使用不同的实例而执行不同操作 父类引用,子类对象 同一种事物,由于条件不同,产生的结果也不同黑白打印机 彩色打印机 打印多态性多态性在面向对象中中是一个最重要的概念,在java中面向对象中的多态性,主要有以下两种体现方式: (1)方法的重载与覆写 (2)对象的多态性 定义: 方法的重载就是方法名称相同,但参数的类型和参数的个数不同,通过传递参数的个数及类型不同以

4、完成不同功能的方法调用。 说明:(1)方法名称相同;(2)功能不同;(3)参数类型与参数个数不同。 什么是方法重载public static int sum(int x,int y)/方法名称为sum,实现两个整数求和,包含两个整型参数int s=0;s=x+y;return s;public static int sum(int x,int y,int z)/方法名称同为sum,实现三个整数求和,包含三个整型参数int s=0;s=x+y+z;return s;public static float sum(int x,int y,int z,int m)/方法名称同为sum,实现四个浮点数

5、求和,包含四个浮点型参数float s=0.0f;s=x+y+z+m;return s;方法重载public class PolDemo public static void main(String args) int result1=sum(10,20);int result2=sum(10,20,30);float result3=sum(10,20,30,40);System.out.println(sum(int x,int y)-+result1);System.out.println(sum(int x,int y,int z)-+result2);System.out.print

6、ln(sum(int x,int y,int z,int m)-+result3);验证方法重载从程序中可以发现sum()方法被重载了三次,而且每次重载时的参数类型或个数都有不同,所以在调用的时候,会根据参数的类型和个数自动进行区分。方法重载的注意方法的重载一定只是在参数上的类型或个数不同,而下面的代码根本不叫方法重载: public static float add(int x, int y) / 返回float型,但参数类型及个数一致float temp = 0;temp = x + y;return temp;public static int add(int x, int y) / 返

7、回int型,但参数类型及个数一致int temp = 0;temp = x + y;return temp;方法的覆写 在继承的关系中也存在着方法覆写的概念,所谓的方法覆写就是指子类定义了与父类中同名的方法,但是在方法覆写时必须考虑到权限,即:被子类覆写的方法不能拥有比父类方法更加严格的访问权限。 已学习过的三种访问权限:u关于访问权限,实际之前章节的代码中已经见过三种访问权限了:private、default、public,这三种访问权限的具体作用后面章节会有介绍,我们暂时只需要记住大小关系即可: private default void print() ;class Student ext

8、ends Person/ 定义一个子类继承Person类public void print()/ 覆写父类中的方法,扩大了权限System.out.println(Student - void print() ;public class OverrideDemo01 public static void main(String args)new Student().print() ; / 此处执行的是被覆写过的方法错误的方法覆写 如果现在被子类覆写的方法权限缩小的话,则在编译时将出现错误提示。 class Personpublic void print()/ 定义一个默认访问权 限的方法Sys

9、tem.out.println(Person - void print() ;class Student extends Person/ 定义一个子类继承Person类void print()/ 覆写父类中的方法,但缩小了权限,错误System.out.println(Student - void print() ;调用父类中被子类覆写过的方法 在子类中可以使用“super.方法()”的形式,从子类访问父类中的方法。class Personvoid print()/ 定义一个默认访问权 限的方法System.out.println(Person - void print() ;class St

10、udent extends Person/ 定义一个子类继承Person类public void print()/ 覆写父类中的方法,扩大了权限super.print() ;/ 调用父类中的print()方法System.out.println(Student - void print() ;public class OverrideDemo03 public static void main(String args)new Student().print() ;/ 此处执行的是被覆写过的方法属性的覆盖 在继承中除了方法可以覆写之外,属性也可以覆盖,所谓的属性覆盖就是指子类声明了与父类同名的属

11、性。class Personpublic String info = “njpji ;/ 定义一个公共属性class Student extends Person/ 定义一个子类继承Person类public String info = “HCN ;/ 此属性与父类中的属性名称一致public void print()System.out.println(父类中的属性: + super.info);/ 访问父类中的info属性System.out.println(子类中的属性: + this.info);/ 访问本类中的info属性public class OverrideDemo05 pub

12、lic static void main(String args)new Student().print() ;/ 调用print()方法方法的重载与覆写的区别 No.区别别点重载载覆写1单词OverloadingOverriding2定义方法名称相同,参数的类型或个数不同方法名称、参数的类型、返回值类型全部相同3对权限没有要求被覆写的方法不能拥有更严格的权限4范围发生在一个类中发生在继承类中对象的多态性 对象的多态性主要分为以下两种类型: u向上转型:子类对象 父类对象 l对于向上转型,程序会自动完成,格式:对象向上转型:父类 父类对象 = 子类实例 ;u向下转型:父类对象 子类对象l对于向

13、下转型时,必须明确的指明要转型的子类类型,格式:对象向下转型:子类 子类对象 = (子类)父类实例 ; 对象的向上转型 package cn.nj.pji;class Personpublic void show1()System.out.println(hello-父类person-show()1);public void show2()System.out.println(hello-父类person-show()2);class Student extends Personpublic void show1()System.out.println(hello-子类student覆写-sh

14、ow()1);public void show3()System.out.println(hello-子类student自有-show()3);public class PolDemo public static void main(String args) /向上转型:父类 父类对象 = 子类实例Student stu = new Student();/子类实例Person per = stu;/子类实例向上转型父类对象per.show1();per.show2();父类调用的是被子类覆写过的方法对象的向下转型 package cn.nj.pji;class Personpublic voi

15、d show1()System.out.println(hello-父类person-show()1);public void show2()System.out.println(hello-父类person-show()2);class Student extends Personpublic void show1()System.out.println(hello-子类student覆写-show()1);public void show3()System.out.println(hello-子类student自有-show()3);public class PolDemo public

16、static void main(String args) /向下转型(需要强制转换):子类 子类对象 = (子类)父类实例Person per = new Person();/父类实例Student stu = (Student)per;/父类实例向下转型为子类对象,强制转换stu.show1();stu.show2();stu.show3();类型转换异常注意:对象向下转型的要求 向下类型转换格式:对象向下转型:子类 子类对象 = (子类)父类实例 ; 但是按照此格式编写的代码在运行过程中出现了异常:java.lang.ClassCastException即:类型转换异常解决机制:在进行对象的向下转型之前,必须首先发生对象向上转型。 修改后的转型 package cn.nj.pji;class Personpublic void show1()System.out.println(hello-父类person-show()1);public void show2()System.out.println(hello-父类person-show()2);class Student ex

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号