多态

多态

一.什么是多态?

  1.生活中的多态:不同类型的打印机,打印的效果不同

  2.程序中的多态:同一引用类型,使用不同的实例且执行不同的操作

二.使用多态实现思路

  1.编写父类

  2.编写子类,子类重写父类的方法

  3.运行时,使用父类的类型,子类的对象

实现多态的两个要素:子类重写父类的方法和使用父类的类型

 向上转型:

Pet pet=new Dog();----->自动类型转换又称为向上转型

三.实现多态的两种形式

1.使用父类作为方法形参实现多态

2.使用父类作为方法返回值实现多态

四.父类到子类的转换

1.向下转型(强制类型转换)

Pet pet=new Dog("欧欧","雪纳瑞");

Dog dog=(Dog)pet;

Penguin  peng=(Penguin) pet---->报错,必须转为父类指向的真实子类类型

五.instance of运算符

语法:对象 instance of  类或接口

instance of 通常和强制类型转换相结合

六.多态的思想:

父类型的引用可以指向内存中的子类对象的内存空间,就可以方便设计方法的参数和返回值类型的时候,可以设计成父类对象,这样的方法在实现时比较简洁,

在后期进行扩展时,方法比较容易。在代码中,多态使用更多的是父类引用指向子类对象,会自动类型转换(向上转型),有时候也需要调用子类自己的东西,这时候需要还原子类,强制类型转换(向下转型),

向下转型的时候先使用instanceof运算符做类型判断

七.代码示范:

   父类Pet类:

     

public abstract  class Pet {

 private String name;  

private int age;

 private int love=100;  

private int health=100;     

 public String getName() {

  return name;

 }

 public void setName(String name) {

  this.name = name;  

}

 public int getAge() {  

 return age;  

}

 public void setAge(int age) {

  this.age = age;

 }

 public int getLove() {  

 return love;  

}

 public void setLove(int love) {  

 this.love = love;

}

 public int getHealth() {

  return health;

 }

 public void setHealth(int health) {

  this.health = health;

 }

 /**   * 吃东西   */  

public  abstract  void  eat();

 /**   * 显示宠物的信息   */

 public  abstract void   show();

}

子类Dog类:

public class Dog extends Pet {

 private String type;

 public String getType() {

  return type;  

}

 public void setType(String type) {   

this.type = type;  }  

/**  

* 狗狗和主人玩耍接飞盘   */   

  public  void  catchingFlyDisc(){   

     this.setHealth(this.getHealth()-10);      

  this.setLove(this.getLove()+5);    

}  

@Override

 public void eat() {

           if(this.getHealth()>=100){  

           System.out.println("已经吃饱了,不需要喂食!");    

        }else{          

   this.setHealth(this.getHealth()+5);  

           System.out.println("喂食成功!健康值增加5");   

         }

 }  

@Override  public void show() {   

System.out.println("我是一只"+type+",我的名字叫"+     this.getName()+",今年"+this.getAge()+"岁"+     ",健康值是"+this.getHealth()+",亲密度是"+this.getLove());  

}

}

子类penguin类:

public class Penguin extends Pet {

 private char sex;

 public char getSex() {

  return sex;  

}

 public void setSex(char sex) {

  this.sex = sex;  

}

 /**   * 企鹅和主人玩耍游泳   */

 public void swimming() {  

 this.setHealth(this.getHealth() - 10);

  this.setLove(this.getLove() + 5);

 }

 @Override

 public void eat() {   

if (this.getHealth() >= 100) {   

 System.out.println("已经吃饱了,不需要喂食!");

  } else {    this.setHealth(this.getHealth() + 3);  

  System.out.println("喂食成功,健康值增加3");   }  }

 @Override

 public void show() {  

 System.out.println("我的名字叫"+this.getName() +"我的性别"+this.getSex()+ ",今年"     + this.getAge() + "岁" + ",健康值是" + this.getHealth() + ",亲密度是"     + this.getLove());

 } }

主人类Master类:

public class Master {

 /**  

* 主人给宠物喂食   *

* @param pet  

*/

 public void feed(Pet pet) {  

 pet.eat();

 }

 /**  

* 主人和宠物玩耍   *  

* @param pet   */

 public void play(Pet pet) {

  if (pet instanceof Dog) {/

/对象属于类类型返回true,否则返回false  

  // 强制类型转换,向下转型,将内存中的子类对象进行还原    

Dog dog = (Dog) pet;   

 dog.catchingFlyDisc();  

 }else if(pet  instanceof Penguin){  

  Penguin  penguin=(Penguin)pet;  

  penguin.swimming();   }  

}

}

测试类 TsetMaster类:

public class TsetMaster {

 public static void main(String[] args) {

        Master   master=new  Master();      

        Penguin   pen=new  Penguin();           

        Dog  dog=new  Dog();     

        dog.setName("旺财");      

        dog.setAge(4);       

        dog.setHealth(80);     

        dog.setLove(80);       

        dog.setType("中华田园犬");      

        master.play(dog);       

        dog.show();

 }

}

原文地址:https://www.cnblogs.com/fxx0129-nn/p/6883446.html