1. 程式人生 > >我應該如何向面試官解釋介面和抽象類之間的區別?

我應該如何向面試官解釋介面和抽象類之間的區別?

在我的一次採訪中,我被要求解釋一個介面和一個抽象類的區別

這是我的迴應:

Java介面的方法是隱式抽象的,不能有實現。Java抽象類可以具有實現預設行為的例項方法。

在Java介面中宣告的變數預設為final。抽象類可能包含非最終變數。

Java介面的成員預設是公共的。Java抽象類可以具有通常的類成員的風格,如私有的,受保護的等等。

Java介面應該使用關鍵字“implements”來實現; Java抽象類應該使用關鍵字“extends”進行擴充套件。

一個介面只能擴充套件另一個Java介面,一個抽象類可以擴充套件另一個Java類並實現多個Java介面。

一個Java類可以實現多個介面,但它只能擴充套件一個抽象類。

然而,面試官並不滿意,並告訴我說這個描述代表“ 書本知識 ”。

他問我一個更實際的回答,解釋什麼時候我會通過一個介面選擇一個抽象類,並使用例項

我哪裡做錯了?

下面解釋:

一個介面由單體變數(public static final)和公共抽象方法組成。當我們知道該做什麼但是不知道如何去做時我們通常更喜歡實時使用一個介面

舉例來說,這個概念可以更好地理解:

考慮一個支付類。支付可以通過多種方式進行,例如PayPal,信用卡等。所以我們通常將Payment作為我們的介面,其中包含一個makePayment()方法,CreditCard和PayPal是兩個實現類。

publicinterfacePayment
{void makePayment();//by default it is a abstract method}publicclassPayPalimplementsPayment{publicvoid makePayment(){//some logic for PayPal payment//e.g. Paypal uses username and password for payment}}publicclassCreditCardimplementsPayment{publicvoid makePayment(){//some logic for CreditCard payment//e.g. CreditCard uses card number, date of expiry etc...
}}

在上面的例子中,CreditCard和PayPal是兩個實現類/策略。一個介面也允許我們使用Java中的多重繼承的概念,這是抽象類無法實現的。

我們知道要做什麼的某些功能以及我們知道如何執行的其他功能時我們會選擇一個抽象類

考慮下面的例子:

publicabstractclassBurger{publicvoid packing(){//some logic for packing a burger}publicabstractvoid price();//price is different for different categories of burgers}publicclassVegBergerextendsBurger{publicvoid price(){//set price for a veg burger.}}publicclassNonVegBergerextendsBurger{publicvoid price(){//set price for a non-veg burger.}}

如果我們將未來的方法(具體/抽象)新增到給定的抽象類中,那麼實現類將不需要更改其程式碼。但是,如果將來在介面中新增方法,則必須將實現新增到實現該介面的所有類中,否則編譯時會發生錯誤。

還有其他的不同之處,但這些主要的可能是面試官的期望。

轉載至:https://stackoverflow.com/questions/18777989/how-should-i-have-explained-the-difference-between-an-interface-and-an-abstract?rq=1