java方法重写时需要注意的问题

 更新时间:2021年12月31日 09:48:20   作者:Monster_起飞  
大家好,本篇文章主要讲的是java方法重写时需要注意的问题,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

在面向对象编程中,方法重写(override)是一种语言特性,它是多态的具体表现,它允许子类重新定义父类中已有的方法,且子类中的方法名和参数类型及个数都必须与父类保持一致,这就是方法重写。

方法重写最简单的示例如下,定义一个父类 Father 和子类 Son,父类中有一个 method 方法,而在子类中会重写 method 方法,具体实现代码如下。父类 Father 实现代码如下:

/** 
 * 父类 
 */ 
class Father { 
    public void method(String name) { 
        System.out.println("Father:" + name); 
    } 
} 

子类中重写父类 method 方法,具体实现代码如下:

/** 
 * 子类 
 */ 
class Son extends Father { 
    @Override 
    public void method(String name) { 
        // 子类中重新定义了打印的行为,不再是 Father:XXX,而是 Son:XXX 
        System.out.println("Son:" + name); 
    } 
} 

在程序中调用并执行 method 方法,具体实现代码如下:

public class OverrideExample { 
    public static void main(String[] args) { 
        Father father = new Son(); 
        father.method("Java"); 
    } 
} 

以上程序的执行结果如下图所示:

在这里插入图片描述

然而在方法重写的过程中,也需要注意以下问题。

注意事项1:子类权限控制符不能变小

在 Java 中权限控制符的级别如下:

public > protected > 无 > private 

假如父类中的方法定义的是 protected 控制符,具体实现代码如下:

class Father { 
    protected void method(String name) { 
        System.out.println("Father:" + name); 
    } 
} 

那么此时如果子类重写父类方法时,定义的权限控制符小于 protected 就会报错,如下图所示:

在这里插入图片描述

那么问题来了,子类中的访问控制符能变大吗?答案是肯定的,如下图所示:

在这里插入图片描述

结论:在子类重写父类的方法时,重写的方法权限控制符不能变小,它可以等于或大于父类的权限控制符。

注意事项2:子类返回值类型只能变小

在讲此注意事项之前,我们先来看点前置知识,在 Java 语言中 Number 类是 Long 的父类,继承关系如下图所示:

在这里插入图片描述

接下来,我们在父类中使用 Number 类型来表示方法的返回类型:

class Father { 
    public Number method(int num1, int num2) { 
        return num1 + num2; 
    } 
} 

在子类的实现中使用 Number 类型的子类 Long 类型,是可以正常重写父类的方法的,如下图所示:

在这里插入图片描述

当然,如果和父类的返回类型保持一致也是可以的,如下图所示:

在这里插入图片描述

但是,如果尝试将子类中的返回类型变大就会报错了,如下图所示(Object 是 Number 类型的父类):图片

注意事项3:抛出的异常类型只能变小

如果子类中抛出异常的类型变大,也就是子类方法中抛出的异常类型大于父类方法抛出的异常类型,那么程序就会报错,如下图所示:

在这里插入图片描述

此时正确的解决方案是,保持父类和子类抛出的异常类型相同,如下图所示:

在这里插入图片描述

注意事项4:方法名必须保持一致

如果子类重写的方法名不能和父类保持一致,那么程序也会报错,如下图所示:

在这里插入图片描述

注意事项5:方法的参数类型和个数必须保持一致

子类中的方法参数类型和个数都要和父类方法保持一致,不然也会报错,如下图所示。

方法的参数类型不一致

在这里插入图片描述

方法的参数个数不一致

在这里插入图片描述

总结

本文介绍了 Java 中的方法重写(Override)是在子类重新定义父类已有方法的过程,它是面向对象编程中多态的具体表现。我们可以通过 @Override 关键字重写父类中的某个方法,但在重写的过程中需要注意以下 5 个问题:

子类方法的权限控制符不能变小;子类方法返回的类型只能变小;子类抛出异常的类型只能变小;子类方法名必须和父类保持一致;子类方法的参数类型和个数必须和父类保持一致。

到此这篇关于java方法重写时需要注意的问题的文章就介绍到这了,更多相关java方法重写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中Bean命名的方式总结

    Spring中Bean命名的方式总结

    在 Spring 框架中,每个 bean 必须至少有一个唯一的名称,这篇文章主要为大家详细介绍了Spring中Bean命名的各种方式,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • SpringMvc配置静态资源访问路径的实现

    SpringMvc配置静态资源访问路径的实现

    本文主要介绍了SpringMvc配置静态资源访问路径的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • SpringCloud及Nacos服务注册IP选择问题解决方法

    SpringCloud及Nacos服务注册IP选择问题解决方法

    这篇文章主要介绍了SpringCloud及Nacos服务注册IP选择问题,为什么注册的IP和真实IP不符合呢,原因是Nacos客户端在注册服务时会从机器网卡中选择一个IP来注册,所以,当注册了的是非真实IP后,另一台机器调用时是不可能调通的,知道问题原因就是解决方法,一起看看吧
    2024-01-01
  • Java文档注释超详细讲解

    Java文档注释超详细讲解

    这篇文章主要给大家介绍了关于Java文档注释的相关资料,文档注释主要是用来生成java开发文档javadoc的,生成的开发文档和Java本身的API帮助文档是一样的,需要的朋友可以参考下
    2023-10-10
  • java UDP通信客户端与服务器端实例分析

    java UDP通信客户端与服务器端实例分析

    这篇文章主要介绍了java UDP通信客户端与服务器端,结合实例形式分析了java基于UDP通信的客户端与服务器端具体实现技巧及相关操作注意事项,需要的朋友可以参考下
    2020-01-01
  • Java创建对象(显式创建和隐含创建)

    Java创建对象(显式创建和隐含创建)

    本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与隐含创建两种情况,显式创建和隐含创建,,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • Java流程控制break和continue

    Java流程控制break和continue

    这篇文章主要介绍了Java流程控制break和continue,下面文章围绕break和continue的相关资料展开详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2021-12-12
  • 打开IDEA配置Spring项目时发现没有选择java 1.8的选项解决方案

    打开IDEA配置Spring项目时发现没有选择java 1.8的选项解决方案

    这篇文章主要介绍了打开IDEA配置Spring项目时发现没有选择java 1.8的选项的解决方案,文中通过代码介绍的非常详细,对大家学习或者idea具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-03-03
  • 教你用java stream对集合中的对象按指定字段进行分组并统计

    教你用java stream对集合中的对象按指定字段进行分组并统计

    这篇文章主要给大家介绍了关于用java stream对集合中的对象按指定字段进行分组并统计的相关资料,本文主要介绍了如何利用Java的Stream流来实现在list集合中,对具有相同name属性的对象进行汇总计算的需求,需要的朋友可以参考下
    2024-10-10
  • Java 常用类解析:java异常机制,异常栈,异常处理方式,异常链,异常丢失详解

    Java 常用类解析:java异常机制,异常栈,异常处理方式,异常链,异常丢失详解

    这篇文章主要介绍了Java 常用类解析:java异常机制,异常栈,异常处理方式,异常链,异常丢失详解的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论