Java中方法的重载与重写

本文深入探讨了Java中的方法重载和方法重写,包括它们的区别、使用规则及注意事项,帮助开发者理解如何在类中实现多态性和代码复用。

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

一、方法重载

方法重载针对的是一个类。

只用当参数序列不同,即参数的个数、类型或顺序不同时,才叫做方法重载。与方法的返回类型、修饰符(public、protected、private等)、是否抛出异常无关。

例如:下面的四个方法是同一个方法,不是方法重载

<span style="font-size:14px;">	public void save(int a) throws IOException{
		
	}
	
	private void save(int a) throws IOException{
		
	}

	public void save(int a){
		
	}
	
	public int save(int a) throws IOException{
		
	}</span>

二、方法重写

方法重写针对的是父类和子类。

当子类的方法名及参数序列和父类完全相同时,叫做方法重载,与方法是否抛出异常无关。

注意:

  • 如果父类的方法定义为private,它在子类中是不可见的,故子类中的同名方法不再是覆盖,相当于一个新的方法名
  • 如果父类的方法定义为protected,子类不能将需要重写的方法定义为private
  • 如果父类的方法定义为public,子类不能将需要重写的方法定义为private、protected

注:如果一个方法没加修饰符,默认为friendly,只允许同一个包中的其他类访问。

三、final修饰的方法不能被重写,但是能被重载

1、如果父类的方法用final修饰,那么在子类中无法重写。

下面的例子是错误的:

<span style="font-size:14px;">package com.ghs.test;

public class Base {
	public final void show(){
		System.out.println("Base");
	}
}

class Sub extends Base{
	public void show() {
		System.out.println("Sub");
	}
}</span>
2、如果父类的final方法用private修饰,它在子类中是不可见的,故子类中的同名方法不再是覆盖,相当于一个新的方法名。

下面的例子是正确的:

package com.ghs.test;

public class Base {
	private final void show(){
		System.out.println("Base");
	}
}

class Sub extends Base{
	public void show() {
		System.out.println("Sub");
	}
}
3、final修饰的方法是可以被重载的。

下面的例子是正确的:

<span style="font-size:14px;">package com.ghs.test;

public class Base {
	public final void show(){
		System.out.println("Base1");
	}
	
	public final void show(int a){
		System.out.println("Base2");
	}
}</span>
总结:final修饰方法跟final修饰类是同一个原理,final修饰类,则类不能被继承,final修饰方法,则方法不能被重载,都是子类跟父类之间的关系。

补充说明:final修饰变量,则为常量,值不可变final修饰对象,值可变,引用不变。

下面两个例子,分别是final修饰变量和final修饰对象的,都是错误的:

<span style="font-size:14px;">package com.ghs.test;

public class Test {
	private static final int a=2;
	public static void main(String[] args) {
		a=3;
	}
}
//a是常量,所以a的值不能改变,错误
</span>

<span style="font-size:14px;">package com.ghs.test;

public class Test {
	private static final Person person=new Person();
	public static void main(String[] args) {
		person = new Person();//错误,引用不能变(值就是对象的地址)
		person.setName("张三");//正确,值可变(值就是具体的对象)
	}
}</span>

四、static修饰的方法对子类不可见,可以被重载

1、static修饰的方法叫做类方法,类方法是属于某个类的,所以对子类是不可见的,故子类中的同名方法不再是覆盖,相当于一个新的方法名。

下面的例子是正确的:

package com.ghs.test;

public class Base {
	public static void show(){
		System.out.println("Base");
	}
}

class Sub extends Base{
	//这不是从父类继承的方法,是子类自己定义的方法,父类的静态方法对子类是不可见的
	public static void show() {
		System.out.println("Sub");
	}
}
2、static修饰的方法可以被重载

下面的例子是正确的:

package com.ghs.test;

public class Base {
	public static void show(){
		System.out.println("Base1");
	}
	
	public static void show(int a){
		System.out.println("Base2");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值