1. 多态性在面向对象中是一个重要的概念,在JAVA中面向对象主要有以下两种体现:
1.对方法的重载与覆写。
2.对象的多态性。
掌握对象多态性之后可以直接应用在抽象类的接口上。
2. 对象的多态性
对象多态性主要分为以下两种类型:
1.向上类型:子类对象--->父类对象
对于向上转型,程序会自动完成,格式:
对象向上转型: 父类 父类对象 =子类实例;
2.向下转型:父类对象--->子类对象
对于向下转型时,必须明确的指明要转型的子类类型,格式:
对于向下转型:子类 子类对象 =(子类) 父类实例;
以上程序是通过子类进行父类对的实例化的操作,就是说如果调用调用的方法被子类覆写过,则
调用的是被覆写过的方法。反之,若没有被子类覆写,则调用本类中的方法。
注意:转型之后,因为操作的是父类对象,所以是无法找到在子类中定义的新方法。例如程序中的fun3。
将父类对象变为子类对象,称为向下转型,向下转型需要强制转换 。
在类B中存在三个方法,所以可以全部调用。
但是,进行对象向下转型操作有一个注意点。
上图是将之前的A a =new B(); 改为A a= new a();
编译时不会出现问题,但在执行时候会出现如下问题:
上述错误是继空指向后,在开发中常见的问题,表示A不能转到B。
此异常在对象转型时经常发生,如果两个没有关系的对象之间发生了转换关系,则肯定出现此异常。
上程序中,若单看A类,不能确定A有那些子类,所以他们是没有关系的;而单看B类,可以明显的知道B类是A的子类,
可以看出A,B两个类是有关系的。
就是说,如果要想产生对象的向下转型,则必须先产生一个向上的转型关系。
3. instanceof 关键字
在JAVA中可以使用instanceof关键字判断一个对象到底是那个类的实例
格式: 对象 instanceof 类--->返回boolean类型
例如: a instanceof B; //判断实例a是否属于B
在开发中一定要注意,对于向下转型操作最好增加验证,以保证转型时不会发生
ClassCastException。
如果要增加新的子类,则肯定要修改方法,如果这样程序就失去了灵活性,所以
在程序的开发中设计的重点应该放在父类上,只要父类设计的足够合理,则开发肯
定会非常的方便。
注意:程序开发中,一个类一定不要继承已经实现好的类,只能继承抽象类或者实现接口,