重载和重写的区别

 <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>

<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流!

一、方法重载(Overload)

Java允许同一个类里定义多个同名方法,只要形参列表不同就行。如果同一个类中包含了两个或两个以上相同方法名的方法,但形参列表不同,则被称为方法重载。简单的说,方法重载的要求是两同一不同。两同:同一个类中方法名相同。一不同:参数列表不同。除此之外,至于方法的其他部分,如方法返回值类型、修饰符等等与方法重载没有任何关系。

下面所示为方法重载的的实例:

public class OverloadTest {
	//定义两个test方法,但是参数列表不同。系统可以区分这两个方法,这就是方法重载
	public void test(){
		System.out.println("无参数的方法");
	}
	public void test(String msg){
		System.out.println("重载test方法:" + msg);
	}
	public static void main(String args[]){
		OverloadTest ot = new OverloadTest();
		//调用test时没有传入参数,则调用无参数的test方法
		ot.test();
		//调用test时传入一个字符串,则嗲用带参数的test方法
		ot.test("overload");
	}
}

运行上面程序,将输出如下结果:

无参数的方法
重载test方法:overload
由结果可知,虽然两个test方法的方法名相同,但因为它们的形参列表不同,所以系统可以正常区分出这两个方法。
二、重写(Override)父类方法

子类扩展了父类,子类是一个特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的属性和方法。但有一种情况例外:子类需要重写父类的方法。例如鸟类都包含了飞翔的方法,但其中鸵鸟是一种特殊的鸟类,因此鸵鸟应该是鸟的子类,因此它也将从鸟类获得飞翔的方法,但这个飞翔的方法显然不适合鸵鸟,为此,鸵鸟需要重写鸟类的方法。

如下程序:

class Bird{
	//Bird类的fly方法
	public void fly(){
		System.out.println("我可以在天空中自由自在的飞翔!");
	}
}
public class Ostrich extends Bird {
	public void fly(){
		System.out.println("悲催的我只能在地上奔跑!");
	}
	public static void main(String args[]){
		//创建Ostrich对象
		Ostrich os = new Ostrich();
		//将执行Ostrich对象的fly方法
		os.fly();
	}
}
执行上面的程序,将输出如下结果:

悲催的我只能在地上奔跑!
由以上输出结果可知,执行os.fly()时执行的不是Bird类的fly()方法,而是执行Ostrich类的fly方法。

这种子类包含与父类同名方法的现象被称为方法重写,也被称为方法覆盖(Override)。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法。

方法的重写要遵循“两同两小一大”规则,“两同”即方法名相同;“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

如下代码将会引发编译错误。

class FatherClass{     
      public static void test(){   //类方法
   }
}
class SonClass extends FatherClass{
     public void test(){   //实例方法
    }
}
方法重载和方法重写在英语中分别是overload和override。重载主要发生在同一个类的多个同名方法之间,而重写发生在子类和父类之间。这是它们之间的主要区别。

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、

<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值