簡體   English   中英

靜態和非靜態相互重載

[英]are static and non static overloads each other

這兩個功能是否過載

class yogi{

   public static void fun(){
    System.out.println("Fun");
   }    

   public void fun(int a,int b){
    System.out.println("int");
   }

}

是的,那些是超載。 來自JLS 8.4.9

如果一個類的兩個方法(無論是在同一個類中聲明,還是由一個類繼承,或者一個是聲明的,一個是繼承的)都具有相同的名稱,但簽名不是覆蓋等效的,那么方法名稱就是超載。

對於靜態和實例方法具有相同名稱是一個好主意是相當罕見的(IMO),但它完全有效。

有趣的是,這可能會導致重載解析出現問題,因為即使沒有實例調用方法,也會包含方法。 例如:

public class Test {
    public void foo(String x) {
    }

    public static void foo(Object x) {
    }

    public static void bar() {
        foo(""); // Error
    }
}

規范本來可以設計成這樣就好了(並調用靜態方法)但是它是一個錯誤:

Test.java:9: error: non-static method foo(String) cannot be referenced
                    from a static context
        foo("");
        ^

我想是的。 他們重載方法名稱“fun”。

關於重載的一些好處可以在這里找到

“方法重載也稱為靜態多態。

注意事項:
靜態多態性也稱為編譯時綁定或早期綁定。
2.靜態綁定在編譯時發生。 方法重載是靜態綁定的一個例子,其中方法調用與其定義的綁定發生在編譯時。“

例如,下面的代碼給出了編譯時錯誤:類型中的重復方法fun(int,int)...

public static void fun(int a, int b) {
    System.out.println("int");
}

public void fun(int a, int b) {
    System.out.println("int");
}

從編譯時綁定的角度來看,實例方法和靜態方法不能分開,因為靜態方法也可以在實例變量上調用,而不僅僅是類引用。 並且編譯器必須明確地解決。

暫無
暫無

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

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