zoukankan      html  css  js  c++  java
  • Java中的第三大特性-多态性

    一、多态性的概念

      多态性是以继承为基础上的,举个例子,人属于动物,狗也属于动物,所以动物就是父类,而人和狗都是动物的子类,都属于动物。

    二、多态的使用

      (1)多态一般用于方法参数或者方法返回值,特别当一个方法中功能是人和狗共有的,这时候利用多态性,将参数设为父类,就可以少写一个方法,而且对于代码来说也比较容易拓展。下面举个例子:

    class Animal{
    
        public void skill(){
            System.out.println("动物拥有属于自己的技巧。。。");
        }
    }
    
    class Person extends Animal{
        @Override
        public void skill(){
            System.out.println("人拥有属于自己的技巧。。。");
        }
    }
    
    class Dog extends Animal{
        @Override
        public void skill(){
            System.out.println("狗拥有属于自己的技巧。。。");
        }
    }
    
    public class Polymorphism {
    
        public static void main(String[] args) {
            Person person = new Person();
            Dog dog = new Dog();
            //不使用多态性
            System.out.println("======不使用多态性======");
            person.skill();
            dog.skill();
            //使用多态性
            System.out.println("======使用多态性======");
            animalSkill(person);
            animalSkill(dog);
        }
    
        public static void animalSkill(Animal animal){
            animal.skill();
        }
    }

    运行结果:

    ======不使用多态性======
    人拥有属于自己的技巧。。。
    狗拥有属于自己的技巧。。。
    ======使用多态性======
    人拥有属于自己的技巧。。。
    狗拥有属于自己的技巧。。。

      通过结果我们可以看出使用多态的优势,就是当你的子类越来越多的时候,不使用多态的话,代码拓展起来很麻烦,如果使用多态的话,只要是这个类的子类都可以调用,完成相应的功能。

      (2)多态的向上转型:首先我们来说一下多态的向上转型,从上面的例子我们可以看出,animalSkill()方法的参数是Animal类,它是Person类和Dog类的父类,这个时候就相当于向上转型,向上转型是自动将Person类和Dog类转为Animal类的,向上转型在平常的日常开发中是经常使用的。

    Animal animal1 = new Person();
    Animal animal2 = new Dog();

      (3)多态的向下转型:多态的向下转型这个操作是需要我们自己手动强转的,所以这个操作就比较危险,因为父类有好多子类,是不能随便强转为任意子类的,否则在运行时会报类转化异常的错误。

    public class Polymorphism {
    
        public static void main(String[] args) {
            Animal animal = new Animal();
            Person person = (Person) animal;
            person.skill();
        }
        
    }

    运行结果:

    Exception in thread "main" java.lang.ClassCastException: cn.edu.nyist.Animal cannot be cast to cn.edu.nyist.Person

      造成这种现象的原因是因为父类会有很多的子类,是不能强制转换为任意子类的,所以这里推荐先将该子类向上转型为父类,然后再将该父类向下转型为该子类

    public class Polymorphism {
    
        public static void main(String[] args) {
            Animal animal = new Person();
            Person person = (Person) animal;
            person.skill();
        }
    
    }

    运行结果:

    人拥有属于自己的技巧。。。

      (3)instanceof关键字的使用:这个关键字主要是用来解决类转化一场这个错误的,它主要是判断一个实例是否属于对应的类或者父类的实例,属于的话返回true,不属于返回false

      

    public class Polymorphism {
    
        public static void main(String[] args) {
            Animal animal = new Person();
            if (animal instanceof Person){
                System.out.println("向下转型成功");
                Person person = (Person) animal;
                person.skill();
            }else {
                System.out.println("向下转型失败");
            }
        }
    
    }

    运行结果:

    向下转型成功
    人拥有属于自己的技巧。。。

      所以以后在将一个类进行向下转型的时候,首先使用instanceof关键字判断该实例是否为对应类或对应类的父类的实例,是的话,再进行向下转型,否则就不进行转型,这样程序就不会出错了。

  • 相关阅读:
    bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏
    bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务
    bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏
    bzoj千题计划199:bzoj1055: [HAOI2008]玩具取名
    NOIP2017 小凯的疑惑
    Codeforces 837E. Vasya's Function
    bzoj1084: [SCOI2005]最大子矩阵
    bzoj4247: 挂饰
    Codeforces Round #276 (Div. 1) A. Bits
    bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
  • 原文地址:https://www.cnblogs.com/li666/p/12013733.html
Copyright © 2011-2022 走看看