关于@Override在1.5和1.6之后的区别

@Override注解是作用于源代码的注解,用于表明注解的方法重写了父类型的方法,但是这个注解在1.5和1.6及以后是有区别的。1.5中,只能用于在继承某个类时,重写父类中的方法,而在实现一个接口中的方法时,是不能使用该注解的,从1.6开始,才支持实现父接口的方法使用该注解。但是在@Override源代码文档中,1.6没有对这个变化进行说明,到1.7才进行了说明。

下面是1.5和1.6的源码:

package java.lang;

import java.lang.annotation.*;

/**
 * Indicates that a method declaration is intended to override a
 * method declaration in a superclass.  If a method is annotated with
 * this annotation type but does not override a superclass method,
 * compilers are required to generate an error message.
 *
 * @author  Joshua Bloch
 * @since 1.5
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

意思是:表示一个方法声明打算重写超类中的某个方法声明。如果方法利用此注解类型进行注解但没有重写超类方法,则编译器会生成一条错误消息。

下面是1.7的源码:

package java.lang;

import java.lang.annotation.*;

/**
 * Indicates that a method declaration is intended to override a
 * method declaration in a supertype. If a method is annotated with
 * this annotation type compilers are required to generate an error
 * message unless at least one of the following conditions hold:
 *
 * <ul><li>
 * The method does override or implement a method declared in a
 * supertype.
 * </li><li>
 * The method has a signature that is override-equivalent to that of
 * any public method declared in {@linkplain Object}.
 * </li></ul>
 *
 * @author  Peter von der Ahé
 * @author  Joshua Bloch
 * @jls 9.6.1.4 Override
 * @since 1.5
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

意思是:表示一个方法声明打算重写父类型中的某个方法声明。如果方法利用此注解类型进行注解时,编译器必须生成一条错误消息,除非满足下列两个条件之一:

  • 该方法重写或实现了父类型中声明的某个方法
  • 该方法的签名与Object类中声明的某个公共方法重写等价(override-equivalent)的

关于重写等价的意思可以查看http://stackoverflow.com/questions/16207386/what-is-override-equivalence-and-how-is-it-related-to-override

可以注意到两个词的变化:

Indicates that a method declaration is intended to override a method declaration in a superclass.

Indicates that a method declaration is intended to override a method declaration in a supertype.

那就是1.5中是superclass,则1.7中是supertype。一个是父类,一个是父类型。为什么1.6的文档没有对此变化进行修改,但实质上却支持实现接口的方法可以使用@Override,无从知晓,可能是没有及时的更新文档吧。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 11:26:48

关于@Override在1.5和1.6之后的区别的相关文章

RxJava从入门到放弃---关于RxJava-入门必看

RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式 RxJava 的观察者模式 2. 基本实现 1) 创建 Observer 2) 创建 Observable 3) Subscribe (订阅) 4) 场景示例 a. 打印字符串数组 b. 由 id 取得图片并显示 3. 线程控制 -- Scheduler (一) 1) Scheduler 的 API (一) 2) Scheduler 的原理 (一) 4. 变换 1) API 2) 变

给 Android 开发者的 RxJava 详解

作者:扔物线 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个月,我也发现国内越来越多的人开始提及 RxJava .有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用

C#中的继承与多态还有接口

简单继承 最简单的三个类 public class Animal { public Animal() { Debug.Log("Construct Animal!"); } } public class Mammal : Animal { public Mammal() { Debug.Log("Construct Mamal!"); } } public class Sheep : Mammal { public Sheep() { Debug.Log("

【C#】笔试知识点

C#笔试知识点 1.String与Stringbuilder的区别: String自动分配内存大小,每次往里面写新东西,就会重新分配一段内存,然后把地址指向新的这块空间,是由C#内存管理自动管理的. Stringbuilder会事先分配好一段空间,append的时候,是操作的同一块空间,如果新串超过原本大小,内存空间自动加倍. 2.C#如何调用c++静态库(lib): 可以用CLR(新)或者Managed c++(老)将lib封装成managed dll供C#直接调用. 将lib封装成nativ

初级JavaWeb攻城狮面试指导(二)

一.Java面向对象必会知识点 Java的核心是面向对象编程,所有的java程序都是面向对象的.需要看清Java的本质,从复杂的表象中寻找普遍的规律,并深刻理解Java的核心思想. 1.面向对象的特点总结 封装:隐藏在对象的属性和实现细节,仅对外提供公共的访问方式 继承:在一个类基础上定义一个新类,原有的类叫父类,新生成的类叫子类 多态:事物存在多种体现的形态 面向对象程序设计的优点是:可重用性.可扩展性.可管理性 2.类与对象特性总结 类与对象的概念: 类是具体事物的抽象,在概念上的定义 对象

Makefile编写 二

变量 1.        Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),是在make读取makefile文件时进行的,这里的变量包括了使用“=”定义和使用指示符“define”定义的. 2.        变量可以用来代表一个文件名列表.编译选项列表.程序运行的选项参数列表.搜索源文件的目录列表.编译输出的目录列表和所有我们能够想到的事物. 3.        变量名是不包括“:”.“#”.“=”.前置空白和尾空白的任何字符串. 4.        变量名是大小写敏感的.

C#中Abstract和Virtual的区别

c# 中 Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用.下面讨论一下二者的区别: 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法

.NET面试题5

常见面试题目: 1. const和readonly有什么区别? 2. 哪些类型可以定义为常量?常量const有什么风险? 3. 字段与属性有什么异同? 4. 静态成员和非静态成员的区别? 5. 自动属性有什么风险? 6. 特性是什么?如何使用? 7. 下面的代码输出什么结果?为什么? List<Action> acs = new List<Action>(5); for (int i = 0; i < 5; i++) { acs.Add(() => { Console.

.NET面试题1

1. const和readonly有什么区别? const关键字用来声明编译时常量,readonly用来声明运行时常量.都可以标识一个常量,主要有以下区别: 1.初始化位置不同.const必须在声明的同时赋值:readonly即可以在声明处赋值,也可以在构造方法里赋值. 2.修饰对象不同.const即可以修饰类的字段,也可以修饰局部变量:readonly只能修饰类的字段 . 3.const是编译时常量,在编译时确定该值,且值在编译时被内联到代码中:readonly是运行时常量,在运行时确定该值.