Java函数中的函数重载和覆盖
函数重载(Function Overloading)和函数覆盖(Function Overriding)都是Java中面向对象编程的核心概念。它们允许在相同的类中定义多个具有相同名称但不同参数的函数,而具体的函数调用则由编译器决定。
函数重载:
函数重载指的是定义多个函数,它们具有相同的名称但具有不同的参数列表。在进行函数调用时,编译器会根据传递的参数类型和数量来决定应该调用哪个重载版本的函数。函数重载通常用于实现相似的功能但操作类型或操作个数不同的情况。
函数重载的特点有:
1. 函数重载必须具有相同的函数名称,但参数的类型或数量必须不同。
2. 返回类型、函数的修饰符、异常抛出等与函数重载无关。
3. 编译器根据传递的参数类型和数量来选择调用哪个重载版本的函数。
4. 函数重载可以提高代码的可读性和灵活性。
以下是一个函数重载的例子:
public class OverloadExample {
public static int sum(int a, int b) {
return a + b;
}
public static double sum(double a, double b) {
return a + b;
}
public static String sum(String a, String b) {
return a + b;
}
public static void main(String[] args) {
System.out.println(sum(1, 2));
System.out.println(sum(1.5, 2.5));
System.out.println(sum("Hello", "World"));
}
}
在上面的例子中,sum函数被重载了三次,每次函数的参数类型都不同。根据传递的实参类型,编译器会选择调用相应的重载版本的函数。
函数覆盖:
函数覆盖指的是在子类中重新定义与父类中具有相同名称和参数列表的函数。子类中的覆盖函数必须具有相同的返回类型或者是其父类返回类型的子类型。在运行时,根据对象的实际类型来决定调用的函数版本。
函数覆盖的特点有:
1. 函数覆盖必须具有相同的函数名称和参数列表。
2. 函数覆盖可以重新定义父类中的虚函数。
3. 子类中的覆盖函数必须具有和父类中被覆盖函数相同的返回类型或者是其子类型。
4. 被覆盖的函数必须具有virtual、abstract或者override修饰符。
以下是一个函数覆盖的例子:
public class OverrideExample {
public static class Animal {
public void sound() {
System.out.println("Animal makes sound.");
}
}
public static class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks.");
}
}
public static class Cat extends Animal {
@Override
public void sound() {
System.out.println("Cat meows.");
}
}
public static void main(String[] args) {
Animal animal = new Animal();
animal.sound();
Animal dog = new Dog();
dog.sound();
Animal cat = new Cat();
cat.sound();
}
}
在上面的例子中,Animal类定义了一个sound函数,Dog和Cat类分别继承自Animal类并覆盖了sound函数。根据对象的实际类型,运行时会调用相应的覆盖函数。从输出结果可以看出,编译器会根据对象的实际类型来选择调用相应的覆盖版本的函数。
