我有一個包含Java中的公共靜態方法的類。在java中是否有任何註釋來警告子類不要使用相同的方法簽名(從而隱藏超類方法)。任何其他解決方法也可以。是否有任何註釋來警告子類不應該隱藏Java中的靜態方法
回答
只是要超類方法final
:
class Foo {
public static final void go() {}
}
class Bar extends Foo {
public static void go() {}; // Error
}
我誤解了'final'關鍵字不適用於靜態方法。現在想出來,謝謝。 – Jasir
你不需要這樣的註解,因爲什麼你試圖在不打算編辦......在Java
你就不能覆蓋靜態方法
爲@thomas建議(+ 1 dafuer),您可以用靜態方法 例子的知名度發揮:
public class Calculator {
static int add(int a, int b) {
System.out.println("a+b= " + (a + b));
return a + b;
}
public static void main(String[] args) {
}
}
然後
public class ScientificCalculator extends Calculator {
public int add(int a, int b) {
System.out.println("11111");
return a + b;
}
}
我不知道有任何這樣的註解來標記該方法的聲明。然而,你可以從相反的方向來解決這個問題。不要關注方法聲明,你可以看看它的用法。 -Xlint:all
將發出警告,如果任何使用可能是一個問題。在其超類中具有與靜態方法相同簽名的靜態方法只會在該方法從實例引用而不是靜態時引發問題。考慮下面的例子:
public class Foo {
public static String getFoo(){
return "foo";
}
}
public class Bar extends Foo {
public static void main(String[] args){
Bar bar = new Bar();
String s = bar.getFoo(); // Actually calls Foo.getFoo()
System.out.println(s); // Prints "foo"
}
}
在上面的代碼中,我們通過的Bar
實例引用從Foo
靜態getFoo()
方法。 bar.getFoo()
行實際上調用Foo
的靜態方法。現在假設我們有相同的簽名Bar
添加靜態方法:
public class Bar extends Foo {
public static String getFoo(){
return "bar";
}
public static void main(String[] args){
Bar bar = new Bar();
String s = bar.getFoo(); // Actually calls Bar.getFoo()
System.out.println(s); // Prints "bar"
}
}
這個隱藏Bar
的Foo.getFoo()
方法現在Bar.getFoo()
方法,而不是調用。在真實情況下,這幾乎肯定會突破Bar
。如果用-Xlint:all
選項編譯,那麼你會得到這樣的信息:
warning: [static] static method should be qualified by type name, Foo, instead of by an expression
你會注意到這一點,當你編譯Bar
的第一個版本,你可以把它固定到String s = Foo.getFoo()
的時候了。之後當getFoo
也被添加到Bar
時,原始代碼仍然可以工作,因爲它明確引用了Foo
中的方法。如果您總是通過引用聲明它們的類來顯式調用靜態方法,那麼在子類中使用相同方法的唯一問題就是它不完全是最佳實踐。也許有一種方法可以標記聲明,但我會專注於確保正確使用靜態方法。
- 1. 是否有任何合法的理由來隱藏靜態方法?
- 2. 警告:靜態方法應該以靜態方式訪問
- 3. 用於覆蓋(隱藏)靜態方法的等效於@Override的任何註釋?
- 4. 如何解決「靜態方法___應該以靜態方式訪問」警告
- 5. 爲什麼父類的靜態方法隱藏在子類中?
- 6. 我應該在MKMapView中刪除還是隱藏我的註釋?
- 7. Java註釋 - 是否有任何助手庫來讀取/處理註釋?
- 8. 是否有任何Java庫使用註釋來生成代碼?
- 9. 檢查類是否有靜態方法
- 10. ASP.NET代碼隱藏類中的靜態方法是否非線程安全?
- 11. 靜態嵌套類中的方法是隱式靜態的嗎?
- 12. 是否有FindBugs的一類註釋忽略文件中的所有警告
- 13. 是否有任何方法將註釋添加到警報對話框?
- 14. make方法makeEvent()是否有任何優點是靜態的?
- 15. iOS - 在靜態庫中是否有任何獲取低內存警告的方法?
- 16. 我應該去靜態方法還是非靜態方法?
- 17. 在註釋中隱藏使用@hide的方法/類
- 18. 有沒有任何方法來隱藏android VideoView中的字幕?
- 19. 隱藏靜態方法vs覆蓋非靜態方法
- 20. 是否有任何理由爲什麼我的存儲庫方法不應該是靜態的?
- 21. 用於確定註釋方法是否執行的Java註釋
- 22. 類只有方法,應該是單身或靜態
- 23. 聲納警告:不訪問實例數據應該是「靜」,「私人」的方法
- 24. 在java中隱藏警告消息
- 25. 嚴格警告:非靜態方法
- 26. 是否有人使用Cobertura的ant任務來排除帶註釋的java類?
- 27. 任何方法來隱藏j_spring_security_check
- 28. 爲什麼不是@Deprecated註釋觸發有關方法的編譯器警告?
- 29. CSS - 隱藏是否有子類
- 30. JAVA:什麼時候該類應該是靜態或動態的
的Eclipse(也可能是最重要的IDE)發出有關警告。除此之外,還有像[PMD](https://pmd.github.io/)這樣的靜態代碼分析工具,您可以將它們合併到構建過程中。 – Thomas
@litelite你不能覆蓋靜態方法。 – Thomas
您寫了「...不要使用相同的方法名稱...「 - 你的意思是你不僅要警告子類方法隱藏超類的方法,還要警告它_overloads_它(即不同的參數)? – Thomas