Java Overload和Override的区别

摘要:在JAVA中,方法的重写与重载出现频率很高,但是很容易混淆二者概念。本文给出简洁明快的概念论述和区别。

  在面向对象程序设计语言JAVA的应用中,方法的重写与重载出现频率很高,但是很容易混淆二者概念。本文对这些概念给出一些简洁明快的论述,并结合理论和实践,掰开了揉碎了介绍Overload和Override的区别。

  先介绍一个下文用到的重要概念方法签名。在Java中,方法签名由方法的名称参数列表返回值类型共同构成,其中,方法名称标识该方法的名称,参数列表包括参数的类型、数量和顺序。这意味着,两个方法即使有相同的名称,只要参数列表不同,它们就被视为不同的方法。从Java 8开始,方法的返回值类型也被包括在方法签名中,用以支持重载方法的区分。

重写

  重写Override表示子类中的方法可以与父类中的、某个方法的签名完全相同。通过子类创建的实例对象调用这个方法时,将调用子类中定义的方法,这是一种多态性的表现。对各位老铁来说最熟悉的重写就是在实现类中实现接口类定义的方法,在接口类中只对方法进行声明,而在不同实现类中编写相应的业务逻辑。除了这个典型用法以外,我们继承某个父类时,也可能会在子类重写父类中的方法。关于覆盖和被覆盖的方法,在重写时要注意以下几点:

  • 方法签名必须一致。
  • 返回类型可以是子类型(协变返回类型)。
  • 子类抛出的异常必须与父类一致或者是其子类。
  • 被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
  • 使用 @Override 注解强制编译器校验重写正确性。

  重写主要用于在子类中扩展或修改父类行为,实现多态性,从而定义不同特征行为。例如,不同的动物有不同的叫声,可以在子类中重写父类的方法makeSound

class Animal {
    // 父类方法
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

class Dog extends Animal {
    // 重写父类方法
    @Override
    public void makeSound() {
        System.out.println("The dog barks");
    }
}

class Cat extends Animal {
    // 重写父类方法
    @Override
    public void makeSound() {
        System.out.println("The cat meows");
    }
}

public class OverrideExample {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myAnimal.makeSound(); // 输出: The animal makes a sound
        myDog.makeSound();    // 输出: The dog barks
        myCat.makeSound();    // 输出: The cat meows
    }
}

  在设计模式中,使用重写的一个案例是模板方法模式。

重载

  overload对我们来说可能比较熟悉,可以翻译为重载,它是指定义一些方法名称相同的方法,通过定义不同类型的输入参数来区分这些方法。在调用时,JVM根据方法签名有选择地执行合适的方法。在使用重载时要注意以下几点:

  • 只能通过不同的方法签名重载。例如可以是fun(int,float),但是不能为fun(int,int))。
  • 方法的异常类型和数目不会对重载造成影响。
  • 对于继承来说,如果某一方法在父类中的访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也仅仅是定义了一个新方法,而不会达到重载的效果。

  综上所述,方法的重写和重载是Java多态性的不同表现。重写是父类与子类之间多态性的一种表现,而重载是一个类中不同方法之间多态性的一种表现。举个栗子🌰,假设有一个类Example,其中包含以下重载的方法:

public void exampleMethod() {
    // 方法体
}
 
public void exampleMethod(int a) {
    // 方法体
}
 
public void exampleMethod(int a, double b) {
    // 方法体
}
 
public int exampleMethod(String s) {
    // 方法体
}
public void display(String message) {
    System.out.println("String: " + message);
}

public void display(int number) {
    System.out.println("Integer: " + number);
}

exampleMethod():这是一个方法签名,它只考虑方法名(exampleMethod),而且没有参数。

exampleMethod(int a):这是另一个方法签名,因为它有一个名为a的整型参数。

exampleMethod(int a, double b):这是第三个方法签名,因为它有两个参数:一个名为a的整型参数和一个名为b的双精度浮点型参数。

exampleMethod(String s):这是第四个方法签名,因为它有一个名为s的字符串类型参数,并且返回类型是int。

  上述四个方法为构造方法的重载。重载时,方法名和类名可能不一样,如对函数display的重载。重载主要用于以下场景:

  1、业务逻辑相似:当多个方法执行相似的操作时,可以通过重载来提高代码的可读性和可维护性。例如,上述的exampleMethod方法用于不同类型和数量的参数进行处理。

  2、提高代码灵活性:重载允许在不改变方法名的情况下处理不同类型或数量的参数,增强了代码的扩展性和灵活性。

区别

区别类型 重载 重写
方法签名 名相同但参数列表不同 完全一致
多态类型 编译时多态(静态绑定) 运行时多态(动态绑定)
改动范围 在同一类中 发生在继承体系中,子类重写父类的方法
返回类型 可以修改但不推荐 返回类型必须相同或为其子类型
访问修饰符 访问修饰符无限制 子类方法的访问修饰符不能比父类方法更严格
异常处理 异常声明可以不同 子类方法不能声明比父类方法更严格的异常

小结

  理解和正确使用重写与重载是 Java 开发者编写优雅和高效代码的垫脚石。重载是一个类的多态性表现,通过在同一类中提供不同参数的方法,提升了代码的灵活性和可读性。重写是子类与父类的一种多态性表现,通过继承机制,允许子类根据具体业务诉求修改父类方法的行为,实现了多态性。通过本文的讲解和通俗易懂的代码示例,希望读者能够在工作中更加得心应手地使用这两个重要的面向对象编程特性,从而实现从原理到实践的跨越式提升。

posted @   楼兰胡杨  阅读(4432)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示