Java中的重载和覆盖函数有什么区别?
Java中的重载和覆盖函数都是函数的概念,但它们有着不同的特点和用途。
重载函数
重载函数是指在同一个类中,函数名称相同但形参列表不同的函数。在调用时,根据函数的不同形参列表来决定调用哪个函数。重载函数的形参列表可以有不同的数目、不同的类型及不同的顺序,但不包括返回值类型和访问修饰符。
例如:
public class Demo {
public void print(int i) { System.out.println(i); }
public void print(double d) { System.out.println(d); }
public void print(String str) { System.out.println(str); }
}
这个类中有3个名为print的方法,它们的形参列表不同,分别接收一个整数、一个浮点数和一个字符串类型的参数。在调用时,根据传入的参数类型和数量的不同,编译器就会自动选择正确的print方法。
重载函数的主要作用是增强函数的灵活性和可复用性,方便我们根据需要编写不同的函数。
覆盖函数
覆盖函数是指子类重写(Override)父类的某个函数。它可以改变函数的实现方式,但必须保证函数名、形参列表和返回值类型与父类中被重写的函数一致,且子类中的函数的访问修饰符不低于父类中的对应函数。
在调用一个覆盖函数时,先根据引用变量的类型来判断调用的是父类中的函数还是子类中的函数,在确定是子类中的函数后,再根据传入的参数类型来调用正确的函数体。
例如:
public class Animal {
public void eat() { System.out.println("Animal is eating."); }
}
public class Dog extends Animal {
public void eat() { System.out.println("Dog is eating."); }
}
在这个例子中,Dog类继承了Animal类中的eat函数,并重写了它的实现。如果我们使用一个Animal的引用变量,那么调用的是Animal类中的eat函数;如果我们使用一个Dog的引用变量,则调用的是Dog类中的eat函数。
覆盖函数的主要作用是实现多态性,允许父类引用变量可以指向子类对象,并调用子类中定义的函数,从而实现更加灵活的编程。
总结
重载函数和覆盖函数都是函数的概念,但它们之间有些区别。重载函数是在同一个类中,函数名称相同但形参列表不同的函数,重载函数的主要作用是增强函数的灵活性和可复用性;而覆盖函数则是子类重写父类的某个函数,覆盖函数的主要作用是实现多态性。在调用时,编译器会根据不同的规则来选择正确的函数,实现函数的自动选择。
