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

Java函数的重载和覆盖及它们的区别

发布时间:2023-06-13 07:19:11

Java中的函数重载和覆盖是两个非常常见的概念,它们在编写Java程序时经常被用到。这篇文章将主要介绍Java函数的重载和覆盖以及它们的区别。

1.函数重载

Java中的函数重载就是指在同一个类中定义多个同名但参数不同的函数。函数重载通过参数类型、参数个数和参数顺序的不同,来实现同名函数的重载。

函数重载的好处在于可以提高代码的复用性和可读性,简化代码结构。例如,一个类中可能需要多个不同形式的构造函数,这样就可以通过函数重载来实现。

下面是一个函数重载的例子:

public class OverloadDemo {

   public void test() {

      System.out.println("无参数的test方法");

   }

   public void test(int a) {

      System.out.println("带有一个int参数的test方法");

   }

   public void test(int a, int b) {

      System.out.println("带有两个int参数的test方法");

   }

   public static void main(String[] args) {

      OverloadDemo demo = new OverloadDemo();

      demo.test();

      demo.test(1);

      demo.test(1, 2);

   }

}

输出: 

无参数的test方法

带有一个int参数的test方法

带有两个int参数的test方法

2.函数覆盖

函数覆盖是指在子类中重新定义父类中的方法。函数覆盖实现了多态性,即通过子类对象调用覆盖的方法时,将执行子类中的方法,而不是父类中的方法。

函数覆盖的规则如下:

- 方法名必须与父类中被覆盖的方法名相同。

- 参数列表必须与父类中被覆盖的方法的参数列表完全相同。

- 返回类型必须与父类中被覆盖的方法的返回类型完全相同。

- 访问权限必须比父类中被覆盖的方法的访问权限更高或者相等。

下面是一个函数覆盖的例子:

public class Animal {

   public void move() {

      System.out.println("动物可以移动");

   }

}

public class Dog extends Animal {

   public void move() {

      super.move(); // 调用父类的方法

      System.out.println("狗可以跑和走");

   }

}

public class TestDog {

   public static void main(String args[]) {

      Animal a = new Animal(); // Animal 对象

      Animal b = new Dog(); // Dog 对象

      a.move(); // 执行 Animal 类的方法

      b.move(); // 执行 Dog 类的方法

   }

}

输出: 

动物可以移动

动物可以移动

狗可以跑和走

3.函数重载和覆盖的区别

函数重载和覆盖都是Java中的多态性的体现,但它们之间有很大的不同点。

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

- 返回值:函数重载的返回值可以不同,而函数覆盖的返回值必须相同。

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

- 运行时分配:函数重载在编译时进行,而函数覆盖在运行时进行。

总的来说,函数重载和覆盖在Java编程中都比较常见,它们的区别需要我们注意和掌握。在实际编程过程中,我们可以灵活运用这两种机制,以提高代码的可读性和效率。