1.多态:同一个实现接口,使用不同的实例而执行不同的操作;
使用多态可以节省很多代码量
2.多态的几种用法:
a.使用父类作为方法形参实现多态
public class test1 {
public static void main(String[]args)
{
Master master=new Master("王先生",100);
Pet pet=new Dog("皮皮",90);
master.feed(pet);
}
}
public class Master {
private String name="";
private int money=0;
public Master(String name,int money)
{
this.name=name;
this.money=money;
}
public void feed(Pet pet)
{
pet.eat();
}
其中 Pet pet=new Dog("皮皮",90);
将一个父类的引用指向一个子类对象,称为向上转型,会自动进行类型转换;
此时通过父类引用变量调用的方法是子类重写或继承父类的方法,不是父类的方法
此时通过父类引用变量无法调用子类特有的方法;
b.使用父类作为方法返回值实现多态
public class Master {
private String name="";
private int money=0;
public Master(String name,int money)
{
this.name=name;
this.money=money;
}
public Pet getPet(int typeId)
{
Pet pet=null;
if(typeId==1)
{
pet=new Dog("偶偶",10);
}else if(typeID==2)
{
pet=new Penguin("皮皮",1);
}
return pet;
}
}
package duotai;
import java.util.*;
public class test1 {
public static void main(String[]args)
{
Master master=new Master("王先生",100);
Scanner z=new Scanner(System.in);
System.out.println("欢迎您来到宠物店");
System.out.println("请选择要领养的宠物类型:(1.狗,2.企鹅)");
int typeId=z.nextInt();
Pet pet =master.getPet( typeID);
if(pet!=null)
{
System.out.print("领养成功");
master.feed(pet);
}
else
{
System.out.println("领养失败!");
}
}
}
c.父类到子类的转换(向下转型),即子类的还原 需要强转
目的:实现对子类特有的方法的调用
public class test1 {
public static void main(String[]args)
{
Pet pet =new Dog("皮皮",10);
pet.eat();
//pet.catchingFly(); //编译报错,无法调用子类特有的方法
Dog dog =(Dog)pet; //强制类型转换成狗对象
dog.catchingFly(); //此时不会报错,调用狗类的特用方法
}
}
3.instanceof 运算符
用来判断一个对象是否属于一个类或者实现了一个接口,结果为true或false,在强制类型转换前通过instanceof运算符检查对象的真实类型,再进行相应的强制类型转换,这样可以避免类型转换异常,提高代码的健壮性
public class test1 {
public static void main(String[]args)
{
Pet pet=new Dog("Pip",10);
pet.eat();
if(pet instanceof Dog)
{
Dog dog =(Dog)Pet;
dog.catchingFly();
}
else if(pet instanceof Penguin)
{
Penguin pen=(Penguin)pet;
pen.swimming();
}
}
}
4.使用instanceof 运算符时, A类 instanceof B类 , A类必须和B类存在上下级关系,否则会出现编译报错
5.实现多态必须满足3个条件:
a.继承的存在
b.子类重写父类的方法
c.父类引用变量指向子类对象