Java中的函数重载和函数覆盖的区别和联系
函数重载(Overloading)和函数覆盖(Overriding)是Java中两个基本的概念。两者的共同点是都涉及到方法名、参数、返回值等基本要素,都是为了实现方法的多态性,但是两者还是有不同之处。
函数重载(Overloading)
所谓函数重载就是指在同一个类中,存在两个或两个以上的方法,它们在良好的编程习惯下具有相同的方法名,但是不同的参数类型和参数个数,返回值可以相同也可以不同。在Java中,使用函数重载可以让我们在不改变原有方法的前提下,为其增加新的参数类型和参数个数。比如:
public void print(){...}
public void print(int x){...}
public void print(String str){...}
在上面的例子中,由于三个方法分别传递的参数的类型和个数都不同,因此这三个方法是有效的重载方法。如何调用哪一种方法,则是由传递参数的个数和数据类型来决定的。Java编译器会根据传递给方法的参数类型和数量,选择最合适的重载方法。
函数覆盖(Overriding)
Java中函数覆盖(Overriding)是指子类根据从父类继承下来的方法描述,对方法进行重新实现并对原有方法的实现进行覆盖。函数覆盖必须满足以下三个条件:
1.子类中覆盖方法的名字、返回值和参数类型必须与父类中被覆盖的方法名称,返回值和参数类型完全相同。
2.访问修饰符的范围不能小于父类中被覆盖方法的访问修饰符。
3.异常的规范约束。子类覆盖方法所抛出的异常类型要小于等于父类被覆盖方法所抛出的异常类型。
例子:
class Animal{
public void run() {
System.out.println("Animal Run");
}
}
class Dog extends Animal{
@Override
public void run() {
System.out.println("Dog Run");
}
}
在这个例子中,当Dog类继承了Animal类时,它覆盖了Animal类中的run()方法,它的名字、返回值和参数类型与父类中的run()方法完全相同,因此符合覆盖的规定。
区别比较:
函数重载(Function Overloading):
1.函数重载存在于同一类中。
2.函数重载的方法名相同,参数类型或参数个数不同。
3.函数重载返回值可以相同也可以不同。
4.函数重载需要区分各个参数及各参数顺序。
函数覆盖(Function Overriding):
1.函数覆盖是子类对父类的继承,是一个面向对象的概念。
2.函数覆盖的方法名、参数类型和参数个数等完全相同。
3.函数覆盖返回值类型必须与被覆盖方法的返回类型一致或者为其子类。
4.可以用super关键字调用父类的方法。
结论:
总体来说,函数重载是在同一类中扩展方法的机制,而函数覆盖是在子类中继承方法并改变其行为的机制。两者都是为了实现Java中的多态性特性,使得程序编写更加灵活。但是,需要强调的是,不要随意滥用函数重载和函数覆盖这两种特性,因为过多的函数重载和覆盖有可能会降低程序的可读性和健壮性。
