Abstrakt klasse og interface bruges begge primært til abstraktion, men de er meget forskellige fra hinanden. Begge er en kerne del af Java, men har deres egne applikationsanvendelser. Selvom begge udtryk kan være synonyme med hinanden, kan de ikke bruges om hverandre.
Der er betydelige forskelle mellem de to. Mens en grænseflademetode som standard er abstrakt, kan et abstrakt indeholde både abstrakte og ikke-abstrakte metoder. Nå, da Java 8 har grænseflader også metodeimplementeringer, og de kan have både statiske og standardmetoder i Java. Lad os studere forskellen mellem de to i detaljer.
En abstrakt klasse i Java er en klasse, der erklæres abstrakt - den kan muligvis ikke indeholde abstrakte metoder. Det ligner en Java-grænseflade bortset fra, at det kan indeholde standardmetodeimplementering. Ligesom i objektorienteret programmering opnås abstraktion i Java ved hjælp af abstrakte klasser og grænseflader. I Java betyder abstraktion at skjule de irrelevante detaljer for brugeren for kun at fokusere på de væsentlige detaljer for at øge effektiviteten og derved reducere kompleksiteten. Nøgleordet "abstrakt" bruges til at oprette en abstrakt klasse lige før klassens nøgleord i klassedeklarationen.
En abstrakt klasse kan muligvis ikke indeholde abstraktionsmetoder (metoder uden krop), men hvis en klasse har mindst en abstraktionsmetode, skal den erklæres abstrakt. Ikke-abstrakte metoder kan imidlertid kun bruges i en abstrakt klasse, men kun til at implementere standardadfærd. Metoderne i en abstrakt klasse kan have adgangsmodifikatorer som private, offentlige, statiske og beskyttede, afhængigt af synlighedsniveauet. En abstrakt klasse kan ikke instantieres, og den giver ikke 100 procent abstraktion på grund af det faktum, at den kan have en konkret metode.
En grænseflade ser dog ud som en klasse, det er den ikke. Da Java ikke understøtter flere arv, er en grænseflade undertiden ideel til at skabe base til klassehierarki. En grænseflade er mere en plan af en klasse, der også bruges til at opnå abstraktion i Java. Det indeholder abstrakte metoder og statiske konstanter. Kort sagt er en grænseflade en samling af abstrakte metoder, der bruges til at specificere en adfærd, som klassen skal implementere. I modsætning til abstrakt klasse giver en grænseflade fuld abstraktion i Java. Det kan have både metoder og variabler ligesom en klasse, men de metoder, der er erklæret i interface er som standard abstrakte.
Abstrakt klasse | grænseflade |
Abstrakt nøgleord bruges til at skabe en abstrakt klasse, og det kan bruges med metoder. | Interface nøgleord bruges til at oprette en grænseflade, men det kan ikke bruges med metoder. |
En klasse kan kun udvide en abstrakt klasse. | En klasse kan implementere mere end en grænseflade. |
En abstrakt klasse kan have både abstrakte og ikke-abstrakte metoder. | En grænseflade kan kun have abstrakte metoder. |
Variabler er ikke endelige som standard. Det kan indeholde ikke-endelige variabler. | Variabler er som standard endelige i en grænseflade. |
En abstrakt klasse kan give implementeringen af en grænseflade. | En grænseflade kan ikke give implementering af en abstrakt klasse. |
Det kan have metoder til implementeringer. | Det giver absolut abstraktion og kan ikke have metodeimplementeringer. |
Det kan have offentlige, private, statiske og beskyttede adgangsmodifikatorer. | Metoderne er implicit offentligt og abstrakte i Java-interface. |
Det understøtter ikke flere arv. | Det understøtter flere arv. |
Det er ideelt til kodegenbrug og evolutionsperspektiv. | Det er ideelt til typedeklaration. |
Både abstrakt klasse og interface bruges til abstraktion; de har dog deres rimelige andel af forskelle. Den største forskel mellem de to er drevet af abstraktionsmetoder. Mens førstnævnte muligvis har abstrakte metoder, er sidstnævnte implicit abstrakt. En abstrakt klasse kan have både abstrakte og ikke-abstrakte metoder. En grænseflade kan på den anden side kun have abstrakte metoder, således at de ikke kan have implementering, hvilket blot betyder, at en grænseflade ikke kan have ikke-abstrakte metoder. En abstrakt klasse kan ikke startes, som forbyder oprettelse af et objekt. På den anden side kan en grænseflade ligne en klasse, men det er den ikke.