簡體   English   中英

為什么不能使用簽名相同的靜態和非靜態方法呢?

[英]Is there a reason why one can't have a static and a non-static method with identical signature?

我只是意識到以下內容無法編譯:

class MyCoolClass {
    static void do(){..}
    void do(){..}
}

有充分的理由為什么不允許這樣做? 也許會導致我目前缺少的某些問題?

我目前只能看到的唯一問題是,有人可能會嘗試調用靜態方法,而實際上是調用非靜態方法。 但這聽起來可以與彼此隱藏的子類上的靜態方法媲美,所以我不會認為這是“好的”理由。

如果認為該對象在該方法的第0個參數上調用了一個方法,那么它甚至是正常的方法重載。

如果您想知道:我想擁有它,因為它允許為new MyCoolClass().do()作為MyCoolClass.do()或靜態導入(甚至與do()創建快捷方式。

這是因為Java編譯器使用方法的名稱和參數類型的有序列表來唯一地標識類中的方法。 static是修飾符標志,不被視為唯一標識的一部分。 唯一標識在運行時也很重要,因為類文件僅包含標識該方法所需的那些鍵。 方法所在的類名稱,然后是方法名稱,然后是參數列表。

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.4.3.3

我認為在創建對象時可能很難處理。 您可能知道,可以通過對象引用調用靜態函數,例如:

SomeClass s = new SomeClass();
s.do(); //can be static method, can be normal method

當然,很少有人通過對象調用靜態方法,但是有可能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM