CodeGym/Java blog/Véletlen/Alaposztályú konstruktorok
John Squirrels
Szint
San Francisco

Alaposztályú konstruktorok

Megjelent a csoportban
Szia! Múltkor a konstruktőrökről beszélgettünk, és sokat tanultunk róluk. Most az alaposztályú konstruktorokról fogunk beszélni .
Alaposztályú konstruktorok - 1
Mi az alaposztály ? Ez azzal a ténnyel kapcsolatos, hogy a Java-ban több különböző osztálynak lehet közös eredete.
Alaposztályú konstruktorok - 2
Ezt nevezzük öröklődésnek . Több gyermekosztálynak lehet egy közös őse. Például képzeljük el, hogy van egy Animalosztályunk:
public class Animal {

   String name;
   int age;
}
2 gyermekosztályt deklarálhatunk: Catés Dog. Ez az extends kulcsszó használatával történik .
public class Cat extends Animal {

}

public class Dog extends Animal {

}
Ezt a jövőben hasznosnak találhatjuk. Például, ha van egy feladat egerek fogására, akkor létrehozunk egy Cat objektumot a programunkban. Ha az a feladat, hogy egy botot kergessünk, akkor egy tárgyat használunk Dog . És ha létrehozunk egy programot, amely egy állatorvosi klinikát szimulál, az együtt fog működni az Animal osztállyal (és így képes lesz macskák és kutyák kezelésére is). Nagyon fontos megjegyezni, hogy amikor egy objektumot létrehozunk, először az alaposztályának konstruktorát hívjuk meg . Csak a konstruktor befejezése után hajtja végre a program az általunk létrehozott objektumnak megfelelő osztály konstruktorát. CatMás szóval, egy objektum létrehozásakor először a Animalkonstruktor fut le , és csak utána fut le aCatkivitelező végrehajtva . Ennek megtekintéséhez adjon hozzá néhány konzolkimenetet a Catés Animalkonstruktorokhoz.
public class Animal {

   public Animal() {
       System.out.println("Animal constructor executed");
   }
}


public class Cat extends Animal {

   public Cat() {
       System.out.println("Cat constructor executed!");
   }

   public static void main(String[] args) {
       Cat cat = new Cat();
   }
}
Konzol kimenet: Az Animal konstruktor végrehajtva Cat konstruktor végrehajtva! Valóban, ez így működik! Miért? Ennek egyik oka az, hogy kerüljük a két osztály között megosztott mezők megkettőzését. Például minden állatnak van szíve és agya, de nem minden állatnak van farka. Deklarálhatnánk agy- és szívmezőket , amelyek minden állatnál közösek, a szülőosztályban Animal, és egy farokmezőt az alosztályban Cat. . Most deklarálunk egy Catosztálykonstruktort, amely mind a 3 mező argumentumát veszi fel.
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Megjegyzés: A konstruktor akkor is megfelelően működik, ha az Catosztálynak nincs agy- és szívmezője . AnimalEzek a mezők az alaposztályból „örököltek” . Az öröklődő osztály hozzáfér az alaposztály mezőihez , így azok láthatók az osztályunkban Cat. Ennek eredményeként nem kell megkettőznünk ezeket a mezőket az osztályban Cat. Elvihetjük őket az osztályból Animal. Sőt, az alaposztály-konstruktort kifejezetten hívhatjuk a gyermekosztály-konstruktorban. Az alaposztályt „ szuperosztálynak ” is nevezik. Ezért használja a Java a super kulcsszót az alaposztály jelzésére. Az előző példában
public Cat(String brain, String heart, String tail) {
       this.brain = brain;
       this.heart = heart;
       this.tail = tail;
   }
A szülőosztályunkban minden mezőt külön-külön hozzárendeltünk. Valójában ezt nem kell tennünk. Elég meghívni a szülő osztály konstruktorát és átadni a szükséges argumentumokat:
public class Animal {

   String brain;
   String heart;

   public Animal(String brain, String heart) {
       this.brain = brain;
       this.heart = heart;
   }

public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       this.tail = tail;
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
A konstruktorban Catfelhívtuk a Animalkonstruktort és áthaladtunk két mezőn. Csak egy mezőt kellett kifejezetten inicializálnunk: a tail , amely nem szerepel a -ban Animal. Emlékszel, hogy említettük, hogy a szülő osztály konstruktorát hívják meg először, amikor egy objektumot létrehoznak? Ezért a konstruktorban mindig a szuper() legyen az első! Ellenkező esetben a konstruktor logikája megsérül, és a program hibát generál.
public class Cat extends Animal {

   String tail;

   public Cat(String brain, String heart, String tail) {
       this.tail = tail;
       super(brain, heart);// Error!
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
A fordító tudja, hogy ha egy gyermekosztály objektumát létrehozzák, akkor először az alaposztály konstruktorát hívják meg. És ha megpróbálja manuálisan megváltoztatni ezt a viselkedést, a fordító nem engedi.

Hogyan jön létre egy objektum

Korábban megnéztünk egy példát egy alap- és szülőosztályra: Animalés Cat. Ezt a két osztályt példaként használva most megvizsgáljuk az objektumok létrehozásának és a változók inicializálásának folyamatát. Tudjuk, hogy vannak statikus és példány (nem statikus) változók . Azt is tudjuk, hogy az Animalalaposztálynak vannak változói, a Catgyermekosztálynak pedig sajátja. Az egyértelműség kedvéért egy-egy statikus változót adunk a Animalés Catosztályokhoz. Az osztályban az animalCount változó Animala Földön található állatfajok teljes számát és a catCount-ot jelentiváltozó a macskafajok számát jelöli. Ezenkívül mindkét osztályban minden nem statikus változóhoz kiindulási értékeket rendelünk (amelyek ezután megváltoznak a konstruktorban).
public class Animal {

   String brain = "Initial value of brain in the Animal class";
   String heart = "Initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("Animal base class constructor is running");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("Current value of static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in the Animal class = " + this.brain);
       System.out.println("Current value of heart in the Animal class = " + this.heart);
       System.out.println("Have the variables of the Cat class already been initialized?");
       System.out.println("Current value of static variable catCount = " + Cat.catCount);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor is done!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The cat class constructor has started (The Animal constructor already finished)");
       System.out.println("Current value of static variable catCount = " + catCount);
       System.out.println("Current value of tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value of tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Tehát az osztály új példányát hozzuk létre Cat, amely örökli a Animal. Hozzáadtunk néhány részletes konzolkimenetet, hogy lássuk, mi történik és milyen sorrendben. Ez jelenik meg egy Catobjektum létrehozásakor: Az Animal alaposztály konstruktor fut. Az Animal osztály változói már inicializálva vannak? A statikus változó aktuális értéke animalCount = 7700000 Az agy aktuális értéke az Animal osztályban = Az agy kezdeti értéke az Állatok osztályban A szív aktuális értéke az Állatok osztályban = A szív kezdeti értéke az Állatok osztályban A Cat osztály változói már megvannak. inicializálva lett? A statikus változó aktuális értéke catCount = 37 Az állati alaposztály konstruktor kész! Az agy aktuális értéke = Agy Aktuális érték szív = Szív A macska osztály konstruktor elindult (Az állat konstruktor már befejezte) A statikus változó aktuális értéke catCount = 37 A farok aktuális értéke = A farok kezdeti értéke a Cat osztályban A farok jelenlegi értéke = Farok Tehát most már világosan láthatjuk a változó inicializálásának és a konstruktorhívásoknak a sorrendjét egy új objektum létrehozásakor:
  1. Az alaposztály ( ) statikus változói Animalinicializálva vannak. Esetünkben az Animalosztály animalCount változója 7700000.

  2. A gyermekosztály ( ) statikus változói Catinicializálva vannak.

    Megjegyzés: még mindig bent vagyunk a Animalkonstruktorban, és már megjelenítettük:

    Az Animal alaposztály konstruktor fut.
    Az Animal osztály változói már inicializálva vannak?
    A statikus változó aktuális értéke animalCount = 7700000
    Az agy aktuális értéke az Animal osztályban = Az agy kezdeti értéke az Állatok osztályban A
    szív aktuális értéke az Állatok osztályban = A szív kezdeti értéke az Állatok osztályban
    A Cat osztály változói már megvannak. inicializálva lett?
    A catCount statikus változó aktuális értéke = 37


  3. Ezután az alaposztály nem statikus változói inicializálódnak. Kifejezetten kezdeti értékeket rendeltünk hozzájuk, amelyeket aztán lecserélünk a konstruktorban. Az Animal konstruktor még nem fejeződött be, de az agy és a szív kezdeti értékei már hozzá vannak rendelve:

    Az Animal alaposztály konstruktor fut.
    Az Animal osztály változói már inicializálva vannak?
    A statikus változó aktuális értéke animalCount = 7700000
    Az agy aktuális értéke az Animal osztályban = Az agy kezdeti értéke az Állatok osztályban A
    szív aktuális értéke az Állatok osztályban = A szív kezdeti értéke az Állatok osztályban


  4. Elindul az alaposztály-konstruktor .
    Már meggyõzõdtünk arról, hogy ez a lépés a negyedik: a Animalkonstruktor elején található elsõ három lépésben már sok változóhoz hozzárendeltek értéket.


  5. A gyermekosztály ( ) nem statikus mezői Catinicializálva vannak.
    Ez azelőtt történik, hogy a Catkonstruktor futni kezdene.
    Amikor elindul, a farokváltozónak már van értéke:

    A cat osztály konstruktor elindult (Az állat konstruktor már befejezte) A statikus változó aktuális értéke catCount = 37 A farok aktuális értéke = a farok kezdeti értéke a Cat osztályban


  6. A Catgyermekosztály konstruktorát ún

    És így néz ki egy objektum létrehozása Java nyelven!

    Azt kell mondanom, hogy nem vagyunk nagy rajongói a rote-learningnek, de a legjobb, ha megjegyezzük a változó inicializálásának és a konstruktorhívások sorrendjét .

    Ez nagymértékben javítja a program folyamának megértését és az objektumok állapotát egy adott pillanatban.

    Ráadásul sok osztály nem alkalmaz öröklődést. Ebben az esetben az alaposztályhoz kapcsolódó lépések nem érvényesek.

Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései