Arv er et af kernebegreberne inden for objektorienteret programmering. I programmering repræsenterer ordet arv et forhold, hvor en underordnet klasse antager en forældreklasses tilstand og opførsel.
Formålet med arv i softwareudvikling er at lette genbrug af sikker og pålidelig software. En af de største fordele ved at bruge arv er, at det eliminerer overflødig kode i dine programmer.
Sådan fungerer arv
Ideen bag arv er, at mange klasser eller objekter har nogle af det samme sæt attributter og metoder. Derfor kan nye klasser i ånden med at producere pålidelig software trække på allerede eksisterende relaterede klasser og om nødvendigt udvide de eksisterende stater og adfærd.
Et virkeligt eksempel på, hvordan arv fungerer, ville være at betragte frugt. Dette er en bred etiket, der tjener til at indkapsle en række forskellige emner.
Et æble er en frugt og også en appelsin. En appelsin er dog ikke et æble, så du ville ikke have frugt som en af dine lagervarer, hvis du ejede en butik. Måske kunne du have et frugtafsnit i din beholdning, og under det afsnit ville du have mere specifikke genstande som æbler og appelsiner.
Sådan fungerer arv.
Brug af arv i Java
Arv kan bruges på ethvert programmeringssprog, der bruger objektorienteret programmeringsparadigme. Den nøjagtige måde, hvorpå arv bruges, afhænger dog af det specifikke programmeringssprog.
For eksempel, C ++ er også et objektorienteret programmeringssprog. C ++ understøtter det, der kaldes multipel arv, mens Java kun understøtter enkelt arv.
Hvad dette betyder er, at en overordnet klasse i Java kan have mange underordnede klasser, men hver underordnet klasse kan kun have en enlig forælderklasse (enkelt arv). Der er dog en måde at opnå indirekte flere arv i Java ved at skabe et bedsteforældres, forældres og barneforhold.
Oprettelse af overordnet klasse i Java
Processen med at vælge en overordnet klasse fra et dokument med softwarekrav kaldes objektorienteret analyse. I løbet af denne proces bruges udtrykket "er a" ofte til at identificere mulige arvelige forhold. På baggrund af vores eksempel ovenfor skal du være i stand til at se, at frugt ville være vores forældreklasse.
Frugt Forældre klasse Eksempel
offentlig klasse Frugt {
// Variabel erklæring
beskyttet Stringfrø;
beskyttet String skinColor;
beskyttet String smag;
// Standardkonstruktør
offentlig frugt () {
frø = "";
skinColor = "";
taste = "";
}
// Primær konstruktør
offentlig frugt (streng frø, streng hud Farve, streng smag) {
this.seed = frø;
this.skinColor = skinColor;
denne. smag = smag;
}
// getters og setters
offentlig streng getSeed () {
returnere frø;
}
public void setSeed (strengfrø) {
this.seed = frø;
}
offentlig streng getSkinColor () {
retur hudFarve;
}
public void setSkinColor (String skinColor) {
this.skinColor = skinColor;
}
offentlig streng getTaste () {
returnere smag;
}
public void setTaste (Strengsmag) {
denne. smag = smag;
}
// spise metode
offentlig ugyldighed spiser () {
// generel kode for, hvordan man spiser en frugt
}
// juice metode
offentlig tomrumsjuice () {
// generel kode for, hvordan man frugter en frugt
}
}
Et af de mest bemærkelsesværdige aspekter af den overordnede klasse ovenfor er adgangsmodifikatoren, der bruges med hver variabelerklæring. Den "beskyttede" adgangsmodifikator er ideel til brug i overordnede klasser, fordi den forhindrer ikke-underordnede klasser i at få adgang til dataattributterne i overordnede klassen.
Længere nede i koden introduceres du for konstruktører, getters og settere, der er generelle byggesten til enhver Java-klasse. Endelig introduceres du til to metoder (saft og spis), der oprettes i overordnede klassen i vores program, fordi de er universelle for alle frugter - alle frugter kan spises og saftes.
Oprettelse af børneklasser i Java
Barneklasser kaldes normalt specialiserede eller afledte klasser, fordi de arver tilstand og adfærd fra en forælder og ofte tilpasser disse attributter til at være mere specifikke.
Fortsat med vores eksempel, skal du være i stand til at se, hvorfor appelsin ville være en passende barneklasse i frugtklassen ovenfor.
Eksempel på orange barneklasse
offentlig klasse Orange udvider frugt {
// variabel erklæring
private int supremes;
// standardkonstruktør
offentlig Orange () {
supremes = 0;
}
// primær konstruktør
public Orange (Stringfrø, String skinColor, String smag, int supremes) {
super (frø, hudFarve, smag);
this.supremes = supremes;
}
// getters og setters
public int getsupremes () {
returnere supremes
}
offentlige ugyldige setsupremes (int supremes) {
this.supremes = supremes;
}
// spise metode
offentlig ugyldighed spiser () {
// hvordan man spiser en appelsin
}
// juice metode
offentlig tomrumsjuice () {
// hvordan juice og appelsin
}
// skrælmetode
offentlig ugyldig skræl () {
// hvordan man skræller en appelsin
}
}
Der er forskel på, hvordan en almindelig Java-klassedeklaration ser ud, og hvad vi har i vores kode ovenfor. Nøgleordet "udvider" er det, der bruges i Java for at muliggøre arv.
I vores eksempel ovenfor udvider barneklassen (orange) forældreklassen (frugt). Derfor kan status og opførsel af frugtklassen nu åbnes og ændres af den orange klasse.
Den unikke attribut, som vores orange klasse har, er identificeret med variabelnavnet supremes (som er det officielle navn for de små segmenter, der findes i appelsiner). Det er her specialisering spiller ind; ikke alle frugter har supremer, men alle appelsiner, så det er logisk at reservere variablen supremes til den orange klasse.
Tilføjelse af "skræl" -metoden til de allerede eksisterende "spise" og "juice" -metoder er også logisk, for selvom ikke alle frugter kan skrælles, skrælles appelsiner ofte.
Du skal huske på, at hvis vi ikke havde til hensigt at ændre de eksisterende "spise" og "saft" -metoder, behøver vi ikke medtage dem i vores orange klasse. Metoderne i den orange klasse tilsidesætter enhver lignende metode i frugtklassen. Så hvis alle frugter blev spist og saftet på samme måde, behøver vi ikke skabe disse metoder i den orange klasse.
Rollekonstruktørerne spiller i arv
Som standard arves klassekonstruktører af underordnede klasser. Derfor, hvis der oprettes et underordnet klasseobjekt, betyder det, at et overordnet klasseobjekt også oprettes automatisk.
Går vi tilbage til vores eksempel, hver gang der oprettes et nyt orange objekt, oprettes der også et frugtobjekt, fordi en orange er en frugt.
Bag kulisserne, når et underordnet klasseobjekt oprettes, kaldes konstruktøren for overordnede klasse først efterfulgt af konstruktøren af underordnet klasse. I vores orange barneklasse ovenfor, hvis der oprettes et orange objekt uden nogen parametre, kaldes vores standardfruktklassekonstruktør efterfulgt af vores standard orange klassekontrahent.
"Super" -metoden i vores primære konstruktør ovenfor er nødvendig, fordi den specificerer, at den primære konstruktør - og ikke standardkonstruktøren — i den overordnede frugtklasse skal kaldes, når der er et orange objekt med parametre oprettet.
Nu kan du bruge arv i Java
Fra denne artikel kunne du lære, hvad arv er, hvordan det fungerer, og hvorfor det er et så vigtigt koncept i programmering. Du kan nu oprette dine arveforhold ved hjælp af Java-programmeringssproget. Desuden ved du nu, hvordan du kommer omkring Java's enkelt arvregel ved at skabe et bedsteforældres forhold.
Billedkredit: Andreas Wohlfahrt /Pexels
At få objektorienteret programmering rigtigt betyder, at du har brug for at vide om arv, og hvordan det kan forenkle kodning og reducere fejl.
Læs Næste
- Programmering
- Java
- Objektorienteret programmering
Kadeisha Kean er en full-stack softwareudvikler og teknisk / teknologiforfatter. Hun har den særskilte evne til at forenkle nogle af de mest komplekse teknologiske begreber; producerer materiale, der let kan forstås af enhver teknologinevner. Hun brænder for at skrive, udvikle interessant software og rejse verden rundt (gennem dokumentarfilm).
Abonner på vores nyhedsbrev
Deltag i vores nyhedsbrev for tekniske tip, anmeldelser, gratis e-bøger og eksklusive tilbud!
Et trin mere !!!
Bekræft din e-mail-adresse i den e-mail, vi lige har sendt dig.