方法的重载与重写

本文详细解析了Java中的方法重载(Overloading)与方法重写(Overriding)的区别与联系。介绍了如何通过参数列表的不同实现方法重载,并强调了方法重写时需保持方法名、参数列表及返回类型的相同。

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

java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况,方法重写是说子类重新定义了父类的方法。方法重写必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

重载(Overloading)

(1)方法重载是让类以统一的方法处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数(类型)。重载Override是一个类中多态性的一种表现。

(2)java的方法重载,就是在类中可以创建多个方法,他们具有相同的名字,但具有不同参数和不同的定义。调用方法时通过传递给他们不同的参数个数和参数类型来决定具体使用那个方法,这就是多态性。

(3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不同。无法以返回类型来作为重载函数的区分标准。

重写(Overriding)

(1)父类与子类的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。在java中,子类可继承父类的方法,则不需要重新编写相同的方法。但有时子类并不想原封不动继承父类的方法,而是想做一定的修改,这就采用方法重写。方法重写又称方法覆盖。

(2)若子类中的方法与父类的中的某一方法具有相同的方法名、返回类型和参数表,则新方法覆盖原有的方法。如需要父类的原有方法,可以使用super关键字,该关键字引用房钱类的父类。

(3)子类函数访问权限大于父类。

测试代码: 
class A { 
protected void fun(int a, int b)  {} 
protected void fun1(int a, int b) {} 


public class B extends A{ 
//Override 
//public void fun(int a, int b) {} //正确,重写父类方法,可以扩大访问权限 
//protected void fun(int a, int c) {} //错误,仅改变形参名不视为重写 
//protected String fun(int a, int b) {} //错误,重写父类方法,不能改变返回值类型 
//private void fun(int a, int b) {} //错误,重写父类方法,不能降低访问权限 

//Overload 
//protected void fun1(int a, long c) {} //正确,重载父类方法,需改变参数类型 
protected void fun1(int a, int b,long c) {} //正确,重载父类方法,可以改变参数列表 
public String fun1(int a, long b) {return null;} //正确,修改参数列表后,可以改变访问类型和返回值 


### Java 方法重载方法重写的主要区别 #### 参数列表的同处理方式 对于方法重载而言,在同一个中可以存在多个同名但参数列表同的方法。这些差异可以通过改变参数的数量、型或顺序来体现[^3]。 而对于方法重写,则严格要求子中的方法签名(包括名称、参数列表以及返回值型)要中的相应方法保持一致,只有这样才能真正意义上构成覆盖关系而是形成新的重载版本[^4]。 #### 访问控制符的要求同 当涉及到继承时,如果一个子打算重写来自其超方法,那么该子定义下的新实现允许设置更严格的访问级别。例如,假设父有一个`public`级别的成员函数A(), 那么任何试图在派生自它的子别里通过降低此函数可见度至protected甚至更低的做法都是非法的; 反之则允许增加可访问性程度[^2]。 相反地,由于方法重载发生在同一层次结构内部而涉及跨代际间的关系传递问题,因此并存在似的约束条件施加于上边所提到的那种场景之上。 #### 返回型的匹配规则有所差别 按照Java语言的规定,为了确保能够成功执行动态绑定操作从而达到预期效果即运行期调用最合适的那个具体实例所提供的服务接口而非仅仅局限于编译阶段静态决定的结果,所以被覆写后的目标实体应该维持原有的输出特征变—这意味着二者之间必须共享相同的return type声明[^1]。 然而这并适用于描述那些仅限于单个class体内发生的重复命名现象(也就是我们所说的overloading),因为在这种情况下即使改变了output specification也完全可以接受只要其他方面满足区分性的基本前提即可。 ```java // Method Overriding Example class Parent { protected void displayMessage() { System.out.println("Parent Message"); } } class Child extends Parent{ @Override // This annotation is optional but recommended. public void displayMessage(){ super.displayMessage(); // Call parent's method first if needed. System.out.println("Child Override Message"); } } // Method Overloading Example within same class public class Calculator { int add(int a, int b){ return a+b; } double add(double a,double b){ return a+b; } String concatenate(String str1,String str2){ return str1+str2; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值