臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速7.Google 搜索收录排查:为什么关键词搜得到别人,却搜不到我的网站?Obsidian、双向链接与知识图谱
架构设计
分布式分布式事务RPC原理
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
数据库
mysql01.MySQL基础语法与约束02.MySQL数据库类型03.MySQL多表查询04.MySQL 索引05.MySQL 事务06.MySQL 隔离级别07.MySQL MVCC08.MySQL 锁09.EXPLAIN10.慢查询与 SQL 优化
mysql面试题01.索引问题02.事务与隔离级别03.锁机制04.存储引擎与性能优化05.用户权限、字符集与备份恢复
mysql实战01.EXPLAIN实战02.测试环境菜单误删排查与恢复03.MySQL IN 详解
网络
网络安全1.无线监听网卡苹果M系列虚拟机安装Kali Linux教程3.kali怎么使用RTL8812AU4.kali基础命令
网络基础进程之间怎样通过网络传递数据
网址常用网址
中间键
esElasticsearch 入门
mq
RabbitMQRabbitMQ高级RabbitMQ基础
1. MQ 基础2. MQ 核心角色与代码对应3. MQ Consumer Group 与消费模式4. SOFAMQ 账户变更代码实践5. MQ 可靠性问题6. 消息幂等
redis缓存击穿、穿透与雪崩Redis 分布式锁Redis 缓存问题Redis 数据结构
AI
使用说明
第三方插件&技能简介Archify使用与安装指南geekgeekRun使用OfferFlow使用指南Ponytail使用指南Skills Manager使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发0-学习路线1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.*完成可运行聊天接口11.Function Calling、Tool Calling 原理12.用 Java 方法定义 Tool13.工具参数设计和校验14.实现订单查询工具15.实现物流查询工具16.实现库存查询工具17.多个工具自动选择18.工具异常、超时、重试
diy主机
主机零件学习1.CPU2.主板3.内存4.显卡5.硬盘6.散热7.风扇8.机箱热门型号价格表
捡垃圾diy-13600kf+5060diy-14600kf+5070
English高频词汇英文基础语法简单句子音标
GitGit常用命令Sublime Merge 使用指南
Java
工具库Caffeine本地缓存Reactor教程
工作实践如何使用@Async线程池使用与排查线上服务 CPU 使用率过高排查压测下RPC接口大量失败排查记录
基础1.HashMap2.ConcurrentHashMap3.HashSet4.final5.static6.volatile7.AtomicInteger8.String动态代理反射锁与线程同步线程注解
面试题1.HashMap 存储在方法内是线程安全的吗2.ArrayList参数传递与引用重新赋值3.== 和 equals 的区别、hashcode4.重载和重写的区别5.String、StringBuffer、StringBuilder区别及使用场景6.接口和抽象类7.ArrayList 与 LinkedList 的区别和扩容机制8.HashMap 和 Hashtable 的区别及底层实现9.Object 和 Objects 的区别10.ThreadLocal的原理和使用场景11.字节码是什么及作用12.Java类加载器有哪些13.双亲委派模型14.Java异常体系15.GC是什么16.GC如何判断对象可以被回收
面试总结0.HR面试模板1.面试一2.面试二3.面试三笔试
网络与 IO(黑马程序员-纯理论)01-网络编程基础02-IO模型与零拷贝03-BIO04-NIO基础与缓冲区05-NIO通道与选择器06-AIO
juc00-目录01-进程与线程02-线程同步与通信03-并发设计模式04-Java内存模型05-CAS与原子类06-ThreadLocal07-阻塞队列08-线程池使用与原理09-任务调度10-ForkJoin与享元模式11-AQS12-ReentrantLock13-读写锁14-并发协作工具15-ConcurrentHashMap16-CopyOnWrite与同步容器17-SkipListMap18-非阻塞队列
juc(工作常见)Java并发编程三个重点拆解
jvm1. JVM运行时数据区
Spring1.Spring IoC、DI与构造方法注入CGLIB、Byte Buddy 与 Spring AOPSpring 常用注解详解Spring Bean 生命周期
Spring MVC异常处理机制
linux常用命令
mac快捷键终端常用操作
python
基础01.Python是什么,为什么要安装Python02.Python项目中.venv是什么03.Python基础语法
基础实战sql替换
HTTPXHRMS员工详情接口调用(Python HTTPX)
windowswindows激活

一、💡 一句话理解

核心结论

**重载(Overload)**是同一个类中“方法名相同、参数不同”;**重写(Override)**是子类重新实现父类已有的方法。

记忆:重载看参数,重写看继承。

二、🧭 理论:它们是什么

2.1 核心区别

对比项重载重写
发生位置通常在同一个类中父类与子类之间
方法名相同相同
参数列表必须不同必须相同
返回值不能只靠返回值区分重载相同或使用协变返回类型
访问修饰符可以不同可以相同或扩大,不能缩小
决定时间编译时根据参数决定运行时根据实际对象决定
主要作用同一种功能支持不同输入子类改变继承来的行为

2.2 重载时,返回值和修饰符可以不同吗

可以不同,但判断重载只看方法名和参数列表。参数的数量、类型或顺序必须不同,不能只修改返回值或修饰符。

public int convert(int value) {
    return value;
}
 
private String convert(String value) {
    return value;
}

上面是合法重载:两个方法的返回值、访问修饰符和参数类型都不同,真正使它们构成重载的是参数类型不同。

下面不是合法重载,因为参数列表相同:

int convert(int value) {
    return value;
}
 
// 编译错误:不能只通过返回值区分方法。
String convert(int value) {
    return String.valueOf(value);
}

2.3 重写时,返回值和修饰符可以不同吗

返回值必须相同,或者是父类返回类型的子类型,这叫作协变返回类型。如果返回的是基本类型或 void,则必须完全相同。

访问修饰符可以相同或扩大,但不能缩小。例如,父类是 protected,子类可以改为 public,但不能改成默认访问权限或 private。

例如,父类方法是 protected Object getValue(),子类可以重写成 public String getValue():权限从 protected 扩大为 public,返回值从 Object 变为其子类型 String。

class Parent {
    protected Object getValue() {
        return new Object();
    }
}
 
class Child extends Parent {
    @Override
    public String getValue() {
        // 权限更宽,返回值是 Object 的子类型,属于合法重写。
        return "Java";
    }
}

其他常见修饰符

static 方法不能被重写,只能被隐藏;final 方法不能被重写;父类的 private 方法对子类不可见,因此也不属于重写。

三、⚙️ 理论:它们怎么工作

3.1 重载:编译时选方法

编译器根据参数的数量、类型和顺序,选择要调用的同名方法。

void print(int value) { }
void print(String value) { }

只修改返回类型不算重载,因为调用时编译器无法据此区分方法。

3.2 重写:运行时选实现

父类引用可以指向子类对象。调用实例方法时,Java 会执行实际对象所属子类的实现,这就是多态。

注意

static 方法不能被重写,只能被隐藏;重写实例方法时建议添加 @Override,让编译器帮助检查。

四、🚀 实践:最小示例

4.1 完整代码

文件:Demo.java

class Animal {
    void speak() {
        System.out.println("动物叫");
    }
}
 
class Dog extends Animal {
    @Override
    void speak() {
        // 重写:参数列表与父类一致,改变子类的具体行为。
        System.out.println("小狗汪汪叫");
    }
 
    void eat(String food) {
        System.out.println("吃一种食物:" + food);
    }
 
    void eat(String food, int count) {
        // 重载:方法名相同,但参数数量不同。
        System.out.println("吃 " + count + " 份 " + food);
    }
}
 
public class Demo {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat("骨头");
        dog.eat("骨头", 2);
 
        Animal animal = new Dog();
        // 实际对象是 Dog,因此运行 Dog 重写后的 speak 方法。
        animal.speak();
    }
}

运行:

javac Demo.java
java Demo

预期输出:

吃一种食物:骨头
吃 2 份 骨头
小狗汪汪叫

五、🎤 面试时怎么说

5.1 30 秒标准回答

重载是一个类中存在多个同名方法,但参数列表不同,编译器会根据实参在编译期选择方法。重写发生在继承关系中,子类使用相同的方法签名重新实现父类的实例方法,运行时会根据对象的实际类型选择实现。简单记就是:重载看参数,重写看继承和实际对象。

5.2 高频追问

  • **只改返回值能重载吗?**不能,方法调用无法仅凭返回值区分。
  • **重载方法的访问修饰符可以不同吗?**可以,但构成重载的依据仍然是参数列表不同。
  • **重写方法的返回值可以不同吗?**可以使用父类返回类型的子类型;基本类型和 void 必须相同。
  • **重写方法能缩小访问权限吗?**不能,只能保持不变或扩大权限。
  • **static 方法能重写吗?**不能,同名同参数的 static 方法属于隐藏。
  • **private 方法能重写吗?**不能,因为子类不能继承父类的 private 方法。

六、📌 总结

  • 重载:同名、参数不同,编译时确定。
  • 重写:继承、签名相同,运行时确定。
  • 返回值或修饰符不同不能单独构成重载。
  • 重写可以使用协变返回类型,访问权限只能保持或扩大。
  • static 和 private 方法不参与普通实例方法的重写。

七、🔗 官方资料