方法重载和方法重写的区别

本文详细解释了Java中的方法重载(同名方法的不同参数)和方法重写(子类继承后替换父类方法)的概念,以及它们的规则和示例。强调了重载提高代码灵活性,重写实现多态性在实际编程中的应用。
摘要由CSDN通过智能技术生成

方法重载和方法重写的区别

1.什么是方法重载?

方法重载(Method Overloading)是指在同一个类中,可以定义多个方法具有相同的名称,但是参数列表不同。重载的方法可以有不同的参数类型、不同的参数个数,或者参数类型的顺序不同。方法重载的目的是提高代码的灵活性和可读性。

方法重载的规则:

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

  2. 参数列表不同: 重载的方法必须具有不同的参数列表。这可以通过参数类型、参数个数,或者参数类型的顺序来实现。

  3. 返回类型可以相同也可以不同: 方法重载可以具有相同的返回类型,也可以具有不同的返回类型。返回类型不是重载的决定性因素。

  4. 访问修饰符和异常类型不影响重载: 方法重载可以具有相同或不同的访问修饰符(如 publicprivateprotected)和可以抛出相同或不同的异常。

例子:

public class OverloadExample {
​
    // 方法重载:不同参数类型
    static int add(int a, int b) {
        return a + b;
    }
​
    // 方法重载:不同参数个数
    static double add(double a, double b, double c) {
        return a + b + c;
    }
​
    // 方法重载:不同参数类型和参数个数
    static String concatenate(String str1, String str2) {
        return str1 + str2;
    }
​
    static String concatenate(String str1, String str2, String str3) {
        return str1 + str2 + str3;
    }
​
    public static void main(String[] args) {
        System.out.println(add(2, 3));                // 输出 5
        System.out.println(add(1.5, 2.5, 3.5));       // 输出 7.5
        System.out.println(concatenate("Hello, ", "World!"));          // 输出 Hello, World!
        System.out.println(concatenate("Java", " is", " awesome!"));  // 输出 Java is awesome!
    }
}

在上面的例子中,add 方法和 concatenate 方法都展示了方法重载的不同形式。通过这样的方式,我们可以根据不同的参数情况使用相同的方法名称,提高代码的可读性和灵活性。


2. 什么是方法重写

方法重写(Method Overriding)是指子类中定义了一个与父类中已有的方法签名(包括方法名称、返回类型和参数列表)相同的方法,并且具有相同的访问修饰符。通过方法重写,子类可以提供自己的实现,覆盖父类中的相应方法。

方法重写是实现多态性(Polymorphism)的一种方式,允许在运行时动态选择调用哪个方法,具体调用哪个方法取决于对象的实际类型。

方法重写的规则:

  1. 方法名称、返回类型和参数列表必须相同: 在子类中重写的方法必须与父类中的方法具有相同的名称、返回类型和参数列表。

  2. 访问修饰符不能更严格: 子类中重写的方法的访问修饰符不能比父类中的方法更严格。例如,如果父类方法是 protected,子类方法可以是 protected 或者 public,但不能是 private 或默认(不加修饰符)。

  3. 抛出的异常不能更多,不能更限制: 子类中重写的方法可以不抛出异常,或者抛出与父类相同的异常,不能抛出更多或更限制的异常。

例子:

class Animal {
    void makeSound() {
        System.out.println("Some generic sound");
    }
}
​
class Dog extends Animal {
    // 方法重写
    @Override
    void makeSound() {
        System.out.println("Bark! Bark!");
    }
}
​
class Cat extends Animal {
    // 方法重写
    @Override
    void makeSound() {
        System.out.println("Meow");
    }
}
​
public class OverrideExample {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
​
        animal1.makeSound();  // 输出 Bark! Bark!
        animal2.makeSound();  // 输出 Meow
    }
}

在上面的例子中,DogCat 类继承自 Animal 类,它们分别重写了 makeSound 方法。在 main 方法中,通过多态性,使用父类的引用指向子类的对象,实现了动态调用相应子类的重写方法。这就是方法重写的一个典型应用场景。

3.两者区别

  1. 前者是使用在同一类下,方法用意相同但是传参不同

  2. 后者是主要用于继承,改写父类方法达到子类目的

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值