Java中的函数重载与覆盖
1. 函数重载
函数重载是指在同一个类中可以定义多个同名但参数类型,个数,或顺序不同的函数。编译器根据调用时传入的实际参数类型、个数、顺序来确定调用哪一个函数,实现了根据不同参数类型和个数调用不同的函数,从而提高了代码的重用和可读性。
例如:
public class TestOverload {
public void test() {
System.out.println("No param");
}
public void test(int a) {
System.out.println("a : " + a);
}
public void test(int a, int b) {
System.out.println("a : " + a + " b : " + b);
}
public static void main(String[] args) {
TestOverload t = new TestOverload();
t.test();
t.test(10);
t.test(10, 20);
}
}
输出结果为:
No param
a : 10
a : 10 b : 20
2. 函数覆盖
函数覆盖是指子类定义一个与父类中同名、同参数类型、同返回值类型的方法,即重写父类中的方法。当调用该方法时,编译器会根据实际对象类型来确定调用哪个方法。
例如:
class Parent {
public void print() {
System.out.println("Parent print");
}
}
class Child extends Parent {
public void print() {
System.out.println("Child print");
}
}
public class TestOverride {
public static void main(String[] args) {
Parent p = new Child();
p.print();
}
}
输出结果为:
Child print
在代码中,创建了一个Parent类型的变量p并将其赋值为Child类型的实例。调用p的print方法时,会执行Child类中的print方法,而不是Parent类中的print方法。
3. 区别
函数重载和函数覆盖在Java中有两个不同的场景和语法规则:
(1)函数重载是在同一个类中定义多个同名但参数类型、个数或顺序不同的函数,而函数覆盖是在不同的类中存在父子关系的两个方法。
(2)函数重载中要注意构成重载的方法的参数类型、个数或顺序必须不同,而函数覆盖则要注意方法名称、参数类型、个数、顺序和返回值类型必须完全相同。
(3)函数重载是静态绑定,即在编译阶段确定调用哪个方法,而函数覆盖是动态绑定,即在运行阶段根据实际对象类型确定调用哪个方法。
(4)函数重载和函数覆盖的作用不同。函数重载可以实现根据不同的参数类型和个数调用不同的函数,从而提高代码的重用和可读性;而函数覆盖可以实现多态性,即同一操作作用于不同的对象,可以通过不同的方式呈现不同的行为,从而提高代码的灵活性。
4. 总结
函数重载与函数覆盖是Java中两个重要的概念,二者都是为了提高代码的复用性和可读性,但实现的方式和作用是不同的。
函数重载是在同一个类中定义多个同名但参数类型、个数或顺序不同的函数,可以根据不同的参数调用不同的函数,提高代码的复用性和可读性。
函数覆盖是子类定义一个与父类中同名、同参数类型、同返回值类型的方法,重写父类中的方法,可以实现多态性,提高代码的灵活性。
