方法重载:是指在同一个类中,方法名相同,参数列表不同(参数个数不同,参数类型不同,参数顺序不同),这个时候多个方法之间就形成了方法重载。
例如如下代码就是方法重载的不同情况:
//通过方法定义小狗的行为
public void eat(){
System.out.println("小狗再吃");
}
//方法重载
public void eat(String food) throws Exception{
System.out.println("小狗在吃:" + food);
}
//个数不同
void eat(String food,String space){
System.out.println("小狗在"+space+",地方 吃"+ food);
}
//参数的类型不同
public int eat(int num ,String food){
System.out.println("小狗吃了 :"+ num +"份 "+ food);
return 20;
}
//参数的顺序不同也是方法重载
public void eat(String food,int num){
System.out.println("小狗吃了 :"+ num +"份 "+ food);
}
由上面的代码示例我们不难看出:
- 方法重载跟方法返回值没有关系
- 方法重载跟方法的修饰符也没有关系
- 方法重载和方法是否异常也没有关系
- 方法重载和方法参数名称也没有关系
比如,如下代码会报错:
//方法重载
public void eat(String food) throws Exception{
System.out.println("小狗在吃:" + food);
}
/*方法重载和方法的参数名称没有关系,编译器认为这两个方法是同一个
public void eat(String chide){
}*/
原因就是因为方法重载和方法的参数名称没有关系,编译器会认为这两个方法是同一个,所以会报错!
那么,方法重载有什么好处呢?
- 开发人员可以减少方法名称的定义,调用人员可以减少方法名称的记忆
- 方法重载可以带来一定的多态效果(调用同样的方法会产生不同的结果)
那么,方法重写又是什么呢?
方法重写:方法重写是指在继承关系中,父类的方法名和子父类的方法名一致,或者子类的方法修饰符大于父类的修饰符的时候,子类的方法就重写了父类的方法。
方法重写时,子类的返回值类型与父类的返回值类型一致,或者子类的返回值类型是父类返回值类型的子类,这样也是方法重写。
例如如下代码:
首先,定义一个动物类为父类,代码如下:
public void eat(){
System.out.println("动物都会吃");
}
protected void run(){
}
private void jump(){
}
public Animal getObj(){
return null;
}
然后,定义一个子类狗类,继承于上面的动物类,代码如下:
//子类重写父类的方法
@Override
public void eat(){
System.out.println("sss"); //属于方法重写,可以继承,且方法签名和父类一致
}
@Override
protected void run(){ //属于重写,可以继承,且方法签名和父类一致
}
@Override
public void run(){ //属于重写,可以继承,子类的访问修饰符大于父类访问修饰符
}
@Override
public Dog getObj(){ //属于重写,可以继承,子类方法的返回值类型是父类方法返回值类型的子类
return null;
}
public void jump(){ //不属于重写,服了的私有属性和方法不能被继承,因此不能重写。
}
由上面代码,我们不难看出:
- 父类中的私有方法是不能重写的,因为父类的私有属性和方法不能被继承,因此就不能被重写
- 在重写方法时,访问权限不能更低
- 如果父类方法使用静态方法,子类也必须使用静态方法
那么,方法重写有什么特点呢?
- 如果子类中和父类中方法名不同,那么就分别掉各自对应的方法
- 如果方法重写后,方法名相同,就使用子类的。
方法重写的应用:当子类需要父类的功能,而功能体主体有自己特有的功能时,可以重写父类中的方法,这样,既可以沿袭父类的功能,又定义了子类中特有的方法。
综上,我们不难得出方法重载和方法重写的区别:
- 方法重写必须在继承关系中,子类的方法签名和父类的一致(访问修饰符大于等于父类访问修饰符,返回值类型 和父类一样或是父类返回值类型的子类,方法名称一致,参数列表一致) 和参数的名称没有关系,只和类型有关系
- 方法重载必须在一个类中,方法名称相同,参数列表不同,和返回值无关,和访问修饰符没有关系,和参数的名称没有关系
- 构造函数不能被继承,构造方法也不能被重写,构造方法可以重载