3 回答

TA貢獻1850條經驗 獲得超11個贊
我先給你舉個例子:
public interface LoginAuth{ public String encryptPassword(String pass); public void checkDBforUser();}
現在假設您的應用程序中有3個數據庫。然后,該數據庫的每個實現都需要定義上述兩種方法:
public class DBMySQL implements LoginAuth{ // Needs to implement both methods}public class DBOracle implements LoginAuth{ // Needs to implement both methods}public class DBAbc implements LoginAuth{ // Needs to implement both methods}
但是如果encryptPassword()不依賴于數據庫,那么每個類都是一樣的呢?那么以上就不是一個好方法。
相反,請考慮這種方法:
public abstract class LoginAuth{ public String encryptPassword(String pass){ // Implement the same default behavior here // that is shared by all subclasses. } // Each subclass needs to provide their own implementation of this only: public abstract void checkDBforUser();}
現在在每個子類中,我們只需要實現一個方法 - 與數據庫相關的方法。
我盡我所能,希望這會清除你的疑慮。

TA貢獻1796條經驗 獲得超7個贊
在這個世界上沒有什么是完美的。他們可能期待更多實用的方法。
但是在您的解釋之后,您可以使用稍微不同的方法添加這些行。
接口是規則(規則,因為您必須為它們提供一個您不能忽略或避免的實現,以便它們像規則一樣強制執行),這些規則在軟件開發中的各個團隊之間起著共同的理解文檔的作用。
接口提供了想要做什么但不知道如何做的想法。因此,實現完全依賴于開發人員遵循給定的規則(意味著給定方法的簽名)。
抽象類可以包含抽象聲明,具體實現或兩者。
抽象聲明就像要遵循的規則,具體實現就像指南(你可以按原樣使用它,或者你可以通過覆蓋并給它自己的實現來忽略它)。
此外,具有相同簽名的哪些方法可以改變不同上下文中的行為作為接口聲明被提供作為在不同上下文中相應地實現的規則。
編輯: Java 8有助于在接口中定義默認和靜態方法。
public interface SomeInterfaceOne { void usualAbstractMethod(String inputString); default void defaultMethod(String inputString){ System.out.println("Inside SomeInterfaceOne defaultMethod::"+inputString); }}
現在當一個類實現SomeInterface時,并不是必須為接口的默認方法提供實現。
如果我們有另外一個接口,有以下方法:
public interface SomeInterfaceTwo { void usualAbstractMethod(String inputString); default void defaultMethod(String inputString){ System.out.println("Inside SomeInterfaceTwo defaultMethod::"+inputString); }}
Java不允許擴展多個類,因為它導致“鉆石問題”,其中編譯器無法決定使用哪個超類方法。使用默認方法,接口也會出現菱形問題。因為如果一個類正在實現兩者
SomeInterfaceOne and SomeInterfaceTwo
并且沒有實現常見的默認方法,編譯器無法決定選擇哪一個。為了避免這個問題,在java 8中必須實現不同接口的通用默認方法。如果任何類正在實現上述接口,則必須為defaultMethod()方法提供實現,否則編譯器將拋出編譯時錯誤。
添加回答
舉報