Java 面向对象三大特征之一: 多态
2018-06-18 03:07:18来源:未知 阅读 ()
多态与类型转换
子类重写父类方法
1)位置:子类和父类中有同名的方法
2)方法名相同,返回类型和修饰符相同,参数列表相同
方法体不同
多态的优势和应用场合
多态:同一个引用类型,使用不同的实例而执行不同的操作
实现多态的两种形式
1.使用父类作为方法形参实现多态
2.使用父类作为方法返回值实现多态
形式1.1:父类做形参
子类做实参
形式1.2:父类做类型
子类实例化
(数据类型中的自动类型转换)
形式2.1:父类作为方法的返回值
子类实例化,类型自动转换
生活中的多态:
打印机
结论:
同一事物,由于条件不同,产生的结果也不同
多态实现思路:
编写父类
编写子类,子类重写父类方法
运行时,使用父类的类型,子类的对象(自动类型转换)
优势:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。 赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。 举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。 比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。 使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。 简单的说,建立一个父类的变量,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个变量调用这个函数的时候,定义这个变量的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。
多态的终极目标:为了实现统一调用
■多态可以减少类中代码量
·可以提高代码的可扩展性和可维护性
■向上转型一子类转换为父类,
·自动进行类型转换
■向下转型一父类转换为子类,
·结合instanceof运算符进行强制类型转换
注:方法重载也是多态的一种体现
栗子:
/** * */ package bdqn.javademos; /** * * @author: 房上的猫 * * @time: 下午3:51:59 * * 博客地址: https://www.cnblogs.com/lsy131479/ * */ /** * @author xjz *父类 宠物类 */ public class Pet { public void eat(){ System.out.println("pet正在吃"); } }
/** * */ package bdqn.javademos; /** * * @author: 房上的猫 * * @time: 下午3:51:59 * * 博客地址: https://www.cnblogs.com/lsy131479/ * */ /** * @author xjz * */ public class Cat extends Pet { public void eat(){ System.out.println("猫吃猫粮"); } public void ball(){ System.out.println("猫玩球"); } }
/** * */ package bdqn.javademos; /** * @author xjz *子类:狗狗类 */ public class Dog extends Pet{ public void eat(){ System.out.println("狗狗吃狗粮"); } public void catchFlyDisk(){ System.out.println("狗狗玩飞盘"); } }
/** * */ package bdqn.javademos; /** * @author xjz *企鹅类 */ public class Penguin extends Pet{ public void eat(){ System.out.println("企鹅吃鱼"); } public void swiming(){ System.out.println("企鹅游泳"); } }
/** * */ package bdqn.javademos; /** * @author xjz *主人类 */ public class Master { public void feed(Pet pet){ pet.eat(); } //领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换 public Pet getPet(int typeid){ Pet pet=null; if(typeid==1){ pet=new Dog(); } else if(typeid==2){ pet=new Penguin(); } else if(typeid==3) { pet=new Cat(); } return pet; } }
package bdqn.javademos; import java.util.Scanner; public class Test { /** * @param args */ public static void main(String[] args) { //多态的形式1 Dog dog=new Dog(); Penguin peng=new Penguin(); Cat cat=new Cat(); Master ms=new Master(); ms.feed(dog); ms.feed(peng); ms.feed(cat); //多态的形式2:父类做类型,子类实例化 Pet pet=new Dog();//自动转换 pet.eat(); //调用领养宠物 形式3:父类作为方法的返回类型 System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) "); Scanner input=new Scanner(System.in); int xz=input.nextInt(); Master dx=new Master(); Pet pets=dx.getPet(xz); pets.eat(); } }
instanceof运算符的使用
作用:用来判断一个对象是否属于一个类或者实现一个接口
类型转换比较
1.
子类转换父类
向上转型
自动转换
2.
父类转换子类
向下转型
使用isntanceof用作比较判定
子类 对象名 = (子类)父类;
使用子类对象
栗子:
/** * */ package bdqn.javademos; /** * @author xjz *父类 宠物类 */ public class Pet { public void eat(){ System.out.println("pet正在吃"); } }
/** * */ package bdqn.javademos; /** * @author xjz * */ public class Cat extends Pet { public void eat(){ System.out.println("猫吃猫粮"); } public void ball(){ System.out.println("猫玩球"); } }
/** * */ package bdqn.javademos; /** * @author xjz *子类:狗狗类 */ public class Dog extends Pet{ public void eat(){ System.out.println("狗狗吃狗粮"); } public void catchFlyDisk(){ System.out.println("狗狗玩飞盘"); } }
/** * */ package bdqn.javademos; /** * @author xjz *企鹅类 */ public class Penguin extends Pet{ public void eat(){ System.out.println("企鹅吃鱼"); } public void swiming(){ System.out.println("企鹅游泳"); } }
/** * */ package bdqn.javademos; /** * @author xjz *主人类 */ public class Master { public void feed(Pet pet){ pet.eat(); } //领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换 public Pet getPet(int typeid){ Pet pet=null; if(typeid==1){ pet=new Dog(); } else if(typeid==2){ pet=new Penguin(); } else if(typeid==3) { pet=new Cat(); } return pet; } //主人和宠物玩耍的行为 public void play(Pet pet){ if (pet instanceof Dog) { Dog dog=(Dog)pet;//向下转型 dog.catchFlyDisk(); }else if(pet instanceof Penguin){ Penguin peng=(Penguin)pet; peng.swiming(); }else if(pet instanceof Cat){ Cat cat=(Cat)pet; cat.ball(); } } }
package bdqn.javademos; import java.util.Scanner; public class Test { /** * @param args */ public static void main(String[] args) { //多态的形式1 Dog dog=new Dog(); Penguin peng=new Penguin(); Cat cat=new Cat(); Master ms=new Master(); ms.feed(dog); ms.feed(peng); ms.feed(cat); //多态的形式2:父类做类型,子类实例化 Pet pet=new Dog();//自动转换 pet.eat(); //调用领养宠物 形式3:父类作为方法的返回类型 System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) "); Scanner input=new Scanner(System.in); int xz=input.nextInt(); Master dx=new Master(); Pet pets=dx.getPet(xz); pets.eat(); dx.play(dog); } }
(C) 房上的猫 。 保留所有权利。
https://www.cnblogs.com/lsy131479/
如需转载,请注明出处!!!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Java 9 新特性
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash