zoukankan      html  css  js  c++  java
  • 09 多态

    1 多态

    1.1 为什么要使用多态?

    软件架构过程中,有一个开闭原则:对修改关闭,对扩展开放。

    我们需要升级业务,业务的拓展不应该导致程序或者程序架构做过大调整。

    1.2 多态

    1.2.1 多态的概念

    生活中,存在这种现象

    同一个拍照,由于选用的拍照设备不同,产生的照片不同。

    同一事物,由于条件不同,产生结果也不同。

    多态就是事物呈现的多种状态。

    程序中,多态

    多态:同一个引用类型,使用不同的实例而执行不同操作 

    public class Test01 {
        public static void main(String[] args) {
            // 多态:同一引用类型,不同实例,执行结果不同
            // java中的多态要求:父类类型引用子类对象
            
            Animal animal = null;
            
            animal = new Person();
            animal.sleep();
            
            
            animal = new Fish();
            animal.sleep();
            
        }
    }

    总结:

    [1] 多态 同一引用类型,由于实例化的实例不同,导致对同一方法的执行结果不同。

    : 同一引用类型

    不同实例化的实例

    :同一方法,该方法一般都会被重写。

    不同执行结果不同

    [2] java多态要求一定是父类引用=子类对象

    父类类型 父类对象 = new 子类类型()

    1.1.1 多态表现形式

    [1] 本质:父类引用子类对象

     

    [2] 父类对象作为方法形参

    public void feed(Pet pet) {
            System.out.println("主人在喂" + pet.getName());
            pet.eat();
    }

    [3]父类作为方法返回值实现多态

        public Pet getPet(int type) {
            Pet pet = null;
            switch(type) {
                case 1:{
                    pet = new Dog();break;
                }
                case 2:{
                    pet = new Penguin();break;
                }
                case 3:{
                    pet = new Cat();break;
                }
            }
            return pet;
        }

    1.1 多态中类型转换

    1.1.1 自动类型转换

    子类可以无条件转换为父类类型也称为向上类型转换

    父类类型 父类引用 = 子类对象

    1.1.2 强制类型转换

    父类调用子类特有方法时,一定要进行强制类型转换,也称为向下类型转换

    子类类型 子类对象= (子类类型)父类对象

    Dog dog = (Dog)pet;

    Penguin penguin = (Penguin)pet;

    注意:强制类型转换有个前提:一定要转换为父类对象引用的实际的子类类型

    obj instanceof Class/Interface 判断对象是否是或者接口的实例。

    public class Test01 {
        public static void main(String[] args) {
            
            Dog dog = new Dog();
            System.out.println(dog instanceof Dog);
            System.out.println(dog instanceof Pet);
            System.out.println(dog instanceof Object);
        }
    }

    1.1 总结

    多态的好处:

    提高了程序的可拓展性和可维护性

    多态三种表现形式

    [1] 父类引用子类对象

    [2] 父类作为方法形参

    [3] 父类作为方法返回类型

    多态发生的条件

    [1] 必须有继承

    [2] 有重写/实现

    [3] 父类引用子类对象

    多态过程中,需要调用子类特有的方法

    类型转换/instanceof

    多态的分类(C)

    编译时多态:重载

    运行时多态:多态,具体到运行时才知道父类对象引用的是哪个子类。

    思考题:java是如何实现运行时多态?

    动态绑定和静态绑定

    1.2 调试技巧

    断点:程序执行时的停止的点。

    step over: 单步执行。执行一句当前的代码

    step into: 进入方法体继续执行。

  • 相关阅读:
    【业务自动化】iTop,全面支持ITIL流程的一款ITSM工具
    【Hadoop】HDFS源码解读
    【Hadoop】Hadoop RPC框架线程模型
    电商网站项目(一)用户模块---门户
    jdk1.5后枚举类的定义规则
    回顾static与final的作用
    @Springboot搭建项目controller层接收json格式的对象失败
    把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取
    springboot用mybatis-generator自动生成mapper和model
    hibernate、mybatis、spring data 的对比
  • 原文地址:https://www.cnblogs.com/aknife/p/10819697.html
Copyright © 2011-2022 走看看