专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java中的方法重载和方法重写的区别是什么?它们在多态中的作用?

temp10 2025-03-14 20:37:32 java教程 7 ℃ 0 评论

“合抱之木,生于毫末;九层之台,起于累土。” 很多人对基础知识的巩固不够重视。Java 基础就如同大厦的基石,没有稳固的基石,再宏伟的架构也只是空中楼阁。


Java中的方法重载和方法重写的区别是什么?它们在多态中的作用?

检验知识是否学得牢固,有一个比较好的办法,假设现在有个面试官问你这个问题,你是否脑瓜子嗡嗡的呢?



为了全面掌握基础知识,我们计划形成基础知识100问,破解大多数的JAVA面试涉及到的基础问题,不用去背八股文,掌握好基础就能灵活应对面试官的提问。


往期我们讨论过的主题有:


1. Java 基本数据类型有哪几种?它们各自所占的字节数是多少?


这里补充一下默认值


byte、short、int的默认值为0

long的默认值为0L

float的默认值为0.0f

double的默认值为0.0d

char的默认值为'\u0000'

boolean的默认值为false


2. JAVA自动装箱和拆箱是如何实现的?在什么场景下会自动发生?

3. Java中的String、StringBuilder和StringBuffer的区别,以及各自的适用场景

4. JAVA技术第4问:==和equals方法在比较对象时的区别是什么?在自定义类中如何正确重写equals方法?

5. JAVA技术第5问:Java中的final关键字有哪些作用?分别应用在类、方法和变量上时会有什么效果?

6. JAVA技术第6问:什么是抽象类和接口?它们之间有什么区别?什么情况下用?

7. JAVA技术第7问:解释Java中的多态性,它是如何实现的?有哪些体现形式?

今天咱们是第八问,探讨的内容是:"请描述Java中的方法重载和方法重写的区别,以及它们在多态中的作用。"


试想一下,如果不往下看,你是否能够完整地回答出这个问题呢? 如果答案是肯定的,那恭喜你,你可以节约些时间去学习别的知识了! 当然,“温故而知新”,如果您不忙的话,接着往下看也无妨。


在Java中,方法重载(Overloading)和方法重写(Overriding)是两种不同的概念,它们在多态性中都扮演着重要的角色,但它们的作用和实现方式是不同的。

方法重载(Overloading)

方法重载指的是在同一个类中存在多个同名方法,但是这些方法的参数列表(参数的个数、类型或者顺序)必须不同。以下是方法重载的几个特点:

  • 发生在同一个类中。
  • 方法名相同,参数列表不同。
  • 返回类型可以相同也可以不同。
  • 访问修饰符可以不同。
  • 方法重载与返回类型无关。


public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
    public double add(double a, double b) {
        return a + b;
    }
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

在上面的例子中,add 方法被重载了三次,根据不同的参数列表来调用不同的方法。

方法重写(Overriding)

方法重写指的是在子类中重新定义父类中已有的方法。以下是方法重写的几个特点:

  • 发生在子类与父类之间。
  • 方法名和参数列表必须相同。
  • 访问修饰符必须相同或者更为宽松(比如,子类中的访问修饰符不能比父类中的更严格)。
  • 返回类型必须相同或者是父类返回类型的子类型(covariant return types)。
  • 重写的方法不能比被重写的方法抛出更多种类的检查异常。
public class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}
public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}

在上面的例子中,Dog 类重写了 Animal 类的 sound 方法。

在多态中的作用

方法重载 在多态中不是直接相关的,因为它是在编译时解析的,编译器会根据方法签名(方法名和参数列表)来决定调用哪个方法。重载不是多态的一部分,因为它不涉及对象的类型转换。

方法重写 是多态的核心。当子类对象被向上转型为父类引用时,可以调用重写的方法,此时会调用子类中的方法实现,而不是父类中的方法实现。这允许在运行时根据对象的实际类型来调用正确的方法,这是面向对象编程中动态绑定和多态性的体现。

Animal myAnimal = new Dog();
myAnimal.sound(); // 输出 "Dog barks",因为实际对象是Dog类型,所以调用了Dog类中重写的方法

在这个例子中,myAnimal 是一个 Animal 类型的引用,但它指向了一个 Dog 类型的对象。当调用 sound 方法时,由于多态性,会调用 Dog 类中重写的方法。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表