博客
关于我
7.0、Java继承与多态 - 多态的特性
阅读量:799 次
发布时间:2023-04-16

本文共 1795 字,大约阅读时间需要 5 分钟。

Java继承与多态 - 多态的特性

面向对象编程的三大核心特征中,多态性是非常重要的一环。多态性使得一个对象能够表现出多种不同的形态,这在实际开发中具有非常大的灵活性和扩展性。

多态的概念

多态性是指一个对象可以同时具有多种不同的形态。以现实生活中的例子来看,比如学生小明,他同时是一个学生(学生形态)和一个人类(人类形态)。同样地,在编程中,一个对象可以表现出多种不同的行为和属性,这正是多态性的体现。

在Java中,多态性的实现依赖于两个关键概念:

  • 继承(extends):用于定义类之间的关系,允许多个类继承自一个基类。
  • 实现(implements):用于定义一个类对某个接口或超类的支持,实现了对多态性的基本需求。
  • 父类引用指向子类对象

    在Java中,多态的本质表现为一个父类引用指向子类对象。以下是一个典型的例子:

    public class People {
    int num = 6;
    public void eat() {
    System.out.println("人类吃饭");
    }
    }
    public class Students extends People {
    int num = 9;
    @Override
    public void eat() {
    System.out.println("学生吃饭");
    }
    }
    public class Main {
    public static void main(String[] args) {
    People people = new Students();
    people.eat(); // 调用的是 Students 类中的 eat 方法
    System.out.println(people.num); // 调用的是 People 类中的 num 字段(6)
    }
    }

    在上述代码中:

    • people 是一个 People 类的引用,但实际指向了一个 Students 类的对象。
    • 当调用 people.eat() 时,由于 peoplePeople 类型的引用,编译器会调用 People 类的 eat 方法。但由于多态性的动态绑定(即运行时绑定),实际执行的是 Students 类的 eat 方法。
    • 当访问 people.num 时,同样是 People 类的 num 字段被调用,因为引用是 People 类型的,编译器和运行时都会访问 People 类的字段。

    访问成员方法和成员变量的规则

    在Java中,成员方法和成员变量的访问有所不同:

    成员方法的访问

    • 编译阶段:编译器根据引用端的类类型(父类)来选择方法的解析。
    • 运行阶段:在运行时,实际调用的是引用的对象(子类)中对应方法的实现。

    例如:

    Fu fu = new Zi();
    fu.eat(); // 编译阶段选择 Fu 类中的 eat 方法,但运行时调用 Zi 类中的 eat 方法
    fu.fuMethod(); // 编译阶段选择 Fu 类中的 fuMethod 方法,但运行时调用 Fu 类中的 fuMethod 方法
    fu.ziMethod(); // 编译阶段无法找到对应的方法,编译错误

    成员变量的访问

    • 编译阶段运行阶段:都根据引用的类类型(父类)来访问成员变量。

    例如:

    People people = new Students();
    people.num; // 编译和运行时都访问 People 类中的 num 字段(6)

    多态的作用

    多态性在Java中具有以下几个重要作用:

  • 行为的灵活性:一个对象可以表现出多种不同的行为,具体行为取决于其所属的子类。
  • 代码的扩展性:通过新增子类,可以在不修改现有代码的情况下,增加新的行为和功能。
  • 运行时的动态性:多态性使得程序在运行时能够根据实际情况进行方法和变量的动态绑定。
  • 总结

    多态性是Java面向对象编程中非常重要的一特性。通过多态性,一个对象可以同时具有多种不同的形态,并能够在运行时动态地表现出不同的行为。理解多态性是掌握Java对象编程的关键步骤。在实际编程中,多态性不仅能够提高代码的灵活性和扩展性,还能够使程序更加高效和易于维护。

    转载地址:http://oygfk.baihongyu.com/

    你可能感兴趣的文章
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>