1、方法重载(@overload)
java中,同一个类中出现了相同名字的方法,称为方法重载。
规则:两同一不同(无其他要求,比如返回值、修饰符等均可相同或不同)
- 同一个类中、方法名相同
- 形参列表不同(形参个数不同、形参类型不同)
在java重载一文中有详细介绍。
2、方法重写(@override)
java中,子类中包含与父类同名的方法,称为方法重写。
规则:两同两小一大
- 方法名相同、形参列表相同
- 子类方法的返回值类型需小于等于父类方法的返回值、子类声明抛出的异常需小于等于父类声明抛出的异常
- 子类方法的访问权限应大于等于父类方法的访问权限
尤其注意:被重写的方法要么都是类方法、要么都是实例方法,不能一个是类一个是实例
class Base{
public static void info() {
//类方法
}
}
public class t extends Base {
//方法重写错误,因为在父类中info是类方法,但是子类中是实例方法
public void info() {
}
}
如果父类中的方法被private修饰,那么此时子类无法访问该方法,如果在子类中出现与父类相同名字的方法,这不是方法重写,只是在子类中定义了一个新的方法。此时这两个同名的方法可以一个是类方法,一个是实例方法。
class Base{
//类方法,并且不能被子类访问
private static void info() {
}
}
public class t extends Base {
//不是方法重新,只是在子类中定义了一个新的方法
public void info() {
}
}
如何在子类中调用被子类重写的父类方法? 使用Super限定
子类重写了父类的方法,那么子类的对象将无法访问父类中被子类覆盖的方法,但可以使用super(实例方法)、类名(类方法)来调用该父类方法。
class Base{
int age;
//父类的info方法
public void info() {
System.out.println("Hello world");
}
}
class Sub extends Base{
//方法重写
public void info() {
System.out.println("Hello China");
}
//子类的新方法,在该方法中,想要调用父类的info方法,因此需要使用super限定,如果没有super,则默认是调用子类的info方法,则输出的是:Hello China
public void fun() {
super.info();
}
}
public class t{
public static void main(String[] args) {
Sub s=new Sub();
s.info();
s.fun();
}
}
输出结果:Hello China
Hello world