• 从零开始学java (多态)


    多态

      简单来说呢,多态其实具有表现多种形态能力的特征。专业点的说法是:同一个实现接口,使用不同的实例而执行不同的操作(可以理解为一个爸爸有多个儿子,儿子们做一件事时(操作一个方法),处理的结果不同)。话不多说上代码:

    /**
     * 先写一个宠物类
     * @author GMZ
     *
     */
    public class Pet {
    
        protected String name;
        protected Integer health;
        
        
        public Pet(String name, Integer health) {
            this.name = name;
            this.health = health;
        }
    
    
    
        public void run(){
            System.out.println(name+"----->再跑!");
        }
    }
    /**
     * 写一个狗类继承宠物类
     * @author GMZ
     *
     */
    public class Dog extends Pet{
    
        public Dog(String name, Integer health) {
            super(name, health);
        }
    
        @Override
        public void run(){
            System.out.println(super.name+"----->子类中跑!");
        }
    }
    public static void main(String[] args) {
            //正常实例对象
            Dog dog1=new Dog("lily",100);
            dog1.run();//输出结果为子类的重写方法
            //向上转型
            Pet dog=new Dog("旺旺",100);
            dog.run();//输出结果为子类的重写方法
            //向下转型
            Dog dog2 = (Dog)dog; System.out.println(
    "判断dog1对象是否是Pet类型--->"+(dog1 instanceof Pet));//打印为true }

      子类到父类的转换(向上转型)

      如同上图代码中向上转型一样,父类的引用指向子类的实例,实例的对象是子类的实例对象但是作为对象的引用用的确实父类。

      向上转型是自动转型,例如:每个类都是Object类的子类。这个就跟上面的一样。

      向上转型有一些规则:

      1.将一个父类的引用指向一个子类的对象,成为向上转型(upcasting),自动进行类的转换。

      2.通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。(它是通过子类调用,而不是父类自己调用)

      3.通过父类引用变量无法调用子类特有的方法。

      多态最多用的地方还是用父类的引用作为行参,然后达到代码复用的目的。

      

    /**
     * 先来写一个代理类
     * @author GMZ
     *
     */
    public class PetProxy {
        //写成静态的方法
        //参数是父类的引用
        public static void run(Pet pet){
            pet.run();
        }
    }
    然后在main方法中这样写

      打印的结果为:大牛----->子类中跑! 

      通过代码可以知道,只要是它的子类实例都可以作为参数执行这个方法,不同的实例,会通过run执行不同实例重写或没重写的方法。(父类也可以作为方法的返回值类型,同时也是一种多态在代码中的一种运用)

      父类到子类的转换(向下转型)

      由于向上转型中父类引用的对象,无法调用子类中特有的方法,那么我们就需要了向下转型。

      将一个指向子类的对象的父类引用赋给一个子类的引用(如代码中所示)。成为向下转型。此时必须进行强制类型转换。当这个类的不能被转换时报错为:ClassCastException。

      instanceof运算符

      instanceof该运算符是用来判断一个对象是否属于一个类(可以是父类,父类的父类,父类的父类的父类)或者实现了一个接口,结果为true或者false。在强制类型转换可以通过instanceof去检查对象的真实类型,再去进行类型转换,避免发生类型转换错误。

      

  • 相关阅读:
    .net调用存储过程详解
    SQL SERVER 与ACCESS、EXCEL的数据转换
    dedecms 织梦 获取文章链接地址
    用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
    SQL Server触发器创建、删除、修改、查看示例步骤
    (后缀数组模板)BZOJ1031[JSOI2007]字符加密Cipher
    LOJ2055「TJOI / HEOI2016」排序
    BZOJ1096[ZJOI2007]仓库建设
    POI2011Meteors
    数位dp(1)
  • 原文地址:https://www.cnblogs.com/Cgosling/p/9943649.html
Copyright © 2020-2023  润新知