• Java面试必问之面向对象“多态”


    本文是观看翁恺老师《面向对象程序设计Java》时所做原创笔记

    多态变量和向上造型

    类定义了类型,DVD类所创建的对象的类型就是DVD。类可以有子类,所以由那些类定义的类型可以有子类型。在DoME的例子中,DVD类型就是Item类型的子类型。

    子类型类似于类的层次,类型也构成了类型层次。子类所定义的类型是其超类的类型的子类型。

    当把一个对象赋值给一个变量时,对象的类型必须与变量的类型相匹配,如:

    Car myCar = new Car();

    是一个有效的赋值,因为Car类型的对象被赋值给声明为保存Car类型对象的变量。但是由于引入 了继承,这里的类型规则就得叙述得更完整些: 一个变量可以保存其所声明的类型或该类型的任何子类型。

    对象变量可以保存其声明的类型的对象,或该类型的任何子类型的对象。

    Java中保存对象类型的变量是多态变量。“多态”这个术语(字面意思是许多形态)是指一个变量可以保存不同类型(即其声明的类型或任何子类型)的对象。

    多态变量

    1. Java的对象变量是多态的,它能保存不止一种类型的对象
    2. 它们可以保存的是声明类型的对象,或声明类型的子类的对象
    3. 当把子类的对象赋给父类的变量的时候,就发生了向上造型

    子类和子类型

    • 类定义了类型
    • 子类定义了子类型
    • 子类的对象可以被当作父类的对象来使用
    • 赋值给对象的变量
    • 传递给需要父类对象的函数
    • 放进存放父类对象的容器里

    子类型与赋值

    子类的对象可以赋值给父类的对象

    在这里插入图片描述

    Vehicle v1 = new Vehicle();
    Vehicle v2 = new VCar();
    Vehicle v3 = new Bicycle();
    
    • 1
    • 2
    • 3

    子类与参数传递

    子类的对象可以传递给需要父类的函数

    public classs DataBase(){
        public void add(Item theItem){
            ...
        }
    }
    
    DVD dvd = new DVD(...);
    CD cd = new CD(...);
    
    database.add(dvd);
    database.add(cd);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    子类型和容器

    子类型的对象可以存放父类对象的容器里
    在这里插入图片描述

    向上造型(造型cast)

    • 子类的对象可以赋值给父类的变量
    • 注意!Java中不存在对象对对象的赋值!
    • 父类的对象不能赋值给子类的变量!
    Vechicle v;
    Car c = new Car();
    v = c; //可以
    c = v; //编译错误!
    
    • 1
    • 2
    • 3
    • 4

    可以用造型:

    c = (Car)v;
    只有当v这个变量的实际管理的是Car才行
    
    • 1
    • 2
    1. 拿一个子类的对象,当作父类的对象来用
    2. 向上造型是默认的,不需要运算符
    3. 向上造型总是安全的

    多态

    如果子类的方法覆盖了父类的方法,我们也说父类的那个方法在子类有了新的版本或者新的实现。覆盖的新版本具有与老版本相同的方法签名:相同的方法名称和参数表。因此,对于外界来说,子类并没有增加新的方法,仍然是在父类中定义过的那个方法。不同的是,这是一个新版本,所以通过子类的对象调用这个方法,执行的是子类自己的方法。

    覆盖关系并不说明父类中的方法已经不存在了,而是当通过一个子类的对象调用这个方法时,子类中的方法取代了父类的方法,父类的这个方法被“覆盖”起来而看不见了。而当通过父类的对象调用这个方法时,实际上执行的仍然是父类中的这个方法。注意我们这里说的是对象而不是变量,因为一个类型为父类的变量有可能实际指向的是一个子类的对象。

    当调用一个方法时,究竟应该调用哪个方法,这件事情叫做绑定。绑定表明了调用一个方法的时候,我们使用的是哪个方法。绑定有两种:一种是早绑定,又称静态绑定,这种绑定在编译的时候就确定了;另一种是晚绑定,即动态绑定。动态绑定在运行的时候根据变量当时实际所指的对象的类型动态决定调用的方法。Java缺省使用动态绑定。

    函数调用的绑定

    • 当通过对象变量调用函数的时候,调用哪个函数这件事情叫做绑定
    • 静态绑定:根据变量的声明类型来决定
    • 动态绑定:根据变量的动态类型来决定
    • 在成员函数中调用其他成员函数也是通过this这个对象来调用的

    覆盖override

    • 子类和父类存在名称和参数表完全相同的函数,这一对函数构成覆盖关系
    • 通过父类的变量调用存在覆盖关系的函数时,会调用变量当时所管理的对象所属的类的函数

    类型系统

    Object

    所有的类都是继承自Object类(默认)

    在这里插入图片描述

    Object类的函数:

    • toString()
    • equals()
  • 相关阅读:
    Thymeleaf th:insert、th:replace、th:include的使用
    shell脚本中循环语句(极其粗糙版)
    C专家编程 第3章 分析C语言的声明 3.1 只有编译器才会喜欢的语法
    SpringBoot整合分布式任务调度平台xxl-job
    随时随地时时刻刻使用GPT类应用
    matlab 分数阶混沌系统的完全同步控制
    使用数据库实现增删改查
    数据库的索引
    docker Nginx反向代理内网多个服务如:nacos、jenkins、minio等
    C语言学习笔记 库文件
  • 原文地址:https://blog.csdn.net/weixin_44105632/article/details/126040772