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

Java函数的重载与覆盖(Overloading&Overriding)

发布时间:2023-06-19 05:38:53

Java的函数重载(Overloading)和函数覆盖(Overriding)是两种Java函数的重要特性。

1. 函数重载

函数重载指的是在同一个类内定义多个函数,它们具有相同的名称但是参数类型、个数或顺序不同,编译器会根据函数参数的类型、个数以及顺序,自动匹配应该调用哪个函数。

例如下面的代码:

public class Add {
    public static int add(int a, int b) {
        return a + b;
    }

    public static double add(double a, double b) {
        return a + b;
    }

    public static void main(String[] args) {
        int x = Add.add(1, 2);
        double y = Add.add(1.0, 2.0);
        System.out.println("x=" + x);
        System.out.println("y=" + y);
    }
}

在这个例子中,定义了两个同名函数add,但是参数类型不同。 个函数接受两个整型参数,第二个函数接受两个double类型参数。在main函数中,分别调用了这两个函数,并输出它们的返回值。由于传入的参数类型不同,编译器会自动选择适合的函数来执行相应的操作。

函数重载需要注意以下几点:

- 函数返回值类型不能区分函数重载,只有参数类型、个数或顺序才能进行区分。

- 可以对一个函数的参数个数进行任意增减,只要与现已有的函数签名不相同即可。

- 重载函数可以具有不同的访问修饰符。

- 重载函数不能仅仅有返回值类型不同。

2. 函数覆盖

函数覆盖是指在父类中定义一个函数,在子类中重新定义同名同参数列表的函数,这个过程也称为函数重写。因为子类中的同名函数会覆盖掉父类中的函数。

以下是一个例子:

public class Animal {
    public void move() {
        System.out.println("动物可以移动");
    }
}

public class Dog extends Animal {
    public void move() {
        System.out.println("狗可以跑和走");
    }

    public static void main(String[] args) {
        Animal a = new Animal();
        Animal b = new Dog();
        a.move();
        b.move();
    }
}

在这个例子中,定义了一个Animal类,其中包含一个move函数,输出“动物可以移动”。然后定义了一个Dog类,它继承自Animal类,并重新定义了move函数,输出“狗可以跑和走”。在main函数中,定义了一个Animal类型的变量a和一个Dog类型的变量b,分别调用它们的move函数。由于变量b是Dog类型,因此会调用Dog类中的move函数,输出“狗可以跑和走”。

函数覆盖需要注意以下几点:

- 要覆盖父类中的函数,子类定义的函数必须与父类中的函数具有相同的名称、参数列表和返回类型。

- 子类函数的访问修饰符不能比父类函数的访问修饰符更严格。例如,父类函数是public,则子类函数也必须是public,不能是private或protected。

- 子类函数不能抛出比父类函数声明的更多的异常。

- 当调用一个覆盖函数时,虚拟机会根据该对象的实际类型来判断具体调用哪个函数,而不是根据变量的类型来选择。