在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ java中的抽象類到底什么作用?感覺(jué)完全是雞肋啊

java中的抽象類到底什么作用?感覺(jué)完全是雞肋啊

我要規(guī)范代碼,直接寫(xiě)接口然后用一個(gè)類實(shí)現(xiàn)這個(gè)接口不就好了,抽象類在實(shí)際的開(kāi)發(fā)中到底有沒(méi)有什么獨(dú)特的作用?

回答
編輯回答
久礙你

例子我就不舉了,直接說(shuō)抽象類的作用在哪里。

一、抽象類與一般類的區(qū)別在于抽象方法。它的理念是對(duì)某個(gè)操作下一個(gè)定義,但交給子類去實(shí)現(xiàn)。

你可能會(huì)說(shuō),一般類也可以定義一個(gè)空方法,然后交給子類實(shí)現(xiàn)啊,但這么做因?yàn)闆](méi)有在語(yǔ)法上強(qiáng)迫子類一定要實(shí)現(xiàn)這個(gè)方法,所以如果子類忘了去實(shí)現(xiàn)的話,軟件出錯(cuò)的幾率會(huì)很高。

二、抽象類與接口的區(qū)別在于,它可以包含成員。

當(dāng)然,古時(shí)候 Java 接口不支持缺省方法,但有了缺省方法的接口,仍然不能代替抽象類,因?yàn)闆](méi)有成員。

接口之所以不能有成員,是因?yàn)樗皇菍?duì)象行為的抽象。當(dāng)你需要定義一個(gè)類型,既包含行為抽象,又包含成員來(lái)供子類使用時(shí),顯然只有抽象類可以滿足了。

2017年4月7日 21:28
編輯回答
薔薇花

如果你看JDK的源碼,就會(huì)發(fā)現(xiàn),大部分情況下,你用到的方法,他的父類都是一個(gè)抽象類,而不是一個(gè)直接的接口。原因主要有兩個(gè),接口確實(shí)是用來(lái)定義規(guī)范的,同一個(gè)接口下,可能有大量不同的實(shí)現(xiàn),舉個(gè)例子,List這個(gè)接口

boolean add(E e);
boolean remove(Object o);
boolean addAll(Collection<? extends E> c);
......

但是你去看ArrayList,第一個(gè)繼承的是AbstractList(抽象類),然后你去看LinkedList,第一個(gè)繼承是AbstractSequentialList(抽象類),而AbstractSequentialList也是繼承自AbstractList,你肯定知道ArrayList和LinkedList的區(qū)別咯。為什么這么做呢,因?yàn)橛泻芏喾椒ㄊ强梢詮?fù)用的,比如

public int indexOf(Object o);
public int lastIndexOf(Object o);
......

如果你純粹用接口的話,你需要寫(xiě)很多重復(fù)的代碼,一旦修改,你就麻煩了。抽象類的目的在于,你可以更細(xì)致化的表明哪些是不同的,哪些是相同的。所以這就是接口和抽象類的簡(jiǎn)單區(qū)別。如果還不理解,你可以看看collection容器類的源碼,就會(huì)發(fā)現(xiàn)了。

2017年12月29日 05:59
編輯回答
久舊酒

將部分共有代碼在抽象類中實(shí)現(xiàn)。這里舉一個(gè)在HEAD FIRST DESIGN PATTERNS中的一個(gè)例子。

假設(shè)現(xiàn)在有各種各樣的鴨子,比如橡皮鴨,野鴨。這些鴨子有的能飛有的不能飛,但是它們都有兩個(gè)翅膀,都能發(fā)出聲音。根據(jù)需求我們會(huì)得出以下實(shí)現(xiàn)。
public abstract class Duck{
    private Wing leftWing;
    private Wing rightWing;
    
    public void quack(){
        ...
        //quack quack
    }
}

public interface Flyable{
    void fly();
}

public class RubberDuck extends Duck implements Flyable{
    public void fly(){
        ...
        //cannot fly
    }
}

public class NormalDuck extends Duck implements Flyable{
    public void fly(){
        ...
        //fly gracefully
    }
}

其實(shí)抽象類本質(zhì)是為了提高代碼的復(fù)用性。在JAVA中的應(yīng)用還是很廣泛的。比如說(shuō)Collection接口之下的AbstractCollection抽象類。

當(dāng)你想要對(duì)某個(gè)接口進(jìn)行默認(rèn)實(shí)現(xiàn),并且不希望在該實(shí)現(xiàn)上創(chuàng)建實(shí)例,那么抽象類是一個(gè)很好的選擇。

2018年3月29日 01:50