Java函数的重载和覆盖:区别和使用注意事项
Java中函数(Method)的重载和覆盖是常见的语言特性,在编写程序时经常会用到。它们都是方法多态性的体现,但是它们的区别和使用上的注意事项也是需要认真理解和掌握的。
函数的重载(Overload)
函数的重载是指在同一个类中定义了两个或者多个方法,它们的方法名相同但是参数的个数、类型、顺序不同。重载的参数列表必须不同于其它的同名方法。
重载函数的特点:
1.函数名相同,但是参数列表必须不同(个数、类型、顺序)
2.返回值类型可以相同也可以不同。
3.重载函数可以定义在同一个类中也可以定义在不同的类中。
4.调用时根据传入参数的不同自动匹配不同的方法。
如下面的例子:
public class FunctionOverload {
public static void main(String[] args) {
System.out.println(add(1,2));
System.out.println(add(10,20,30));
System.out.println(add(2.5,3.6));
}
public static int add(int a, int b) {
return a + b;
}
public static int add(int a, int b, int c) {
return a + b + c;
}
public static double add(double a, double b) {
return a + b;
}
}
上述代码中,定义了三个名字相同的 add() 方法,分别用于处理不同类型的参数。在执行时,根据参数类型的不同自动匹配相应的方法进行调用。
函数的覆盖(Override)
函数的覆盖是指在继承关系中,子类重写了父类已经实现的方法。
覆盖函数的特点:
1.子类中定义一个和父类中已经存在的同名、同参数的方法。
2.返回值类型、方法名、参数列表必须相同。
3.被覆盖的方法在父类中必须是公有的。
4.覆盖方法不能抛出比父类方法更多的异常。
如下面的例子:
class Animal {
public void eat(){
System.out.println("Animal is eating.");
}
}
class Lion extends Animal{
public void eat(){
System.out.println("Lion is eating.");
}
}
public class FunctionOverride {
public static void main(String[] args) {
Animal animal = new Lion();
animal.eat();
}
}
在上述代码中,子类 Lion 继承了父类 Animal 的 eat() 方法,并重写了该方法。使用父类类型声明 Lion 对象并调用 eat() 方法时,会执行子类 Lion 重写的 eat() 方法,输出结果为“Lion is eating.”。
重载和覆盖的区别
重载和覆盖都涉及到函数的多态性。但是它们的区别也是需要我们认真理解和掌握的。
1.方法的重载是在同一个类中定义,方法的覆盖是子类中重写父类中已经存在的方法。
2.方法的重载是针对参数列表的不同而重载,方法的覆盖是针对方法名和参数列表的相同而重写。
3.方法的重载可以发生在同一个类中或者不同的类中,方法的覆盖只能发生在继承关系的子类中。
4.方法的重载的返回值类型可以相同也可以不同,方法的覆盖必须保持返回值类型的一致。
使用注意事项
在使用函数的重载和覆盖时需要注意以下几点:
1.避免对已经重写的方法再次进行重载。
2.覆盖方法时要注意子类方法的访问权限不能低于父类方法的访问权限。
3.覆盖方法时,一定要保证方法名、参数列表、返回类型完全一致,否则不能覆盖成功。
4.重载方法时要注意参数列表的要求,否则会编译错误。
5.函数的重载和覆盖只能根据参数类型的不同、方法名和参数列表相同来区分,不能根据返回值的不同来区分。
