Artikkelinnhold
Tilbakekalling av Java -arv
Tenk på følgende klasse:
klasse cparentDenne klassen har to egenskaper: A og B. I Java kalles egenskaper felt. Denne klassen har en metode som legger til to tall, som er feltverdiene. Navnet på klassen er sele, med foregående C, for kalkulator. Følgende kodesegment i Main () -metoden, utganger 5:
Cparent Parent = new Cparent ();Tenk på følgende klasse, som er underklassen i ovennevnte klasse (cparent):
Klasse cild utvider cparentMerk bruken av nøkkelordet utvides. Denne klassen har feltet, C og metoden, Multiply (). Klassen arver feltene, 'A' og B, og metoden, legg til (). Imidlertid, hvis feltverdien for 'A' eller B skal brukes til dette nåværende instantierte objektet (barneobjekt), må det fortsatt tilordnes en verdi. For denne klassen multipliseres verdien av 'A' arvet med klassens feltverdi på C. Navnet på denne klassen er Cild, med foregående C, for kalkulator. Følgende kodesegment i Main () -metoden passer til denne klassen:
Cild child = new cild ();Utgangen er 8. Merk at selv om feltet 'A' ble arvet, måtte det fremdeles tilordnes en verdi; I dette tilfellet samme verdi.
Tenk på følgende klasse, som er underklassen i klassen ovenfor, Cild:
Klasse CgrandChild utvider CildMerk bruken av nøkkelordet utvides. Denne klassen har feltet, D og metoden, deling (). Klassen arver medlemmene, 'A', B, og Add () fra Cild -klassen, som arvet dem fra CPARTEN -klassen. Det arver også medlemmene, C og Multiply () fra Cild -klassen. Imidlertid, hvis feltverdien for 'A' eller B eller C, fra foreldre- eller besteforeldreklasser, skal brukes til dette nåværende instantierte objektet (barnebarnsobjekt), må det fremdeles tilordnes en verdi. For denne klassen er verdien av 'A' arvet delt av klassens feltverdi på D. Navnet på denne klassen er Cgrandchild, med foregående C, for kalkulator. Følgende kodesegment i Main () -metoden passer til denne klassen:
Cgrandchild gchild = new CgrandChild ();Utgangen er 1. Merk at selv om feltet 'A' ble arvet, måtte det fremdeles tilordnes en verdi; I dette tilfellet samme verdi, 2.
Bruk av supernøkkelordet
Felt og super
I programmet ovenfor ble verdien for feltet, 'A' satt tre ganger, en gang for overordnede objekt, en gang for barneobjektet, og en gang for barnebarnsobjektet. For å unngå denne tilbakestillingen hver gang, kan verdien av 2 tildeles en gang, i foreldreklasseimplementeringen (definisjon) som følger:
Dette løser problemet med å tilbakestille for hvert etterkommerobjekt. I etterkommerklassene blir feltet, 'a' ganske enkelt referert til (normalt).
For å få tilgang til verdien av et arvelig felt, må supernøkkelordet brukes i etterkommerklasseimplementeringen av interesse, som følger:
super.feltnavnFølgende kodesegment viser hvordan navnet 'A' har blitt åpnet, i en ny Cild -implementering:
Klasse cild utvider cparentKlassen, Cild, har nå sitt eget navn, P i stedet for 'A'. Og så uttalelsen i ADD () -metoden,
returner en * c;er nå,
return p * c;På en lignende måte kan klasseimplementeringen, Cgrandchild kan ha 'A' erstattet av Q, som følger:
Klasse CgrandChild utvider CildMerk: Arv finner sted i alle etterkommerklasser. 'A' -feltet og ADD () -metoden arves i Cild -klassen og til CgrandChild -klasse.
Metode og super
Tilsvarende kan det nås et arvelig felt ved implementeringen av en etterkommerklasse; En arvelig metode kan også nås i en etterkommerklasse ved å bruke super nøkkelordet. Syntaksen er:
Implementeringen av den opprinnelige Cild -klassen kan endres som følger:
Klasse cild utvider cparentLegg merke til at bruk av super. Den arvelige add () -metoden blir nå sett på som en "sum" i implementeringen av Cild. Feltet C, og metoden, Multiply (), er fremdeles der. Et kodesegment for tillegg i Main () -metoden som passer til denne modifiserte Cild -klassen er:
Cild child = new cild ();Utgangen er 5, forutsatt at foreldreklassen ble endret med:
int a = 2;Konstruktør og super
Standardkonstruktøren, som ikke er implementert, arves i hver etterkommerklasse og trenger ikke å redegjøres for i implementeringen av etterkommerne og i Main () -metoden. Når en foreldreklasse har en tilpasset konstruktør, må imidlertid resten av etterkommere ha en lignende konstruktør. Tenk på foreldreklassen, med en tilpasset konstruktør, som følger:
Feltene 'A' og B er erklært uten oppdrag. Konstruktøren gjør oppgaven. Barneklassen må ha den samme eller en lignende konstruktør. Den tilsvarende barneklassen for det originale kalkulatorhierarkiet kan være:
Klasse cild utvider cparentKonstruktøren her er den samme som foreldrenes. Konstruktørens kropp her har bare:
Super (x, y);som bare kaller konstruktøren til forelderen, med mottatte argumenter. “Super” her representerer foreldreklassekonstruktøren. Dette er en annen bruk av super. Det er ingen modifisering i denne barnekonstruktøren. Den tilsvarende barnebarnsklassen for det originale kalkulatorhierarkiet kan være:
Klasse CgrandChild utvider CildKonstruktøren her er endret. Den har de samme x- og y -parametrene og en ekstra parameter, z. z er å tilordne verdien for d, divisoren. Kroppen for konstruktøren begynner med å ringe konstruktøren til foreldreklassen. Da tildeles feltet for divisoren. Følgende kodesegment i Main () -metoden passer til denne klassen:
Cgrandchild gchild = new Cgrandchild (2, 3, 2);Utgangen for dette er 1.
Konklusjon
Super vil se etter noe i den umiddelbare foreldreklassen. Hvis den ikke ser det der, vil den se etter det i besteforeldreklassen. Hvis den ikke ser det der, vil den se etter det i oldeforeldrensklassen; Og så videre, til den enten ser det eller det ikke ser det. "Super" brukes vanligvis innen implementeringen av en underklasse. Det brukes til felt, metode og konstruktør. Den direkte superklassen er overordnet klasse. Besteforelderklassen er en superklasse, men ikke den direkte superklassen. Deretter skal leseren forstå bruken av "super" med nestede klasser - se senere.