Contenuto dell'articolo
Ricordiamo dell'eredità di Java
Considera la seguente classe:
class cparentQuesta classe ha due proprietà: A e B. In Java, le proprietà sono chiamate campi. Questa classe ha un metodo che aggiunge due numeri, che sono i valori del campo. Il nome della classe è CPARENT, con la precedente C, per la calcolatrice. Il seguente segmento di codice nel metodo principale (), emette 5:
CParent genitore = new cParent ();Considera la seguente classe, che è la sottoclasse della classe sopra (CParent):
Class cchild estende cParentNota l'uso della parola chiave si estende. Questa classe ha il campo, C e il metodo, multiply (). La classe eredita i campi, 'a' e b e il metodo, aggiungi (). Tuttavia, se il valore del campo per "A" o B deve essere utilizzato per questo oggetto istanziato attuale (oggetto figlio), deve ancora essere riassegnato un valore. Per questa classe, il valore di "A" ereditato viene moltiplicato per il valore di campo della classe di C. Il nome di questa classe è cchild, con la precedente C, per la calcolatrice. Il seguente segmento di codice nel metodo principale () si adatta a questa classe:
CChild Child = new CChild ();L'output è 8. Si noti che, sebbene il campo "A" fosse ereditato, doveva ancora essere riassegnato un valore; In questo caso, lo stesso valore.
Considera la seguente classe, che è la sottoclasse della classe sopra, CCHILD:
Class CGrandChild estende cchildNota l'uso della parola chiave si estende. Questa classe ha il campo, d e il metodo, divide (). La classe eredita i membri, 'A', B e Aggiungi () dalla classe CCHILD, che li ha ereditati dalla classe CParent. Eredita anche i membri, C e Multiply () dalla classe CCHILD. Tuttavia, se il valore di campo per "A" o B o C, dalle classi genitore o nonno, deve essere utilizzato per questo oggetto istanziato attuale (oggetto nipote), deve ancora essere riassegnato un valore. Per questa classe, il valore di "A" ereditato è diviso per il valore di campo della classe di D. Il nome di questa classe è cgrandchild, con la precedente C, per il calcolatore. Il seguente segmento di codice nel metodo principale () si adatta a questa classe:
Cgrandchild gchild = new cgrandchild ();L'output è 1. Si noti che, sebbene il campo "A" fosse ereditato, doveva ancora essere riassegnato un valore; In questo caso, lo stesso valore, 2.
Uso della parola chiave super
Campo e super
Nel programma sopra, il valore per il campo, "A" è stato impostato tre volte, una volta per l'oggetto genitore, una volta per l'oggetto figlio e una volta per l'oggetto nipote. Per evitare questo ripristino ogni volta, il valore di 2 può essere assegnato una volta, nell'implementazione della classe genitore (definizione) come segue:
Ciò risolve il problema del ripristino per ogni oggetto discendente. Nelle classi discendenti, il campo, "a" viene semplicemente indicato (normalmente).
Per accedere al valore di un campo ereditario, la parola chiave deve essere utilizzata nell'attuazione della classe discendente di interesse, come segue:
super.fieldnameIl seguente segmento di codice mostra come è stato accesso il nome "A", in una nuova implementazione CCHILD:
Class cchild estende cParentLa classe, Cchild, ora ha il suo nome, P invece di "A". E quindi l'affermazione nel metodo Add (),
restituire un * c;è ora,
restituire p * c;Allo stesso modo, l'implementazione della classe, CgrandChild può avere "un" sostituito da Q, come segue:
Class CGrandChild estende cchildNota: l'eredità avviene in tutte le classi discendenti. Il metodo "un" campo e add () viene ereditato nella classe CCHILD e nella classe CGrandChild.
Metodo e super
Allo stesso modo, è possibile accedere a un campo ereditato nell'attuazione di una classe discendente; È possibile accedere anche a un metodo ereditato in una classe discendente, utilizzando la parola chiave. La sintassi è:
L'implementazione della classe CCHILD originale può essere modificata come segue:
Class cchild estende cParentSi noti che l'uso di super. Il metodo Add () ereditato è ora visto come una "somma" nell'implementazione di CCHILD. Il campo C e il metodo, multiply (), sono ancora lì. Un segmento di codice per l'aggiunta nel metodo principale () adatto a questa classe CCHILD modificata è:
CChild Child = new CChild ();L'output è 5, supponendo che la classe genitore sia stata modificata con:
int a = 2;Costruttore e super
Il costruttore predefinito, che non è implementato, viene ereditato in ogni classe discendente e non deve essere spiegato nell'attuazione dei discendenti e nel metodo principale (). Tuttavia, una volta che una classe genitore ha un costruttore personalizzato, il resto dei suoi discendenti deve avere un costruttore simile. Considera la classe madre, con un costruttore personalizzato, come segue:
I campi di "A" e B sono dichiarati senza incarico. Il costruttore esegue l'incarico. La classe figlio deve avere lo stesso o un costruttore simile. La classe figlio corrispondente per la gerarchia del calcolatore originale può essere:
Class cchild estende cParentIl costruttore qui è lo stesso di quello del genitore. Il corpo del costruttore qui ha solo:
super (x, y);che chiama solo il costruttore del genitore, con gli argomenti ricevuti. "Super" qui rappresenta il costruttore della classe genitore. Questo è un altro uso di super. Non ci sono modifiche in questo bambino costruttore. La classe di nipote corrispondente per la gerarchia del calcolatore originale può essere:
Class CGrandChild estende cchildIl costruttore qui è modificato. Ha gli stessi parametri X e Y e un parametro extra, Z. Z è assegnare il valore per D, il divisore. Il corpo per il costruttore inizia chiamando il costruttore della classe genitore. Quindi viene assegnato il campo per il divisore. Il seguente segmento di codice nel metodo principale () si adatta a questa classe:
Cgrandchild gchild = new cgrandchild (2, 3, 2);L'output per questo è 1.
Conclusione
Super cercherà qualcosa nella classe dei genitori immediati. Se non lo vede lì, lo cercherà nella classe nonna. Se non lo vede lì, lo cercherà nella classe del nonno; e così via, fino a quando non lo vede o non lo vede. "Super" viene solitamente utilizzato all'interno dell'implementazione di una sottoclasse. È usato per campo, metodo e costruttore. La superclasse diretta è la classe genitore. La classe nonna è una superclasse, ma non la superclasse diretta. Successivamente, il lettore dovrebbe capire l'uso di "super" con le classi nidificate - vedi più tardi.