1.方法重载
有时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如,杂技师能训练动物,对于不同的动物有不同的训练方式:
public void train(Dog Dog){ //训练小狗站立、排队、做算术··· } public void train(Monkey monkey){ //训练小猴敬礼、翻筋斗、骑自行车··· }
对于类的方法(包括从父类中继承的方法),如果有两个方法的方法名相同,但参数不一致,那么可以说,一个方法是另一个方法的重载方法。
重载方法必须满足以下条件:
1.方法名相同。
2.方法的参数类型、个数、顺序至少有一项不同。
3.方法的返回类型可以不相同。
4.方法的修饰符可以不相同。
在一个类中不允许定义两个方法名相同,并且参数类型、个数、顺序也完全相同的方法。因为假如存在这样的两个方法,Java虚拟机在运行时无法决定到底执行哪个方法。
2.方法重写
假如有100个类,分别为Sub1,.....,Sub100,它们的一个共同行为是写字,除了Sub1用脚写字外,其余的类都用手写字。可以抽象出一个父类Base类,它有一个表示写字的方法write(),那么这方法到底如何实现呢?从尽可能提高代码可复用性的角度,write()方法应该采用适用于大多数子类的实现方式,这样就可以避免在大多数子类中重复定义write()方法。因此Base类的write()方法的定义如下:
public void write(){ //用手写字··· }
由于Sub1类的写字的实现方式与Base类不一样,因此在Sub1类中必须重新定义write()方法:
public void write(){ //用脚写字··· }
如果在子类中定义的一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法重写了父类的方法。
重写方法必须满足多种约束,如下:
1.子类方法的名称、参数签名和返回类型;必须与父类方法的名称、参数签名和返回类型一致。
2.子类方法不能缩小父类方法的访问权限。
3.子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类。
4.方法重写只存在于子类和父类之间。在同一个类中方法只能被重载,不能被重写。
5.父类的静态方法不能被子类重写为非静态方法,并且父类的非静态方法不能被子类重写为静态方法
6.父类的私有方法不能被子类覆盖。
7.父类的抽象方法可以被子类通过两种途径重写:一是子类重写父类的抽象方法;二是子类重新声明父类的抽象方法,例如一下代码合法:
public abstract class Base{ abstract void method1(); abstract void method2(); } public abstract class Sub extends Base{ public void method1(){···}//实现method1()方法,并且扩大了访问权限 public abstract void method2();//重新声明method2()方法,仅仅扩大访问权限,但不实现 }
8.父类的非抽象方法可以被重写为抽象方法。
3.方法重写与方法重载的异同
相同点:
1.都要求方法同名
2.都可以用于抽象方法和非抽象方法之间
不同点:
1.方法重写要求参数签名必须一致,而方法重载要求参数签名必须不一致
2.方法重写要求返回类型必须一致,而方法重载对此不作限制
3.方法重写只能用于子类重写父类的方法,方法重载用于同一个类的所有方法
4.方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制
5.父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次
标签:重写,void,子类,重载,父类,方法 From: https://blog.csdn.net/xiaojinyu0116/article/details/141869018