方法重载与重写

Java方法重载与重写详解
本文详细解析了Java中的方法重载和重写概念,通过实例展示了如何通过参数列表区分重载方法,以及在子类中如何正确重写父类方法,遵循相同的名称、参数列表和返回类型。

我们在平时开发的时候经常会遇见这样一个问题,方法的重载和重写。有时候经常搞混,这篇文章就是为了很好的去整理区分一下。

一个类中,可以有很多的构造方法,而且名字相同都是类名,其实这些方法就已经构成了重载。也就是说,在一个类中,可以有很多名字相同的不同方法。现在一个问题来了,就是java是如何区分这些方法的呢?

方法重载

其实区分重载,有一个很简便的方法,那就是每一个方法有一个独一无二的参数列表。

public class Son extends Father{

	int fff(){
        return 0;
    }
	String fff(int x,String y){
        return "";
    }
	void fff(String y,int x){};
		
	public static void main(String[] args) {
		Son son=new Son();		
	}
}

由以上代码可以看到:

1、参数个数不同可以区分

2、参数的顺序不同可以区分。

注意;返回值类型不同不能区分。

为什么返回值类型不同不能区分呢?这是因为有时候我们定义的方法,我们只是想要简单地去调用,而不想去获取他的返回值。

比如:在调用fff()时,只需要调用fff()或者是fff(1,"数据")而不去获取他的返回值。这样jvm是无法区分的。

 

方法重写

先看一下重写的概念:

1、在子类中可以根据需要对从基类中继承来的方法进行重写。

2、重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。(注:返回值可以为父类中返回值的子类型.参数若为子类,则不是重写是重载)

3、重写方法不能使用比被重写的方法更严格的访问权限。

4. 重写方法不能声明抛出比被重写方法范围更大的异常类型。

总结:重写是子类对所继承父类相同方法的一种更改,这个更改需要遵循格式按照父类的格式,访问权限,抛出异常等等,都在父类方法控制范围内,内部具体实现可以实现不同的效果。

通俗一点来说:重写就是对父类的的同一个方法的改写,但是别人怎么知道你这是重写,不是添加的新方法?这就要求格式必须跟父类相同,别人一看,呀,他俩长的一模一样(指的上面2,3,4规则),肯定是重新写了,就是重写。

看一个例子:

定义父类:

public class Father extends Grandpa {	
	 
	String add(int a,int b){
		int c=a+b;
		return ""+c;
	}
	
}

定义子类

public class Son extends Father{

	String add(int a,int b){
		int c=a+b;
		return ""+c;
	}
	
	public static void main(String[] args) {
		Son son=new Son();		
	}
}

这样就完成了方法的重写。

### 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、付费专栏及课程。

余额充值