ordet polymorphism brukes i ulike sammenhenger og beskriver situasjoner der noe skjer i flere forskjellige former. I computer science, den beskriver konseptet som objekter av forskjellige typer kan nås via samme grensesnitt. Hver type kan gi sine egne, uavhengige gjennomføringen av dette grensesnittet. Det er en av de sentrale begrepene objekt-orientert programmering (OOP).,
Hvis du lurer på om et objekt er polymorf, kan du utføre en enkel test. Hvis objektet vellykket passerer flere er-en eller instanceof tester, det er polymorf. Som jeg har beskrevet i innlegget mitt om arv, alle Java-klasser utvide klassen Object. På grunn av dette, alle objekter i Java er polymorf fordi de går minst to instanceof sjekker.,
Forskjellige typer polymorphism
Java støtter 2 typer polymorphism:
- statisk eller compile-time
- dynamisk
Statisk polymorphism
Java, som mange andre objekt-orientert programmeringsspråk, gir deg mulighet til å gjennomføre flere metoder i samme klasse som bruker samme navn, men et annet sett av parametere. Det kalles metoden overbelastning og representerer en statisk form av polymorphism.,
parametersett har forskjellige minst ett av følgende tre kriterier:
- De trenger for å ha et ulikt antall parametre, f.eks. en metode aksepterer 2 og en annen 3 parametre.
- typer av parametrene må være forskjellige, for eksempel en metode aksepterer en Streng og en annen en Lang.
- De må forvente parametrene i en annen rekkefølge, f.eks. en metode aksepterer en Streng og en Lang og en annen man aksepterer en Lang og en Streng. Denne form for overbelastning er ikke anbefalt fordi det gjør API vanskelig å forstå.,
I de fleste tilfeller, kan hver av disse overbelastet metoder gir en annerledes, men veldig lik funksjonalitet.
på Grunn av den ulike sett av parametere, hver metode har en annen signatur. Som gjør at kompilatoren for å identifisere hvilken metode har til å bli kalt og for å binde den til metode samtale. Denne tilnærmingen kalles statisk binding eller statisk polymorphism.
La oss ta en titt på et eksempel.
Et enkelt eksempel for statisk polymorphism
jeg bruke samme CoffeeMachine prosjekt som jeg brukte i forrige innlegg i denne serien. Du kan klone det på https://github.com/thjanssen/Stackify-OopInheritance.,
BasicCoffeeMachine klasse implementerer to metoder med navnet brewCoffee. Det første man aksepterer en parameter av type CoffeeSelection. Den andre metoden aksepterer to parametre, en CoffeeSelection, og en int.
Nå når du ringer en av disse metodene gitt sett av parametere som identifiserer den metoden som har å bli kalt.
I følgende kodebit, jeg kaller den metoden bare med en CoffeeSelection objekt. På kompilere tid, Java-kompilatoren binder denne metoden ringe til brewCoffee(CoffeeSelection utvalget) – metoden.,
BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);
Hvis jeg endre denne koden, og ringe brewCoffee metode med en CoffeeSelection objekt og en int, kompilatoren binder metode for anrop til andre brewCoffee(CoffeeSelection utvalget, int antall) – metoden.
Dynamisk polymorphism
Denne formen for polymorphism tillater ikke kompilatoren til å bestemme utført metode. Den JVM behov for å gjøre det ved kjøring.
Innenfor en arv hierarki, en underklassen kan overstyre en metode for sin superclass. Som gjør det mulig for utvikleren av underklassen til å tilpasse eller helt erstatte atferd som metode.,
Det skaper også en form for polymorphism. Begge metoder, gjennomført av super – og underklassen, dele samme navn og parametre, men gir forskjellig funksjonalitet.
La oss ta en titt på et annet eksempel fra CoffeeMachine prosjektet.
Metode overordnede i arv hierarki
BasicCoffeeMachine klasse er superclass av PremiumCoffeeMachine klasse.
Begge klasser gir en implementering av brewCoffee(CoffeeSelection utvalget) – metoden.,
Hvis du leser innlegg om OOP konseptet arv, som du allerede vet er det to forskjellige implementeringer av brewCoffee metode. Den BasicCoffeeMachine bare støtter CoffeeSelection.FILTER_COFFEE. Den brewCoffee metoden for PremiumCoffeeMachine klasse legger til støtte for CoffeeSelection.ESPRESSOMASKIN. Hvis det blir kalt med noen andre CoffeeSelection, den bruker søkeord super å delegere ringe til superclass.,
Sen binding
Når du ønsker å bruke en slik en arv hierarkiet i prosjektet ditt, må du være i stand til å svare på følgende spørsmål: hvilken metode som vil JVM samtale?
Som bare kan besvares ved kjøring fordi det avhenger av objektet som metoden blir kalt. Typen av referanse, som du kan se i koden, er irrelevant. Du må skille mellom tre generelle scenarier:
- objektet er av type superclass og blir referert til som den superclass., Så, i det eksempel på dette innlegget, en BasicCoffeeMachine objektet blir referert til som en BasicCoffeeMachine.
- objektet er av type underklassen og blir referert til som den underklassen. I eksempel på dette innlegget, en PremiumCoffeeMachine objektet blir referert til som en PremiumCoffeeMachine.
- objektet er av type underklassen og blir referert til som den superclass. I CoffeeMachine eksempel, en PremiumCoffeeMachine objektet blir referert til som en BasicCoffeeMachine.
Superclass referert til som den superclass
Det første scenariet er ganske enkel., Når du instantiate en BasicCoffeeMachine objekt og lagrer det i en variabel av typen BasicCoffeeMachine, den JVM vil ringe brewCoffee metode på BasicCoffeeMachine klasse. Så, du kan bare bruke en CoffeeSelection.FILTER_COFFEE.
Subclass referert til som den underklassen
Det andre scenariet er likt. Men denne gangen, jeg instantiate en PremiumCoffeeMachine og referere det som en PremiumCoffeeMachine. I dette tilfellet, JVM kaller brewCoffee metoden for PremiumCoffeeMachine klasse, som legger til støtte for CoffeeSelection.ESPRESSOMASKIN.,
Subclass referert til som den superclass
Dette er det mest interessant scenario, og den viktigste grunnen til at jeg forklare dynamiske polymorphism i slike detaljer.
Når du instantiate en PremiumCoffeeMachine objekt og tilordne den til BasicCoffeeMachine coffeeMachine variabel, kan det fortsatt er en PremiumCoffeeMachine objekt. Det ser akkurat ut som en BasicCoffeeMachine.
kompilatoren ikke se at det i kode, og du kan bare bruke de metoder som er gitt av BasicCoffeeMachine klasse., Men hvis du ringer brewCoffee metode på coffeeMachine variabel, den JVM vet at det er et objekt av type PremiumCoffeeMachine og utfører overstyres metode. Dette kalles sen binding.
Oppsummering
Polymorphism er en av de sentrale begrepene i OOP språk. Den beskriver konseptet som forskjellige klasser kan brukes med samme grensesnitt. Hver av disse klassene kan gi sin egen implementasjon av grensesnittet.
Java støtter to typer polymorphism. Du kan overbelaste en metode med ulike sett av parametere., Dette kalles statisk polymorphism fordi kompilatoren statisk binder metode anrop til en bestemt metode.
Innenfor en arv hierarki, en underklassen kan overstyre en metode for sin superclass. Hvis du instantiate den underklassen, den JVM vil alltid ringe overstyres metoden, selv om du har kastet den underklassen til sin superclass. Som kalles dynamisk polymorphism.