2010-04-14 81 views
3

問題是爲什麼決定將變量作爲final和static以及方法默認爲public和abstract。接口變量是最終的,默認情況下是靜態的,方法是公共的和抽象的

是否有任何特定的原因使它們隱含,變量如final和static以及方法爲public和abstract。

爲什麼他們不允許靜態方法,但允許靜態變量?

我們有接口在Java中具有多繼承的特性,並避免鑽石問題。但是它如何解決鑽石問題,因爲它不允許使用靜態方法。

在下面的程序中,兩個接口都有相同名稱的方法..但是隻實現一個我們實現...這是如何解決鑽石問題的?

interface testInt { 
    int m = 0; 
    void testMethod(); 
} 

interface testInt1 { 
    int m = 10; 
    void testMethod(); 
} 

public class interfaceCheck implements testInt, testInt1{ 
     public void testMethod() { 
      System . out . println ("m is"+ testInt.m); 
      System . out . println ("Hi World!");  
     } 
} 

回答

5

正如我所看到的,接口聲明瞭一組實現者必須擁有的能力。它指的是「什麼」而不是「如何」;它比實施指南更多地是一個規範。

因此,不公開的方法在界面中是不相關的。與非靜態數據成員相同,這與成員的具體實現更相關。

0

我認爲接口中不允許非靜態變量主要是爲了實用的原因。多重繼承可以以這種方式更高效,並且避免了一些模棱兩可的問題。

顧名思義,接口只是一個實例上可用操作的定義,因此它不包含任何方法實現。

由於這些原因,允許方法不公開而變量不是靜態的是沒有意義的。

這就是說,我不確定接口的默認值是不是類的好主意。

1

至於爲什麼他們是他們的默認值 - 這只是語言規範。他們設計的就是這樣。

它們不允許在接口中使用靜態方法,因爲接口不具備任何功能。這只是界面的定義。

由於接口不包含代碼,Java沒有鑽石問題。如果你的接口被允許有代碼,那麼Java將無法確定它是否應該調用testInt的testMethod()或testInt1的testMethod()。由於接口沒有代碼,因此Java知道testMethod只有1個實現需要運行代碼。

相關問題