方法的重载(overload)和方法的重写(override/overwrite)是两个完全不同的概念,本篇博客将介绍方法重载和重写的用法和区别。
☍ 方法的重载(overload)
方法的重载在之前的博客《Java面向对象--属性和方法》中已经写过,☛ 传送门
重载的概念
☃ 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可
重载的特点
☃ 与返回值类型、形参变量名、方法体都无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型不同)。调用时,根据方法参数列表的不同来区别调用哪个
例子:
数字求和
//两个整数求和
int add(int a,int b){
int result = a +b;
return result;
}
//三个整数求和
int add(int a, int b, int c){
int result = a + b + c;
return result;
}
//两个小数求和
double add(double a, double b){
double result = a + b;
return result;
}
☀ 使用重载方法,可以为编程带来方便
☍ 方法的重写(override/overwrite)
重写的概念
☃ 在子类中可以根据需要对从父类中继承来的方法进行改造重写,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法
重写的特点
☃ 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
public class People{
//eat()方法的重载
public void eat(){
//do...
}
public void eat(String food){
//do...
}
public void eat(String food,int amount){
//do...
}
}
public class Student extends People{
//对eat(String food)方法的重写
public void eat(String fruit){
//do another...
}
}
☃ 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型(大于指的是继承上的关系,而非基本数据类型的值范围)
✦ void返回值类型重写的方法只能是void
✦ 父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类型
✦ 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法必须是相同的基本数据类型(基本数据类型之间没有继承关系,不要和数据的自动转型弄混)
public class People{
public byte getAge(){
//do...
}
}
public class Student extends People{
/*错误,返回值类型大于父类被重写方法的返回值类型
public int eat(String fruit){
//do another...
}
*/
}
☃ 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限(子类不能重写父类声明为private的方法,但子类可以声明与父类private方法同名的方法,但是此时不是重写)
public class People{
public void eat(String food){
//do...
}
private int getAge(){
//do...
}
}
public class Student extends People{
/*错误,访问权限小于于父类被重写方法的访问权限
protected void eat(String food){
//do another...
}
*/
//编译运行都可以通过,但是他不是对父类方法的重写
private int getAge(){
//do another...
}
}
☃ 子类方法抛出的异常不能大于(继承上的大于)父类被重写方法的异常
public class People{
public void setArray(int index) throws IndexOutOfBoundsException{
int[] arr = new int[3];
arr[index] = 10;
System.out.println(arr[index]);
}
}
public class Student{
//public void setArray(int index) throws Exception{ 错误Exception大于IndexOutOfBoundsException
public void setArray(int index) throws IndexOutOfBoundsException{
int[] arr = new int[3];
arr[index] = 20;
System.out.println(arr[index]);
}
}
✦ 子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为
static的(不是重写)。因为static方法是类方法,子类无法覆盖父类的静态(类)方法。
✦ 实际开发中不用记这么多情况,一般就是直接将父类的方法粘贴到子类后修改方法体即可。
本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布