方法重载:
方法重载是一种编译时多态性。在方法重载中,多个方法共享同一个方法名,但在类中具有不同的签名。在方法重载中,返回类型可以相同也可以不同,但是我们必须改变参数,因为在java中,我们不能仅仅通过改变方法的返回类型来实现方法重载。
方法重载示例:
import java.io.*; class MethodOverloadingEx { static int add(int a, int b) { return a + b; } static int add(int a, int b, int c) { return a + b + c; } public static void main(String args[]) { System.out.println("add() with 2 parameters"); System.out.println(add(4, 6)); System.out.println("add() with 3 parameters"); System.out.println(add(4, 6, 7)); } }
运行结果:
add() with 2 parameters 10 add() with 3 parameters 17
方法覆盖:
方法覆盖是一种运行时多态性。在方法覆盖中,派生类提供了基类或父类已经提供的方法的具体实现。在方法覆盖中,返回类型必须相同或协变(返回类型可能与派生类的方向相同)。
方法覆盖示例:
import java.io.*; class Animal { void eat() { System.out.println("eat() method of base class"); System.out.println("eating."); } } class Dog extends Animal { void eat() { System.out.println("eat() method of derived class"); System.out.println("Dog is eating."); } } class MethodOverridingEx { public static void main(String args[]) { Dog d1 = new Dog(); Animal a1 = new Animal(); d1.eat(); a1.eat(); Animal animal = new Dog(); // eat() method of animal class is overridden by // base class eat() animal.eat(); } }
运行结果如下:
eat() method of derived class Dog is eating. eat() method of base class eating. eat() method of derived class Dog is eating.
解释:
在这里,可以看到在派生类名称 Dog 中覆盖了一个方法eat()
,而该派生类名称已经由基类名称 Animal 提供。
当我们创建类 Dog 的实例并调用eat()
方法时,我们看到只运行派生类eat()
方法而不是基类方法eat()
,而当创建类Animal 的实例并调用eat()
方法,看到只运行基类eat()
方法而不是派生类方法eat()
。
因此,很明显,在方法覆盖中,方法在运行时绑定到实例,这是由 JVM 决定的。这就是为什么它被称为运行时多态性。
Java中方法重载和方法覆盖的区别是:
编号 | 方法重载 | 方法覆盖 |
---|---|---|
1 | 方法重载发生在课堂上。 | 方法覆盖在具有继承关系的两个类中执行。 |
2 | 方法重载可能需要也可能不需要继承。 | 方法覆盖总是需要继承。 |
3 | 方法重载是一种编译时多态性。 | 方法覆盖是一种运行时多态性。 |
4 | 有助于增加程序的可读性。 | 方法覆盖用于授予其父类或超类已经提供的方法的具体实现。 |
5 | 在方法重载中,方法必须同名不同签名。 | 在方法覆盖中,方法必须具有相同的名称和相同的签名。 |
6 | 在方法重载中,返回类型可以相同也可以不同,但只需要改变参数即可。 | 在方法覆盖中,返回类型必须相同或协变。 |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/264497.html