2017-06-09 65 views
1
interface Rideable { 
    String getGait(); 
} 


public class Test implements Rideable { 
    int weight = 2; 

    String getGait() { 
     return " mph, lope"; 
    } 

    void go(int speed) { 
     ++speed; weight++; 
     int walkrate = speed * weight; 
     System.out.print(walkrate + getGait()); 
    } 
    public static void main(String[] args) { 
     new Test().go(8); 
    } 
} 

爲什麼它顯示上述錯誤?無法降低從Rideable繼承的方法的可見性

雖然運行此我得到編譯失敗

什麼是測試類中的方法getGait()的訪問符?

回答

2

在接口中聲明的方法默認爲public

而在重寫中,我們只能增加範圍,我們不能減少它。

在您重寫該方法的類中,您沒有提及public,因此默認情況下它認爲它是default(包私有)。所以它試圖縮小範圍,因此你會得到這個錯誤。

你需要做到以下幾點,

@Override 
public String getGait(){ 

} 
+0

太謝謝你了... –

+0

沒有問題。好答案。 – Michael

0

當你擴展包含默認方法的接口,你可以做到以下幾點:

  • 沒有提到的默認方法可言,這可以讓您的擴展接口繼承默認方法。

  • 重新聲明默認方法,這會使其變爲抽象。

  • 重新定義默認方法,其中覆蓋它。

你正在嘗試做的最後一個(即方法覆蓋),但要成功做到這一點,你必須保持方法簽名相同。只需添加訪問說明符 「公共」:

public String getGait() { 
    return " mph, lope"; 
} 
+0

謝謝。但是,如果您簡要介紹您提到的前兩點,這將會很有幫助。 –

+1

欲瞭解更多信息。 https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html。Reclare與重新定義不同。介意。 –