3 回答

TA貢獻1921條經(jīng)驗 獲得超9個贊
這里有一些問題。第一個問題是聲明靜態(tài)方法而不定義它的問題。這是之間的區(qū)別
public interface Foo {
public static int bar();
}
和
public interface Foo {
public static int bar() {
...
}
}
出于Espo提到的原因,第一個是不可能的:您不知道哪個實現(xiàn)類是正確的定義。
Java 可以允許后者。實際上,從Java 8開始,它確實做到了!

TA貢獻1820條經(jīng)驗 獲得超9個贊
接口中不能使用靜態(tài)方法的原因在于Java解析靜態(tài)引用的方式。嘗試執(zhí)行靜態(tài)方法時,Java不會費心尋找類的實例。這是因為靜態(tài)方法不依賴于實例,因此可以直接從類文件中執(zhí)行。假設(shè)接口中的所有方法都是抽象的,則VM必須尋找該接口的特定實現(xiàn),以便找到靜態(tài)方法后面的代碼,以便可以執(zhí)行它。然后,這與靜態(tài)方法解析的工作方式矛盾,并會在語言中引入不一致之處。

TA貢獻1841條經(jīng)驗 獲得超3個贊
謊言在設(shè)計原理的原因,那Java不允許多重繼承。下例可以說明多重繼承的問題:
public class A {
public method x() {...}
}
public class B {
public method x() {...}
}
public class C extends A, B { ... }
現(xiàn)在,如果您調(diào)用Cx()會發(fā)生什么?將執(zhí)行Ax()還是Bx()?具有多重繼承的每種語言都必須解決此問題。
接口在Java中允許某種受限的多重繼承。為避免上述問題,不允許他們使用方法。如果我們在接口和靜態(tài)方法上看同樣的問題:
public interface A {
public static method x() {...}
}
public interface B {
public static method x() {...}
}
public class C implements A, B { ... }
同樣的問題在這里,如果調(diào)用Cx()會發(fā)生什么?
添加回答
舉報