多态(三)
1.多态
1.1多态:一种事物的多种形态
1.2多态的表现
行为(方法)多态:重写和重载
引用多态(动态绑定):编译时的类型和运行时的类型不一致的这种现象叫动态绑定
eg:父类=子类 Pet p=new Dog();
1.3向上转型和向下转型
向上转型:父类=子类
eg:Pet p=new Dog();
向下转型:子类=(子类)父类
eg:Dog d=(Dog)p;
注意:java.lang.ClassCastException:类型转换异常
父类的运行时类型跟要转成子类的类型的不一致
注意:引用多态存在继承关系
2.instanceof
语法:对象A instanceof 类型B
判断对象A的类型是否是类型B,如果是就返回true,否则返回false
eg:d instanceof Dog
3.实现多态的两种形式
a.使用父类作为方法形参实现多态
eg:public void paly(Pet p){...};
b.使用父类作为方法返回值实现多态
eg:public Pet getPet(int type){...};
运行结果:
1 package Day10三; 2 3 public class Dog extends Pet{ 4 private int strain; //品种 5 6 //语法:public 类名(参数列表){ } 7 //构造方法(默认构造方法) 8 public Dog(){ 9 10 } 11 12 public void catchingFlyDisc(){ 13 System.out.println("--接飞盘--"); 14 15 //健康值-10 16 int health=getHealth(); 17 health=health-10; 18 setHealth(health); 19 20 //亲密度+5 21 int love=getLove(); 22 love=love+5; 23 setLove(love); 24 } 25 26 public void eat() { 27 System.out.println("---吃狗粮---"); 28 } 29 30 public void setStrain(int strain){ 31 this.strain=strain; 32 } 33 public int getStrain(){ 34 return strain; 35 } 36 37 }
1 package Day10三; 2 3 public class Penguin extends Pet { 4 private String sex; //性别 5 //常量---变量 6 public static final String SEX_MALE="Q仔"; 7 public static final String SEX_FEMALE="Q妹"; 8 public Penguin() { 9 10 } 11 12 public void swimming(){ 13 System.out.println("--游泳--"); 14 15 //健康值-10 16 int health=getHealth(); 17 health=health-10; 18 setHealth(health); 19 20 //亲密度+5 21 int love=getLove(); 22 love=love+5; 23 setLove(love); 24 } 25 26 public void eat() { 27 System.out.println("---吃鱼---"); 28 } 29 public String getSex() { 30 return sex; 31 } 32 33 public void setSex(String sex) { 34 this.sex = sex; 35 } 36 }
1 package Day10三; 2 /** 3 * 父类 4 * @author Administrator 5 * 6 */ 7 public abstract class Pet { 8 private int age; //年龄 9 private String name; //昵称 10 private int health=90; //健康值 11 private int love=90; //亲密度 12 public Pet() { 13 14 } 15 //打印信息 16 public void print(){ 17 System.out.println("名字:"+this.name+",年龄:"+this.age+",健康值:"+this.health+",亲密度:"+this.love); 18 } 19 20 //抽象方法 21 public abstract void eat(); 22 23 public int getAge() { 24 return age; 25 } 26 public void setAge(int age) { 27 this.age = age; 28 } 29 public String getName() { 30 return name; 31 } 32 public void setName(String name) { 33 this.name = name; 34 } 35 public int getHealth() { 36 return health; 37 } 38 public void setHealth(int health) { 39 this.health = health; 40 } 41 public int getLove() { 42 return love; 43 } 44 public void setLove(int love) { 45 this.love = love; 46 } 47 48 }
1 package Day10三; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 7 Dog d=new Dog(); 8 d.setName("灰灰"); 9 10 Penguin p=new Penguin(); 11 p.setName("白白"); 12 13 Pet pet=d; //父类=子类 14 System.out.println(pet.getName()); 15 16 pet=p; //父类=子类 17 System.out.println(pet.getName()); 18 19 } 20 21 }