2016-04-18 26 views
-4

在Java中: 在Interface中聲明的函數的範圍是嚴格公開的嗎? 而 在Abstract類中聲明的函數的範圍可以是默認的,保護的或公共的!爲什麼在Java中Interface和Abstract類的功能範圍不同

我們知道,無論提供同樣的問題描述(按我的問題上) 即具體的類繼承它必須定義功能(S)。

那麼,爲什麼不同的規則呢?

回答

0

因爲接口定義爲public接口。在界面上定義非public方法(!)是沒有意義的。

abstract類上定義private方法非常合理。

1

接口定義了該類的外部公共接口。當你使用一個接口時,你不需要知道任何關於事情在內部完成的事情。

另一個抽象類只是聲明缺少一個工作實現。例如,一個相當常見的模式是:

abstract class x { 

    public void SomeTask() { 
     // ... 
     doSomeTask(); 
    } 

    protected abstract void doSomeTask(); 
} 
0

接口指定如何與類型進行交互。因此,所有事情都必須是公開的,因爲它必須全部都可以從實施它的課程之外獲得。 但是,抽象類可以包含protected,private或public,因爲它可以實現。它可以調用自己的受保護的方法,該方法將由一個子類實現。

0

抽象類中定義的方法可以在同一個類中執行。接口不執行任何代碼,因此創建私有的受保護方法沒有意義。接口是公開的,它們是實現的API。

2

首先,你所說的是「訪問」而不是「範圍」。弄清術語是否正確非常重要。範圍有不同含義在Java中。

abstract class實際上就像普通的class一樣,具有正常的實現細節(狀態變量和代碼)......除了一些實現被省略之外;即方法abstract。所以自然你需要完整的課堂語言功能。

A(pre-Java 8)interface是不同的。現在沒有州和沒有代碼,只是一個「合同」,任何執行class必須履行。

現在沒有完全解決這個問題,但是對於其餘的,我是指你這個問答& A - Protected in Interfaces - 這問爲什麼你不能在interface使用protected。正如你所看到的,沒有一個令人信服的答案。而是有多個回答建議,其中每個可能有效程度較低或較大程度。得到真實答案的唯一方法是詢問James Gosling等人。最終,這是在Java語言的早期階段進行的設計選擇。

那麼,爲什麼不同的規則呢?

因爲兩個構造的每一個的目的都不同。


1 - 使用Java 8,我們現在可以宣佈在interfacedefault方法。換句話說,現在可以在interface中存在代碼,儘管所有實現該接口的類都有相同的代碼。