方法的重载和重写有什么区别

发布于:2024-09-17 ⋅ 阅读:(141) ⋅ 点赞:(0)

1.是什么

        在Java中,方法的重载(Overloading)和重写(Overriding)是两个不同的概念,它们用于实现不同的目的和功能。以下是方法重载和方法重写的区别:


方法重载(Overloading)

        方法重载是指在同一个类中定义多个方法,这些方法具有相同的名字但参数列表不同。重载方法允许程序调用具有不同参数列表的方法,从而实现相同操作的不同方式。

特点:

  1. 方法名相同:所有重载方法必须具有相同的名字。
  2. 参数列表不同:每个重载方法必须有不同的参数列表,这意味着参数的类型、数量或顺序必须不同。
  3. 返回类型可以相同也可以不同:重载方法可以有相同的返回类型,也可以有不同的返回类型。
  4. 方法可以有默认参数:Java 8及以后版本允许方法有默认参数,但即使有默认参数,只要参数列表不同,方法仍然是重载的。
  5. 作用域可以不同:重载方法可以有不同作用域,如publicprivateprotected等。

示例:

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public String add(String a, String b) {
        return a + b;
    }
}

        在这个例子中,Calculator类定义了三个add方法,每个方法都有不同的参数列表。


方法重写(Overriding)

        方法重写是指子类提供与父类方法具有相同名字和参数列表的方法。重写方法允许子类提供与父类相同操作的不同实现。

特点:

  1. 方法名相同:所有重写方法必须具有相同的名字。
  2. 参数列表相同:重写方法的参数列表必须与父类方法完全相同。
  3. 返回类型可以不同:重写方法的返回类型必须与父类方法的返回类型相同,或者可以更具体(如父类是int,子类可以是Integer)。
  4. 访问权限可以不同:重写方法可以有更高的访问权限(如父类是protected,子类可以是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");
    }
}

        在这个例子中,Dog类重写了Animal类的makeSound方法,提供了不同的实现。


总结:

区别点 重载(Overloading) 重写(Overriding)
发生位置 同一个类中 父类与子类之间
参数列表 必须不同(参数个数、类型或顺序不同) 必须相同
返回类型 可以相同,也可以不同 必须相同(Java 5 之后,允许返回类型是协变类型)
方法名 相同 相同
修饰符 无限制 访问修饰符不能比父类的更严格
多态性 编译时多态性 运行时多态性
与继承的关系 与继承无关 与继承相关,子类重写父类的方法
目的 提供同一个方法名的多个实现,以处理不同类型或数量的参数 子类定制父类方法的行为

典型应用场景

  • 重载(Overloading)

    • 重载通常用于同一个类中提供多种方式的功能。例如,println() 方法有多个重载版本,接受不同的参数类型(如 intdoubleString 等)。
  • 重写(Overriding)

    • 重写用于子类根据自身的需求来定制化父类的行为。例如,toString() 方法通常会在子类中重写,以提供类的自定义字符串表示形式。

          好啦,今天的干货就到这啦~    有什么疑问的小伙伴欢迎到评论区留言!


猜你感兴趣的方面:
#自动类型转换有哪些细节???
#JVM、JRE、JDK之间的关系
#面向对象和面向过程有什么区别
#彻底区分:基本数据类型、引用数据类型和包装类型
#成员变量、局部变量和静态变量的区别
#彻底弄清:原码、反码、补码
#值传递和引用传递的区别
#按位与(&)、按位或(|)、按位异或(^)、按位取反(~)
#面向对象的三大特征
#说一说你对多态的理解