一、方法重载(overloading)
1.概述:简单的说,在同一个类中,存在着方法名相同,方法的参数列表(参数类型、参数个数)不同且与方法的返回值无关的现象称为方法重载。
public class Demo{
public static void main(String[]args){
...
}
public static void show(){
...
}
public static void show(int num){
...
}
public static void show(int num,String name){
...
}
}
在此段代码中show()方法就出现了方法重载现象。
2.编译器通过把调用的方法中参数列表(参数类型、参数个数)与各个方法给出的参数列表进行匹配来挑选出相应的方法。如果编译器找不到相匹配的方法,就会产生编译时的错误。这个过程称为重载解析(overloading resolution)。
3.Java允许重载任何方法。因此,要完整的描述一个方法,需要指出方法名,以及参数类型。这叫做方法的签名(signature)。例如,String类有4个称为indexOf的共有方法,他们的签名是indexOf(int)、indexOf(int,int)、indexOf(String)、indexOf(String,int)。注意,返回值类型不是方法签名的一部分(方法重载与返回值类型无关,不管方法的返回值类型相不相同,只要满足参数列表不同,就为方法重载)。也就是说,不能有俩个名字相同、参数类型也相同却返回值类型不同的方法。
二、方法重写(overriding)
1.概述:在面向对象继承问题中,子类继承父类,继承父类所有的方法和变量,那么子类就具备了父类的所有特性。但是特殊的子类会有特殊的行为(成员方法),那么这些特殊的子类可以定义新的特性,那么子类需要修改父类的一些方法进行扩展或者增大功能,满足他的特性,这个种操作就称为方法重写(覆盖或覆写)。
class Dog{
public String name="小狗";
public int age=5;
public void eat(){
System.out.println("每天吃狗粮");
}
}
class SmallDog{
public void eat(){
//对父类的eat()方法进行重写,因为小狗类有特殊的特性(吃骨头);
System.out.println("每天吃一点骨头");
}
}
方法重写体现了Java语言的优越性,方法重写是建立在继承关系上,它使语言结构更加丰富。在Java的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。在Java中覆盖继承父类的方法就是通过方法的重写来实现的。所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。
二、注意事项:
1.父类中私有的(被private所修饰的)方法不能被重写,因为私有的(被private所修饰的)方法无法被子类继承,所以重写就更不用说了。
2.子类重写父类的方法时,要求重写的方法名称,参数列表(参数类型、参数个数)和返回值类型完全一样,否则就会成为方法重载。
3.子类重写父类的方法,子类方法的访问权限不能比父类的方法低,只能相同或者更高。父类中的方法并不是在任何情况下都可以重写的,当父类中方法的访问权限修饰符为private时,该方法只能被自己的类访问,不能被外部的类访问,在子类是不能被重写的。如果定义父类的方法为public,在子类定义为private,程序运行时就会报错。