博客
关于我
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/

    你可能感兴趣的文章
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>
    mysqldump实现数据备份及灾难恢复
    查看>>
    mysqldump数据库备份无法进行操作只能查询 --single-transaction
    查看>>
    mysqldump的一些用法
    查看>>
    mysqli
    查看>>
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>