JavaSE基础:@Override预定义注解的使用
先看看@Override注解在Java SE中的声明:
package java.lang; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
由Java源代码声明我们了解到:@Override注解,只能用于标记方法,并且它只在编译期生效,不会保留在class文件中。
@Override注解标记的方法声明,如果没有覆写或者实现超类的方法声明,或者不是覆写Object的public方法,那么编译就会报错。使用@Override注解,有助于我们尽早发现这样的错误:本来想声明一个“覆写”方法,却偶然声明成“重载”方法。
最经典的例子就是equal方法:
package org.springmorning.demo.javabase.annotation.pre; /** * @author 编程老司机 */ public class Book { private String name; public boolean equals(Book book){ return this.equals(book.name); } }
本意是想声明equals方法覆写Object类的equals方法,然而上例声明的equal方法并没有覆写Object类的equals方法,而是对equals方法重载,并且继承Object的equals方法,这样就导致微妙的bug。但是如果在上例equals方法上标记@Override注解,那么编译器就会报错,提示此方法并不是对Object的equals方法的覆写。
如下代码就体现了@Override的作用:
package org.springmorning.demo.javabase.annotation.pre; /** * @author 编程老司机 */ public class Book { private String name; /** * 标记Override,会报错,因为这是equals方法重载 */ @Override public boolean equals(Book book){ return this.name.equals(book.name); } /** * 覆写Object的equals方法 */ @Override public boolean equals(Object book){ return this.name.equals(((Book)book).name); } }
还有一种比较特殊的情况,在接口声明的方法上使用@Override,这种情况是等同覆写Object的公共方法:
package org.springmorning.demo.javabase.annotation.pre; /** * @author 编程老司机 */ public interface Animal { @Override int hashCode(); @Override boolean equals(Object o); @Override String toString(); }
注意:只能覆写Object示例中的三个方法,对于protected finalize()方法或者final修饰的方法是不能覆写的。
下节继续
下节将给大家讲解预定义注解@SuppressWarnings的使用
如果您觉得博文不错,请用微信扫描右上方二维码,关注我的微信公众号“编程老司机”,获取最新推送文章。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端