1、重载(overload)和重写(override)
方法的重写和重载都是实现多态的方式,重载实现的是编译时多态,重写实现的是运行时多态。
1.方法重载(overload):在同一个类中,方法名相同,参数列表(类型不同,顺序不同,个数不同)不同,跟返回值类型无关,就构成方法重载
- 方法重载的规则:
- 方法名一致,参数列表(类型不同,顺序不同,个数不同)不同。
- 重载跟返回值类型无关
- 可以抛出不同的异常,有不同的修饰符。
2.方法重写(override :也叫方法覆盖,在子类和父类两个类中,方法名相同,参数列表相同,返回值类型相同,就构成方法重写 。
- 方法名相同,参数列表相同
- 返回值类型相同
- 不能比父类抛出的更多的异常。例如:父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
- 访问权限不能比父类更严格。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
- 构造方法不能重写,声明为final和static的方法都不能被重写,但声明为static的方法可以被再次声明。
2、为什么函数不能根据返回值类型来区分重载?
因为在调用方法时,不能指定返回值类型,编译器不知道你要调用哪个函数。
例:
public int max(int a,int b) {
return a;
}
public float max(int a,int b) {
return a;
}
当调用max(1,2)时,无法确定调用的是哪一个。
方法的返回值类型只是作为函数运行后的一个“状态”,他是保持方法调用者通信和被通信的关键,并不能作为某个方法的“标识”。