Abstraktne klass vs Java-liides
Jaotuses abstraktse klassi ja liidese erinevuste mõistmiseks on oluline kõigepealt mõista neid kõiki iseseisvalt. Java abstraktset klassi kasutatakse ühiste omadustega alamklasside deklareerimisel. Abstraktse klassi üldkasutus on teiste klasside superklass, mis tegelikult võimaldab sellel abstraktset klassi laiendada. Abstraktse klassi deklareerimisel kasutatakse abstraktset märksõna. Nii nagu igal teisel klassil, on abstraktsel klassil väljad, mis kirjeldavad meetodeid ja omadusi, mida klass saab täita. Ainuüksi abstraktse klassi kuulutamisega ei saa klassi algatada
Java-liidest saab võrdsustada protokolliga. See kujutab etteantud ja kokkulepitud käitumist, mis võimaldab hõlbustada omavahel mitteseotud objektide koostoimimist. Sõltuvalt kasutajast hoiab liides võtit erinevate rakendatavate toimingute jaoks. Liides on seega lüli tootja ja tarbija vahel. Java liidesed on seega rühm meetodeid, mis sisaldavad tühje kehasid ja millel võivad olla püsivad deklaratsioonid. Klassi paljastamisel Java-liidesele tähendab see, et klassile oodatav käitumine on kõigi liidese meetodite rakendamine.
Erinevused
Esiteks lubab abstraktne klass väljad, mis pole staatilised ega lõplikud, vastupidiselt liidestes kasutatavatele staatilistele ja lõplikele väljadele. Liidestes ei tohi olla kasutatud rakenduskoodi ja abstraktses klassis võib kasutada rakenduskoodi. Abstraktses klassis kasutuselevõetud rakenduskoodidel võib olla mõni või kõik rakendatud meetodid. Vaikimisi on kõik liidese meetodid abstraktsed.
Nähtavus on võimalik ka abstraktse klassi meetodite või liikmete puhul, mis võivad varieeruda, näiteks avalik, kaitstud, privaatne või puudub. Teisest küljest saab liidese nähtavust eeldada ainult ühe nähtavuse režiimi jaoks, mis on “avalik”.
Abstraktne klass pärib objektiklassi automaatselt. Tegelikult tähendab see, et kaasatud on sellised meetodid nagu kloon () ja ekvivalent (). Liideses pole objektiklassi pärimine võimalik. Pärast seda on abstraktsel klassil võimalus omada konstruktorit, kuid liidesel seda ei saa olla.
Java liidesel on ka mitme pärandi rakendamisel väga oluline funktsioon, kuna klassil võib olla ainult üks superklass. Ehkki kohal võib olla ainult üks superklass, saab seda rakendada ükskõik millises liideses. Abstraktses klassis ei saa olla mitu pärandit.
Toimivuse osas kipuvad liidesed, võrreldes abstraktse klassiga, olema aeglasemad, peamiselt seetõttu, et klassis on vaja leida vastav meetod. Erinevus on aga tänu kaasaegsetele Java virtuaalsetele masinatele, mida pidevalt täiustatakse, muutunud aeglasemaks.
Meetodi lisamiseks liidesesse peate leidma kõik rakendusliigid, mis rakendavad konkreetset liidest. Teise võimalusena saate liidest laiendada, et võimaldada sellel täiendavaid meetodeid. Kui juhtub, et tegemist on abstraktse klassiga, on vaja ainult lisada meetodi vaiketäitmine ja kood töötab edasi. Kuivõrd abstraktsete klasside ja liideste vahel on erinevusi, on oluline märkida, et need ei ole konkurendid, vaid siin nimetatud erinevused täiendavad üksteist.
Kokkuvõte
Klassi abstraktsed väljad ei ole staatilised ega lõplikud, erinevalt liidest, millel on staatilised ja lõplikud tabelid.
Liidestes ei saa kasutada ühtegi rakenduskoodi, samas kui seda saab kasutada abstraktses klassis.
Liidese nähtavus võib olla ainult avalik, samas kui klassi abstraktne nähtavus võib varieeruda.
Abstraktne klass pärib objektiklassi automaatselt, kuid liideses pole see võimalik.
Abstraktne klass on rakenduses kiirem kui liides.