资讯专栏INFORMATION COLUMN

Java 中的 override 和 overload,看这一篇就够

clasnake / 1122人阅读

摘要:同样的方法名称,参数列表,返回类型,抛出的异常或者是父类抛出的异常的子类,子类重写一个。使用方法过载的目的,根据调用时的实参表与形参表,来选择对应的方法体的。

问题出现:
即使对于一个经验丰富的开发人员来说,方法重载和方法覆盖的区别都能让他犹豫一下,
对于新手来说,经常容易弄混淆。
有没有比较深入浅出的理解方式,能让人过目不忘,用起来还能有条件反射般的速度呢?
其他人是怎么做的:
写类似比较的博客非常之多,无非也就是分开介绍,然后比较区别。
好像也有效果,前提是要理解,完了还要不时拿来复习,保持记忆不被遗忘。
可以这样理解:
override 更准确的翻译应该是推翻,重写。
overload 更准确的翻译应该是过载。
    如果你不是新手,看到这个解释的时候应该有点茅塞顿开的感觉,
    因为直译之后的意思就是这两个方式的功能概括。
所以:
override 个人喜欢叫做方法重写;
overload 个人喜欢叫做方法过载。
分析:
为什么叫方法重写:
    父类中的方法满足不了需要,子类可以推翻父类中的方法。
    同样的方法名称,参数列表,返回类型,抛出的异常(或者是父类抛出的异常的子类),子类重写一个。
    所以方法重写要求很严格,除了方法体内部的实现和访问权限,其他的都要和父类中需要被重写的方法保持一致。
    有一点要特别注意,方法重写之后访问权限可以不同:
        可以扩大访问权限,但是不能降低访问权限。
        可以看作是对子类的兼容性和拓展性要求的折衷妥协吧。
    注意:被重写的方法访问权限不能为 private,因为 private 修饰的方法子类没有访问权限,更不要提重写。

为什么叫方法过载:
    过载指的是应对不同的参数列表而产生的方法过载。
    所以方法过载要求方法名称必须相同,参数列表必须不同;
    访问权限,返回类型,抛出的异常之类的可以相同也可以不同。
        使用方法过载的目的,根据调用时的实参表与形参表,来选择对应的方法体的。
    注意:如果某一方法在父类中是访问权限是 private,那么就不能在子类对其进行重载;
    如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
    
练习一下:
class A {
 protected int method1(int a, int b) { return 0; }
}

public class B extends A{ 
 public int method1(int a, int b) { return 0; }
 // private int method1(int a, int b) { return 0; } 
 // private long method1(int a, int b) { return 0; } 
 public short method1(int a, long b) { return 0; }
 private int method1(int a, long b) { return 0; }
}

(参考答案预警!你不打算在心里演算一下么?)
参考答案:
class A {
 protected int method1(int a, int b) { return 0; }
}

public class B extends A{ 
 public int method1(int a, int b) { return 0; } // 正确,重写父类方法,可以扩大访问权限
 // private int method1(int a, int b) { return 0; } // 错误,重写父类方法,不能降低了访问权限
 // private long method1(int a, int b) { return 0; } // 错误,重写父类方法,不能改变返回值类型
 public short method1(int a, long b) { return 0; } // 正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
 private int method1(int a, long b) { return 0; }/ /正确,method1 方法参数过载,可以有不同的访问权限和返回值类型
}
小结:
override 方法重写,也叫方法覆盖;
    要求与被重写的方法:
        名称相同,
        参数列表相同,
        返回类型相同,
        抛出的异常相同(或者是父类抛出的异常的子类)。
    被重写的方法访问权限不能为 private。

overload 方法过载;
    要求过载的方法:
        方法名称必须相同;
        参数列表必须不同;
        访问权限,返回类型,抛出的异常可以相同也可以不同。
    

传送门:http://blog.51cto.com/1350814...
本文系笔者原创
转载请注明出处
—————————————

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72843.html

相关文章

  • Spring Boot 2.x(十四):整合Redis,看这一篇就够

    摘要:丰富的特性还支持通知过期等等特性。到这个就说明测试通过了。主要针对方法配置,能够根据方法的请求参数对其进行缓存,常用于查询操作主要针对方法配置,能够根据方法的请求参数对其进行缓存,常用于修改操作清空缓存,主要用于删除操作。 [TOC] Redis简介 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数...

    Miracle 评论0 收藏0
  • SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

    摘要:也是自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。 原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一、在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1、单机部署模式 Timer:jdk中...

    BWrong 评论0 收藏0
  • Spring入门看这一篇就够

    摘要:甲乙交易活动不需要双方见面,避免了双方的互不信任造成交易失败的问题。这就是的核心思想。统一配置,便于修改。带参数的构造函数创建对象首先,就要提供带参数的构造函数接下来,关键是怎么配置文件了。 前言 前面已经学习了Struts2和Hibernate框架了。接下来学习的是Spring框架...本博文主要是引入Spring框架... Spring介绍 Spring诞生: 创建Spring的...

    superw 评论0 收藏0
  • JSON入门看这一篇就够

    摘要:采用完全独立于任何程序语言的文本格式,使成为理想的数据交换语言为什么需要提到,我们就应该和来进行对比。也是一种存储和交换文本信息的手段。那么好在哪里呢比更小更快,更易解析。使用的时候,也支持将转成但是,我们不一定使用框架来做开发呀。 什么是JSON JSON:JavaScript Object Notation 【JavaScript 对象表示法】 JSON 是存储和交换文本信息的语法...

    gplane 评论0 收藏0
  • Python 中的 or and 运算,看这一篇就够

    摘要:问题出现中的,运算,可以写出比较复杂的演算表达式看了一些大神的演算规则解释,觉得不是很好理解,有些人甚至理解错了规则。特殊情况当表达式的所有值都是真值,并且运算符不全部一致,那么第一个或演算完后直接返回。 问题出现: Python 中的 or,and 运算,可以写出比较复杂的演算表达式; 看了一些大神的演算规则解释,觉得不是很好理解,有些人甚至理解错了规则。 这里聊一下自己的理解。 ...

    刘永祥 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<