亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我該如何解釋Interface和Abstract類之間的區別?

我該如何解釋Interface和Abstract類之間的區別?

心有法竹 2019-08-14 16:14:08
我該如何解釋Interface和Abstract類之間的區別?在我的一次訪談中,我被要求解釋Interface和Abstract類之間的區別。這是我的回答:Java接口的方法是隱式抽象的,不能有實現。Java抽象類可以具有實現默認行為的實例方法。在Java接口中聲明的變量默認為final。抽象類可能包含非最終變量。默認情況下,Java接口的成員是公共的。Java抽象類可以具有類似私有,受保護等類通常的類成員。應使用關鍵字“implements”實現Java接口; 應使用關鍵字“extends”擴展Java抽象類。接口只能擴展另一個Java接口,抽象類可以擴展另一個Java類并實現多個Java接口。Java類可以實現多個接口,但它只能擴展一個抽象類。然而,面試官并不滿意,并告訴我這個描述代表了“ 書本知識 ”。他告訴我一個更實際的回答,解釋我何時會使用實際例子在界面上選擇一個抽象類。我哪里做錯了?
查看完整描述

3 回答

?
慕蓋茨4494581

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();}

現在在每個子類中,我們只需要實現一個方法 - 與數據庫相關的方法。

我盡我所能,希望這會清除你的疑慮。


查看完整回答
反對 回復 2019-08-14
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

在這個世界上沒有什么是完美的。他們可能期待更多實用的方法。

但是在您的解釋之后,您可以使用稍微不同的方法添加這些行。

  1. 接口是規則(規則,因為您必須為它們提供一個您不能忽略或避免的實現,以便它們像規則一樣強制執行),這些規則在軟件開發中的各個團隊之間起著共同的理解文檔的作用。

  2. 接口提供了想要做什么但不知道如何做的想法。因此,實現完全依賴于開發人員遵循給定的規則(意味著給定方法的簽名)。

  3. 抽象類可以包含抽象聲明,具體實現或兩者。

  4. 抽象聲明就像要遵循的規則,具體實現就像指南(你可以按原樣使用它,或者你可以通過覆蓋并給它自己的實現來忽略它)。

  5. 此外,具有相同簽名的哪些方法可以改變不同上下文中的行為作為接口聲明被提供作為在不同上下文中相應地實現的規則。

編輯: 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()方法提供實現,否則編譯器將拋出編譯時錯誤。


查看完整回答
反對 回復 2019-08-14
  • 3 回答
  • 0 關注
  • 789 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號