亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我不能在接口中聲明靜態方法?

為什么我不能在接口中聲明靜態方法?

慕姐8265434 2019-11-08 10:49:30
該主題充分說明了這一點-為什么不能在接口中聲明靜態方法的原因是什么?public interface ITest {    public static String test();}上面的代碼給了我以下錯誤(至少在Eclipse中):“接口方法ITest.test()的非法修飾符;僅允許public和abstract”。
查看完整描述

3 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

這里有一些問題。第一個問題是聲明靜態方法而不定義它的問題。這是之間的區別


public interface Foo {

  public static int bar();

}


public interface Foo {

  public static int bar() {

    ...

  }

}

出于Espo提到的原因,第一個是不可能的:您不知道哪個實現類是正確的定義。


Java 可以允許后者。實際上,從Java 8開始,它確實做到了!


查看完整回答
反對 回復 2019-11-08
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

接口中不能使用靜態方法的原因在于Java解析靜態引用的方式。嘗試執行靜態方法時,Java不會費心尋找類的實例。這是因為靜態方法不依賴于實例,因此可以直接從類文件中執行。假設接口中的所有方法都是抽象的,則VM必須尋找該接口的特定實現,以便找到靜態方法后面的代碼,以便可以執行它。然后,這與靜態方法解析的工作方式矛盾,并會在語言中引入不一致之處。


查看完整回答
反對 回復 2019-11-08
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

謊言在設計原理的原因,那Java不允許多重繼承。下例可以說明多重繼承的問題:


public class A {

   public method x() {...}

}

public class B {

   public method x() {...}

}

public class C extends A, B { ... }

現在,如果您調用Cx()會發生什么?將執行Ax()還是Bx()?具有多重繼承的每種語言都必須解決此問題。


接口在Java中允許某種受限的多重繼承。為避免上述問題,不允許他們使用方法。如果我們在接口和靜態方法上看同樣的問題:


public interface A {

   public static method x() {...}

}

public interface B {

   public static method x() {...}

}

public class C implements A, B { ... }

同樣的問題在這里,如果調用Cx()會發生什么?


查看完整回答
反對 回復 2019-11-08
  • 3 回答
  • 0 關注
  • 1004 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號