一、Override和Overload的基本概念
Override和Overload是Java语言中两个非常重要的概念,都与方法相关。Override是指子类重写父类的方法,即子类定义了与父类方法名,参数列表和返回值类型完全相同的方法,并且该方法的访问修饰符比父类中该方法的访问修饰符更宽松。Overload是指在一个类中定义多个方法,它们具有相同的方法名,但是参数列表不同。Java通过方法名和参数列表的不同来区分这些方法。
二、Override和Overload的区别
下面从几个方面详细介绍Override和Overload的区别。
1. 声明
Override表示子类重写了父类的方法,而Overload则是遍布在单个类中的多个方法。
class Parent {
public void eat() {
System.out.println("Parent is eating...");
}
}
class Child extends Parent {
@Override
public void eat() {
System.out.println("Child is eating...");
}
public void eat(String food) {
System.out.println("Child is eating " + food);
}
}
public class Test {
public static void main(String[] args) {
Parent p = new Child();
p.eat(); // 此时会调用Child类中的eat方法,而不是Parent类中的eat方法。
Child c = new Child();
c.eat("apple");
}
}
2. 参数列表
Override方法的参数列表必须与父类方法的参数列表完全相同,而Overload方法的参数列表必须不同。
class Person {
public void walk(String name) {
System.out.println(name + " is walking...");
}
}
class Fruit {
public void eat(String name) {
System.out.println(name + " is eating...");
}
}
class Apple extends Fruit {
@Override
public void eat(String name) {
System.out.println(name + " is eating an apple...");
}
public void eat(String name, int amount) {
System.out.println(name + " is eating " + amount + " apples...");
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.walk("Mike");
Apple a = new Apple();
a.eat("Tom"); // 此时会调用Apple类中的eat方法,而不是Fruit类中的eat方法。
a.eat("Jerry", 3);
}
}
3. 返回值
Override方法的返回值必须与父类方法的返回值类型相同或为其子类类型,而Overload方法的返回值类型可以是任意类型,甚至可以没有返回值。
class Animal {
public void speak() {
System.out.println("Animal is speaking...");
}
}
class Dog extends Animal {
@Override
public String speak() { // 编译会报错,因为返回值类型不匹配。
return "Dog is barking...";
}
public void speak(int times) {
for (int i = 0; i < times; i++) {
System.out.println("Dog is barking...");
}
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
a.speak(); // 此时会调用Dog类中的speak方法,而不是Animal类中的speak方法。
Dog d = new Dog();
d.speak(3);
}
}
4. 静态和动态绑定
Override方法是动态绑定的(也称为后期绑定),也就是说,在运行时,Java会根据对象的实际类型来决定调用哪个方法;而Overload方法是静态绑定的(也称为早期绑定),也就是说,在编译时,Java编译器会根据传入的参数列表决定使用哪个方法。
class Animal {
public void sound() {
System.out.println("This is an animal.");
}
}
class Dog extends Animal {
public void sound() {
System.out.println("This is a dog.");
}
public void sound(String name) {
System.out.println(name + " is barking...");
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
a.sound(); // 此时会调用Dog类中的sound方法,而不是Animal类中的sound方法。
Dog d = new Dog();
d.sound("Tom");
}
}
三、总结
Override和Overload都是Java中非常重要的方法概念。Override表示子类重写了父类的方法,而Overload则是遍布在单个类中的多个方法。它们之间的区别主要在于声明、参数列表、返回值以及静态和动态绑定这些方面。在实际编程中,应根据需要正确地使用这两个概念。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/310073.html
微信扫一扫
支付宝扫一扫