JavaRush /Java blogi /Random-UZ /Sinf konstruktorlari. Java JDK 1.5
articles
Daraja

Sinf konstruktorlari. Java JDK 1.5

Guruhda nashr etilgan
Sinf konstruktorlari.  Java JDK 1.5 - 1

Konstruktorlar haqida umumiy ma'lumot

Конструкторmetodga o'xshash tuzilma bo'lib, uning maqsadi sinfning namunasini yaratishdir. Dizaynerning o'ziga xos xususiyatlari:
  • Konstruktorning nomi sinf nomiga mos kelishi kerak (odatda birinchi harf bosh harf bilan yoziladi, odatda ot);
  • Har qanday sinfda konstruktor mavjud. Agar siz uni yozmasangiz ham, Java kompilyatori standart konstruktor yaratadi, u bo'sh bo'ladi va superklass konstruktorini chaqirishdan boshqa hech narsa qilmaydi.
  • Konstruktor metodga o'xshaydi, lekin u usul emas, hatto sinf a'zosi hisoblanmaydi. Shuning uchun uni kichik sinfda meros qilib olish yoki bekor qilish mumkin emas;
  • Konstruktorlar meros qilib olinmaydi;
  • Bir sinfda bir nechta konstruktorlar bo'lishi mumkin. Bunday holda, konstruktorlar haddan tashqari yuklangan deb aytiladi;
  • Agar sinf konstruktorni aniqlamasa, kompilyator avtomatik ravishda kodga parametrsiz konstruktorni qo'shadi;
  • Konstruktorda qaytish turi yo'q; u hatto tur bo'lishi ham mumkin emas void; agar tur qaytarilsa void, u sinf nomi bilan mos kelishiga qaramay, endi konstruktor emas, balki usul bo'ladi.
  • Operatorga konstruktorda ruxsat beriladi return, lekin faqat bo'sh, hech qanday qaytarish qiymatisiz;
  • Konstruktor kirish modifikatorlaridan foydalanishga ruxsat beradi; siz modifikatorlardan birini o'rnatishingiz mumkin: public, protected, privateyoki modifikatorsiz.
  • Konstruktorda abstract, final, nativeyoki modifikatorlari bo'lishi mumkin staticemas synchronized;
  • Kalit so'z thisbir xil sinfdagi boshqa konstruktorga ishora qiladi. Agar foydalanilsa, unga qo'ng'iroq konstruktorning birinchi qatori bo'lishi kerak;
  • Kalit so'z superota-klassning konstruktorini chaqiradi. Agar foydalanilsa, unga havola konstruktorning birinchi qatori bo'lishi kerak;
  • Agar konstruktor ajdodlar sinfining konstruktoriga qo'ng'iroq qilmasa super(argumentlar bilan yoki argumentsiz), kompilyator avtomatik ravishda ajdodlar sinfining konstruktorini argumentlarsiz chaqirish uchun kod qo'shadi;

Standart konstruktor

Har qanday sinfda konstruktor mavjud. Agar siz yozmasangiz ham, Java kompilyatori standart konstruktor yaratadi. Bu konstruktor bo'sh va superklass konstruktorini chaqirishdan boshqa hech narsa qilmaydi. Bular. agar yozsangiz:
public class Example {}
u holda bu yozishga teng:
public class Example
{
     Example()
     {
          super;
     }
}
Bunday holda, ajdodlar sinfi aniq ko'rsatilmagan va sukut bo'yicha barcha Java sinflari sinfni meros qilib oladi, Objectshuning uchun sinf konstruktori deyiladi Object. Agar sinf konstruktorni parametrlari bilan aniqlasa, lekin parametrlarsiz ortiqcha yuklangan konstruktor bo'lmasa, u holda konstruktorni parametrsiz chaqirish xato hisoblanadi. Biroq, Java-da 1.5 versiyasidan boshlab, o'zgaruvchan uzunlikdagi argumentlar bilan konstruktorlardan foydalanish mumkin. Va agar o'zgaruvchan uzunlik argumentiga ega bo'lgan konstruktor bo'lsa, standart konstruktorni chaqirish xato bo'lmaydi. Bu bo'lmaydi, chunki o'zgaruvchan uzunlik argumenti bo'sh bo'lishi mumkin. Misol uchun, quyidagi misol kompilyatsiya qilinmaydi, lekin agar siz konstruktorni o'zgaruvchan uzunlikdagi argument bilan izohlamasangiz, u kompilyatsiya qiladi va muvaffaqiyatli ishlaydi va natijada ishlaydigan kod qatori DefaultDemo dd = new DefaultDemo(); konstruktor chaqiriladi DefaultDemo(int ... v). Tabiiyki, bu holda JSDK 1.5 dan foydalanish kerak. FaylDefaultDemo.java
class DefaultDemo
{
 DefaultDemo(String s)
 {
  System.out.print("DefaultDemo(String)");
 }
 /*
 DefaultDemo(int ... v)
 {
  System.out.println("DefaultDemo(int ...)");
 }
 */

 public static void main(String args[])
 {
  DefaultDemo dd = new DefaultDemo();
 }
}
Konstruktor bilan dasturning natijasi izohlanmagan:
DefaultDemo(int ...)
Biroq, umumiy holatda sinf hech qanday konstruktorni aniqlamasa, standart konstruktorni (parametrlarsiz) chaqirish kerak bo'ladi, chunki standart konstruktorni almashtirish avtomatik ravishda amalga oshiriladi.

Obyekt yaratish va konstruktorlar

Ob'ektni yaratishda quyidagi harakatlar ketma-ket bajariladi:
  • Ob'ekt sinfi dasturda allaqachon ishlatilgan sinflar orasidan qidiriladi. Agar u mavjud bo'lmasa, u dasturda mavjud bo'lgan barcha kataloglar va kutubxonalarda qidiriladi. Katalog yoki kutubxonada sinf topilgach, sinfning statik maydonlari yaratiladi va ishga tushiriladi. Bular. Har bir sinf uchun statik maydonlar faqat bir marta ishga tushiriladi.
  • Ob'ekt uchun xotira ajratilgan.
  • Sinf maydonlari ishga tushirilmoqda.
  • Sinf konstruktori bajaradi.
  • Yaratilgan va ishga tushirilgan ob'ektga havola hosil bo'ladi. Bu mos yozuvlar ob'ektni yaratuvchi ifodaning qiymatidir. Ob'ektni newInstance()sinf usulini chaqirish orqali ham yaratish mumkin java.lang.Class. Bunday holda, parametrlar ro'yxati bo'lmagan konstruktor ishlatiladi.

Konstruktorlarni haddan tashqari yuklash

Xuddi shu sinfdagi konstruktorlar bir xil nomga va turli xil imzolarga ega bo'lishi mumkin. Bu xususiyat kombinatsiya yoki ortiqcha yuk deb ataladi. Agar sinfda bir nechta konstruktor bo'lsa, konstruktorning haddan tashqari yuklanishi mavjud.

Parametrlangan konstruktorlar

Konstruktorning imzosi - bu parametrlarning soni va turlari, shuningdek, konstruktor parametrlari ro'yxatidagi ularning turlarining ketma-ketligi. Qaytish turi hisobga olinmaydi. Konstruktor hech qanday parametrni qaytarmaydi. Ushbu bayonot qaysidir ma'noda Java haddan tashqari yuklangan konstruktorlar yoki usullarni qanday ajratishini tushuntiradi. Java haddan tashqari yuklangan usullarni qaytarish turi bilan emas, balki kiritish parametrlarining soni, turlari va turlari ketma-ketligi bilan farqlaydi. Konstruktor hatto turini ham qaytara olmaydi void, aks holda u sinf nomiga o'xshash bo'lsa ham oddiy usulga aylanadi. Quyidagi misol buni ko'rsatadi. FaylVoidDemo.java
class VoidDemo
{
 /**
  * Это конструктор
  */
 VoidDemo()
 {
  System.out.println("Constructor");
 }

 /**
  * А это уже обычный метод, даже не смотря на сходство с
  * именем класса, поскольку имеется возвращаемый тип void
  */
 void VoidDemo()
 {
  System.out.println("Method");
 }

 public static void main(String s[])
 {
  VoidDemo m = new VoidDemo();
 }
}
Natijada, dastur chiqadi:
Constructor
Bu konstruktor qaytish parametrlari bo'lmagan usul ekanligini yana bir bor isbotlaydi. Biroq, konstruktorga uchta modifikatordan biri berilishi mumkin public, privateyoki protected. Va endi misol quyidagicha ko'rinadi: FaylVoidDemo2.java
class VoidDemo2
{
 /**
  * Это конструктор
  */
 public VoidDemo2()
 {
  System.out.println("Constructor");
 }

 /**
  * А это уже обычный метод, даже не смотря на сходство с
  * именем класса, поскольку имеется возвращаемый тип void
  */
 private void VoidDemo2()
 {
  System.out.println("Method");
 }

 public static void main(String s[])
 {
  VoidDemo2 m = new VoidDemo2();
 }
}
Konstruktorda operator yozishga ruxsat beriladi return, lekin faqat bo'sh, hech qanday qaytarish qiymatisiz. FaylReturnDemo.java
class ReturnDemo
{
 /**
  * В конструкторе допускается использование оператора
  * return без параметров.
  */
 public ReturnDemo()
 {
  System.out.println("Constructor");
  return;
 }

 public static void main(String s[])
 {
  ReturnDemo r = new ReturnDemo();
 }
}

O'zgaruvchan uzunlikdagi argumentlar bilan parametrlangan konstruktorlar

Java SDK 1.5 uzoq kutilgan vositani taqdim etdi - konstruktorlar va usullar uchun o'zgaruvchan uzunlikdagi argumentlar. Ilgari o'zgaruvchan miqdordagi hujjatlar ikki noqulay usulda qayta ishlanardi. Ulardan birinchisi argumentlarning maksimal soni kichik sonlar bilan cheklanishi va oldindan ma'lum bo'lishini ta'minlash uchun ishlab chiqilgan. Bunday holda, usulning haddan tashqari yuklangan versiyalarini yaratish mumkin edi, bu usulga o'tkazilgan argumentlar ro'yxatining har bir versiyasi uchun bittadan. Ikkinchi usul oldindan noma'lum narsa va ko'p sonli dalillar uchun mo'ljallangan. Bu holda argumentlar massivga joylashtirildi va bu massiv metodga uzatildi. O'zgaruvchan uzunlikdagi argumentlar ko'pincha o'zgaruvchan ishga tushirish bilan keyingi manipulyatsiyalarda ishtirok etadi. Kutilgan konstruktor yoki usul argumentlarining bir qismi yo'qligini standart qiymatlar bilan almashtirish qulay. O'zgaruvchan uzunlik argumenti massiv bo'lib, massiv sifatida ko'rib chiqiladi. Masalan, Checkingo'zgaruvchan sonli argumentli sinf uchun konstruktor quyidagicha ko'rinadi:
class Checking
{
 public Checking(int ... n)
 {
 }
}
Belgilar birikmasi ... kompilyatorga argumentlarning o'zgaruvchan soni ishlatilishini va bu argumentlar mos yozuvlar qiymati n o'zgaruvchisida joylashgan massivda saqlanishini aytadi. Konstruktorni boshqa argumentlar soni bilan chaqirish mumkin, jumladan, hech qanday argumentsiz. Argumentlar avtomatik ravishda massivga joylashtiriladi va n dan o'tadi. Agar argumentlar bo'lmasa, massiv uzunligi 0 ga teng. Parametrlar ro'yxati o'zgaruvchan uzunlikdagi argumentlar bilan birga majburiy parametrlarni ham o'z ichiga olishi mumkin. Bunday holda, o'zgaruvchan sonli argumentlarni o'z ichiga olgan parametr parametrlar ro'yxatida oxirgi bo'lishi kerak. Masalan:
class Checking
{
 public Checking(String s, int ... n)
 {
 }
}
Juda aniq cheklov o'zgaruvchan uzunlik parametrlari soniga taalluqlidir. Parametrlar ro'yxatida faqat bitta o'zgaruvchan uzunlikdagi parametr bo'lishi kerak. Ikki o'zgaruvchan uzunlikdagi parametrlarni hisobga olgan holda, kompilyator bir parametr qaerda tugashini va ikkinchisi qaerdan boshlanishini aniqlay olmaydi. Masalan:
class Checking
{
 public Checking(String s, int ... n, double ... d) //ОШИБКА!
 {
 }
}
Fayl Checking.java Masalan, avtomobil raqamlarini tanib olish va kun davomida har bir mashina tashrif buyurgan hududning kvadratchalari raqamlarini eslab qolish qobiliyatiga ega uskunalar mavjud. Ro'yxatga olingan avtomobillarning umumiy massasidan kun davomida ikkita berilgan maydonga tashrif buyurganlarni tanlash kerak, masalan, hudud xaritasiga ko'ra, 22 va 15. Mashinaning kun davomida ko'plab maydonlarga yoki faqat bittasiga tashrif buyurishi tabiiy. Shubhasiz, tashrif buyurilgan kvadratchalar soni mashinaning jismoniy tezligi bilan cheklangan. Keling, kichik dastur yarataylik, unda sinf konstruktori argument sifatida avtomobil raqamini majburiy parametr sifatida va hududning tashrif buyurilgan kvadratlari sonini oladi, ularning soni o'zgaruvchan bo'lishi mumkin. Konstruktor ikkita kvadrat ichida avtomobil paydo bo'lganligini tekshiradi, agar mavjud bo'lsa, uning raqamini ekranda ko'rsatadi.

Parametrlarni konstruktorga o'tkazish

Dasturlash tillarida parametrlarning asosan ikki turi mavjud:
  • asosiy turlari (ibtidoiy);
  • ob'ektlarga havolalar.
Qiymat bo'yicha chaqiruv atamasi konstruktor chaqiruvchi modul tomonidan unga berilgan qiymatni qabul qilishini anglatadi. Aksincha, mos yozuvlar bo'yicha qo'ng'iroq qilish konstruktorning qo'ng'iroq qiluvchidan o'zgaruvchining manzilini olishini anglatadi. Java faqat qiymat bo'yicha qo'ng'iroqlardan foydalanadi. Parametr qiymati va parametr bog'lanish qiymati bo'yicha. Java ob'ektlar uchun mos yozuvlar bo'yicha qo'ng'iroqni ishlatmaydi (garchi ko'plab dasturchilar va ba'zi kitoblarning mualliflari buni da'vo qilishadi). Ob'ektlarni Java-ga o'tkazishda parametrlar mos yozuvlar bo'yicha emas , balki ob'ekt havolasining qiymati bo'yicha uzatiladi ! Ikkala holatda ham konstruktor barcha parametrlar qiymatlarining nusxalarini oladi. Konstruktor o'zining kirish parametrlari bilan qila olmaydi:
  • konstruktor asosiy (ibtidoiy) turdagi kirish parametrlarining qiymatlarini o'zgartira olmaydi;
  • konstruktor kirish parametrlari havolalarini o'zgartira olmaydi;
  • konstruktor yangi ob'ektlarga kirish parametrlari havolalarini qayta tayinlay olmaydi.
Konstruktor o'zining kirish parametrlari bilan bajarishi mumkin:
  • kirish parametri sifatida o'tkazilgan ob'ekt holatini o'zgartirish.
Quyidagi misol Java-da konstruktorga kirish parametrlari ob'ekt mos yozuvlar qiymati bilan uzatilishini isbotlaydi. Ushbu misol, shuningdek, konstruktor kirish parametrlarining havolalarini o'zgartira olmasligini aks ettiradi, lekin aslida kirish parametrlari nusxalarining havolalarini o'zgartiradi. FaylEmpoyee.java
class Employee
{
 Employee(String x, String y)
 {
  String temp = x;
  x = y;
  y = temp;
 }
 public static void main(String args[])
 {
  String name1 = new String("Alice");
  String name2 = new String("Mary");
  Employee a = new Employee(name1, name2);
  System.out.println("name1="+name1);
  System.out.println("name2="+name2);
 }
}
Dasturning chiqishi quyidagicha:
name1=Alice
name2=Mary
Agar Java ob'ektlarni parametr sifatida o'tkazish uchun havola orqali qo'ng'iroqni ishlatsa, konstruktor ushbu misolda name1va ni almashtiradi name2. name1Konstruktor aslida va o'zgaruvchilarda saqlangan ob'ekt havolalarini almashtirmaydi name2. Bu konstruktor parametrlari ushbu havolalarning nusxalari bilan ishga tushirilganligini ko'rsatadi. Keyin konstruktor nusxalarni almashtiradi. Konstruktor o'z ishini tugatgandan so'ng, x va y o'zgaruvchilar yo'q qilinadi va dastlabki o'zgaruvchilar oldingi ob'ektlarga murojaat qilishda name1davom etadilar .name2

Konstruktorga o'tkazilgan parametrlarni o'zgartirish.

Konstruktor asosiy turlarning o'tkazilgan parametrlarini o'zgartira olmaydi. Biroq, konstruktor parametr sifatida berilgan ob'ektning holatini o'zgartirishi mumkin. Masalan, quyidagi dasturni ko'rib chiqing: FaylSalary1.java
class Salary1
{
 Salary1(int x)
 {
  x = x * 3;
  System.out.println("x="+x);
 }
 public static void main(String args[])
 {
  int value = 1000;
  Salary1 s1 = new Salary1(value);
  System.out.println("value="+value);
 }
}
Dasturning chiqishi quyidagicha:
x=3000
value=1000
Shubhasiz, bu usul asosiy turdagi parametrni o'zgartirmaydi. Shuning uchun, konstruktorni chaqirgandan so'ng, o'zgaruvchining qiymati valuega teng bo'lib qoladi 1000. Umuman olganda, uchta narsa sodir bo'ladi:
  1. O'zgaruvchi xparametr qiymatining nusxasi value(ya'ni, raqam 1000) bilan ishga tushiriladi.
  2. O'zgaruvchining qiymati xuch baravar ko'paydi - endi u ga teng 3000. Biroq, o'zgaruvchining qiymati valuega teng bo'lib qoladi 1000.
  3. Konstruktor tugaydi va o'zgaruvchi xendi ishlatilmaydi.
Quyidagi misolda, xodimning maoshi muvaffaqiyatli uch barobar ko'paytirildi, chunki ob'ekt ma'lumotnomasining qiymati usulga parametr sifatida uzatiladi. FaylSalary2.java
class Salary2
{
 int value = 1000;
 Salary2()
 {
 }
 Salary2(Salary2 x)
 {
  x.value = x.value * 3;
 }
 public static void main(String args[])
 {
  Salary2 s1 = new Salary2();
  Salary2 s2 = new Salary2(s1);
  System.out.println("s1.value=" +s1.value);
  System.out.println("s2.value="+s2.value);
 }
}
Dasturning chiqishi quyidagicha:
s1.value=3000
s2.value=1000
Parametr sifatida ob'ekt havolasining qiymati ishlatiladi. Chiziqni bajarayotganda Salary2 s2 = new Salary2(s1); konstruktor Salary2(Salary x)o'zgaruvchan ob'ektga mos yozuvlar qiymatini o'tadi s1va konstruktor samarali ish haqini uch baravar oshiradi , chunki konstruktor ichida yaratilgan s1.valuenusxa ham o'zgaruvchan ob'ektga ishora qiladi . (Salary x)s1

Primitivlar tomonidan parametrlangan konstruktorlar.

Agar haddan tashqari yuklangan konstruktorning parametrlari toraytirilishi mumkin bo'lgan primitivdan foydalansa (masalan, int <- double), unda bunday parametr bilan ortiqcha yuklangan usul yo'qligiga qaramay, toraytirilgan qiymatga ega usulni chaqirish mumkin. Masalan: FaylPrimitive.java
class Primitive
{
 Primitive(double d)
 {
  d = d + 10;
  System.out.println("d="+d);
 }
 public static void main(String args[])
 {
  int i = 20;
  Primitive s1 = new Primitive(i);
 }
}
Dasturning chiqishi quyidagicha:
d=30.0
Sinfda Primitivetip parametriga ega bo'lgan konstruktor yo'qligiga qaramasdan int, kirish parametriga ega bo'lgan konstruktor ishlaydi double. Konstruktorni chaqirishdan oldin o'zgaruvchi turdan turga ikengaytiriladi . Qarama-qarshi variant, agar o'zgaruvchi turdagi bo'lsa va konstruktor faqat parametrga ega bo'lsa , bu holatda kompilyatsiya xatosiga olib keladi. intdoubleidoubleint

Konstruktor chaqiruvi va operatornew

Konstruktor har doim operator tomonidan chaqiriladi new. Konstruktor operator bilan chaqirilganda new, konstruktor har doim yangi ob'ektga havola hosil qiladi. Konstruktorni yangi ob'ektga havola o'rniga allaqachon mavjud bo'lgan ob'ektga havolani yaratishga majburlash mumkin emas, seriyadan chiqarilgan ob'ektni almashtirishdan tashqari. Va yangi operator bilan yangi ob'ektga havola o'rniga allaqachon mavjud ob'ektga havolani shakllantirish mumkin emas. Masalan: FaylSalary3.java
class Salary3
{
 int value = 1000;
 Salary3()
 {
 }
 Salary3(Salary3 x)
 {
  x.value = x.value * 3;
 }
 public static void main(String args[])
 {
  Salary3 s1 = new Salary3();
  System.out.println("First object creation: "+s1.value);

  Salary3 s2 = new Salary3(s1);
  System.out.println("Second object creation: "+s2.value);
  System.out.println("What's happend with first object?:"+s1.value);

  Salary3 s3 = new Salary3(s1);
  System.out.println("Third object creation: "+s3.value);
  System.out.println("What's happend with first object?:"+s1.value);
 }
}
Dasturning chiqishi quyidagicha:
First object creation: 1000
Second object creation: 1000
What's happend with first object?: 3000
Third object creation: 1000
What's happend with first object?: 9000
Birinchidan, chiziqdan foydalanish Salary3 s1 = new Salary3(); yangi ob'ekt yaratiladi. Keyinchalik, agar chiziqdan foydalansangiz Salary3 s2 = new Salary3(s1); yoki satrlar Salary3 s3 = new Salary3(s1); allaqachon mavjud ob'ektga havola yaratish mumkin edi, keyin s1.value s2.valueular s3.valuebir xil qiymatni saqlaydilar 1000. Aslida qatorda Salary3 s2 = new Salary3(s1); o'zgaruvchi uchun yangi ob'ekt yaratiladi s2va o'zgaruvchi uchun ob'ekt holati s1konstruktor parametridagi ob'ektga mos yozuvlar qiymatini o'tkazish orqali o'zgaradi. Buni chiqish natijalari bilan tekshirish mumkin. Va chiziqni bajarayotganda Salary3 s3 = new Salary3(s1); o'zgaruvchi uchun YANGI ob'ekt yaratiladi s3va o'zgaruvchi uchun ob'ektning holati yana o'zgaradi s1.

Konstruktorlar va ishga tushirish bloklari, konstruktorni chaqirishdagi harakatlar ketma-ketligi

Ob'ektni yaratish va konstruktorlar bo'limida ob'ektni yaratishda bajariladigan umumiy harakatlar ro'yxati keltirilgan. Ular orasida sinf maydonlarini ishga tushirish va sinf konstruktorini ishlab chiqish jarayonlari mavjud bo'lib, ular ham o'z navbatida ichki tartibga ega:
  1. Barcha ma'lumotlar maydonlari standart qiymatlariga (0, noto'g'ri yoki null) ishga tushiriladi.
  2. Barcha maydon initsializatorlari va ishga tushirish bloklari sinf deklaratsiyasida ko'rsatilgan tartibda bajariladi.
  3. Agar konstruktorning birinchi qatorida boshqa konstruktor chaqirilsa, u holda chaqirilgan konstruktor bajariladi.
  4. Konstruktorning tanasi bajariladi.
Konstruktor ishga tushirish bilan bog'liq, chunki Java-da sinfdagi maydonni ishga tushirishning uchta usuli mavjud:
  • deklaratsiyada qiymat belgilash;
  • ishga tushirish blokida qiymatlarni belgilash;
  • konstruktorda uning qiymatini o'rnating.
Tabiiyki, boshlash kodini tushunish oson bo'lishi uchun tashkil qilishingiz kerak. Quyidagi sinf misol sifatida keltirilgan:
class Initialization
{
 int i;
 short z = 10;
 static int x;
 static float y;
 static
 {
  x = 2000;
  y = 3.141;
 }
 Initialization()
 {
  System.out.println("i="+i);
  System.out.println("z="+z);
  z = 20;
  System.out.println("z="+z);
 }
}
Yuqoridagi misolda o'zgaruvchilar quyidagi tartibda ishga tushiriladi: statik o'zgaruvchilar birinchi navbatda standart qiymatlar xbilan ishga tushiriladi. yKeyinchalik, statik ishga tushirish bloki bajariladi. Keyin o'zgaruvchi istandart qiymatga ishga tushiriladi va o'zgaruvchi ishga tushiriladi z. Keyinchalik, dizayner ishga kirishadi. Sinf konstruktorlarini chaqirish maydonlarni e'lon qilish tartibiga bog'liq bo'lmasligi kerak. Bu xatolarga olib kelishi mumkin.

Konstruktorlar va meros

Konstruktorlar meros qilib olinmaydi. Masalan:
public class Example
{
 Example()
 {
 }
 public void sayHi()
 {
  system.out.println("Hi");
 }
}

public class SubClass extends Example
{
}
Sinf ota-klassda belgilangan SubClassusulni avtomatik ravishda meros qilib oladi . sayHi()Shu bilan birga, Example()ota-klassning konstruktori uning avlodi tomonidan meros qilib olinmaydi SubClass.

thisKonstruktorlarda kalit so'z

thisKonstruktorlar bir xil sinfdagi boshqa konstruktorga murojaat qilish uchun ishlatiladi , lekin boshqa parametrlar ro'yxati bilan. Agar konstruktor kalit so'zidan foydalansa this, u birinchi qatorda bo'lishi kerak; bu qoidaga e'tibor bermaslik kompilyator xatosiga olib keladi. Masalan: FaylThisDemo.java
public class ThisDemo
{
 String name;
 ThisDemo(String s)
 {
  name = s;
     System.out.println(name);
 }
 ThisDemo()
 {
  this("John");
 }
 public static void main(String args[])
 {
  ThisDemo td1 = new ThisDemo("Mary");
  ThisDemo td2 = new ThisDemo();
 }
}
Dasturning chiqishi quyidagicha:
Mary
John
Ushbu misolda ikkita konstruktor mavjud. Birinchisi string argumentini oladi. Ikkinchisi hech qanday argumentlarni qabul qilmaydi, u oddiygina "Jon" nomidan foydalangan holda birinchi konstruktorni chaqiradi. Shunday qilib, siz konstruktorlardan maydon qiymatlarini aniq va sukut bo'yicha ishga tushirish uchun foydalanishingiz mumkin, bu ko'pincha dasturlarda kerak bo'ladi.

superKonstruktorlarda kalit so'z

superKonstruktorlar superklass konstruktorini chaqirish uchun ishlatiladi . Agar konstruktor dan foydalansa super, u holda bu chaqiruv birinchi qatorda bo'lishi kerak, aks holda kompilyator xatoga yo'l qo'yadi. Quyida misol keltirilgan: FaylSuperClassDemo.java
public class SuperClassDemo
{
 SuperClassDemo()
 {
 }
}

class Child extends SuperClassDemo
{
 Child()
 {
  super();
 }
}
Ushbu oddiy misolda konstruktor sinfdan tashqari, sinf misolini yaratuvchi Child()chaqiruvni o'z ichiga oladi . Bu subklass konstruktorida bajariladigan birinchi buyruq bo'lishi kerakligi sababli , bu tartib har doim bir xil bo'ladi va ga bog'liq emas . Agar u ishlatilmasa, u holda asosiy sinfdan boshlab har bir supersinfning standart (parametrlari yo'q) konstruktori birinchi bo'lib bajariladi. Quyidagi dastur konstruktorlar qachon bajarilishini ko'rsatadi. Faylsuper()SuperClassDemoChildsupersuper()Call.java
//Создать суперкласс A
class A
{
 A()
 {
  System.out.println("Inside A constructor.");
 }
}

//Создать подкласс B, расширяющий класс A
class B extends A
{
 B()
 {
  System.out.println("Inside B constructor.");
 }
}

//Создать класс (C), расширяющий класс В
class C extends B
{
 C()
 {
  System.out.println("Inside C constructor.");
 }
}

class Call
{
 public static void main(String args[])
 {
  C c = new C();
 }
}
Ushbu dasturdan olingan natijalar:
Inside A constructor.
Inside B constructor.
Inside C constructor.
Konstruktorlar sinfga bo'ysunish tartibida chaqiriladi. Bu qandaydir ma'noga ega. Superklass hech qanday kichik sinf haqida ma'lumotga ega emasligi sababli, uni bajarishi kerak bo'lgan har qanday ishga tushirish alohida hisoblanadi. Iloji bo'lsa, u pastki sinf tomonidan bajariladigan har qanday ishga tushirishdan oldin bo'lishi kerak. Shuning uchun birinchi navbatda buni qilish kerak.

Moslashuvchan konstruktorlar

Ish vaqti turini aniqlash mexanizmi Java tilining polimorfizmni amalga oshiradigan kuchli asosiy tamoyillaridan biridir. Biroq, bunday mexanizm ba'zi hollarda ishlab chiquvchini mos kelmaydigan turdagi kastingdan himoya qilmaydi. Eng keng tarqalgan holat - har xil turlari oldindan noma'lum bo'lgan va ish vaqtida aniqlanadigan bir guruh ob'ektlarni manipulyatsiya qilish. Turlarning nomuvofiqligi bilan bog'liq xatolar faqat ish vaqti bosqichida paydo bo'lishi mumkinligi sababli, bu ularni topish va yo'q qilishni qiyinlashtiradi. Java 2 5.0 da maxsus turlarning kiritilishi ushbu xatolarning bir qismini ish vaqtidan kompilyatsiya vaqtiga o'tkazadi va ba'zi etishmayotgan turdagi xavfsizlikni ta'minlaydi. Turdan Objectbeton turga o'tishda aniq turdagi quyma kerak emas. Shuni yodda tutish kerakki, turdagi sozlash vositalari faqat ob'ektlar bilan ishlaydi va sinf meros daraxtidan tashqarida joylashgan ibtidoiy ma'lumotlar turlariga taalluqli emas. Maxsus turlar bilan barcha translatsiyalar avtomatik ravishda va sahna ortida amalga oshiriladi. Bu sizga turdagi nomuvofiqliklardan himoyalanish va kodni tez-tez qayta ishlatish imkonini beradi. Konstruktorlarda moslashtirilgan turlardan foydalanish mumkin. Konstruktorlar, agar ularning sinfi odatiy tur bo'lmasa ham, odatiy bo'lishi mumkin. Masalan:
class GenConstructor
{
 private double val;
 <T extends Number> GenConstructor(T arg)
 {
   val = arg.doubleValue();
 }

 void printValue()
 {
  System.out.println("val: "+val);
 }
}

class GenConstructorDemo
{
 public static void main(String args[])
 {
  GenConstructor gc1 = new GenConstructor(100);
  GenConstructor gc2 = new GenConstructor(123.5F);

  gc1.printValue();
  gc2.printValue();
 }
}
Konstruktor GenConstructorsinfdan olingan sinf bo'lishi kerak bo'lgan maxsus turdagi parametrni belgilaganligi sababli Number, uni har qanday parametrdan chaqirish mumkin.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION