Jämförelsediagram
Grunder för jämförelse | Gränssnitt | Abstrakt klass |
---|---|---|
Grundläggande | När du bara har kunskap om kraven inte om dess implementering, använder du "Interface". | När du delvis vet om implementeringarna använder du "Abstrakta klasser". |
metoder | Gränssnittet innehåller bara abstrakta metoder. | Abstrakt klass innehåller abstrakta metoder samt konkreta metoder. |
Access Modifier of Methods | Gränssnittsmetoderna är alltid "offentliga" och "abstrakta", även om vi inte förklarar. Därför kan det sägas som 100% ren abstrakt klass. | Det är inte obligatoriskt att metoden i abstrakt klass blir offentlig och abstrakt. Det kan också ha konkreta metoder. |
Begränsad modifierare för metoder | En gränssnittsmetod kan inte deklareras med följande modifierare: Offentlig: Privat och skyddad Sammanfattning: slutlig, statisk, synkroniserad, infödd, strictfp. | Det finns inga restriktioner för modifierarna av abstrakt klassvariabeln. |
Access Modifier of Variables | Acess Modifier tillåtet för gränssnittsvariabler är offentliga, statiska och slutliga om vi förklarar eller inte. | Variablerna i abstrakt klass behöver inte vara offentliga, statiska, slutliga. |
Begränsade modifierare för variabler | Gränssnittsvariabler kan inte deklareras som privata, skyddade, övergående, flyktiga. | Det finns ingen begränsning på modifierarna av abstrakta klassvariabler. |
Initialisering av variabler | Gränsvärdena måste initieras vid tidpunkten för dess deklaration. | Det är inte obligatoriskt att abstrakta klassvariabler initialiseras vid tidpunkten för dess deklaration. |
Instans och statiska block | Invändigt gränssnitt, du kan inte deklarera en instans eller statisk block. | Abstrakt klass tillåter en instans eller statisk block inuti den. |
konstruktörer | Du kan inte deklarera konstruktörens inre gränssnitt. | Du kan deklarera konstruktören inne i en abstrakt klass. |
Definition av gränssnitt
Java tillåter inte flera arv. Det vill säga en enda klass kan inte ärva mer än en klass i taget. Anledningen till detta kan förklaras med ett exempel. Låt oss anta att vi har två föräldrar, A och B och en härledd klass C. Den härledda klassen C ärar både klasserna A och B. Nu har båda klasserna A och B en metoduppsättning (), då kommer det att vara en fråga för klass C, vilken klassens set () -metod bör den ärva Lösningen på detta problem är "gränssnitt".
access_specifier gränssnitt gränssnittsnamn {retur-typ metodnamn1 (parameterlista); retur-typ metodnamn2 (parameterlista); skriv sista-varname1 = värde; skriv sista-varname2 = värde; // ... retur-typ metodnamnN (parameterlista); skriv sista-varnameN = värde; }
Access-specifikationen förklaras offentlig eftersom klasserna behöver implementera gränssnittet.
Vi har inte begreppet "gränssnitt" i C ++. Men Java och C # definierar gränssnittet mycket bra.
Gränssnittet i Java:
- Variabler i ett gränssnitt är som standard alltid offentliga, statiska och slutliga.
- Variabler måste initialiseras vid tidpunkten för dess deklaration.
- Variabler kan aldrig deklareras som privata, skyddade, övergående och flyktiga.
- Metoder för gränssnitt är alltid offentliga och abstrakta, medan de aldrig kan deklareras som privata, skyddade, slutliga, statiska, synkroniserade, inhemska och stränga.
- Du kan inte deklarera något konstruktörsinterface eftersom huvudformålet med konstruktören är initialiseringen av klassvariablerna men i gränssnittsvariabler initieras vid tidpunkten för dess deklaration.
- Gränssnittet kan ärva andra gränssnitt, men klassen som implementerar ett sådant gränssnitt måste genomföra metoderna för alla arvade gränssnitt.
- En klass kan ärva mer än ett gränssnitt åt gången, och det måste genomföra alla metoder för alla ärftliga gränssnitt.
Den allmänna formen av att implementera ett gränssnitt i Java:
klass klassnamn implementerar Interface_name {// class-body}
För att ärva ett gränssnitt använder en klass ett nyckelord "redskap", och klassen implementerar all metod som deklareras av ett ärftligt gränssnitt.
Gränssnittet i C #:
Gränssnittet i C # liknar nästan gränssnittet i Java utom:
- Gränssnittet i C # förklarar inte variabler.
- Gränssnittets namn är prefixat med en huvudstad I och ärvt med ett kolon (:) tecken.
Den generella formen att implementera ett gränssnitt i C #:
klass klassnamn: interface_name {// class-body}
Definition av abstrakt klass
En klass som innehåller en eller flera abstrakta metoder kallas abstrakt klass, och en klass förklaras som abstrakt med hjälp av sökordet "abstrakt", föregås av "klass" sökordet i början av klassdeklarationen. Eftersom den abstrakta klassen innehåller den abstrakta metoden utgör den en ofullständig typ. Därför kan du inte skapa objekt av en abstrakt klass. När en klass ärver en abstrakt klass måste den genomföra alla abstrakta klassens abstrakta metoder, om det inte då måste det också förklaras som abstrakt. Den abstrakta attributet är ärvt tills fullständig implementering av abstrakta metoder uppnås.
Den abstrakta klassen kan också innehålla konkreta metoder som kan användas av den härledda klassen som den är. Men du kan inte förklara en abstrakt konstruktör eller en abstrakt statisk metod i en abstrakt klass. Den abstrakta klassens generella form i Java är som följer:
abstrakt klass klassnamn {abstrakt metodnamn1 (); abstrakt method_name2 (); : return_type method_name3 (parameter_list) {// konkret metod} return_type method_name4 (parameter_list) {// konkret metod}};
Begreppet abstrakt klass är likadan i både Java och C #. En abstrakt klass är lite annorlunda i C ++.
I C ++ om en klass åtminstone har en virtuell funktion blir klassen en abstrakt klass. I stället för sökordet "abstrakt" används nyckelordet "virtuellt" för att deklarera en abstrakt metod.
Viktiga skillnader mellan gränssnitt och abstrakt klass i Java & C #
- När du har kunskap om "vad som krävs" men inte av "hur det skulle genomföras" måste gränssnittet användas. Å andra sidan, om du vet vad som krävs och delvis vet hur det skulle genomföras, använd sedan en abstrakt klass.
- Ett gränssnitt har alla sina metoder abstrakta, men en abstrakt klass har några abstrakta metoder och några konkreta metoder.
- Metoderna inom ett gränssnitt är offentliga och abstrakta, så kallas det också som en ren abstrakt klass. Å andra sidan är metoderna i en abstrakt inte begränsade till att vara offentliga och abstrakta.
- En gränssnittsmetod kan aldrig vara privat, skyddad, slutlig, statisk, synkroniserad, inbyggd eller strictfp. Å andra sidan finns det inga begränsningar för metoder för en abstrakt klass.
- Variablerna i ett gränssnitt är offentliga och slutliga om vi deklarerar dem eller inte, medan det inte finns någon sådan inskränkning att variablerna i en abstrakt klass är offentliga och slutliga.
- Variabler i ett gränssnitt kan aldrig vara privata skyddade övergående eller flyktiga medan det inte finns några begränsningar för variabler i en abstrakt klass.
- Variabeln för ett gränssnitt måste initieras under deklarationen. Å andra sidan kan variablerna i en abstrakt klass initieras när som helst.
- Inom ett gränssnitt kan en instans eller statisk block inte deklareras, men du kan deklarera instans eller statiskt block i en abstrakt klass.
- Du kan inte definiera konstruktören inom ett gränssnitt, medan du kan definiera konstruktorn i en abstrakt klass.
Slutsats:
När du behöver skapa en basklass som innehåller en generaliserad form av metoder som kan implementeras av de härledda klasserna enligt deras behov, hjälper konceptet med gränssnitt och abstrakt klass att göra det.