云计算百科
云计算领域专业知识百科平台

Java中,重写与重载有什么区别(详解)

定义:子类对父类中已有的方法进行重新实现,保持方法名、参数列表和返回值类型完全一致,以适应子类自身的业务逻辑。

核心特点:

  • 发生位置:存在继承关系的父类与子类之间

  • 方法签名:方法名、参数列表(类型、顺序、数量)必须完全相同

  • 返回值类型:

  • 基本类型:必须与父类完全一致

  • 引用类型:允许是父类返回值类型的子类(协变返回类型,Java 5 + 支持)

  • 访问修饰符:子类重写方法的访问权限不能比父类更严格(如父类是public,子类不能是protected)

  • 异常处理:子类抛出的异常不能比父类更宽泛(可以是相同或更小范围的异常)

  • 关键字:常与@Override注解配合使用(非必需,但推荐,用于编译时检查)

示例:

java

class Animal {
public void makeSound() {
System.out.println("动物发出声音");
}
}

class Dog extends Animal {
// 重写父类方法
@Override
public void makeSound() {
System.out.println("狗叫:汪汪汪");
}
}

作用:实现运行时多态(动态绑定),即程序运行时根据对象的实际类型调用对应的方法。

2. 重载(Overload)

定义:在同一个类中,允许存在多个同名方法,但它们的参数列表(类型、顺序、数量)不同。

核心特点:

  • 发生位置:同一个类中(或父类与子类中,但不推荐)
  • 方法签名:方法名相同,但参数列表必须不同(参数类型、顺序、数量至少有一个不同)
  • 返回值类型:可以相同也可以不同(仅返回值不同不能构成重载)
  • 访问修饰符:无限制
  • 异常处理:抛出的异常可以不同
  • 关键字:无特殊关键字

示例:

java

class Calculator {
// 重载1:两个int相加
public int add(int a, int b) {
return a + b;
}

// 重载2:三个int相加(参数数量不同)
public int add(int a, int b, int c) {
return a + b + c;
}

// 重载3:两个double相加(参数类型不同)
public double add(double a, double b) {
return a + b;
}

// 重载4:int和double相加(参数顺序隐含类型不同)
public double add(int a, double b) {
return a + b;
}
}

作用:实现编译时多态(静态绑定),即编译时根据方法参数决定调用哪个版本的方法,提高代码灵活性。

3. 核心区别对比

维度重写(Override)重载(Overload)
发生范围 父类与子类之间 同一个类中
方法名 必须相同 必须相同
参数列表 必须相同 必须不同(类型 / 顺序 / 数量)
返回值类型 基本类型相同;引用类型可协变 可相同或不同
访问修饰符 子类权限 ≥ 父类权限 无限制
多态类型 运行时多态(动态绑定) 编译时多态(静态绑定)
异常处理 子类异常 ≤ 父类异常范围 无限制
与继承的关系 依赖继承 不依赖继承

4. 常见误区

  • 认为 “返回值不同即可构成重载”:错误,重载的判定仅看参数列表,与返回值无关。
  • 认为 “子类与父类的同名方法一定是重写”:若参数列表不同,则是子类对父类的 “隐藏”(hide),而非重写。
  • 混淆访问修饰符规则:重写时子类权限不能更严格(如父类protected,子类不能是private),而重载无此限制。

通过理解两者的应用场景和规则,可以更清晰地在 Java 中设计灵活且易维护的代码结构。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Java中,重写与重载有什么区别(详解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!