您的位置:

Override和Overload的区别

一、Override和Overload的基本概念

OverrideOverload是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则是遍布在单个类中的多个方法。它们之间的区别主要在于声明、参数列表、返回值以及静态和动态绑定这些方面。在实际编程中,应根据需要正确地使用这两个概念。