• 多态


    多态

    一.什么是多态?

      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();

        }

    }

  • 相关阅读:
    Android自定义属性,format详解
    设置EditText是否可编辑
    Android中Application设置全局变量以及传值
    android:ellipsize属性的含义
    Java集合框架List,Map,Set等全面介绍
    二十款漂亮的CSS字体样式,让你受用非浅
    IE浏览器不见了
    display属性值:
    用CSS设置多个背景、背景渐变、指定背景大小
    [转]IE6双倍边距——IE布局BUG集锦
  • 原文地址:https://www.cnblogs.com/zyy0115/p/6891600.html