Java函数重载和覆盖的不同之处
Java中的函数重载和覆盖是面向对象编程中常用的特性,它们的作用都是在不同情况下提供不同的方法。
一、函数重载
函数重载是指在同一个类中,可以定义两个或两个以上具有相同名称但参数列表不同的方法。被调用时,传入的参数类型和数量将决定具体调用哪个函数。函数重载的目的在于优化代码,增加代码的灵活性。
函数重载要求:
1. 必须在同一个类中。
2. 函数名相同,参数类型和数量不同。
3. 返回值类型可以相同也可以不同。
例:在一个计算器类中,实现重载的加、减、乘、除四个方法
public class Calculator{
public int add(int a, int b){
return a + b;
}
public double add(double a, double b){
return a + b;
}
public int subtract(int a, int b){
return a - b;
}
public double subtract(double a, double b){
return a - b;
}
public int multiply(int a, int b){
return a * b;
}
public double multiply(double a, double b){
return a * b;
}
public int divide(int a, int b){
return a / b;
}
public double divide(double a, double b){
return a / b;
}
}
二、函数覆盖
函数覆盖是指子类重写父类的方法,方法名和参数都必须相同。在子类中实现的方法会覆盖父类中同名的方法,这种覆盖方式也被称为“方法重写”。
函数覆盖的要求:
1. 必须存在继承关系。
2. 函数名、参数顺序和类型必须与被覆盖方法相同。
3. 子类覆盖的函数的访问级别不能低于被覆盖方法的访问级别。
4. 返回值类型可以相同也可以不同,但必须满足子类返回值类型兼容于父类返回值类型的原则。
例:定义一个动物类Animal,然后定义一个子类Bird,实现一个重写的方法fly()
public class Animal{
public void move(){
System.out.println("动物在移动");
}
}
public class Bird extends Animal{
@Override
public void move(){
System.out.println("鸟儿在飞翔");
}
public void fly(){
System.out.println("鸟儿在飞行");
}
}
Animal animal = new Animal();
animal.move();//动物在移动
Bird bird = new Bird();
bird.move();//鸟儿在飞翔
bird.fly();//鸟儿在飞行
三、函数重载和覆盖的不同之处
函数重载和覆盖都是实现多态性的方式,但是它们之间也有一些明显的不同点。
1. 继承关系
函数重载不需要继承关系,而函数覆盖必须先有继承关系。
2. 方法名、参数列表
函数重载的方法名必须相同,但参数列表必须不同。函数覆盖的方法名和参数列表必须相同。
3. 返回类型
函数重载的返回类型可以相同也可以不同,函数覆盖的返回类型必须相同或是子类返回类型兼容于父类返回类型。
4. 访问控制
函数重载的访问控制没有限制,子类覆盖的方法的访问控制不能低于被覆盖方法。
综上所述,函数重载和覆盖是Java面向对象编程中常用的特性。两种功能都是Java实现多态性的方式,但是它们具有不同的使用场景和要求。需要根据具体的情况进行选择,合理利用它们可以使我们的代码更加灵活、高效,提高开发效率。
