方法覆盖(方法重写)override:
在继承关系中,如果子类重新定义的一个方法,如果其名称,返回类型及参数签名与父类中的某个方法的名称,返回类型
及参数签名相匹配,那么子类的方法覆盖了父类的方法,叫方法覆盖或方法重写.
1 子类的方法名称,参数签名和返回类型必须与父类的方法名称,参数签名和返回类型一致.
class Base {
//子类的方法名称,参数签名和返回类型必须与父类的方法名称,参数签名和返回类型一致.
public void dispaly() {
System.out.println("base ");
}
}
class Sub extends Base {
/*编译错误 因为编译器先判断子类的方法名和方法的参数签名与父类的一致,因此编译器认为子类是要重写父类的方法 又因为子类的方法返回类型和父类的返回类型不一致 因此编译错误*/
public int dispaly() {return 1;}
// 正确 方法重写
//public void dispaly() {}
}
2 子类的方法不能缩小父类方法的访问权限,只能扩大不能缩小
class Base {
protected void dispaly() {}
}
class Sub extends Base {
//错误 子类的方法不能缩小父类方法的访问权限,只能扩大不能缩小
private void dispaly() {}
// 正确
//public void dispaly() {}
}
3 子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须与父类相同或抛出的异常类为父类抛出异常类的子类
4 父类的静态方法不能被子类覆盖为非静态方法.子类可以定义与父类的静态方法相同的静态方法,以便子类隐藏父类的静态方法.同样 子类定义的静态方法也必须满足方法覆盖的约束,方法名,方法的参数签名,返回类型一致。不能缩小父类的访问权限,不能抛出比父类方法更多的异常.
class Base {
public static void dispaly () {}
}
class Sub extends Base {
//错误 父类的静态方法不能被子类覆盖为非静态方法
public void dispaly() {}
/*正确 子类可以定义与父类的静态方法相同的静态方法,以便子类隐藏父类的静态方法.同样 子类定义的静态方法也必须满足方法覆盖的约束,方法名,方法的参数签名,返回类型一致。不能缩小父类的访问权限,不能抛出比父类方法更多的异常.
与实例方法的区别,运行时实例方法与所属的实例绑定(动态绑定),静态方法和所属的声明类型类型绑定(静态绑定)
*/
// public static void dispaly(){}
}
5 父类的非静态方法不能被子类覆盖为静态方法
class Base {
public void dispaly () {}
}
class Sub extends Base {
//错误 父类的非静态方法不能被子类覆盖为静态方法
public static void dispaly(){}
}
6 父类的非抽象方法可以被子类覆盖为抽象方法
方法重载和方法重写的相同点和不同点:
相同点 : 都要求方法名称相同
都可以应用于抽象方法和非抽象方法之间
不同点 :
方法重载发生在同一个类的内部的方法内,而方法重写发生在继承关系中,子类重写了父类的方法
方法重载不要求方法的返回类型一致与否 而方法重写要求返回类型必须一致
方法重载要求方法的参数签名必须不一致,而方法重写要求方法的参数签名必须一致
方法重载对方法的访问权限和抛出异常没有限制,而方法重写对方法的访问权限和抛出异常有限制