Arv er et av kjernekonseptene i objektorientert programmering. I programmering representerer ordet arv et forhold der en barneklasse antar tilstanden og oppførselen til en foreldreklasse.
Hensikten med arv i programvareutvikling er å lette gjenbruk av sikker og pålitelig programvare. En av de største fordelene ved å bruke arv er at den eliminerer overflødig kode i programmene dine.
Hvordan Arv fungerer
Tanken bak arv er at mange klasser eller objekter har noe av det samme settet med attributter og metoder. Derfor, i ånden til å produsere pålitelig programvare, kan nye klasser nå trekke fra eksisterende relaterte klasser, og om nødvendig utvide eksisterende tilstander og atferd.
Et eksempel fra den virkelige verden på hvordan arv fungerer, ville være å vurdere frukt. Dette er en bred etikett som tjener til å kapsle inn en rekke forskjellige varer.
Et eple er en frukt og det samme er en appelsin. Imidlertid er en appelsin ikke et eple, så du ville ikke ha frukt som en av varene dine hvis du eide en butikk. Kanskje du kan ha en fruktdel i beholdningen din, og under den delen vil du ha mer spesifikke gjenstander som epler og appelsiner.
Slik fungerer arv.
Bruke arv i Java
Arv kan brukes på alle programmeringsspråk som bruker objektorientert programmeringsparadigme. Den nøyaktige måten arven brukes på er imidlertid avhengig av det spesifikke programmeringsspråket.
For eksempel, C ++ er også et objektorientert programmeringsspråk. C ++ støtter det som kalles flere arv, mens Java bare støtter enkelt arv.
Hva dette betyr er at en overordnet klasse i Java kan ha mange barneklasser, men hver barneklasse kan bare ha en enslig forelderklasse (enslig arv). Imidlertid er det en måte å oppnå indirekte flere arv i Java, ved å opprette et besteforeldres, foreldre og barns forhold.
Opprette foreldreklassen i Java
Prosessen med å velge en overordnet klasse fra et dokument med programvarekrav er kjent som objektorientert analyse. I løpet av denne prosessen brukes ofte uttrykket "er en" for å identifisere mulige arvforhold. Ved å tegne fra eksemplet vårt ovenfor, bør du kunne se at frukt vil være vår foreldreklasse.
Frukt Foreldreklasse Eksempel
offentlig klasse Frukt {
// Variabel erklæring
beskyttet Stringfrø;
beskyttet String skinColor;
beskyttet streng smak;
// Standardkonstruktør
offentlig frukt () {
seed = "";
skinColor = "";
smak = "";
}
// Primær konstruktør
offentlig frukt (strengfrø, strengeskinnfarge, strengesmak) {
this.seed = frø;
this.skinColor = skinColor;
dette. smak = smak;
}
// getters og setters
offentlig streng getSeed () {
returnere frø;
}
public void setSeed (Stringfrø) {
this.seed = frø;
}
offentlig streng getSkinColor () {
retur hudFarge;
}
public void setSkinColor (String skinColor) {
this.skinColor = skinColor;
}
offentlig streng getTaste () {
retur smak;
}
public void setTaste (String smak) {
dette. smak = smak;
}
// spise metoden
offentlig ugyldig spise () {
// generell kode for hvordan du spiser en frukt
}
// juice-metoden
offentlig tomrom juice () {
// generell kode for hvordan man kan juice en frukt
}
}
En av de mest bemerkelsesverdige aspektene av foreldreklassen ovenfor er tilgangsmodifikatoren som brukes med hver variabelerklæring. Den "beskyttede" tilgangsmodifikatoren er ideell for bruk i foreldreklasser fordi den forhindrer at ikke-barneklasser får tilgang til dataattributtene til foreldreklassen.
Lenger ned i koden blir du introdusert for konstruktører, getters og settere som er generelle byggesteiner for alle Java-klasser. Til slutt blir du introdusert for to metoder (juice og spis) som er opprettet i foreldreklassen til programmet vårt fordi de er universelle for alle frukter - alle frukter kan spises og saftes.
Lage barneklasser i Java
Barneklasser kalles vanligvis spesialiserte eller avledede klasser fordi de arver tilstand og oppførsel fra en forelder, og tilpasser ofte disse attributtene for å være mer spesifikke.
Fortsett med eksemplet vårt, bør du kunne se hvorfor appelsin ville være en passende barneklasse i fruktklassen ovenfor.
Eksempel på oransje barneklasse
offentlig klasse Orange utvider frukt {
// variabelerklæring
private int supremes;
// standardkonstruktør
offentlig oransje () {
supremes = 0;
}
// primær konstruktør
public Orange (Stringfrø, String skinColor, String smak, int supremes) {
super (frø, hudFarge, smak);
this.supremes = supremes;
}
// getters og setters
public int getsupremes () {
returnere supremes;
}
offentlige ugyldige setsupremes (int supremes) {
this.supremes = supremes;
}
// spise metoden
offentlig ugyldig spise () {
// hvordan spise en appelsin
}
// juice-metoden
offentlig tomrom juice () {
// hvordan juice og appelsin
}
// avskallingsmetode
offentlig tomromskall () {
// hvordan skrelle en appelsin
}
}
Det er en forskjell mellom hvordan en vanlig Java-klassedeklarasjon ser ut, og hva vi har i koden vår ovenfor. Nøkkelordet "utvider" er det som brukes i Java for å muliggjøre arv.
I vårt eksempel ovenfor utvider barneklassen (oransje) foreldreklassen (frukt). Derfor kan tilstanden og oppførselen til fruktklassen nå nås og endres av den oransje klassen.
Den unike egenskapen som vår oransje klasse har, er identifisert med variabelnavnet supremes (som er det offisielle navnet for de små segmentene som finnes i appelsiner). Det er her spesialisering spiller inn; ikke alle fruktene har supremer, men alle appelsiner, så det er logisk å reservere varianten for supremer for den oransje klassen.
Å legge til "peeling" -metoden til de eksisterende "eat" og "juice" -metodene er også logisk, for selv om ikke alle frukter kan skrelles, skrives appelsiner ofte.
Du bør huske på at hvis vi ikke hadde tenkt å endre de eksisterende "spise" og "juice" -metodene, ville vi ikke trenge å inkludere dem i vår oransje klasse. Metodene i den oransje klassen overstyrer enhver lignende metode i fruktklassen. Så hvis alle fruktene ble spist og saftet på samme måte, trenger vi ikke lage disse metodene i den oransje klassen.
Rollekonstruktørene spiller i arv
Som standard arves klassekonstruktører av barneklasser. Derfor, hvis et underordnet klasseobjekt opprettes, betyr dette at et overordnet klasseobjekt også opprettes automatisk.
Når vi går tilbake til eksemplet vårt, blir det også opprettet et fruktobjekt hver gang et nytt oransje objekt opprettes fordi en appelsin er en frukt.
Bak kulissene, når et underordnet klasseobjekt blir opprettet, kalles konstruktøren til overordnede klasse først etterfulgt av konstruktøren av underordnede klasse. I vår oransje barneklasse ovenfor, hvis et oransje objekt blir opprettet uten noen parametere, blir vår standard fruktklassekonstruktør kalt, etterfulgt av vår standard oransje klasseentreprenør.
"Super" -metoden i vår primære konstruktør ovenfor er nødvendig fordi den spesifiserer at den primære konstruktøren — og ikke standardkonstruktøren — av overordnet fruktklasse skal kalles når et oransje objekt med parametere er opprettet.
Nå kan du bruke arv i Java
Fra denne artikkelen klarte du å lære hva arv er, hvordan det fungerer, og hvorfor det er et så viktig konsept i programmering. Du kan nå opprette arveforholdene dine ved hjelp av Java-programmeringsspråket. Videre vet du nå hvordan du kan komme deg rundt Java's enkeltarvregel ved å skape et besteforeldres forhold.
Bildekreditt: Andreas Wohlfahrt /Pexels
Å få objektorientert programmering riktig betyr at du trenger å vite om arv og hvordan det kan forenkle koding og redusere feil.
Les Neste
- Programmering
- Java
- Objektorientert programmering

Kadeisha Kean er en full-stack programvareutvikler og teknisk / teknologiforfatter. Hun har den distinkte evnen til å forenkle noen av de mest komplekse teknologiske begrepene; produsere materiale som lett kan forstås av en hvilken som helst teknologinybegynner. Hun brenner for å skrive, utvikle interessant programvare og reise verden rundt (gjennom dokumentarer).
Abonner på vårt nyhetsbrev
Bli med på vårt nyhetsbrev for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!
Ett steg til…!
Bekreft e-postadressen din i e-posten vi nettopp sendte deg.