方法重载
对于类的方法(包括从父类中继承的方法),如果有2个方法的方法名相同,但参数不同,那么一个方法是另一个方法的重载方法。
重载方法必须满足以下条件:
-
方法名相同
-
方法的参数类型,个数,顺序至少有一项不同
-
方法的返回类型可以不相同
-
方法的修饰符可以不相同
一个类中不允许定义2个方法名相同,并且参数签名(参数类型,个数,顺序)也完全相同的方法。如果存在这样的方法,Java虚拟机在运行时无法决定执行哪个方法。
方法覆盖
方法覆盖也叫方法重写。如果在子类中定义的一个方法,它的名称,返回类型,参数签名刚好与父类中某个方法的名称,返回类型,参数签名一致,那么就是,子类的方法覆盖了父类的方法。
覆盖方法必须满足以下条件:
- 子类方法的名称,返回类型,参数类型必须和父类方法的名称,返回类型,参数类型一致。例如下面代码返回类型不同,导致错误。
public class Base{
public void method(){}
}
class Sub extends Base{
public int method(){}
}
-
子类方法不能缩小父类方法的访问权限。public > private
public class Base{ public void method(){} } class Sub extends Base{ private void method(){} }
为什么不允许缩小父类方法权限呢?因为如果没有这个限制,将会和Java的多态冲突。例如下面的代码
Base b=new Sub(); b.method();
在运行时,根据多态的动态绑定规则,java虚拟机会调用 b 所引用的Sub实例的method(),但是这个方法是private类型,无法访问,造成冲突。
-
子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者是父类方法抛出的异常类的子类。
-
只有子类和父类(包括直接父类和间接父类)才存在方法覆盖。同一个类中方法只能重载不能覆盖。
-
父类的静态方法不能被子类覆盖为非静态方法。
-
父类的私有(private)方法不能被子类覆盖。父类的抽象方法可以被子类通过2种途径覆盖:
1.子类实现父类的抽象方法
2.子类重新声明父类的抽象方法。
Overload与Override的异同
相同点:
- 都要求方法同名
- 都可以用于抽象方法和实例方法之间
不同点:
-
方法覆盖要求参数签名必须一致,方法重载要求参数签名必须不一致
-
方法覆盖要求返回类型必须一致,方法重载无要求
-
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类继承的方法)
-
方法覆盖对方法的访问权限和抛出异常有特殊要求,方法重载没有要求
-
父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次
-