Java中方法重载和方法覆盖的区别
方法重载:
方法重载是一种编译时多态性。在方法重载中,多个方法共享同一个方法名,但在类中具有不同的签名。在方法重载中,返回类型可以相同也可以不同,但是我们必须改变参数,因为在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 | 在方法重载中,返回类型可以相同也可以不同,但只需要改变参数即可。 | 在方法覆盖中,返回类型必须相同或协变。 |