het woord polymorfisme wordt gebruikt in verschillende contexten en beschrijft situaties waarin iets in verschillende vormen voorkomt. In de informatica, het beschrijft het concept dat objecten van verschillende types kunnen worden benaderd via dezelfde interface. Elk type kan zijn eigen, onafhankelijke implementatie van deze interface bieden. Het is een van de kernbegrippen van objectgeoriënteerd programmeren (OOP).,
Als u zich afvraagt of een object polymorf is, kunt u een eenvoudige test uitvoeren. Als het object met succes meerdere is-a Of instance of tests passeert, is het polymorf. Zoals ik in mijn bericht over overerving heb beschreven, breiden alle Java-klassen het class-Object uit. Hierdoor zijn alle objecten in Java polymorf omdat ze minstens twee instanceof controles passeren.,
verschillende typen polymorfisme
Java ondersteunt 2 typen polymorfisme:
- statisch of compileertijd
- dynamisch
statisch polymorfisme
met Java kunt u, net als vele andere objectgeoriënteerde programmeertalen, meerdere methoden binnen dezelfde klasse implementeren die dezelfde naam maar een andere set parameters gebruiken. Dat heet methode overbelasting en vertegenwoordigt een statische vorm van polymorfisme.,
De parameterverzamelingen moeten verschillen op ten minste één van de volgende drie criteria:
- zij moeten een verschillend aantal parameters hebben, bijvoorbeeld een methode accepteert 2 en een andere 3 parameters.
- de typen parameters moeten verschillend zijn, bijvoorbeeld een methode accepteert een String en een andere een lange.
- ze moeten de parameters in een andere volgorde verwachten, bijvoorbeeld een methode accepteert een String en een lange en een andere methode accepteert een lange en een String. Dit soort overbelasting wordt niet aanbevolen omdat het de API moeilijk te begrijpen maakt.,
in de meeste gevallen biedt elk van deze overbelaste methoden een andere, maar zeer vergelijkbare functionaliteit.
door de verschillende reeksen parameters heeft elke methode een andere handtekening. Dat staat de compiler toe om te identificeren welke methode moet worden aangeroepen en om het te binden aan de methodeaanroep. Deze benadering wordt statische binding of statisch polymorfisme genoemd.
laten we een voorbeeld bekijken.
een eenvoudig voorbeeld voor statisch polymorfisme
Ik gebruik hetzelfde CoffeeMachine project als in de vorige berichten van deze serie. U kunt het klonen op https://github.com/thjanssen/Stackify-OopInheritance.,
De basiccoffeemachine klasse implementeert twee methoden met de naam brewCoffee. De eerste accepteert één parameter van type CoffeeSelection. De andere methode accepteert twee parameters, een Coffeeselectie en een Int.
wanneer u nu een van deze methoden aanroept, identificeert de gegeven set parameters de methode die moet worden aangeroepen.
in het volgende codefragment noem ik de methode alleen met een coffeeselection object. Tijdens het compileren bindt de Java compiler deze methode aan de brewcoffee(coffeeselection selection) methode.,
BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);
als ik deze code verander en de brewcoffee methode aanroep met een coffeeselection object en een Int, bindt de compiler de methodeaanroep aan de andere brewcoffee(CoffeeSelection selection, int number) methode.
dynamisch polymorfisme
Deze vorm van polymorfisme staat de compiler niet toe om de uitgevoerde methode te bepalen. De JVM moet dat tijdens runtime doen.
binnen een overerving hiërarchie kan een subklasse een methode van zijn superklasse overschrijven. Dat stelt de ontwikkelaar van de subklasse in staat om het gedrag van die methode aan te passen of volledig te vervangen.,
Het creëert ook een vorm van polymorfisme. Beide methoden, geà mplementeerd door de super – en subklasse, delen dezelfde naam en parameters, maar bieden verschillende functionaliteit.
laten we eens kijken naar een ander voorbeeld van het CoffeeMachine project.
methode overschrijdend in een overerving hiërarchie
De basiccoffeemachine class is de superklasse van de PremiumCoffeeMachine class.
beide klassen bieden een implementatie van de brewCoffee(coffeeselection selection) methode.,
Als u de post over het OOP concept overerving leest, kent u de twee implementaties van de brewcoffee methode al. De BasicCoffeeMachine ondersteunt alleen de Coffeeselectie.FILTERKOFFIE. De brewCoffee methode van de Premiumcoffee Machine klasse voegt ondersteuning voor Coffeeselectie.ESPRESSO. Als het wordt aangeroepen met een andere CoffeeSelection, gebruikt het het trefwoord super om de aanroep te delegeren aan de superklasse.,
Late binding
Als u een dergelijke overerving-hiërarchie in uw project wilt gebruiken, moet u de volgende vraag kunnen beantwoorden: welke methode zal de JVM aanroepen?
die alleen kan worden beantwoord tijdens runtime omdat het afhangt van het object waarop de methode wordt aangeroepen. Het type referentie, dat u kunt zien in uw code, is irrelevant. U moet drie algemene scenario ‘ s onderscheiden:
- uw object is van het type van de superclass en wordt aangeduid als de superclass., Dus, in het voorbeeld van dit bericht, een basiccoffeemachine object wordt verwezen als een BasicCoffeeMachine.
- uw object is van het type van de subklasse en wordt aangeduid als de subklasse. In het voorbeeld van deze post wordt een premiumcoffeemachine object aangeduid als een PremiumCoffeeMachine.
- uw object is van het type van de subklasse en wordt aangeduid als de superklasse. In het voorbeeld van de CoffeeMachine wordt een premiumcoffeemachine object aangeduid als een BasicCoffeeMachine.
superklasse waarnaar wordt verwezen als de superklasse
het eerste scenario is vrij eenvoudig., Wanneer je een basiccoffeemachine object instanteert en het opslaat in een variabele van het type BasicCoffeeMachine, zal de JVM de brewCoffee methode aanroepen op de basiccoffeemachine klasse. Je kunt dus alleen een Koffieselectie brouwen.FILTERKOFFIE.
subklasse waarnaar wordt verwezen als de subklasse
het tweede scenario is vergelijkbaar. Maar deze keer instantiate ik een PremiumCoffeeMachine en refereer het als een PremiumCoffeeMachine. In dit geval noemt de JVM de brewcoffee-methode van de Premiumcoffee-Machineklasse, die ondersteuning voor Coffeeselectie toevoegt.ESPRESSO.,
subklasse aangeduid als de superklasse
Dit is het meest interessante scenario en de belangrijkste reden waarom ik dynamisch polymorfisme in dergelijke details verklaar.
wanneer u een PremiumCoffeeMachine-object instanteert en het toewijst aan de coffeeMachine-variabele BasicCoffeeMachine, is het nog steeds een premiumcoffeemachine-object. Het lijkt gewoon op een BasicCoffeeMachine.
de compiler ziet dat niet in de code, en u kunt alleen de methoden gebruiken die door de klasse BasicCoffeeMachine worden geleverd., Maar als je de brewcoffee methode op de coffeemachine variabele noemt, weet de JVM dat het een object van het type PremiumCoffeeMachine is en voert de overschreven methode uit. Dit heet late binding.
samenvatting
polymorfisme is een van de kernbegrippen in OOP-talen. Het beschrijft het concept dat verschillende klassen kunnen worden gebruikt met dezelfde interface. Elk van deze klassen kan zijn eigen implementatie van de interface bieden.
Java Ondersteunt twee soorten polymorfisme. U kunt een methode overbelasten met verschillende parameters., Dit heet statisch polymorfisme omdat de compiler statisch de methodeaanroep aan een specifieke methode bindt.
binnen een overerving hiërarchie kan een subklasse een methode van zijn superklasse overschrijven. Als je de subklasse instantieert, zal de JVM altijd de overschreven methode aanroepen, zelfs als je de subklasse naar zijn superklasse cast. Dat heet dynamisch polymorfisme.