【JavaSE专栏33】用大白话解释Java的方法重载和方法覆盖

简介: 【JavaSE专栏33】用大白话解释Java的方法重载和方法覆盖

一、什么是Java方法重载

在同一个类中有多个方法名一致的方法,但是这些方法参数列表不同,代码也不一样,那么我们就叫做方法重载。

在Java中,方法重载也是 Java 多态性的一种实现。

Java 支持动态根据实参和形参匹配度来确定到底要使用哪一个方法。

比如我们Java常用的输出语句 System.out.print(); 你可以传入不同数据类型的值,它都可以进行输出操作。


二、最简单的例子 —— a + b

先来一个最简单的例子 —— a + b。

1. public class Main {
2.  public static int add(int x, int y) {
3.    return x + y;
4.  }
5.  public static void main(String[] args) {
6.    System.out.println(add(1, 2));
7.  }
8. }

结果可想而知,输出就是 —— 3 。

那么如果再写一个重名的方法呢?

IDE就报错了,因为被系统认为是完全一样的方法,哪怕返回类型不一致也不行

在Java中,如果多个方法的方法名相同,则必须保证参数类型不完全一致。

就像下面这样,参数类型分别是 int 和 double。

1. public class Main {
2.  public static int add(int x, int y) {
3.    return x + y;
4.  }
5.  public static int add(double x, double y) {
6.    return (int)(x + y);
7.  }
8.  public static void main(String[] args) {
9.    System.out.println(add(1, 2));
10.     System.out.println(add(1.9, 2.5));
11.   }
12. }

这两个方法的形参列表不一致,就可以实现方法重载了。


三、综合应用 —— 多功能计算器

首先编写一个计算器类—— Calculation,实现add()方法的五中不同重载

1. public class Calculation {
2.  public int add(int x,int y) {
3.    return x + y;
4.  }
5.  public double add (double x, double y) {
6.    return x + y;
7.  }
8.  public float add (float x, float y) {
9.    return x + y;
10.   }
11.   public String add (String x, String y) {
12.     return x + y;
13.   }
14.   public long add (long x, long y) {
15.     return x + y;
16.   }
17. }

接着在测试方法中,分别调用这五种重载。

1. public class Main {
2.  public static void main(String[] args) {
3.    Calculation c = new Calculation();
4.    System.out.println("Int add = " +c.add(1,2));
5.    System.out.println("Float add = " +c.add(360.2f,159.8f));
6.    System.out.println("Double add = " +c.add(632.84,681.68));
7.    System.out.println("Long add = " +c.add(326866l,987654l));
8.    System.out.println("String add = " + c.add("hello","zwz"));
9.  }
10. }

我们可以看到,对于 add() 方法,可以传入不同数据类型的参数,已实现 Java 方法重载。


四、方法重载和方法覆盖的异同

Java方法覆盖指的是在继承的父类和子类中,子类对父类的方法进行了重写,即在不同的类中实现。

比如有一个计算机子类 —— MyCalculation,继承于刚刚的 Calculation 类。

1. public class MyCalculation extends Calculation{
2.  public int add(int x,int y) {
3.    return x + y + 1;
4.  }
5. }

我们在测试方法中实例化一个 MyCalculation 对象,发现依然可以调用父类 Calculation 的重载方法。

但是在调用子类 MyCalculation 重写的add(int , int)方法时,可以发现子类的方法覆盖掉了父类。

1. public class Main {
2.  public static void main(String[] args) {
3.    MyCalculation myCalculation = new MyCalculation();
4.    System.out.println(myCalculation.add(1, 2));
5.  }
6. }

即结果没有遵循父类 Calculation 的 add(int,int),而是遵循了子类 MyCalculation 的 add(int,int)。

方法覆盖要求子类的方法申明必须和父类的完全一致,但方法重载则要求参数列表的形参不一样

五、总结

本文对 Java 的方法重载和方法覆盖的知识点,在下一篇博客中,将讲解 Java函数命令行传参的知识。

 


相关文章
|
8天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
41 4
|
19天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
39 17
|
13天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
18 2
|
1月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
46 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
21天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
15 3
|
23天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
21天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
14 2
|
21天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
14 1
|
21天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
27 1
|
21天前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
22 1