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
, private
yoki modifikatorsiz.
- Konstruktorda
abstract
, final
, native
yoki modifikatorlari bo'lishi mumkin static
emas synchronized
;
- Kalit so'z
this
bir xil sinfdagi boshqa konstruktorga ishora qiladi. Agar foydalanilsa, unga qo'ng'iroq konstruktorning birinchi qatori bo'lishi kerak;
- Kalit so'z
super
ota-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,
Object
shuning 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. Fayl
DefaultDemo.java
class DefaultDemo
{
DefaultDemo(String s)
{
System.out.print("DefaultDemo(String)");
}
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. Fayl
VoidDemo.java
class VoidDemo
{
VoidDemo()
{
System.out.println("Constructor");
}
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
,
private
yoki
protected
. Va endi misol quyidagicha ko'rinadi: Fayl
VoidDemo2.java
class VoidDemo2
{
public VoidDemo2()
{
System.out.println("Constructor");
}
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. Fayl
ReturnDemo.java
class ReturnDemo
{
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,
Checking
o'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. Fayl
Empoyee.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
name1
va ni almashtiradi
name2
.
name1
Konstruktor 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
name1
davom 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: Fayl
Salary1.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
value
ga teng bo'lib qoladi
1000
. Umuman olganda, uchta narsa sodir bo'ladi:
- O'zgaruvchi
x
parametr qiymatining nusxasi value
(ya'ni, raqam 1000
) bilan ishga tushiriladi.
- O'zgaruvchining qiymati
x
uch baravar ko'paydi - endi u ga teng 3000
. Biroq, o'zgaruvchining qiymati value
ga teng bo'lib qoladi 1000
.
- Konstruktor tugaydi va o'zgaruvchi
x
endi ishlatilmaydi.
Quyidagi misolda, xodimning maoshi muvaffaqiyatli uch barobar ko'paytirildi, chunki ob'ekt ma'lumotnomasining qiymati usulga parametr sifatida uzatiladi. Fayl
Salary2.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
s1
va konstruktor samarali ish haqini uch baravar oshiradi , chunki konstruktor ichida yaratilgan
s1.value
nusxa 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: Fayl
Primitive.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
Primitive
tip parametriga ega bo'lgan konstruktor yo'qligiga qaramasdan
int
, kirish parametriga ega bo'lgan konstruktor ishlaydi
double
. Konstruktorni chaqirishdan oldin o'zgaruvchi turdan turga
i
kengaytiriladi . Qarama-qarshi variant, agar o'zgaruvchi turdagi bo'lsa va konstruktor faqat parametrga ega bo'lsa , bu holatda kompilyatsiya xatosiga olib keladi.
int
double
i
double
int
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: Fayl
Salary3.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.value
ular
s3.value
bir xil qiymatni saqlaydilar
1000
. Aslida qatorda
Salary3 s2 = new Salary3(s1)
; o'zgaruvchi uchun yangi ob'ekt yaratiladi
s2
va o'zgaruvchi uchun ob'ekt holati
s1
konstruktor 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
s3
va 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:
- Barcha ma'lumotlar maydonlari standart qiymatlariga (0, noto'g'ri yoki null) ishga tushiriladi.
- Barcha maydon initsializatorlari va ishga tushirish bloklari sinf deklaratsiyasida ko'rsatilgan tartibda bajariladi.
- Agar konstruktorning birinchi qatorida boshqa konstruktor chaqirilsa, u holda chaqirilgan konstruktor bajariladi.
- 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
x
bilan ishga tushiriladi.
y
Keyinchalik, statik ishga tushirish bloki bajariladi. Keyin o'zgaruvchi
i
standart 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
SubClass
usulni avtomatik ravishda meros qilib oladi .
sayHi()
Shu bilan birga,
Example()
ota-klassning konstruktori uning avlodi tomonidan meros qilib olinmaydi
SubClass
.
this
Konstruktorlarda kalit so'z
this
Konstruktorlar 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: Fayl
ThisDemo.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.
super
Konstruktorlarda kalit so'z
super
Konstruktorlar 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: Fayl
SuperClassDemo.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. Fayl
super()
SuperClassDemo
Child
super
super()
Call.java
class A
{
A()
{
System.out.println("Inside A constructor.");
}
}
class B extends A
{
B()
{
System.out.println("Inside B constructor.");
}
}
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
Object
beton 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
GenConstructor
sinfdan olingan sinf bo'lishi kerak bo'lgan maxsus turdagi parametrni belgilaganligi sababli
Number
, uni har qanday parametrdan chaqirish mumkin.
GO TO FULL VERSION