面向对象编程(进阶) 3-方法重写
Zemise
Zemise
发布于 2023-06-12 / 45 阅读 / 0 评论 / 1 点赞

面向对象编程(进阶) 3-方法重写

前言

父类的所有方法子类都会继承,但是当某个方法被继承到子类之后,子类觉得父类原来的实现不适合于自己当前的类,该怎么办呢?

子类可以对从父类中继承来的方法进行改造,我们称为方法的重写 (override、overwrite)。也称为方法的重置、覆盖

在程序执行时,子类的方法将覆盖父类的方法。

3.1 方法重写示例

比如新的手机增加来电显示头像的功能,代码如下:

public class Phone {
    public void sendMessage(){
        System.out.println("发短信");
    }
    public void call(){
        System.out.println("打电话");
    }
    public void showNum(){
        System.out.println("来电显示号码");
    }
}
//SmartPhone:智能手机
public class SmartPhone extends Phone{
    //重写父类的来电显示功能的方法
	@Override
    public void showNum(){
        //来电显示姓名和图片功能
        System.out.println("显示来电姓名");
        System.out.println("显示头像");
    }
    //重写父类的通话功能的方法
   @Override
   public void call() {
       System.out.println("语音通话 或 视频通话");
   }
}
public class TestOverride {
    public static void main(String[] args) {
        // 创建子类对象
        SmartPhone sp = new SmartPhone();
 
        // 调用父类继承而来的方法
        sp.call();
 
        // 调用子类重写的方法
        sp.showNum();
    }
}

@Override使用说明:

写在方法上面,用来检测是不是满足重写方法的要求。

这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。

建议保留,这样编译器可以帮助我们检查格式,另外也可以让阅读源代码的程序员清晰的知道这是一个重写的方法。

3.2 方法重写的要求

  • 子类重写的方法**必须和父类被重写的方法具有相同的方法名称参数列表**。

  • 子类重写的方法的返回值类型**不能大于**父类被重写的方法的返回值类型。(例如:Student < Person)。

注意:如果返回值类型是基本数据类型和void,那么必须是相同

  1. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限。

(public > protected > 缺省 > private)

注意:

① 父类私有方法不能重写

② 跨包的父类缺省的方法也不能重写

  1. 子类方法抛出的异常不能大于父类被重写方法的异常

此外,注意:

子类与父类中同名同参数的方法必须同时声明为非static的(即为重写)

或者同时声明为static的(不是重写)。

因为static方法是属于类的,子类无法覆盖父类的方法。

3.3 鉴别:方法的重载与重写

方法的重载:方法名相同,形参列表不同。不看返回值类型。

方法的重写:见上面。

(1)方法重载在主要同一个类中

public class TestOverload {
    public int max(int a, int b){
        return a > b ? a : b;
    }
  
    public double max(double a, double b){
        return a > b ? a : b;
    }
  
    public int max(int a, int b,int c){
        return max(max(a,b),c);
    }
}

(2)方法重写只能在父子类中,但重载可以重载父类的方法

public class TestOverloadOverride {
    public static void main(String[] args) {
        Son s = new Son();
        s.method(1);//只有一个形式的method方法
 
        Daughter d = new Daughter();
        d.method(1);
        d.method(1,2);//有两个形式的method方法
    }
}
 
class Father{
    public void method(int i){
        System.out.println("Father.method");
    }
}
class Son extends Father{
    public void method(int i){//重写
        System.out.println("Son.method");
    }
}
class Daughter extends Father{
    public void method(int i,int j){//重载
        System.out.println("Daughter.method");
    }
}

评论