方法的重载(overloading)与重写(overriding)

本文详细解析了方法重写与重载的概念及其规则。重写发生在继承关系中,要求子类方法不能降低父类方法的可见度及改变其返回类型;而重载则允许在同一类中通过更改参数来定义多个同名方法,并可调整方法的可见度及返回类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法名,参数相同形成重写,重写的方法不能降低原方法的"可见度",也不能改变原方法的返回值类型。

方法名相同,参数不同(个数、类型)形成重载,重载的方法可看成一个全新的方法,与原方法相比它可以有不同的"可见度"和“返回值类型”。如下例:

class A {
 protected int method1(int a, int b) { return 0; }
}
public class B extends A{ 
 public int method1(int a, int b) { return 0; } //正确,重写父类方法,可以扩大访问权限
 //private int method1(int a, int b) { return 0; } //错误,重写父类方法,不能降低了访问权限
 //private long method1(int a, int b) { return 0; } //错误,重写父类方法,不能改变返回值类型
 public short method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
 private int method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
}

但这里 方法public short method1(int a, long b) { return 0; }和 方法private int method1(int a, long b) { return 0; }不能同时存在,因为在同一类中,不允许存在相同名字和参数类型的方法(重写的方法)。

### Java 方法重载方法重写的区别及用法 #### 1. 方法重载Overloading方法重载是指在同一个类中定义多个同名方法,但这些方法的参数列表必须不同。参数列表的不同可以体现在参数的数量、类型或顺序上[^2]。 - **参数列表要求**:方法重载的核心在于参数列表的不同。即使返回值类型不同,也不能构成方法重载[^3]。 - **访问修饰符**:方法重载对访问修饰符没有严格限制,即使修饰符不同,也可以实现重载[^2]。 - **代码示例**: ```java public class Student { // 无参数的方法 public static void study() { System.out.println("学习中..."); } // 参数为String类型的方法 public static void study(String name) { System.out.println(name + "正在学习..."); } // 参数为int类型的方法 public static void study(int age) { System.out.println("年龄为" + age + "的学生正在学习..."); } // 参数为String和int类型的方法 public static void study(String name, int age) { System.out.println(name + ", 年龄为" + age + ",正在学习..."); } } ``` #### 2. 方法重写Overriding方法重写是指子类重新定义父类中的方法,且方法名、参数列表和返回值类型必须完全一致。方法重写是实现多态的重要手段之一[^1]。 - **参数列表要求**:子类重写父类方法时,参数列表必须完全一致,否则会被视为方法重载而非重写[^3]。 - **返回值类型**:返回值类型也必须一致,或者可以是其子类型(协变返回类型)。 - **访问修饰符**:子类方法的访问修饰符不能比父类方法更严格,例如父类方法为`protected`,子类方法不能为`private`。 - **异常处理**:子类方法不能抛出比父类方法更广泛的检查型异常。 - **代码示例**: ```java class Pet { public void showInfo() { System.out.println("宠物的自白:"); } } class Dog extends Pet { @Override public void showInfo() { super.showInfo(); // 调用父类方法 System.out.println("我是狗,忠诚是我们的天性!"); } } ``` #### 3. 区别总结 | 特性 | 方法重载Overloading) | 方法重写Overriding) | |-------------------|----------------------------------------------------------------------------|------------------------------------------------------------------------------------| | 定义位置 | 同一个类内 | 子类中重写父类方法 | | 参数列表要求 | 必须不同(数量、类型或顺序) | 必须完全相同 | | 返回值类型 | 可以不同 | 必须相同或为子类型(协变返回类型) | | 访问修饰符 | 没有严格限制 | 子类方法的访问修饰符不能比父类更严格 | | 异常处理 | 不影响重载 | 子类方法不能抛出比父类方法更广泛的检查型异常 | | 多态性 | 编译时多态 | 运行时多态 | ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值