Treść artykułu
Przywołanie dziedziczenia Java
Rozważ następującą klasę:
klasa carentTa klasa ma dwie właściwości: a i b. W Javie właściwości nazywane są pola. Ta klasa ma jedną metodę, która dodaje dwie liczby, które są wartościami pola. Nazwa klasy jest carent, z poprzednim C, dla kalkulatora. Poniższy segment kodu w metodzie Main () wyniki 5:
Carent rodzic = new carent ();Rozważ następującą klasę, która jest podklasą powyższej klasy (carent):
Klasa Cchild rozszerza carentZwróć uwagę, że użycie słowa kluczowego rozszerza się. Ta klasa ma pole, c i metodę, pomnóż (). Klasa dziedziczy pola, „A” i B oraz metodę, add (). Jeśli jednak wartość pola dla „A” lub B ma być używana dla tego bieżącego obiektu utworzonego (obiekt dziecięcy), nadal należy ją ponownie przypisać wartość. W przypadku tej klasy wartość „A” dziedziconego jest mnożona przez wartość polowa klasy C. Nazwa tej klasy to Cchild, z poprzednim C, dla kalkulatora. Poniższy segment kodu w metodzie Main () odpowiada tej klasie:
Cchild child = new cchild ();Wyjście to 8. Zauważ, że chociaż pole „A” zostało odziedziczone, nadal musiało zostać przeniesione jako wartość; W takim przypadku ta sama wartość.
Rozważ następującą klasę, która jest podklasą powyższej klasy, Cchild:
Klasa CGRANDCHILD rozszerza CCHILDZwróć uwagę, że użycie słowa kluczowego rozszerza się. Ta klasa ma pole, D i metodę, podziel (). Klasa dziedziczy członków, „A”, B i Add () z klasy Cchild, która odziedziczyła ich po klasie Cparent. Dziedziczy także członków, c i mnożenie () z klasy cchild. Jeśli jednak wartość pola dla „A” lub B lub C, z klas rodzica lub dziadka, ma być używana dla obecnego obiektu utworzonego (obiekt wnuka), nadal należy ją ponownie przypisać wartość. W przypadku tej klasy wartość „odziedziczonego jest podzielona przez wartość pola d wynoszącą klasę. Nazwa tej klasy to cgrandchild, z poprzednim c, dla kalkulatora. Poniższy segment kodu w metodzie Main () odpowiada tej klasie:
Cgrandchild gchild = new cGrandChild ();Wyjście to 1. Zauważ, że chociaż pole „A” zostało odziedziczone, nadal musiało zostać przeniesione jako wartość; W takim przypadku ta sama wartość, 2.
Użycie słowa kluczowego super
Pole i super
W powyższym programie wartość pola „A” ustawiono trzy razy, raz na obiekt nadrzędny, raz na obiekt dziecięcy i raz dla obiektu wnuka. Aby uniknąć tego resetowania za każdym razem, wartość 2 można przypisać raz, w implementacji klasy nadrzędnej (definicja) w następujący sposób:
To rozwiązuje problem resetowania dla każdego obiektu potomka. W klasach potomków pole „A” jest po prostu określane (normalnie).
Aby uzyskać dostęp do wartości odziedziczonego pola, super kluczowe słowo kluczowe musi być używane w wdrażaniu zainteresowań klasy potomków, w następujący sposób:
Super.Nazwa polaPoniższy segment kodu pokazuje, w jaki sposób dostęp do nazwy „A”, w nowej implementacji CCHILD:
Klasa Cchild rozszerza carentKlasa, Cchild, ma teraz swoją własną nazwę, P zamiast „A”. I tak instrukcja w metodzie add (),
zwrócić * c;jest teraz,
powrót p * c;W podobny sposób implementacja klasy, Cgrandchild może „zastąpić” Q, w następujący sposób:
Klasa CGRANDCHILD rozszerza CCHILDUwaga: Dziedziczenie odbywa się we wszystkich klasach potomków. Pole „A” i metoda add () są dziedziczone w klasie CCHILD i na klasę Cgrandchild.
Metoda i super
Podobnie do dziedzicznego pola można uzyskać do wdrażania klasy potomków; Metodę odziedziczoną można również uzyskać w klasie potomków, używając słowa kluczowego super. Składnia to:
Wdrożenie oryginalnej klasy CCHILD można modyfikować w następujący sposób:
Klasa Cchild rozszerza carentZauważ, że użycie super. Metoda odziedziczona add () jest teraz postrzegana jako „suma” we wdrażaniu CCHILD. Pole C i metoda, pomnóż (), wciąż tam są. Segment kodu do dodania w metodzie Main (), która odpowiada tej zmodyfikowanej klasie CCHILD, to:
Cchild child = new cchild ();Wyjście to 5, zakładając, że klasa nadrzędna została zmodyfikowana za pomocą:
int a = 2;Konstruktor i super
Domyślny konstruktor, który nie jest wdrażany, jest dziedziczony na każdą klasę potomków i nie musi być rozliczany podczas wdrażania potomków i w metodzie Main (). Jednak gdy klasa nadrzędna ma niestandardowy konstruktor, reszta jego potomków musi mieć podobny konstruktor. Rozważ klasę nadrzędną z niestandardowym konstruktorem, w następujący sposób:
Pola „A” i B są zadeklarowane bez przypisania. Konstruktor wykonuje przypisanie. Klasa dziecięca musi mieć ten sam lub podobny konstruktor. Odpowiednią klasę dziecka dla oryginalnej hierarchii kalkulatora może być:
Klasa Cchild rozszerza carentKonstruktor tutaj jest taki sam jak w przypadku rodzica. Ciało konstruktora tutaj po prostu:
super (x, y);który po prostu nazywa konstruktora rodzica, z otrzymanymi argumentami. „Super” tutaj reprezentuje konstruktor klasy nadrzędnej. To kolejne zastosowanie super. Nie ma modyfikacji w tym konstruktorze dziecka. Odpowiednią klasę wnuka dla oryginalnej hierarchii kalkulatora może być:
Klasa CGRANDCHILD rozszerza CCHILDKonstruktor tutaj jest modyfikowany. Ma te same parametry x i y i dodatkowy parametr, z. Z oznacza przypisanie wartości D, dzielnika. Ciało dla konstruktora zaczyna od wywołania konstruktora klasy nadrzędnej. Następnie przypisane jest pole dzieliny. Poniższy segment kodu w metodzie Main () odpowiada tej klasie:
Cgrandchild gchild = nowy Cgrandchild (2, 3, 2);Wyjście to jest 1.
Wniosek
Super będzie szukał czegoś w bezpośrednim klasie rodziców. Jeśli go tam nie zobaczy, będzie szukał go w klasie dziadków. Jeśli go tam nie zobaczy, będzie szukał go w klasie pradziadka; I tak dalej, dopóki go nie zobaczy, albo go nie zobaczy. „Super” jest zwykle używane w realizacji podklasy. Jest stosowany do pola, metody i konstruktora. Bezpośrednia nadklasa to klasa nadrzędna. Klasa dziadka jest nadklasą, ale nie bezpośrednią nadklasą. Następnie czytelnik powinien zrozumieć użycie „super” z zagnieżdżonymi klasami - patrz później.