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

Java函数的重载和重写的区别

发布时间:2023-06-11 14:21:26

Java中的函数重载和函数重写是两种常用的面向对象编程技术。它们都可以起到增强代码的复用性以及提高程序的可读性和可维护性的作用,但是二者的区别也是十分重要的。下面我们将详细地讲解Java函数的重载和重写的区别。

一、函数重载

Java中的函数重载,指的是有多个同名函数(或方法),但是这些同名函数具有不同的参数列表或者参数类型。在调用这些同名函数时,Java会根据传入的参数的类型和数量来自动选择调用哪个函数。函数重载与函数的返回值类型、访问修饰符无关,只与函数的形参列表有关。

Java中函数重载的作用主要有以下几个方面:

1. 美化程序代码。函数重载可以使函数名变得简洁明了,易于记忆和调用。

2. 提高代码的复用性。函数重载可以将同一个功能的操作放在不同的函数中进行实现,用户可以根据自己的需求选择合适的函数进行调用。

3. 减少开发难度。函数重载可以省去开发者重复编写代码的麻烦,从而加快开发速度。

4. 避免函数功能名称的重用。函数重载可以为不同参数列表的方法提供唯一的名称,避免函数名称的重用。

下面是函数重载的例子:

class FunctionOverload {
    public void sum(int a, int b) {
        System.out.println("两个整数的和是:" + (a + b));
    }

    public void sum(double a, double b) {
        System.out.println("两个小数的和是:" + (a + b));
    }

    public void sum(String a, String b) {
        System.out.println("两个字符串的和是:" + a + b);
    }
}

public class FunctionOverloadTest {
    public static void main(String[] args) {
        FunctionOverload function = new FunctionOverload();
        function.sum(3, 5);
        function.sum(1.1, 2.2);
        function.sum("Hello", "World!");
    }
}

二、函数重写

Java中的函数重写,指的是子类中的函数与父类中的函数同名、参数列表相同,但是函数体不同的一种操作。重写函数可以在不破坏父类原有功能和结构的前提下为其添加新的功能,可以使子类更好地适应业务需要。Java中,重写函数也称为覆盖函数,因为子类中的同名函数会“覆盖”父类中的同名函数。

Java中函数重写的使用如下:

1. 子类必须使用和父类相同的方法名称。

2. 子类必须使用和父类相同的参数列表。这包括参数数量、参数类型和参数顺序。

3. 子类的方法访问修饰符的范围不能小于父类方法的访问修饰符范围。如果父类方法是公共的(public),那么子类方法可以改为更广泛的(protected、public);如果父类方法是保护的(protected),那么子类方法可以改为更广泛的(protected或public),但不能改为私有的(private)。

4. 子类方法重写时,子类方法不能抛出比父类方法构成更多的异常。

下面是Java函数重写的例子:

public class Vehicle {
    protected void run() {
        System.out.println("交通工具可以行驶");
    }
}

public class Bike extends Vehicle {
    @Override
    public void run() {
        System.out.println("自行车可以行驶");
    }
}

public class Car extends Vehicle {
    @Override
    public void run() {
        System.out.println("汽车可以行驶");
    }
}

public class Test {
    public static void main(String[] args) {
        Vehicle v1 = new Bike();
        Vehicle v2 = new Car();
        v1.run();
        v2.run();
    }
}

本例中,Vehicle为父类,Bike和Car为Vehicle的子类,它们都重写了Vehicle类中的run()方法。在Test类中,分别实例化Bike和Car对象,并将它们赋值给Vehicle类型的引用变量。调用v1.run()和v2.run()方法时,Java会根据引用变量所指向的实际对象的类型来决定调用哪一个run()方法。因为v1指向的是Bike对象,因此调用的是Bike中重写的run()方法;而v2指向的是Car对象,因此调用的是Car中重写的run()方法。

三、重载和重写的区别

1. 定义不同。函数重载是在一个类中定义多个同名函数,它们的参数列表不同;函数重写是在子类中定义与父类相同名称、相同参数列表的函数。

2. 所属类不同。函数重载是在同一个类中定义多个同名函数;函数重写是在子类中重写继承自父类的同名函数。

3. 运行机制不同。函数重载是多态中的编译时绑定;函数重写是多态中的运行时绑定。

4. 执行效果不同。函数重载是让方法名称更简洁明了,可读性更强,增加代码的复用性,提高了程序的可读性和可维护性;函数重写是为子类提供更好地适应业务需要的功能,扩展了父类中的功能。

总之,Java函数的重载和重写都是非常重要的面向对象编程技术,它们都可以提高代码的复用性和可读性,使程序开发更加高效。但是,二者在定义、所属类、运行机制、执行效果等方面有所不同,需要特别注意区分。在实际的编程过程中,需要根据具体的业务场景来选择合适的方式来完成代码编写。