JAVA基础(十三)多态
多态:
自己理解:
子类继承父类并重写父类方法,调用方法是调用子类里重写父类的方法,想要调用子类特有方法,得向下转型后在调用。
多态:
1. 多态的定义格式:就是父类的引用变量指向子类对象
2.封装和继承几乎都是为多态而准备的
3.多态的前提是继承;必须拥有子父类关或者接口类和实现类关系;否则无法完成多态;
4.使用多态后的父类引用变量调用方法时,会调用子类重写后的方法.
多态格式:
父类类型 变量名 = new 子类类型();
FU a=new ZI();
多态又叫向上转型; 父类类型 变量名=new 子类类型;
FU a=new ZI();
Animal cat=new Cat();
向下转型: 子类类型 变量名 =(子类类型)父类类型变量名
在向下转型的时候 要加判断instranceof进行判断是否是同一种类型
子类类型 变量名 = (子类类型) 父类类型的变量;
FU an=new ZI();
if(an instanceof ZI){
ZI ca=(ZI)an;
ca.子类特有方法名();
}
Instanceof关键字
instanceof关键字来判断某个对象是否属于某种数据类型。
使用格式:
boolean b = 对象 instanceof 数据类型; 结果为 true 或 false;
加判断 if 语句为true 向下转,可以调子类中特有的方法
向上转型:
/小类型(子类)->大类型(父类) 自动转
向下转型:
/大类型(父类)->小类型(子类) 强转
向上转型与向下转型
.什么时候用向上转型:
1.当不需要面对子类类型时,提高代码的复用性,
2.父类的变量和方法就能满足现在需求不需要调用子类特有的属性方法时;
.什么时候向下转型:
1.当需要子类特有的方法时;
.向下转型的好处是:
可以使用子类特有的方法;
缺点:
在向下转型时易发生lass Cast Exception就是类型不对应的错误;
这时需要加instranceof进行判断是否是同一种类型
代码演示:
public class Demo01 { public static void main(String[] args) { Animal an=new Cat(); //FU an=new zi //Animal与 Cat()有关系 an=Cat(); // boolean flag=an instanceof Animal; boolean flag=an instanceof Dog; System.out.println(flag); } }
导包 import com.orcale.demo01.Animal; import com.orcale.demo01.Cat; import com.orcale.demo01.Dog; public class demo01 { public static void main(String[] args) { Animal an=get();//get()=( An an=new cat(); ) an.eat();//调用子类 eat()方法 if(an instanceof Cat) {//向下转型 调用子类特有的方法 Cat c=(Cat)an; c.catMouse(); } method(new Dog()); //传Dog类 method(new Cat()); //传Cat类 } //这个方法告诉我们 多态如何提高代码复用性 public static void method(Animalt an){ an.equals("aa"); }/*多态: * 具有不同功能的子类,向上转型就可以调用不同的子类功能*/ 子类功能就是重写父类后的功能 //多态在方法中另一种实现方法 public static Animal get(){ Cat c=new Cat(); Return c; /*也可以写成一下方式 return new Cat();*/ }
代码分析多态:
可以利用这个方法调用所有子类中相同重写父类的方法
在main方法里method(各个子类类型)都重复调用
method(new Dog());
method(new Cat())
public static void method(Animalt an){
an.equals("aa");
}
如果调用子类中特有的方法:向下转型
// if(an instanceof Cat) {//向下转型 调用子类特有的方法
Cat c=(Cat)an;
c.catMouse();
}
/*在多态中
* 成员变量的特点: 编译时看父类的变量, 不用看子类。
* 如果父类有,则编译成功
* 如果父类没有,则编译失败
* 运行时:看父类的变量
* 编译运行看左边,
* 左边有则成功
* 没有失败
* 成员方法的特点: 编译时看父类的方法,如果有 ,则编译成功,
* 如果父类没有,则失败
* 运行时看子类重写后的方法
* 总结: 编译,运行看左边有木有,
运行看右边重写后的方法
多态缺点:
自己总结: 多态 无法调用子类独有方法
调子类方法需要向下转型,无法调父类
当父类的引用指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型。向上转型的好处是隐藏了子类类型,提高了代码的扩展性。
但向上转型也有弊端,只能使用父类共性的内容,而无法使用子类特有功能,功能有限
用法:
l 什么时候使用向上转型:
当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。
l 什么时候使用向下转型
当要使用子类特有功能时,就需要使用向下转型。
l 向下转型的好处:可以使用子类特有功能。
l 弊端是:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。