zoukankan      html  css  js  c++  java
  • @Override注解的使用

    先看看@Override注解在Java SE中的声明:

    package .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 春晨
     * @date 2019/1/14 20:25
     * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10280122.html
     */
    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 春晨
     * @date 2019/1/14 20:25
     * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10280122.html
     */
    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 春晨
     * @date 2019/1/16 23:24
     * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10280122.html
     */
    public interface Animal {
    
        @Override
        int hashCode();
    
        @Override
        boolean equals(Object o);
    
        @Override
        String toString();
        
    }

    注意:只能覆写Object示例中的三个方法,对于protected finalize()方法或者final修饰的方法是不能覆写的。

    下节继续

        下节将给大家讲解预定义注解@SuppressWarnings的使用

  • 相关阅读:
    HDUOJ--4565 So Easy!
    简单的java实验,涉及到 类继承以及接口问题,方法体的重写(区别于重载)
    java 快速求素数
    狄斯奎诺(dijkstra 模板)
    2014 蓝桥杯 阶梯报告(含代码 详细讲解)
    HDUOJ---汉洛塔IX
    小错误系列
    HDUOJ-----4510 小Q系列故事——为什么时光不能倒流
    HDUOJ----4509湫湫系列故事——减肥记II
    HDUOJ-----4506小明系列故事——师兄帮帮忙
  • 原文地址:https://www.cnblogs.com/springmorning/p/10280122.html
Copyright © 2011-2022 走看看