Java多态(Polymorphic)

多态(Polymorphism)是面向对象编程的三大核心特性之一,指的是同一个行为在不同对象上会产生不同的表现形式。多态的主要价值在于代码复用与扩展,它允许我们在不修改现有代码的情况下扩展系统功能。

多态的实现条件

  1. 存在继承关系(子类继承父类)
  2. 子类重写父类的方法
  3. 父类引用指向子类对象

构造的示例

// 父类
class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
} // 子类覆写父类方法
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
} // 另一个子类覆写父类方法
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("喵喵喵");
}
}

@Override注解用于显式标识方法覆写,它的作用是:

  • 告诉编译器这是一个覆写方法,帮助检查覆写的正确性
  • 提高代码可读性,明确标识哪些方法是对父类方法的重写

如果方法签名(方法名、参数列表)不正确,编译器会报错:

class Bird extends Animal {
// 编译错误:参数列表与父类不同,不是有效覆写
@Override
public void makeSound(String volume) {
System.out.println("叽叽喳喳");
}
}

多态的本质:动态绑定

多态的关键特性是动态绑定(Dynamic Binding)——方法调用的具体实现取决于运行时对象(而不是在编译时)的实际类型,而非变量的声明类型。

动态绑定的示例

public class PolymorphismDemo {
public static void main(String[] args) {
// 声明为父类类型,实际为子类对象
Animal animal1 = new Dog();
Animal animal2 = new Cat(); // 调用makeSound()方法
animal1.makeSound(); // 输出"汪汪汪"(实际调用Dog类的方法)
animal2.makeSound(); // 输出"喵喵喵"(实际调用Cat类的方法)
}
}

这个例子展示了多态的核心特征:当变量的声明类型(Animal)与实际类型(Dog或Cat)不一致时,方法调用会动态绑定到实际类型的实现。

多态的工作原理

  1. 编译器检查变量的声明类型,确保该类型包含被调用的方法
  2. 运行时,JVM确定对象的实际类型
  3. JVM调用实际类型中覆写后的方法实现

这种机制使得我们可以编写通用代码,操作父类类型,而实际运行时会自动适配不同的子类实现。

覆写Object方法

所有Java类都间接继承自Object类,Object定义了几个重要方法,我们经常需要在子类中覆写这些方法以实现特定功能。

  • toString():把instance输出为String;
  • equals():判断两个instance是否逻辑相等;
  • hashCode():计算一个instance的哈希值。

多态的限制与控制:final关键字

final关键字可以限制多态行为,用于保护核心方法不被修改或防止类被继承。

final的三种用法

  1. 修饰方法:阻止方法被覆写
class Parent {
// final方法不能被覆写
public final void importantMethod() {
System.out.println("这是核心方法,不能被修改");
}
} class Child extends Parent {
// 编译错误:不能覆写final方法
@Override
public void importantMethod() {
}
}
  1. 修饰类:阻止类被继承
// final类不能被继承
final class FinalClass {
public void doSomething() {
System.out.println("这个类不能被继承");
}
} // 编译错误:不能继承final类
class SubClass extends FinalClass {
}
  1. 修饰字段:字段初始化后不能被修改
class Immutable {
// final字段必须初始化,且不能被修改
private final String id;
private String name; public Immutable(String id, String name) {
this.id = id; // 在构造方法中初始化final字段
this.name = name;
} // 编译错误:不能修改final字段
public void setId(String id) {
this.id = id;
}
}

加深多态与继承的理解

多态与继承密切相关,但两者是不同的概念:

  • 继承是类之间的关系,描述了"is-a"的关系
  • 多态是方法调用的特性,允许不同对象对同一方法调用做出不同响应

继承是多态的基础,没有继承就没有多态。但多态不仅仅是继承——接口也可以实现多态(后续章节讲解)。

总结

  • 理解多态的概念和优势
  • 了解多态实现条件
  • 多态的本质是动态绑定,方法调用根据运行时对象的实际类型决定
  • final关键字可以限制覆写和继承,保护核心代码

Java面向对象——5.多态的更多相关文章

  1. Java面向对象之多态(来源于身边的案例)

    2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...

  2. Java面向对象的多态

    Java中多态的概念是面向对象中除封装和继承外非常重要的知识点,也是Java面向对象三大特性最后一个特性 多态其实就是指对象存在的多种形态,多态分为引用多态和方法多态 引用多态的含义就是:父类的引用可 ...

  3. java面向对象之 多态 Polymorphism

    多态(Polymorphism):用我们通俗易懂的话来说就是子类就是父类(猫是动物,学生也是人),因此多态的意思就是:父类型的引用可以指向子类的对象. 1.多态的含义:一种类型,呈现出多种状态 主要讨 ...

  4. Java面向对象特性--多态

    Java是一种面向对象的编程语言,面向对象的三大特性就是继承,封装,多态.下面细细说一说多态. 多态的定义:一个事物的多种形态,指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而 ...

  5. JavaSE入门学习18:Java面向对象之多态

    一Java多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现.比方我们说"宠 物"这个对象.它就有非常多不同的表达或实现,比方有小猫.小狗.蜥 ...

  6. Java 面向对象_多态

    多态图解 代码中体现多态性 父类名称 对象名 = new 子类名称(); or 接口名称 对象名 = new 实现类名称(); // 父类 public class Father { public v ...

  7. 对Java面向对象中多态的理解

    理解的要点:多态意味着父亲的变量可以指向子类对象 面向对象程序设计的三大支柱是封装.继承和多态 封装对外把相应的属性和方法实现的细节进行了隐藏.继承关系使一个子类继承父亲的特征,并且加上了一些新的特征 ...

  8. Java面向对象11——多态

    多态  package oop.demon01.demon06; ​ public class Application {     public static void main(String[] a ...

  9. Java面向对象:多态

    多态:具有表现多种形态的能力的特征(同一个实现接口,使用不同的实例而执行不同的操作) 实现多态的优点:为了方便统一调用! 实现多态的三种方式! 1:子类到父类的转换: 例: 1 Dog dog=new ...

  10. Java面向对象之多态

    多态:具有表现多种形态的能力的特征(同一个实现接口,使用不同的实例而执行不同的操作) 实现多态的优点:为了方便统一调用! 实现多态的三种方式! 1:子类到父类的转换: 例: Dog dog=new D ...

随机推荐

  1. 纯前端实现图片伪3D视差效果

    作者:vivo 互联网前端团队- Su Ning 本文通过depth-anything获取图片的深度图,同时基于pixi.js,通过着色器编程,实现了通过深度图驱动的伪3D效果.该方案支持鼠标/手势与 ...

  2. FFmpeg开发笔记(六十三)FFmpeg使用vvenc把视频转为H.266编码

    ​前面的两篇文章分别介绍了如何在Linux环境和Windows环境给FFmpeg集成H.266的编码器vvenc,接下来利用ffmpeg把视频文件转换为VVC格式,观察新生成的vvc视频能否正常播放. ...

  3. DotTrace系列:4. 诊断窗体程序变卡之原因分析

    一:背景 1. 讲故事 写这一篇是因为昨天看 dottrace 官方文档时,在评论区看到了一条不友好的评论,截图如下: 虽然语气上带有些许愤怒,但说实话人家也不是无中生有,作为 dottrace 的忠 ...

  4. C#/.NET/.NET Core技术前沿周刊 | 第 44 期(2025年6.23-6.30)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  5. MySQL核心知识学习之路(6)

    作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习<MySQL实战45讲>的总结笔记的第六篇,总结了MySQL的InnoDB引擎相关的实践使用问题. 上 ...

  6. Excel中,文本显示的纯数字(超15位)处理建议

    EXCEL中,对于文本显示的纯数字(只能认前15位),vlookup,countif都会出错,但可以用新函数xlookup,filter等处理就没问题.所以在统计文本显示的数字的时候,一定要多注意.

  7. Luogu P10507 Georgia and Bob 题解

    P10507 Georgia and Bob 这篇题解的注重点不是结论的证明,而是发现结论的思路,所以比较偏感性.证明人人都会,而发现结论的思路才是这题真正值得思考的地方. 感觉这道题不知道阶梯 NI ...

  8. MySQL 13 为什么表数据删掉一半,表文件大小不变?

    一个InnoDB表包含两部分:表结构定义和数据.在MySQL 8.0版本前,表结构存在以.frm为后缀的文件里.之后的版本允许把表结构定义放在系统数据表中.由于表结构定义占用空间很小,所以主要讨论表数 ...

  9. Error 9 error LNK2001: *:qt_metacast 错误解决方案

    解决方案 观察到我建立的vs关于qt的项目没有生成 moc* 文件. 首先使用qt建立一个项目 然后用vs打开这个项目 把相关代码移动过来

  10. win10 多用户登陆

    win10 多用户登陆 一般的直接下载就可以用了. 核心参考链接github 支持 1903 支持最新版本可以需要这个 1903支持项参考页面 上述页面的下载文件页面1903支持页面 关于上述链接下载 ...