zoukankan      html  css  js  c++  java
  • Java面向对象的三大特性之一 多态

    多态:

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


    多态的优势和应用场合
     多态:同一个引用类型,使用不同的实例而执行不同的操作


    方法重载也是多态的一种体现.
    人的不同肤色不是多态
    多态的终极目标:
    为了实现统一调用。
    多态的两种方式:
    多态一:
     父类普通类  方法a()

     子类普通继承父类 方法a()

    多态二:
    父类的抽象类 方法是抽象方法a()

    子类普通实现 抽象类 重写了抽象方法a()

    instanceof 用来判断一个对象是否属于一个类或者实现了一个接口
    简单工厂:
    通过工厂类 创建子类对象 保存到父类的类型中

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

    例子:

    父类:Pet
    package cn.javaoppDay01;
    
    public abstract  class Pet {
        public String name;
        public int health=100;
        public int love=0;
        public Pet(String name) {
            super();
            this.name = name;
        }
        public void print(){
            System.out.println("我的名字是"+this.name+"健康值"+this.health+"亲密度"+this.love);
        }
        public abstract void eat();
    }
    package cn.javaoppDay01;
    
    狗狗类:Dog
    public class Dog extends Pet {
    
        public Dog(String name) {
            super(name);
            // TODO Auto-generated constructor stub
        }
        @Override
        public void eat() {
            
            
        }
        public void catchingFlyDisc(){
            System.out.println("狗狗"+super.name+"正在接飞盘");
            super.health =super.health-10;        
            super.love =super.love+5;
            System.out.println("狗狗的健康值为:"+this.health+",亲密值为:"+this.love);
            
        }
    
        
    }
    package cn.javaoppDay01;
    
    public class Penguin extends Pet{
    企鹅类:Penguin
        public Penguin(String name) {
            super(name);
            // TODO Auto-generated constructor stub
        }
        @Override
        public void eat() {
            
            
        }
        public void swimming(){
            System.out.println("企鹅"+super.name+"正在游泳");
            super.health =super.health-10;        
            super.love =super.love+5;
            System.out.println("企鹅的健康值为:"+this.health+",亲密值为:"+this.love);
            
        }
    
        
        
    }
    测试类:
    package cn.javaoppDay01;
    
    public class Test {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Dog dog=new Dog("啊啊");
            dog.catchingFlyDisc();
            Penguin penguin=new Penguin("哈哈");
            penguin.swimming();
        }
    
    }

    instanceof运算符的使用

     作用:用来判断一个对象是否属于一个类或者实现一个接口

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

    例子:

    父类:
    /**
     *父类 宠物类
     */
    public class Pet {
       public void eat(){
           System.out.println("pet正在吃");
       }
    }
    Cat:猫类
    public class Cat extends Pet {
        public void eat(){
            System.out.println("猫吃猫粮");
        }
        
        public void ball(){
            System.out.println("猫玩球");
        }
    }
    子类:
    狗狗类 :
    /**
     *子类:狗狗类
     */
    public class Dog extends Pet{
      public void eat(){
          System.out.println("狗狗吃狗粮");
      }
      
      public void catchFlyDisk(){
          System.out.println("狗狗玩飞盘");
      }
    }
    子类:
    企鹅类:
    /**
    
     *企鹅类
     */
    public class Penguin  extends Pet{
       public void eat(){
           System.out.println("企鹅吃鱼");
       }
       
       public void swiming(){
           System.out.println("企鹅游泳");
       }
    主人类
    /**
     *主人类 
     */
    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();
            }
               
               
               
           }
       
    }
    测试类:
    public class Test {
    
        /**
         * 
         */
        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);
    
        }
    
    }
  • 相关阅读:
    Windows删除被占用的文件或文件夹
    Fatal error in launcher: Unable to create process using
    World/excel无法同时打开两个解决办法
    Zabbix故障处理系列
    第1章 数据库系统概述
    第2章 关系数据库
    第3章 数据库设计
    Linux命令概况
    Python -扩展C++-Pytorch扩展
    技术栈_人工智能-大数据-云计算
  • 原文地址:https://www.cnblogs.com/3020815dzq/p/8504120.html
Copyright © 2011-2022 走看看