当前位置:首页 > 行业动态 > 正文

什么是重载与重写的区别?

重载是方法名称相同,参数列表不同;重写是子类对父类方法的重新定义。

在面向对象编程(OOP)中,重载(Overloading)和重写(Overriding)是两个重要但不同的概念,尽管它们的名字相似,但它们的用途和机制完全不同,本文将详细解释这两个概念,并探讨它们之间的区别。

重载(Overloading)

定义: 重载是指在一个类中定义多个同名方法,但这些方法的参数列表不同,编译器根据方法签名(方法名和参数类型)来决定调用哪个方法。

特点:

1、方法名称相同: 所有重载的方法必须具有相同的名称。

2、参数列表不同: 每个重载方法的参数数量或类型必须有所不同。

3、返回类型可以相同也可以不同: 虽然返回类型不是决定重载的关键因素,但不同的返回类型可以增强代码的可读性。

4、与访问修饰符无关: 重载方法可以有不同的访问修饰符,例如public、private、protected。

5、发生在编译时: 重载是在编译时解析的,编译器会根据传递的参数决定调用哪个方法。

示例:

public class OverloadExample {
    // 方法重载
    public void display(int a) {
        System.out.println("Argument: " + a);
    }
    public void display(String a) {
        System.out.println("Argument: " + a);
    }
    public void display(int a, String b) {
        System.out.println("Arguments: " + a + ", " + b);
    }
}

重写(Overriding)

定义: 重写是指在子类中重新定义父类中的方法,如果子类中的方法与父类中的方法具有相同的名称、返回类型和参数列表,那么子类中的方法将覆盖父类中的方法。

特点:

1、方法名称相同: 重写的方法必须与父类中被重写的方法名称相同。

2、参数列表相同: 重写的方法必须与父类中被重写的方法具有相同的参数列表。

3、返回类型相同: 重写的方法必须与父类中被重写的方法具有相同的返回类型,或者返回类型是父类方法返回类型的子类。

4、访问修饰符不能更严格: 子类中重写的方法不能比父类中被重写的方法拥有更严格的访问修饰符,如果父类方法是public,那么子类方法也必须是public。

5、发生在运行时: 重写是在运行时解析的,程序会根据对象的实际类型来决定调用哪个方法。

示例:

class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

重载与重写的区别

特性 重载(Overloading) 重写(Overriding)
方法名称 相同 相同
参数列表 不同 相同
返回类型 可以相同也可以不同 相同或协变(返回类型是父类方法返回类型的子类)
访问修饰符 无限制 不能更严格
解析时机 编译时 运行时
使用场景 同一类中定义多个功能相似但参数不同的方法 子类重新定义父类中的方法
关键字 @Override(推荐使用)

相关问答FAQs

Q1: 为什么重载方法可以使用不同的返回类型?

A1: 在Java中,重载方法可以使用不同的返回类型,因为方法签名是由方法名和参数列表组成的,而返回类型不包括在方法签名中,即使返回类型不同,只要方法名和参数列表相同,编译器仍然认为这是同一个方法的不同重载版本。

Q2: 为什么在重写方法时不能使用比父类更严格的访问修饰符?

A2: 在Java中,子类不能降低父类方法的可见性,如果子类中使用了比父类更严格的访问修饰符,会导致子类中的方法无法被子类的使用者访问,这与多态性和继承的原则相违背,Java规定子类中重写的方法不能使用比父类更严格的访问修饰符。

各位小伙伴们,我刚刚为大家分享了有关“重载和重写的区别”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!

0