Een klasse die wordt gedeclareerd met het trefwoord ' abstract ', wordt abstracte klasse genoemd. Het kan zowel abstracte methoden (methoden zonder body) als concrete methoden (reguliere methoden met body) hebben. Een normale klasse (niet-abstracte klasse) kan geen abstracte methoden hebben. In deze gids zullen we leren wat een abstracte klasse is, waarom we het gebruiken en wat de regels zijn die we moeten onthouden wanneer we ermee werken in Java.
Een abstracte klasse kan niet worden geïnstantieerd , wat betekent dat u er geen object van mag maken. Waarom? We zullen dat later in deze gids bespreken.
Waarom hebben we een abstracte klasse nodig?
Laten we zeggen dat we een klasse Animal
hebben met een methode sound()
en de subklassen (zie overerving ) ervan zoals Dog
, Lion
, Horse
, Cat
enz. Aangezien het diergeluid van dier tot dier verschilt, heeft het geen zin om het te implementeren deze methode in bovenliggende klasse. Dit komt omdat elke kindklasse deze methode moet overschrijven om zijn eigen implementatiedetails te geven, zoals Lion
class in deze methode "Roar" zal zeggen en Dog
class "Woof" zal zeggen.
Dus als we weten dat alle dierklassen deze methode zullen en moeten overschrijven, heeft het geen zin om deze methode in de ouderklasse te implementeren. Dus deze methode abstract maken zou de goede keuze zijn, want door deze methode abstract te maken, dwingen we alle subklassen om deze methode te implementeren (anders krijg je een compilatiefout), we hoeven ook geen implementatie aan deze methode in de bovenliggende klasse te geven .
Aangezien de klasse Animal
een abstracte methode heeft, moet u deze klasse abstract verklaren.
Nu moet elk dier een geluid hebben, door deze methode abstract te maken, hebben we het voor de kindklasse verplicht om implementatiedetails aan deze methode te geven. Op deze manier zorgen we ervoor dat elk dier een geluid heeft.
Voorbeeld van een abstracte klasse
// abstracte ouderklasse abstracte klasse Animal {// abstracte methodepubliek abstract nietig geluid (); } // Hondenklasse breidt dierklasse uit public class Dog verlengt dier {publiek ongeldig geluid () { System.out.println ( "Inslag");}public static void main (String args []) { Animal obj = new Dog (); obj.sound ();} }
Output:
Inslag
Daarom verklaren we voor dergelijke scenario's over het algemeen dat de klasse als abstracte en latere concrete klassen deze klassen uitbreidt en de methoden dienovereenkomstig overschrijft en ook hun eigen methoden kan hebben.
Abstracte klassenverklaring
Een abstracte klasse schetst de methoden, maar implementeert niet noodzakelijk alle methoden.
// Verklaring met behulp van abstract trefwoord abstracte klasse A {// Dit is een abstracte methodeabstract void myMethod ();// Dit is een concrete methode met bodyvoid anotherMethod () { // doet iets} }
Reglement
Opmerking 1: Zoals we in het bovenstaande voorbeeld hebben gezien, zijn er gevallen waarin het moeilijk of vaak onnodig is om alle methoden in de bovenliggende klasse te implementeren. In deze gevallen kunnen we de bovenliggende klasse als abstract verklaren, waardoor het een speciale klasse is die op zichzelf niet volledig is.
Een klasse afgeleid van de abstracte klasse moet al die methoden implementeren die in de bovenliggende klasse als abstract worden aangemerkt.
Opmerking 2: Abstracte klasse kan niet worden geïnstantieerd, wat betekent dat u het object ervan niet kunt maken. Als u deze klasse wilt gebruiken, moet u een andere klasse maken die deze klasse uitbreidt en de implementatie van abstracte methoden biedt. Vervolgens kunt u het object van die onderliggende klasse gebruiken om niet-abstracte methoden van bovenliggende klasse en geïmplementeerde methoden (die die abstract waren in ouder, maar geïmplementeerd in kindklasse).
Opmerking 3: Als een kind niet alle abstracte methoden van de abstracte ouderklasse implementeert, moet de kindklasse ook abstract worden verklaard.
Weet u? Aangezien abstracte klasse ook concrete methoden toestaat, biedt het geen 100% abstractie. Je kunt zeggen dat het gedeeltelijke abstractie biedt. Abstractie is een proces waarbij u alleen 'relevante' gegevens toont en onnodige details van een object voor de gebruiker 'verbergt'.
Interfaces worden daarentegen gebruikt voor 100% abstractie (zie hier meer over abstractie ).
Misschien wilt u dit ook lezen: Verschil tussen abstracte klasse en interface in Java
Waarom kunnen we niet het object van een abstracte klasse maken?
Omdat deze klassen onvolledig zijn, hebben ze abstracte methoden die geen body hebben, dus als java je toestaat om een object van deze klasse te maken, dan als iemand de abstracte methode met dat object aanroept. Wat zou er gebeuren? Er zou geen daadwerkelijke implementatie van de methode zijn om beroep doen op.
Ook omdat een object concreet is. Een abstracte klasse is als een sjabloon, dus je moet het uitbreiden en erop voortbouwen voordat je het kunt gebruiken.
Voorbeeld om aan te tonen dat objectcreatie van abstracte klasse niet is toegestaan
Zoals hierboven besproken, kunnen we geen abstracte klasse instantiëren. Dit programma veroorzaakt een compilatiefout.
abstracte klasse AbstractDemo {public void myMethod () { System.out.println ( "Hello");}abstract publiek ongeldig anotherMethod (); } Public Class Demo breidt AbstractDemo {public void anotherMethod () { System.out.print ("Abstracte methode"); }public static void main (String args []){// error: U kunt er geen object van maken AbstractDemo obj = new AbstractDemo (); obj.anotherMethod ();} }
Output:
Niet opgelost compilatieprobleem: kan het type AbstractDemo niet instantiëren
Opmerking: de klasse die de abstracte klasse uitbreidt, moet alle abstracte methoden ervan implementeren, anders moet u die klasse ook abstract verklaren.
Abstracte klasse versus concrete klasse
Een klasse die niet abstract is, wordt de klasse Beton genoemd . In het bovenstaande voorbeeld dat we aan het begin van deze gids hebben gezien, is Animal
een abstracte klasse en zijn Cat
, Dog
Lion
concrete klassen.
Hoofdpunten:
- Een abstracte klasse heeft pas zin als deze wordt uitgebreid met een andere klasse.
- Als u een abstracte methode in een klasse aangeeft, moet u de klasse ook abstract verklaren. je kunt geen abstracte methode hebben in een concrete klasse. Het is andersom niet altijd waar: als een klasse geen abstracte methode heeft, kan deze ook als abstract worden gemarkeerd.
- Het kan ook een niet-abstracte methode (concreet) hebben.
Ik heb de regels en voorbeelden van abstracte methoden behandeld in een aparte tutorial. Je kunt de gids hier vinden: Abstracte methode in Java
Laten we voor nu even wat basics en een voorbeeld van een abstracte methode bekijken.
1) Abstracte methode heeft geen body.
2) Sluit de verklaring altijd af met een puntkomma (;).
3) Het moet worden opgeheven . Een abstracte klasse moet worden uitgebreid en op dezelfde manier moet de abstracte methode worden opgeheven.
4) Een klasse moet abstract worden verklaard om abstracte methoden te hebben.
Opmerking: de klasse die de abstracte klasse uitbreidt, moet alle abstracte methoden overschrijven.
Voorbeeld van abstracte klasse en methode
abstracte klasse MyClass {public void disp () { System.out.println ("Concrete methode van bovenliggende klasse");}abstracte openbare nietigheid disp2 (); } class Demo breidt MyClass {/ * Moet deze methode overschrijven tijdens het uitbreiden * MyClas * /openbare nietig disp2 (){System.out.println ("overheersende abstracte methode");}public static void main (String args []) {Demo obj = nieuwe Demo ();obj.disp2 ();} }
Output:
doorslaggevende abstracte methode
nog steeds niet duidelijk wat de praktische toepasbaarheid van abstracte methode is. stel me alsjeblieft voor.
Hallo Digbijay,
De abstracte methode is slechts een handtekening zonder implementatieblok. De abstracte methode moet in de subklassen worden genegeerd om het object te kunnen gebruiken.
Een abstracte methode is slechts een prototype voor de methode met de volgende kenmerken: -
1) Een retourtype
2) Een naam
3) Een lijst met parameters
4) Een worp-clausule die optioneel is
Voorbeeld: - openbaar abstract int salaris (int empNo)
Ik hoop dat dit helpt.
Kan een abstracte klasse een aannemer hebben ????
en zo ja, waarom ???
en zo nee, waarom ???
Beste Sunil,
Nee !! omdat constructor wordt aangeroepen wanneer het object wordt gemaakt. maar de abstact-methode heeft geen instantie dus het is niet mogelijk om een abstracte constructor aan te roepen.
Beste Hamid,
Ik neem aan dat je je hebt vergist in het concept dat moet worden gecorrigeerd in onze reactie.
Abstracte klasse kan ook een constructor hebben. Hoewel we de abstracte klasse niet kunnen instantiëren, is de standaardconstructor er altijd. Of we kunnen het expliciet aanbieden of het wordt geleverd door Java. De reden waarom het daar is omdat je in het concept van overerving de klassenhiërarchie moet handhaven, betekent dat als je klasse de abstracte klasse uitbreidt, dezelfde abstracte klasse superklasse wordt voor je uitbreidende klasse en onthoud wanneer je de constructor van je klasse hebt, dan eerst lijn van je constructor is altijd super class constructor en dit is het moment waarop je abstract class constructor wordt gebeld
hoop dat je nu duidelijk bent!
Hallo Ankit Fulzele,
Is het mogelijk om een abstracte klasse te instantiëren?
Voor mij is het of de abstracte klasse een concrete klasse heeft afgeleid, die er zo uitziet:
identifier = nieuw;
Heb ik gelijk ?
Meer bedankt,
Mark
Als we later een object van de beoogde klasse maken, roept dit impliciet de constructor van de abstracte klasse op. Wanneer de constructor wordt aangeroepen, moet dit gemiddelde object van die klasse dan worden gemaakt?
Beste Hamid! In de abstracte klasse kan ook een constructor zijn omdat constructors niet worden gebruikt voor het maken van objecten, constructors worden gebruikt om de gegevensleden van een klasse te initialiseren en de klasse Abstract kan ook een gegevenslid hebben en voor het initialiseren heeft het gegevenslid van de abstracte klasse een constructor nodig als we dat deden niet de constructor leveren, dan levert jvm de 0-param of standaardconstructor voor het initialiseren van het gegevenslid.
abstracte klassen kunnen constructeurs hebben ... hoewel abstracte klassen niet kunnen worden geïnstantieerd ... dat betekent ... we kunnen geen objecten van een abstracte klasse maken ... maar toch kan abstracte klasse constructors hebben ... en deze constructor kan worden aangeroepen door een subklasse (die erft een abstracte klasse) door het superzoekwoord te gebruiken.
U kunt proberen een boek van uw website te publiceren na goed juridisch advies.
De inhoud is erg goed op uw website.
hoe krijg je toegang tot concrete methoden in abstracte klasse als je geen object van een abstracte klasse kunt maken. zoals in het gegeven voorbeeld, hoe voer ik de disp1-methode uit? welke wijzigingen moeten in de code worden aangebracht?
Abstracte klasse kan een concrete methode hebben, en ja, we kunnen geen object maken, maar als je je abstracte klasse met een andere klasse uitbreidt, krijg je door overerving van het kind alle methoden (concrete methode ook van de ouderklasse), hier wordt dynamisch polymorfisme bereikt met behulp van referentie van ouder je kunt die concrete methode van de ouderklasse noemen, als je die oudermethode niet wilt, dan die concrete methode van die ouderklasse in de kindklasse overschrijven.
Uday heeft helaas geen toegang tot de concrete methoden van een abstracte klasse tenzij u de klasse uitbreidt. Een abstracte klasse is eigenlijk op zichzelf bijna nutteloos. Je kunt een abstracte klas zien als een luie student die verteld moet worden zijn boeken te lezen; als hij het niet wordt verteld, kan hij zijn boeken niet lezen. De student vertellen is nu analoog aan het uitbreiden van de abstracte klasse en de student dan zijn boeken lezen is analoog aan de uitvoering van de concrete methoden als je wilt.
Hebben we typecasting nodig voor de klasse Abstract?
waarom worden beschermde constructors gebruikt in de klasse Abstract?
Waarom heeft men abstracte klasse nodig? Dierklasse voorbeeld is hier gegeven. Maar kan iemand mij alsjeblieft een praktisch voorbeeld geven waar dit nuttig is. Als ik een Java-toepassing schrijf, wanneer moet ik dan stoppen met het schrijven van alle logica in concrete klasse en het abstracte klassenconcept gaan gebruiken