Animal
(hayop):
public class Animal {
String name;
int age;
}
Maaari kaming lumikha para dito, halimbawa, 2 descendant classes - Cat
at Dog
. Ginagawa ito gamit ang keyword extends
.
public class Cat extends Animal {
}
public class Dog extends Animal {
}
Ito ay maaaring maging kapaki-pakinabang sa atin sa hinaharap. Halimbawa, kung ang gawain ay manghuli ng mga daga, gagawa kami ng isang bagay sa programa Cat
. Kung ang gawain ay tumakbo pagkatapos ng isang stick, pagkatapos ay ginagamit namin ang object Dog
. At kung gagawa tayo ng programa na gayahin ang isang beterinaryo na klinika, gagana ito sa klase Animal
(upang magamot ang parehong pusa at aso). Napakahalagang tandaan para sa hinaharap na kapag lumilikha ng isang bagay, ang constructor ng base class nito ay tinatawag na una , at pagkatapos lamang ang constructor ng klase mismo, ang object na ating nililikha, ay tinatawag. Iyon ay, kapag lumilikha ng isang bagay, Cat
ang tagabuo ng klase ay unang gagana Animal
, at pagkatapos lamang ang tagabuo Cat
. Upang matiyak ito, idagdag natin sa mga konstruktor Cat
at Animal
output sa console.
public class Animal {
public Animal() {
System.out.println("Animal constructor completed");
}
}
public class Cat extends Animal {
public Cat() {
System.out.println("The constructor Cat worked!");
}
public static void main(String[] args) {
Cat cat = new Cat();
}
}
Output ng console:
Отработал конструктор Animal
Отработал конструктор Cat!
Sa katunayan, ito ay kung paano gumagana ang lahat! Para saan ito? Halimbawa, upang maiwasan ang pagdoble ng mga karaniwang field ng dalawang klase. Halimbawa, ang bawat hayop ay may puso at utak, ngunit hindi lahat ng hayop ay may buntot. Maaari naming ideklara ang mga field na karaniwan sa lahat ng hayop brain
sa heart
parent class Animal
, at isang field tail
sa subclass Cat
. Ngayon ay gagawa kami ng isang constructor para sa class Cat
, kung saan ipapasa namin ang lahat ng 3 field.
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");
}
}
Bigyang-pansin:matagumpay na gumagana ang konstruktor, kahit na ang klase Cat
ay walang mga patlang brain
at heart
. Ang mga patlang na ito ay "hinila pataas" mula sa batayang klase Animal
. Ang descendant class ay may access sa mga field ng base class, kaya Cat
makikita ang mga ito sa aming klase. Samakatuwid, hindi natin kailangang Cat
i-duplicate ang mga field na ito sa klase - maaari nating kunin ang mga ito mula sa klase Animal
. Bukod dito, maaari nating tahasang tawagan ang tagabuo ng batayang klase sa tagabuo ng descendant na klase. Ang batayang klase ay tinatawag ding “ superclass ,” kaya naman ginagamit ng Java ang keyword super
. Sa nakaraang halimbawa
public Cat(String brain, String heart, String tail) {
this.brain = brain;
this.heart = heart;
this.tail = tail;
}
Hiwalay naming itinalaga ang bawat field na nasa aming parent class. Sa katunayan, hindi mo kailangang gawin ito. Sapat na tawagan ang tagabuo ng klase ng magulang at ipasa ito sa mga kinakailangang parameter:
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");
}
}
Sa constructor, Cat
tinawag namin ang constructor Animal
at ipinasa ang dalawang field dito. Kailangan lang nating tahasang magpasimula ng isang field - tail
na Animal
wala. Tandaan kung paano namin sinabi na kapag ang isang bagay ay nilikha, ang constructor ng parent class ay unang tinatawag? Kaya, ito ang dahilan kung bakit ang salita super()
ay dapat palaging mauna sa tagabuo! Kung hindi, ang lohika ng mga konstruktor ay masisira at ang programa ay bubuo ng isang error.
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");
}
}
Alam ng compiler na kapag lumilikha ng isang object ng isang descendant class, unang tinatawag ang constructor ng base class. At kung susubukan mong manu-manong baguhin ang gawi na ito, hindi ito papayagan.
Ang proseso ng paglikha ng isang bagay.
Sa itaas ay tumingin kami sa isang halimbawa na may base at parent class -Animal
at Cat
. Ngayon, gamit ang dalawang klase na ito bilang isang halimbawa, titingnan natin ang proseso ng paglikha ng isang bagay at pagsisimula ng mga variable. Alam namin na ang mga variable ay static at instance variable (non-static). Alam din natin na ang base class Animal
ay may sarili nitong mga variable, at ang descendant class Cat
ay may sarili. Magdagdag tayo ng isang static na variable sa klase para sa Animal
kalinawan . Cat
Ang variable animalCount
ng klase Animal
ay ang kabuuang bilang ng mga species ng hayop sa mundo, at ang variable catsCount
ay ang bilang ng mga species ng pusa. Bilang karagdagan, magtatalaga kami ng mga panimulang halaga sa lahat ng mga di-static na variable ng parehong mga klase (na magbabago sa constructor).
public class Animal {
String brain = "The initial value of brain in the Animal class";
String heart = "The initial value of heart in the Animal class";
public static int animalCount = 7700000;
public Animal(String brain, String heart) {
System.out.println("The constructor of the Animal base class is being executed");
System.out.println("Have the variables of the Animal class already been initialized?");
System.out.println("The current value of the static variable animalCount = " + animalCount);
System.out.println("Current value of brain in class Animal = " + this.brain);
System.out.println("Current value of heart in class Animal = " + this.heart);
System.out.println("Have the variables of the Cat class already been initialized?");
System.out.println("The current value of the static variable catsCount = " + Cat.catsCount);
this.brain = brain;
this.heart = heart;
System.out.println("Animal base class constructor completed!");
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 = "The initial value of tail in the Cat class";
static int catsCount = 37;
public Cat(String brain, String heart, String tail) {
super(brain, heart);
System.out.println("The constructor of the Cat class has started (the Animal constructor has already been executed)");
System.out.println("The current value of the static variable catsCount = " + catsCount);
System.out.println("Current value tail = " + this.tail);
this.tail = tail;
System.out.println("Current value tail = " + this.tail);
}
public static void main(String[] args) {
Cat cat = new Cat("Brain", "Heart", "Tail");
}
}
Kaya, lumikha kami ng isang bagong bagay ng klase Cat
na minana mula sa Animal
. Magdagdag tayo ng detalyadong output ng console sa ating programa upang makita kung ano ang mangyayari at sa anong pagkakasunud-sunod. Ito ang magiging output sa console bilang resulta ng paglikha ng isang bagay Cat
:
Выполняется конструктор базового класса Animal
Были ли уже проинициализированы переменные класса Animal?
Текущее meaning статической переменной animalCount = 7700000
Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal
Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
Были ли уже проинициализированы переменные класса Cat?
Текущее meaning статической переменной catsCount = 37
Конструктор базового класса Animal завершил работу!
Текущее meaning brain = Мозг
Текущее meaning heart = Сердце
Конструктор класса Cat начал работу (конструктор Animal уже был выполнен)
Текущее meaning статической переменной catsCount = 37
Текущее meaning tail = Изначальное meaning tail в классе Cat
Текущее meaning tail = Хвост
Kaya, ngayon ay malinaw nating makikita kung anong mga variable ng pagkakasunud-sunod ang pinasimulan at tinatawag ang mga konstruktor kapag lumilikha ng isang bagong bagay:
-
Ang mga static na variable ng base class ( ) ay sinisimulan
Animal
. Sa aming kaso, ang variableanimalCount
ng klaseAnimal
ay itinalaga ang halaga na 7700000. -
Ang mga static na variable ng descendant class ( ) ay sinisimulan
Cat
. Bigyang-pansin - nasa loob pa rin kami ng constructorAnimal
, at ang console ay nagsabi na:Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal Были ли уже проинициализированы переменные класса Cat? Текущее meaning статической переменной catsCount = 37
-
Susunod, ang mga non-static na variable ng base class ay sinisimulan . Partikular naming itinalaga sa kanila ang mga paunang halaga, na pagkatapos ay binago sa mga bago sa constructor. Ang tagabuo
Animal
ay hindi pa nakumpleto ang gawain nito, ngunit ang mga paunang halagabrain
ayheart
naitalaga na:Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
-
Ang base class constructor ay nagsimulang magtrabaho .
Nakita na natin na ang yugtong ito ay pang-apat lamang: sa unang tatlong punto, sa oras na magsimulang magtrabaho ang tagabuo,
Animal
maraming mga variable ang naitalaga na ng mga halaga. -
Pagsisimula ng mga non-static na field ng isang child class (
Cat
).Nangyayari ito bago
Cat
magsimulang magtrabaho ang taga-disenyo.Sa oras na nagsimula siyang magtrabaho, ang variable
tail
ay mayroon nang halaga:Конструктор класса Cat начал работу (конструктор Animal уже был выполнен) Текущее meaning статической переменной catsCount = 37 Текущее meaning tail = Изначальное meaning tail в классе Cat
-
Ang constructor ng descendant class ay tinatawag
Cat
GO TO FULL VERSION