Java 面向对象三大特征之一: 多态

2018-02-28 07:47:36来源:cnblogs.com作者:房上的猫人点击

分享
第七城市

多态与类型转换


子类重写父类方法
 1)位置:子类和父类中有同名的方法
 2)方法名相同,返回类型和修饰符相同,参数列表相同
       方法体不同


多态的优势和应用场合
 多态:同一个引用类型,使用不同的实例而执行不同的操作
 
 实现多态的两种形式
 1.使用父类作为方法形参实现多态
 2.使用父类作为方法返回值实现多态

  形式1.1:父类做形参
     子类做实参
  形式1.2:父类做类型
        子类实例化
     (数据类型中的自动类型转换)
  形式2.1:父类作为方法的返回值
 子类实例化,类型自动转换

 生活中的多态:
    打印机
  结论: 
 同一事物,由于条件不同,产生的结果也不同

 多态实现思路:
  编写父类
  编写子类,子类重写父类方法
  运行时,使用父类的类型,子类的对象(自动类型转换)

 优势:
   ■多态可以减少类中代码量
   ·可以提高代码的可扩展性和可维护性
   ■向上转型一子类转换为父类,
   ·自动进行类型转换
   ■向下转型一父类转换为子类,
   ·结合instanceof运算符进行强制类型转换

栗子:

/** *  */package bdqn.javademos;/** *  * @author: 房上的猫 *  * @time: 下午3:51:59 *  * 博客地址: https://www.cnblogs.com/lsy131479/ * *//** * @author xjz *父类 宠物类 */public class Pet {   public void eat(){       System.out.println("pet正在吃");   }}
父类
/** *  */package bdqn.javademos;/** *  * @author: 房上的猫 *  * @time: 下午3:51:59 *  * 博客地址: https://www.cnblogs.com/lsy131479/ * *//** * @author xjz * */public class Cat extends Pet {    public void eat(){        System.out.println("猫吃猫粮");    }        public void ball(){        System.out.println("猫玩球");    }}
Cat类
/** *  */package bdqn.javademos;/** * @author xjz *子类:狗狗类 */public class Dog extends Pet{  public void eat(){      System.out.println("狗狗吃狗粮");  }    public void catchFlyDisk(){      System.out.println("狗狗玩飞盘");  }}
Dog类
/** *  */package bdqn.javademos;/** * @author xjz *企鹅类 */public class Penguin  extends Pet{   public void eat(){       System.out.println("企鹅吃鱼");   }      public void swiming(){       System.out.println("企鹅游泳");   }}
Penguin 类
/** *  */package bdqn.javademos;/** * @author xjz *主人类  */public class Master {           public void feed(Pet pet){           pet.eat();       }         //领养宠物 多态形式3:父类作为方法返回值,子类实例化  类型自动转换       public Pet getPet(int typeid){           Pet pet=null;           if(typeid==1){                pet=new Dog();           }           else if(typeid==2){                pet=new Penguin();           }           else if(typeid==3)           {                pet=new Cat();           }           return pet;       }      }
Master 类
package bdqn.javademos;import java.util.Scanner;public class Test {    /**     * @param args     */    public static void main(String[] args) {        //多态的形式1        Dog dog=new Dog();                Penguin peng=new Penguin();                Cat cat=new Cat();        Master ms=new Master();        ms.feed(dog);        ms.feed(peng);        ms.feed(cat);                //多态的形式2:父类做类型,子类实例化        Pet pet=new Dog();//自动转换        pet.eat();                //调用领养宠物 形式3:父类作为方法的返回类型        System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅  3-猫) ");        Scanner input=new Scanner(System.in);        int xz=input.nextInt();        Master dx=new Master();        Pet pets=dx.getPet(xz);         pets.eat();                    }}

instanceof运算符的使用

 类型转换比较
     1.
   子类转换父类
   向上转型
   自动转换
     2.
   父类转换子类
   向下转型
   使用isntanceof用作比较判定
   子类 对象名 = (子类)父类;
   使用子类对象

栗子:

/** *  */package bdqn.javademos;/** * @author xjz *父类 宠物类 */public class Pet {   public void eat(){       System.out.println("pet正在吃");   }}
父类
/** *  */package bdqn.javademos;/** * @author xjz * */public class Cat extends Pet {    public void eat(){        System.out.println("猫吃猫粮");    }        public void ball(){        System.out.println("猫玩球");    }}
Cat 类
/** *  */package bdqn.javademos;/** * @author xjz *子类:狗狗类 */public class Dog extends Pet{  public void eat(){      System.out.println("狗狗吃狗粮");  }    public void catchFlyDisk(){      System.out.println("狗狗玩飞盘");  }}
Dog 类
/** *  */package bdqn.javademos;/** * @author xjz *企鹅类 */public class Penguin  extends Pet{   public void eat(){       System.out.println("企鹅吃鱼");   }      public void swiming(){       System.out.println("企鹅游泳");   }}
Penguin 类
/** *  */package bdqn.javademos;/** * @author xjz *主人类  */public class Master {           public void feed(Pet pet){           pet.eat();       }         //领养宠物 多态形式3:父类作为方法返回值,子类实例化  类型自动转换       public Pet getPet(int typeid){           Pet pet=null;           if(typeid==1){                pet=new Dog();           }           else if(typeid==2){                pet=new Penguin();           }           else if(typeid==3)           {                pet=new Cat();           }           return pet;       }   //主人和宠物玩耍的行为       public void play(Pet pet){           if (pet instanceof Dog) {                Dog dog=(Dog)pet;//向下转型                dog.catchFlyDisk();        }else if(pet instanceof Penguin){              Penguin peng=(Penguin)pet;              peng.swiming();        }else  if(pet instanceof Cat){            Cat cat=(Cat)pet;            cat.ball();        }                                        }   }
Master 类
package bdqn.javademos;import java.util.Scanner;public class Test {    /**     * @param args     */    public static void main(String[] args) {        //多态的形式1        Dog dog=new Dog();                Penguin peng=new Penguin();                Cat cat=new Cat();        Master ms=new Master();        ms.feed(dog);        ms.feed(peng);        ms.feed(cat);                //多态的形式2:父类做类型,子类实例化        Pet pet=new Dog();//自动转换        pet.eat();                //调用领养宠物 形式3:父类作为方法的返回类型        System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅  3-猫) ");        Scanner input=new Scanner(System.in);        int xz=input.nextInt();        Master dx=new Master();        Pet pets=dx.getPet(xz);         pets.eat();                dx.play(dog);    }}
测试类

(C) 房上的猫 。 保留所有权利。
 https://www.cnblogs.com/lsy131479/

如需转载,请注明出处!!!

第七城市

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台