Animal
(жаныбар) бар деп элестетиңиз:
public class Animal {
String name;
int age;
}
Биз ал үчүн, мисалы, 2 тукум класстарды түзө алабыз - Cat
жана Dog
. Бул ачкыч сөз менен жасалат extends
.
public class Cat extends Animal {
}
public class Dog extends Animal {
}
Бул келечекте бизге пайдалуу болушу мүмкүн. Мисалы, тапшырма чычкандарды кармоо болсо, биз программада an object түзөбүз Cat
. Эгерде тапшырма таяктын артынан чуркоо болсо, анда биз an objectти колдонобуз Dog
. Ал эми ветеринардык клиниканы окшоштурган программа түзсөк, ал класс менен иштешет Animal
(мышыктарды да, иттерди да дарылай алуу үчүн). Объектти түзүүдө анын базалык классынын конструктору адегенде , андан кийин гана биз түзүп жаткан класстын конструктору деп аталаарын эстен чыгарбоо абдан маанилүү . Башкача айтканда, an objectти түзүүдө класстын конструктору адегенде , андан кийин гана конструктор Cat
иштейт . Буга ынануу үчүн консольго конструкторлорду кошуп , чыгаралы.Animal
Cat
Cat
Animal
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();
}
}
Консолдук чыгаруу:
Отработал конструктор Animal
Отработал конструктор Cat!
Чынында эле, баары ушундай иштейт! Бул эмне үчүн? Мисалы, эки класстын жалпы талааларын кайталоону болтурбоо үчүн. Мисалы, ар бир жаныбардын жүрөгү жана мээси бар, бирок ар бир жаныбардын куйругу болбойт. Биз негизги класстагы brain
бардык жаныбарлар үчүн жалпы талааларды жана субкласстагы талааны жарыялай алабыз . Эми биз класс үчүн конструктор түзөбүз , анда биз бардык 3 талааны өткөрөбүз. heart
Animal
tail
Cat
Cat
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");
}
}
Көңүл буруу:конструктор ийгorктүү иштейт, бирок класста Cat
талаалар жок brain
жана heart
. Бул талаалар базалык класстан "жогорулатылган" Animal
. Тукум класс базалык класстын талааларына кире алат, ошондуктан Cat
алар биздин класста көрүнүп турат. Cat
Ошондуктан, бул талааларды класста кайталоонун кереги жок - биз аларды класстан алабыз Animal
. Мындан тышкары, биз негизги класстын конструкторун урпак классынын конструкторунда ачык атай алабыз. Негизги класс " суперкласс " деп да аталат, ошондуктан Java ачкыч сөзүн колдонот super
. Мурунку мисалда
public Cat(String brain, String heart, String tail) {
this.brain = brain;
this.heart = heart;
this.tail = tail;
}
Ата-эне классыбыздагы ар бир талааны өзүнчө бөлүп бердик. Чынында, муну жасоонун кереги жок. Ата-эне класстын конструкторун чакырып, ага керектүү параметрлерди тапшыруу жетиштүү:
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");
}
}
Конструктордо Cat
биз конструкторду чакырып Animal
, ага эки талааны өткөрдүк. Биз бир гана талааны инициализациялашыбыз керек - tail
ал Animal
жок. Объект түзүлгөндө ата-эне класстын конструктору биринчи чакырылат деп айтканыбызды эстейсизби? Демек, super()
конструктордо сөз дайыма биринчи орунда турушу керек! Болбосо, конструкторлордун логикасы бузулуп, программа ката жаратат.
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");
}
}
Компилятор урпак классынын an objectисин түзүүдө негизги класстын конструктору биринчи чакырыларын билет. Ал эми бул жүрүм-турумду кол менен өзгөртүүгө аракет кылсаңыз, ага жол бербейт.
Объектти түзүү процесси.
Жогоруда биз базалык жана ата-энелер классы менен мисалды карадык -Animal
жана Cat
. Эми бул эки классты мисал катары колдонуп, биз an objectти түзүү жана өзгөрмөлөрдү инициализациялоо процессин карайбыз. Биз өзгөрмөлөр статикалык жана инстанция өзгөрмөлөр (статикалык эмес) экенин билебиз. Биз ошондой эле базалык класстын Animal
өзүнүн өзгөрмөлөрү бар экенин билебиз, ал эми тукум класстын Cat
өзүнүн өзгөрмөлөрү бар. Animal
Келгиле, түшүнүктүү болуу Cat
үчүн класска бир статикалык өзгөрмө кошолу . animalCount
Класстык өзгөрмө Animal
жер бетиндеги жаныбарлардын түрлөрүнүн жалпы саны, ал эми өзгөрмө - catsCount
мышык түрлөрүнүн саны болмок. Мындан тышкары, биз эки класстын бардык статикалык эмес өзгөрмөлөрүнө баштапкы маанилерди ыйгарабыз (андан кийин алар конструктордо өзгөрөт).
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");
}
}
Cat
Ошентип , биз класстын жаңы an objectин түзөбүз Animal
. Келгиле, эмне болорун жана кандай тартипте болорун көрүү үчүн программабызга деталдуу консолдук чыгарууну кошолу. Бул an objectти түзүүнүн натыйжасында консолго чыгарыла турган нерсе 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 = Хвост
Ошентип, эми жаңы an objectти түзүүдө өзгөрмөлөр кандай тартипте инициализацияланганын жана конструкторлор чакырылганын так көрө алабыз:
-
Негизги класстын статикалык өзгөрмөлөрү ( ) инициализацияланат . Биздин учурда класс өзгөрмөсүнө 7700000 мааниси ыйгарылган.
Animal
animalCount
Animal
-
Тукум класстын статикалык өзгөрмөлөрү ( ) инициализацияланат . Көңүл буруңуз - биз дагы эле конструктордун ичиндебиз жана консол буга чейин мындай дейт:
Cat
Animal
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal Были ли уже проинициализированы переменные класса Cat? Текущее meaning статической переменной catsCount = 37
-
Андан кийин, базалык класстын статикалык эмес өзгөрмөлөрү инициализацияланат . Биз аларга атайын баштапкы маанилерди ыйгардык, алар конструктордо жаңысына өзгөртүлөт. Конструктор али ишин аяктай элек, бирок баштапкы баалуулуктар буга чейин дайындалган :
Animal
brain
heart
Выполняется конструктор базового класса Animal Были ли уже проинициализированы переменные класса Animal? Текущее meaning статической переменной animalCount = 7700000 Текущее meaning brain в классе Animal = Изначальное meaning brain в классе Animal Текущее meaning heart в классе Animal = Изначальное meaning heart в классе Animal
-
Базалык класстын конструктору иштей баштайт .
Биз бул этап катары менен төртүнчүсү гана экенин көрдүк: биринчи үч пунктта, конструктор иштей баштаганда,
Animal
көптөгөн өзгөрмөлөргө маанилер ыйгарылган. -
Бала класстын статикалык эмес талааларын баштоо ( ).
Cat
Бул дизайнер
Cat
иштей баштаганга чейин болот.Ал иштей баштаганда өзгөрмө
tail
мааниге ээ болгон:Конструктор класса Cat начал работу (конструктор Animal уже был выполнен) Текущее meaning статической переменной catsCount = 37 Текущее meaning tail = Изначальное meaning tail в классе Cat
-
тукум класстын конструктору деп аталат
Cat
GO TO FULL VERSION