多态
多态性的基本概念:多态性必须在继承性的基础上实现
两种实现模式:
1. 方法的多态性:
方法的重载:同一个方法名称可以根据传入的参数的个数和类型的不同来实现不同功能的执行。
方法的覆写:同一个方法可能根据使用子类的不同,有不同的实现。(类不同,方法的功能也可能不一样)
2. 对象的多态性:父子实例之间的转换处理
对象向上转型:父类 父类实例 = 子类实例 (自动完成)
--优势:可以对参数进行统一的设计(同一个父类的子类可以统一传入父类参数),可以实现接收或者返回参数的统一性。
对象向下转型:子类 子类实例 = (子类) 父类实例 (强制转换)
--特点:需要使用到子类的一些特殊处理
--缺陷:不安全,向下转型首先要经过向上转型
对象转型:
class Message { public void print(){ System.out.println("这是Message的实例化"); } } class SonMessage extends Message{ //对print方法进行覆写 public void print(){ System.out.println("这是SonMessage的实例化"); } } public class Demo{ public static void main(String args[]){ Message msg = new SonMessage(); //对象的向上转型,实例化的是子类对象,而不是父类 msg.print(); } } /*------------------------------------- F:\Code>java Demo 这是SonMessage的实例化 F:\Code>*/
//向下转型实例 class Person { public void print(){ System.out.println("现在我是一个正常人。"); } } class SuperMan extends Person { public void fly(){ System.out.println("我是超人了,可以飞!"); } public void fire(){ System.out.println("我有超能力,可以拯救世界!"); } } public class Demo{ public static void main(String args[]){ //向上转型 Person per = new SuperMan(); per.print(); //输出--现在我是一个正常人。 //向下转型--正常人变超人 SuperMan superman = (SuperMan) per; superman.fly(); superman.fire(); } } /*----------------------------------------------- F:\Code>java Demo 现在我是一个正常人。 我是超人了,可以飞! 我有超能力,可以拯救世界! F:\Code>*/
注意:发生对象的向下转型之前一定要先发生向上转型,两个没有任何关系的实例如果要强制转换,会出现“ClassCastException”异常,向下转型并不安全。
instanceof 关键字:判断某个实例是否是某个类的对象。
//--对象 instanceof 类 superman instanceof Person //返回的是 boolean 值
如果以后要执行对象的向下转型,最好先用 instanceof 判断
public class Demo{ public static void main(String args[]){ //向上转型 Person per = new SuperMan(); if(per instanceof SuperMan){ //向下转型 SuperMan superman = (SuperMan) per; System.out.println(superman.fly()); System.out.println(superman.fire()); } } }