Huvudskillnad: Gränssnitt eller ett protokoll är en vanlig metod som gör det möjligt för orelaterade objekt att kommunicera med varandra. Det representerar ett överenskommet beteende som underlättar samspelet mellan de två objekten. En abstrakt klass är en klass av objekt som inte kan instansieras eller sätta upp en förekomst av ett objekt. Den här klassen får inte ha någon implementering eller kan ha ofullständig implementering.
Java är ett programmeringsspråk som har påverkats av C-språket. Det härledar mycket av sin syntax från C och C ++, men det har färre lågnivåer än vad som helst. Java är ett allmänt programmerat språk som är utformat för att ha färre implementeringsberoende än i tidigare språk. Det är samtidigt, klassbaserat och ett objektorienterat språk.
Java utvecklades av James Gosling vid Sun Microsystems och släpptes 1995. Det släpptes ursprungligen som en kärnkomponent i Sun Microsystems Java-plattform. Sun har sedan licensierat större delen av sin Java-teknik enligt GNU General Public License. Det innebär att all teknik som är licensierad enligt GNU General Public License är öppen källkod och generellt tillgänglig utan kostnad. Sun Microsystems fusionerades slutligen till Oracle Corporation. Från och med 2012 har Java blivit ett av de mest populära programmeringsspråk för användning. Detta gäller speciellt för klient-server webbapplikationer. Många andra system har utvecklat alternativa implementeringar av Sun-tekniker, som GNU Compiler för Java och GNU Classpath.
En abstrakt klass är en klass av objekt som inte kan instansieras eller sätta upp en förekomst av ett objekt. Den här klassen får inte ha någon implementering eller kan ha ofullständig implementering. Det kan också ha abstrakta metoder eller egenskaper som delas av alla underklasser. På vissa programmeringsspråk är abstrakta typer utan genomförande kända som gränssnitt. I Java kan en abstrakt typ skapas med hjälp av sökordet "abstrakt" i klassdefinitionen. Syftet med att ha en abstrakt klass att placera alla metoder som inte implementeras i abstraktklassen och lämna det till underklassen för att bestämma hur man genomför dessa klasser. Om en klass har en enda abstrakt metod, måste klassen deklareras som en abstrakt klass, även om man inte behöver ha minst en enda metod för att deklarera en klassabstrakt.
Malliktalksjava.in listar de stora skillnaderna mellan gränssnitt och abstrakt som:
- Abstrakt klass har konstruktören, men gränssnittet gör det inte.
- Abstrakta klasser kan ha implementeringar för några av dess medlemmar (Metoder), men gränssnittet kan inte ha genomförande för någon av dess medlemmar.
- Abstrakta klasser ska ha andra klasser som kommer att vara värdelösa.
- Gränssnitt måste ha implementeringar av andra klasser som kommer att vara värdelösa
- Endast ett gränssnitt kan utöka ett annat gränssnitt, men vilken klass som helst kan förlänga en abstrakt klass.
- Alla variabler i gränssnitt är som standard slutliga
- Gränssnitt ger en form av flera arv. En klass kan endast omfatta en annan klass.
- Gränssnitt är begränsade till offentliga metoder och konstanter utan genomförande. Abstrakta klasser kan ha ett partiellt genomförande, skyddade delar, statiska metoder etc.
- En klass kan implementera flera gränssnitt. Men i abstrakt klass kan en klass förlänga endast en abstrakt klass.
- Gränssnitt är långsamma eftersom det krävs extra indirection för att hitta motsvarande metod i den aktuella klassen. Abstrakta klasser är snabba.
- Tillgänglighetsmodifierare (Offentlig / Privat / Intern) är tillåten för abstrakt klass. Gränssnittet tillåter inte åtkomstmodifierare
- En abstrakt klass kan innehålla fullständiga eller ofullständiga metoder. Gränssnitt kan endast innehålla en metods underskrift men ingen kropp. Således kan en abstrakt klass implementera metoder men ett gränssnitt kan inte implementera metoder.
- En abstrakt klass kan innehålla fält, konstruktörer eller destruktorer och implementera egenskaper. Ett gränssnitt kan inte innehålla fält, konstruktörer eller förstörare och det har bara egenskapens signatur men ingen implementering.
- Olika åtkomstmodifierare som abstrakta, skyddade, interna, offentliga, virtuella etc. är användbara i abstrakta klasser men inte i gränssnitt.
- Abstrakt omfattning är upp till avledad klass.
- Gränssnittets gränssnitt är upp till vilken nivå som helst av dess arvskedja.
Informationen för tabellen är artighet av codeproject.com och mindprod.com
Gränssnitt | Abstrakt klass | |
Flera arv | En klass får ärva flera gränssnitt. | En klass får ärva endast en abstrakt klass. |
Standard implementering | Ett gränssnitt kan inte ge någon kod, bara signaturen. | En abstrakt klass kan ge fullständig, standardkod och / eller bara de detaljer som måste överdras. |
Access Modifiers | Ett gränssnitt kan inte ha åtkomstmodifierare för subs, funktioner, egenskaper etc allt antas vara offentligt. | En abstrakt klass kan innehålla åtkomstmodifierare för subs, funktioner, egenskaper. |
Core vs Peripheral | Gränssnitt används för att definiera perifer förmåga i en klass. Med andra ord kan både Människa och Fordon arva från ett IMovable gränssnitt. | En abstrakt klass definierar kärnidentiteten hos en klass och där används den för föremål av samma typ. |
Homogenitet | Om olika implementeringar bara delar metoden signaturer är det bättre att använda gränssnitt. | Om olika implementeringar är av samma slag och använder vanligt beteende eller status är abstrakt klass bättre att använda. |
Fart | Kräver mer tid för att hitta den verkliga metoden i motsvarande klasser. | Snabb |
Lägga till funktionalitet | Om vi lägger till en ny metod i ett gränssnitt måste vi spåra alla implementeringar av gränssnittet och definiera implementering för den nya metoden. | Om vi lägger till en ny metod i en abstrakt klass har vi möjlighet att tillhandahålla standardimplementering och därför kan all befintlig kod fungera korrekt. |
Fält och konstanter | Inga fält kan definieras i gränssnitt. | En abstrakt klass kan ha fält och konstanter definierade. |
terseness | De konstanta deklarationerna i ett gränssnitt är alla antagna offentliga statiska slutliga. | Delad kod kan läggas till i en abstrakt klass. |
Konstanter anter~~POS=HEADCOMP | Endast statiska slutkonstanter, kan använda dem utan kvalifikation i klasser som implementerar gränssnittet. | Både instans och statiska konstanter är möjliga. Både statisk och exemplifierad intialiserings kod är också möjlig att beräkna konstanterna. |
Tredje parts bekvämlighet | Ett gränssnitt implementering kan läggas till någon befintlig tredje part klass. | En tredjepartsklass måste omskrivas för att endast sträcka sig från abstraktklassen. |
är-en vs--bar eller kan-göra | Gränssnitt används ofta för att beskriva en klasss perifera förmågor, inte dess centrala identitet, t.ex. En Automobile-klass kan implementera det återvinningsbara gränssnittet, vilket skulle kunna gälla för många annars helt orelaterade objekt. | En abstrakt klass definierar kärnidentiteten hos sina efterkommande. Genomförda gränssnitt uppräkna de allmänna saker en klass kan göra, inte vad en klass är. I ett Java-sammanhang bör användarna typiskt implementera Runnable-gränssnittet istället för att utöka Thread, eftersom de inte är riktigt intresserade av att ge någon ny trådfunktionalitet, de vill bara ha en del kod för att kunna köra självständigt. De vill skapa något som kan köras i en tråd, inte en ny typ av tråd. Den liknande är-en vs-en debatt uppkommer när du bestämmer dig för att ärva eller delegera. |
Plug-in | Användaren kan skriva en ny ersättningsmodul för ett gränssnitt som inte innehåller en enda kodpinne gemensamt med befintliga implementeringar. När användaren implementerar gränssnittet börjar de från början utan någon standardimplementering. Användaren måste skaffa verktyg från andra klasser; ingenting kommer med gränssnittet annat än några konstanter. Detta ger användaren frihet att genomföra en radikalt annan intern design. | Användaren måste använda abstrakta klassen som-är för kodbasen, med all dess åtföljande bagage, bra eller dåligt. Den abstrakta klassförfattaren har infört strukturen på användaren. |
Underhåll | Om klientkoden bara talar i form av ett gränssnitt, kan du enkelt ändra den konkreta implementeringen bakom den, med hjälp av en fabriksmetod. | Om klientkoden bara talar i form av en abstrakt klass kan du enkelt ändra den konkreta implementeringen bakom den, med hjälp av en fabriksmetod. |