欢迎访问宙启技术站
智能推送

Java函数的重载与重写区别解析

发布时间:2023-05-23 06:33:05

Java中的函数重载(Overloading)和函数重写(Overriding)是程序设计中常用的两个概念。虽然两者名字很相似,但却有着不同的含义和用法。

函数重载

函数重载指的是在同一个类中定义方法名相同,但参数列表不同的方法。这些参数可以是不同的参数类型,也可以是不同个数的参数。在Java中,编译器会根据函数参数类型及个数的不同,来自动判断应该调用哪个函数。

函数重载的优点在于它可以让程序员定义一组具有相似功能但又有不同输入数据的函数方法。这样可以让代码更具有可重用性和可读性。

如下面的例子中,定义了三个重载函数,分别接收一个整型参数,一个字符串类型参数和一个浮点型参数。

public class Overloading {
    public void calculate(int x) {
        System.out.println("Square of x is: " + x*x);
    }
 
    public void calculate(String s) {
        System.out.println("Length of the string is: " + s.length());
    }
 
    public void calculate(float x) {
        System.out.println("Round of float x is: " + Math.round(x));
    }
}

在调用时,Java会根据传入的参数类型,自动匹配对应的函数类型:

Overloading overloading = new Overloading();
overloading.calculate(3); //输出Square of x is: 9
overloading.calculate("Hello, world"); //输出Length of the string is: 13
overloading.calculate(3.14159f); //输出Round of float x is: 3

函数重写

函数重写指的是在子类中定义一个与父类具有相同名称,参数列表和返回类型的方法,这种方法在子类中被称为覆盖方法(Overriding Method),覆盖方法可以修改父类方法的实现细节。

Java中的函数重写必须遵守以下的规则:

- 子类覆盖父类方法时,方法名和参数列表必须与父类相同。

- 子类覆盖父类方法时,访问修饰符不能低于父类中方法的访问修饰符。

- 子类覆盖父类方法时,不能抛出新的检查型异常,也不能抛出比父类方法范围更大的异常。

- 子类覆盖父类方法时,返回类型必须是父类方法返回类型或者是其子类类型。

例如,以下是一个父类Animal和其子类Dog的示例:

class Animal {
    public void speak() {
        System.out.println("I am an animal.");
    }
}
class Dog extends Animal {
    public void speak() {
        System.out.println("I am a dog.");
    }
}

子类Dog继承了父类Animal的speak()方法,并对其进行了覆盖。当调用Dog类的speak()方法时,将输出"I am a dog."。

总结

重载和重写都是Java面向对象编程中的两个重要概念,重载(Overloading)指的是定义多个同名函数,但函数参数不同,以便根据不同参数类型或数量调用不同的函数;重写(Overriding)指在子类中定义与父类方法同名、参数相同、返回类型相同的方法,以便重写部分或全部父类方法的实现。在实际编程中,重载和重写都是为了实现更好的代码复用和封装。