【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函数命令行传参的知识。

 


相关文章
|
4天前
|
存储 Java 容器
Java数组的初始化方法
Java数组的初始化方法
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
|
3天前
|
算法 Java 数据处理
解决Java中堆栈溢出错误的方法
解决Java中堆栈溢出错误的方法
|
6天前
|
Java 数据处理 数据库
Java中equalsIgnoreCase方法的应用
Java中equalsIgnoreCase方法的应用
|
6天前
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
|
6天前
|
设计模式 Java API
如何处理Java中的方法过长?
如何处理Java中的方法过长?
|
2天前
|
Java 数据处理 数据库
Java中equalsIgnoreCase方法的应用
Java中equalsIgnoreCase方法的应用
|
2天前
|
存储 Java 程序员
Java中的国际化与本地化实现方法
Java中的国际化与本地化实现方法
|
2天前
|
JSON NoSQL Java
Redis18的Java客户端-StringRedisTemplate,序列化存在的问题,使用StringRedisTemplate解决序列化的方法
Redis18的Java客户端-StringRedisTemplate,序列化存在的问题,使用StringRedisTemplate解决序列化的方法
|
3天前
|
Java 网络架构 程序员
解决Java中的NoRouteToHostException异常的方法
解决Java中的NoRouteToHostException异常的方法