1.方法的重写(override)
当父类的方法不能满足子类的需求时,我们可以在子类中重写父类的方法,重写也称为复写或者覆盖。
方法重写需要符合以下三个要点:
-
== :方法名、形参列表必须相同。
-
<= :子类重写方法的修饰符权限必须大于等于父类被重写方法的修饰符权限。
父类的私有方法不能被重写,static修饰的方法不能被重写。
-
<= :子类的返回值类型和异常类型必须小于等于父类的返回值类型和异常类型。
如果父类被重写方法的返回值类型为基本数据类型、void和String类型,那么要求子类重写方法的返回值类型必须和父类被重写方法的返回值类型保持一致。
如果父类被重写方法的返回值类型为引用数据类型(不包含String类型), 那么要求子类重写方法的返回值类型必须和父类被重写方法的返回值类型保持一致,要么要求子类重写方法的返回值类型必须是父类被重写方法返回值类的子类。
【示例】方法重写案例
// 父类
class Parent {
public void show(){
System.out.println("父类中的 show方法执行");
}
}
// 子类
class Child extends Parent {
// 子类重写父类的show方法
public void show(){
System.out.println("子类中的 show方法执行");
}
}
public class ExtendsMethodDemo {
public static void main(String[] args) {
Child p = new Child();
p.show(); // 执行的是子类的show方法
}
}
注意:如果子类重写了父类的方法,通过子类对象调用该方法时,调用的方法就是被覆写过的方法!
如果子类方法需要使用父类方法的功能,可使用super关键字来调用父类方法,该关键字引用了当前对象的父类对象。这样,即沿袭了父类的功能,又定义了子类特有的功能 (super关键字的使用和this非常相似)。
【示例】方法重写应用案例
// 功能机
class Phone {
void showPhoneNum() {
System.out.println("显示来电手机号码");
}
}
// 智能机
class IntelligentPhone extends Phone {
// 覆盖父类方法,并添加新的功能
void showPhoneNum() {
// 使用super调用父类成员方法
super.showPhoneNum();
System.out.println("显示来电姓名");
System.out.println("显示来电头像");
}
}
public class OverrideDemo {
public static void main(String[] args) {
IntelligentPhone ip = new IntelligentPhone();
ip.showPhoneNum(); // 调用的是子类的方法
}
}
方法重写和重载有什么区别?
区别点 | 方法重载 | 方法重写 |
---|---|---|
英文名 | overload | override |
范围 | 发生在同一个类中 | 发生在继承关系中 |
方法名和形参列表 | 方法名相同、形参列表相同 | 方法名相同、形参列表相同 |
修饰符权限 | 对访问权限没有要求 | 访问权限,子类大于等于父类 |
返回值和异常类型 | 对返回值类型和异常类型没有要求 | 返回值类型和异常类型,子类小于等于父类 |
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。
来源:CSDN
作者:武汉尚学堂
链接:https://blog.csdn.net/zhoujunfeng121/article/details/104600401