欢迎访问宙启技术站
智能推送

Java中函数的重载和覆盖有哪些区别?

发布时间:2023-07-01 04:35:01

Java中函数的重载和覆盖都是函数的特性,用于实现多态性。它们虽然有相似之处,但也存在着一些区别。

函数的重载(Overload):

1. 重载是指在一个类中,有多个函数名相同但是参数列表不同的函数,通过参数的类型、个数或顺序不同进行区分。

2. 重载函数是在同一个类中定义的,函数名相同但参数列表不同。

3. 重载函数可以具有不同的返回类型,但是不能仅仅以返回类型作为判断依据。

4. 重载函数在编译期间会根据具体的参数列表进行静态绑定,编译器会根据函数调用时传递的参数类型来选择相应的重载函数。

函数的覆盖(Override):

1. 覆盖是指在子类中重新定义父类中存在的同名同参数的函数。

2. 覆盖函数具有相同的函数名和参数列表。

3. 覆盖函数必须具有相同的返回类型或是其子类型。

4. 覆盖函数只能发生在子类和父类之间,要求子类函数的访问权限不能低于父类的函数。

区别:

1. 相同点:重载和覆盖都是实现多态性的手段,可以根据不同参数来执行不同的方法体。

2. 不同点:

- 定义位置:重载函数在同一个类中定义,覆盖函数在子类中定义。

- 参数列表:重载函数的参数列表不同,覆盖函数的参数列表必须相同。

- 返回类型:重载函数的返回类型可以不同,覆盖函数的返回类型必须相同或是子类型。

- 绑定方式:重载函数在编译期进行静态绑定,覆盖函数在运行期进行动态绑定。

- 访问权限:重载函数可以修改访问权限,覆盖函数访问权限不能低于父类的函数。

函数重载的例子:

public class OverloadExample {
   public void display(int num) {
      System.out.println("调用了display(int)方法,参数为:" + num);
   }

   public void display(String str) {
      System.out.println("调用了display(String)方法,参数为:" + str);
   }
 
   public void display(int num, String str) {
      System.out.println("调用了display(int, String)方法,参数为:" + num + " 和 " + str);
   }
}

// 调用示例
OverloadExample example = new OverloadExample();
example.display(3);
example.display("Hello");
example.display(5, "World");

函数覆盖的例子:

public class Parent {
   public void display() {
      System.out.println("这是父类的display()方法");
   }
}

public class Child extends Parent {
   @Override
   public void display() {
      System.out.println("这是子类的display()方法");
   }
}

//调用示例
Parent parent = new Parent();
parent.display(); // 输出:这是父类的display()方法

Child child = new Child();
child.display();  // 输出:这是子类的display()方法

Parent parentChild = new Child();
parentChild.display();  // 输出:这是子类的display()方法

总结:

重载和覆盖是Java中实现多态性的两种方式,重载用于在一个类中定义多个同名函数,通过参数的类型、个数或顺序进行区分;覆盖用于在子类中重新定义父类中存在的同名同参数的函数。两者有相似之处,但也有区别,包括定义位置、参数列表、返回类型、绑定方式、访问权限等。