【Java面试】重载(Overload)和 重写(Override)的区别

ops/2025/3/7 0:03:31/

在Java编程中,重载(Overload) 和 重写(Override)是两个非常重要的概念,它们都与方法的行为相关,但有着本质的区别。理解它们的区别是Java面试中的常见考点。本文将详细解析重载和重写的区别,并通过代码示例帮助大家更好地掌握这两个概念。


1. 重载(Overload)

定义:
重载是指在同一个类中,允许存在多个方法名相同但参数列表不同的方法。重载与方法的返回值类型和访问修饰符无关。

特点:

  • 同一个类中:重载发生在同一个类中。
  • 方法名相同:重载的方法名称必须相同。
  • 参数列表不同:参数的类型、个数或顺序必须不同。
  • 返回值类型和访问修饰符可以不同:重载不关心返回值类型和访问修饰符是否相同。
  • 编译时绑定:重载是编译时的多态性,编译器根据方法签名(方法名 + 参数列表)来决定调用哪个方法。

示例:

java">public class OverloadExample {// 方法1:两个int参数public int add(int a, int b) {return a + b;}// 方法2:三个int参数(参数个数不同)public int add(int a, int b, int c) {return a + b + c;}// 方法3:一个double参数(参数类型不同)public double add(double a, double b) {return a + b;}// 方法4:参数顺序不同public String add(String a, int b) {return a + b;}// 方法5:参数顺序不同public String add(int a, String b) {return a + b;}
}

注意事项:

  • 如果两个方法的方法名和参数列表完全相同,即使返回值类型不同,也会导致编译错误。例如:
    java">public int add(int a, String b) { return a; }
    public String add(int a, String b) { return b; } // 编译报错
    

2. 重写(Override)

定义:
重写是指子类重新定义父类中已有的方法。重写的方法必须与父类方法具有相同的方法名、参数列表和返回值类型(或子类类型)。

特点:

  • 父子类中:重写发生在父类和子类之间。
  • 方法名和参数列表相同:子类方法必须与父类方法的方法名和参数列表完全相同。
  • 返回值类型小于等于父类:子类方法的返回值类型必须与父类方法相同或是其子类。
  • 访问修饰符范围大于等于父类:子类方法的访问修饰符不能比父类方法更严格(例如,父类是protected,子类可以是public,但不能是private)。
  • 抛出异常范围小于等于父类:子类方法抛出的异常类型必须与父类方法相同或是其子类。
  • 运行时绑定:重写是运行时的多态性,JVM根据实际对象的类型来决定调用哪个方法。

示例:

java">class Animal {// 父类方法public void makeSound() {System.out.println("Animal is making a sound");}
}class Dog extends Animal {// 子类重写父类方法@Overridepublic void makeSound() {System.out.println("Dog is barking");}
}public class OverrideExample {public static void main(String[] args) {Animal myDog = new Dog();myDog.makeSound(); // 输出:Dog is barking}
}

注意事项:

  • 如果父类方法的访问修饰符是private,则子类不能重写该方法。例如:
    java">class Parent {private void show() {System.out.println("Parent");}
    }class Child extends Parent {// 编译错误:不能重写父类的private方法@Overrideprivate void show() {System.out.println("Child");}
    }
    

3. 重载与重写的区别
特性重载(Overload)重写(Override)
发生位置同一个类中父子类中
方法名必须相同必须相同
参数列表必须不同(类型、个数、顺序)必须相同
返回值类型可以不同必须相同或是父类方法的子类
访问修饰符可以不同不能比父类方法更严格
抛出异常可以不同必须相同或是父类方法的子类
绑定时机编译时运行时
多态性编译时多态运行时多态

4. 常见面试问题
  1. 重载和重写的区别是什么?

    • 如上表所示,重载和重写在发生位置、参数列表、返回值类型、访问修饰符、绑定时机等方面有显著区别。
  2. 为什么返回值类型不能作为重载的依据?

    • 因为方法调用时,编译器无法仅通过返回值类型来确定调用哪个方法。例如:
      java">int result = add(1, 2);
      String result = add(1, 2); // 编译器无法区分
      
  3. 父类的静态方法能被重写吗?

    • 不能。静态方法属于类级别,子类可以定义与父类相同的静态方法,但这属于隐藏(Hide),而不是重写。
  4. 重写方法时,子类方法的访问修饰符可以比父类更严格吗?

    • 不能。子类方法的访问修饰符必须大于或等于父类方法的访问修饰符。

5. 总结
  • 重载:发生在同一个类中,方法名相同但参数列表不同,与返回值类型和访问修饰符无关。
  • 重写:发生在父子类中,方法名、参数列表和返回值类型必须相同,访问修饰符不能更严格,抛出异常范围不能更大。

理解重载和重写的区别,能够帮助我们在实际开发中更好地设计类和方法,同时也能在面试中从容应对相关问题。


http://www.ppmy.cn/ops/163732.html

相关文章

直接法估计相机位姿

引入 在前面的文章:运动跟踪——Lucas-Kanade光流中,我们了解到特征点法存在一些缺陷,并且用光流法追踪像素点的运动来替代特征点法进行特征点匹配的过程来解决这些缺陷。而这篇文章要介绍的直接法则是通过计算特征点在下一时刻图像中的位置…

Spark核心之02:RDD、算子分类、常用算子

spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD(Resilient Distributed Dataset)叫做**弹性分布式数据集,是Spark中最基本的数据抽象&#xff0c…

什么是 JVM? JVM (Java Virtual Machine)

JVM(Java Virtual Machine,Java 虚拟机)是一个虚构出来的计算机,它是一种规范,有自己的指令集,并且在运行时操作各种内存区域。JVM 是 Java 平台的核心组成部分,负责执行 Java 字节码&#xff0…

玩转大语言模型——Ubuntu系统环境下使用llama.cpp进行CPU与GPU混合推理deepseek

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——三分钟教你用langchain提示词工程获得猫娘女友 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型—…

《Linux C 智能 IO 矩阵:输入输出的自适应数据流转》

1. 标准库IO简介 标准库IO特点:通过操作系统提供的接口(API)和操作系统进行交互。(接近100个函数) 1.1. IO的过程 操作系统:向上为用户提供操作接口,向下为统筹控制硬件。 操作系统的组成&#…

Spring IoC配置(xml+FactoryBean)

文末有本篇文章的项目源文件可供下载 通过Spring IoC容器创建组件类对象的方式主要是构造函数/工厂模式/FactoryBean这三种,其中FactoryBean(标准化工厂类)主要是为了简化工厂模式,因为FactoryBean是一个特殊的组件接口,接口中定义了getObject方法,该方法用于返回由…

Node.js二:第一个Node.js应用

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 创建的时候我们需要用到VS code编写代码 我们先了解下 Node.js 应用是由哪几部分组成的: 1.引入 required 模块:我们可以使用 requi…

MySQL事务,函数,性能,索引

MySQL事务,函数 事务 执行事务:相当于一个业务操作 例如:转账操作,一个用户转出资金,另外一个用户收到增加自己的资金,这两个步骤都需要成功执行才行) # MySQL数据库中默认:一行S…