Abstraktseid klasse ja liideseid kasutatakse peamiselt abstraktsioonide saamiseks, kuid need on üksteisest väga erinevad. Mõlemad on Java põhiosa, kuid neil on oma rakenduste kasutused. Ehkki mõlemad terminid võivad olla üksteisega sünonüümid, ei saa neid kasutada vaheldumisi.
Nende kahe vahel on olulisi erinevusi. Kuigi liidese meetod on vaikimisi abstraktne, võib abstrakt sisaldada nii abstraktseid kui ka mitteabstraktseid meetodeid. Noh, alates Java 8-st on liidestel ka meetodite juurutamine ja Java-s võivad neil olla nii staatilised kui ka vaikimisi meetodid. Uurime üksikasjalikult nende kahe erinevust.
Java abstraktne klass on klass, mis kuulutatakse abstraktseks - see võib sisaldada või mitte sisaldada abstraktseid meetodeid. See on üsna sarnane Java-liidesega, välja arvatud asjaolu, et see võib sisaldada vaikemeetodi rakendamist. Nagu objektorienteeritud programmeerimisel, saavutatakse ka Java abstraktsioon abstraktsete klasside ja liideste abil. Java keeles tähendab abstraktsioon kasutaja jaoks ebaoluliste detailide peitmist, et keskenduda ainult olulistele detailidele, et suurendada tõhusust, vähendades seeläbi keerukust. Märksõna “abstraktne” kasutatakse abstraktse klassi loomiseks vahetult enne klassi märksõna klassideklaratsioonis.
Abstraktne klass võib sisaldada või mitte sisaldada abstraktsioonimeetodeid (meetodid ilma kehata), kuid kui klassil on vähemalt üks abstraktsioonimeetod, tuleb see tunnistada abstraktseks. Mitteabstraktseid meetodeid saab kasutada ka ainult abstraktses klassis, kuid ainult vaikekäitumise rakendamiseks. Abstraktse klassi meetoditel võivad olla juurdepääsu modifikaatorid, näiteks privaatsed, avalikud, staatilised ja kaitstud, sõltuvalt nähtavuse tasemest. Abstraktset klassi ei saa kiirendada ja see ei taga 100-protsendilist abstraktsiooni, kuna sellel võib olla konkreetne meetod.
Ehkki liides näeb välja nagu klass, pole seda. Kuna Java ei toeta mitut pärimist, on mõnikord liides klass hierarhia jaoks aluse loomiseks ideaalne. Liides on rohkem klassi plaan, mida kasutatakse ka Java abstraktsioonide saavutamiseks. See sisaldab abstraktseid meetodeid ja staatilisi konstante. Lihtsamalt öeldes on liides abstraktsete meetodite kogum, mida kasutatakse käitumise täpsustamiseks, mida klass peab rakendama. Erinevalt abstraktsest klassist pakub liides Java täielikku abstraktsiooni. Sellel võivad olla nii meetodid kui ka muutujad nagu klassil, kuid liideses deklareeritud meetodid on vaikimisi abstraktsed.
Abstraktne klass | Liides |
Abstraktset märksõna kasutatakse abstraktse klassi loomiseks ja seda saab kasutada meetoditega. | Liidese loomiseks kasutatakse liidese märksõna, kuid seda ei saa meetoditega kasutada. |
Klass võib laiendada ainult ühte abstraktset klassi. | Klass saab rakendada rohkem kui ühte liidest. |
Abstraktsel klassil võivad olla nii abstraktsed kui ka mitteabstraktsed meetodid. | Liidesel võib olla ainult abstraktseid meetodeid. |
Muutujad pole vaikimisi lõplikud. See võib sisaldada mitte-lõplikke muutujaid. | Muutujad on liideses vaikimisi lõplikud. |
Abstraktne klass võib pakkuda liidese rakendamist. | Liides ei saa pakkuda abstraktse klassi rakendamist. |
Sellel võib olla meetodeid koos rakendustega. | See pakub absoluutset abstraktsiooni ja sellel ei saa olla meetodi rakendusi. |
Sellel võivad olla avalikud, privaatsed, staatilised ja kaitstud juurdepääsu modifikaatorid. | Meetodid on Java-liideses kaudselt avalikud ja abstraktsed. |
See ei toeta mitut pärimist. | See toetab mitut pärandit. |
See on ideaalne koodi korduvkasutuse ja evolutsiooni perspektiivi jaoks. | See sobib ideaalselt tüübi deklareerimiseks. |
Abstraktsiooniks kasutatakse nii abstraktset klassi kui ka liidest; siiski on neil erinevustest õiglane osa. Peamine erinevus nende kahe vahel on tingitud abstraktsioonimeetoditest. Ehkki esimesel võib olla abstraktseid meetodeid või mitte, on viimane kaudselt abstraktne. Abstraktsel klassil võivad olla nii abstraktsed kui ka mitteabstraktsed meetodid. Teisest küljest võivad liidesed omada ainult abstraktseid meetodeid, seega ei saa neid rakendada, mis tähendab lihtsalt seda, et liidesel ei saa olla mitteabstraktseid meetodeid. Abstraktset klassi ei saa realiseerida, mis keelab objekti loomise. Liides seevastu võib tunduda klass, kuid see pole nii.