• Java基础之父类引用指向子类对象


    多态(Polymorphism)

    多态是同一个行为具有多个不同表现形式或形态的能力。
    多态就是同一个接口,使用不同的实例而执行不同操作,如图所示,
    不同打印机打印效果

    多态的有点

    • 消除类型之间的耦合关系
    • 可替换性
    • 可扩充性
    • 接口性
    • 灵活性
    • 简化性

    多态存在的三个必要条件

    • 继承
    • 重写
    • 父类引用指向子类对象

    多态的实现方式

    • 重写
    • 接口
    • 抽象类和抽象方法
    注意事项:
    《Effective Java》一书中提到,接口优于抽象类
    接口和抽象类的区别:
    1)抽象类允许包含某些方法的实现,但是接口则不允许;
    2)为了实现由抽象类定义的类型,类必须成为抽象类的一个子类,任何一个类,只要它定义了所有必要的方法,并且遵守通用约定,它就被允许实现一个接口。而不管这个类是否处于类层次(class hierarchy)的哪个位置。因为Java只允许单继承,所以抽象类作为类型定义受到了极大的限制。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    父类引用指向子类对象

    这篇文章的主题在于父类引用指向子类对象,把子类对象直接赋给父类引用叫向上转型(upcasting),向上转型不用强制转型。

    向上转型

    举个简单例子,
    创建父类对象Animal,只有一个成员变量name,

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class Animal {
        private String name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    创建子类对象Dog继承父类对象Animal,多一个成员变量barkingTime

    import lombok.*;
    import java.util.Date;
    
    @EqualsAndHashCode(callSuper = true)
    @NoArgsConstructor
    @Data
    public class Dog extends Animal {
        private Date barkingTime;
    
        @Builder
        public Dog(String name, Date barkingTime) {
            super(name);
            this.barkingTime = barkingTime;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    import com.alibaba.fastjson.JSON;
    import java.time.Instant;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    import java.util.Date;
    
    public class UpCastingDemo {
        public static void main(String[] args) {
            // 从默认时区的系统时钟获取当前的日期时间
            LocalDateTime localDateTime = LocalDateTime.now();
            // 将此日期时间与时区相结合
            ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
            // 本地时间线LocalDateTime到即时时间线Instant时间戳
            Instant instant = zonedDateTime.toInstant();
            // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间
            Date date = Date.from(instant);
            // 父类引用指向子类对象
            Animal animal = Dog.builder().name("旺财").barkingTime(date).build();
            System.out.println(JSON.toJSONString(animal));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    打印结果如下,
    在这里插入图片描述
    在java内存中,animal父类引用指向堆中生成的Dog对象,从animal父类对象只能获取到name成员变量,但是引用对象实际上是有两个属性值的。
    在这里插入图片描述

    参考链接:
    1、https://www.runoob.com/java/java-polymorphism.html
    2、http://www.codexy.cn/java/java-polymorphism.html
    3、http://c.biancheng.net/java/90/
    4、https://www.gitclone.com/gogs/search/clonesearch?q=Effective-Java-3rd-edition-Chinese-English-bilingual

  • 相关阅读:
    去面试了几家BATJ等N家互联网大厂
    运营人的两大核心能力
    基于Splinter演示如何使用Chrome WebDriver
    Python机器视觉--OpenCV入门--鼠标事件与TrackBar控件(含小项目:OpenCV调色板)
    在 Android 10 中访问/proc/net/route权限被拒绝
    GitHub 优秀的 Android 开源项目
    GBase 8s DROP PROCEDURE 语句
    安全巡检管理系统—隐患排查治理
    PythonStudy6
    CRM销售管理系统是如何进行数据分析的
  • 原文地址:https://blog.csdn.net/zkkzpp258/article/details/127831702