当前位置: 首页 > news >正文

Java 4——方法的重写 多态

方法的重写

重写:子类对父类中提供的方法进行重新定义

语法:子类和父类中的方法的声明(即方法名,参数列表,返回值类型)完全一致

重写又被称为方法的覆盖

public class LiYuan { public void makeCountry(){ System.out.println("李渊想建立一个自己的国家"); } } public class LiShiMing extends LiYuan{ //子类中的方法必须和父类中的方法完全一致 public void makeCountry(){ //半盖 super.makeCountry();//super可以调用父类中被重写了的内容 System.out.println("李世明也想建立一个自己的国家"); } public static void main(String[] args) { LiShiMing l = new LiShiMing(); l.makeCountry(); } } /*输出: 李渊想建立一个自己的国家 李世明也想建立一个自己的国家 */
规则
规则说明
方法签名必须相同方法名 + 参数列表(顺序、个数、类型)完全一致
返回值类型可以更小允许返回父类返回类型的子类(称为协变返回类型,JDK 1.5+)
访问权限不能更严格父类public→ 子类只能是public;父类protected→ 子类可以是protectedpublic
不能重写private方法private方法在子类中不可见,无法重写(但可以定义同名方法,那是一个新方法)
不能重写final方法final修饰的方法不能被重写
不能重写static方法静态方法属于类,不存在重写(子类可以定义同名静态方法,称为“隐藏”)
不能抛出比父类更宽泛的异常子类方法抛出的异常类型必须是父类方法抛出异常的子类或相同
重写vs重载
比较项重写(Override)重载(Overload)
发生范围子类与父类之间同一个类中
方法名必须相同必须相同
参数列表必须相同必须不同(个数、类型、顺序)
返回值相同或协变可以不同
修饰符不能更严格无限制
异常不能抛出更宽泛的异常无限制
静态方法不能被重写(只能隐藏)可以重载

多态

多态:同一个对象拥有多种形态,是面向对象编程的三大特性之一(封装、继承、多态)。它允许同一个行为具有多个不同表现形式,或者说一个接口,多种实现。

前提条件

1.继承关系(或接口实现)

2.方法重写(子类重写父类的方法)

3.父类引用指向子类对象

Animal a = new Dog(); // 父类引用指向子类对象 a.sound(); // 调用的是 Dog 的 sound()

作用:把不同的数据类型进行统一,让程序具有超强的可拓展性

//猫是一种懂动物 public class Animal { public void eat() { System.out.println("猫吃鱼"); } } //猫是一种动物 -> 继承关系 //可以把猫当成动物来看 public class Cat extends Animal{ public void eat() { System.out.println("猫吃鱼"); } } public class Dog extends Animal{ public void eat(){ System.out.println("狗吃骨头"); } } public class Person { // public void feedCat(Cat c) { // c.eat(); // } // public void feedDog(Dog d) { // d.eat(); // } // public void feedDaXiang(DaXiang dx) { // dx.eat(); // } public void feed(Animal ani) { //接收到的所有动物都是animal ani.eat(); } } public class Client { public static void main(String[] args) { // Cat c = new Cat(); // Dog d = new Dog(); // Person p = new Person(); // p.feedCat(c); // p.feedDog(d); //Cat c = new Cat();//创建一只猫 Animal ani1 = new Cat();//可以把猫当成动物来看,把子类的对象赋值给父类的引用(变量) 向上转型 Animal ani2 = new Dog(); Animal ani3 = new DaXiang(); Person p = new Person(); p.feed(ani1); p.feed(ani2); p.feed(ani3); //多态:把不同的数据类型进行统一 } }
多态的两种形式
形式示例
基于继承的多态Parent p = new Child();
基于接口的多态List list = new ArrayList();
多态中的成员访问
成员类型编译看左边(父类)运行看右边(子类)
成员变量✅ 父类变量❌ 子类变量不可见
成员方法父类声明的方法✅ 子类重写的方法
静态方法父类方法(不存在重写)父类方法
向上转型&向下转型

把子类的对象赋值给父类的变量 -> 向上转型(缺点:屏蔽掉子类中特有的方法)

把父类的变量转化回子类的变量 -> 向下转型(向下转型有可能会有风险 Java要求必须要写强制类型转换)(格式:(转换之后的数据类型)变量)

//猫是一种懂动物 public class Animal { public void eat() { System.out.println("猫吃鱼"); } } //猫是一种动物 -> 继承关系 //可以把猫当成动物来看 public class Cat extends Animal{ public void eat() { System.out.println("猫吃鱼"); } public void catchMouse() { System.out.println("猫喜欢抓老鼠"); } } public class Dog extends Animal{ public void eat(){ System.out.println("狗吃骨头"); } } public class Person { // public void feedCat(Cat c) { // c.eat(); // } // public void feedDog(Dog d) { // d.eat(); // } // public void feedDaXiang(DaXiang dx) { // dx.eat(); // } public void feed(Animal ani) { //接收到的所有动物都是animal ani.eat(); } } public class Client { public static void main(String[] args) { // Cat c = new Cat(); // Dog d = new Dog(); // Person p = new Person(); // p.feedCat(c); // p.feedDog(d); //Cat c = new Cat();//创建一只猫 Animal ani1 = new Cat();//可以把猫当成动物来看,把子类的对象赋值给父类的引用(变量) 向上转型 但是向上转型会屏蔽掉子类中特有的方法 Animal ani2 = new Dog(); Animal ani3 = new DaXiang(); // Person p = new Person(); // p.feed(ani1); // p.feed(ani2); // p.feed(ani3); //多态:把不同的数据类型进行统一 //向下转型 Cat cc = (Cat)ani1; cc.catchMouse();//猫又可以抓老鼠了 } }
多态与重写、重载的关系
概念关系
多态 + 重写动态绑定,运行时决定调用哪个方法(多态的核心机制)
多态 + 重载重载是编译时决定(静态多态),属于早期绑定,不是真正的多态
应用场景

1.方法参数:接收父类类型,传入任意子类对象。

2.返回值:返回父类类型,实际返回子类对象。

3.数组/集合:存储父类类型的元素,实际放入子类对象。

// 集合多态 List<Animal> list = new ArrayList<>(); list.add(new Dog()); list.add(new Cat());
误区
误区正确理解
父类引用不能调用子类新增方法是的,需要向下转型才能调用
成员变量也具有多态错误,成员变量没有多态,编译看左边
静态方法可以被重写从而实现多态错误,静态方法不能被重写,没有多态
private方法可以被重写错误,private方法对子类不可见
http://www.jsqmd.com/news/815971/

相关文章:

  • 避坑指南:Python爬取立创商城LCSC价格时,如何应对动态加载与反爬?
  • MAA:明日方舟游戏日常任务的自动化解放方案
  • 企业如何利用Taotoken统一管理多团队的AI模型用量与成本
  • 企业内如何利用Taotoken实现API Key的统一管理与审计
  • 3步实现Illustrator批量替换自动化,设计效率提升10倍
  • Chapter 03:Rules 进阶 - 企业级规则配置实战
  • 告别硬件:用Keil5逻辑分析仪‘看’GD32F305的GPIO与串口数据
  • 开源监控仪表盘架构解析:从数据源集成到可视化实践
  • 忠告:专业测试人员,尽量不要碰国内Y测与Z测平台
  • ElevenLabs语音情感引擎失效真相:当“庄重感”参数设为0.82时,脑电α波响应率骤降41%(fNIRS实测报告)
  • 在OpenClaw中配置Taotoken作为Agent任务的模型提供商
  • [Dify 实战] 将私有 LLM 模型接入 Dify:从本地推理到企业级 AI 平台
  • 2026 年 5 月武汉闲置奢侈品回收横向测评,合扬老店脱颖而出 - 奢侈品回收测评
  • 新手也能搞定的CREE SiC MOSFET驱动板:从原理图到四层PCB的保姆级设计流程
  • 告别静电损伤!手把手教你为单片机/树莓派GPIO口设计低成本ESD防护电路
  • 独立开发者如何借助Taotoken Token Plan套餐优化项目预算
  • Cursor Pro功能无限试用:开源自动化工具原理与实战部署指南
  • 终极GTA圣安地列斯存档编辑器:跨平台游戏修改完全指南
  • 人工智能通识课:机器学习之强化学习
  • Moltbook MCP Server:零代码将AI Agent接入ChatGPT/Claude的远程工具平台
  • Unity开发效率翻倍!用Hot Reload插件告别反复重启,实测2023.2版本可用
  • Taotoken用量看板与账单明细带来的成本管理清晰度
  • Taotoken的按Token计费模式让开发测试阶段的成本更加清晰
  • 【研报 A124】太空算力重构算力供给与产业格局:AI奔赴星辰大海
  • 把笔记变成可生长的知识系统:Obsidian 技术介绍
  • 从理论到仿真:基于Multisim的基尔霍夫定律深度验证指南(含完整工程)
  • 国内全自动折盒机厂家实测排行:核心指标横向对比 - 奔跑123
  • 基于Function Calling的智能对话客户端:让大语言模型从“能说”到“会做”
  • FineReport 隐藏空列,单元格隐藏为空字符串
  • 如何三步解锁全网音乐资源:LXMusic音源终极配置手册