先看看@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的使用