2017-07-19 72 views
-4

我們可以通過接口實現一切,比如它解決了我們多重繼承的主要問題,我們可以實現100%的抽象。那麼什麼是使用抽象類爲什麼使用抽象如果我們有接口

見我已經讀了抽象類可以擴展並通過密切相關的類對於如使用的需要:環狀延伸形狀等

我還讀了一個接口可以用於增加像類實現Comparable,Runnable,Serializable等功能。

因此,因爲我們可以做任何事情與接口(即使抽象類可以做的事情),那麼需要什麼抽象類。

在抽象類中還有什麼是非抽象方法的用法。

+2

已回覆1000次 –

+0

*「在抽象類中使用非抽象方法有什麼用途」*作爲示例,請參見[Template method pattern](https://en.wikipedia.org/wiki/)。 Template_method_pattern) – Andreas

回答

0

抽象類允許您定義領域所以很容易實現一些狀態基本實現。

在Java之前,在接口中沒有默認方法,所以如何提供默認方法實現的唯一方法就是創建抽象類。

由於Java 8,你可以在界面默認的方法靜態方法定義,但還是有沒有字段。

什麼是一個抽象類

中的方法未標記爲抽象使用非抽象方法可以用作在標準類的標準方法。你有非抽象和抽象方法的原因是,某些類的功能(某些方法)可能依賴於抽象方法。這裏有一個例子:

public class AbstractGreeting { 
    private final String name; 
    protected AbstractGreeting(String name) {this.name = name;} 
    public void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");}   
    protected abstract String getGreeting(); 
} 

一些形而下的實現:

public class HelloGreeting extends AbstractGreeting { 
    public HelloGreeting(String name) { super(name);} 
    @Override protected String getGreeting() { return "Hello"; } 
} 

public class AlohaGreeting extends AbstractGreeting { 
    public AlohaGreeting (String name) { super(name);} 
    @Override protected String getGreeting() { return "Aloha"; } 
} 

與用法:

HelloGreeting hg = new HelloGreeting("World"); hg.displayGreeting(); 
AlohaGreeting ag= new AlohaGreeting ("World"); hg.displayGreeting(); 

當然,抽象類可以轉化爲,當你強迫implementator返回對象的接口州。例如抽象類以上可改寫爲:

public interface Greeting { 
    String getName(); 
    String getGreeting(); 
    default void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");} 
} 

實現:

public class HelloGreeting implements Greeting { 
    @Override public String getName() {return "World";} 
    @Override public String getGreeting() {return "Hello";} 
} 

但有時,最好是不提供訪問對象的狀態,因此,抽象類可能在某些情況下更適合。

+0

所以如果我們對所有子類都有一些通用的實現,我們可以使用非抽象方法,以避免所有子類中的代碼重複,比如displayGreeting()方法在這裏準確地說是 – Anshul

+0

@Anshul。 – matoni

+0

非常感謝@matoni! – Anshul

0

我認爲有很多這樣的重複問題,我發現this。 從e-satis幾個引用:

與接口不同,抽象類是類。它們使用起來更加昂貴,因爲在從它們繼承時需要查找。 抽象類看起來很像接口,但他們有更多的東西:你可以爲它們定義一個行爲。這更多的是關於一個人說:「這些班級應該是這樣的,他們有這個共同點,所以填空!」。

總之,區別在於interfaceabstract class是不同的抽象層次。 interface更抽象,因爲它只定義了您必須實現的功能,如C中的函數簽名。然而,abstract class將進一步定義函數的行爲。另外,您可以在abstract class中定義字段,而在interface中則不能這樣做。

相關問題