Konstruktor - bu sinf shablonidan ob'ektni "konstruksiya qilish" uchun ishlatiladigan kod bloki (usulga o'xshash ). Konstruktor nomi har doim sinf nomi bilan bir xil bo'ladi (bizning holatimizda xodimlar ) va odatda maydonlarni ishga tushirish uchun ishlatiladi.
sinf.
122 7 -bob. Obyektga yo‘naltirilgan dasturlash
Konstruktorning asosiy xususiyati shundaki, u bizning sinfimiz ob'ekti yaratilganda chaqiriladigan kodning birinchi blokiga aylanadi . Konstruktorning qolgan qismi boshqa usullar bilan deyarli bir xil. Biroq, konstruktor qiymatni
qaytarmaydi va uni e'lon qilishda void kalit so'zidan foydalanish shart emas.
Keling, Staff sinfi uchun konstruktorni e'lon qilishdan boshlaylik . Xodimlar sinfiga quyidagi parcha qo'shing :
ommaviy xodimlar (String nomi)
{
nameOfStaff = ism; System.out.println("\n" + nameOfStaff); System.out.println(" ");
}
Yuqoridagi misolda konstruktor parametr oladi
nomi bilan va nameOfStaff maydonini ishga tushirish uchun foydalanadi . Keyin ekranga nameOfStaff qiymatini chop etadi va uning tagiga qator chiziqlar bilan chizadi. Konstruktor boshqa hech narsa qilmaydi.
Ob'ektlarni "qurilish" uchun konstruktordan qanday foydalanish bo'l
keyinroq aytdi.
Keyin sinfimizga yana bir konstruktor qo'shamiz. Usullarda bo'lgani kabi , sinf turli imzolarga ega bo'lsa, bir nechta konstruktorga ega bo'lishi mumkin:
ommaviy xodimlar (String firstName, String lastName)
{ ""
nameOfStaff = firstName ++ familiya; System.out.println("\n" + nameOfStaff); System.out.println(" ");
}
Misol yaratish 123
Ikkinchi konstruktor ikkita parametrni oladi - firstName va familiyasi. Birinchi qator ikkita satrni birlashtiradi va natijani nameOfStaff ga tayinlaydi. Keyingi ikkita satr ekranga nameOfStaff qiymatini bosib chiqaradi va uning tagiga qator defislar bilan chiziladi.
Konstruktor deklaratsiyasi ixtiyoriydir. Agar konstruktor e'lon qilinmasa, NetBeans avtomatik ravishda
standart konstruktorni yaratadi. Bu konstruksiya
torus hech qanday parametrlarni qabul qilmaydi va ishga
tushirilmagan barcha maydonlarni standart qiymatlar bilan ishga tushiradi - 0
yoki ma'lumotlar turiga qarab uning ekvivalenti. Misol uchun, raqamli ma'lumotlar turi uchun standart qiymat 0, mos yozuvlar turi uchun esa null (bu o'zgaruvchida hech qanday manzil saqlanmaydi degan ma'noni anglatadi).
7.3. INSTANSI YARATISH
Staff sinfi tugallangandan so'ng , ob'ektni yaratish uchun sinfdan qanday foydalanishni ko'rib chiqamiz . Bu jarayon instantsiya deb ataladi (ob'ektlar misollar deb ham ataladi ) .
Shuni eslatib o'tamanki, natijada olingan sinf quyidagilardan iborat
komponentlar:
dalalar
xususiy String nameOfStaff; xususiy final int hourlyRate = 30; xususiy int soatlar Ishlagan;
124 7 -bob. Obyektga yo‘naltirilgan dasturlash
Usullari
public void printMessage() public int accountPay()
public int accountPay(int bonus, int to'lov) ommaviy bekor qilish toÿplamiIshlagan vaqti(int soat) public int getHoursWorked()
Konstruktorlar
ommaviy xodimlar (String nomi)
ommaviy xodimlar (String firstName, String lastName)
Staff namunasi ObjectOrientedDemo sinfidagi main() usulida yaratiladi .
Namuna yaratish sintaksisi:
ClassName objectName = yangi ClassName(argumentlar);
Loyihalar oynasida ObjectOriented Demo.java fayl nomini ikki marta bosing va main() usulida jingalak qavslar ichiga quyidagi qatorlarni kiriting :
Staff1 = yangi xodimlar ("Piter"); staff1.setHoursWorked(160);
int pay = staff1.calculatePay(1000, 400);
"
System.out.println("To'lov = + to'lash);
Birinchi jamoa
Staff1 = yangi xodimlar ("Piter");
birinchi konstruktordan (bitta parametr bilan) personal1 misolini yaratish uchun foydalanadi.
Personal1 ob'ekti yaratilgandan so'ng , ob'ekt nomidan keyin nuqta operatoridan har qanday umumiy maydon yoki sinf usuliga murojaat qilishimiz mumkin.
Misol yaratish 125
Xodimlar. Biz ObjectOrientedDemo sinfidan Staff sinfi komponentlariga kirishga harakat qilayotganimiz uchun nuqta operatori kerak . Ushbu operator har safar qo'ng'iroq qilmoqchi bo'lganingizda ishlatilishi kerak
boshqa sinfdagi maydon yoki usulga.
Agar joriy sinfdagi maydonlar yoki usullarga kirayotgan bo'lsangiz , sizga nuqta operatori kerak emas. Misol printPay() usulidan printMessage() usulini chaqirganda paydo bo'ladi . Nuqta operatori ishlatilmaydi, chunki ikkala usul ham bir sinfga tegishli.
Personal1 ob'ekti yaratilgandan so'ng , quyidagi qatorda setHours ommaviy to'siq usulidan qanday foydalanish ko'rsatilgan Ishlagan soatlar maydoniga qiymat belgilash uchun Worked() :
staff1.setHoursWorked(160);
Bu yerda ishlagan soatlar maydoni 160 ga o'rnatiladi. Ishlagan soatlar maydoniga kirishga harakat qilsangiz bevosita:
personal1.hoursWorked = 160;
siz xatoga duch kelasiz, chunki hoursWorked shaxsiy maydon bo'lib, u faqat Staff sinfida mavjud.
Keyin accountPay() usuli chaqiriladi:
xodimlar1.hisoblashPay(1000, 400);
Bu misolda 1000 va 400 raqamlari qavs ichida berilgan ; bu ikkinchi accountPay() usulidan foydalanilganligini bildiradi. O'tkazilgan 1000 va 400 qiymatlari mos ravishda bonus va nafaqa parametrlariga tayinlanadi .
126 7 -bob. Obyektga yo‘naltirilgan dasturlash
O'tkazilgan qiymatlar argumentlar deb ataladi. Keyin
dastur to'lovni hisoblash uchun ushbu usuldan foydalanadi va to'lov o'zgaruvchisiga tayinlangan natijani qaytaradi .
Nihoyat, System.out.println() usuli qiymatni chop etadi
ekranga to'lash .
Yuqoridagi kodni bajarishda natija quyidagicha ko'rinadi:
Piter
Toÿlov hisoblanmoqda...
To'lov = 6200
Sinflar qanday ishlashini yaxshiroq tushunish uchun ushbu kod bilan tajriba o'tkazing . Quyidagi qatorlarni qo'shishga harakat qiling:
Xodim2 = yangi xodimlar("Jeyn", "Li"); staff2.setHoursWorked(160);
to'lash = staff2.calculatePay(); "
System.out.println("To'lov = + to'lash);
Bu erda ikkinchi konstruktor (2 parametr bilan) xodimlarni imo-ishora qilish uchun ishlatiladi2. Ushbu kod bajarilganda quyidagi natija olinadi:
Jeyn Li
Toÿlov hisoblanmoqda...
To'lov = 4800
Belgilangan usullar yordamida ma'lumotlarni tekshirish qanday ishlashini ko'rsatadigan kodni qo'shamiz . main() usuliga quyidagi qatorlarni qo'shing :
127-sinf Statik komponentlar
System.out.println("\n\nJeynning ishlagan soati -10 ga yangilanmoqda");
staff2.setHoursWorked(-10); System.out.println("\nIshlagan soatlar =
getHoursWorked());
" + xodimlar2.
to'lash = staff2.calculatePay(); "
System.out.println("To'lov = + to'lash);
Bu erda biz ish soatlarini -10 ga o'rnatishga harakat
qilmoqdamiz . Yuqoridagi kodni bajarish natijasi quyidagicha ko'rinadi:
Jeynning ishlagan soatlarini -10 ga yangilash
Xato: Ishlagan soatlar noldan kichik boÿlishi mumkin emas
Xato: HoursWorked yangilanmagan
Ishlagan soat = 160
Toÿlov hisoblanmoqda…
To'lov = 4800
-10 soatIshlagan diapazonda bo'lmaganligi sababli , o'rnatilgan usul Jeyn misoli uchun maydonni yangilamaydi ( staff2 ). hourWorked get usulini o'qiyotganda , maydonda 160 qiymati saqlanganligi ayon bo'ladi .
Yuqoridagi misol bizning maydonlarimiz qiymatlarini boshqarish uchun o'rnatilgan usullardan qanday foydalanishni ko'rsatadi.
Har doim shaxsiy maydonni o'z ichiga olgan sinfda ma'lumotlarni tekshirishni amalga oshiring . Aks holda, tekshirishni amalga oshirish uchun siz Staff sinfining
foydalanuvchisiga ishonishingiz kerak bo'ladi va bunga ishonish xavfsiz ema
7.4. STATIK SINF KOMPONENTLARI
Ushbu bob juda murakkab tushunchalarni qamrab olgan. Endi siz sinf nima ekanligini va nima ekanligini bilasiz
128 7 -bob. Obyektga yo‘naltirilgan dasturlash
maydonlar, usullar va konstruktorlarni ifodalaydi. Shuningdek, siz darslarni qanday e'lon qilish va ulardan foydalanishni o'rgandingiz. Agar siz ob'ektga yo'naltirilgan dasturlashda yangi bo'lsangiz, men ushbu bobning to'liq kodini quyidagi manzildan
yuklab olishingizni tavsiya qilaman : https://www.learncodingfast.com/java
va u bilan tajriba qiling. Kodni o'rganing va ko'ring davom etishdan oldin ushbu bobda ko'rib chiqilgan barcha mavzularni to'liq tushunib olishingiz kerak.
Ushbu bo'limda ob'ektga yo'naltirilgan dasturlashda qo'llaniladigan boshqa kalit so'z ko'rib chiqiladi , statik.
Avvalroq biz xodimlar1 va xodimlar2 obyektlarini yaratish uchun Staff sinfidan foydalanishni muhokama qildik .
Keyinchalik bu ob'ektlar Staff sinfidagi usullarni chaqirish uchun ishlatiladi
(masalan, personal1.calculatePay(1000, 400)).
Aytaylik, siz ba'zi usullarni chaqirmoqchisiz yoki Staff ob'ektini
yaratmasdan Staff sinfining ba'zi maydonlariga kirmoqchisiz . Buni iloji bormi?
Ha, mumkin. Buning uchun siz static kalit so'zdan foydalanishingiz kerak.
Statik kalit so'zning ma'nosini tushunish uchun quyidagi kodni ko'rib chiqing . NetBeans-ni ishga tushiring va StaticDemo nomli yangi Java ilovasini yarating.
Yaratilgan kodni quyidagi bilan almashtiring :
statik demo paketi;
sinf MyClass
{
// Statik bo'lmagan maydonlar va usullar
129-sinf Statik komponentlar
public String message = "Salom dunyo"; public void displayMessage()
{
System.out.println("Xabar =
}
"
+xabar);
// Statik maydonlar va usullar
public static String greetings = "Xayrli tong"; umumiy statik bekor displeyHreetings()
{
System.out.println("Salomlashish =
}
}
"
+salomlar);
umumiy sinf StaticDemo {
umumiy statik void main(String[] args) {
MyClass SD = yangi MyClass();
System.out.println(sd.message); sd.displayMessage();
System.out.println(MyClass.greetings); MyClass.displayGreetings();
}
}
Ushbu misol MyClass nomli ikkita sinfni yaratadi va statik demo.
Ushbu misolda ular bir xil faylda aniqlangan. Da
Agar xohlasangiz, bu ikki sinfni har xil sinflarga ajratishingiz mumkin
fayllar. Umuman olganda, iloji bo'lsa, turli sinflarni turli fayllarga joylashtirish kerak deb hisoblanadi. Tem
Biroq, bu misolda, soddalik uchun biz cheklaymiz
lis bitta fayl. Bundan tashqari, kod uzunligini qisqartirish uchun maydonlar ochiq deb e'lon qilindi . Haqiqatda
130 7 -bob. Obyektga yo‘naltirilgan dasturlash
Ilovalarda men maydonlarni shaxsiy deb e'lon qilishni va ular bilan ishlash uchun get va set usullaridan foydalanishni qat'iy tavsiya qilaman .
Bizning misolimizda MyClass bitta statik bo'lmagan xabar maydonini va bitta statik bo'lmagan displayMessage() usulini o'z ichiga oladi. Sinfda bitta statik salomlashish maydoni va bitta statik displayGreetings() usuli mavjud.
MyClass ning statik bo'lmagan komponentlariga murojaat qilish uchun boshqa sinfdan, avval qilinganidek, ob'ektning namunasini yaratishingiz kerak . Bu main() usulida sodir bo'ladi StaticDemo sinfi :
MyClass SD = yangi MyClass();
System.out.println(sd.message); sd.displayMessage();
Biroq, statik maydonlar va usullarga kirish uchun hech qanday ob'ekt yaratilishi shart emas. Ularga murojaat
qilish uchun quyida ko'rsatilganidek, sinf nomidan foydalaning:
System.out.println(MyClass.greetings); MyClass.displayGreetings();
Ushbu kodni ishga tushirganingizda, siz quyidagi natijani olasiz:
Salom Dunyo
Xabar = Salom dunyo xayrli tong
Salom = Xayrli tong
Bu statik maydon/usul va statik bo'lmagan maydon/ usul o'rtasidagi asosiy farq . Birinchisiga murojaat qilish uchun ob'ekt yaratishingiz shart emas; yetarli
Murakkab usullar 131
sinfning o'zi nomini belgilang. Ikkinchisiga kirish uchun ob'ekt kerak.
Java tilidagi ba'zi oldindan yozilgan usullar statik deb e'lon qilinadi. Masalan, Arrays sinfining usullari. Sinf nomi sinfdagi metodga murojaat qilish uchun ishlatiladi. Masalan, sort() usulini chaqirish uchun
Arrays.sort() yozuvidan foydalanish kerak .
ILG'IY USULLAR
METODLARDA MASÿVLARDAN FOYDALANISH
Ushbu bobni yakunlashdan oldin, men usullar bilan bog'liq yana ikkita tushunchani muhokama qilmoqchiman. Birinchisi
usullarda massivlardan foydalanish.
Ilgari siz metod parametrlarida ibtidoiy ma'lumotlar turlaridan (masalan, int) qanday foydalanishni o'rgandingiz . Usullardagi
ibtidoiy ma'lumotlar turlaridan tashqari siz ham foydalanishingiz mumkin
massivlardan foydalaning.
Massivni usul parametriga aylantirish uchun metod deklaratsiyasida parametrning maÿlumotlar turidan keyin kvadrat qavslar [] qoÿshing. Misol:
public void printFirstElement(int[] a)
{
}
Ushbu usulni chaqirganda, siz massivni e'lon qilishingiz va uni
usul argumenti sifatida topshirishingiz kerak. Quyida misol keltiriladi.
132 7 -bob. Obyektga yo‘naltirilgan dasturlash
Massivlarni parametr sifatida uzatishdan tashqari, metoddan massivni qaytarish ham mumkin. Buning uchun usul deklaratsiyasida qaytarish turidan keyin kvadrat qavslar [] qo'yiladi. Misol:
public int[] returnArray()
{
int[] a = new int[3];
// Massivdagi qiymatlarni yangilash uchun kod
a qaytarish;
}
Ushbu usuldan foydalanish uchun siz e'lon qilishingiz kerak
massivni yarating va unga usulning bajarilishi natijasini belgilang.
Massivlarni usullarda qanday ishlatishni yaxshiroq tushunish uchun Array nomli yangi Java ilovasini yarating MethodDemo va yaratilgan kodni quyidagi bilan almashtiring:
1 paketli massiv usuli namunasi; 2
3 import java.util.Arrays;
to'rtta
5-sinf MyClass{ 6
7
sakkiz
9
public void printFirstElement(int[] a)
{
System.out.println("Birinchi element " a[0]); +
o'n bir
12
13
o'n to'rt
o'n besh
16
17
public int[] returnArray()
{
int[] a = new int[3];
uchun (int i = 0; i < a.uzunlik; i++)
{
a[i] = i*2;
7.5. Murakkab usullar 133
o'n sakkiz
19
yigirma
21
22}
23
}
a qaytarish;
}
ommaviy sinf ArrayMethodDemo {
umumiy statik bekor asosiy(String[] args) { 26
27
|
|
MyClass amd = new MyClass();
|
28
|
|
|
29
|
|
int[] myArray = {1, 2, 3, 4, 5};
|
o'ttiz
31
|
|
amd.printFirstElement(myArray);
|
32
|
|
int[] myArray2 = amd.returnArray();
|
33
|
|
System.out.println(Arrays.toString(myArray2));
|
34
|
|
|
35
|
}
|
|
36}
|
|
|
Ushbu misolda MyClass va ArrayMethodDemo kabi ikkita sinf soddalik uchun yana bitta faylga kiritilgan.
MyClass sinfi (5-22-qatorlar) ikkita usulni o'z ichiga oladi.
Birinchi usul, printFirstElement() parametrlarda massivdan foydalanish imkoniyatini ko'rsatadi .
Ikkinchi usul - returnArray() qanday qaytishni ko'rsatadi usuldan massiv.
Ushbu ikki usuldan foydalanish uchun biz main() usulida amd nomli MyClass obyektini ishga tushiramiz (27-qator).
Keyinchalik, massiv e'lon qilinadi va 29 va 30-qatorlarda printFirstElement() usuliga argument sifatida uzatiladi:
int[] myArray = {1, 2, 3, 4, 5}; amd.printFirstElement(myArray);
134 7 -bob. Obyektga yo‘naltirilgan dasturlash
Bundan tashqari, ikkinchi massiv ham main() usulida e'lon qilinadi, unga qaytarish usulining natijasi tayinlanadi. Array() (32-qator):
int[] myArray2 = amd.returnArray();
Nihoyat, 33-qator massiv tarkibini chop etadi.
Ushbu dasturni ishga tushirish quyidagi natijani beradi:
Birinchi element 1
[0, 2, 4]
PARAMETRLARDA PRIMITIV VA REFERANS TURLARDAN O'TISH
Endi siz massivni metodga qanday o'tkazishni bilasiz. Ras
ibtidoiy parametrlar orasidagi farqlarga qarang
va mos yozuvlar turlari (massivlar kabi). Bu turlar orasida bitta muhim farq bor.
Primitiv turdagi o'zgaruvchini o'tkazishda ushbu o'zgaruvchining qiymatiga har qanday o'zgartirish faqat usulning o'ziga ta'sir qiladi. Dastur usuldan chiqqandan so'ng, o'zgarishlar yo'qoladi.
Boshqa tomondan, mos yozuvlar turidagi o'zgaruvchini o'tkazishda, o'zgaruvchining qiymatiga kiritilgan har qanday o'zgarishlar usul tugagandan keyin ham qoladi.
Ushbu mexanizm qanday ishlashini tushunish uchun ArrayMethod Demo.java faylidan MyClass sinfiga quyidagi ikkita usulni kiriting:
7.5. Murakkab usullar 135
public void passPrimitive(int primitivePara)
{
primitivePara = 10; "
System.out.println("Usul ichidagi qiymat = primitivePara); +
}
public void passReference(int[] refPara)
{
refPara[1] = 5; "
System.out.println("Usul ichidagi qiymat = refPara[1]); +
}
Birinchi usul ibtidoiy turdagi parametrni (int primitivePara) oladi va uning qiymatini o'zgartirishga harakat qiladi. Keyin parametr qiymatini chiqaradi.
Ikkinchi usul mos yozuvlar turi parametrini ( massiv) oladi va massivdagi ikkinchi elementning qiymatini o'zgartirishga
harakat qiladi . Keyin ushbu elementning qiymatini chiqaradi.
main() dasturiga quyidagi kod qatorlarini qo'shing :
int raqami = 2; System.out.println("oldingi raqam = amd.passPrimitive(raqam);
System.out.println("sondan keyingi raqam = System.out.print("\n");
" +raqam);
" +raqam);
System.out.println("myArray[1] oldin = amd.passReference(myArray); System.out.println("myArray[1] = dan keyin
" + myArray[1]);
" + myArray[1]);
Dasturni ishga tushirganingizda, siz quyidagi qo'shimcha natijalarni olasiz:
136 7 -bob. Obyektga yo‘naltirilgan dasturlash
oldingi raqam = 2
Usul ichidagi qiymat = 10
= 2 dan keyingi raqam
myArray[1] dan oldin = 2 Usul ichidagi qiymat = 5
myArray[1] dan keyin = 5
Ko'rib turganingizdek, raqamning qiymati usul chaqirilgunga qadar o'zgarishsiz qoladi . Boshqa tomondan, myArray [1] qiymati
usul chaqirilgandan keyin o'zgaradi.
Gap shundaki, siz mos yozuvlar turidagi o'zgaruvchini
o'tkazganingizda, siz o'zgaruvchining manzilini o'tkazasiz. Rasm kompilyatori
berilgan manzilda schatsya va tegishli qiladi xotirada saqlangan o'zgaruvchiga o'zgarishlar.
Boshqa tomondan, ibtidoiy turdagi o'zgaruvchini
o'tkazishda uning manzili emas, balki uning qiymati o'tkaziladi.
Misol uchun, agar o'zgaruvchan raqam 2 bo'lsa, qo'ng'iroq
amd.passPrimitive(raqam);
quyidagilarga teng:
amd.passPrimitive(2);
2 qiymati primitivePara parametriga beriladi. Raqam manzilini kiritmayotganimiz sababli , usul ichida qilgan har qanday o'zgarishlar raqamga ta'sir qilmaydi.
Bu metodga ibtidoiy tipdagi (masalan, int, float va boshqalar) mos yozuvlar turidagi (massiv kabi) o‘zgaruvchini o‘tkazishda doimo yodda tutish kerak bo‘lgan juda muhim farqdir .
Machine Translated by Google
sakkiz
Do'stlaringiz bilan baham: |