Java函数的重载与覆盖(Overloading&Overriding)
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。
- 子类函数不能抛出比父类函数声明的更多的异常。
- 当调用一个覆盖函数时,虚拟机会根据该对象的实际类型来判断具体调用哪个函数,而不是根据变量的类型来选择。
