Java面向对象——5.多态
Java多态(Polymorphic)
多态(Polymorphism)是面向对象编程的三大核心特性之一,指的是同一个行为在不同对象上会产生不同的表现形式。多态的主要价值在于代码复用与扩展,它允许我们在不修改现有代码的情况下扩展系统功能。
多态的实现条件
- 存在继承关系(子类继承父类)
- 子类重写父类的方法
- 父类引用指向子类对象
构造的示例
// 父类
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)不一致时,方法调用会动态绑定到实际类型的实现。
多态的工作原理
- 编译器检查变量的声明类型,确保该类型包含被调用的方法
- 运行时,JVM确定对象的实际类型
- JVM调用实际类型中覆写后的方法实现
这种机制使得我们可以编写通用代码,操作父类类型,而实际运行时会自动适配不同的子类实现。
覆写Object方法
所有Java类都间接继承自Object类,Object定义了几个重要方法,我们经常需要在子类中覆写这些方法以实现特定功能。
- toString():把instance输出为String;
- equals():判断两个instance是否逻辑相等;
- hashCode():计算一个instance的哈希值。
多态的限制与控制:final关键字
final关键字可以限制多态行为,用于保护核心方法不被修改或防止类被继承。
final的三种用法
- 修饰方法:阻止方法被覆写
class Parent {
// final方法不能被覆写
public final void importantMethod() {
System.out.println("这是核心方法,不能被修改");
}
}
class Child extends Parent {
// 编译错误:不能覆写final方法
@Override
public void importantMethod() {
}
}
- 修饰类:阻止类被继承
// final类不能被继承
final class FinalClass {
public void doSomething() {
System.out.println("这个类不能被继承");
}
}
// 编译错误:不能继承final类
class SubClass extends FinalClass {
}
- 修饰字段:字段初始化后不能被修改
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.多态的更多相关文章
- Java面向对象之多态(来源于身边的案例)
2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...
- Java面向对象的多态
Java中多态的概念是面向对象中除封装和继承外非常重要的知识点,也是Java面向对象三大特性最后一个特性 多态其实就是指对象存在的多种形态,多态分为引用多态和方法多态 引用多态的含义就是:父类的引用可 ...
- java面向对象之 多态 Polymorphism
多态(Polymorphism):用我们通俗易懂的话来说就是子类就是父类(猫是动物,学生也是人),因此多态的意思就是:父类型的引用可以指向子类的对象. 1.多态的含义:一种类型,呈现出多种状态 主要讨 ...
- Java面向对象特性--多态
Java是一种面向对象的编程语言,面向对象的三大特性就是继承,封装,多态.下面细细说一说多态. 多态的定义:一个事物的多种形态,指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而 ...
- JavaSE入门学习18:Java面向对象之多态
一Java多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现.比方我们说"宠 物"这个对象.它就有非常多不同的表达或实现,比方有小猫.小狗.蜥 ...
- Java 面向对象_多态
多态图解 代码中体现多态性 父类名称 对象名 = new 子类名称(); or 接口名称 对象名 = new 实现类名称(); // 父类 public class Father { public v ...
- 对Java面向对象中多态的理解
理解的要点:多态意味着父亲的变量可以指向子类对象 面向对象程序设计的三大支柱是封装.继承和多态 封装对外把相应的属性和方法实现的细节进行了隐藏.继承关系使一个子类继承父亲的特征,并且加上了一些新的特征 ...
- Java面向对象11——多态
多态 package oop.demon01.demon06; public class Application { public static void main(String[] a ...
- Java面向对象:多态
多态:具有表现多种形态的能力的特征(同一个实现接口,使用不同的实例而执行不同的操作) 实现多态的优点:为了方便统一调用! 实现多态的三种方式! 1:子类到父类的转换: 例: 1 Dog dog=new ...
- Java面向对象之多态
多态:具有表现多种形态的能力的特征(同一个实现接口,使用不同的实例而执行不同的操作) 实现多态的优点:为了方便统一调用! 实现多态的三种方式! 1:子类到父类的转换: 例: Dog dog=new D ...
随机推荐
- 纯前端实现图片伪3D视差效果
作者:vivo 互联网前端团队- Su Ning 本文通过depth-anything获取图片的深度图,同时基于pixi.js,通过着色器编程,实现了通过深度图驱动的伪3D效果.该方案支持鼠标/手势与 ...
- FFmpeg开发笔记(六十三)FFmpeg使用vvenc把视频转为H.266编码
前面的两篇文章分别介绍了如何在Linux环境和Windows环境给FFmpeg集成H.266的编码器vvenc,接下来利用ffmpeg把视频文件转换为VVC格式,观察新生成的vvc视频能否正常播放. ...
- DotTrace系列:4. 诊断窗体程序变卡之原因分析
一:背景 1. 讲故事 写这一篇是因为昨天看 dottrace 官方文档时,在评论区看到了一条不友好的评论,截图如下: 虽然语气上带有些许愤怒,但说实话人家也不是无中生有,作为 dottrace 的忠 ...
- C#/.NET/.NET Core技术前沿周刊 | 第 44 期(2025年6.23-6.30)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...
- MySQL核心知识学习之路(6)
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习<MySQL实战45讲>的总结笔记的第六篇,总结了MySQL的InnoDB引擎相关的实践使用问题. 上 ...
- Excel中,文本显示的纯数字(超15位)处理建议
EXCEL中,对于文本显示的纯数字(只能认前15位),vlookup,countif都会出错,但可以用新函数xlookup,filter等处理就没问题.所以在统计文本显示的数字的时候,一定要多注意.
- Luogu P10507 Georgia and Bob 题解
P10507 Georgia and Bob 这篇题解的注重点不是结论的证明,而是发现结论的思路,所以比较偏感性.证明人人都会,而发现结论的思路才是这题真正值得思考的地方. 感觉这道题不知道阶梯 NI ...
- MySQL 13 为什么表数据删掉一半,表文件大小不变?
一个InnoDB表包含两部分:表结构定义和数据.在MySQL 8.0版本前,表结构存在以.frm为后缀的文件里.之后的版本允许把表结构定义放在系统数据表中.由于表结构定义占用空间很小,所以主要讨论表数 ...
- Error 9 error LNK2001: *:qt_metacast 错误解决方案
解决方案 观察到我建立的vs关于qt的项目没有生成 moc* 文件. 首先使用qt建立一个项目 然后用vs打开这个项目 把相关代码移动过来
- win10 多用户登陆
win10 多用户登陆 一般的直接下载就可以用了. 核心参考链接github 支持 1903 支持最新版本可以需要这个 1903支持项参考页面 上述页面的下载文件页面1903支持页面 关于上述链接下载 ...