Java中函数重载和函数覆盖有什么区别?
函数重载(Function Overloading)和函数覆盖(Function Overriding)是Java中常见的两种方法,它们都是实现多态性的方式。
函数重载
Java中函数重载指的是在同一个类中定义多个函数,它们拥有相同的函数名,但是它们的参数个数、参数类型或参数顺序不同。如下示例代码所示:
public class Test {
public int add(int a, int b){
return a + b;
}
public int add(int a, int b, int c){
return a + b + c;
}
public double add(double a, double b){
return a + b;
}
public static void main(String[] args){
Test test = new Test();
System.out.println(test.add(1, 2));
System.out.println(test.add(1, 2, 3));
System.out.println(test.add(1.0, 2.0));
}
}
在这个例子中,我们定义了三个名为add的函数。Java编译器通过检查函数传递给它们的参数来决定应该调用哪个函数。这就是函数重载的概念。由于函数重载在编译时就已经确定了函数调用,因此它也被称为静态多态性。
函数覆盖
Java中的函数覆盖是指派生类中定义了与基类中已有的同名、同参数列表和同返回类型的函数,就会覆盖基类中的函数。如下示例代码所示:
class Animal {
public void move(){
System.out.println("动物能够移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
public class TestDog{
public static void main(String args[]){
Animal a = new Animal();
Animal b = new Dog();
a.move();
b.move();
}
}
在这个例子中,我们定义了两个类:Animal和Dog。Animal类中包含一个名为move的方法,Dog类就是继承了Animal类,并且对父类的move方法进行了覆盖。在main方法中,我们创建了一个Animal类型的对象a和一个Dog类型的对象b,然后分别调用了它们的move方法。
在这个例子中,我们可以看到当调用a对象的move方法时,它输出的是“动物能够移动”;而当调用b对象的move方法时,它输出的是“狗可以跑和走”。这是因为在Java中,函数调用是根据引用的实际类型(而不是引用变量的类型)进行的。由于b是一个Dog类型的引用,所以在调用b.move()时,Java运行时系统调用的是Dog类中的move方法,而不是Animal类中的move方法。
函数重载和函数覆盖的区别
函数重载和函数覆盖都是实现多态性的方式,但它们之间有以下区别:
1.参数列表
重载函数的参数列表必须不同,而覆盖函数的参数列表必须相同。
2.返回值
重载函数的返回值可以不同,而覆盖函数的返回值必须相同,或者是一个子类。
3.调用时机
重载函数在编译时就已经确定了函数调用,而覆盖函数在运行时确定函数调用。
4.作用域
重载函数是在同一个类中定义的多个函数,而覆盖函数是在一个基类和它的派生类中定义的。
