package cn.pen;
//执行类
import java.util.Scanner;public classTest {public static voidmain(String[] args) {//Dog dog = new Dog("二狗",90,0,"土狗");//把Dog的类引入进来//Master master = new Master("王二小");//在把主人类引用进来//master.feed(dog);//把dog(Dog类的入口或钥匙)引入主人类的feed方法//dog.showInfo();//引出Dog类的showInfo方法
/*执行结果:
* 王二小正在喂:二狗
二狗吃狗粮...
我的姓名:二狗,健康值:93,亲密度0,我是一只土狗*/
//每个动物都有吃,但吃的方法不同,造成的结果也就不同,但动物有很多种,我们不能每个动物子类都这样写一遍//所以我们用到了:多态/*多态
*
*
软件设计原则—开闭原则 ,对拓展开放,对修改关闭。为什么要使用多态?对系统进行业务拓展,增加系统的可维护性。
可以理解为多种状态/多种形态
同一事物,由于条件不同,产生的结果不同
程序中的多态
同一引用类型,使用不同的实例而执行结果不同的。
同:同一个类型,一般指父类。
不同:不同的子类实例
不同:针对同一方法执行的结果不同
比如说睡觉,不同的动物睡觉方法不同,最后结果不同*/
/*在多态中存在两种类型转换,一种是自动类型转换,一种是强制类型转换。
在引用数据类型转换过程中,
自动类型转换也称向上类型转换。子类可以自动转换成父类。
多态的实现形式
* 父类类型 引用 子类对象(本质)
Pet pet=null; //同一引用类型(父类)
pet = new Dog("二狗",90,0,"土狗") ;// [ 自动类型转换] 父类类型引用子类对象,当调用eat方法时,执行的是被子类对象重写/实现的eat方法。
pet.eat(); // 呈现多态
结果:二狗吃狗粮...
王二小正在喂:二狗
**/
//父类作为方法形参实现多态
/*Pet pet=null; //同一引用类型(父类)
pet=new Dog("二狗",100,0,"土狗"); // 父类引用 引用 子类对象
Master master = new Master("王二小");
master.feed(pet); // 呈现多态
pet.showInfo(); // 呈现多态
pet=new Penguin("大脚", 90, 50, Penguin.SEX_FEMALE); // 父类引用 引用 子类对象
master.feed(pet); // 父类引用 引用 子类对象
pet.showInfo(); // 呈现多态
同样的结果,但是我们只在主人类那只需写引用父类的代码就可以了 ,无需向上面那样每个动物都需在主人类那写一遍
* 现在没增加一种动物就只会多写一个类就可以了,无需再主人类那加一条方法;实现一个方法多种使用
结果:
王二小正在喂:二狗
二狗吃狗粮...
我的姓名:二狗,健康值:103,亲密度0,我是一只土狗
王二小正在喂:大脚
大脚在吃鱼...
我的姓名:大脚,健康值:95,亲密度50,我是一只Q妹
父类作为方法的返回值实现多态:*/System.out.println("欢迎光临sxt宠物店");
System.out.println("请选择领养的宠物 1.狗狗 2.企鹅");
Scanner arr=new Scanner(System.in);int type=arr.nextInt(); //控台输入type
Master master = new Master("王二小"); //引用Master类
Pet pet = master.adoptPet(type); //把type赋值给Master类adoptPet方法判断,得出来结果后赋给pet
/*强制类型转换也称向下类型转换。父类可以强制转换成子类
* 子类类型 引用 = (子类)父类对象
* 一般而言,需要判断父类对象的真实类型,用instanceof关键字
* obj instanceOf 类/接口 判断obj是否是类/接口的实例
instanceof通常和强制类型转换结合使用
instanceof是判断是否能强制转换,能返回true
* 如果要调用子类特有的方法时,一定要强制类型转换,通过instanceof鉴别具体类型*/
if(pet instanceof Dog) { //得到从Master得到的返回值pet,然后判断是强制转换给Dog还是Penguin,
Dog dog = (Dog) pet; //判断完之后再一个一个赋值
dog.setName("二狗");
dog.setHealth(90);
dog.setLove(20);
dog.setStrain("土狗");
}else if(pet instanceof Penguin) {
Penguin penguin=(Penguin) pet;
penguin.setName("大脚");
penguin.setHealth(90);
penguin.setLove(20);
penguin.setGender(Penguin.SEX_FEMALE);
}
master.play(pet);//再把被赋完值之后的pet引入Master的piay方法执行再返回结果
pet.showInfo();
}
}