Super słowo kluczowe w Javie

Super słowo kluczowe w Javie
Słowo kluczowe super jest używane w dziedziczeniu klas Java. W Javie superklasa jest klasą macierzystą bieżącej klasy. Obecna klasa to klasa dziecięca (podklasa) nadklasy. Istnieje możliwość, że wnuk i prawnuki spadną w dół. Klasa nadrzędna to bezpośrednia nadklasa bieżącej klasy. Klasa dziadka nie jest bezpośrednią nadklasą obecnej klasy. W tym artykule wyjaśniono użycie słowa kluczowego, super w Javie. Zaczyna się od przedstawienia klasy rodzicielskiej, dziecka klasy rodzicielskiej i wnuka klasy rodzicielskiej. Następnie pokazuje, jak słowo, super, pasuje do hierarchii. Poniższa hierarchia tworzy formę kalkulatora.

Treść artykułu

  • Przywołanie dziedziczenia Java
  • Użycie słowa kluczowego super
  • Wniosek

Przywołanie dziedziczenia Java

Rozważ następującą klasę:

klasa carent
int a;
int b;
int add ()
zwrócić A + B;

Ta 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 ();
rodzic.a = 2;
rodzic.B = 3;
int radd = rodzic.dodać();
System.na zewnątrz.println (radd);

Rozważ następującą klasę, która jest podklasą powyższej klasy (carent):

Klasa Cchild rozszerza carent
int c;
int mnofon ()
zwrócić * c;

Zwróć 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 ();
dziecko.a = 2;
dziecko.c = 4;
int rmult = dziecko.zwielokrotniać();
System.na zewnątrz.println (rmult);

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 CCHILD
int d;
int Divide ()
zwrot a / d;

Zwróć 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 ();
Gchild.a = 2;
Gchild.D = 2;
int rdiv = gchild.dzielić();
System.na zewnątrz.println (RDIV);

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:

klasa carent
int a = 2;
int b;
int add ()
zwrócić A + 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 pola

Poniższy segment kodu pokazuje, w jaki sposób dostęp do nazwy „A”, w nowej implementacji CCHILD:

Klasa Cchild rozszerza carent
int p = super.A;
int c;
int mnofon ()
powrót p * c;

Klasa, 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 CCHILD
int q = super.A;
int d;
int Divide ()
powrót Q / D;

Uwaga: 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:

Super.MethodName ()

Wdrożenie oryginalnej klasy CCHILD można modyfikować w następujący sposób:

Klasa Cchild rozszerza carent
int c;
int sum = super.dodać();
int mnofon ()
zwrócić * c;

Zauważ, ż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 ();
int rsum = dziecko.suma;
System.na zewnątrz.println (rsum);

Wyjście to 5, zakładając, że klasa nadrzędna została zmodyfikowana za pomocą:

int a = 2;
int b = 3;

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:

klasa carent
int a, b;
public carent (int x, int y)
a = x; B = y;

int add ()
zwrócić A + 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 carent
Cchild (int x, int y)
super (x, y);

int c;
int mnofon ()
zwrócić * c;

Konstruktor 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 CCHILD
int d;
Cgrandchild (int x, int y, int z)
super (x, y);
d = z;

int Divide ()
zwrot a / d;

Konstruktor 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);
int rdiv = gchild.dzielić();
System.na zewnątrz.println (RDIV);

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.