Onlayn kirish


Download 1.33 Mb.
bet1/2
Sana15.06.2023
Hajmi1.33 Mb.
#1478985
  1   2
Bog'liq
www


www.allitebooks.com

ONLAYN KIRISH


Java™ How to Programlash, O'ninchi nashrning yangi nusxasini sotib olganingiz uchun tashakkur,
Dastlabki ob'ektlar. Sizning darsligingiz kitobga 12 oylik oldindan to'lovni o'z ichiga oladi
Hamkor veb-sayt. Bu oldindan toʻlangan obuna sizga toʻliq kirish imkonini beradi
quyidagi talabalarni qo'llab-quvvatlash sohalari:
• VideoNotes (alohida yaxshilash uchun mo'ljallangan bosqichma-bosqich video darsliklar
ushbu darslikda keltirilgan dasturlash tushunchalari)
• Manba kodi
• Premium veb-boblar va ilovalar

Qoplamani tirnash va talaba kirish kodini ochish uchun tangadan foydalaning.


Pichoq yoki boshqa o'tkir narsalarni ishlatmang, chunki bu kodga zarar etkazishi mumkin.

Java dasturiga kirish uchun, O'ninchi nashr, Early Objects Companion


Veb-sayt birinchi marta, siz kompyuterdan foydalanib onlayn ro'yxatdan o'tishingiz kerak bo'ladi
Internetga ulanish va veb-brauzer. Jarayon bir necha daqiqa davom etadi
va faqat bir marta bajarilishi kerak.
1. http://www.pearsonhighered.com/deitel/ saytiga o‘ting
2. Companion veb-saytini bosing.
3. Register tugmasini bosing.
4. Ro'yxatdan o'tish sahifasida skretch ostida joylashgan talaba kirish kodini* kiriting-
paneldan tashqari. Chiziqlarni yozmang. Siz katta yoki kichik harflardan foydalanishingiz mumkin.
5. Ekrandagi ko'rsatmalarga amal qiling. Agar sizga onlayn rejimida istalgan vaqtda yordam kerak bo'lsa
ro'yxatdan o'tish jarayoni, shunchaki Yordam kerakmi? belgisi.
6. Shaxsiy login ismingiz va parolingiz tasdiqlangandan so'ng siz foydalanishni boshlashingiz mumkin
Java qanday dasturlash kerak, O'ninchi nashr, Early Objects Companion veb-sayti!

Ro'yxatdan o'tganingizdan keyin tizimga kirish uchun:


Ushbu Companion veb-saytida faqat bir marta ro'yxatdan o'tishingiz kerak. Shundan so'ng siz istalgan tizimga kirishingiz mumkin
vaqtni http://www.pearsonhighered.com/deitel/ manzilida Kirish nomini va ko'rsatish orqali
So'ralganda parol.
*Muhim: Kirish kodi faqat bir marta ishlatilishi mumkin. Ushbu obuna 12 uchun amal qiladi
faollashtirilgandan keyin bir necha oy o'tadi va o'tkazilmaydi. Agar ushbu kirish kodi allaqachon mavjud bo'lsa
aniqlangan bo'lsa, u endi haqiqiy emas. Agar shunday bo'lsa, siz obuna sotib olishingiz mumkin
http://www.pearsonhighered.com/deitel/ saytida Java-ni qanday dasturlash mumkin bo'lsa,
O'ninchi nashr, Early Objects kitobi va ekrandagi ko'rsatmalarga amal qiling.
www.allitebooks.com

www.allitebooks.com


Deitel® seriyali sahifasi


Seriyani qanday dasturlash
Android qanday dasturlash kerak, 2/E
C++ qanday dasturlash kerak, 9/E
C Qanday dasturlash kerak, 7/E
Java™ Qanday dasturlash kerak, 10/E
Java™ Qanday dasturlash kerak, Ob'ektlarning oxirgi versiyasi, 10/E
Internet va World Wide Web qanday dasturlash kerak, 5/E
Visual C++® 2008 Qanday dasturlash kerak, 2/E
Visual Basic® 2012 Qanday dasturlash kerak, 6/E
Visual C#® 2012 Qanday dasturlash kerak, 5/E
Simply seriyasi
Oddiygina C++: Ilovaga asoslangan o'quv yondashuvi
Oddiygina Java™ dasturlash: Ilovaga asoslangan
O'quv yondashuvi
Oddiygina C#: Ilovaga asoslangan o'quv yondashuvi
Simply Visual Basic® 2010: Ilovaga asoslangan
Yondashuv, 4/E
CourseSmart veb-kitoblar
www.deitel.com/books/CourseSmart/
C++ dasturlash, 8/E va 9/E
Oddiygina C++: Ilovaga asoslangan o'quv yondashuvi
Java™ Qanday dasturlash kerak, 9/E va 10/E
Simply Visual Basic® 2010: Ilovaga asoslangan
Yondashuv, 4/E

(oldingi ustundan davomi)


Visual Basic® 2012 Qanday dasturlash kerak, 6/E
Visual Basic® 2010 qanday dasturlash kerak, 5/E
Visual C#® 2012 Qanday dasturlash kerak, 5/E
Visual C#® 2010 Qanday dasturlash kerak, 4/E
Deitel® Developer Series
Dasturchilar uchun Android: Ilovaga asoslangan
Yondashuv, 2/E, 1-jild
C11 ga kirish bilan dasturchilar uchun C
Dasturchilar uchun C++ 11
Dasturchilar uchun C# 2012
Dasturchilar uchun iOS 6 ga sho'ng'ing: ilovaga asoslangan
Yondashuv
Dasturchilar uchun Java™, 3/E
Dasturchilar uchun JavaScript
LiveLessons video o'rganish mahsulotlari
www.deitel.com/books/LiveLessons/
Android ilovalarini ishlab chiqish asoslari
C++ asoslari
Java™ asoslari
C# 2012 asoslari
C# 2010 asoslari
iOS® 6 ilovalarini ishlab chiqish asoslari
JavaScript asoslari
Visual Basic® asoslari
Deitel nashrlari, Resurs markazlari, o'quv kurslari, hamkorlar takliflari va boshqalar haqida yangilanishlarni olish uchun,
Iltimos, Deitel hamjamiyatlariga qo'shiling
• Facebook®—facebook.com/DeitelFan
• Twitter®—@deitel
• Google+™—google.com/+DeitelFan
• YouTube™—youtube.com/DeitelTV
• LinkedIn®—linkedin.com/company/deitel-&-associates
va bepul Deitel® Buzz Online elektron pochta xabarnomasiga ro'yxatdan o'ting:
www.deitel.com/newsletter/subscribe.html
Mualliflar bilan bog'lanish uchun quyidagi manzilga elektron pochta xabarini yuboring:
deitel@deitel.com
Deitel & Associates, Inc. tomonidan butun dunyo bo'ylab taklif qilinadigan Dive-Into® Series seminarlari haqida ma'lumot olish uchun,
bizga deitel@deitel.com manziliga yozing yoki tashrif buyuring:
www.deitel.com/training/
Pearson/Deitel nashrlari haqidagi doimiy yangilanishlar uchun quyidagi manzilga tashrif buyuring:
www.deitel.com
www.pearsonhighered.com/deitel/
Deitel resurs markazlariga tashrif buyuring, bu sizga dasturlash tillarini o'zlashtirish, dasturiy ta'minotni ishlab chiqish-
ment, Android va iOS ilovalarini ishlab chiqish, Internet va internetga oid mavzular:
www.deitel.com/ResourceCenters.html

www.allitebooks.com


Pol Deytel


Deitel & Associates, Inc.
Xarvi Deytel
Deitel & Associates, Inc.

www.allitebooks.com


Tahririyat direktori, ECS: Marsiya Xorton


Ijrochi muharrir: Treysi Jonson (Dunkelberger)
Marketing direktori: Kristi Lesko
Marketing menejeri: Yez Alayan
Marketing bo'yicha yordamchi: Jon Bryant
Dastur boshqaruvi direktori: Erin Gregg
Dastur boshqaruvi - Jamoa rahbari: Skott Disanno
Dastur menejeri: Kerol Snayder
Loyiha boshqaruvi-guruh rahbari: Laura Burgess
Loyiha rahbari: Robert Engelxardt
Xaridlar bo'yicha mutaxassis: Linda Sager
Muqova dizayni: Pol Deytel, Xarvi Deytel, Abbey Deytel, Barbara Deytel, Laura Gardner
Ruxsatlar bo'yicha nazoratchi: Maykl Joys
Ruxsatlar ma'muri: Jenell Forschler
Direktor, Image Asset Services: Enni Atherton
Vizual tadqiqot menejeri: Karen Sanatar
Muqova rasmi: © Nikrub/Shutterstock
Media loyihasi menejeri: Renata Butera
Ushbu darslikda boshqa manbalardan olingan va ruxsatnoma bilan takrorlangan kreditlar va minnatdorchiliklar mavjud
vi sahifada.

Ushbu kitob mualliflari va nashriyotlari ushbu kitobni tayyorlashda bor kuchlarini sarfladilar. Ushbu sa'y-harakatlarga quyidagilar kiradi


ularning samaradorligini aniqlash uchun nazariyalar va dasturlarni ishlab chiqish, tadqiq qilish va sinovdan o'tkazish. Mualliflar va nashriyot-
lisher ushbu dasturlar yoki hujjatlarga nisbatan ochiq yoki nazarda tutilgan hech qanday kafolat bermaydi.
ushbu kitobda mavjud. Mualliflar va noshir hech qanday holatda tasodifiy yoki oqibatli zarar uchun javobgar bo'lmaydi.
ushbu dasturlarni jihozlash, bajarish yoki ulardan foydalanish bilan bog'liq yoki ulardan kelib chiqadigan yosh.
Mualliflik huquqi © 2015, 2012 va 2009 Pearson Education, Inc. Barcha huquqlar himoyalangan. Amerika Qo'shma Shtatlarida ishlab chiqarilgan
Amerika. Ushbu nashr mualliflik huquqi bilan himoyalangan va undan oldin nashriyotdan ruxsat olish kerak
har qanday taqiqlangan takror ishlab chiqarish, qidiruv tizimida saqlash yoki har qanday shaklda yoki elektron,
mexanik, nusxa ko'chirish, yozib olish yoki shunga o'xshash. Ushbu ishdagi materiallardan foydalanishga ruxsat(lar)ni olish uchun iltimos
yozma so'rovni Pearson Education, Inc., Ruxsatlar bo'limi, One Lake Street, Upper Saddle River,
Nyu-Jersi 07458 yoki so'rovingizni 201-236-3290 raqamiga faks orqali yuborishingiz mumkin.
Ishlab chiqaruvchilar va sotuvchilar o'z mahsulotlarini farqlash uchun ko'plab belgilar savdo belgilari sifatida da'vo qilinadi. Qayerda
bu belgilar ushbu kitobda uchraydi va nashriyot tovar belgisiga oid da'vodan xabardor bo'lgan, belgilar
bosh harflar yoki barcha bosh harflar bilan bosilgan.
Kongress kutubxonasi nashriyot ma'lumotlarini kataloglash
Faylda

10 9 8 7 6 5 4 3 2 1


ISBN-10: 0-13-380780-0
ISBN-13: 978-0-13-380780-6

www.allitebooks.com


Brayan Gyotsga,


Oracle'ning Java tili me'mori va
Java SE 8 Lambda loyihasi uchun spetsifikatsiya rahbari:
Sizning ustozligingiz bizga yaxshiroq kitob yaratishga yordam berdi.
Biz buni to'g'ri tushunamiz deb turib olganingiz uchun tashakkur.
Pol va Xarvi Deitel

www.allitebooks.com


Savdo belgilari


DEITEL, ikki tomonlama xato va DIVE INTO Deitel and Associates kompaniyasining roʻyxatdan oʻtgan savdo belgilaridir,
Inc.
Oracle va Java Oracle va/yoki uning filiallarining roʻyxatdan oʻtgan savdo belgilaridir. Boshqa nomlar savdo belgilari bo'lishi mumkin
ularning tegishli egalari.
Microsoft va/yoki uning tegishli yetkazib beruvchilari ma'lumotlarning mosligi haqida hech qanday bayonot bermaydilar
har qanday maqsadda xizmatlarning bir qismi sifatida nashr etilgan hujjatlar va tegishli grafikalarda mavjud. Hammasi
bunday hujjatlar va tegishli grafiklar hech qanday kafolatsiz "xuddi shunday" taqdim etiladi. Microsoft va/
yoki uning tegishli yetkazib beruvchilari shu bilan ushbu ma'lumotlarga oid barcha kafolatlar va shartlardan voz kechishadi,
barcha kafolatlar va savdoga yaroqlilik shartlari, shu jumladan, ochiq, nazarda tutilgan yoki qonuniy, yaroqlilik
ma'lum bir maqsad, unvon va huquqbuzarlik uchun. Hech qanday holatda Microsoft va/yoki uning tegishli yordami
penslar har qanday maxsus, bilvosita yoki oqibatli zararlar yoki har qanday zarar uchun javobgar bo'ladi
shartnoma, beparvolik yoki boshqa huquqbuzarlik harakatlarida foydalanish, ma'lumotlar yoki foydani yo'qotishdan,
xizmatlardan foydalanish mumkin bo'lgan ma'lumotlardan foydalanish yoki bajarish bilan bog'liq yoki ular bilan bog'liq holda yuzaga keladigan.
Bu erda mavjud bo'lgan hujjatlar va tegishli grafiklar texnik noaniqliklarni yoki tipografiyani o'z ichiga olishi mumkin.
etik xatolar. Bu yerdagi ma'lumotlarga vaqti-vaqti bilan o'zgartirishlar kiritiladi. Microsoft va/yoki uning tegishli yordami
penslar bu yerda tavsiflangan mahsulot(lar) va/yoki dastur(lar)da yaxshilanishlar va/yoki o‘zgartirishlar kiritishi mumkin.
istalgan payt. Qisman skrinshotlar belgilangan dasturiy ta'minot versiyasida to'liq ko'rinishi mumkin.
Microsoft® va Windows® Microsoft korporatsiyasining AQShda ro'yxatdan o'tgan savdo belgilaridir va
boshqa mamlakatlar. Skrinshotlar va piktogrammalar Microsoft korporatsiyasi ruxsati bilan qayta chop etilgan. Bu
kitob Microsoft korporatsiyasi tomonidan homiylik qilinmagan yoki tasdiqlanmagan yoki unga aloqador emas. UNIX roʻyxatdan oʻtgan
The Open Group savdo belgisi.
Apache - bu Apache Software Foundation kompaniyasining savdo belgisi.
CSS va XML World Wide Web Consortiumning ro'yxatdan o'tgan savdo belgilaridir.
Firefox Mozilla Foundation kompaniyasining roʻyxatdan oʻtgan savdo belgisidir.
Google Google, Inc.ning savdo belgisidir.
Mac va OS X — Apple Inc. kompaniyasining AQSh va boshqa mamlakatlarda roʻyxatdan oʻtgan savdo belgilaridir.
Linux Linus Torvalds kompaniyasining ro'yxatdan o'tgan savdo belgisidir. Barcha savdo belgilari tegishli egalarining mulki hisoblanadi.
Ushbu kitob davomida savdo belgilaridan foydalaniladi. Har bir hodisada savdo belgisi belgisini qo'yish o'rniga
savdo belgisi bo'lgan nom bo'lsa, biz nomlardan faqat tahririyat tarzida va foyda olish uchun foydalanayotganimizni bildiramiz
tovar belgisi egasining tovar belgisini buzish niyati bo'lmagan holda.

www.allitebooks.com


26–34-boblar va F–N qoʻshimchalari PDF-hujjatlari boʻlib, kitobda onlayn joylashtirilgan


Companion veb-sayti (www.pearsonhighered.com/deitel/ manzilida joylashgan). Ichkariga qarang
Companion veb-saytiga kirish haqida ma'lumot olish uchun old muqova.
So'zboshi xxiii
Muqaddima xxv
Boshlashdan oldin xxxix
1 Kompyuterlar, Internet va Java tiliga kirish 1
1.1 Kirish 2
1.2 Uskuna va dasturiy ta'minot 4
1.2.1 Mur qonuni 4
1.2.2 Kompyuterni tashkil etish 5
1.3 Ma'lumotlar ierarxiyasi 6
1.4 Mashina tillari, Assambleya tillari va yuqori darajali tillar 9
1.5 Obyekt texnologiyasiga kirish 10
1.5.1 Avtomobil ob'ekt sifatida 10
1.5.2 Usullar va sinflar 11
1.5.3 Instantsiya 11
1.5.4 Qayta foydalanish 11
1.5.5 Xabarlar va qo'ng'iroqlar usuli 11
1.5.6 Atributlar va misol o'zgaruvchilari 11
1.5.7 Inkapsulyatsiya va ma'lumotlarni yashirish 12
1.5.8 Meros 12
1.5.9 Interfeyslar 12
1.5.10 Ob'ektga yo'naltirilgan tahlil va dizayn (OOAD) 12
1.5.11 UML (Unified Modeling Language) 13
1.6 Operatsion tizimlar 13
1.6.1 Windows - xususiy operatsion tizim 13
1.6.2 Linux — ochiq kodli operatsion tizim 14
1.6.3 Android 14
1.7 Dasturlash tillari 15
1.8 Java 17
1.9 Odatda Java ishlab chiqish muhiti 17
1.10 Java dasturini sinovdan o'tkazish 21

Tarkib


www.allitebooks.com

viii Tarkib

1.11 Internet va World Wide Web 25
1.11.1 Internet: Tarmoqlar tarmog'i 26
1.11.2 Butunjahon Internet: Internetni foydalanuvchilar uchun qulay qilish 26
1.11.3 Veb-xizmatlar va Mashuplar 26
1.11.4 Ajax 27
1.11.5 Narsalar interneti 27
1.12 Dasturiy ta'minot texnologiyalari 28
1.13 Axborot texnologiyalari bilan yangilanish 30
2 Java ilovalariga kirish;
Kirish/chiqish va operatorlar 34
2.1 Kirish 35
2.2 Java-dagi birinchi dasturingiz: Matn qatorini chop etish 35
2.3 Birinchi Java dasturingizni o'zgartirish 41
2.4 Matnni printf 43 bilan ko'rsatish
2.5 Yana bir ilova: 45 butun sonlarni qo'shish
2.5.1 Import deklaratsiyasi 45
2.5.2 Sinf qo'shimchasini e'lon qilish 46
2.5.3 Foydalanuvchi ma'lumotlarini olish uchun skanerni e'lon qilish va yaratish
klaviatura 46
2.5.4 Butun sonlarni saqlash uchun o‘zgaruvchilarni e’lon qilish 47
2.5.5 Foydalanuvchini kiritish uchun 48 so'rash
2.5.6 Foydalanuvchidan kirish sifatida int olish 48
2.5.7 Ikkinchi int ni so'rash va kiritish 49
2.5.8 Hisoblashda o‘zgaruvchilardan foydalanish 49
2.5.9 Hisoblash natijasini ko'rsatish 49
2.5.10 Java API hujjatlari 49
2.6 Xotira tushunchalari 50
2.7 Arifmetika 51
2.8 Qaror qabul qilish: Tenglik va aloqa operatorlari 54
2.9 Yakunlash 58
3 Sinflar, ob'ektlar, usullar bilan tanishish
va satrlar 69
3.1 Kirish 70
3.2 Instance o'zgaruvchilari, Methods o'rnating va Methods 71 ni oling
3.2.1 Instance o'zgaruvchisi bilan hisob klassi, to'plam usuli va
a get usuli 71
3.2.2 Ob'ektni yaratadigan va ishlatadigan AccountTest klassi
Sinf hisobi 74
3.2.3 Bir nechta sinflarga ega ilovani kompilyatsiya qilish va bajarish 77
3.2.4 Instance o'zgaruvchisi bilan hisob UML klassi diagrammasi va
77-usullarni o'rnating va oling
3.2.5 Class AccountTest 78 bo'yicha qo'shimcha eslatmalar

www.allitebooks.com


Tarkib ix

3.2.6 Shaxsiy misol o'zgaruvchilari bilan dasturiy ta'minot muhandisligi va
ommaviy to'plam va usullarni oling 79
3.3 Ibtidoiy turlar va mos yozuvlar turlari 80
3.4 Hisob sinfi: Konstruktorlar bilan ob'ektlarni ishga tushirish 81
3.4.1 Shaxsiy ob'ektni ishga tushirish uchun hisob konstruktorini e'lon qilish 81
3.4.2 Class AccountTest: Hisob obyektlarini ishga tushirish qachon
Ular 82 ta yaratilgan
3.5 Balans bilan hisob-kitoblar sinfi; Suzuvchi nuqtali raqamlar 84
3.5.1 Balansga ega hisob klassi Double 85 tipidagi o'zgaruvchi namunasi
3.5.2 86-sinf hisobini ishlatish uchun AccountTest klassi
3.6 (ixtiyoriy) GUI va grafik misollar: dialog oynalaridan foydalanish 90
3.7 Yakunlash 93
4 Nazorat bayonoti: 1-qism; Topshiriq,
++ va -- Operatorlar 101
4.1 Kirish 102
4.2 Algoritmlar 102
4.3 Psevdokod 103
4.4 Boshqaruv tuzilmalari 103
4.5 Agar bitta tanlov bayonnomasi 105
4.6 if...else Ikki marta tanlash bayonnomasi 106
4.7 Talabalar sinfi: Ichki oʻrnatilgan if…else bayonotlari 111
4.8 Takrorlash bayonoti 113
4.9 Algoritmlarni shakllantirish: qarshi boshqariladigan takrorlash 115
4.10 Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan takrorlash 119
4.11 Algoritmlarni shakllantirish: ichki o'rnatilgan boshqaruv bayonotlari 126
4.12 Murakkab tayinlash operatorlari 131
4.13 O'stirish va kamaytirish operatorlari 131
4.14 Primitiv tiplar 134
4.15 (ixtiyoriy) GUI va grafik misollar: oddiy chizmalar yaratish 135
4.16 Yakunlash 139
5 Nazorat bayonoti: 2-qism; Mantiqiy operatorlar 152
5.1 Kirish 153
5.2 Qarama-qarshi boshqariladigan takrorlashning asoslari 153
Takrorlash bayonoti uchun 5.3 155
5.4 For bayonotidan foydalanishga misollar 159
5.5 takrorlash bayonnomasi 163 paytida… bajaring
5.6 165-sonli ko'p tanlovli kommutator
5.7 Class AutoPolicy Case Study: 171-sonli kommutatordagi satrlar
5.8 Tanaffus va davom etish bayonotlari 174
5.9 Mantiqiy operatorlar 176
5.10 Strukturaviy dasturlashning qisqacha mazmuni 182
5.11 (ixtiyoriy) GUI va grafik misol: To‘rtburchaklar va tasvirlar chizish 187
5.12 Yakunlash 190

x Tarkib
6 ta usul: chuqurroq qarash 200


6.1 Kirish 201
6.2 Java 201 da dastur modullari
6.3 Static Methods, Static Fields va Class Math 203
6.4 Ko'p parametrli usullarni e'lon qilish 205
6.5 Deklaratsiya va usullardan foydalanish bo'yicha eslatmalar 208
6.6 Metod-Stek va stek ramkalarini chaqirish 209
6.7 Argumentlarni ilgari surish va kasting 210
6.8 Java API paketlari 211
6.9 Case Study: Xavfsiz tasodifiy raqamlarni yaratish 213
6.10 Case Study: Imkoniyatlar o'yini; Enum turlari bilan tanishtirish 218
6.11 Deklaratsiyalar doirasi 222
6.12 Usulni ortiqcha yuklash 225
6.13 (ixtiyoriy) GUI va grafik misol: ranglar va to‘ldirilgan shakllar 227
6.14 Yakunlash 230
7 Massivlar va massivlar roʻyxati 243
7.1 Kirish 244
7.2 245-massivlar
7.3 Massivlarni e’lon qilish va yaratish 246
7.4 Massivlardan foydalanishga misollar 247
7.4.1 Massivni yaratish va ishga tushirish 247
7.4.2 Massiv initsializatoridan foydalanish 248
7.4.3 249-massivda saqlash uchun qiymatlarni hisoblash
7.4.4 251-massiv elementlarini yig‘ish
7.4.5 Massiv ma'lumotlarini grafik ko'rsatish uchun chiziqli diagrammalardan foydalanish 251
7.4.6 Massiv elementlaridan hisoblagich sifatida foydalanish 253
7.4.7 So‘rov natijalarini tahlil qilish uchun massivlardan foydalanish 254
7.5 Istisnolarni ko'rib chiqish: noto'g'ri javobni qayta ishlash 256
7.5.1 try Bayonoti 256
7.5.2 256-blokni tutib olishni bajarish
7.5.3 257-sonli istisno parametrining toString usuli
7.6 Case Study: Kartalarni aralashtirish va muomala simulyatsiyasi 257
7.7 Bayonot 262 uchun kengaytirilgan
7.8 Massivlarni 263-usullarga o‘tkazish
7.9 Qiymati bo‘yicha o‘tish va o‘tish bo‘yicha 265
7.10 Case Study: 266 baholarni saqlash uchun massivdan foydalanish sinf baho kitobi
7.11 Ko‘p o‘lchovli massivlar 272
7.12 Case Study: Ikki o‘lchovli massivdan foydalangan holda sinf baho kitobi 275
7.13 O‘zgaruvchan uzunlikdagi argumentlar ro‘yxati 281
7.14 Buyruqlar qatori argumentlaridan foydalanish 283
7.15 285-sinf massivlari
7.16 To'plamlar va sinf ArrayList 287-ga kirish
7.17 (ixtiyoriy) GUI va grafik misol: Arcs 291 chizish
7.18 Yakunlash 294

Tarkib xi


8 ta sinflar va ob'ektlar: chuqurroq qarash 315
8.1 Kirish 316
8.2 Vaqt klassi misoli 316
8.3 A'zolarga kirishni nazorat qilish 321
8.4 Ushbu havola bilan joriy ob'ektning a'zolariga murojaat qilish 322
8.5 Vaqt sinfi misoli: haddan tashqari yuklangan konstruktorlar 324
8.6 Standart va argumentsiz konstruktorlar 330
8.7 O'rnatish va olish usullari bo'yicha eslatmalar 330
8.8 Tarkibi 332
8.9 raqam 335 turlari
8.10 Axlat yig'ish 337
8.11 Statik sinf a'zolari 338
8.12 statik import 342
8.13 Yakuniy misol o'zgaruvchilari 343
8.14 Paketga kirish 344
8.15 Aniq pul hisob-kitoblari uchun BigDecimal dan foydalanish 345
8.16 (ixtiyoriy) GUI va grafik misollar: Grafika bilan ob'ektlardan foydalanish 348
8.17 Yakunlash 352
9 Ob'ektga yo'naltirilgan dasturlash: Inheritance 360
9.1 Kirish 361
9.2 Yuqori sinflar va kichik sinflar 362
9.3 Himoyalangan a'zolar 364
9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 365
9.4.1 Komissiyani yaratish va undan foydalanish Xodimlar sinfi 365
9.4.2 BasePlusCommissionEmployee klassini yaratish va ishlatish 371
9.4.3 Komissiyani yaratish – BasePlusCommissionEmployee
Meros ierarxiyasi 376
9.4.4 Komissiya xodimi – BasePlusKomissiya xodimi
Himoyalangan misol o'zgaruvchilari yordamida meros ierarxiyasi 379
9.4.5 Komissiya xodimi – BasePlusKomissiya xodimi
Shaxsiy misol o'zgaruvchilari yordamida meros ierarxiyasi 382
9.5 387-kichik sinflardagi konstruktorlar
9.6 387-sinf ob'ekti
9.7 (ixtiyoriy) GUI va grafik misollar: matnni ko'rsatish va
Yorliqlar yordamida tasvirlar 388
9.8 Yakunlash 391
10 ob'ektga yo'naltirilgan dasturlash:
Polimorfizm va interfeyslar 395
10.1 Kirish 396
10.2 Polimorfizmga misollar 398
10.3 Polimorf xulq-atvorni namoyish qilish 399
10.4 Referat sinflari va usullari 401

xii Tarkib

10.5 Tadqiq: Polimorfizmdan foydalangan holda ish haqi tizimi 404
10.5.1 Referat Supersinf xodimi 405
10.5.2 Beton kichik sinf Maoshli xodim 407
10.5.3 Beton kichik sinfi Soatlik xodim 409
10.5.4 Beton kichik sinf komissiyasi Xodim 411
10.5.5 Bilvosita beton quyi sinfi BasePlusCommissionEmployee 413
10.5.6 Polimorfik ishlov berish, operator namunasi va 414 ni pastga tushirish
10.6 Superklass va quyi sinf oʻzgaruvchilari oʻrtasida ruxsat etilgan topshiriqlar 419
10.7 Yakuniy usullar va sinflar 419
10.8 Konstruktorlardan qo'ng'iroq qilish usullari bilan bog'liq muammolarni chuqurroq tushuntirish 420
10.9 Interfeyslarni yaratish va ulardan foydalanish 421
10.9.1 To'lov ierarxiyasini ishlab chiqish 422
10.9.2 Interfeys to'lovi 423
10.9.3 Sinf hisob-fakturasi 424
10.9.4 Interfeysni amalga oshirish uchun sinf xodimini o'zgartirish to'lov 426
10.9.5 To'lanadigan qarzda foydalanish uchun maoshli xodim sinfini o'zgartirish
Ierarxiya 428
10.9.6 Hisob-fakturalar va xodimlarni qayta ishlash uchun to'lanadigan interfeysdan foydalanish
Polimorf 430
10.9.7 Java API 431 ning ba'zi umumiy interfeyslari
10.10 Java SE 8 interfeysi yaxshilanishlari 432
10.10.1 Standart interfeys usullari 432
10.10.2 Statik interfeys usullari 433
10.10.3 Funktsional interfeyslar 433
10.11 (ixtiyoriy) GUI va grafik misol: Polimorfizm bilan chizish 433
10.12 Yakunlash 436
11 Istisnolarni ko'rib chiqish: chuqurroq qarash 441
11.1 Kirish 442
11.2 Misol: Nolga bo'lish istisnosiz ishlov berish 443
11.3 Misol: ArithmeticExceptions va InputMismatchExceptions bilan ishlash 445
11.4 Istisnolardan foydalanish qachon 451
11.5 Java istisno ierarxiyasi 451
11.6, nihoyat, 454-blok
11.7 Stackni ochish va istisno ob'ektdan ma'lumot olish 459
11.8 Zanjirlangan istisnolar 461
11.9 Yangi istisno turlarini e'lon qilish 464
11.10 Old shartlar va keyingi shartlar 465
11.11 Tasdiqlashlar 465
11.12 Resurslar bilan sinash: Resurslarni avtomatik taqsimlash 467
11.13 Yakunlash 467
12 GUI komponentlari: 1-qism 473
12.1 Kirish 474

Tarkib xiii

12.2 Java-ning Nimbus Look-and-Feel 475
12.3 JOptionPane 476 bilan oddiy GUI-ga asoslangan kirish/chiqish
12.4 Swing komponentlarini ko'rib chiqish 479
12.5 Matn va tasvirlarni oynada aks ettirish 481
12.6 Matn maydonlari va ichki o'rnatilgan sinflar bilan hodisalarni boshqarishga kirish 485
12.7 Umumiy GUI hodisa turlari va tinglovchi interfeyslari 491
12.8 Hodisalarni boshqarish qanday ishlaydi 493
12.9 JButton 495
12.10 Holatni saqlaydigan tugmalar 498
12.10.1 JCheckBox 499
12.10.2 JRadioButton 501
12.11 JComboBox; Voqealarni boshqarish uchun anonim ichki sinfdan foydalanish 504
12.12 JList 508
12.13 Ko'p tanlovli ro'yxatlar 511
12.14 Sichqoncha hodisalarini boshqarish 513
12.15 Adapterlar sinflari 518
12.16 Sichqoncha bilan chizish uchun JPanel kichik sinfi 522
12.17 Asosiy voqealarni boshqarish 525
12.18 Layout menejerlariga kirish 528
12.18.1 FlowLayout 530
12.18.2 BorderLayout 532
12.18.3 GridLayout 536
12.19 Murakkab maketlarni boshqarish uchun panellardan foydalanish 538
12.20 JTextArea 539
12.21 Yakunlash 542
13 Grafika va Java 2D 555
13.1 Kirish 556
13.2 Grafik kontekst va grafik obyektlar 558
13.3 Rangni boshqarish 559
13.4 Shriftlarni boshqarish 566
13.5 Chiziqlar, to'rtburchaklar va tasvirlar chizish 571
13.6 Yoylarni chizish 575
13.7 Ko‘pburchaklar va ko‘p chiziqli chiziqlarni chizish 578
13.8 Java 2D API 581
13.9 Yakunlash 588
14 Satrlar, belgilar va muntazam ifodalar 596
14.1 Kirish 597
14.2 Belgilar va qatorlar asoslari 597
14.3 Sinf satri 598
14.3.1 String konstruktorlari 598
14.3.2 String usullari uzunligi, charAt va getChars 599
14.3.3 600 satrlarni solishtirish

xiv Tarkib

14.3.4 605-qatordagi belgilar va pastki qatorlarni joylashtirish
14.3.5 607 satrlardan pastki satrlarni ajratib olish
14.3.6 Birlashtiruvchi qatorlar 608
14.3.7 Turli qatorli usullar 608
14.3.8 String usuli qiymatiOf 610
14.4 StringBuilder 611 sinfi
14.4.1 StringBuilder konstruktorlari 612
14.4.2 StringBuilder usullari uzunligi, sig'imi, to'plamiLength
va 612 quvvatni ta'minlang
14.4.3 StringBuilder usullari charAt, setCharAt, getChars
va teskari 614
14.4.4 StringBuilder 615-usullarga qo'shiladi
14.4.5 StringBuilder qo'shish va o'chirish usullari 617
14.5 618-sinf belgisi
14.6 Tokenizatsiya satrlari 623
14.7 Oddiy iboralar, sinf namunasi va sinf moslamasi 624
14.8 Yakunlash 633
15 Fayllar, oqimlar va obyektlarni ketma-ketlashtirish 644
15.1 Kirish 645
15.2 Fayllar va oqimlar 645
15.3 Fayl va katalog ma'lumotlarini olish uchun NIO sinflari va interfeyslaridan foydalanish 647
15.4 Ketma-ket kirish matnli fayllar 651
15.4.1 Ketma-ket kirish matnli faylini yaratish 651
15.4.2 Ketma-ket kirish matn faylidan ma'lumotlarni o'qish 655
15.4.3 Case Study: Kredit-so'rov dasturi 657
15.4.4 Ketma-ket kirish fayllarini yangilash 661
15.5 Ob'ektni ketma-ketlashtirish 662
15.5.1 Ob'ektni ketma-ketlashtirish 663 yordamida ketma-ket kirish faylini yaratish
15.5.2 Ketma-ket kirish faylidan ma'lumotlarni o'qish va seriyadan chiqarish 668
15.6 JFileChooser 670 yordamida fayllarni ochish
15.7 (Ixtiyoriy) Qo'shimcha java.io sinflari 673
15.7.1 Baytga asoslangan kirish va chiqish uchun interfeyslar va sinflar 673
15.7.2 Belgilarga asoslangan kirish va chiqish uchun interfeyslar va sinflar 675
15.8 Yakunlash 676
16 Umumiy to'plamlar 684
16.1 Kirish 685
16.2 To'plamlar haqida umumiy ma'lumot 685
16.3 Turi-o‘rash sinflari 687
16.4 Autoboxing va Auto-Unboxing 687
16.5 Interfeyslar to'plami va sinflar to'plamlari 687
16.6 Ro'yxatlar 688
16.6.1 ArrayList va Iterator 689
16.6.2 Bog'langan ro'yxat 691

Mundarija xv

16.7 To'plamlar usullari 696
16.7.1 697-tartib usuli
16.7.2 Aralash usuli 700
16.7.3 Teskari, to'ldirish, nusxalash, maks va min 702 usullari
16.7.4 BinarySearch 704 usuli
16.7.5 AddAll usullari, chastota va ajratilgan 706
16.8 java.util 708 paketining stek klassi
16.9 Class PriorityQueue va interfeys navbati 710
16.10 711-to'plamlar
16.11 Xaritalar 714
16.12 718-sinf xususiyatlari
16.13 Sinxronlashtirilgan to'plamlar 721
16.14 O'zgartirilmaydigan to'plamlar 721
16.15 Referatni amalga oshirish 722
16.16 Yakunlash 722
17 Java SE 8 Lambdalar va oqimlar 729
17.1 Kirish 730
17.2 Funktsional dasturlash texnologiyalari haqida umumiy ma’lumot 731
17.2.1 Funktsional interfeyslar 732
17.2.2 Lambda ifodalari 733
17.2.3 Oqimlar 734
17.3 IntStream operatsiyalari 736
17.3.1 IntStream yaratish va uning qiymatlarini
Har bir terminal operatsiyasi uchun 738
17.3.2 Terminal operatsiyalari soni, min, maksimal, yig'indisi va o'rtacha 739
17.3.3 Terminalning ishlashini qisqartirish 739
17.3.4 Oraliq operatsiyalar: IntStream qiymatlarini filtrlash va saralash 741
17.3.5 Oraliq operatsiya: 742 xaritalash
17.3.6 IntStream Methods diapazoni bilan ints oqimlarini yaratish va
743 oralig'i yopiq
17.4 Stream manipulyatsiyalari 743
17.4.1 Stream 744 yaratish
17.4.2 Oqimni saralash va natijalarni yig'ish 745
17.4.3 Oqimni filtrlash va natijalarni keyinroq foydalanish uchun saqlash 745
17.4.4 Oqimni filtrlash va saralash va natijalarni yig'ish 745
17.4.5 Oldindan yig'ilgan natijalarni saralash 745
17.5 Stream manipulyatsiyalari 746
17.5.1 Usul havolasi yordamida satrlarni bosh harfga solish 747
17.5.2 Satrlarni filtrlash, keyin ularni katta-kichik harflar bilan tartiblash
O'sish tartibi 748
17.5.3 Satrlarni filtrlash, keyin ularni katta-kichik harflar bilan tartiblash
Kamayish tartibi 748
17.6 Stream manipulyatsiyalari 748
17.6.1 Ro'yxatni yaratish va ko'rsatish 750

xvi Tarkib

17.6.2 Belgilangan diapazondagi ish haqi bilan xodimlarni filtrlash 751
17.6.3 Xodimlarni bir nechta maydonlar bo'yicha saralash 752
17.6.4 Xodimlarni noyob familiya satrlariga joylashtirish 754
17.6.5 Xodimlarni 755-bo'lim bo'yicha guruhlash
17.6.6 Har bir bo'limdagi xodimlar sonini hisoblash 756
17.6.7 Xodimlarning ish haqini yig'ish va o'rtacha hisoblash 756
17.7 758-fayldan Stream yaratish
17.8 Tasodifiy qiymatlar oqimlarini yaratish 761
17.9 Lambda hodisalari ishlov beruvchilari 763
17.10 Java SE 8 interfeyslari bo'yicha qo'shimcha eslatmalar 763
17.11 Java SE 8 va Funktsional dasturlash manbalari 764
17.12 Yakunlash 764
18 Rekursiya 776
18.1 Kirish 777
18.2 Rekursiya tushunchalari 778
18.3 Rekursiyadan foydalanishga misol: faktoriallar 779
18.4 BigInteger 781 klassi yordamida Class Factorial Calculatorni qayta tiklash
18.5 Rekursiyadan foydalanishga misol: Fibonachchi seriyasi 783
18.6 Rekursiya va 786-chaqiruv usuli
18.7 Rekursiya va takrorlash 787
18.8 Xanoy minoralari 789
18.9 Fraktallar 791
18.9.1 Koch egri fraktal 791
18.9.2 (ixtiyoriy) Case Study: Lo Feather Fractal 792
18.10 Rekursiv orqaga qaytish 801
18.11 Yakunlash 802
19 Qidiruv, saralash va Katta O 810
19.1 Kirish 811
19.2 Chiziqli qidiruv 812
19.3 Big O notation 814
19.3.1 O(1) algoritmlari 814
19.3.2 O(n) algoritmlari 815
19.3.3 O(n2) algoritmlari 815
19.3.4 Chiziqli qidiruv 816 ning katta O
19.4 Ikkilik qidiruv 816
19.4.1 Ikkilik qidiruvni amalga oshirish 817
19.4.2 Ikkilik qidiruv 820 samaradorligi
19.5 Saralash algoritmlari 820
19.6 Tanlash tartibi 821
19.6.1 Tanlash tartibini amalga oshirish 821
19.6.2 Tanlashning samaradorligi 824
19.7 Qo'shish tartibi 824

Tarkib xvii

19.7.1 Qo'shishni saralashni amalga oshirish 825
19.7.2 Qo'shish tartibining samaradorligi 827
19.8 827 ni birlashtirish
19.8.1 Birlashtirish tartibini amalga oshirish 828
19.8.2 832-sonli birlashtirishning samaradorligi
19.9 Ushbu bobning Qidiruv va saralash algoritmlari uchun katta xulosa 833
19.10 Yakunlovchi 834
20 Umumiy sinflar va usullar 839
20.1 Kirish 840
20.2 Umumiy usullar uchun motivatsiya 840
20.3 Umumiy usullar: Amalga oshirish va kompilyatsiya vaqti tarjimasi 842
20.4 Kompilyatsiya vaqtidagi qo'shimcha tarjima muammolari: a
Qaytish turi 845 sifatida parametrni kiriting
20.5 Umumiy usullarni ortiqcha yuklash 848
20.6 Umumiy sinflar 849
20.7 Xom turlari 856
20.8 Tur parametrlarini qabul qiluvchi usullardagi joker belgilar 860
20.9 Yakunlash 864
21 Maxsus umumiy ma’lumotlar tuzilmalari 869
21.1 Kirish 870
21.2 O'z-o'zidan ma'lumot olish sinflari 871
21.3 Dinamik xotirani taqsimlash 871
21.4 Bog'langan ro'yxatlar 872
21.4.1 Yagona bog'langan ro'yxatlar 872
21.4.2 Umumiy ro'yxat 873 sinfini amalga oshirish
21.4.3 Umumiy sinflar ListNode va List 878
21.4.4 Sinflar ro'yxati testi 878
21.4.5 InsertAtFront 878 ro'yxat usuli
21.4.6 InsertAtBack 879 ro'yxat usuli
21.4.7 List Method removeFromFront 880
21.4.8 Ro'yxat usuli removeFromBack 881
21.4.9 Ro'yxat usuli chop etish 882
21.4.10 O'z paketlaringizni yaratish 882
21.5 Stak 886
21.6 Navbatlar 890
21.7 Daraxtlar 893
21.8 Yakunlash 900
22 GUI komponentlari: 2-qism 911
22.1 Kirish 912
22.2 JSlider 912

xviii Tarkib

22.3 Java 916 da Windowsni tushunish
22.4 Menyularni ramkalar bilan ishlatish 917
22.5 JPopupMenu 925
22.6 Pluggable Look-and-Feel 928
22.7 JDesktopPane va JInternalFrame 933
22.8 JTabbedPane 936
22.9 BoxLayout Layout Manager 938
22.10 GridBagLayout Layout Manager 942
22.11 Yakunlash 952

23 Parametrlilik 957


23.1 Kirish 958
23.2 Mavzu holatlari va hayot aylanishi 960
23.2.1 Yangi va ishga tushiriladigan holatlar 961
23.2.2 Kutish holati 961
23.2.3 Vaqtli kutish holati 961
23.2.4 Bloklangan holat 961
23.2.5 Tugatilgan davlat 961
23.2.6 Ishlaydigan holatning operatsion tizim ko'rinishi 962
23.2.7 Mavzu ustuvorliklari va mavzuni rejalashtirish 962
23.2.8 Noma'lum kechiktirish va boshi berk ko'cha 963
23.3 Executor Framework 963 yordamida mavzularni yaratish va bajarish
23.4 Mavzuni sinxronlashtirish 967
23.4.1 O'zgarmas ma'lumotlar 968
23.4.2 Monitorlar 968
23.4.3 Sinxronlanmagan o'zgaruvchan ma'lumotlarni almashish 969
23.4.4 Sinxronlashtirilgan o'zgaruvchan ma'lumotlarni almashish - operatsiyalarni bajarish Atomic 974
23.5 Sinxronizatsiyasiz ishlab chiqaruvchi/iste'molchi munosabatlari 976
23.6 Ishlab chiqaruvchi/iste'molchi munosabatlari: ArrayBlockingQueue 984
23.7 (Kengaytirilgan) ishlab chiqaruvchi/iste'molchi bilan sinxronlashtirilgan aloqa,
kuting, xabardor qiling va All 987 ga xabar bering
23.8 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi munosabatlari: Cheklangan buferlar 994
23.9 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi munosabatlari: Qulf va
Shartli interfeyslar 1002
23.10 Bir vaqtning o'zida to'plamlar 1009
23.11 GUI bilan multithreading: SwingWorker 1011
23.11.1 Ishchi ipda hisob-kitoblarni bajarish:
Fibonachchi raqamlari 1012
23.11.2 Oraliq natijalarni qayta ishlash: Eratosthenes 1018 elak
23.12 Java SE 8 Date/Time API 1025 bilan vaqtlarni tartiblash va parallel tartiblash
23.13 Java SE 8: Ketma-ket va parallel oqimlar 1027
23.14 (Kengaytirilgan) Chaqiriladigan va kelajak 1030 interfeyslari
23.15 (Kengaytirilgan) Fork/Join Framework 1034
23.16 Yakunlash 1034

www.allitebooks.com


Tarkib xix


24 JDBC 1045 yordamida maʼlumotlar bazalariga kirish
24.1 Kirish 1046
24.2 Relyatsion ma'lumotlar bazalari 1047
24.3 A kitoblar ma'lumotlar bazasi 1048
24.4 SQL 1052
24.4.1 Asosiy TANLASH so'rovi 1052
24.4.2 QAYERDA 1053-modda
24.4.3 1055-modda BO'YICHA BUYURT
24.4.4 Bir nechta jadvallardan ma'lumotlarni birlashtirish: INNER JOIN 1056
24.4.5 INSERT bayonoti 1058
24.4.6 YANGILANISH 1059 bayonnomasi
24.4.7 1060 bayonnomani o'chirish
24.5 Java 1060 ma'lumotlar bazasini sozlash
24.5.1 Windows 1061 da bo'lim ma'lumotlar bazalarini yaratish
24.5.2 Mac OS X 1062 da bo'lim ma'lumotlar bazalarini yaratish
24.5.3 Linux 1063 da bo'lim ma'lumotlar bazalarini yaratish
24.6 JDBC 1063 yordamida ma'lumotlar bazalarini manipulyatsiya qilish
24.6.1 1063 ma'lumotlar bazasiga ulanish va so'rov o'tkazish
24.6.2 Kitoblar ma'lumotlar bazasi 1067 so'rovi
24.7 RowSet interfeysi 1080
24.8 Tayyorlangan bayonotlar 1082
24.9 Saqlangan protseduralar 1098
24.10 Transaksiyani qayta ishlash 1098
24.11 Yakunlash 1099
25 JavaFX GUI: 1-qism 1107
25.1 Kirish 1108
25.2 JavaFX Scene Builder va NetBeans IDE 1109
25.3 JavaFX ilova oynasi tuzilishi 1110
25.4 Xush kelibsiz ilovasi — matn va tasvirni ko‘rsatish 1111
25.4.1 Ilova loyihasini yaratish 1111
25.4.2 NetBeans loyihalar oynasi — loyiha tarkibini ko‘rish 1113
25.4.3 1114 loyihasiga rasm qo'shish
25.4.4 NetBeans 1114 dan JavaFX Scene Builder dasturini ochish
25.4.5 VBox Layout Container 1115 ga o‘tish
25.4.6 VBox Layout Container 1116 ni sozlash
25.4.7 Yorliq qo'shish va sozlash 1116
25.4.8 ImageView 1116 qo‘shish va sozlash
25.4.9 Xush kelibsiz ilovasini ishga tushirish 1117
25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1118
25.5.1 Maslahat kalkulyatori ilovasini sinovdan o'tkazish 1119
25.5.2 Texnologiyalar haqida umumiy ma'lumot 1119
25.5.3 Ilovaning GUI 1122 ni yaratish
25.5.4 MaslahatKalkulyator 1126-sinf
25.5.5 TipCalculatorController klassi 1128

xx Tarkib

25.6 Onlayn JavaFX 1133 boblarida yoritilgan xususiyatlar
25.7 Yakunlash 1134
Internetdagi bo'limlar 1141
Operator ustunligi jadvali 1143
B ASCII belgilar to'plami 1145
C Kalit so'zlar va zahiradagi so'zlar 1146
D ibtidoiy tiplar 1147
E 1148 nosozliklarni tuzatuvchidan foydalanish
E.1 Kirish 1149
E.2 To'xtash nuqtalari va ishga tushirish, to'xtatish, davom ettirish va chop etish buyruqlari 1149
E.3 Chop etish va o'rnatish buyruqlar 1153
E.4 Bajarilishini nazorat qilish 1155-bosqich, qadam va keyingi buyruqlardan foydalanish
E.5 Soat buyrug'i 1158
E.6 Aniq buyruq 1160
E.7 Xulosa 1162
Internetdagi ilovalar 1165
Indeks 1167
Onlayn bo'limlar va ilovalar
26–34-boblar va F–N qoʻshimchalari PDF-hujjatlari boʻlib, kitobda onlayn joylashtirilgan
Companion veb-sayti (www.pearsonhighered.com/deitel/ manzilida joylashgan). Ichkariga qarang
Companion veb-saytiga kirish haqida ma'lumot olish uchun old muqova.
26 JavaFX GUI: 2-qism
27 JavaFX Grafika va Multimedia
28 Tarmoq
29 Java Persistence API (JPA)
30 JavaServer™ Faces veb-ilovalari: 1-qism

Tarkib xxi

31 JavaServer™ Faces veb-ilovalari: 2-qism
32 REST-ga asoslangan veb-xizmatlar
33 (ixtiyoriy) ATM misoli, 1-qism:
UML bilan ob'ektga yo'naltirilgan dizayn
34 (ixtiyoriy) ATM misoli, 2-qism:
Ob'ektga yo'naltirilgan dizaynni amalga oshirish
F Java API hujjatlaridan foydalanish
G Javadoc yordamida hujjat yaratish
H Unicode®
Men chiqishni formatladim
J raqamlar tizimlari
K bit manipulyatsiyasi
L Belgilangan tanaffus va davom bayonotlari
M UML 2: Qo'shimcha diagramma turlari
N dizayn naqshlari

Ushbu sahifa ataylab bo'sh qoldirilgan


Men Java-ni 1995-yilda 1.0 versiyasi chiqarilishidan oldin ham sevib qolganman va keyin ham shunday bo'lgan.


Java dasturchisi, muallifi, ma'ruzachisi, o'qituvchisi va Oracle Java texnologiyasi elchisi bo'lgan.
Ushbu sayohatda Pol Deytelni hamkasbim deb atash va ko'pincha uni qo'llab-quvvatlash men uchun sharaf bo'ldi.
yoshi va Java dasturlash kitobini tavsiya eting. Ushbu kitobning ko'plab nashrlarida mavjud
Men va boshqalar ishlab chiqqan kollej va professional kurslar uchun ajoyib matn ekanligi isbotlangan.
Java dasturlash tilini o'rgatishga kirishdi.
Ushbu kitobni ajoyib manbaga aylantiradigan fazilatlardan biri bu uning chuqur va tushunarliligi
Java kontseptsiyalari, jumladan, yaqinda Java SE 8 da kiritilgan tushunchalarni qamrab olish. Yana bir foydali
sifat - bu dasturiy ta'minotni samarali ishlab chiqish uchun zarur bo'lgan tushunchalar va amaliyotlarni davolashdir.
Ushbu kitobning uzoq vaqtdan beri ishqibozi sifatida men ushbu o'ninchining ba'zi xususiyatlarini ta'kidlamoqchiman
Men eng hayajonlangan nashr:
• Java lambda ifodalari va oqimlari bo'yicha yangi ambitsiyali bob. Ushbu bob
Java lambda-ni joriy qilib, funktsional dasturlash bo'yicha primer bilan boshlanadi.
bosishlar va funktsional dasturlash vazifalarini bajarish uchun oqimlardan qanday foydalanish
to'plamlar.
• Garchi kitobning birinchi nashridan beri parallellik muhokama qilingan bo'lsa-da, shunday
ko'p yadroli arxitekturalar tufayli tobora muhim ahamiyat kasb etmoqda. Sobiq vaqt bor
Java SE 8 da joriy qilingan yangi Date/Time API sinflaridan foydalangan holda ko'plab
ko'p yadroli ish faoliyatini yaxshilashni ko'rsatadigan parallellik bobi
bir yadroli ustida.
• JavaFX Java-ning GUI/grafika/multimedia texnologiyasi oldinga siljiydi, shuning uchun ham shunday
Deitel jonli kodli pedagogikada JavaFXning uch bobdan iborat muolajasini ko'rish yoqimli
uslub. Ushbu boblardan biri bosma kitobda, qolgan ikkitasi esa onlayn.
Iltimos, Pol va Xarvi Deytelni yutuqning so'nggi nashri bilan tabriklashda menga qo'shiling.
kompyuter fanlari talabalari va dasturiy ta'minot ishlab chiqaruvchilari uchun foydali manba!

Jeyms L. Uiver


Java texnologiyasi elchisi
Oracle korporatsiyasi

Muqaddima


Ushbu sahifa ataylab bo'sh qoldirilgan


"Tilning asosiy xususiyati aniqlikdir ..."


- Galen
Java dasturlash tili va Java qanday dasturlash kerak, O'ninchi nashrga xush kelibsiz! Bu
kitob talabalar, o'qituvchilar va dasturiy ta'minot uchun ilg'or hisoblash texnologiyalarini taqdim etadi
ishlab chiquvchilar. Bu kirish akademik va professional kurslar ketma-ketligiga mos keladi
ACM va IEEE o'quv rejasi tavsiyalari asosida va AP Com-
puter fan imtihoniga tayyorgarlik. Agar buni hali qilmagan bo'lsangiz, iltimos, orqa muqovani o'qing
va orqa muqovaning ichki qismi - bular kitobning mohiyatini qisqacha aks ettiradi. Ushbu Muqaddimada biz
batafsilroq ma'lumot bering.
Biz dasturiy ta'minot muhandisligining eng yaxshi amaliyotlariga e'tibor qaratamiz. Kitobning markazida Deitel joylashgan
imzo "jonli kodli yondashuv" - kod parchalarini ishlatish o'rniga, biz tushunchalarni taqdim etamiz
Windows®, OS X® ning so'nggi versiyalarida ishlaydigan to'liq ishlaydigan dasturlar konteksti
va Linux®. Har bir to'liq kod misoli jonli namuna ijrosi bilan birga keladi.
Mualliflar bilan aloqada bo'lish
Kitobni o'qiyotganingizda, savollaringiz bo'lsa, bizga elektron pochta orqali yuboring

va biz darhol javob beramiz. Ushbu kitob haqidagi yangilanishlar uchun tashrif buyuring

Deitel® Buzz Online axborot byulleteniga obuna bo'ling

va Deitel ijtimoiy tarmoq hamjamiyatlariga qo'shiling


• Facebook® (http://www.deitel.com/deitelfan)
• Twitter® (@deitel)
• Google+™ (http://google.com/+DeitelFan)
• YouTube® (http://youtube.com/DeitelTV)
• LinkedIn® (http://linkedin.com/company/deitel-&-associates)
Manba kodi va video eslatmalar
Barcha manba kodi quyidagi manzilda mavjud:

va kitobning Companion veb-saytida (shuningdek, keng ko'lamli VideoNotes mavjud):

deitel@deitel.com

http://www.deitel.com/books/jhtp10

http://www.deitel.com/newsletter/subscribe.html

http://www.deitel.com/books/jhtp10

http://www.pearsonhighered.com/deitel

Muqaddima


xxvi Muqaddima

Modulli tashkilot 1
Java How to Program, 10/e, turli darajadagi dasturlash kurslari uchun mos keladi
xususan CS 1 va CS 2 kurslari va tegishli fanlar bo'yicha kirish kurslari ketma-ketligi.
Kitobning modulli tashkiloti o'qituvchilarga o'z dasturlarini rejalashtirishda yordam beradi:
Kirish
• 1-bob, Kompyuterlar, Internet va Java-ga kirish
• 2-bob, Java ilovalariga kirish; Kirish/chiqish va operatorlar
• 3-bob, Sinflar, ob'ektlar, usullar va satrlarga kirish
Qo'shimcha dasturlash asoslari
• 4-bob, Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar
• 5-bob, Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar
• 6-bob, Usullar: Chuqurroq qarash
• 7-bob, Massivlar va massivlar roʻyxati
• 14-bob, Satrlar, belgilar va muntazam ifodalar
• 15-bob, Fayllar, oqimlar va obyektlarni ketma-ketlashtirish
Ob'ektga yo'naltirilgan dasturlash va ob'ektga yo'naltirilgan dizayn
• 8-bob, Sinflar va ob'ektlar: chuqurroq qarash
• 9-bob, Obyektga yo‘naltirilgan dasturlash: Meros
• 10-bob, Obyektga yo‘naltirilgan dasturlash: Polimorfizm va interfeyslar
• 11-bob, istisnolardan foydalanish: chuqurroq qarash
• (Onlayn) 33-bob, ATM misoli, 1-qism: Obyektga yo‘naltirilgan dizayn
UML
• (Onlayn) 34-bob, ATM misoli 2-qism: Ob'ektga yo'naltirilganlikni amalga oshirish
ed Design
Swing Grafik foydalanuvchi interfeysi va Java 2D Grafikasi
• 12-bob, GUI komponentlari: 1-qism
• 13-bob, Grafika va Java 2D
• 22-bob, GUI komponentlari: 2-qism
Ma'lumotlar tuzilmalari, to'plamlar, lambdalar va oqimlar
• 16-bob, Umumiy to'plamlar
• 17-bob, Java SE 8 lambdalari va oqimlari
• 18-bob, Rekursiya
• 19-bob, Qidiruv, Saralash va Katta O
• 20-bob, Umumiy sinflar va usullar
• 21-bob, Shaxsiy umumiy ma'lumotlar tuzilmalari

1. Onlayn bo'limlar kitobning 2014 yil kuzgi darslari uchun Companion veb-saytida mavjud bo'ladi.


Yangi va yangilangan xususiyatlar xxvii

Bir vaqtning o'zida; Tarmoqqa ulanish
• 23-bob, parallellik
• (Onlayn) 28-bob, Tarmoq
JavaFX Grafik foydalanuvchi interfeyslari, Grafika va Multimedia
• 25-bob, JavaFX GUI: 1-qism
• (Onlayn) 26-bob, JavaFX GUI: 2-qism
• (Onlayn) 27-bob, JavaFX Grafika va Multimedia
Ma'lumotlar bazasiga asoslangan ish stoli va veb-ishlab chiqish
• 24-bob, JDBC yordamida ma'lumotlar bazalariga kirish
• (Onlayn) 29-bob, Java Persistence API (JPA)
• (Onlayn) 30-bob, JavaServer™ Faces veb-ilovalari: 1-qism
• (Onlayn) 31-bob, JavaServer™ Faces veb-ilovalari: 2-qism
• (Onlayn) 32-bob, REST-ga asoslangan veb-xizmatlar
Yangi va yangilangan xususiyatlar
Mana biz Java dasturlash dasturi, 10/e uchun qilgan yangilanishlarimiz:
Java standart nashri: Java SE 7 va yangi Java SE 8
• Java SE 7 yoki Java SE 8 bilan foydalanish oson. Auditoriyamiz ehtiyojlarini qondirish uchun biz
kitobni kollej va professional kurslar uchun Java SE 7, Java SE asosida ishlab chiqdi
8 yoki ikkalasining aralashmasi. Java SE 8 funksiyalari ixtiyoriy, oson bajariladigan
bo'limlarni kiritish yoki o'chirish. Yangi Java SE 8 imkoniyatlari keskin yaxshilanishi mumkin
dasturlash jarayoni. 1-rasmda biz qamrab oladigan ba'zi yangi Java SE 8 xususiyatlari keltirilgan.

Java SE 8 xususiyatlari

Lambda ifodalari
Xulosa turini yaxshilash
@FunctionalInterface izohi
Parallel massivlarni saralash
Java Collections uchun ommaviy ma'lumotlar operatsiyalari - filtrlash, xaritalash va kamaytirish
Lambdalarni qo'llab-quvvatlash uchun kutubxona yaxshilanishlari (masalan, java.util.stream, java.util.function)
Sana va vaqt API (java.time)
Java concurrency API takomillashtirish
interfeyslarda statik va standart usullar
Funktsional interfeyslar - faqat bitta mavhum usulni belgilaydigan va o'z ichiga olishi mumkin bo'lgan interfeyslar
statik va standart usullar
JavaFX yaxshilanishlari

1-rasm | Ba'zi yangi Java SE 8 xususiyatlari.


xxviii Muqaddima

• Standart va statik usullarga ega Java SE 8 lambdalari, oqimlari va interfeyslari. The
JavaSE 8-dagi eng muhim yangi xususiyatlar lambdalar va qo'shimcha texnologiyalardir.
Biz ularni ixtiyoriy 17-bobda va ixtiyoriy bo'limlarda batafsil yoritamiz
keyingi boblarda "Java SE 8" deb belgilangan. 17-bobda siz ushbu funktsiyani ko'rasiz
lambdalar va oqimlar bilan dasturlash dasturlarni tezroq yozishga yordam beradi
qisqacha, soddaroq qilib aytganda, kamroq xatolarga ega va ularni parallellashtirish osonroq
ko'p yadroli tizimlarda ishlashni yaxshilash) oldingi versiyalarda yozilgan dasturlarga qaraganda.
texnikalar. Funktsional dasturlash ob'ektni to'ldirishini ko'rasiz.
yo'naltirilgan dasturlash. 17-bobni o'qib chiqqaningizdan so'ng, siz aqlli ravishda qayta tiklashingiz mumkin.
Kitob davomida Java SE 7 ning ko'plab misollarini to'ldiring (2-rasm).

• Java SE 7 ning manbalarni sinab ko'rish bayonoti va AutoClosable Interface. Avto-


Yopiladigan ob'ektlar ulardan foydalanganda resurslarning sizib chiqishi ehtimolini kamaytiradi
AutoClosable-ni avtomatik ravishda yopadigan manbalarni sinab ko'rish bayonoti
ob'ektlar. Ushbu nashrda biz resurslar bilan sinab ko'rish va AutoClosable obyektlaridan foydalanamiz
tegishli 15-bob, Fayllar, oqimlar va ob'ektlarni ketma-ketlashtirish.
• Java xavfsizligi. Biz kitobimizni CERT Oracle Secure Coding-ga qarshi tekshirdik
Kirish darsligi uchun Java uchun standart.

Qo'shimcha ma'lumot olish uchun ushbu kirish so'zining Xavfsiz Java dasturlash bo'limiga qarang


CERT haqida.

Pre-Java-SE-8 mavzulari Tegishli Java SE 8 muhokamalari va misollar

7-bob, massivlar va massivlar roʻyxati 17.3–17.4 boʻlimlari asosiy lambda va oqimlarni taqdim etadi
bir o'lchovli massivlarni qayta ishlovchi imkoniyatlar.
10-bob, ob'ektga yo'naltirilgan
grammatika: Polimorfizm va
Interfeyslar

10.10-bo'lim yangi Java SE 8 interfeysini taqdim etadi


xususiyatlar (standart usullar, statik usullar va
funktsiyani qo'llab-quvvatlaydigan funktsional interfeyslar tushunchasi)
lambdalar va oqimlar bilan milliy dasturlash.

12 va 22-boblar, GUI Compo-


ents: mos ravishda 1 va 2-qism

17.9-bo'limda amalga oshirish uchun lambda qanday ishlatilishi ko'rsatilgan


Swing hodisalarini tinglovchi funktsional interfeysi.

14-bob, Satrlar, belgilar


va Muntazam ifodalar

17.5-bo'lim lambdalar va oqimlardan qanday foydalanishni ko'rsatadi


String ob'ektlarining to'plamlarini qayta ishlash.

15-bob, Fayllar, oqimlar va


Ob'ektni ketma-ketlashtirish

17.7-bo'lim lambdalar va oqimlardan qanday foydalanishni ko'rsatadi


fayldan matn satrlarini qayta ishlash.
23-bob, Parallellik funktsional dasturlarni parallellashtirish osonroq ekanligini ko'rsatadi
ular ko'p yadroli arxitekturadan foydalanishlari mumkin
samaradorlikni oshirish uchun. Parallel oqimni ko'rsatadi
qayta ishlash. Massivlar usuli parallelSort ekanligini ko'rsatadi
qachon ko'p yadroli arxitekturada ish faoliyatini yaxshilaydi
katta massivlarni saralash.
25-bob, JavaFX GUI: 1-qism 25.5.5 bo'limida lambdadan qanday foydalanish kerakligi ko'rsatilgan.
JavaFX hodisalarni tinglovchi funktsional interfeysi.

2-rasm | Java SE 8 lambdalari va oqimlari bo'yicha munozaralar va misollar.

http://bit.ly/CERTOracleSecureJava

www.allitebooks.com


Yangi va yangilangan xususiyatlar xxix

• Java NIO API. Biz foydalanish uchun 15-bobdagi fayllarni qayta ishlash misollarini yangiladik
Java NIO (yangi IO) API xususiyatlari.
• Java hujjatlari. Kitob davomida biz Java hujjatlariga havolalar beramiz -
Biz taqdim etayotgan turli mavzular haqida ko'proq ma'lumot olishingiz mumkin bo'lgan tation. Java uchun
SE 7 hujjatlari, havolalar bilan boshlanadi

va Java SE 8 hujjatlari uchun havolalar bilan boshlanadi

Oracle Java SE 8-ni chiqarganida, bu havolalar o'zgarishi mumkin - ehtimol havolalar boshlanadi -
bilan ning

Nashr qilinganidan keyin o'zgargan havolalar uchun biz yangilanishlarni quyidagi manzilga joylashtiramiz

Swing va JavaFX GUI, Grafika va Multimedia
• Swing GUI va Java 2D grafiklari. Java Swing GUI ixtiyoriy ravishda muhokama qilinadi
3–10-boblar va 12 va 22-boblardagi GUI va grafik boʻlimlari. Swing
hozir texnik xizmat ko'rsatish rejimida - Oracle ishlab chiqishni to'xtatdi va taqdim etadi
faqat xatolar tuzatiladi, ammo u Java-ning bir qismi bo'lib qoladi va hali ham keng tarqalgan
ishlatilgan. 13-bobda Java 2D grafiklari muhokama qilinadi.
• JavaFX GUI, grafik va multimedia. Java-ning GUI, grafik va multimedia
API oldinga JavaFX hisoblanadi. 25-bobda biz JavaFX 2.2 dan foydalanamiz (nashr qilingan
2012) Java SE 7 bilan. Bizning onlayn bo'limlarimiz 26 va 27 — kitobda joylashgan
hamroh veb-sayti (ushbu kitobning ichki muqovasiga qarang) - qo'shimchani taqdim eting
JavaFX GUI xususiyatlari va JavaFX grafikalari va multimediyalarini joriy qiladi.
Java FX 8 va Java SE 8 matnlari. 25–27-boblarda biz Scene Builder-dan foydalanamiz.
Tez va qulay JavaFX grafik interfeyslarini yaratish uchun sudrab tashlash vositasi. Bu
alohida yoki har qanday Java IDE bilan foydalanishingiz mumkin bo'lgan mustaqil vosita.
• Scalable GUI va grafik taqdimoti. Kirish kurslarini o'rgatadigan o'qituvchilar
GUI, grafik va multimediyani qamrab oladigan keng tanlovga ega bo'ling—
hech kimdan, dastlabki boblardagi ixtiyoriy kirish bo'limlariga, chuqurga
12, 13 va 22-boblarda Swing GUI va Java 2D grafiklarini ko'rib chiqish va
25-bobda va onlaynda JavaFX GUI, grafik va multimediyaga chuqur ishlov berish
26–27-boblar.
Bir vaqtning o'zida
• Optimal ko'p yadroli ishlash uchun parallellik. Ushbu nashrda biz imtiyozli edik.
Brayan Goetz, Java Concurrency in Practice kitobining hammuallifi sifatida sharhlovchi sifatida ishtirok etishi mumkin.
(Addison-Uesli). Biz 23-bobni Java SE 8 texnologiyasi va idioma bilan yangiladik.
Biz Java SE 8 Date/Time API ishlatadigan parallelSort va boshqalarni saralash misolini qo‘shdik
har bir operatsiyani vaqtini belgilash va parallelSortning a da yaxshiroq ishlashini namoyish qilish
ko'p yadroli tizim. Biz Java SE 8 parallel va ketma-ket oqimlarni qayta ishlashni o'z ichiga olamiz
Misol uchun, ishlash yaxshilanishini ko'rsatish uchun yana Sana/Vaqt API-dan foydalaning. Fi-

http://docs.oracle.com/javase/7/

http://download.java.net/jdk8/

http://docs.oracle.com/javase/8/

http://www.deitel.com/books/jhtp10

xxx Muqaddima



Umuman olganda, biz Java SE 8 CompletableFuture misolini qo'shdik.
uzoq muddatli hisob-kitoblarning miqdoriy va parallel bajarilishi.
• SwingWorker sinfi. Biz ko'p tarmoqli foydalanuvchi interfeysini yaratish uchun SwingWorker sinfidan foydalanamiz.
yuzlar. Onlayn 26-bobda biz JavaFX parallellikni qanday boshqarishini ko'rsatamiz.
• Birgalikda ishlash qiyin. Bir vaqtning o'zida dasturlarni dasturlash qiyin va
xatoga moyil. Bir vaqtning o'zida juda ko'p turli xil xususiyatlar mavjud. Biz bo'lganlarni ta'kidlaymiz
ko'pchilik foydalanishi va mutaxassislarga qoldirilishi kerak bo'lgan narsalarni eslatib o'tishi kerak.
Pul mablag'larini to'g'ri olish
• Pul summalari. Dastlabki boblarda qulaylik uchun double to turidan foydalanamiz
pul summalarini ifodalaydi. Noto'g'ri pul hisob-kitoblari ehtimoli tufayli
double turiga ega bo'lgan BigDecimal klassi (bu biroz murakkabroq) bo'lishi kerak
pul summalarini ifodalash uchun ishlatiladi. Biz BigDecimalni 8-bobda namoyish qilamiz
va 25.
Ob'ekt texnologiyasi
• Ob'ektga yo'naltirilgan dasturlash va dizayn. Biz ob'ektlarning dastlabki yondashuvidan foydalanamiz,
1-bobda ob'ekt texnologiyasining asosiy tushunchalari va terminologiyasi bilan tanishtirish.
Talabalar o'zlarining birinchi moslashtirilgan sinflari va ob'ektlarini 3-bobda ishlab chiqadilar.
Ob'ektlar va sinflarni erta aniqlash o'quvchilarni darhol "ob'ektlar haqida o'ylashga" majbur qiladi
va bu tushunchalarni chuqurroq o'zlashtirish. [Kechikishni talab qiladigan kurslar uchun-
ob'ektlarga yaqinlashganda, Java qanday dasturlash kerakligini ko'rib chiqing, 10/e, Late Objects Version.]
• Dastlabki ob'ektlar real dunyo misollari. Dastlabki sinflar va ob'ektlar taqdimoti
Hisob, Talaba, AutoPolicy, Vaqt, Xodim, Baho kitobi va Karta xususiyatlari
aralashtirish va hal qilish bo'yicha amaliy tadqiqotlar, asta-sekin chuqurroq OO tushunchalarini joriy etish.
• Meros, interfeyslar, polimorfizm va kompozitsiya. Biz bir qator real-
ushbu OO tushunchalarining har birini tasvirlash va vaziyatlarni tushuntirish uchun jahon amaliy tadqiqotlari
unda sanoat quvvatiga ega ilovalarni qurishda har biriga afzallik beriladi.
• Istisnolardan foydalanish. Biz kitobning boshida asosiy istisnolarni hal qilishni birlashtiramiz
11-bobda chuqurroq davolashni taqdim eting. Istisnolarni ko'rib chiqish muhim ahamiyatga ega
"Muhim vazifa" va "biznes uchun muhim" ilovalarni yaratish. Dasturchilar
bilan bog'liq bo'lishi kerak, "Men chaqirgan komponent qachon sodir bo'ladi
ishda qiyinchilik bormi? Ushbu komponent qanday qilib muammo borligini bildiradi?
lem?" Java komponentidan foydalanish uchun siz nafaqat ushbu komponentni bilishingiz kerak
"ishlar yaxshi ketayotganda" o'zini tutadi, lekin bu komponent qanday istisnolardan iborat
"Ishlar yomon ketayotganida" "tashlaydi".
• Sinf massivlari va ArrayList. 7-bob Massivlar sinfini o'z ichiga oladi - ular o'z ichiga oladi
umumiy massiv manipulyatsiyasini bajarish usullari va ArrayList sinfi
dinamik ravishda o'zgartiriladigan massivga o'xshash ma'lumotlar strukturasini amalga oshiradi. Bu quyidagicha
Bizning falsafamiz, qanday qilib o'rganish paytida mavjud darslardan foydalanib, ko'p mashq qilish
o'z sinflaringizni belgilash uchun. Bobdagi mashqlarning boy tanlovi kichik qismlarni o'z ichiga oladi.
yumshoq texnologiya yordamida shaxsiy kompyuteringizni yaratish bo'yicha doimiy loyiha.
buyumlar simulyatsiyasi. 21-bobda o'zingizni qurish bo'yicha keyingi loyiha mavjud
yuqori darajadagi til dasturlarini mashina tiliga kompilyatsiya qila oladigan kompilyator
kompyuter simulyatorida bajariladigan kod.

Yangi va yangilangan xususiyatlar xxxi



• Majburiy emas Onlayn Case Study: Ob'ektga yo'naltirilgan dizayn va Java-ni ishlab chiqish
Bankomatni amalga oshirish. Onlayn boblar 33–34 ixtiyoriy holatni o'z ichiga oladi
UML yordamida ob'ektga yo'naltirilgan dizaynni o'rganish (Unified Modeling Lan-
guage™) - ob'ektga yo'naltirilgan modellashtirish uchun sanoat standarti grafik tili
ed tizimlari. Biz oddiy avtomatlashtirilgan kassa uchun dasturiy ta'minotni ishlab chiqamiz va amalga oshiramiz
mashina (ATM). Biz talablarni belgilaydigan odatiy talablar hujjatini tahlil qilamiz
tuziladigan tizim. Biz ushbu tizimni amalga oshirish uchun zarur bo'lgan sinflarni aniqlaymiz,
sinflar ega bo'lishi kerak bo'lgan atributlar, sinflar ko'rsatishi kerak bo'lgan xatti-harakatlar
va tizimni qayta tiklash uchun sinflar bir-biri bilan qanday o'zaro ta'sir qilishi kerakligini aniqlang.
talablar. Dizayndan biz to'liq Java ilovasini ishlab chiqaramiz. Stu-
dents ko'pincha "lampochka lahzasi" borligi haqida xabar berishadi - vaziyatni o'rganish ularga "bog'lash" yordam beradi
Hammasi birgalikda" va ob'ekt yo'nalishini haqiqatan ham tushunadi.
Ma'lumotlar tuzilmalari va umumiy to'plamlar
• Ma'lumotlar tuzilmalari taqdimoti. Biz 7-bobdagi umumiy ArrayList sinfidan boshlaymiz.
Keyingi maʼlumotlar tuzilmalari boʻyicha muhokamalarimiz (16–21-boblar) chuqurroq muolajani taʼminlaydi
umumiy to'plamlar - Java API-ning o'rnatilgan to'plamlaridan qanday foydalanishni ko'rsatadi.
Biz daraxtga o'xshash ma'lumotlar tuzilmasini amalga oshirish uchun muhim bo'lgan rekursiyani muhokama qilamiz
sinflar. Biz manipulyatsiya uchun mashhur qidirish va saralash algoritmlarini muhokama qilamiz
to'plamlar mazmuni, va Big O uchun do'stona kirish taqdim - bir vosita
muammoni hal qilish uchun algoritm qanchalik qiyin bo'lishi mumkinligini tasvirlash. Biz keyin
umumiy usullar va sinflarni va maxsus umumiy ma'lumotlar tuzilmasini qanday amalga oshirishni ko'rsating.
(bu kompyuter fanlari yo'nalishlari uchun mo'ljallangan - ko'pchilik dasturchilar foydalanishi kerak
oldindan tuzilgan umumiy to'plamlar). Lambdalar va oqimlar (17-bobda keltirilgan)
ayniqsa, umumiy to'plamlar bilan ishlash uchun foydalidir.
Ma'lumotlar bazasi
• JDBC. 24-bob JDBC-ni qamrab oladi va Java DB ma'lumotlar bazasini boshqarish tizimidan foydalanadi.
tem. Ushbu bobda Strukturaviy so'rovlar tili (SQL) taqdim etiladi va xususiyatlari
OO ma'lumotlar bazasiga asoslangan manzillar kitobini ishlab chiqish bo'yicha amaliy tadqiqot
tayyorlangan bayonotlar.
• Java Persistence API. Yangi onlayn bo'lim 29 Java Persistence API-ni qamrab oladi
(JPA) - JDBC "ostida" foydalanadigan ob'ektni aloqador xaritalash (ORM) uchun standart
kaput." ORM vositalari ma'lumotlar bazasi sxemasini ko'rib chiqishi va sinflar to'plamini yaratishi mumkin.
JDBC va
SQL to'g'ridan-to'g'ri. Bu ma'lumotlar bazasi-ilovalarni ishlab chiqishni tezlashtiradi, xatolarni kamaytiradi va
ko'proq portativ kod ishlab chiqaradi.
Veb-ilovalarni ishlab chiqish
• Java server yuzlari (JSF). Onlayn boblar 30–31 joriy etish uchun yangilandi
eng yangi JavaServer Faces (JSF) texnologiyasi, bu JSF veb-saytini yaratishni osonlashtiradi.
asoslangan ilovalar. 30-bob veb-ilovani yaratish bo'yicha misollarni o'z ichiga oladi
GUI, tasdiqlash shakllari va seansni kuzatish. 31-bobda ma'lumotlarga asoslangan,
Ajax-ni qo'llab-quvvatlaydigan JSF ilovalari - bo'limda ma'lumotlar bazasiga asoslangan ko'p qatlam mavjud
foydalanuvchilarga kontaktlarni qo'shish va qidirish imkonini beruvchi veb-manzillar kitobi.
• Veb-xizmatlar. 32-bob endi REST-ni yaratish va iste'mol qilishga qaratilgan.
asoslangan veb-xizmatlar. Bugungi veb-xizmatlarning aksariyati endi REST-dan foydalanadi.

xxxii Muqaddima



Xavfsiz Java dasturlash
Viruslarning hujumlariga qarshi turadigan sanoat kuchli tizimlarni qurish qiyin,
qurtlar va "zararli dastur" ning boshqa shakllari. Bugungi kunda Internet orqali bunday hujumlar bir zumda bo'lishi mumkin.
keng qamrovli va global. Ishlab chiqarish boshidanoq dasturiy ta'minotga xavfsizlikni o'rnatish
rivojlanish tsikli zaifliklarni sezilarli darajada kamaytirishi mumkin. Biz turli xil xavfsiz Java-ni o'z ichiga olamiz
kodlash amaliyotlari (kirish darsligi uchun mos ravishda) bizning muhokamalarimizga va
kod misollari.
CERT® muvofiqlashtirish markazi (www.cert.org) tahlil qilish va tahlil qilish uchun yaratilgan
hujumlarga zudlik bilan javob berish. CERT - kompyuterning favqulodda vaziyatlarga javob berish guruhi - a
Karnegi Mellon universiteti dasturiy ta'minot bo'yicha davlat tomonidan moliyalashtiriladigan tashkilot
neering Institute™. CERT turli xil dasturlar uchun xavfsiz kodlash standartlarini nashr etadi va targ'ib qiladi
Dasturiy ta'minot ishlab chiquvchilarga sanoat dasturlarini amalga oshirishda yordam berish uchun mashhur dasturlash tillari
tizimlarni hujumga ochiq qoldiradigan dasturlash amaliyotlaridan qochadigan kuch tizimlari.
CERT kompaniyasining xavfsiz kodlash menejeri Robert C. Seacordga va o'z minnatdorchiligimizni bildirmoqchimiz
Karnegi Mellon universiteti kompyuter fanlari maktabining yordamchi professori. Janob dengiz -
cord bizning kitobimizning texnik sharhlovchisi bo'ldi, "Qanday dasturlash kerak", 7/e, u erda bizni sinchkovlik bilan ko'rib chiqdi.
Xavfsizlik nuqtai nazaridan C dasturlari CERT C Securega rioya qilishni tavsiya qiladi
Kodlash standarti. Bu tajriba bizning C++ tilidagi kodlash amaliyotimizga ta'sir qildi.
9/e va Java qanday dasturlash, 10/e ham.
Ixtiyoriy GUI va Grafik misollar
Talabalar GUI va grafik ilovalarni yaratishni yoqtiradilar. GUI bilan tanishtiradigan kurslar uchun
va grafika boshida biz yaratish uchun ixtiyoriy 10 segmentli kirishni birlashtirdik
grafik va Swing-ga asoslangan grafik foydalanuvchi interfeyslari (GUI). Ushbu amaliy tadqiqotning maqsadi
foydalanuvchi shaklni tanlashi mumkin bo'lgan oddiy polimorfik chizma dasturini yaratish
chizish, shaklning xarakteristikalarini (masalan, rangi) tanlang va chizish uchun sichqonchadan foydalaning
shakli. Keys tadqiqoti o'quvchi amalga oshirishi bilan asta-sekin ana shu maqsadga intiladi
10-bobda polimorfik chizma, 12-bobda hodisaga asoslangan GUI qo'shish va
Java 2D bilan 13-bobdagi chizish imkoniyatlarini oshirish.
• 3.6-bo'lim—Muloqot oynalaridan foydalanish
• 4.15-bo'lim — Oddiy chizmalarni yaratish
• 5.11-bo'lim — To'rtburchaklar va tasvirlar chizish
• 6.13-bo'lim — Ranglar va to'ldirilgan shakllar
• 7.17-bo'lim — Yoylarni chizish
• 8.16-bo'lim—Obyektlarni grafik bilan ishlatish
• 9.7-bo'lim — Yorliqlar yordamida matn va tasvirlarni ko'rsatish
• 10.11-bo'lim — Polimorfizm bilan chizish
• 12.17-mashq—Interfeysni kengaytirish
• 13.31-mashq — Java2D qo'shish
O'qitish yondashuvi
Java How to Program, 10/e, yuzlab to'liq ishlaydigan misollarni o'z ichiga oladi. Biz stress qilamiz
dastur ravshanligi va diqqatni yaxshi ishlab chiqilgan dasturiy ta'minotni yaratishga qaratish.

Ta'limga yondashuv xxxiii

Video eslatmalar. Companion veb-saytida hammuallif bo'lgan keng qamrovli VideoNotes mavjud
Pol Deitel kitobning asosiy boblaridagi dasturlarning aksariyatini batafsil tushuntirib beradi. Talabalarga yoqadi
Asosiy tushunchalarni mustahkamlash va qo'shimcha tushunchalar uchun VideoNotesni ko'rish.
Sintaksis rang berish. O'qish uchun biz barcha Java kodlarini sintaksis rangga kiritamiz, xuddi shunga o'xshash
Java integratsiyalashgan ishlab chiqish muhitlari va kod muharrirlari sintaksisi rang kodi. Bizning sin-
soliqni bo'yash konventsiyalari quyidagilardan iborat:

Kodni ajratib ko'rsatish. Biz asosiy kod segmentlari atrofida sariq to'rtburchaklar joylashtiramiz.


Ta'kidlash uchun shriftlardan foydalanish. Biz har biri uchun asosiy shartlarni va indeks sahifasiga havolani joylashtiramiz
osonroq murojaat qilish uchun qalin to'q rangli matnda hodisani aniqlash. Biz ekranda ta'kidlaymiz
qalin Helvetica shriftidagi komponentlar (masalan, Fayl menyusi) va Java dasturini ta'kidlang
Lucida shriftidagi matn (masalan, int x = 5;).
Internetga kirish. Barcha manba kodi misollarini quyidagi manzildan yuklab olish mumkin:

Maqsadlar. Ochilish tirnoqlaridan keyin bobning maqsadlari ro'yxati keltirilgan.


Rasmlar/rasmlar. Ko'p jadvallar, chizmalar, UML diagrammalar, dasturlar va pro-
gramm chiqishlari kiritilgan.
Dasturlash bo'yicha maslahatlar. Muhim jihatlarga e'tiboringizni qaratishga yordam beradigan dasturlash bo'yicha maslahatlarni o'z ichiga olamiz
dastur ishlab chiqish. Ushbu maslahatlar va amaliyotlar biz o'rgangan eng yaxshi narsalarni aks ettiradi
yetti o'n yillik dasturlash va o'qitish tajribasini birlashtirgan.

izohlar yashil rangda ko'rinadi


kalit so'zlar to'q ko'k rangda ko'rinadi
xatolar qizil rangda ko'rinadi
konstantalar va literal qiymatlar ochiq ko'k rangda ko'rinadi
qolgan barcha kodlar qora rangda ko'rinadi

http://www.deitel.com/books/jhtp10


http://www.pearsonhighered.com/deitel

Yaxshi dasturlash amaliyoti


Yaxshi dasturlash amaliyoti sizga yordam beradigan texnikalarga e'tibor beradi.
aniqroq, tushunarliroq va qo'llab-quvvatlanadigan dasturlar.
Umumiy dasturlash xatosi
Ushbu keng tarqalgan dasturlash xatolarini ko'rsatsangiz, yuzaga kelish ehtimoli kamayadi
ularni qiling.
Xatolarning oldini olish bo'yicha maslahat
Ushbu maslahatlar xatolarni aniqlash va ularni dasturlaringizdan olib tashlash bo'yicha takliflarni o'z ichiga oladi;
Ko'pchilik Java-ning birinchi navbatda xatolarning dasturlarga kirishiga to'sqinlik qiladigan jihatlarini tavsiflaydi.
Ishlash bo'yicha maslahat
Ushbu maslahatlar dasturlaringizni tezroq ishga tushirish yoki minimallashtirish imkoniyatlarini ta'kidlaydi
ular egallagan xotira miqdori.

Portativlik bo'yicha maslahat


Portativlik bo'yicha maslahatlar turli platformalarda ishlaydigan kod yozishga yordam beradi.

xxxiv Muqaddima

Xulosa o'qlari. Biz bobning bo'lim-bo'lim sarlavhasini taqdim etamiz. Uchun
mos yozuvlar qulayligi, biz har bir asosiy atamaning aniqlovchi hodisasining sahifa raqamini kiritamiz
matn.
O'z-o'zini tekshirish mashqlari va javoblar. Keng ko'lamli o'z-o'zini tekshirish mashqlari va javoblar o'z ichiga oladi:
o'z-o'zini o'rganish uchun ed. Ixtiyoriy bankomat misolidagi barcha mashqlar to'liq hal qilingan.
Mashqlar. Bo'lim mashqlari quyidagilarni o'z ichiga oladi:
• muhim atama va tushunchalarni oddiy esga olish
• Bu kodda nima xato?
• Bu kod nima qiladi?
• individual bayonotlar va usullar va sinflarning kichik qismlarini yozish
• to'liq usullar, sinflar va dasturlarni yozish
• yirik loyihalar
• ko'p boblarda, "Farq qilish" mashqlari, bu sizni bir-biridan foydalanishga undaydi.
muhim ijtimoiy muammolarni tadqiq qilish va hal qilish uchun puters va Internet.
Faqat SE 8 bo'lgan mashqlar shunday belgilanadi. Dasturlash loyihalarimizni ko'rib chiqing
Ko'plab qo'shimcha mashqlar va loyiha imkoniyatlari uchun resurs markazi (www.deitel.com/
Dasturlash loyihalari/).
Indeks. Biz keng ko'lamli indeksni qo'shdik. Asosiy atamalarning aniqlanishi yuqori
qalin to'q qizil rangli sahifa raqami bilan yoritilgan. Bosma kitoblar indeksida faqat shular qayd etilgan
bosma kitobda ishlatiladigan atamalar. Onlayn bo'limlar indeksi barcha bosma kitob atamalarini o'z ichiga oladi
va onlayn bo'lim shartlari.

Java-da ishlatiladigan dasturiy ta'minot, 10/e


Ushbu kitob uchun kerak bo'ladigan barcha dasturlar Internetdan bepul yuklab olish mumkin.
Har bir yuklab olish uchun havolalar uchun ushbu kirish so'zidan keyingi "Boshlashdan oldin" bo'limiga qarang.
Biz misollarning aksariyatini Java qanday dasturlash kerak, 10/e da bepul Java Stan-dan foydalangan holda yozdik.
Dard Edition Development Kit (JDK) 7. Ixtiyoriy Java SE 8 modullari uchun biz
OpenJDK ning JDK 8 ning erta kirish versiyasi. 25-bobda va bir nechta onlayn boblarda biz
Netbeans IDE-dan ham foydalangan. Ushbu so'zboshidan keyingi "Boshlashdan oldin" bo'limiga qarang
qo'shimcha ma'lumot. Siz bizning Java-da qo'shimcha manbalar va dasturlarni yuklab olishingiz mumkin
Resurs markazlari:

Dasturiy ta'minot muhandisligi kuzatuvi


Dasturiy ta'minot muhandisligi kuzatuvlari arxitektura va dizayn muammolarini ta'kidlaydi
dasturiy ta'minot tizimlarini, ayniqsa, yirik tizimlarni qurishga ta'sir qiladi.

Ko'rish va his qilish


Ko'rish va his qilish kuzatuvlari grafik-foydalanuvchi interfeysi qoidalarini ta'kidlaydi. Bular
kuzatishlar jozibador, foydalanuvchilarga qulay grafik interfeyslarni yaratishga yordam beradi.
sanoat normalariga muvofiq shakl.

www.deitel.com/ResourceCenters.html


O'qituvchi qo'shimchalari xxxv



O'qituvchi uchun qo'shimchalar
Quyidagi qo'shimchalar malakali o'qituvchilar uchun faqat Pearson orqali mavjud
Ta'lim o'qituvchilari resurs markazi (www.pearsonhighered.com/irc):
• Matndagi barcha kod va raqamlarni o'z ichiga olgan PowerPoint® slaydlari, shuningdek marker bilan
asosiy fikrlarni umumlashtiradigan narsalar.
• Test topshirig‘i ko‘p tanlovli savollar fayli (har bir kitobda taxminan ikkitadan)
tion).
• Yechimlar bo‘yicha qo‘llanma, bob oxiridagi amaliyotlarning aksariyat qismiga yechimlar.
cises. Uy vazifasi uchun mashq tayinlashdan oldin o'qituvchi buni tekshirishi kerak
IRC yechimni o'z ichiga olganligiga ishonch hosil qilish uchun.
Iltimos, Pearson Instructor's Resurs markaziga kirishni so'rab bizga yozmang
unda kitobning o'qituvchi qo'shimchalari, shu jumladan mashqlar yechimlari mavjud. Ac-
Bu kitobdan dars beradigan kollej o'qituvchilari bilan cheklangan. O'qituvchilar e'tibor berishlari mumkin
faqat Pearson vakillari orqali kirish huquqiga ega. Yechimlar taqdim etilmaydi
"loyiha" mashqlari.
Agar roʻyxatdan oʻtgan oʻqituvchi boʻlmasangiz, Pearson vakili bilan bogʻlaning yoki tashrif buyuring
www.pearsonhighered.com/educator/replocator/.
Minnatdorchilik
Biz Abbey Deitel va Barbara Deitelga ushbu loyihaga bag'ishlangan uzoq soatlar uchun minnatdorchilik bildirmoqchimiz.
Biz ushbu loyihada nashriyot bo'yicha maxsus guruh bilan ishlaganimizdan baxtiyormiz.
Pearsondagi professionallar. Biz Treysi Jonsonning rahbarligi, donoligi va energiyasini qadrlaymiz,
Ijrochi muharrir, kompyuter fanlari. Treysi va uning jamoasi bizning barcha akademik matnimizni boshqaradi -
kitoblar. Kerol Snayder kitobning akademik sharhlovchilarini jalb qildi va sharhni boshqardi
jarayon. Bob Engelxardt kitobning nashr etilishini boshqargan. Muqova rasmini tanladik va
Muqovani Laura Gardner yaratgan.
Taqrizchilar
Biz yaqinda nashr etilgan sharhlovchilarimizning sa'y-harakatlarini tan olishni istaymiz - taniqli
akademiklar guruhi, Oracle Java jamoasi aʼzolari, Oracle Java Champions va boshqa sohalar
mutaxassislarni sinab ko'ring. Ular matn va dasturlarni sinchkovlik bilan ko'rib chiqdilar va son-sanoqsiz takliflarni taqdim etdilar.
Taqdimotni yaxshilash uchun g'oyalar.
Biz Jim Uiver va Yoxan Vosning (Pro JavaFX hammualliflari) ko'rsatmalarini qadrlaymiz
2) va Saymon Ritter uchta JavaFX bobida.
O'ninchi nashr sharhlovchilari: Lens Andersen (Oracle korporatsiyasi), doktor Denni Kovard
(Oracle korporatsiyasi), Brayan Goetz (Oracle korporatsiyasi), Evan Golub (Universitet
Merilend), doktor Xuvey Guan (professor, kompyuter va axborot fanlari bo'limi
ence, North Shore Community College), Manfred Riem (Java chempioni), Saymon Ritter
(Oracle korporatsiyasi), Robert C. Seacord (CERT, Software Engineering Institute, Carn-
egie Mellon universiteti), Xallai Teylor (Triton kolleji yordamchi professori va adyunkt.
Professor, Lonestar kolleji-Kingvud), Xorxe Vargas (Yumbling va Java chempioni),
Yoxan Vos (LodgON va Oracle Java chempioni) va Jeyms L. Uiver (Oracle Korpora-
tion va Pro JavaFX 2 muallifi).
Oldingi nashrlar sharhlovchilari: Soundararajan Angusamy (Sun Microsystems), Jozef
Bowbeer (maslahatchi), Uilyam E. Dunkan (Luiziana shtat universiteti), Diana Franklin

xxxvi Muqaddima

(Kaliforniya universiteti, Santa Barbara), Edvard F. Gehringer (Shimoliy Karolina shtati).
Rik Heishman (Jorj Meyson universiteti); Xaynts Kabutz (JavaSpecial-
ists.eu), Patty Kraft (San-Diego davlat universiteti), Lourens Premkumar (Sun Microsys-
tems), Tim Margush (Akron universiteti), Sue McFarland Metzger (Villanova).
Universitet), Shyamal Mitra (Ostindagi Texas universiteti), Piter Pilgrim (konsul)
tant), Manjeet Rege, PhD. (Rochester texnologiya instituti), Syuzan Rodjer (Dyuk
universiteti), Amr Sabri (Indiana universiteti), Xose Antonio Gonsales Dry (parlamenti)
Andalusiya), Sang Shin (Sun Microsystems), S. Sivakumar (Astra Infotech Private Lim-
yozilgan), Raghavan "Rags" Srinivas (Intuit), Monika Sweat (Georgia Tech), Vinod Varma
(Astra Infotech Private Limited) va Aleksandr Zuev (Sun Microsystems).
Brayan Gyotsga alohida rahmat
Oracle’ning Java tili me’mori va o‘ziga xosligi bo‘yicha Brayan Gyotsga ega bo‘lish sharafiga muyassar bo‘ldik.
Java SE 8 Lambda loyihasi boʻyicha yetakchi va “Java Concurrency in Practice” kitobining hammuallifi,
to'liq kitobni batafsil ko'rib chiqing. U har bir bobni sinchkovlik bilan o'rganib chiqdi va oldingi ma'lumotlarni taqdim etdi.
juda foydali tushunchalar va konstruktiv sharhlar. Kitobda qolgan har qanday xatolar bor
o'zimizniki.

Xo'sh, sizda bor! Kitobni o'qiyotganingizda, sharhlaringizni, tanqidlaringizni qadrlaymiz.


tsismlar, tuzatishlar va takomillashtirish bo'yicha takliflar. Iltimos, barcha yozishmalarni quyidagi manzilga yuboring:

Biz zudlik bilan javob beramiz. Umid qilamizki, Java How to Program, 10/e bilan ishlash sizga yoqadi


Biz uni yozishdan zavqlanardik!
Pol va Xarvi Deitel
Mualliflar haqida
Pol Deitel, bosh direktor va bosh texnik
Deitel & Associates, Inc. xodimi a
MIT bitiruvchisi, u erda Inform-
matsion texnologiyasi. U Java-ni ushlab turadi
Sertifikatlangan dasturchi va Java sertifikati
Ishlab chiquvchi belgilari va Oracle hisoblanadi
Java chempioni. Deitel & Asso orqali
ciates, Inc., u butun dunyo bo'ylab mijozlarga yuzlab dasturlash kurslarini o'tkazdi.
Cisco, IBM, Siemens, Sun Microsystems, Dell, Fidelity, Kennedidagi NASA shu jumladan
Koinot markazi, Milliy kuchli bo'ron laboratoriyasi, White Sands raketa poligoni, Rogue
Wave Software, Boeing, SunGard Higher Education, Nortel Networks, Puma, iRobot,
Invensys va boshqalar. U va uning hammuallifi, doktor Xarvi M. Deitel dunyoning
eng ko'p sotilgan dasturlash tili bo'yicha darslik/professional kitob/video mualliflari.
Doktor Xarvi Deytel, Deitel & Associates, Inc. raisi va strategiya bo'yicha bosh direktori,
kompyuter sohasida 50 yildan ortiq tajribaga ega. Doktor Deitel BS va MS darajasiga ega
MITning elektrotexnika fanlari bo'yicha ilmiy darajalari va Ph.D. Bostondan matematika bo'yicha
Universitet. U kollejda katta o'qituvchilik tajribasiga ega, shu jumladan xizmat muddati va
ilgari Boston kollejida Kompyuter fanlari kafedrasi raisi lavozimida ishlagan
1991 yilda o'g'li Pol bilan Deitel & Associates, Inc. kompaniyasiga asos solgan. Deitels nashrlari

deitel@deitel.com


Deitel® & Associates, Inc. haqida xxxvii

yapon, nemis tillarida nashr etilgan tarjimalari bilan xalqaro eʼtirofga sazovor boʻlgan,
Rus, ispan, frantsuz, polyak, italyan, soddalashtirilgan xitoy, anʼanaviy xitoy,
Koreys, portugal, yunon, urdu va turk. Doktor Deitel yuzlab pro-
korporativ, akademik, hukumat va harbiy mijozlar uchun grammatika kurslari.
Deitel® & Associates, Inc. haqida
Paul Deitel va Harvey Deitel tomonidan asos solingan Deitel & Associates, Inc.
kompyuter texnologiyalariga ixtisoslashgan taniqli mualliflik va korporativ ta'lim tashkiloti
grammatika tillari, ob'ekt texnologiyasi, mobil ilovalarni ishlab chiqish va Internet va veb
dasturiy ta'minot texnologiyasi. Kompaniyaning ta'lim mijozlari orasida dunyodagi eng yirik kompaniyalar ham bor
kompaniyalar, davlat idoralari, harbiy qismlar va ilmiy muassasalar. The
kompaniya butun dunyo bo'ylab mijozlar saytlarida mutaxassislik bo'yicha o'qituvchi boshchiligidagi o'quv kurslarini taklif qiladi
dasturlash tillari va platformalari, jumladan Java™, Android ilovalarini ishlab chiqish,
Objective-C va iOS ilovalarini ishlab chiqish, C++, C, Visual C#®, Visual Basic®, Visual C++®,
Python®, ob'ekt texnologiyasi, Internet va veb-dasturlash va o'sib borayotgan qo'shimchalar ro'yxati
milliy dasturlash va dasturiy ta'minotni ishlab chiqish kurslari.
Pearson/Prentice Hall, Deitel & bilan 39 yillik nashriyot hamkorligi orqali
Associates, Inc., ilg'or dasturlash darsliklari va professional kitoblarni nashr etadi
bosma va keng doiradagi elektron kitob formatlari va LiveLessons video kurslari. Deitel & Association-
ates, Inc. va mualliflar bilan quyidagi manzil orqali bog‘lanish mumkin:

Deitel's Dive-Into® Series korporativ trening o'quv dasturi haqida ko'proq ma'lumot olish uchun tashrif buyuring:

Tashkilotingizda o'qituvchi boshchiligida butun dunyo bo'ylab o'qitish bo'yicha taklifni so'rash uchun,
deitel@deitel.com elektron pochta manzili.
Deitel kitoblari va LiveLessons video treninglarini sotib olishni xohlovchilar buni amalga oshirishlari mumkin
www.deitel.com orqali. Korporatsiyalar, hukumat, harbiylar va ommaviy buyurtmalar
akademik muassasalar to'g'ridan-to'g'ri Pearsonga joylashtirilishi kerak. Qo'shimcha ma'lumot uchun tashrif buyuring

deitel@deitel.com

http://www.deitel.com/training

http://www.informit.com/store/sales.aspx


Ushbu sahifa ataylab bo'sh qoldirilgan

www.allitebooks.com

Sizdan oldin


Boshlanishi

Ushbu bo'limda ushbu kitobdan foydalanishdan oldin ko'rib chiqishingiz kerak bo'lgan ma'lumotlar mavjud. Har qanday yangilanishlar


Bu erda taqdim etilgan ma'lumotlar quyidagi manzilda e'lon qilinadi:

Bundan tashqari, biz Dive-Into® videolarini taqdim etamiz (ular 2014 yil kuzida taqdim etiladi)


sinflar) ushbu Boshlashdan oldin bo'limidagi ko'rsatmalarni ko'rsatadi.
Shrift va nomlash qoidalari
Biz shriftlardan ekrandagi komponentlarni (masalan, menyu nomlari va
menyu elementlari) va Java kodi yoki buyruqlari. Bizning konventsiyamiz ekrandagi uyg'unlikni ta'kidlashdir.
ponents sans-serif qalin Helvetica shriftida (masalan, Fayl menyusi) va Java-ni ta'kidlash uchun
sans-serif Lucida shriftidagi kod va buyruqlar (masalan, System.out.println()).
Kitobda ishlatiladigan dasturiy ta'minot
Ushbu kitob uchun kerak bo'ladigan barcha dasturiy ta'minot internetdan bepul yuklab olish mumkin. Bilan
Java SE 8 ga xos bo'lgan misollar bundan mustasno, barcha misollar sinovdan o'tkazildi
Java SE 7 va Java SE 8 Java Standard Edition Development Kits (JDKs) bilan.
Java Standard Edition Development Kit 7 (JDK 7)
Windows, OS X va Linux platformalari uchun JDK 7 quyidagidan mavjud:

Java Standard Edition Development Kit (JDK) 8


Ushbu nashr vaqtida JDK 8 ning Windows, OS X va
Linux platformalari quyidagilardan mavjud edi:

JDK 8 yakuniy sifatida chiqarilgach, u quyidagilardan mavjud bo'ladi:

JDK o'rnatish bo'yicha ko'rsatmalar
JDK o'rnatuvchisini yuklab olgandan so'ng, JDK o'rnatilishini diqqat bilan kuzatib boring.
platformangiz uchun ko'rsatmalar:

Ushbu ko'rsatmalar JDK 7 uchun bo'lsa-da, ular JDK 8 uchun ham amal qiladi — yangilashingiz kerak bo'ladi.


har qanday versiyaga xos ko'rsatmalarda JDK versiya raqami.

http://www.deitel.com/books/jhtp10

http://www.oracle.com/technetwork/java/javase/downloads/index.html

https://jdk8.java.net/download.html

http://www.oracle.com/technetwork/java/javase/downloads/index.html

http://docs.oracle.com/javase/7/docs/webnotes/install/index.html


xl Boshlashdan oldin

PATH muhit o'zgaruvchisini o'rnatish
Kompyuteringizdagi PATH muhit o'zgaruvchisi qaysi kataloglarni ko'rsatadi
kompyuter ilovalarni izlayotganda, masalan, sizga imkon beradigan ilovalarni qidiradi
Java ilovalaringizni kompilyatsiya qiling va ishga tushiring (mos ravishda javac va java deb ataladi). Ehtiyotkorlik bilan
PATH muhitini o'rnatganingizga ishonch hosil qilish uchun platformangizda Java uchun o'rnatish yo'riqnomalarini kamaytiring.
ronment o'zgaruvchisi to'g'ri. Atrof-muhit o'zgaruvchilarini sozlash bosqichlari ishlashga qarab farqlanadi
tizim va ba'zan operatsion tizim versiyasi bo'yicha (masalan, Windows 7 va Windows 8). In-
Turli platformalar uchun ko'rsatmalar quyidagilarda keltirilgan:

Windows va ba'zi Linux o'rnatishlarida PATH o'zgaruvchisini to'g'ri o'rnatmagan bo'lsangiz,


JDK vositalaridan foydalanganda siz quyidagi kabi xabar olasiz:

Bunday holda, PATH-ni sozlash bo'yicha o'rnatish ko'rsatmalariga qayting va o'zingizni qayta tekshiring


qadamlar. Agar siz JDK ning yangiroq versiyasini yuklab olgan bo'lsangiz, nomini o'zgartirishingiz kerak bo'lishi mumkin
PATH o'zgaruvchisidagi JDK o'rnatish katalogining.
JDK o'rnatish katalogi va bin pastki katalogi
JDK o'rnatish katalogi platformaga qarab farq qiladi. Quyida keltirilgan kataloglar uchun
Oracle JDK 7 yangilanishi 51:
• Windows uchun 32-bitli JDK:
C:\Program Files (x86)\Java\jdk1.7.0_51
• Windows uchun 64-bitli JDK:
C:\Program Files\Java\jdk1.7.0_51
• Mac OS X:
/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
• Ubuntu Linux:
/usr/lib/jvm/java-7-oracle
Platformangizga qarab, JDK oʻrnatish papkasining nomi boshqacha boʻlishi mumkin, agar siz biz boʻlsangiz-
JDK 7 ning boshqa yangilanishi yoki JDK 8 dan foydalanish. Linux uchun o'rnatish joyi bog'liq
siz foydalanadigan o'rnatuvchida va ehtimol siz foydalanadigan Linux versiyasida. Biz Ubuntu-dan foydalandik
Linux. PATH muhit oʻzgaruvchisi JDK oʻrnatish katalogining qutisiga ishora qilishi kerak
pastki katalog.
PATH ni o'rnatayotganda, JDK-o'rnatish-katalog nomidan foydalanganingizga ishonch hosil qiling
siz o'rnatgan JDK ning o'ziga xos versiyasi - yangi JDK relizlari mavjud bo'lganda,
JDK-o'rnatish-katalog nomi yangilanish versiyasi raqamini o'z ichiga oladi. Uchun
Misol uchun, ushbu yozuv paytida, eng so'nggi JDK 7 versiyasi yangilangan 51 edi. Buning uchun
versiyada JDK-o'rnatish-katalog nomi "_51" bilan tugaydi.
CLASSPATH muhit o'zgaruvchisini o'rnatish
Agar siz Java dasturini ishga tushirishga harakat qilsangiz va shunga o'xshash xabarni olsangiz

http://www.java.com/en/download/help/path.xml

"java" ichki yoki tashqi buyruq sifatida tan olinmaydi,
ishlaydigan dastur yoki ommaviy ish fayli.

"Main" java.lang.NoClassDefFoundError mavzusidagi istisno: YourClass


JAVA_HOME muhit o'zgaruvchisini sozlash xli

keyin tizimingizda o'zgartirilishi kerak bo'lgan CLASSPATH muhit o'zgaruvchisi mavjud. ni tuzatish uchun
oldingi xatoni aniqlash uchun PATH muhit o'zgaruvchisini o'rnatish bosqichlarini bajaring
CLASSPATH o'zgaruvchisi, keyin o'zgaruvchining qiymatini mahalliy katalogni kiritish uchun tahrirlang - odatda
nuqta (.) sifatida ifodalanadi. Windows-da qo'shing

CLASSPATH qiymatining boshida (bu belgilardan oldin yoki keyin bo'sh joy qolmagan holda).


Boshqa platformalarda nuqta-vergulni tegishli yoʻl ajratuvchi belgisi bilan almashtiring.
ters - odatda ikki nuqta (:).
JAVA_HOME muhit o'zgaruvchisini o'rnatish
24-bobda va bir nechta onlayn bo'limlarda foydalaniladigan Java DB ma'lumotlar bazasi dasturi
JAVA_HOME muhit oʻzgaruvchisini JDK oʻrnatish yoʻnalishiga oʻrnatishingizni talab qiladi.
tory. PATH ni o'rnatish uchun ishlatgan qadamlaringiz boshqa muhitni o'rnatish uchun ham ishlatilishi mumkin
o'zgaruvchilar, masalan, JAVA_HOME.
Java Integrated Development Environments (IDE)
Java dasturlari uchun foydalanishingiz mumkin bo'lgan ko'plab Java integratsiyalashgan ishlab chiqish muhitlari mavjud.
grammatika. Shu sababli, biz ko'pchilik uchun faqat JDK buyruq qatori vositalaridan foydalandik
kitob misollari. Biz Dive-Into® videolarini taqdim etamiz (ular kuzda taqdim etiladi
2014 sinflari) uchta mashhur IDE-ni yuklab olish, o'rnatish va ulardan foydalanishni ko'rsatadi - NetBeans,
Eclipse va IntelliJ IDEA. Biz NetBeans-dan 25-bobda va kitobning bir nechta bo'limlarida foydalanamiz.
qator bo'limlari.
NetBeans yuklab olish
JDK/NetBeans to'plamini quyidagi manzildan yuklab olishingiz mumkin:

JDK bilan birga kelgan NetBeans versiyasi Java SE ni ishlab chiqish uchun mo'ljallangan. on-


qator JavaServer Faces (JSF) bo'limlari va veb-xizmatlar bo'limi Java Enterprise Eddi-dan foydalanadi.
tion (Java EE) NetBeans versiyasini yuklab olishingiz mumkin:

Ushbu versiya Java SE va Java EE ishlanmalarini qo'llab-quvvatlaydi.


Eclipse yuklab olish
Eclipse IDE-ni quyidagi manzildan yuklab olishingiz mumkin:

Java SE ni ishlab chiqish uchun Java Developers uchun Eclipse IDE ni tanlang. Java Enterprise uchun


Nashrni (Java EE) ishlab chiqish (JSF va veb-xizmatlar kabi) uchun Eclipse IDE-ni tanlang.
Java EE Developers - bu versiya Java SE va Java EE ishlanmalarini qo'llab-quvvatlaydi.
IntelliJ IDEA Community Edition yuklab olishlari
Siz IntelliJ IDEA Community Edition-ni bepul yuklab olishingiz mumkin:

Bepul versiya faqat Java SE rivojlanishini qo'llab-quvvatlaydi.

.;

http://www.oracle.com/technetwork/java/javase/downloads/index.html



https://netbeans.org/downloads/

https://www.eclipse.org/downloads/

http://www.jetbrains.com/idea/download/index.html

xlii Boshlashdan oldin

Kod misollarini olish
Java qanday qilib dasturlash, 10/e uchun misollarni yuklab olish mumkin

Yuklab olish kodi misollari va boshqa premium kontent sarlavhasi ostida. Misollar


dan ham mavjud

ZIP arxiv faylini yuklab olganingizda, siz tanlagan joyni yozing


uni kompyuteringizga saqlang.
7-Zip kabi ZIP chiqarish vositasi yordamida examples.zip mazmunini chiqarib oling
(www.7-zip.org), WinZip (www.winzip.com) yoki operatsion tizimingizning o'rnatilgan imkoniyatlari
tizimi. Kitobdagi ko'rsatmalar misollar quyidagi manzilda joylashganligini taxmin qiladi:
• Windows tizimidagi C:\misollar
• Linuxda foydalanuvchi hisobingiz bosh papkasining misollar pastki papkasi
• Mac OS X da Hujjatlar jildlari misollari pastki jildingiz
Java-ning Nimbus Look-and-Feel
Java Nimbus deb nomlanuvchi oʻzaro platformali koʻrinish va tuygʻu bilan birga keladi. Dasturlar uchun
Swing grafik foydalanuvchi interfeyslari bilan (masalan, 12 va 22-boblar) biz testimizni sozladik
kompyuterlar Nimbusni standart ko'rinish va his qilish sifatida ishlatish uchun.
Nimbusni barcha Java ilovalari uchun sukut bo'yicha o'rnatish uchun siz matn faylini yaratishingiz kerak
JDK o'rnatish papkangiz va sizning lib jildida swing.properties deb nomlangan
JRE o'rnatish papkasi. Faylga quyidagi kod qatorini joylashtiring:

Ushbu papkalarni joylashtirish haqida qo'shimcha ma'lumot olish uchun http://docs.oracle.com/javase/ saytiga tashrif buyuring.


7/docs/webnotes/install/index.html. [Izoh: Mustaqil JRE-dan tashqari, mavjud
JDK o'rnatish papkasida joylashgan JRE. Agar siz IDE dan foydalanayotgan bo'lsangiz, u quyidagilarga bog'liq
JDK (masalan, NetBeans), shuningdek, swing.properties faylini o'rnatilgan faylga joylashtirishingiz kerak bo'lishi mumkin.
jre jildining lib papkasi.]

Endi siz Java dasturini Java How to Program, 10/e bilan boshlashga tayyorsiz. Umid qilamizki


kitobdan zavqlanasiz!

http://www.deitel.com/books/jhtp10/

http://www.pearsonhighered.com/deitel

swing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel


1

Kompyuterga kirish,


Internet va Java

Inson hali ham eng ko'p


hamma uchun ajoyib kompyuter.
— Jon F. Kennedi
Yaxshi dizayn yaxshi biznes.
—Tomas J. Uotson, IBM asoschisi

Oh maqsadlar


Ushbu bobda siz:
■ Yaqinda bo'lgan qiziqarli voqealar haqida bilib oling
dagi o'zgarishlar
kompyuter maydoni.
■ Kompyuter texnikasini o'rganish,
dasturiy ta'minot va tarmoq
asoslar.
■ Ma'lumotlarni tushunish
ierarxiya.
■ Turli xil narsalarni tushuning
dasturlash turlari
tillar.
■ Muhimligini tushuning
Java va boshqa etakchi
dasturlash tillari.
■ Ob'ektga yo'naltirilganligini tushunish
dasturlash asoslari.
■ ning ahamiyatini bilib oling
Internet va Internet.
■ Oddiy Java dasturini o'rganing-
rivojlanish muhiti.
■ Java ilovasini sinovdan o'tkazing.
■ Yaqinda ba'zi kalitlarni bilib oling
dasturiy ta'minot texnologiyalari.
■ Qanday qilib yangilanib turishni ko'ring
ma'lumotlar bilan
texnologiyalar.

2 1-bob Kompyuterlar, Internet va Java-ga kirish

1.1 Kirish
Java-ga xush kelibsiz - dunyodagi eng keng tarqalgan kompyuter dasturlash tillaridan biri.
es. Siz kompyuterlar bajaradigan kuchli vazifalar bilan allaqachon tanishsiz. Ushbu matndan foydalanish -
kitobida siz ushbu vazifalarni bajarish uchun kompyuterlarga buyruq beradigan ko'rsatmalar yozasiz. Dasturiy ta'minot
(ya'ni, siz yozgan ko'rsatmalar) apparatni (ya'ni, kompyuterlarni) boshqaradi.
Siz ob'ektga yo'naltirilgan dasturlashni o'rganasiz - bugungi kunning asosiy dasturlash metodologiyasi.
Siz ko'plab dasturiy ta'minot ob'ektlarini yaratasiz va ular bilan ishlaysiz.
Ko'pgina tashkilotlar uchun korporativ dasturlarini qondirish uchun afzal qilingan til -
ming ehtiyojlari Java hisoblanadi. Java Internetga asoslangan ilovalarni amalga oshirish uchun ham keng qo'llaniladi
va tarmoq orqali aloqa qiladigan qurilmalar uchun dasturiy ta'minot.
Forrester Research 2015 yilga kelib ikki milliarddan ortiq shaxsiy kompyuterlardan foydalanishni bashorat qilmoqda
Oracle ma'lumotlariga ko'ra, korporativ ish stollarining 97%, shaxsiy kompyuterlarning 89%, uch mlrd.
qurilmalar (1.1-rasm) va barcha Blu-ray Disc™ pleyerlarining 100% Java bilan ishlaydi va 9 dan ortiq
million Java dasturchilari.2
Gartner tadqiqotiga ko'ra, mobil qurilmalar foydalanuvchilarning shaxsiy kompyuterlaridan o'zib ketishda davom etadi.
asosiy hisoblash qurilmalari; taxminan 1,96 milliard smartfon va 388 million planshet
2015 yilda yetkazib beriladi — 8,7 marta shaxsiy kompyuterlar.3 2018 yilga kelib mobil ilovalar

1.1 Kirish


1.2 Uskuna va dasturiy ta'minot
1.2.1 Mur qonuni
1.2.2 Kompyuterni tashkil etish
1.3 Ma'lumotlar ierarxiyasi
1.4 Mashina tillari, Assambleya
Tillar va yuqori darajali tillar
1.5 Obyekt texnologiyasiga kirish
1.5.1 Avtomobil ob'ekt sifatida
1.5.2 Usullar va sinflar
1.5.3 Namoyish
1.5.4 Qayta foydalanish
1.5.5 Xabarlar va qo'ng'iroqlar usuli
1.5.6 Atributlar va misol o'zgaruvchilari
1.5.7 Inkapsulyatsiya va axborotni yashirish
1.5.8 Meros
1.5.9 Interfeyslar
1.5.10 Ob'ektga yo'naltirilgan tahlil va loyihalash
(OOAD)
1.5.11 UML (Unified Modeling
Til)

1.6 Operatsion tizimlar


1.6.1 Windows - xususiy operatsion tizim
Tizim
1.6.2 Linux — ochiq kodli operatsion tizim
Tizim
1.6.3 Android
1.7 Dasturlash tillari
1.8 Java
1.9 Oddiy Java ishlanmasi
Atrof-muhit
1.10 Java dasturini sinovdan o'tkazish
1.11 Internet va World Wide Web
1.11.1 Internet: Tarmoqlar tarmog'i
1.11.2 Butunjahon Internet tarmog'i: yaratish
Internet foydalanuvchilari uchun qulay
1.11.3 Veb-xizmatlar va Mashuplar
1.11.4 Ajax
1.11.5 Narsalar interneti
1.12 Dasturiy ta'minot texnologiyalari
1.13 Yangilanishlarni olib borish
Axborot texnologiyalari

O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish

1. http://www.worldometers.info/computers.
2. http://www.oracle.com/technetwork/articles/java/javaone12review-1863742.html.
3. http://www.gartner.com/newsroom/id/2645115.

1.1 Kirish 3

(ilovalar) bozori 92 milliard dollarga yetishi kutilmoqda.4 Bu muhim martaba imkoniyatlarini yaratmoqda.
mobil ilovalarni dasturlaydigan odamlar uchun mo'ljallangan, ularning aksariyati Java-da dasturlashtirilgan
(1.6.3-bo'limga qarang).
Java standart nashri
Java shu qadar tez rivojlandiki, Java dasturining ushbu o'ninchi nashri Java-ga asoslangan
Standard Edition 7 (Java SE 7) va Java Standard Edition 8 (Java SE 8) — nashr etildi
birinchi nashrdan atigi 17 yil o'tgach. Java Standard Edition kerakli imkoniyatlarni o'z ichiga oladi
ish stoli va server ilovalarini ishlab chiqish. Kitobdan Java SE 7 yoki bilan foydalanish mumkin
Java SE 8 (ushbu kitob nashr etilgandan so'ng chiqarilgan). Java SE 8 ning barcha xususiyatlari
kitob davomida modulli, oson kiritiladigan yoki tashlab ketiladigan bo‘limlarda muhokama qilingan.
Java SE 8 dan oldin Java uchta dasturlash paradigmalarini qo'llab-quvvatlagan - protsessual pro-
grammatika, ob'ektga yo'naltirilgan dasturlash va umumiy dasturlash. Java SE 8 funksionallikni qo'shadi
dasturlash. 17-bobda biz pro-yozuv uchun funktsional dasturlashdan qanday foydalanishni ko'rsatamiz.
gramm tezroq, qisqaroq, kamroq xatolarga ega va ularni parallellashtirish osonroq (ya'ni, bajarish)
bir vaqtning o'zida bir nechta hisoblar) bugungi ko'p yadroli uskunadan foydalanish uchun
dastur ish faoliyatini yaxshilash uchun arxitektura.
Java Enterprise Edition
Java shu qadar keng ko'lamli dasturlarda qo'llaniladiki, uning yana ikkita nashri mavjud. The
Java Enterprise Edition (Java EE) keng ko'lamli, taqsimlangan tarmoqni rivojlantirishga qaratilgan.
ishlaydigan ilovalar va veb-ga asoslangan ilovalar. Ilgari ko'pchilik kompyuter dasturlari
"mustaqil" kompyuterlarda ishlagan (birga tarmoqqa ulanmagan kompyuterlar). Bugungi
ilovalar dunyo kompyuterlari o'rtasida muloqot qilish maqsadida yozilishi mumkin
Internet va Internet orqali. Keyinchalik ushbu kitobda biz bunday veb-asosni qanday yaratishni muhokama qilamiz
Java bilan ilovalar.

Qurilmalar

Samolyot tizimlari Bankomatlar Avtomobil axborot-ko'ngilochar tizimlari
Blu-ray Disc™ pleyerlari Kabel qutilari Nusxa ko'chirish mashinalari
Kredit kartalari KT skanerlari Ish stoli kompyuterlari
e-Readers O'yin konsollari GPS navigatsiya tizimlari
Maishiy texnika Uy xavfsizlik tizimlari Chiroq kalitlari
Lotereya terminallari Tibbiy asboblar Mobil telefonlar
MRIs Parking to'lov stantsiyalari Printerlar
Transport Robotlar Routerlaridan o'tadi
Smart kartalar Smart hisoblagichlar Smartpenlar
Smartfonlar Planshetlar Televizorlar
Televizor pristavkalari Termostatlar Avtomobil diagnostika tizimlari

1.1-rasm | Java-dan foydalanadigan ba'zi qurilmalar.

4. https://www.abiresearch.com/press/tablets-will-generate-35-of-this-years-25-
milliard-.

4 1-bob Kompyuterlar, Internet va Java-ga kirish

Java Micro Edition
Java Micro Edition (Java ME) - Java SE ning quyi to'plami - rivojlantirishga qaratilgan.
Aqlli soatlar, MP3 tinglash kabi resurslar cheklangan o'rnatilgan qurilmalar uchun ilovalar
ers, televizor pristavkalari, aqlli hisoblagichlar (elektr energiyasidan foydalanishni kuzatish uchun) va boshqalar.

1.2 Uskuna va dasturiy ta'minot


Kompyuterlar hisob-kitoblarni amalga oshirishi va mantiqiy qarorlar qabul qilish tezligiga qaraganda ancha tezroq bo'lishi mumkin
inson mumkin. Bugungi kunda ko'pgina shaxsiy kompyuterlar milliardlab hisob-kitoblarni amalga oshirishi mumkin.
Bir soniyada - inson umri davomida qila oladigan narsadan ko'proq. Superkompyuterlar
sekundiga minglab trillionlab (kvadrillion) ko'rsatmalarni bajarmoqda! Xitoyniki
Milliy Mudofaa Texnologiyalari Universitetining Tianhe-2 superkompyuteri ishlay oladi
Bir soniyada 33 kvadrillion hisoblar (33,86 petaflops)!5 Buni taxmin qilish uchun,
Tianhe-2 superkompyuteri har bir soniyada 3 millionga yaqin hisob-kitoblarni amalga oshirishi mumkin.
sayyoradagi o'g'lim! Va - bu superkompyuterning "yuqori chegaralari" tez o'sib bormoqda.
Kompyuterlar ma'lumotlarni ko'rsatmalar ketma-ketligi nazorati ostida qayta ishlaydi.
kompyuter dasturlari. Ushbu dasturiy ta'minot dasturlari buyurtma qilingan harakatlar orqali kompyuterni boshqaradi
kompyuter dasturchilari deb ataladigan odamlar tomonidan belgilanadi. Ushbu kitobda siz asosiy pro-
grammatika metodologiyasi dasturchi samaradorligini oshiradi va shu bilan kamaytiradi
dasturiy ta'minotni ishlab chiqish xarajatlari - ob'ektga yo'naltirilgan dasturlash.
Kompyuter apparat deb ataladigan turli xil qurilmalardan iborat (masalan, klaviatura,
ekran, sichqoncha, qattiq disklar, xotira, DVD drayvlar va protsessorlar). Hisoblash xarajatlari
apparat va dasturiy taʼminot texnologiyalarining jadal rivojlanishi tufayli keskin pasaymoqda.
og'izlari. Katta xonalarni to'ldirishi mumkin bo'lgan va o'nlab yillar davomida millionlab dollarga tushgan kompyuterlar
ilgari tirnoqdan ham kichikroq kremniy chiplariga yozilgan bo'lib, ular bir necha dollarga tushadi.
har biri lars. Ajablanarlisi shundaki, kremniy Yerdagi eng keng tarqalgan materiallardan biridir - bu
oddiy qumda yashaydi. Silikon-chip texnologiyasi hisoblashni shunchalik tejamkor qildiki
kompyuterlar tovarga aylandi.

1.2.1 Mur qonuni


Har yili siz ko'p mahsulot va xizmatlar uchun kamida bir oz ko'proq pul to'lashni kutmoqdasiz.
Ayniqsa, kompyuter va aloqa sohalarida buning aksi kuzatildi
ushbu texnologiyalarni qo'llab-quvvatlaydigan apparat bilan bog'liq. Ko'p o'n yillar davomida apparat
xarajatlar tez tushib ketdi.
Har bir yoki ikki yilda kompyuterlarning sig'imlari ikki baravar arzonlashdi.
jimgina. Ushbu ajoyib tendentsiya ko'pincha Mur qonuni deb ataladi, uni aniqlagan shaxs nomi bilan atalgan.
Bu haqda 1960-yillarda yetakchi ishlab chiqaruvchi Intel asoschisi Gordon Mur tasdiqlagan.
hozirgi kompyuterlar va o'rnatilgan tizimlardagi protsessorlar. Mur qonuni va tegishli
kuzatishlar, ayniqsa, kompyuterlarning dasturlar uchun ega bo'lgan xotira hajmiga taalluqlidir,
ikkilamchi xotira hajmi (masalan, diskda saqlash) ular dasturlarni ushlab turishi kerak va
uzoq vaqt davomida ma'lumotlar va ularning protsessor tezligi - ular amalga oshirish tezligi
ularning dasturlarini yoqimli qiling (ya'ni, ularning ishlarini bajaring).

5. http://www.top500.org/.


1.2 Uskuna va dasturiy ta'minot 5

Aloqa sohasida ham shunga o'xshash o'sish kuzatildi - xarajatlar keskin kamaydi
aloqa o'tkazish qobiliyatiga katta talab (ya'ni, axborotni o'tkazish qobiliyati)
shiddatli raqobatga sabab bo'ldi. Biz texnologiya bo'lgan boshqa sohalarni bilmaymiz
juda tez yaxshilanadi va xarajatlar juda tez tushadi. Bunday ajoyib yaxshilanish haqiqatan ham foydalidir.
Axborot inqilobiga qarshi kurash.
1.2.2 Kompyuterni tashkil etish
Jismoniy ko'rinishdagi farqlardan qat'i nazar, kompyuterlarni bo'lingan holda tasavvur qilish mumkin
turli mantiqiy birliklar yoki bo'limlarga (1.2-rasm).

Mantiqiy birlik tavsifi

Kirish birligi Ushbu "qabul qiluvchi" bo'lim ma'lumotlarni (ma'lumotlar va kompyuter dasturlari) oladi.
kiritish qurilmalaridan oladi va uni boshqa birliklar ixtiyoriga beradi.
to'xtatish. Ko'pgina foydalanuvchi ma'lumotlari kompyuterga klaviatura orqali kiritiladi,
sensorli ekranlar va sichqoncha qurilmalari. Kirishning boshqa shakllariga qabul qilish kiradi
ovozli buyruqlar, tasvirlar va shtrix-kodlarni skanerlash, ikkilamchidan o'qish
saqlash qurilmalari (masalan, qattiq disklar, DVD drayvlar, Blu-ray Disc™ drayvlari va
USB flesh-disklar - "bosh barmoqli disklar" yoki "xotira disklari" deb ham ataladi), qabul qilish
veb-kameradan olingan video va kompyuteringiz undan ma'lumot olishi
Internet (masalan, YouTube® dan videolarni oqimlash yoki yuklab olish
Amazondan elektron kitoblar). Kirishning yangi shakllari a dan joylashuv ma'lumotlarini o'z ichiga oladi
GPS qurilmasi va akselerometrdan harakat va orientatsiya ma'lumotlari
(yuqoriga/pastga, chapga/o'ngga va oldinga/orqaga tezlashishga javob beradigan qurilma
eration) smartfon yoki o'yin boshqaruvchisida (masalan, Microsoft® Kinect®
va Xbox®, Wii™ Remote va Sony® PlayStation® Move).
Chiqish birligi Ushbu "yuk tashish" bo'limi kompyuter qayta ishlagan ma'lumotlarni oladi va
tashqarida foydalanish uchun uni turli xil chiqish qurilmalariga joylashtiradi
kompyuter. Bugungi kunda kompyuterlardan chiqadigan ma'lumotlarning aksariyati o'chiriladi.
ekranlarda (shu jumladan sensorli ekranlarda) o'ynaladi, qog'ozga bosiladi ("ketmoqda
yashil” buni rad etadi), kompyuterlar va media pleerlarda audio yoki video sifatida ijro etiladi
(masalan, Apple iPod'lari kabi) va sport stadionlaridagi ulkan ekranlar uzatiladi
Internet orqali yoki boshqa qurilmalarni boshqarish uchun foydalaniladi, masalan, robotlar va "intel-
ligent” jihozlari. Ma'lumotlar odatda ikkinchi darajali xotiraga chiqariladi.
qattiq disklar, DVD disklar va USB flesh-disklar kabi yoshdagi qurilmalar. A
mashhur so'nggi chiqish shakli smartfon tebranish hisoblanadi.
Xotira birligi Ushbu tezkor kirish, nisbatan kam sig'imli "ombor" bo'limi saqlanib qoladi
kiritish birligi orqali kiritilgan ma'lumotlar, uni qilish
kerak bo'lganda darhol qayta ishlash uchun mavjud. Xotira birligi ham
tomonidan qayta ishlangan axborotni chiqish qurilmalariga joylashtirilgunga qadar saqlaydi
chiqish birligi. Xotira blokidagi ma'lumotlar o'zgaruvchan - bu odatda
kompyuter quvvati o'chirilganda yo'qoladi. Xotira birligi ko'pincha
xotira, asosiy xotira yoki operativ xotira (Random Access Mem-
or). Ish stoli va noutbuklarning asosiy xotiralari shunchalik ko'p narsalarni o'z ichiga oladi
128 GB operativ xotira sifatida. GB gigabaytlarni anglatadi; gigabayt taxminan
bir milliard bayt. Bir bayt sakkiz bit. Bit 0 yoki 1 ga teng.

1.2-rasm | Kompyuterning mantiqiy birliklari. (2-qismning 1-qismi.)


6 1-bob Kompyuterlar, Internet va Java-ga kirish

1.3 Ma'lumotlar ierarxiyasi
Kompyuterlar tomonidan qayta ishlanadigan ma'lumotlar ob'ektlari kattaroq va ko'proq bo'ladigan ma'lumotlar ierarxiyasini tashkil qiladi
Biz eng oddiy ma'lumotlar elementlaridan ("bitlar" deb ataladi) boyroqqa o'tsak, tuzilmasi murakkab
belgilar va maydonlar kabilar. 1.3-rasmda ma'lumotlar ierarxiyasining bir qismi ko'rsatilgan.
Bitlar
Kompyuterdagi eng kichik ma'lumotlar elementi 0 yoki 1 qiymatini qabul qilishi mumkin. U a deyiladi.
bit ("ikkilik raqam" ning qisqartmasi - ikkita qiymatdan birini qabul qila oladigan raqam). E'tiborlisi,
Kompyuterlar tomonidan bajariladigan ta'sirchan funktsiyalar faqat eng oddiy manipulyatsiyalarni o'z ichiga oladi
0s va 1s - bit qiymatini tekshirish, bit qiymatini o'rnatish va bit qiymatini o'zgartirish (1 dan 1 gacha).
0 yoki 0 dan 1 gacha).
Belgilar
Bitlarning past darajali shaklidagi ma'lumotlar bilan ishlash odamlar uchun zerikarli. Buning o'rniga ular afzal ko'rishadi
o'nlik raqamlar (0–9), harflar (A–Z va a–z) va maxsus belgilar (masalan, $, @, %,

Arifmetika


va mantiq birligi
(ALU)

Ushbu "ishlab chiqarish" bo'limi qo'shimchalar, pastki qismlar kabi hisob-kitoblarni amalga oshiradi.


tortish, ko'paytirish va bo'lish. Shuningdek, unda qaror mecha-
kompyuterga, masalan, ikkita elementni solishtirish imkonini beruvchi nizmlar
ular teng yoki yo'qligini aniqlash uchun xotira birligi. Hozirgi tizimlarda
ALU keyingi mantiqiy birlik, protsessorning bir qismi sifatida amalga oshiriladi.

Markaziy
qayta ishlash


birlik (CPU)

Ushbu "ma'muriy" bo'lim faoliyatini muvofiqlashtiradi va nazorat qiladi


boshqa bo'limlar. Protsessor kirish blokiga ma'lumot qachon kerakligini aytadi
xotira blokiga o'qilishi kerak, ALU dan olingan ma'lumotni bildiradi
xotira birligi hisob-kitoblarda ishlatilishi kerak va chiqish blokiga qachon xabar beradi
xotira blokidan ma'lum chiqish qurilmalariga ma'lumot yuborish. Ko'pchilik
Hozirgi kompyuterlarning bir nechta protsessorlari mavjud va shuning uchun ular ko'p ishlay oladi
operatsiyalar bir vaqtning o'zida. Ko'p yadroli protsessor bir nechta narsalarni amalga oshiradi
bitta o'rnatilgan mikrosxemadagi protsessorlar - ikki yadroli protsessor ikkitadan iborat
CPU va to'rt yadroli protsessorda to'rtta protsessor mavjud. Hozirgi ish stoli kompyuterlari
soniyada milliardlab buyruqlarni bajara oladigan protsessorlarga ega.

Ikkilamchi


saqlash birligi

Bu uzoq muddatli, yuqori quvvatli "omborxona" bo'limi. Dasturlar yoki


Odatda boshqa birliklar tomonidan faol foydalanilmaydigan ma'lumotlar sekundga joylashtiriladi.
qo'shimcha saqlash qurilmalari (masalan, qattiq diskingiz) yana kerak bo'lgunga qadar,
ehtimol soatlar, kunlar, oylar yoki hatto yillar o'tib. Ikkilamchi daraja haqida ma'lumot
saqlash qurilmalari doimiy - u kompyuter quvvati bo'lsa ham saqlanib qoladi
o'chirilgan. Ikkilamchi saqlash ma'lumotlariga kirish uchun ko'proq vaqt ketadi
birlamchi xotiradagi ma'lumotlarga qaraganda, lekin uning bir birlik narxi ancha past.
Ikkilamchi saqlash qurilmalariga qattiq disklar, DVD disklar va boshqalar kiradi
USB flesh-disklar, ularning ba'zilari 2 TB dan ortiq sig'imga ega (TB - tera-
baytlar; terabayt taxminan bir trillion bayt). Oddiy qattiq disklar yoqilgan
ish stoli va noutbuklar 2 TB gacha sig'imga ega, ba'zilari esa qattiq
drayvlar 4 TB gacha sig'ishi mumkin.

Mantiqiy birlik tavsifi

1.2-rasm | Kompyuterning mantiqiy birliklari. (2-qismning 2-qismi.)

www.allitebooks.com


1.3 Ma'lumotlar ierarxiyasi 7

&, *, (, ), –, +, ", :, ? va /). Raqamlar, harflar va maxsus belgilar belgilar sifatida tanilgan.
Kompyuterning belgilar to'plami - bu dasturlarni yozish uchun ishlatiladigan barcha belgilar to'plami va
ma'lumotlar elementlarini ifodalaydi. Kompyuterlar faqat 1 va 0 larni qayta ishlaydi, shuning uchun kompyuterning belgilar to'plami takrorlanadi.
har bir belgini 1 va 0 lar namunasi sifatida norozi qiladi. Java Unicode® belgilardan foydalanadi
bir, ikki yoki to'rt baytdan iborat (8, 16 yoki 32 bit). Unicode uchun belgilar mavjud
dunyoning ko'plab tillari. Unicode haqida qo'shimcha ma'lumot olish uchun H ilovasiga qarang. Qarang
ASCII (Amerika standart axborot kodeksi) haqida qo'shimcha ma'lumot olish uchun B ilovasida.
tion Interchange) belgilar to'plami - Unicode ning katta harflarni ifodalovchi mashhur kichik to'plami
va kichik harflar, raqamlar va ba'zi umumiy maxsus belgilar.

Maydonlar


Belgilar bitlardan tashkil topganidek, maydonlar ham belgilar yoki baytlardan iborat. Maydon
ma’noni bildiruvchi belgilar yoki baytlar guruhidir. Masalan, dan iborat maydon
Katta va kichik harflar odamning ismini ifodalash uchun ishlatilishi mumkin, maydon esa
O'nlik raqamlarning birlashuvi odamning yoshini ko'rsatishi mumkin.

Yozuvlar
Yozuv yaratish uchun bir nechta tegishli maydonlardan foydalanish mumkin (Javada sinf sifatida amalga oshiriladi). In


ish haqi tizimi, masalan, xodim uchun rekord quyidagilardan iborat bo'lishi mumkin
maydonlar (bu maydonlarning mumkin bo'lgan turlari qavs ichida ko'rsatilgan):

1.3-rasm | Ma'lumotlar ierarxiyasi.

Tom Blue

Sally Black

Judy Green

Fayl


J udy Field

Unicode belgisi J

Yozib olish

Iris apelsin

Randy Red

00000000 01001010

1 bit

Judy Green


8 1-bob Kompyuterlar, Internet va Java-ga kirish

• Xodimning identifikatsiya raqami (butun raqam)
• Ism (belgilar qatori)
• Manzil (belgilar qatori)
• Soatlik ish haqi stavkasi (kasrli raqam)
• Yillik daromadlar (o‘nli kasrli raqam)
• ushlab qolingan soliqlar miqdori (o‘nli kasrli raqam)
Shunday qilib, rekord bir-biriga bog'liq bo'lgan maydonlar guruhidir. Oldingi misolda barcha maydonlar tegishli
bir xil xodim. Kompaniyada ko'plab xodimlar bo'lishi mumkin va ularning har biri uchun ish haqi jadvali bo'lishi mumkin.

Fayllar
Fayl - bu o'zaro bog'liq yozuvlar guruhi. [Izoh: Umuman olganda, faylda o'zboshimchalik bilan ma'lumotlar mavjud


ixtiyoriy formatlar. Ba'zi operatsion tizimlarda fayl oddiygina baytlar ketma-ketligi sifatida ko'riladi -
fayldagi baytlarning har qanday tashkiloti, masalan, ma'lumotlarni yozuvlarga tartibga solish ko'rinishdir
dasturchi tomonidan yaratilgan. Buni qanday qilishni 15-bobda ko'rasiz.] Unday emas
Tashkilot uchun juda ko'p, ba'zilarida milliardlab, hatto trillionlab fayllar bo'lishi odatiy hol emas.
axborot belgilaridan.

Ma'lumotlar bazasi


Ma'lumotlar bazasi oson kirish va boshqarish uchun tashkil etilgan ma'lumotlar to'plamidir. Eng
mashhur model - relyatsion ma'lumotlar bazasi bo'lib, unda ma'lumotlar oddiy jadvallarda saqlanadi. Jadval
yozuvlar va maydonlarni o'z ichiga oladi. Masalan, talabalar jadvalida ism, familiya bo'lishi mumkin
ism, mutaxassislik, yil, talaba identifikatori raqami va o'rtacha ball maydonlari. Har biri uchun ma'lumotlar
talaba yozuvdir va har bir yozuvdagi alohida ma'lumotlar bo'laklari maydonlardir.
Siz ma'lumotlarni bir nechta ma'lumotlarga bo'lgan munosabati asosida qidirishingiz, saralashingiz va boshqa usulda boshqarishingiz mumkin
jadvallar yoki ma'lumotlar bazalari. Masalan, universitet talabalar ma'lumotlar bazasidagi ma'lumotlardan foydalanishi mumkin
kurslar ma'lumotlar bazalari ma'lumotlari bilan kombinatsiyasi, on-kampus uy-joy, ovqat rejalari, va hokazo. Biz
24-bobda ma'lumotlar bazalarini muhokama qiling.

Katta ma'lumotlar


Dunyo bo'ylab ishlab chiqarilayotgan ma'lumotlar miqdori juda katta va tez o'sib bormoqda. Kelishuv -
IBM uchun har kuni taxminan 2,5 kvintillion bayt (2,5 ekzabayt) ma'lumotlar yaratiladi va
Dunyo maʼlumotlarining 90% oxirgi ikki yil ichida yaratilgan!6 Digital Uni-
oyatni o'rganish, global ma'lumotlar ta'minoti 2,8 zettabaytga yetdi (2,8 trillion gigabaytga teng)
2012 yilda.7 1.4-rasmda ba'zi umumiy bayt o'lchovlari ko'rsatilgan. Katta ma'lumotlar ilovalari bilan shug'ullanish
Bunday katta hajmdagi ma'lumotlar bilan bu soha tez o'sib bormoqda va ko'plab imkoniyatlarni yaratmoqda.
dasturiy ta'minot ishlab chiquvchilari uchun imkoniyat. Gartner Group tomonidan o'tkazilgan tadqiqotga ko'ra, 4 milliondan ortiq
2015 yilga kelib butun dunyo bo'ylab IT-ish joylari katta ma'lumotlarni qo'llab-quvvatlaydi.8

6. http://www-01.ibm.com/software/data/bigdata/.


7. http://www.guardian.co.uk/news/datablog/2012/dec/19/big-data-study-digital-
koinot-global hajm.
8. http://tech.fortune.cnn.com/2013/09/04/big-data-employment-boom/.

1.4 Mashina tillari, Assambleya tillari va yuqori darajali tillar 9

1.4 Mashina tillari, Assambleya tillari va yuqori
Darajali tillar
Dasturchilar ko'rsatmalarni turli dasturlash tillarida yozadilar, ba'zilari to'g'ridan-to'g'ri
oraliq tarjima bosqichlarini talab qiladigan kompyuterlar va boshqalar tomonidan barqaror. Yuzlab
bunday tillar bugungi kunda qo'llanilmoqda. Ularni uchta umumiy turga bo'lish mumkin:
1. Mashina tillari
2. Assambleya tillari
3. Yuqori darajadagi tillar
Mashina tillari
Har qanday kompyuter to'g'ridan-to'g'ri faqat o'ziga xos mashina tilini tushunishi mumkin
apparat dizayni. Mashina tillari odatda raqamlar qatorlaridan iborat (oxir-oqibat
1 va 0 ga bo'lingan) kompyuterlarga o'zlarining eng elementar operatsiyalarini bajarishni buyuradi
birma-bir. Mashina tillari mashinaga bog'liq (ma'lum bir mashina tili
faqat bitta turdagi kompyuterda ishlatilishi mumkin). Bunday tillar odamlar uchun og'ir.
Misol uchun, bu erda mashina tilidagi dastlabki ish haqi dasturining bo'limi mavjud bo'lib, unda ortiqcha ish haqi qo'shiladi.
vaqtni asosiy ish haqiga to'laydi va natijani yalpi ish haqi sifatida saqlaydi:

Assambleya tillari va yig'uvchilar


Ko'pgina dasturlar uchun mashina tilida dasturlash juda sekin va zerikarli edi.
mers. Kompyuterlar to'g'ridan-to'g'ri tushunadigan raqamlar qatoridan foydalanish o'rniga,
dasturchilar elementar operatsiyalarni ifodalash uchun inglizcha qisqartmalardan foydalanishni boshladilar.
Ushbu qisqartmalar assembly tillarining asosini tashkil etdi. Tarjimon dasturlari -
Dastlabki assembler tilidagi dasturlarni mashina tiliga aylantirish uchun semblelar ishlab chiqilgan.
kompyuter tezligini o'lchash. Assambleya tilidagi ish haqi dasturining quyidagi bo'limi
shuningdek, asosiy ish haqiga qo'shimcha ish haqini qo'shadi va natijani yalpi ish haqi sifatida saqlaydi:

Birlik baytlari Bu taxminan


1 kilobayt (KB) 1024 bayt 103 (aniq 1024 bayt)
1 megabayt (MB) 1024 kilobayt 106 (1 000 000 bayt)
1 gigabayt (GB) 1024 megabayt 109 (1 000 000 000 bayt)
1 terabayt (TB) 1024 gigabayt 1012 (1 000 000 000 000 bayt)
1 petabayt (PB) 1024 terabayt 1015 (1.000.000.000.000.000 bayt)
1 ekzabayt (EB) 1024 petabayt 1018 (1.000.000.000.000.000.000 bayt)
1 zettabayt (ZB) 1024 ekzabayt 1021 (1.000.000.000.000.000.000.000 bayt)
1.4-rasm | Bayt o'lchovlari.

+1300042774


+1400593419
+1200274027

asosiy to'lovni yuklang


ortiqcha to'lovni qo'shing
yalpi to'lovni saqlash

10 1-bob Kompyuterlar, Internet va Java-ga kirish

Garchi bunday kod odamlar uchun tushunarli bo'lsa-da, kompyuterga translyatsiya qilinmaguncha tushunarsiz.
mashina tiliga o'tgan.
Yuqori darajali tillar va kompilyatorlar
Assembler tillarining paydo bo'lishi bilan kompyuterdan foydalanish tez sur'atlar bilan o'sdi, ammo dastur-
mers hali ham eng oddiy vazifalarni bajarish uchun ko'plab ko'rsatmalardan foydalanishi kerak edi. Kimga
dasturlash jarayonini tezlashtirish, qaysi birida yuqori darajali tillar ishlab chiqilgan
muhim vazifalarni bajarish uchun bayonotlar yozilishi mumkin. Tarjimon dasturlari chaqiriladi
kompilyatorlar yuqori darajadagi til dasturlarini mashina tiliga aylantiradi. Yuqori darajadagi lan-
guages sizga deyarli har kungi ingliz tiliga o'xshash va o'z ichiga olgan ko'rsatmalar yozish imkonini beradi
tez-tez ishlatiladigan matematik belgilar. Yuqori darajadagi tilda yozilgan ish haqi dasturi
guage kabi bitta gapni o'z ichiga olishi mumkin

Dasturchi nuqtai nazaridan, yuqori darajadagi tillar mashina va


assembly tillari. Java eng keng tarqalgan yuqori darajadagi dasturlash tillaridan biridir.
Tarjimonlar
Katta yuqori darajadagi til dasturini mashina tiliga kompilyatsiya qilish quyidagilarni hisobga olishi mumkin:
qobiliyatli kompyuter vaqti. Yuqori darajadagi tilni rivojlantirish uchun ishlab chiqilgan tarjimon dasturlari
gramm to'g'ridan-to'g'ri, kompilyatsiya kechikishidan saqlaning, garchi ular kompilyatsiya qilinganidan sekinroq ishlaydi
dasturlar. Tarjimonlar haqida koʻproq 1.9-boʻlimda aytib oʻtamiz, bu yerda siz Java’dan foydalanishini bilib olasiz
dasturlarni ishga tushirish uchun kompilyatsiya va talqinning aqlli ishlashi bilan sozlangan aralashmasi.
1.5 Obyekt texnologiyasiga kirish
Bugungi kunda yangi va kuchliroq dasturiy ta'minotga bo'lgan talablar ortib borayotgani sababli, dasturiy ta'minot yaratilmoqda
tez, to'g'ri va iqtisodiy jihatdan qiyin maqsad bo'lib qolmoqda. Ob'ektlar, aniqrog'i,
sinflar ob'ektlari kelib chiqadi, ular asosan qayta foydalanish mumkin bo'lgan dasturiy komponentlardir. Sana bor-
ob'ektlar, vaqt ob'ektlari, audio ob'ektlar, video ob'ektlar, avtomobil ob'ektlari, odamlar ob'ektlari va boshqalar. Al-
ko'pchilik har qanday ot atributlar nuqtai nazaridan dasturiy ob'ekt sifatida oqilona ifodalanishi mumkin
(masalan, ism, rang va o'lcham) va xatti-harakatlar (masalan, hisoblash, harakat qilish va muloqot qilish).
Dasturiy ta'minotni ishlab chiqish guruhlari modulli, ob'ektga yo'naltirilgan dizayn va amalga oshirishdan foydalanishi mumkin.
oldingi mashhur usullardan ko'ra samaraliroq bo'lish uchun yondashuv
"Tuzilgan dasturlash" - ob'ektga yo'naltirilgan dasturlarni tushunish odatda osonroq,
tuzatish va o'zgartirish.
1.5.1 Avtomobil ob'ekt sifatida
Ob'ektlar va ularning mazmunini tushunishingizga yordam berish uchun, keling, oddiy o'xshatish bilan boshlaylik. sup-
siz mashinani haydashni xohlaysiz va uning gaz pedalini bosish orqali tezroq harakatlantirmoqchisiz. Nima kerak
buni amalga oshirishdan oldin sodir bo'ladimi? Mashinani haydashdan oldin, kimdir uni loyihalashtirishi kerak.
Avtomobil odatda muhandislik chizmalari sifatida boshlanadi, xuddi shunday tasvirlangan chizmalar
uyning dizayni. Ushbu chizmalar gaz pedali uchun dizaynni o'z ichiga oladi. Pedal
xuddi shunday mashinani tezroq harakatga keltiradigan murakkab mexanizmlarni haydovchidan yashiradi
tormoz pedali avtomobilni sekinlashtiradigan mexanizmlarni "yashiradi", rul esa "yashiradi"
mashinani aylantiruvchi mexanizmlar. Bu qanday qilib kam yoki umuman bilmaydigan odamlarga imkon beradi
dvigatellar, tormozlash va boshqaruv mexanizmlari avtomobilni oson boshqarish uchun ishlaydi.

grossPay = basePay + overTimePay


1.5 Obyekt texnologiyasiga kirish 11

Oshxonada ovqat tayyorlay olmaganingiz kabi, siz ham mashina haydaolmaysiz
muhandislik chizmalari. Avtomobilni haydashdan oldin u muhandislikdan qurilgan bo'lishi kerak
uni tasvirlaydigan chizmalar. Tugallangan mashinada uni harakatga keltirish uchun haqiqiy gaz pedali mavjud
tezroq, lekin bu ham etarli emas - mashina o'z-o'zidan tezlashmaydi (umid qilamanki), shuning uchun
haydovchi mashinani tezlashtirish uchun pedalni bosishi kerak.
1.5.2 Usullar va sinflar
Keling, ba'zi asosiy ob'ektga yo'naltirilgan dasturlash tushunchalarini kiritish uchun avtomobil misolimizdan foydalanamiz. Per-
dasturda vazifani shakllantirish usulini talab qiladi. Usul dastur bayonotlarini o'z ichiga oladi
bu aslida o'z vazifalarini bajaradi. Usul ushbu bayonotlarni foydalanuvchidan yashiradi, xuddi shunday
avtomobilning gaz pedali haydovchidan avtomobilni tezroq harakatlantirish mexanizmlarini yashiradi.
Java-da biz klass deb ataladigan dastur blokini yaratamiz
sinf vazifalari. Misol uchun, bank hisobini ifodalovchi sinf bitta usulni o'z ichiga olishi mumkin
hisob raqamiga pul qo'yish, boshqasi hisobdan pul olish va uchinchisi
hisobning joriy qoldig'i qancha ekanligini so'rang. Sinf tushunchasi bo'yicha avtomobil muhandisiga o'xshaydi -
gaz pedali, rul va boshqalar dizaynini o'z ichiga olgan chizmalar.
1.5.3 Namoyish
Xuddi kimdir sizdan oldin uning muhandislik chizmalaridan mashina yasashi kerak bo'lganidek
mashinani boshqarsangiz, dastur vazifalarni bajarishdan oldin sinf ob'ektini qurishingiz kerak
sinfning usullarini belgilaydi. Buni amalga oshirish jarayoni instantsiya deb ataladi. Ob'ekt - bu
keyin o'z sinfining namunasi deb ataladi.
1.5.4 Qayta foydalanish
Avtoulovning muhandislik chizmalaridan ko'p marta ko'p avtomobillarni qurish uchun qayta foydalanish mumkin bo'lganidek, siz ham shunday qilishingiz mumkin
ko'p ob'ektlarni qurish uchun sinfni ko'p marta ishlating. Yangisini qurishda mavjud sinflarni qayta ishlatish
darslar va dasturlar vaqt va kuchni tejaydi. Qayta foydalanish, shuningdek, yanada ishonchli va qurishga yordam beradi
samarali tizimlar, chunki mavjud sinflar va komponentlar ko'pincha keng tarqalgan
sinov, disk raskadrovka va ishlashni sozlash. Xuddi almashtiriladigan qismlar tushunchasi kabi
Sanoat inqilobi uchun juda muhim, qayta foydalanish mumkin bo'lgan sinflar dasturiy ta'minot inqilobi uchun juda muhimdir
Bu ob'ekt texnologiyasi tomonidan turtki bo'ldi.

1.5.5 Xabarlar va qo'ng'iroqlar usuli


Avtomobilni haydaganingizda, uning gaz pedalini bossangiz, mashinaga vazifani bajarish uchun xabar yuboriladi -
ya'ni tezroq borish. Xuddi shunday, siz ob'ektga xabar yuborasiz. Har bir xabar amalga oshiriladi
ob'ektning usulini o'z vazifasini bajarishini bildiruvchi usul chaqiruvi sifatida. Masalan, pro-
gram hisob balansini oshirish uchun bank hisobi ob'ektining depozit usulini chaqirishi mumkin.
1.5.6 Atributlar va misol o'zgaruvchilari
Avtomobil vazifalarni bajarish qobiliyatiga ega bo'lishidan tashqari, uning rangi,
uning eshiklari soni, uning idishidagi gaz miqdori, joriy tezligi va umumiy rekord

Dasturiy ta'minot muhandisligi kuzatuvi 1.1


Dasturlaringizni yaratishda qurilish bloki yondashuvidan foydalaning. G'ildirakni qayta ixtiro qilishdan saqlaning -
iloji boricha mavjud yuqori sifatli qismlardan foydalaning. Ushbu dasturiy ta'minotni qayta ishlatish asosiy afzallik hisoblanadi
ob'ektga yo'naltirilgan dasturlash.

12 1-bob Kompyuterlar, Internet va Java-ga kirish

mil yurgan (ya'ni, uning odometr ko'rsatkichi). Uning imkoniyatlari kabi, avtomobilning atributlari ham takrorlanadi.
dizaynning bir qismi sifatida muhandislik diagrammalarida yuborilgan (masalan, o'z ichiga oladi
odometr va yonilg'i o'lchagich). Haqiqiy mashinani boshqarayotganingizda, bu atributlar birga olib boriladi
mashina bilan. Har bir mashina o'ziga xos xususiyatlarga ega. Misol uchun, har bir mashina qanday qilishni biladi
ko'p gaz o'zining benzin bakida, lekin boshqa mashinalarning baklarida qancha emas.
Xuddi shunday, ob'ekt ham dasturda foydalanilganda o'zi bilan birga olib boradigan atributlarga ega. Bular
atributlar ob'ekt sinfining bir qismi sifatida belgilanadi. Masalan, bank hisobi ob'ekti mavjud
hisobdagi pul miqdorini ifodalovchi balans atributi. Har bir bank-
hisob ob'ekti o'zi ifodalagan hisobdagi qoldiqni biladi, lekin uning qoldiqlarini emas
bankdagi boshqa hisobvaraqlar. Atributlar sinfning misol o'zgaruvchilari tomonidan belgilanadi.

1.5.7 Inkapsulyatsiya va axborotni yashirish


Sinflar (va ularning ob'ektlari) o'z atributlari va usullarini qamrab oladi, ya'ni encase. Bir sinf
(va uning ob'ektining) atributlari va usullari chambarchas bog'liq. Ob'ektlar muloqot qilishi mumkin
bir-biri bilan, lekin ular odatda boshqa ob'ektlar qanday amalga oshirilishini bilishlari mumkin emas.
eslatib o'tilgan - amalga oshirish tafsilotlari ob'ektlarning o'zida yashiringan. Bu ma'lumot-
Ko'rib turganimizdek, yashirish yaxshi dasturiy ta'minot muhandisligi uchun juda muhimdir.

1.5.8 Meros


Ob'ektlarning yangi sinfi meros orqali qulay tarzda yaratilishi mumkin - yangi sinf (deb ataladi
kichik sinf) mavjud sinfning (supersinf deb ataladigan) xususiyatlaridan boshlanadi.
ularni birdek sozlash va o'ziga xos xususiyatlarni qo'shish. Bizning mashina analogida,
"konvertatsiya qilinadigan" sinf ob'ekti, albatta, "avtomobil
safro, lekin aniqrog'i, tomni ko'tarish yoki tushirish mumkin.

1.5.9 Interfeyslar


Java shuningdek interfeyslarni qo'llab-quvvatlaydi - odatda sizga imkon beradigan tegishli usullar to'plami
ob'ektlarga nima qilish kerakligini ayting, lekin buni qanday qilishni emas (biz Java SE 8 da bundan istisnoni ko'ramiz).
Avtomobil o'xshashligida rul g'ildiragidan iborat "asosiy haydash qobiliyatlari" interfeysi.
gaz pedali va tormoz pedali haydovchiga mashinaga nima qilish kerakligini aytishga imkon beradi. Bir marta
burilish, tezlashtirish va tormozlash uchun ushbu interfeysdan qanday foydalanishni bilasiz, siz haydashingiz mumkin
ko'p turdagi avtomobillar, garchi ishlab chiqaruvchilar ushbu tizimlarni boshqacha tarzda amalga oshirishi mumkin.
Sinf nol yoki bir nechta interfeyslarni amalga oshiradi, ularning har biri bir yoki bir nechta bo'lishi mumkin
usullar, xuddi avtomobil asosiy haydash funktsiyalari uchun alohida interfeyslarni amalga oshiradi,
radioeshittirish, isitish va konditsioner tizimlarini boshqarish va boshqalar. Xuddi
avtomobil ishlab chiqaruvchilari imkoniyatlarni boshqacha amalga oshiradilar, sinflar interfeysni amalga oshirishi mumkin
usullari boshqacha. Masalan, dasturiy ta'minot tizimi "zaxira" interfeysini o'z ichiga olishi mumkin
saqlash va tiklash usullarini taklif etadi. Sinflar bu usullarni boshqacha amalga oshirishi mumkin,
dasturlar, matnlar, audiolar, videolar kabi zaxiralanadigan narsalar turlariga qarab,
h.k. va ushbu elementlar saqlanadigan qurilmalar turlari.

1.5.10 Ob'ektga yo'naltirilgan tahlil va dizayn (OOAD)


Tez orada siz Java-da dasturlar yozasiz. Kodni qanday yaratasiz (ya'ni, dastur
ko'rsatmalar) dasturlaringiz uchun? Ehtimol, ko'plab dasturchilar kabi, siz shunchaki yoqasiz

1.6 Operatsion tizimlar 13

kompyuteringizni yoqing va yozishni boshlang. Ushbu yondashuv kichik dasturlar uchun ishlashi mumkin (masalan
Biz kitobning dastlabki boblarida taqdim etamiz), lekin agar sizdan yumshoq dastur yaratish so'ralganda nima bo'ladi?
yirik bank uchun minglab avtomatlashtirilgan kassa apparatlarini boshqarish uchun buyum tizimi? Yoki qo'shimcha -
Sizdan keyingi dasturni yaratadigan 1000 ta dasturiy ta'minotni ishlab chiquvchilar jamoasida ishlashingiz so'ralgan
AQSh havo harakatini boshqarish tizimini yaratish? Juda katta va murakkab loyihalar uchun siz
shunchaki o'tirib dasturlar yozishni boshlamaslik kerak.
Eng yaxshi echimlarni yaratish uchun siz aniqlik kiritish uchun batafsil tahlil jarayoniga rioya qilishingiz kerak.
loyihangiz talablarini qazib olish (ya'ni, tizim nima qilishi kerakligini aniqlash) va
ularni qanoatlantiradigan dizaynni ishlab chiqish (ya'ni, tizim buni qanday qilish kerakligini ko'rsatish). Idea -
ittifoqdosh bo'lsangiz, siz ushbu jarayondan o'tib, dizaynni diqqat bilan ko'rib chiqasiz (va o'zingizning dizayningizga ega bo'lasiz
boshqa dasturiy ta'minot mutaxassislari tomonidan ko'rib chiqilgan) har qanday kod yozishdan oldin. Agar bu jarayonni o'z ichiga olsa
ob'ektga yo'naltirilgan nuqtai nazardan tizimingizni tahlil qilish va loyihalash, u deyiladi
ob'ektga yo'naltirilgan tahlil va dizayn (OOAD) jarayoni. Java kabi tillar obyekt or-
kiritilgan. Ob'ektga yo'naltirilgan dasturlash (OOP) deb ataladigan bunday tilda dasturlash
ob'ektga yo'naltirilgan dizaynni ishchi tizim sifatida amalga oshirish imkonini beradi.

1.5.11 UML (Unified Modeling Language)


Ko'p turli xil OOAD jarayonlari mavjud bo'lsa-da, aloqa uchun yagona grafik til mavjud.
har qanday OOAD jarayonining natijalarini aniqlash keng qo'llanila boshlandi. Birlashtirilgan modellashtirish
Til (UML) hozirda ob'ektni modellashtirish uchun eng keng tarqalgan grafik sxema hisoblanadi.
kiritilgan tizimlar. Biz birinchi UML diagrammalarimizni 3 va 4-boblarda taqdim etamiz, keyin ulardan foydalanamiz
11-bob orqali ob'ektga yo'naltirilgan dasturlashni chuqurroq ko'rib chiqamiz. Bizning variantimizda -
33-34-boblardagi onlayn ATM dasturiy ta'minot muhandisligi misolida biz oddiy misolni taqdim etamiz
UML xususiyatlarining kichik to'plami, chunki biz sizni ob'ektga yo'naltirilgan dizayn tajribasi orqali yo'naltiramiz.

1.6 Operatsion tizimlar


Operatsion tizimlar - bu kompyuterlardan foydalanishni biz uchun qulayroq qiladigan dasturiy tizimlar.
ers, dastur ishlab chiquvchilari va tizim ma'murlari. Ular har biriga imkon beradigan xizmatlarni taqdim etadilar
boshqa ilovalar bilan xavfsiz, samarali va bir vaqtda (ya'ni, parallel ravishda) bajarish uchun dastur
lar. Operatsion tizimning asosiy komponentlarini o'z ichiga olgan dasturiy ta'minot yadrodir.
Mashhur ish stoli operatsion tizimlariga Linux, Windows va Mac OS X kiradi. Mashhur mobil
Smartfonlar va planshetlarda qo'llaniladigan operatsion tizimlarga Google Android, Apple iOS tizimlari kiradi
(uning iPhone, iPad va iPod Touch qurilmalari uchun), Windows Phone 8 va BlackBerry OS.

1.6.1 Windows - xususiy operatsion tizim


1980-yillarning o'rtalarida Microsoft Windows operatsion tizimini ishlab chiqdi, u quyidagilardan iborat
DOS-da yaratilgan grafik foydalanuvchi interfeysi - juda mashhur shaxsiy kompyuter
foydalanuvchilar buyruqlar kiritish orqali o'zaro aloqada bo'lgan operatsion tizim. Windows qarzga olingan
Apple Macintosh tomonidan ommalashgan ko'plab tushunchalar (masalan, piktogrammalar, menyular va oynalar).
operatsion tizimlar va dastlab Xerox PARC tomonidan ishlab chiqilgan. Windows 8 Microsoft-ning lat-
est operatsion tizimi - uning xususiyatlariga shaxsiy kompyuter va planshetlarni qo'llab-quvvatlash, plitkalarga asoslangan foydalanuvchi interfeysi kiradi.
yuz, xavfsizlikni yaxshilash, sensorli ekran va multi-sensorli yordam va boshqalar. Windows
xususiy operatsion tizim bo'lib, u faqat Microsoft tomonidan boshqariladi. Bu hozirgacha
dunyodagi eng keng tarqalgan operatsion tizim.

14 1-bob Kompyuterlar, Internet va Java-ga kirish



1.6.2 Linux — ochiq kodli operatsion tizim
Serverlar, shaxsiy kompyuterlar va o'rnatishda mashhur bo'lgan Linux operatsion tizimi
ded tizimlari - bu ochiq manba harakatining eng katta muvaffaqiyatidir. ochiq -
manba dasturiy ta'minotini ishlab chiqish uslubi xususiy ishlab chiqish uslubidan (ishlatilgan,
masalan, Microsoft Windows va Apple Mac OS X bilan). Ochiq manbali de-
rivojlanish, jismoniy shaxslar va kompaniyalar - ko'pincha butun dunyo bo'ylab - rivojlanishda o'z sa'y-harakatlariga hissa qo'shadilar.
dasturiy ta'minotni ishlab chiqish, saqlash va rivojlantirish. Har kim uni o'zi uchun ishlatishi va sozlashi mumkin
o'z maqsadlari, odatda bepul. Java Development Kit va ko'plab tegishli Java
texnologiyalar endi ochiq manba hisoblanadi.
Ochiq manbalar hamjamiyatidagi ba'zi tashkilotlar Eclipse Foundation (
Eclipse Integrated Development Environment Java dasturchilariga qulay rivojlanishda yordam beradi
dasturiy ta'minot), Mozilla Foundation (Firefox veb-brauzerini yaratuvchilari), Apache Dasturi
Foundation (internet orqali veb-sahifalarni yetkazib beruvchi Apache veb-serverini yaratuvchilar
veb-brauzer so'rovlariga javob) va GitHub va SourceForge (asboblarni taqdim etadi)
ochiq manbali loyihalarni boshqarish uchun).
Hisoblash va aloqani tez yaxshilash, xarajatlarni kamaytirish va ochiq
manba dasturiy ta'minot dasturiy ta'minotga asoslangan biznesni yaratishni oson va tejamkor qildi.
bir necha o'n yillar oldingiga qaraganda hozir. Kollejdan boshlangan Facebook
yotoqxona xonasi, ochiq kodli dasturiy ta'minot bilan qurilgan.9
Turli xil muammolar - masalan, Microsoft-ning bozor kuchi, nisbatan kichik soni
foydalanuvchilar uchun qulay Linux ilovalari va Linux distributivlarining xilma-xilligi (Red Hat Linux,
Ubuntu Linux va boshqalar) - ish stolida Linuxdan keng foydalanishning oldini oldi.
qo'yuvchilar. Ammo Linux serverlarda va o'rnatilgan tizimlarda juda mashhur bo'ldi,
masalan, Google-ning Android-ga asoslangan smartfonlari.
1.6.3 Android
Android — eng tez rivojlanayotgan mobil va smartfon operatsion tizimi — ga asoslangan
Linux yadrosi va Java-dan foydalanadi. Tajribali Java dasturchilari tezda Android-ga sho'ng'iydilar
rivojlanish. Android ilovalarini ishlab chiqishning afzalliklaridan biri bu platformaning ochiqligi.
Operatsion tizim ochiq kodli va bepul.
Android operatsion tizimi sotib olingan Android, Inc. tomonidan ishlab chiqilgan
2005 yilda Google tomonidan. 2007 yilda Open Handset Alliance™ — hozirda 87 ta kompaniya mavjud.
butun dunyo bo'ylab a'zolar (http://www.openhandsetalliance.com/oha_members.html)—
Android-ni ishlab chiqish, qo'llab-quvvatlash va rivojlantirish uchun yaratilgan bo'lib, mobil texnologiyalarda innovatsiyalarni rag'batlantiradi.
nologiya va xarajatlarni kamaytirish bilan birga foydalanuvchi tajribasini yaxshilash. 2013 yil aprel holatiga ko'ra ko'proq
Har kuni 1,5 milliondan ortiq Android qurilmalari (smartfonlar, planshetlar va boshqalar) faollashtirildi.10
2013-yil oktabr oyiga kelib, Strategy Analytics hisoboti shuni ko'rsatdiki, Android 81,3% ga ega.
global smartfon bozori ulushi, Apple uchun 13,4%, Microsoft uchun 4,1% va
Blackberry.11 Android qurilmalari uchun 1% endi smartfonlar, planshetlar, elektron o'quvchilar, robotlar,
reaktiv dvigatellar, NASA sun'iy yo'ldoshlari, o'yin pristavkalari, muzlatgichlar, televizorlar, kameralar, sog'liqni saqlash

9. http://developers.facebook.com/opensource.


10. http://www.technobuffalo.com/2013/04/16/google-daily-android-activations-1-5-
million/.
11. http://blogs.strategyanalytics.com/WSS/post/2013/10/31/Android-Captures-Record-
2013-yilning 3-choragida global smartfon yetkazib berishning 81-foiz ulushi.aspx.

1.7 Dasturlash tillari 15

qurilmalar, aqlli soatlar, avtomobil ichidagi avtomobil axborot-ko'ngilochar tizimlari (
radio, GPS, telefon qo'ng'iroqlari, termostat va boshqalar) va boshqalar.12
Android smartfonlari mobil telefon, Internet mijozi (uchun
veb-brauzer va Internet aloqasi), MP3 pleer, o'yin konsoli, raqamli kamera
va boshqalar. Ushbu qo'l qurilmalari sizga imkon beruvchi to'liq rangli multitouch ekranlarga ega
qurilmani bir teginish yoki bir vaqtning o'zida bir nechta teginishni o'z ichiga olgan imo-ishoralar bilan boshqaring. Siz
ilovalarni Google Play va boshqa ilovalar orqali bevosita Android qurilmangizga yuklab olishingiz mumkin
bozorlar. Ushbu maqola yozilayotgan paytda Google Play-da bir milliondan ortiq ilovalar mavjud edi,
soni esa tez ortib bormoqda.13
Biz “Android How” darsligimizda Android ilovalarini ishlab chiqishga kirishni taqdim etamiz
Dasturga, Ikkinchi nashrga va bizning professional kitobimiz, Dasturchilar uchun Android: Ilova-
Boshqariladigan yondashuv, Ikkinchi nashr. Java tilini o'rganganingizdan so'ng uni boshlashingiz oson bo'ladi
Android ilovalarini ishlab chiqish va ishga tushirish. Ilovalaringizni Google Play-ga joylashtirishingiz mumkin
(play.google.com) va agar ular muvaffaqiyatli bo'lsa, siz hatto biznes ochishingiz mumkin. Shunchaki
Esingizda bo'lsin - Facebook, Microsoft va Dell kollej yotoqxonasidan ishga tushirilgan.
1.7 Dasturlash tillari
Ushbu bo'limda biz bir nechta mashhur dasturlash tillari haqida qisqacha sharh beramiz (1.5-rasm).
Keyingi bo'limda biz Java bilan tanishamiz.

12. http://www.businessweek.com/articles/2013-05-29/behind-the-internet-of-things-


bu-android-va-uning-hamma joyda.
13. http://en.wikipedia.org/wiki/Google_Play.

Dasturlash


til tavsifi

Fortran Fortran (FORmula TRANslator) o'rtalarida IBM korporatsiyasi tomonidan ishlab chiqilgan.


1950-yillar murakkab matematikani talab qiladigan ilmiy va muhandislik ilovalari uchun
hisob-kitoblar. U hali ham keng qo'llaniladi va uning so'nggi versiyalari ob'ektga yo'naltirilganlikni qo'llab-quvvatlaydi
dasturlash.
COBOL COBOL (Common Business Oriented Language) 1950-yillarning oxirida ishlab chiqilgan.
kompyuter ishlab chiqaruvchilari, AQSh hukumati va sanoat kompyuter foydalanuvchilari tomonidan
AQSh dengiz floti kontr-admirali Greys Xopper tomonidan ishlab chiqilgan tilga asoslangan
kompyuter fanining xalqaro standartlashtirish tarafdori.
grammatika tillari. COBOL hali ham tijorat dasturlari uchun keng qo'llaniladi
katta hajmdagi ma'lumotlar bilan aniq va samarali manipulyatsiya qilishni talab qiladi. Uning so'nggi versiyasi
ob'ektga yo'naltirilgan dasturlashni qo'llab-quvvatlaydi.
1960-yillarda Paskal tadqiqotlari natijasida tizimli dasturlash - intizomli yondashuv paydo bo'ldi
ga qaraganda aniqroq, sinovdan o'tkazish va disk raskadrovka qilish va o'zgartirish osonroq bo'lgan dasturlarni yozish
oldingi texnikalar bilan ishlab chiqarilgan katta dasturlar. Ushbu tadqiqot natijalaridan biri
1971 yilda ishlab chiqilgan Paskal dasturlash tili
tuzilgan dasturlashni o'rgatish uchun va bir necha kishi uchun kollej kurslarida mashhur bo'lgan
o'n yilliklar.

1.5-rasm | Boshqa ba'zi dasturlash tillari. (3-qismning 1-qismi.)


16 1-bob Kompyuterlar, Internet va Java-ga kirish



Paskal asosidagi Ada Ada AQSH departamenti homiyligida ishlab chiqilgan
1970-yillar va 1980-yillarning boshlarida Mudofaa vazirligi (DOD). DOD singlni xohladi
uning ko'p ehtiyojlarini qondiradigan til. Ada tili Lady nomi bilan atalgan
Ada Lavleys, shoir Lord Bayronning qizi. U yozganligi uchun hisoblangan
1800-yillarning boshlarida dunyodagi birinchi kompyuter dasturi (Analitik dvigatel uchun
Charlz Babbaj tomonidan ishlab chiqilgan mexanik hisoblash qurilmasi). Ada ham qo'llab-quvvatlaydi
ob'ektga yo'naltirilgan dasturlash.
Basic Basic 1960-yillarda Dartmut kollejida yangi boshlanuvchilarni tanishtirish uchun ishlab chiqilgan.
dasturlash texnikasi. Uning so'nggi versiyalarining aksariyati ob'ektga yo'naltirilgan.
CC 1970-yillarning boshlarida Bell Laboratoriesda Dennis Ritchie tomonidan ishlab chiqilgan. Dastlab
UNIX operatsion tizimini ishlab chiqish tili sifatida keng tanildi. Bugun,
umumiy maqsadli operatsion tizimlar uchun kodlarning aksariyati C yoki C++ da yozilgan.
C tiliga asoslangan C++ C++ 1980-yillarning boshlarida Bjarne Stroustrup tomonidan ishlab chiqilgan.
Bell laboratoriyalari. C ++ C tilini "ko'taradigan" bir nechta xususiyatlarni taqdim etadi, ammo
muhimroq, u ob'ektga yo'naltirilgan dasturlash imkoniyatlarini beradi.
Objective-C Objective-C C tiliga asoslangan yana bir ob'ektga yo'naltirilgan tildir
1980-yillarning boshi va keyinchalik NeXT tomonidan sotib olindi, bu esa o'z navbatida Apple tomonidan sotib olindi. Unda bor
OS X operatsion tizimi va barcha iOS-lar uchun asosiy dasturlash tiliga aylanish.
quvvatli qurilmalar (masalan, iPod, iPhone va iPad).
Visual Basic Microsoft-ning Visual Basic tili 1990-yillarning boshida soddalashtirish uchun kiritilgan
Microsoft Windows ilovalarini ishlab chiqish. Uning so'nggi versiyalari ob'ektni qo'llab-quvvatlaydi -
yo'naltirilgan dasturlash.
Visual C# Microsoft-ning uchta ob'ektga yo'naltirilgan asosiy dasturlash tillari Visual Basic hisoblanadi
(asl Basic asosida), Visual C++ (C++ asosida) va Visual C# (
C++ va Java tillari bo'lib, Internet va Internetni kompyuterga integratsiya qilish uchun ishlab chiqilgan
ilovalar).
PHP PHP, ob'ektga yo'naltirilgan, ochiq manbali skript tili, hamjamiyat tomonidan qo'llab-quvvatlanadi
foydalanuvchilar va ishlab chiquvchilar soni millionlab veb-saytlar tomonidan qo'llaniladi. PHP platformadan mustaqil
dent - ilovalar barcha asosiy UNIX, Linux, Mac va Windows operatsion tizimlari uchun mavjud.
ing tizimlari. PHP ko'plab ma'lumotlar bazalarini, shu jumladan mashhur ochiq manbani ham qo'llab-quvvatlaydi
MySQL.
Perl Perl (amaliy chiqarish va hisobot tili), eng keng tarqalgan ob'ektlardan biri -
veb-dasturlash uchun yo'naltirilgan skript tillari, 1987 yilda Larri tomonidan ishlab chiqilgan
Devor. U matnni qayta ishlashning boy imkoniyatlariga ega.
Python Python, boshqa ob'ektga yo'naltirilgan skript tili, 1991 yilda ommaviy ravishda chiqarildi.
Milliy matematika tadqiqot instituti xodimi Guido van Rossum tomonidan ishlab chiqilgan.
Amsterdamda (CWI) ics va Kompyuter fanlari, Python Moddan ko'p foydalanadi.
ula-3 — tizimli dasturlash tili. Python "kengaytirilishi mumkin" - uni kengaytirish mumkin
sinflar va dasturlash interfeyslari orqali.
JavaScript JavaScript eng keng tarqalgan skript tilidir. U birinchi navbatda qo'shish uchun ishlatiladi
veb-sahifalardagi dinamik xatti-harakatlar, masalan, animatsiyalar va yaxshilangan interaktiv
foydalanuvchi bilan. U barcha asosiy veb-brauzerlar bilan ta'minlangan.

Dasturlash


til tavsifi

1.5-rasm | Boshqa ba'zi dasturlash tillari. (3 qismning 2-qismi.)

www.allitebooks.com

1.8 Java 17

1.8 Java
Mikroprotsessor inqilobining bugungi kunga qadar eng muhim hissasi shundaki, u
shaxsiy kompyuterlarning rivojlanishi. Mikroprotsessorlar sanoatga katta ta'sir ko'rsatdi.
iste'molchi-elektron qurilmalar. Buni tan olgan holda, Sun Microsystems 1991 yilda fond-
Jeyms Gosling boshchiligidagi ichki korporativ tadqiqot loyihasi bo'lib, natijada C++-
Sun Java deb atagan ob'ektga asoslangan dasturlash tili.
Java tilining asosiy maqsadi turli xil dasturlarda ishlaydigan dasturlarni yozish imkoniyatiga ega bo'lishdir
kompyuter tizimlari va kompyuter tomonidan boshqariladigan qurilmalar. Bu ba'zan "bir marta yoz" deb ataladi.
istalgan joyga yugur."
Internet 1993 yilda mashhur bo'lib ketdi va Sun Java-dan foydalanish imkoniyatlarini ko'rdi
veb-sahifalarga interaktivlik va animatsiyalar kabi dinamik tarkibni qo'shing. Java chizdi
Internetga ajoyib qiziqish tufayli biznes hamjamiyatining e'tiborini tortdi. Java
Endi keng ko'lamli korporativ ilovalarni ishlab chiqish, funksionalligini oshirish uchun foydalaniladi
veb-serverlar (biz veb-brauzerlarimizda ko'riladigan tarkibni ta'minlaydigan kompyuterlar)
iste'molchi qurilmalari uchun ilovalar (uyali telefonlar, smartfonlar, televizor pristavkalari).
va boshqalar) va boshqa ko'plab maqsadlar uchun. Java ham rivojlanish uchun asosiy tildir
Android smartfon va planshet ilovalari. Sun Microsystems 2010 yilda Oracle tomonidan sotib olingan.
Java sinf kutubxonalari
Java dasturlaringizni yaratish uchun kerak bo'lgan har bir sinf va usulni yaratishingiz mumkin. Biroq,
Ko'pgina Java dasturchilari mavjud sinflar va usullarning boy to'plamlaridan foydalanadilar.
Java sinf kutubxonalaridagi ods, shuningdek, Java API (Application Programming
Interfeyslar).

1.9 Odatda Java ishlab chiqish muhiti


Endi biz Java dasturini yaratish va ishga tushirish bosqichlarini tushuntiramiz. Odatda beshtasi bor
bosqichlar - tahrirlash, kompilyatsiya qilish, yuklash, tekshirish va bajarish. Biz ularni Java kontekstida muhokama qilamiz

1990-yillarning oʻrtalarida yaratilgan Ruby on Rails Ruby ochiq manbali, obyektga yoʻnaltirilgan dasturlashdir.


Pythonga o'xshash oddiy sintaksisga ega til. Ruby on Rails ni birlashtiradi
tomonidan ishlab chiqilgan Rails veb-ilovalar ramkasi bilan Ruby skript tili
37 Signallar. Ularning "Haqiqatga erishish" kitobi (gettingreal.37signals.com/toc.php)
veb-ishlab chiquvchilar uchun o'qish kerak. Ko'pgina Ruby on Rails dasturchilari pro-
Ma'lumotlar bazasini talab qiluvchi veb-ilovalarni ishlab chiqishda boshqa tillarga nisbatan o'tkazuvchanlik oshadi.
kationlar.

Ishlash bo'yicha maslahat 1.1


O'z versiyalaringizni yozish o'rniga Java API sinflari va usullaridan foydalanish pro-texnikani yaxshilashi mumkin.
gramm ishlashi, chunki ular samarali ishlash uchun ehtiyotkorlik bilan yozilgan. Bu ham qisqa -
dasturni ishlab chiqish vaqti.

Dasturlash


til tavsifi

1.5-rasm | Boshqa ba'zi dasturlash tillari. (3 qismning 3-qismi.)


18 1-bob Kompyuterlar, Internet va Java-ga kirish

SE 8 Development Kit (JDK). Pastga oid ma'lumot uchun Boshlashdan oldin bo'limiga qarang.
Windows, Linux va OS X da JDK ni yuklash va o'rnatish.
1-bosqich: Dastur yaratish
1-bosqich odatda oddiygina muharrir sifatida tanilgan muharrir dasturi yordamida faylni tahrirlashdan iborat
(1.6-rasm). Tahrirlovchidan foydalanib, siz Java dasturini yozasiz (odatda manba kodi deb ataladi),
kerakli tuzatishlarni kiriting va uni qattiq qurilmangiz kabi ikkilamchi xotira qurilmasiga saqlang
haydash. Java manba kodi fayllariga .java kengaytmasi bilan tugaydigan nom beriladi, bu esa ko'rsatadi
fayl Java manba kodini o'z ichiga oladi.

Linux tizimlarida keng qo'llaniladigan ikkita muharrir vi va emacs. Windows taqdim etadi


Bloknot. OS X TextEdit dasturini taqdim etadi. Ko'pgina bepul va umumiy muharrirlar ham mavjud
onlayn, shu jumladan Notepad++ (notepad-plus-plus.org), EditPlus (www.editplus.com),
TextPad (www.textpad.com) va jEdit (www.jedit.org).
Integratsiyalashgan ishlab chiqish muhitlari (IDE) dasturiy ta'minotni qo'llab-quvvatlaydigan vositalarni taqdim etadi.
mantiqiy xatolarni aniqlash uchun muharrirlar, tuzatuvchilar kabi mahsulotlarni ishlab chiqish jarayoni (xatolar)
dasturlarning noto'g'ri bajarilishiga olib keladi) va boshqalar. Ko'plab mashhur Java IDElar mavjud,
shu jumladan:
• Eclipse (www.eclipse.org)
• NetBeans (www.netbeans.org)
• IntelliJ IDEA (www.jetbrains.com)
Kitobning veb-saytida

biz sizga ushbu kitobning Java ilovalarini qanday bajarishni ko'rsatadigan Dive-Into® videolarini taqdim etamiz


va Eclipse, NetBeans va IntelliJ IDEA bilan yangi Java ilovalarini qanday ishlab chiqish.
2-bosqich: Java dasturini bayt kodlariga kompilyatsiya qilish
2-bosqichda siz dasturni kompilyatsiya qilish uchun javac (Java kompilyatori) buyrug'idan foydalanasiz
(1.7-rasm). Masalan, Welcome.java deb nomlangan dasturni kompilyatsiya qilish uchun siz terishingiz kerak

tizimingizning buyruqlar oynasida (ya'ni, Windows-dagi buyruq satri, Terminal


OS X da ilova) yoki Linux qobig'i (Linuxning ba'zi versiyalarida Terminal deb ham ataladi). Agar
dastur kompilyatsiya qiladi, kompilyator Welcome.class deb nomlangan .class faylini ishlab chiqaradi
kompilyatsiya qilingan versiyani o'z ichiga oladi. IDE odatda menyu elementini taqdim etadi, masalan, Build yoki Make,
bu siz uchun javac buyrug'ini chaqiradi. Agar kompilyator xatolarni aniqlasa, siz borishingiz kerak bo'ladi
1-bosqichga qayting va ularni tuzating. 2-bobda biz xatolar turlari haqida ko'proq gapiramiz
kompilyator aniqlay oladi.

1.6-rasm | Odatda Java ishlab chiqish muhiti - tahrirlash bosqichi.

www.deitel.com/books/jhtp10

javac Welcome.java

Disk

muharrir


Dastur ichida yaratilgan
muharriri va diskda saqlanadi
nomi tugaydigan fayl
.java bilan

1-bosqich: Tahrirlash


1.9 Odatda Java ishlab chiqish muhiti 19

Java kompilyatori Java manba kodini vazifalarni ifodalovchi bayt-kodlarga tarjima qiladi
bajarish bosqichida (5-bosqich) bajarish. Java virtual mashinasi (JVM) - bir qismi
JDK va Java platformasining asosi - bayt kodlarini bajaradi. Virtual mashina
(VM) bu kompyuterni taqlid qiladigan, lekin asosiy operatsiyani yashiradigan dasturiy dastur.
u bilan o'zaro aloqada bo'lgan dasturlardan tizim va apparat ta'minoti. Agar xuddi shu VM bo'lsa
ko'p kompyuter platformalarida amalga oshirilgan, bunday turdagi VM uchun yozilgan ilovalar mumkin
barcha platformalarda foydalanish mumkin. JVM eng keng tarqalgan virtual mashinalardan biridir.
Microsoft-ning .NET-da xuddi shunday virtual-mashina arxitekturasidan foydalaniladi.
Platformaga bog'liq bo'lgan mashina tilidagi ko'rsatmalardan farqli o'laroq (ya'ni,
Muayyan kompyuter uskunasida dent), bayt-kod ko'rsatmalari platformadan mustaqil. Shunday qilib,
Java-ning bayt-kodlari portativdir - manba kodini qayta kompilyatsiya qilmasdan, xuddi shu bayt-kod
ko'rsatmalar versiyani tushunadigan JVM ni o'z ichiga olgan har qanday platformada bajarilishi mumkin
bayt kodlari tuzilgan Java. JVM java buyrug'i bilan chaqiriladi.
Masalan, Welcome deb nomlangan Java dasturini bajarish uchun siz buyruqni kiritasiz

JVM ni chaqirish uchun buyruqlar oynasida, keyin kerakli qadamlarni boshlaydi


ilovani bajarish uchun. Bu 3-bosqich boshlanadi. IDElar odatda menyu bandini taqdim etadi, masalan
Run sifatida, bu siz uchun java buyrug'ini chaqiradi.

3-bosqich: Dasturni xotiraga yuklash


3-bosqichda JVM dasturni bajarish uchun uni xotiraga joylashtiradi - bu yuklash deb nomlanadi.
(1.8-rasm).JVM sinf yuklagichi dastur baytini o'z ichiga olgan .class fayllarini oladi.
kodlaydi va ularni asosiy xotiraga o'tkazadi. Shuningdek, u taqdim etilgan har qanday .class fayllarini yuklaydi
dasturingiz foydalanadigan Java tomonidan. .class fayllari tizimingizdagi diskdan yuklanishi mumkin
yoki tarmoq orqali (masalan, mahalliy kollej yoki kompaniya tarmog'i yoki Internet).

1.7-rasm | Odatda Java ishlab chiqish muhiti - kompilyatsiya bosqichi.

java Xush kelibsiz

1.8-rasm | Odatda Java ishlab chiqish muhiti - yuklash bosqichi.

Disk

Kompilyator



Kompilyator bayt kodlarini yaratadi
va ularni diskda saqlaydi
nomi tugaydigan fayl
.class bilan

2-bosqich: kompilyatsiya qilish

Disk

Class Loader Class loader o'qiydi


.class fayllari
bayt kodlarini o'z ichiga oladi
diskdan va putlardan
bu bayt kodlari
xotira

3-bosqich: yuk

Asosiy
Xotira

...

20 1-bob Kompyuterlar, Internet va Java-ga kirish

4-bosqich: bayt kodini tekshirish


4-bosqichda sinflar yuklanganda bayt-kod tekshirgichi ularning bayt kodlarini tekshiradi.
ularning haqiqiy ekanligiga va Java xavfsizlik cheklovlarini buzmasligiga ishonch hosil qiling (1.9-rasm). Java majbur qiladi
tarmoq orqali kelgan Java dasturlari zarar bermasligiga ishonch hosil qilish uchun kuchli xavfsizlik
fayllaringiz yoki tizimingiz (kompyuter viruslari va qurtlari kabi).

5-bosqich: Bajarish


5-bosqichda JVM dasturning bayt kodlarini bajaradi va shu bilan belgilangan amallarni bajaradi.
dastur bo'yicha (1.10-rasm). Dastlabki Java versiyalarida JVM oddiygina Java uchun tarjimon edi
bayt kodlari. Ko'pgina Java dasturlari sekin ishlaydi, chunki JVM va
bir vaqtning o'zida bitta bayt kodini bajaring. Ba'zi zamonaviy kompyuter arxitekturalari bir nechta in-
parallel konstruktsiyalar. Bugungi JVM'lar odatda bayt-kodlarni birlashmasidan foydalanib bajaradi.
talqin qilish va o'z vaqtida (JIT) kompilyatsiya deb ataladigan. Bu jarayonda JVM tahlil qiladi
bayt-kodlar, ular talqin qilinayotganda, issiq nuqtalarni qidiradi - bayt-kodlarning bajariladigan qismlari
tez-tez yoqimli. Bu qismlar uchun Oracle's Java kabi bir vaqtning o'zida (JIT) kompilyator
HotSpot™ kompilyatori bayt kodlarini asosiy kompyuterning mashina lanasiga tarjima qiladi.
til. JVM ushbu kompilyatsiya qilingan qismlarga yana duch kelganda, tezroq mashina tili
kod bajariladi. Shunday qilib, Java dasturlari aslida ikkita kompilyatsiya bosqichidan o'tadi - biri
qaysi manba kodi bayt-kodlarga tarjima qilingan (turli aloqalardagi JVMlar bo'ylab ko'chirish uchun).
puter platformalari) va ikkinchisi, unda bajarish paytida bayt kodlari tarjima qilinadi
dastur bajariladigan haqiqiy kompyuter uchun mashina tili.

Amalga oshirish vaqtida yuzaga kelishi mumkin bo'lgan muammolar


Dasturlar birinchi urinishda ishlamasligi mumkin. Oldingi bosqichlarning har biri muvaffaqiyatsiz bo'lishi mumkin
Biz ushbu kitob davomida muhokama qiladigan turli xatolar. Masalan, bajaruvchi dastur

1.9-rasm | Odatda Java ishlab chiqish muhiti - tekshirish bosqichi.

1.10-rasm | Odatda Java ishlab chiqish muhiti - bajarish bosqichi.

Bytecode Verifier

Bayt-kod tekshiruvi
hammasini tasdiqlaydi
bayt kodlari amal qiladi va
Java-ni buzmang
xavfsizlik cheklovlari

4-bosqich: tasdiqlang

...

Asosiy
Xotira



Java virtual mashinasi (JVM)

Asosiy
Xotira

5-bosqich: Bajarish

Dasturni bajarish uchun


JVM bayt kodlarini o'qiydi va
o'z vaqtida (JIT) kompilyatsiya qiladi
(ya'ni, tarjima qiladi) ularni a
kompyuterning tili
tushuna oladi. Sifatida
dastur ishlaydi, u saqlashi mumkin
birlamchi ma'lumotlar qiymatlari
xotira.

...

1.10 Java dasturini sinovdan o'tkazish 21

nolga bo'lishga harakat qilishi mumkin (Javada butun sonli arifmetika uchun noqonuniy operatsiya).


Bu Java dasturining xato xabarini ko'rsatishiga olib keladi. Agar bu sodir bo'lsa, siz
Tahrirlash bosqichiga qaytish, kerakli tuzatishlarni kiritish va davom ettirish kerak
tuzatishlar muammo(lar)ni hal qilganligini aniqlash uchun qolgan bosqichlarni yana o'tkazing. [Eslatma:
Java-dagi aksariyat dasturlar ma'lumotlarni kiritish yoki chiqarish. Dastur xabarni ko'rsatadi, desak,
Sage, biz odatda bu xabarni kompyuteringiz ekranida ko'rsatishini nazarda tutamiz. Xabarlar
va boshqa ma'lumotlar disklar va qog'oz printerlar kabi boshqa qurilmalarga chiqarilishi mumkin
boshqa kompyuterlarga uzatish uchun tarmoqqa.]

1.10 Java dasturini sinovdan o'tkazish


Ushbu bo'limda siz birinchi Java ilovangizni ishga tushirasiz va u bilan o'zaro aloqada bo'lasiz. Rassom arizasi -
bir nechta mashqlar davomida quradigan katyon sizga sichqonchani sudrab borish imkonini beradi
"bo'yash". Bu yerda ko‘rib turgan elementlar va funksionallik siz o‘rganadigan narsalarga xosdir
ushbu kitobdagi dastur. Painterning grafik foydalanuvchi interfeysi (GUI) yordamida siz boshqarishingiz mumkin
chizilgan rang, chiziladigan shakl (chiziq, to'rtburchak yoki tasvirlar) va shakl to'ldirilganmi
chizilgan rang bilan. Shuningdek, siz chizmaga qo'shgan oxirgi shaklni bekor qilishingiz yoki tozalashingiz mumkin
butun chizma. [Izoh: Biz xususiyatlarni farqlash uchun shriftlardan foydalanamiz. Bizning konventsiyamiz
sarlavhalar va menyular (masalan, Fayl menyusi) kabi ekran xususiyatlarini yarim qalin bilan ta'kidlashdir
sans-serif Helvetica shrifti va ekrandan tashqari elementlarni ta'kidlash uchun, masalan, fayl nomlari, pro-
gramm kodi yoki kiritish (masalan, ProgramName.java), sans-serif Lucida shriftida.]
Ushbu bo'limdagi qadamlar sizga Painter ilovasini buyruqdan qanday bajarish kerakligini ko'rsatadi
Tizimingizda so'rov (Windows), Terminal (OS X) yoki qobiq (Linux) oynasi.
Kitob davomida biz bu oynalarni oddiygina buyruq oynalari deb yuritamiz. Bajarish
Tabassumni chizish uchun Painter ilovasidan foydalanish uchun quyidagi amallarni bajaring:
1. Sozlash tekshirilmoqda. Ishga tushganingizni tasdiqlash uchun Boshlashdan oldin bo'limni o'qing
Java-ni kompyuteringizda to'g'ri o'rnating, kitob misollarini ko'chirgansiz
qattiq diskingizga o'ting va siz o'zingizning buyruqlar oynasini qanday ochishni bilasiz
tizimi.
2. Tugallangan ilova katalogiga o'tish. Buyruqlar oynasini oching va
Painter katalogiga (papka deb ham ataladi) o'tish uchun cd buyrug'idan foydalaning
ilova. Biz kitob misollari C:\examples on da joylashgan deb taxmin qilamiz
Windows yoki Linux/OS X da foydalanuvchi hisobingizning Hujjatlar/misollar jildida.
Windows tizimida cd C:\examples\ch01\painter-ni kiriting va Enter tugmasini bosing. Linuxda/
OS X, cd ~/Documents/examples/ch01/painter yozing, so'ng Enter tugmasini bosing.
3. Painter dasturini ishga tushirish. Eslatib o'tamiz, java buyrug'i, undan keyin
ilovaning .class faylining nomi (bu holda, Painter), dasturni bajaradi.
kation. Ilovani ishga tushirish uchun java Painter buyrug'ini kiriting va Enter tugmasini bosing.
1.11-rasmda mos ravishda Windows, Linux va OS X da ishlaydigan ilova ko'rsatilgan.
ly - biz joyni tejash uchun derazalarni qisqartirdik.

Umumiy dasturlash xatosi 1.1


Nolga bo'linish kabi xatolar dastur ishga tushganda sodir bo'ladi, shuning uchun ular ish vaqti xatolari deb ataladi.
yoki bajarilish vaqtidagi xatolar. Ish vaqti xatosi dasturlarning darhol tugatilishiga olib keladi
o'z vazifalarini muvaffaqiyatli bajarmagan holda. Ish vaqti xatosi pro-
grammni yakunlash uchun ishlatish, ko'pincha noto'g'ri natijalarni keltirib chiqaradi.

22 1-bob Kompyuterlar, Internet va Java-ga kirish

[Izoh: Java buyruqlari katta-kichik harflarga sezgir, ya'ni katta harflar boshqacha
kichik harflardan. Bu ilova nomini shunday yozish muhim
Bosh harf P bilan bo'yashchi. Aks holda, dastur bajarilmaydi. Belgilash
java buyrug'idan foydalanganda .class kengaytmasi xatoga olib keladi. Bundan tashqari, agar
Siz xato xabarini olasiz, “Main” java.lang.No-dagi istisno
ClassDefFoundError: Painter," tizimingizda CLASSPATH muammosi bor. Iltimos
Ushbu muammoni hal qilishga yordam beradigan ko'rsatmalar uchun Boshlashdan oldin bo'limiga qarang.]
4. Yuz uchun to'ldirilgan sariq ovalni chizish. Chizma rangi sifatida Sariqni tanlang, Oval
shakl sifatida belgilang va To'ldirilgan katagiga belgi qo'ying, so'ngra katta rasm chizish uchun sichqonchani torting
oval (1.12-rasm).

1.11-rasm | Windows 7, Linux va OS X da bajariladigan Painter ilovasi.

a) Windows da ishlovchi Painter dasturi

Yopish tugmasi

Rang tanlang
Shaklni tanlang
Belgilang
a
to'rtburchak yoki
oval bilan to'ldirilgan
rang bilan

ni tozalang


butun chizma

Oxirgisini bekor qiling


shakl edi
ga qo'shiladi
chizish

b) Linuxda ishlaydigan Painter ilovasi.

Yopish
tugmasi

c) OS X da ishlovchi Painter ilovasi.

Yopish
tugmasi

1.10 Java dasturini sinovdan o'tkazish 23

5. Moviy ko'zlarni chizish. Chizma rangi sifatida Moviyni tanlang, so'ngra ikkita kichik ovalni chizing
ko'zlar (1.13-rasm).

6. Qora qosh va burunni chizish. Chizma rangi sifatida Qora va Chiziqni tanlang


shakli sifatida, keyin qosh va burun chizish (1.14-rasm). Satrlarda plomba yo'q,
shuning uchun "To'ldirilgan" katagiga belgi qo'yish chiziqlar chizishda hech qanday ta'sir qilmaydi.

1.12-rasm | Yuz uchun to'ldirilgan sariq ovalni chizish.

1.13-rasm | Moviy ko'zlarni chizish.

24 1-bob Kompyuterlar, Internet va Java-ga kirish

7. Magenta og'zini chizish. Chizma rangi sifatida Magenta va tasvir sifatida ovalni tanlang
shakl, keyin og'iz chizish (1.15-rasm).

8. Tabassum qilish uchun og'izga sariq oval chizish. Chizma sifatida Sariqni tanlang


rang, so'ngra magenta ovalni tabassumga aylantirish uchun ovalni torting (1.16-rasm).

1.14-rasm | Qora qoshlar va burunni chizish.

1.15-rasm | Magenta og'zini chizish.

1.11 Internet va World Wide Web 25

9. Painter ilovasidan chiqish. Painter ilovasidan chiqish uchun Yopish tugmasini bosing
tugmasi (Windows-da oynaning yuqori o'ng burchagida va yuqori chap burchakda)
Linux va OS X da). Oynani yopish Painter ilovasini ishga tushiradi
tugatish.
1.11 Internet va World Wide Web
1960-yillarning oxirida ARPA - Qo'shma Shtatlarning ilg'or tadqiqot loyihalari agentligi
Mudofaa bo'limi - asosiy kompyuter tizimlarini tarmoqqa ulash rejalarini ishlab chiqdi.
ARPA tomonidan moliyalashtirilgan o'nga yaqin universitet va tadqiqot institutlari. Kompyuterlar
50 000 tezlikda ishlaydigan aloqa liniyalari bilan bog'lanishi kerak edi
sekundiga bit, ko'pchilik odamlar (hatto tarmoqqa ega bo'lgan bir necha kishidan) bir vaqtning o'zida ajoyib tezlik.
Ishchi kirish) telefon liniyalari orqali kompyuterlarga 110 bit tezlikda ulangan
ikkinchi. Akademik tadqiqotlar oldinga katta qadam tashlamoqchi edi. ARPA ishni davom ettirdi
Tez orada ARPANET nomi bilan mashhur bo'lgan, bugungi Internetning kashshofi.
Bugungi kundagi eng tez internet tezligi soniyasiga milliardlab bitni tashkil etadi va trillion-
ufqda soniyasiga bit tezlik!
Ishlar dastlabki rejadan farqli ravishda amalga oshirildi. Garchi ARPANET
tadqiqotchilarga o'z kompyuterlarini tarmoqqa o'tkazish imkoniyatini berdi, uning asosiy foydasi - bu sig'im edi.
elektron pochta (elektron pochta) orqali tez va oson muloqot qilish qobiliyati.
pochta). Bu elektron pochta, lahzali xabar almashish, fayllarni uzatish kabi bugungi Internetda ham to'g'ri
va Facebook va Twitter kabi ijtimoiy tarmoqlar butun dunyo bo'ylab milliardlab odamlarga imkon beradi
tez va oson muloqot qiling.
ARPANET orqali muloqot qilish uchun protokol (qoidalar to'plami) deb nomlandi
Transmissiyani boshqarish protokoli (TCP). TCP dan iborat xabarlarni ta'minladi
paketlar deb ataladigan ketma-ket raqamlangan qismlar jo'natuvchidan qabul qiluvchiga to'g'ri yo'naltirilgan;
buzilmagan holda keldi va to'g'ri tartibda yig'ildi.

1.16-rasm | Tabassum qilish uchun og'ziga sariq oval chizish.


26 1-bob Kompyuterlar, Internet va Java-ga kirish



1.11.1 Internet: Tarmoqlar tarmog'i
Internetning dastlabki evolyutsiyasiga parallel ravishda butun dunyo bo'ylab tashkilotlar amalga oshirildi:
ikkala tashkilot ichidagi (ya'ni tashkilot ichida) o'z tarmoqlarini eslatib o'tish
va tashkilotlararo (ya'ni tashkilotlar o'rtasidagi) aloqa. Katta xilma-xillik
tarmoq apparat va dasturiy ta'minoti paydo bo'ldi. Muammolardan biri bu turli xil imkoniyatlarni yaratish edi
bir-biri bilan aloqa qilish uchun tarmoqlar. ARPA bunga In-ni ishlab chiqish orqali erishdi.
haqiqiy "tarmoqlar tarmog'i" ni yaratgan ternet Protocol (IP), joriy arxitektura
Internetdan. Protokollarning birlashtirilgan to'plami endi TCP/IP deb ataladi.
Korxonalar Internetdan foydalanish orqali o'z faoliyatlarini yaxshilashlari mumkinligini tezda angladilar.
va mijozlarga yangi va yaxshiroq xizmatlarni taklif qiladi. Kompaniyalar katta mablag' sarflashni boshladilar
ularning Internetdagi mavjudligini rivojlantirish va yaxshilash uchun pul miqdori. Bu shiddatni keltirib chiqardi
aloqa operatorlari va apparat va dasturiy ta'minot etkazib beruvchilari o'rtasidagi raqobat
infratuzilmaga talabning ortishi. Natijada, tarmoqli kengligi - ma'lumot tashuvchisi
Internet tarmog'ida aloqa liniyalarining sig'imi sezilarli darajada oshdi
apparat xarajatlari keskin kamaydi.
1.11.2 World Wide Web: Internetni foydalanuvchilarga qulay qilish
World Wide Web (shunchaki "veb" deb ataladi) apparat va dasturiy ta'minot to'plamidir
kompyuter foydalanuvchilariga multimedia asosidagi joylashuvni aniqlash va ko'rish imkonini beruvchi Internet bilan bog'langan
hujjatlar (matn, grafik, animatsiya, audio va boshqalarning turli kombinatsiyalariga ega hujjatlar).
videolar) deyarli har qanday mavzuda. Internetning joriy etilishi nisbatan yaqinda sodir bo'lgan voqea edi. In
1989 yil, Tim Berners-Li CERN (Yevropa yadroviy tadqiqotlar tashkiloti) ish boshladi.
"giperbog'langan" matnli hujjatlar orqali ma'lumot almashish texnologiyasini ishlab chiqish. Berners -
Li o'z ixtirosini HyperText Markup Language (HTML) deb atadi. U ham yozgan -
magistralni yaratish uchun HyperText Transfer Protocol (HTTP) kabi aloqa protokollari
o'zining yangi gipermatnli ma'lumot tizimi, u World Wide Web deb ataydi.
1994 yilda Berners-Li World Wide Web Consor deb nomlangan tashkilotga asos soldi.
tium (W3C, www.w3.org), veb-texnologiyalarni rivojlantirishga bag'ishlangan. W3C-lardan biri
asosiy maqsadlari - nogironligidan qat'i nazar, Internetni hamma uchun ochiq qilish.
aloqalar, til yoki madaniyat. Ushbu kitobda siz Java-dan veb-ga asoslangan ilovalarni yaratish uchun foydalanasiz.
1.11.3 Veb-xizmatlar va Mashuplar
Onlayn 32-bobda biz veb-xizmatlarning muhim ko'rinishini o'z ichiga olamiz (1.17-rasm). The
ilovalar - mashuplarni ishlab chiqish metodologiyasi sizga quvvatni jadal rivojlantirishga imkon beradi -
(ko'pincha bepul) qo'shimcha veb-xizmatlar va boshqalarni birlashtirgan holda to'liq dasturiy ta'minot ilovalari
axborot tasmasi shakllari. Birinchi mashuplardan biri ko'chmas mulk ro'yxatini birlashtirgan.
www.craigslist.org tomonidan taqdim etilgan Google Xaritalarning xaritalarni taklif qilish imkoniyatlari bilan
ma'lum bir hududda sotiladigan yoki ijaraga beriladigan uylarning joylashuvi ko'rsatilgan.

Veb-xizmatlar manbasi U qanday ishlatiladi

Google Xaritalarni xaritalash xizmatlari
Twitter mikrobloglari
1.17-rasm | Ba'zi mashhur veb-xizmatlar (www.programmableweb.com/apis/
katalog/1?sort=mashups). (2-qismning 1-qismi.)

www.allitebooks.com


1.11 Internet va World Wide Web 27

1.11.4 Ajax
Ajax Internetga asoslangan ilovalarni ish stoli ilovalari kabi bajarishga yordam beradi - bu qiyin vazifa,
ma'lumotlar oldinga va orqaga uzatilishi sababli bunday ilovalar uzatish kechikishlariga duchor bo'lishini hisobga olsak
kompyuteringiz va Internetdagi server kompyuterlaringiz o'rtasida. Ajax, ilovalardan foydalanish
Google Xaritalar kabi ajoyib ishlashga erishdi va tashqi ko'rinishga yaqinlashdi
ish stoli ilovalari. Garchi biz "xom" Ajax dasturlashni muhokama qilmasak ham (bu juda ko'p
murakkab) ushbu matnda biz onlayn 31-bobda Ajax-ni qo'llab-quvvatlaydigan ilovalarni qanday yaratishni ko'rsatamiz.
JavaServer Faces (JSF) Ajax-ni yoqadigan komponentlardan foydalangan holda kationlar.

1.11.5 Narsalar interneti


Internet endi shunchaki kompyuterlar tarmog'i emas, balki bu narsalar Interneti. Narsa
IP-manzilga ega bo'lgan va ma'lumotlarni tarmoq orqali avtomatik ravishda yuborish qobiliyatiga ega har qanday ob'ekt.
ish, masalan, yo'l haqini to'lash uchun transponderi bo'lgan mashina, korpusga yurak monitori o'rnatilgan.
man, energiya sarfi haqida hisobot beruvchi aqlli hisoblagich, harakatingizni kuzata oladigan mobil ilovalar
joylashuvi va xona haroratini ob-havo sharoitiga qarab sozlaydigan aqlli termostatlar
aktyorlar va uydagi faoliyat. Tarmoqqa ulangan ilovalarni yaratish uchun IP manzillaridan foydalanasiz
onlayn 28-bob.

YouTube video qidiruvi


Facebook ijtimoiy tarmog'i
Instagram fotosuratlarini almashish
Foursquare Mobile ro'yxatdan o'tish
Biznes uchun LinkedIn ijtimoiy tarmog'i
Groupon ijtimoiy tijorat
Netflix filmlar ijarasi
eBay Internet auktsionlari
Vikipediya hamkorlik ensiklopediyasi
PayPal to'lovlari
Last.fm Internet radio
Kitoblar va boshqa ko'plab mahsulotlar uchun Amazon elektron tijorat xaridlari
Salesforce.com mijozlar bilan munosabatlarni boshqarish (CRM)
Skype Internet telefoniya
Microsoft Bing qidiruvi
Flickr foto almashish
Zillow ko'chmas mulk narxlari
Yahoo qidiruvi
WeatherBug Ob-havo

Veb-xizmatlar manbasi U qanday ishlatiladi

1.17-rasm | Ba'zi mashhur veb-xizmatlar (www.programmableweb.com/apis/
katalog/1?sort=mashups). (2-qismning 2-qismi.)

28 1-bob Kompyuterlar, Internet va Java-ga kirish

1.12 Dasturiy ta'minot texnologiyalari
1.18-rasmda dasturiy ta'minotni ishlab chiqishda eshitishingiz mumkin bo'lgan bir qator mashhur so'zlar keltirilgan.
jamoat. Biz ushbu mavzularning ko‘pchiligi bo‘yicha Resurs markazlarini yaratdik, ko‘plari esa yo‘lda.

Texnologiya tavsifi

Agile dasturiy ta'minot
rivojlanish

Agile dasturiy ta'minotni ishlab chiqish - bu yumshoqlikka erishishga harakat qiladigan metodologiyalar to'plami.


mahsulotlar tezroq va kamroq resurslardan foydalangan holda amalga oshiriladi. Agile-ni tekshiring
Alliance (www.agilealliance.org) va Agile Manifesti
(www.agilemanifesto.org).
Refaktoring Refaktoring dasturlarni aniqroq va osonroq qilish uchun qayta ishlashni o'z ichiga oladi
ularning to'g'riligi va funksionalligini saqlagan holda saqlang. U keng tarqalgan
agile rivojlanish metodologiyalari bilan qo'llaniladi. Ko'p IDE o'z ichiga oladi
qayta ishlashning asosiy qismlarini avtomatik ravishda bajarish uchun o'rnatilgan refaktoring vositalari.
Dizayn naqshlari Dizayn naqshlari moslashuvchan va qurish uchun tasdiqlangan arxitekturadir
saqlanishi mumkin bo'lgan ob'ektga yo'naltirilgan dasturiy ta'minot. Dizayn naqshlari sohasi bunga harakat qiladi
dasturiy ta'minot dizaynerlarini qayta foydalanishga undaydigan takrorlanuvchi naqshlarni sanab o'ting
kamroq vaqt, pul va kuch sarflagan holda sifatli dasturiy ta'minotni ishlab chiqish.
Onlayn N ilovasida Java dizayn naqshlarini muhokama qilamiz.
LAMP LAMP - bu ko'pchilik ishlab chiqadigan ochiq manbali texnologiyalarning qisqartmasi.
Ular veb-ilovalarni yaratish uchun foydalanadilar - bu Linux, Apache, MySQL va
PHP (yoki Perl yoki Python — ikkita boshqa skript tillari). MySQL - bu
ochiq manbali ma'lumotlar bazasini boshqarish tizimi. PHP eng mashhur ochiq tildir.
veb-ilovalarni ishlab chiqish uchun manba server tomonidagi "skript" tili.
Apache eng mashhur veb-server dasturidir. Win uchun ekvivalent -
dowsni ishlab chiqish WAMP - Windows, Apache, MySQL va PHP.
Dasturiy ta'minot sifatida
Xizmat (SaaS)

Dasturiy ta'minot odatda mahsulot sifatida ko'rib chiqildi; ko'pchilik dasturiy ta'minot hali ham


shu tarzda taklif qildi. Agar siz dasturni ishga tushirmoqchi bo'lsangiz, dasturiy ta'minotni sotib olasiz
dasturiy ta'minot sotuvchisidan paket - ko'pincha CD, DVD yoki veb-yuklab olish.
Keyin ushbu dasturni kompyuteringizga o'rnatasiz va kerak bo'lganda uni ishga tushirasiz. Sifatida
yangi versiyalar paydo bo'lganda, siz dasturiy ta'minotingizni ko'pincha katta xarajat evaziga yangilaysiz
vaqt va pulda. Bu jarayon tashkilotchilar uchun mashaqqatli bo'lishi mumkin.
Turli xil massivlarda o'n minglab tizimlarni saqlab turishi kerak
kompyuter uskunalari. Software as a Service (SaaS) bilan dastur ishlaydi
Internetdagi boshqa serverlarda. Ushbu server yangilanganda, barcha kli-
butun dunyo bo'ylab ents yangi imkoniyatlarni ko'rish - mahalliy o'rnatish kerak emas.
Siz xizmatga brauzer orqali kirasiz. Brauzerlar juda ko'chma, shuning uchun
dan turli xil kompyuterlarda bir xil ilovalarni ishga tushirishingiz mumkin
dunyoning istalgan nuqtasida. Salesforce.com, Google va Microsoft Office Live
va Windows Live hammasi SaaSni taklif qiladi.

Platforma sifatida


Xizmat (PaaS)

Platforma as a Service (PaaS) ishlab chiqish uchun hisoblash platformasini taqdim etadi


va ilovalarni oʻrnatishdan koʻra, internet orqali xizmat sifatida ishga tushirish
kompyuteringizdagi vositalar. Ba'zi PaaS provayderlari Google App Engine,
Amazon EC2 va Windows Azure™.

1.18-rasm | Dasturiy ta'minot texnologiyalari. (2-qismning 1-qismi.)


1.12 Dasturiy ta'minot texnologiyalari 29

Dasturiy ta'minot murakkab. Katta, haqiqiy dasturiy ta'minot ilovalari ko'p oylarni olishi mumkin
yoki hatto yillar davomida loyihalash va amalga oshirish. Katta dasturiy mahsulotlar ishlab chiqilayotganda-
Ular odatda foydalanuvchilar hamjamiyatlari uchun har biri bir qator relizlar sifatida taqdim etiladi
oxirgisidan ko'ra to'liq va jilolangan (1.19-rasm).

Bulut
hisoblash

SaaS va PaaS bulutli hisoblash misollaridir. Siz dasturiy ta'minotdan foydalanishingiz mumkin va
"bulutda" saqlangan ma'lumotlar, ya'ni masofaviy kompyuterlarda (yoki serverlarda) foydalaniladi.
Internet orqali va talab bo'yicha mavjud - uni saqlash o'rniga
ish stoli, noutbuk yoki mobil qurilmangiz. Bu sizga imkon beradi
har qanday vaqtda ehtiyojlaringizni qondirish uchun hisoblash resurslarini oshirish yoki kamaytirish
vaqt, bu ta'minlash uchun apparat sotib olishdan ko'ra ancha tejamkor
vaqti-vaqti bilan eng yuqori talablarni qondirish uchun etarli saqlash va qayta ishlash quvvati.
Bulutli hisoblash, shuningdek, ularni boshqarish yukini o'zgartirish orqali pulni tejaydi
xizmatlar provayderiga ilovalar.

Dasturiy ta'minot


Rivojlanish
To'plam (SDK)

Dasturiy ta'minotni ishlab chiqish to'plamlari (SDK) asboblar va hujjatlarni o'z ichiga oladi


Dasturchilar ilovalarni dasturlash uchun foydalanadilar. Masalan, siz Java-dan foydalanasiz
Java dasturlarini yaratish va ishga tushirish uchun Development Kit (JDK).

Versiya tavsifi

Alpha Alpha dasturi hali ishlab chiqilmagan dasturiy mahsulotning eng birinchi versiyasidir
faol rivojlanish. Alfa versiyalari ko'pincha noto'g'ri, to'liq emas va barqaror emas
va nisbatan oz sonli ishlab chiquvchilarga yangisini sinash uchun chiqariladi
xususiyatlar, erta fikr-mulohaza olish va h.k.
Beta beta versiyalari keyinchalik ishlab chiquvchilar uchun ko'proq ishlab chiquvchilar uchun chiqariladi.
ko'pgina asosiy xatolar tuzatilgandan va yangi xususiyatlardan so'ng operatsiya jarayoni
deyarli to'liq. Beta-dastur yanada barqaror, ammo baribir o'zgarishi mumkin.
Chiqarish
nomzodlar

Chiqarish nomzodlari odatda to'liq xususiyatga ega, (asosan) xatosiz va tayyor


turli xil sinov muhitini ta'minlovchi jamoa tomonidan foydalanish uchun -
dasturiy ta'minot turli xil tizimlarda, turli cheklovlar bilan va a uchun ishlatiladi
turli maqsadlar.
Yakuniy versiya Chiqaruvchi nomzodda paydo bo'lgan har qanday xatolar tuzatiladi va oxir-oqibatda
yakuniy mahsulot keng ommaga chiqariladi. Ko'pincha dasturiy ta'minot kompaniyalari
Internet orqali bosqichma-bosqich yangilanishlarni tarqatish.
Davomiy
beta

Ushbu yondashuv yordamida ishlab chiqilgan dasturiy ta'minot (masalan, Google qidiruvi yoki


Gmail) odatda versiya raqamlariga ega emas. U bulutda joylashgan (yo'q
kompyuteringizda o'rnatilgan) va doimiy ravishda rivojlanib boradi, shuning uchun foydalanuvchilar doimo
oxirgi versiyasiga ega bo'ling.

1.19-rasm | Dasturiy ta'minot mahsulotlarini chiqarish terminologiyasi.

Texnologiya tavsifi

1.18-rasm | Dasturiy ta'minot texnologiyalari. (2-qismning 2-qismi.)


30 1-bob Kompyuterlar, Internet va Java-ga kirish

1.13 Axborot texnologiyalari bilan yangilanish
1.20-rasmda sizga yangilanib turishga yordam beradigan asosiy texnik va biznes nashrlar ro'yxati keltirilgan
so'nggi yangiliklar, tendentsiyalar va texnologiyalar bilan. Shuningdek, siz o'sib borayotgan Inter-ro'yxatini topishingiz mumkin.
www.deitel.com/ResourceCenters.html manzilida tarmoq va internetga oid Resurs markazlari.

Nashr URL

AllThingsD allthingsd.com
Bloomberg BusinessWeek www.businessweek.com
CNET news.cnet.com
ACM aloqalari cacm.acm.org
Computerworld www.computerworld.com
Engadget www.engadget.com
eWeek www.eweek.com
Tez kompaniya www.fastcompany.com/
Fortune money.cnn.com/magazines/fortune
GigaOM gigaom.com
Hacker News news.ycombinator.com
IEEE kompyuter jurnali www.computer.org/portal/web/computingnow/computer
InfoWorld www.infoworld.com
Mashable mashable.com
PCWorld www.pcworld.com
SD Times www.sdtimes.com
Slashdot slashdot.org/
Texnologiya sharhi technologyreview.com
Techcrunch techcrunch.com
Keyingi veb thenextweb.com
The Verge www.theverge.com
Simli www.wired.com

1.20-rasm | Texnik va biznes nashrlari.

O'z-o'zini tekshirish mashqlari
1.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Kompyuterlar ma'lumotlarni ko'rsatmalar to'plami deb ataladigan boshqaruv ostida qayta ishlaydi.
b) Kompyuterning asosiy mantiqiy birliklari , , , ,
va .
c) bobda muhokama qilingan tillarning uch turi , va

.

d) Yuqori darajadagi til dasturlarini mashina tiliga o'tkazuvchi dasturlar


chaqirdi.

O'z-o'zini tekshirish mashqlariga javoblar 31



e) Linux yadrosi va Java-ga asoslangan mobil qurilmalar uchun operatsion tizim.
f) dasturiy ta'minot odatda to'liq xususiyatga ega, (taxminan) xatosiz va foydalanishga tayyor
jamiyat tomonidan.
g) Wii Remote, shuningdek, ko'plab smartfonlar a(n) dan foydalanadi, bu esa o'chirish imkonini beradi.
harakatga javob berish o'rniga.
1.2 Java muhiti haqidagi quyidagi jumlalarning har biridagi bo'sh joylarni to'ldiring:
a) JDK buyrug'i Java dasturini bajaradi.
b) JDK buyrug'i Java dasturini kompilyatsiya qiladi.
c) Java manba kodi fayli fayl kengaytmasi bilan tugashi kerak.
d) Java dasturi kompilyatsiya qilinganda kompilyator tomonidan ishlab chiqarilgan fayl bilan tugaydi
fayl kengaytmasi.
e) Java kompilyatori tomonidan ishlab chiqarilgan fayl Java tomonidan bajariladigan fayllarni o'z ichiga oladi
Virtual mashina.
1.3 Quyidagi gaplarning har biridagi bo‘sh joylarni to‘ldiring (1.5-bo‘lim asosida):
a) Ob'ektlar dizayn amaliyotiga imkon beradi - garchi ular qanday qilib birlashtirishni bilishsa ham
yaxshi belgilangan interfeyslar bo'ylab bir-biri bilan muloqot qilish, ularga odatda ruxsat berilmaydi
boshqa ob'ektlar qanday amalga oshirilishini bilish.
b) Java dasturchilari asosiy e'tiborni maydonlar va to'plamlarni o'z ichiga olgan ni yaratishga qaratadilar
ushbu sohalarni boshqaradigan va mijozlarga xizmat ko'rsatadigan usullar.
v) ob'ektga yo'naltirilgan nuqtai nazardan tizimni tahlil qilish va loyihalash jarayoni
deyiladi .
d) Ob'ektlarning yangi sinfini qulay tarzda yaratish mumkin - yangi sinf (deb ataladi
kichik sinf) mavjud sinfning xususiyatlaridan boshlanadi (supersinf deb ataladi),
ehtimol ularni sozlash va o'ziga xos xususiyatlarni qo'shish.
e) dasturiy ta'minot tizimlarini loyihalashtirgan odamlarga foydalanish imkonini beruvchi grafik til
ularni ifodalash uchun sanoat standarti yozuvi.
f) ob'ektning o'lchami, shakli, rangi va vazni ob'ekt sinfiga kiradi.
O'z-o'zini tekshirish mashqlariga javoblar
1.1 a) dasturlar. b) kiritish bloki, chiqish bloki, xotira bloki, markaziy protsessor, arifmetik
va mantiqiy birlik, ikkilamchi saqlash birligi. c) mashina tillari, assembly tillari, yuqori darajadagi lan-
ko'rsatkichlar. d) kompilyatorlar. e) Android. f) nomzodni ozod qilish. g) akselerometr.
1.2 a) java. b) javac. c) .java. d) .sinf. e) bayt kodlari.
1.3 a) ma'lumotlarni yashirish. b) sinflar. c) ob'ektga yo'naltirilgan tahlil va dizayn (OOAD).
d) meros. e) Yagona modellashtirish tili (UML). f) atributlar.
Mashqlar
1.4 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) foydalanish uchun kompyuterdan tashqaridan axborotni qabul qiluvchi mantiqiy birlik
kompyuter hisoblanadi.
b) Kompyuterga masalani yechish uchun buyruq berish jarayoni deyiladi.
c) ma- uchun inglizcha qisqartmalardan foydalanadigan kompyuter tilining bir turi.
Xitoy tilidagi ko'rsatmalar.
d) tomonidan qayta ishlangan ma'lumotlarni yuboruvchi mantiqiy birlik
kompyuterdan tashqarida foydalanish uchun uni turli xil qurilmalarga ulash.
e) va axborotni saqlaydigan kompyuterning mantiqiy birliklari.
f) hisoblashlarni amalga oshiradigan kompyuterning mantiqiy birligi.
g) mantiqiy qarorlar qabul qiluvchi kompyuterning mantiqiy birligi.

32 1-bob Kompyuterlar, Internet va Java-ga kirish



h) dastur yozish uchun dasturchiga eng qulay tillar
tez va oson.
i) Kompyuter to'g'ridan-to'g'ri tushuna oladigan yagona til bu kompyuterning .
j) kompyuterning barcha boshqalarining faoliyatini muvofiqlashtiruvchi mantiqiy birligi
mantiqiy birliklar.
1.5 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Dasturlash tili hozirda yirik korporativ ilovalarni ishlab chiqish uchun ishlatiladi.
veb-serverlarning funksionalligini oshirish, konsultatsiyalar uchun ilovalarni taqdim etish.
sumer qurilmalari va boshqa ko'plab maqsadlar uchun.
b) dastlab UNIX opsiyasining ishlab chiqish tili sifatida keng tanildi.
baholash tizimi.
c) ketma-ket raqamlangan qismlardan iborat xabarlar chaqirilishini ta'minlaydi
baytlar jo'natuvchidan qabul qiluvchiga to'g'ri yo'naltirilgan, buzilmagan holda kelgan va yig'ilgan
to'g'ri tartibda.
d) Dasturlash tili ilk davrlarda Bjarne Stroustrup tomonidan ishlab chiqilgan
1980-yillar Bell Laboratoriesda.
1.6 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Java dasturlari odatda besh bosqichdan o'tadi - , , ,
va .
b) A(n) dasturiy ta'minotni ishlab chiqish jarayonini qo'llab-quvvatlaydigan ko'plab vositalarni taqdim etadi;
dasturlarni yozish va tahrirlash uchun muharrirlar, mantiqiy xatolarni aniqlash uchun tuzatuvchilar kabi
dasturlar va boshqa ko'plab xususiyatlar.
c) java buyrug'i Java dasturlarini bajaradigan ni chaqiradi.
d) A(n) - bu kompyuterni simulyatsiya qiluvchi, lekin uning ostidagi narsalarni yashiradigan dastur.
yolg'on operatsion tizim va u bilan o'zaro ta'sir qiluvchi dasturlardan apparat.
e) Dasturning bayt kodlari va uzatishlarini o'z ichiga olgan .class fayllarni oladi
ularni asosiy xotiraga.
f) bayt-kodlarning haqiqiyligiga ishonch hosil qilish uchun tekshiradi.
1.7 Java dasturlarini kompilyatsiya qilishning ikki bosqichini tushuntiring.
1.8 Dunyodagi eng keng tarqalgan narsalardan biri qo'l soatidir. Quyidagilarning har biri qanday ekanligini muhokama qiling -
atamalar va tushunchalar soat tushunchasiga taalluqlidir: ob'ekt, atributlar, xatti-harakatlar, sinf, meros.
tance (masalan, budilnikni ko'rib chiqing), modellashtirish, xabarlar, inkapsulyatsiya, interfeys va
ma'lumotlarni yashirish.
Farq qilish
Kitob davomida biz sizdan so'raladigan Farq yaratish mashqlarini kiritdik
shaxslar, jamoalar, mamlakatlar va dunyo uchun haqiqatan ham muhim bo'lgan muammolar ustida ishlash. Uchun
o'zgarishlar qilish uchun ishlayotgan butun dunyo bo'ylab tashkilotlar haqida ko'proq ma'lumot va tegishli
loyiha g‘oyalarini dasturlash uchun www.deitel.com/ saytidagi Farq yaratish resurs markazimizga tashrif buyuring.
farq qilish.
1.9 (Test-drayv: Uglerod izi kalkulyatori) Ba'zi olimlar uglerod emissiyasi,
ayniqsa, qazib olinadigan yoqilg'ilarning yonishi global isishga sezilarli hissa qo'shadi va bu
agar shaxslar uglerodga asoslangan yoqilg'idan foydalanishni cheklash choralarini ko'rsalar, kurashish mumkin. Tashkilotlar va
odamlar o'zlarining "uglerod izlari" haqida tobora ko'proq tashvishlanmoqdalar. TerraPass kabi veb-saytlar
http://www.terrapass.com/carbon-footprint-calculator/
va Uglerod izi
http://www.carbonfootprint.com/calculator.aspx

Farq qilish 33

uglerod izi kalkulyatorlarini taqdim eting. Uglerod miqdorini aniqlash uchun ushbu kalkulyatorlarni sinab ko'ring-
chop etish. Keyingi boblardagi mashqlar sizdan o'zingizning uglerod izi kalkulyatoringizni dasturlashingizni so'raydi. Kimga
Bunga tayyorlaning, uglerod izlarini hisoblash formulalarini tadqiq qilish uchun internetdan foydalaning.
1.10 (Test-drive: Tana massasi indeksi kalkulyatori) Semirib ketish kasalliklarning sezilarli darajada oshishiga olib keladi
diabet va yurak kasalliklari kabi. Biror kishining ortiqcha vaznli yoki semirib ketganligini aniqlash uchun siz mumkin
tana massasi indeksi (BMI) deb ataladigan o'lchovdan foydalaning. Amerika Qo'shma Shtatlari Sog'liqni saqlash vazirligi va Hu-
man Services BMI kalkulyatorini taqdim etadi http://www.nhlbi.nih.gov/guidelines/obesity/BMI/
bmicalc.htm. O'zingizning BMI ni hisoblash uchun foydalaning. Kelgusi mashq sizni dasturlashni so'raydi
o'zingizning BMI kalkulyatoringiz. Bunga tayyorgarlik ko'rish uchun hisoblash uchun formulalarni o'rganish uchun Internetdan foydalaning
BMI.
1.11 (Gibrid transport vositalarining atributlari) Ushbu bobda siz ba'zi sinflar asoslarini o'rgandingiz. Endi olasiz
"Gibrid avtomobil" deb nomlangan sinfning "taniq" jihatlari. Gibrid avtomobillar tobora ko'payib bormoqda
mashhur, chunki ular ko'pincha benzinda ishlaydigan transport vositalariga qaraganda ancha yaxshi masofani bosib o'tishadi. Ko‘rib chiqish
Internetga kirib, bugungi kunda mashhur boʻlgan toʻrt-beshta gibrid avtomobilning xususiyatlarini oʻrganing, soʻngra ularning koʻpini sanab oʻting
ularning gibrid bilan bog'liq atributlarini iloji boricha. Ba'zi umumiy atributlarga gallon boshiga shahar millari kiradi
va avtomagistral-milya-gallon. Shuningdek, batareyalarning atributlarini (turi, vazni va boshqalar) sanab o'ting.
1.12 (Gender neytralligi) Ko'p odamlar aloqaning barcha shakllarida jinsiy aloqani yo'q qilishni xohlashadi.
Sizdan matnning bir paragrafini qayta ishlay oladigan va gender-spe-
gender-neytral so'zlar bilan aniq so'zlar. Aytaylik, sizga jinsga oid ro'yxat berilgan
so'zlar va ularning jinsi bo'lmagan almashtirilishi (masalan, "xotin" va "er" so'zlari bilan almashtiring
"turmush o'rtog'i", "erkak" va "ayol" "shaxs" bilan, "qiz" va "o'g'il" "bola" bilan), pro-
matnning bir paragrafini o'qish va bu almashtirishlarni qo'lda bajarish uchun foydalanasiz.
Sizning protsedurangiz qanday qilib "woperchild?" kabi g'alati atama hosil qilishi mumkin. Tez orada buni ko'proq bilib olasiz
"protsedura" uchun rasmiy atama "algoritm" bo'lib, algoritm bajarilishi kerak bo'lgan qadamlarni belgilaydi.
shakllangan va ularni bajarish tartibi. Biz algoritmlarni qanday ishlab chiqishni ko'rsatamiz, keyin
ularni kompyuterlarda ishlashi mumkin bo'lgan Java dasturlariga aylantiring.

2

Java tiliga kirish


Ilovalar; Kirish/chiqish
va Operatorlar

Ismda nima bor?


Biz atirgul deb ataydigan narsa
Boshqa har qanday nom bilan
kabi shirin hid.
- Uilyam Shekspir
Tilning asosiy qadriyati
aniqlikdir.
- Galen
Bir kishi qilish mumkin
farq va har bir kishi
harakat qilish kerak.
— Jon F. Kennedi

Oh maqsadlar


Ushbu bobda siz:
■ Oddiy Java yozing
ilovalar.
■ Kirish va chiqishdan foydalaning
bayonotlar.
■ Java - ning ibtidoiy tili haqida bilib oling
turlari.
■ Asosiy xotirani tushunish
tushunchalar.
■ Arifmetik operatorlardan foydalaning.
■ ning ustuvorligini bilib oling
arifmetik operatorlar.
■ Qaror qabul qilishni yozing
bayonotlar.
■ Munosabatlar va tenglikdan foydalaning
operatorlar.

2.1 Kirish 35

2.1 Kirish
Ushbu bob Java dasturlarini dasturlash bilan tanishtiradi. Biz pro-misollardan boshlaymiz.
ekranda xabarlarni ko'rsatadigan (chiqish) gramm. Keyin biz dasturni taqdim etamiz -
foydalanuvchidan ikkita raqamni oladi (kiradi), ularning yig'indisini hisoblaydi va natijani ko'rsatadi. Siz
Kompyuterga arifmetik hisob-kitoblarni bajarish va ularni qayta saqlashga buyruq berishni o'rganing.
keyinchalik foydalanish uchun tavsiyalar. Oxirgi misol qanday qaror qabul qilishni ko'rsatadi. Ilova
ikkita raqamni taqqoslaydi, so'ngra taqqoslash natijalarini ko'rsatadigan xabarlarni ko'rsatadi. Siz
Ushbu bobdagi dasturlarni kompilyatsiya qilish va ishga tushirish uchun JDK buyruq qatori vositalaridan foydalaning. Agar xohlasangiz
integratsiyalashgan rivojlanish muhitidan (IDE) foydalanish uchun biz Dive Into® videolarini ham joylashtirdik
Eclipse, NetBeans va IntelliJ IDEA uchun http://www.deitel.com/books/jhtp10/ saytida.
2.2 Java-dagi birinchi dasturingiz: Matn qatorini chop etish
Java ilovasi - bu java buyrug'idan foydalanganda bajariladigan kompyuter dasturi
Java virtual mashinasini (JVM) ishga tushirish uchun. Keyinchalik ushbu bo'limda biz qanday qilib birlashtirishni muhokama qilamiz
jamlang va Java ilovasini ishga tushiring. Avval biz chiziqni ko'rsatadigan oddiy dasturni ko'rib chiqamiz
matndan. 2.1-rasmda dastur va undan keyin uning chiqishini ko'rsatadigan quti ko'rsatilgan.

2.1 Kirish


2.2 Java-dagi birinchi dasturingiz: Chop etish a
Matn qatori
2.3 Birinchi Java dasturingizni o'zgartirish
2.4 Matnni printf bilan ko'rsatish
2.5 Boshqa ilova: Qo'shish
Butun sonlar
2.5.1 Import deklaratsiyasi
2.5.2 Sinf qo'shimchasini e'lon qilish
2.5.3 Skanerni e'lon qilish va yaratish
Klaviaturadan foydalanuvchi ma'lumotlarini oling
2.5.4 Butun sonlarni saqlash uchun o'zgaruvchilarni e'lon qilish
2.5.5 Foydalanuvchini kiritishni taklif qilish

2.5.6 dan kirish sifatida int olish


Foydalanuvchi
2.5.7 soniyani so'rash va kiritish
int
2.5.8 Hisoblashda o'zgaruvchilardan foydalanish
2.5.9 Natijani ko'rsatish
Hisoblash
2.5.10 Java API hujjatlari
2.6 Xotira tushunchalari
2.7 Arifmetika
2.8 Qaror qabul qilish: Tenglik va
Aloqa operatorlari
2.9 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish

1 // 2.1-rasm: Welcome1.java
2 // Matnni chop etish dasturi.
3
4 ommaviy sinf Xush kelibsiz1
5 {
6 // asosiy usul Java dasturining bajarilishini boshlaydi
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 System.out.println("Java dasturlashga xush kelibsiz!");
10 } // tugatish usuli asosiy
11 } // yakuniy sinf Welcome1

2.1-rasm | Matnni chop etish dasturi. (2-qismning 1-qismi.)


36 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

Dastur qator raqamlarini o'z ichiga oladi. Biz ularni ta'lim maqsadida qo'shdik—
ular Java dasturining bir qismi emas. Ushbu misol Java-ning bir nechta muhim xususiyatlarini ko'rsatadi.
9-qator ishni bajarayotganini ko‘ramiz — “Java Programmingga xush kelibsiz” iborasini ko‘rsatamiz!
ekranda.
Dasturlaringizni sharhlash
Hujjat dasturlariga sharhlar kiritamiz va ularning o'qilishini yaxshilaymiz. Java com-
Piler izohlarni e'tiborsiz qoldirmaydi, shuning uchun ular kompyuterni har qanday harakatni amalga oshirishga olib kelmaydi
dastur ishga tushiriladi.
An'anaga ko'ra, biz har bir dasturni raqam raqamini ko'rsatadigan izoh bilan boshlaymiz
va fayl nomi. 1-qatordagi izoh

// bilan boshlanadi, bu satr oxiridagi izoh ekanligini bildiradi — oxirida tugaydi


// paydo bo'ladigan qator. Satr oxiridagi sharh qatorni boshlashi shart emas; u ham
satrning oʻrtasidan boshlanib, oxirigacha davom etishi mumkin (6, 10 va 11-qatorlardagi kabi). Chiziq
2

bizning konventsiyamiz bo'yicha, bu dasturning maqsadini tavsiflovchi sharhdir.


Javada ham an'anaviy izohlar mavjud bo'lib, ular quyidagi kabi bir necha qatorga tarqalishi mumkin

Bular /* va */ chegaralovchilar bilan boshlanadi va tugaydi. Kompilyator o'rtasidagi barcha matnlarni e'tiborsiz qoldiradi


chegaralovchilar. Java o'z ichiga an'anaviy sharhlar va C dan so'nggi sharhlarni kiritdi
va mos ravishda C++ dasturlash tillari. Biz // izohlardan foydalanishni afzal ko'ramiz.
Java uchinchi turdagi sharhlarni taqdim etadi - Javadoc sharhlari. Bular bilan chegaralangan
/** va */. Kompilyator cheklovchilar orasidagi barcha matnlarni e'tiborsiz qoldiradi. Javadoc sharhlari
dastur hujjatlarini bevosita dasturlaringizga joylashtirish imkonini beradi. Bunday sharhlar
sanoatda afzal qilingan Java hujjat formati. Javadoc yordam dasturi (qism
JDK) Javadoc sharhlarini o'qiydi va ulardan dastur hujjatlarini tayyorlash uchun foydalanadi
HTML formatida. Biz Javadoc sharhlari va javadoc yordam dasturini onlayn tarzda namoyish qilamiz
G ilovasi, Javadoc yordamida hujjatlarni yaratish.

Java dasturlashga xush kelibsiz!

// 2.1-rasm: Welcome1.java

// Matnni chop etish dasturi.

/* Bu an'anaviy izoh. Bu
bir nechta satrlarga bo'linishi mumkin */

Umumiy dasturlash xatosi 2.1


An'anaviy yoki Javadoc izohining chegaralovchilaridan birini unutish sintaktik xatodir. A
sintaksis xatosi kompilyator Java tili qoidalarini buzuvchi kodga duch kelganida yuzaga keladi
(ya'ni, uning sintaksisi). Ushbu qoidalar tabiiy tilning grammatik qoidalariga o'xshaydi
gap tuzilishi. Sintaksis xatolari kompilyator xatolari, kompilyatsiya vaqtidagi xatolar yoki
kompilyatsiya xatolari, chunki kompilyator ularni dasturni kompilyatsiya qilishda aniqlaydi.
Sintaksis xatosi yuzaga kelganda, kompilyator xato xabarini chiqaradi. Siz yo'q qilishingiz kerak -
Dasturingiz to'g'ri kompilyatsiya qilinishidan oldin barcha kompilyatsiya xatolarini tuzating.

2.1-rasm | Matnni chop etish dasturi. (2-qismning 2-qismi.)


2.2 Java-dagi birinchi dasturingiz: Matn qatorini chop etish 37

Bo'sh chiziqlardan foydalanish
3-qator bo'sh qatordir. Bo'sh chiziqlar, bo'sh joy belgilari va yorliqlar dasturlarni o'qishni osonlashtiradi.
Birgalikda ular oq bo'shliq (yoki bo'sh joy) deb nomlanadi. Kompilyator oq bo'shliqqa e'tibor bermaydi.

Sinfni e'lon qilish


4-qator

Welcome1 sinfi uchun sinf deklaratsiyasini boshlaydi. Har bir Java dasturi kamida bittadan iborat


siz (dasturchi) belgilaydigan sinf. Class kalit so'zi sinf deklaratsiyasini taqdim etadi
va darhol sinf nomidan keyin keladi (Xush kelibsiz1). Kalit so'zlar (ba'zan deyiladi
ajratilgan so'zlar) Java tomonidan foydalanish uchun ajratilgan va har doim kichik harflar bilan yoziladi.
ters. Kalit so'zlarning to'liq ro'yxati C ilovasida keltirilgan.
2–7-boblarda biz belgilagan har bir sinf ochiq kalit so‘z bilan boshlanadi. Hozircha, biz
oddiygina ommaviy talab qiladi. Siz 8-bobda jamoat va jamoat bo'lmagan darslar haqida ko'proq bilib olasiz.
Umumiy sinf uchun fayl nomi
Umumiy sinf ClassName.java shaklidagi fayl nomiga ega bo'lgan faylga joylashtirilishi kerak, shuning uchun
Welcome1 sinfi Welcome1.java faylida saqlanadi.

Sinf nomlari va identifikatorlari


An'anaga ko'ra, sinf nomlari bosh harf bilan boshlanadi va har birining birinchi harfini katta qiladi
ular o'z ichiga olgan so'z (masalan, SampleClassName). Sinf nomi identifikator - belgilar qatoridir.
boshlanmaydigan harflar, raqamlar, pastki chiziq (_) va dollar belgilaridan ($) iborat aktyorlar
raqam bilan va bo'sh joylarni o'z ichiga olmaydi. Ayrim yaroqli identifikatorlar Welcome1, $value,
_value, m_inputField1 va button7. 7tugma nomi haqiqiy identifikator emas, chunki
u raqam bilan boshlanadi va nom kiritish maydoni haqiqiy identifikator emas, chunki unda mavjud
bo'sh joy. Odatda, bosh harf bilan boshlanmagan identifikator sinf nomi emas.

Yaxshi dasturlash amaliyoti 2.1


Ba'zi tashkilotlar har bir dastur o'z mazmunini bildiruvchi izoh bilan boshlanishini talab qiladi.
dasturning pozitsiyasi va muallifi, dastur oxirgi marta o'zgartirilgan sana va vaqt.

Xatolarning oldini olish bo'yicha maslahat 2.1


Yangi dasturlarni yozishda yoki mavjudlarini o'zgartirishda sharhlaringizni yangilab turing
kod. Xatolarni tuzatish yoki tuzatish uchun dasturchilar ko'pincha mavjud kodga o'zgartirishlar kiritishlari kerak bo'ladi
qobiliyatlarini oshirish. Sharhlaringizni yangilash ularning to'g'ri aks etishiga yordam beradi
kod nima qiladi. Bu sizning dasturlaringizni tushunish va o'zgartirishni osonlashtiradi
kelajak. Eskirgan sharhlar bilan kodni ishlatadigan yoki yangilaydigan dasturchilar
xatolarga yoki hatto xavfsizlik buzilishiga olib kelishi mumkin bo'lgan kod haqida to'g'ri taxminlar.

Yaxshi dasturlash amaliyoti 2.2


Dasturni o'qishni yaxshilash uchun bo'sh qatorlar va bo'shliqlardan foydalaning.

umumiy sinf Xush kelibsiz1

Umumiy dasturlash xatosi 2.2
Agar umumiy sinf fayl nomi sinf nomi bilan bir xil bo'lmasa, kompilyatsiya xatosi yuzaga keladi
(imlo va bosh harflar nuqtai nazaridan) keyin .java kengaytmasi.

38 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

Java katta-kichik harflarga sezgir - katta va kichik harflar farqlanadi - shuning uchun qiymat va qiymat
turli (lekin ikkalasi ham tegishli) identifikatorlardir.
Sinf tanasi
Chap qavs (5-qatordagi kabi), {, har bir sinf deklaratsiyasining asosiy qismini boshlaydi. Tegishli
o'ng qavs (11-satrda), }, har bir sinf deklaratsiyasini tugatishi kerak. 6-10 qatorlar ichkariga kiritilgan.

Usulni e'lon qilish


6-qator

- bu dasturning 7-10-qatorlarining maqsadini ko'rsatuvchi qator oxiridagi izoh. 7-qator

har bir Java ilovasining boshlang'ich nuqtasidir. Asosiy identifikatordan keyingi qavslar-
Bu usul deb ataladigan dastur qurilish bloki ekanligini ko'rsating. Odatda Java sinf deklaratsiyasi
bir yoki bir nechta usullarni o'z ichiga oladi. Java ilovasi uchun usullardan biri chaqirilishi kerak
asosiy va 7-qatorda ko'rsatilganidek belgilanishi kerak; aks holda Java virtual mashinasi (JVM)
arizani bajarmaydi. Usullar vazifalarni bajaradi va ma'lumotni qachon qaytarishi mumkin
ular o'z vazifalarini bajaradilar. Static kalit so'zining maqsadini 3.2.5-bo'limda tushuntiramiz.
Void kalit so'zi bu usul hech qanday ma'lumotni qaytarmasligini bildiradi. Keyinroq ko'ramiz
usul ma'lumotni qanday qaytarishi mumkin. Hozircha o'zingizning asosiy satringizning birinchi qatoriga taqlid qiling
Java ilovalari. 7-qatorda qavs ichidagi String[] args ning zarur qismidir
main usulining deklaratsiyasi - biz buni 7-bobda muhokama qilamiz.
8-qatordagi chap qavs usul deklaratsiyasining asosiy qismini boshlaydi. Tegishli
o'ng qavs uni tugatishi kerak (10-qator). Usul tanasidagi 9-satr o'rtasida chekinish qilingan
qavslar.

Yaxshi dasturlash amaliyoti 2.3


Har bir sinf deklaratsiyasining butun tanasini chap qavs va qavs orasiga bir “daraja” bilan cheklang
sinf tanasini chegaralovchi o'ng qavs. Ushbu format sinf deklaratsiyasini ta'kidlaydi
tuzilishi va o‘qishni osonlashtiradi. Biz chekinish darajasini yaratish uchun uchta bo'shliqdan foydalanamiz - ko'p
dasturchilar ikki yoki to'rtta bo'shliqni afzal ko'radilar. Siz tanlagan narsangizdan qat'iy nazar, uni doimiy ravishda ishlating.

Xatolarning oldini olish bo'yicha maslahat 2.2


Ochilgan chap qavsni yozganingizda, {, darhol yopish o'ng qavsni kiriting, }, so'ng
kursorni qavslar orasiga oʻzgartiring va asosiy matnni yozishni boshlash uchun chekindi. Bu amaliyot
etishmayotgan qavslar tufayli xatolarning oldini olishga yordam beradi. Ko'pgina IDElar uchun o'ng yopilish qavslarini kiritadilar
ochilish chap qavsni yozganingizda.

Umumiy dasturlash xatosi 2.3


Qavslar mos keladigan juftlikda bo'lmasa, bu sintaksis xatosi.

Yaxshi dasturlash amaliyoti 2.4


IDE odatda siz uchun kodni cheklaydi. Tab tugmasi kodni cheklash uchun ham ishlatilishi mumkin. Siz .. qila olasiz; siz ... mumkin
Tab tugmasini bosganingizda qo'shiladigan bo'shliqlar sonini belgilash uchun har bir IDE-ni sozlang.

// asosiy usul Java dasturining bajarilishini boshlaydi

umumiy statik void main(String[] args)

2.2 Java-dagi birinchi dasturingiz: Matn qatorini chop etish 39

System.out.println bilan chiqishni amalga oshirish
9-qator

kompyuterga biror amalni bajarishni, ya'ni tarkibidagi belgilarni ko'rsatishni buyuradi


qo'sh tirnoq orasida (tirnoq belgilarining o'zi ko'rsatilmaydi).
Qo'shtirnoq va ular orasidagi belgilar birgalikda qator bo'lib, ular ham ma'lum
belgilar qatori yoki satr harfi sifatida. Satrlardagi bo'sh joy belgilari e'tiborga olinmaydi
kompilyator tomonidan. Satrlar bir nechta kod qatorlarini qamrab olmaydi.
Siz uchun oldindan belgilangan System.out obyekti standart sifatida tanilgan
chiqish ob'ekti. Bu Java dasturiga buyruqdagi ma'lumotlarni ko'rsatishga imkon beradi
u amalga oshiriladigan oyna. Microsoft Windows-ning so'nggi versiyalarida buyruq
oyna Buyruqning satridir. UNIX/Linux/Mac OS X da buyruqlar oynasi
terminal oynasi yoki qobiq deb ataladi. Ko'pgina dasturchilar buni oddiy buyruq qatori deb atashadi.
System.out.println usuli buyruqdagi matn qatorini ko'rsatadi (yoki chop etadi).
oyna. 9-qatordagi qavs ichidagi satr usulning argumentidir. Qachon
System.out.println o'z vazifasini bajaradi, u chiqish kursorini (joylashuvni) joylashtiradi
keyingi belgi ko'rsatiladi) buyruqdagi keyingi qatorning boshida
oyna. Bu a ni kiritayotganda Enter tugmasini bosganingizda sodir bo'ladigan narsaga o'xshaydi
matn muharriri — kursor hujjatning keyingi qatorining boshida paydo bo‘ladi.
Butun qator 9, shu jumladan System.out.println, argument "Javaga xush kelibsiz
Qavslar va nuqta-vergul (;) ichida dasturlash!", bayon deyiladi. Usul
odatda o'z vazifasini bajaradigan bir yoki bir nechta iboralarni o'z ichiga oladi. Ko'pgina bayonotlar bilan tugaydi
nuqtali vergul. 9-qatordagi bayonot bajarilganda, u Java dasturiga xush kelibsiz-ni ko'rsatadi.
ming! buyruq oynasida.
Dasturlashni o'rganayotganda, ba'zida ishlaydigan dasturni "buzish" foydali bo'ladi
shuning uchun siz kompilyatorning sintaksisi-xato xabarlari bilan tanishishingiz mumkin. Bu xabarlar
kodda har doim ham aniq muammoni ko'rsatmaydi. Xatoga duch kelganingizda, u sizga beradi
nima sabab bo'lganligi haqida fikr. [2.1-rasmdagi dasturdan nuqtali vergul yoki qavsni olib tashlashga harakat qiling,
keyin o'tkazib yuborilgan xato xabarlarini ko'rish uchun dasturni qayta kompilyatsiya qiling.]

O'qilishi uchun o'ng qavslarda satr oxiridagi sharhlardan foydalanish


Dasturlashda yangi boshlanuvchilar uchun yordam sifatida biz yopilgandan so'ng qator oxiri sharhini kiritamiz
usul deklaratsiyasini tugatuvchi qavs va sinf deklaratsiyasini tugatuvchi qavsdan keyin.
Masalan, 10-qator

Yaxshi dasturlash amaliyoti 2.5


Har bir usulning butun tanasini qavslar orasiga bir "daraja" e'lon qiling.
usulning tanasini yaxshilang. Bu usulning tuzilishini ajratib turadi va qiladi
usul deklaratsiyasini o'qish osonroq.

System.out.println("Java dasturlashga xush kelibsiz!");

Xatolarning oldini olish bo'yicha maslahat 2.3
Kompilyator sintaksis xatosi haqida xabar berganida, u xato xabari qatorida bo'lmasligi mumkin
bildiradi. Birinchidan, xato haqida xabar berilgan qatorni tekshiring. Agar xato topmasangiz
o'sha satrda bir nechta oldingi qatorlarni tekshiring.

} // asosiy tugatish usuli


40 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

main usulining yopish qavsini va 11-qatorni bildiradi

Welcome1 sinfining yopish qavsini bildiradi. Har bir izoh usul yoki sinfni bildiradi


o'ng qavs tugaydi. Ushbu bobdan keyin bunday yakuniy sharhlarni o'tkazib yuboramiz.

Birinchi Java ilovangizni kompilyatsiya qilish


Endi biz dasturimizni kompilyatsiya qilishga va bajarishga tayyormiz. Siz Java’dan foydalanyapsiz deb taxmin qilamiz
Development Kit-ning buyruq qatori vositalari, IDE emas. Sizning kompilyatsiya qilishingiz va ishga tushirishingizga yordam berish uchun
IDE dasturlarida biz mashhur IDE Eclipse uchun onlayn Dive Into® videolarini taqdim etamiz,
NetBeans va IntelliJ IDEA. Ular kitobning veb-saytida joylashgan:

Dasturni kompilyatsiya qilishga tayyorgarlik ko'rish uchun buyruqlar oynasini oching va o'zgartiring


dastur saqlanadigan katalog. Ko'pgina operatsion tizimlar CD buyrug'idan foydalanadi
kataloglarni o'zgartirish. Masalan, Windows-da

fig02_01 katalogiga o'zgarishlar. UNIX/Linux/Max OS X da buyruq

fig02_01 katalogiga o'zgarishlar. Dasturni kompilyatsiya qilish uchun yozing

Agar dasturda kompilyatsiya xatosi bo'lmasa, bu buyruq yangi faylni yaratadi


Welcome1.class (Welcome1 uchun sinf fayli sifatida tanilgan) platforma-mustaqil-
ilovamizni ifodalovchi Java bayt kodlari. Biz java buyrug'idan foydalanganda
ilovani ma'lum platformada bajaring, JVM bu bayt kodlarini tarjima qiladi
asosiy operatsion tizim va apparat tomonidan tushuniladigan ko'rsatmalar.

Har bir sintaksis-xato xabari fayl nomi va xato bo'lgan satr raqamini o'z ichiga oladi


sodir bo'ldi. Masalan, Welcome1.java:6 6-qatorda xatolik yuz berganligini bildiradi
Welcome1.java. Xabarning qolgan qismi sintaksis xatosi haqida ma'lumot beradi.

} // yakuniy sinf Welcome1

http://www.deitel.com/books/jhtp10

cd c:\misollar\ch02\fig02_01

cd ~/misollar/ch02/fig02_01

javac Welcome1.java

Umumiy dasturlash xatosi 2.4
Javac-dan foydalanganda, agar siz "yomon buyruq yoki fayl nomi", "javac" kabi xabarni olsangiz:
buyruq topilmadi" yoki "javac" ichki yoki tashqi aloqa sifatida tan olinmaydi.
mand, ishlaydigan dastur yoki ommaviy ish fayli” boʻlsa, Java dasturi oʻrnatilmagan
to'g'ri yakunlandi. Bu tizimning PATH muhit o'zgaruvchisi emasligini ko'rsatadi
to'g'ri sozlang. Boshlashdan oldin bo'limidagi o'rnatish ko'rsatmalarini diqqat bilan ko'rib chiqing
ushbu kitobdan. Ba'zi tizimlarda PATHni to'g'irlaganingizdan so'ng, kompyuteringizni qayta ishga tushirishingiz kerak bo'lishi mumkin.
kiriting yoki ushbu sozlamalar kuchga kirishi uchun yangi buyruq oynasini oching.

Umumiy dasturlash xatosi 2.5


Kompilyator xato xabari “Xush kelibsiz1 sinfi ochiq, faylda e’lon qilinishi kerak
Welcome1.java” fayl nomi pub nomiga mos kelmasligini bildiradi.
fayldagi lic klassi yoki sinfni kompilyatsiya qilishda sinf nomini noto'g'ri kiritganligingiz.

2.3 Birinchi Java dasturingizni o'zgartirish 41

Welcome1 ilovasini bajarish
Quyidagi ko'rsatmalar kitob misollari C:\examples da joylashgan deb taxmin qiladi
Windows tizimida yoki Linux/OS X da foydalanuvchi hisobingizning Hujjatlar/misollar jildida
ushbu dasturni buyruq oynasida bajaring, o'z ichiga olgan katalogga o'ting
Welcome1.java — Microsoft Windows-da C:\examples\ch02\fig02_01 yoki ~/Documents/
Linux/OS X da misollar/ch02/fig02_01. Keyin yozing

va Enter tugmasini bosing. Bu buyruq Welcome1.class faylini yuklaydigan JVM ni ishga tushiradi.


Buyruq .class fayl nomi kengaytmasini o'tkazib yuboradi; aks holda JVM bajarilmaydi
dastur. JVM Welcome1 sinfining asosiy usulini chaqiradi. Keyinchalik, 9-qatordagi bayonot
asosiy displeylar "Java dasturlashga xush kelibsiz!". 2.2-rasmda dasturning bajarilishi ko'rsatilgan.
Microsoft Windows buyruq satri oynasida. [Eslatma: Ko'p muhitlar ko'rsatadi
qora fon va oq matnli buyruq oynalari. Biz ushbu sozlamalarni o'rnatdik
ekran tasvirlarimizni o'qilishi mumkin bo'lsin.]

2.3 Birinchi Java dasturingizni o'zgartirish


Ushbu bo'limda biz 2.1-rasmdagi misolni o'zgartiramiz va matnni bir qatorda chop qilamiz.
tiple bayonotlar va bitta bayonot yordamida matnni bir nechta satrlarda chop etish.
Ko'p bayonotlar bilan bir qatorli matnni ko'rsatish
Java dasturlashga xush kelibsiz! bir necha usul bilan ko'rsatilishi mumkin. Xush kelibsiz2-sinf, ko'rsatilgan
2.3-rasm, 2.1-rasmda ko'rsatilgan chiqishni ishlab chiqarish uchun ikkita bayonotdan (9-10-qatorlar) foydalanadi. [Eslatma:
Shu nuqtadan boshlab, biz sariq fon bilan yangi va asosiy xususiyatlarni ta'kidlaymiz
9–10 qatorlar uchun qilganimizdek, har bir kod roʻyxatida.]
Dastur 2.1-rasmga o'xshaydi, shuning uchun biz bu erda faqat o'zgarishlarni muhokama qilamiz. 2-qator

java Xush kelibsiz1

Xatolarning oldini olish bo'yicha maslahat 2.4
Java dasturini ishga tushirishga urinayotganda, agar siz “Exception in
"main" java.lang.NoClassDefFoundError: Xush kelibsiz1, CLASSPATH envi-
ronment o'zgaruvchisi to'g'ri o'rnatilmagan. Iltimos, o'rnatishni diqqat bilan ko'rib chiqing -
Ushbu kitobning Boshlashdan oldin bo'limidagi ko'rsatmalar. Ba'zi tizimlarda sizga kerak bo'lishi mumkin
CLASSPATH-ni sozlaganingizdan so'ng kompyuteringizni qayta yoqing yoki yangi buyruq oynasini oching.

2.2-rasm | Buyruqlar satridan Welcome1 ni bajarish.

// Bir nechta bayonotli matn qatorini chop etish.

Siz buni yozing


bajarish uchun buyruq
ilova

Dastur ekranga chiqadi


Java dasturlashga xush kelibsiz!

42 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

- bu dasturning maqsadini bildiruvchi qator oxiridagi izoh. 4-qator “Xush kelibsiz2” ni boshlaydi
sinf deklaratsiyasi. Asosiy usulning 9-10 qatorlari

bir qator matnni ko'rsatish. Birinchi bayonot a ko'rsatish uchun System.out ning chop etish usulidan foydalanadi


ip. Har bir print yoki println bayonoti oxirgi bo'lgan joydan belgilarni ko'rsatishni davom ettiradi
print yoki println bayonoti belgilarni ko'rsatishni to'xtatdi. Println dan farqli o'laroq, displeydan keyin -
uning argumentiga ko'ra, chop etish kursorini keyingisining boshiga joylashtirmaydi
buyruq oynasidagi satr - dastur ko'rsatadigan keyingi belgi darhol paydo bo'ladi
ko'rsatadigan oxirgi belgidan keyin darhol. Shunday qilib, 10-qator birinchi belgini joylashtiradi
argumentida ("J" harfi) 9-satr ko'rsatilgan oxirgi belgidan keyin darhol (
satrning yopilish qo'sh tirnoq belgisidan oldin bo'sh joy belgisi).

Bitta bayonot bilan bir nechta qatorli matnlarni ko'rsatish


Bitta bayonot yangi qator belgilaridan foydalangan holda bir nechta satrlarni ko'rsatishi mumkin
Chiqish kursorini qachon joylashtirish kerak bo'lsa, System.out-ning chop etish va println usullariga
buyruq oynasidagi keyingi qatorning boshlanishi. Bo'sh satrlar, bo'sh joy belgilari va kabi
tab belgilar, yangi qator belgilar bo'sh joy belgilaridir. 2.4-rasmdagi dastur
Har bir yangi satr qachon boshlanishini aniqlash uchun yangi qator belgilaridan foydalangan holda to'rt qatorli matn qo'yadi.
Dasturning aksariyati rasmdagilarga o'xshash. 2.1 va 2.3.

1 // 2.3-rasm: Welcome2.java


2 // Bir nechta bayonotli matn qatorini chop etish.
3
4 ommaviy sinf Xush kelibsiz2
5 {
6 // asosiy usul Java dasturining bajarilishini boshlaydi
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11 } // tugatish usuli asosiy
12 } // yakuniy sinf Welcome2

Java dasturlashga xush kelibsiz!

2.3-rasm | Bir nechta bayonotli matn qatorini chop etish.

System.out.print("Xush kelibsiz");


System.out.println("Java dasturlash!");

1 // 2.4-rasm: Welcome3.java


2 // Bitta bayonot bilan bir nechta satr matnni chop etish.
3
4 ommaviy sinf Xush kelibsiz3
5 {
6 // asosiy usul Java dasturining bajarilishini boshlaydi
7 ta umumiy statik bekor asosiy (String [] args)
8 {

2.4-rasm | Bitta bayonot bilan bir nechta satr matnni chop etish. (2-qismning 1-qismi.)

System.out.print("Xush kelibsiz");
System.out.println("Java dasturlash!");

2.4 Matnni printf 43 bilan ko'rsatish

9-qator

buyruq oynasida to'rt qatorli matnni ko'rsatadi. Odatda, satrdagi belgilar


qo'sh tirnoq ichida ko'rsatilgandek ko'rsatiladi. Biroq, juftlashtirilgan belgilar \ va
n (bayonotda uch marta takrorlangan) ekranda ko'rinmaydi. Teskari qiyshiq chiziq (\).
System.out ning chop etish va println usuli uchun alohida ma'noga ega bo'lgan qochish belgisi
ehtimol. Agar satrda teskari chiziq paydo bo'lsa, Java uni hosil qilish uchun keyingi belgi bilan birlashtiradi
qochish ketma-ketligi—\n yangi qator belgisini bildiradi. Yangi qator belgisi paydo bo'lganda
System.out bilan chiqarilgan satrda yangi qator belgisi ekranning chiqishiga sabab bo'ladi
buyruq oynasida keyingi qatorning boshiga o'tish uchun kursor.
2.5-rasmda bir nechta umumiy qochish ketma-ketliklari keltirilgan va ularning buzilishlarga qanday ta'sir qilishlari tasvirlangan.
buyruq oynasida belgilar o'ynash. Qochish ketma-ketliklarining to'liq ro'yxati uchun tashrif buyuring

2.4 Matnni printf bilan ko'rsatish


System.out.printf usuli (f "formatlangan" degan ma'noni anglatadi) formatlangan ma'lumotlarni ko'rsatadi.
2.6-rasmda “Welcome to” va “Java” qatorlarini ikki qatorga chiqarish uchun ushbu usuldan foydalaniladi.
Dasturlash!".

9 System.out.println("Java dasturlashga xush kelibsiz!");


10 } // tugatish usuli asosiy
11 } // yakuniy sinf Welcome3

Xush kelibsiz


uchun
Java
Dasturlash!

System.out.println("Java\nDasturlash\n\nXush kelibsiz!");

http://docs.oracle.com/javase/specs/jls/se7/html/
jls-3.html#jls-3.10.6

Qochish
ketma-ketlik tavsifi

\n Yangi qator. Ekran kursorini keyingi qatorning boshiga qo'ying.
\t Gorizontal yorliq. Ekran kursorini keyingi yorliq to'xtashiga o'tkazing.
\r Vagonni qaytarish. Ekran kursorini oqim boshiga qo'ying
qator - keyingi qatorga o'tmang. Mashinadan keyin chiqadigan har qanday belgilar-
riage return o'sha satrda ilgari chiqarilgan belgilarning ustiga yozish.
\\ Teskari chiziq. Teskari chiziq belgisini chop etish uchun ishlatiladi.
\" Ikkita tirnoq. Ikki tirnoqli belgini chop etish uchun ishlatiladi. Masalan,
System.out.println("\"tirnoq ichida\"");
"tirnoq ichida" ko'rsatiladi.

2.5-rasm | Ba'zi umumiy qochish ketma-ketligi.

2.4-rasm | Bitta bayonot bilan bir nechta satr matnni chop etish. (2-qismning 2-qismi.)

\n \n \n

44 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

9–10 qatorlar

dasturning natijasini ko'rsatish uchun System.out.printf usulini chaqiring. Usul chaqiruvi maxsus -
uchta argument keltiradi. Usul bir nechta argumentlarni talab qilsa, ular a ichiga joylashtiriladi
vergul bilan ajratilgan ro'yxat. Usulni chaqirish, shuningdek, usulni chaqirish deb ham ataladi.

9–10 qatorlar faqat bitta bayonotni ifodalaydi. Java katta bayonotlarni bo'lish imkonini beradi


ko'p qatorlar. 9-qatorning davomi ekanligini ko'rsatish uchun 10-qatorni cheklaymiz.

Printf usulining birinchi argumenti sobit matndan iborat bo'lishi mumkin bo'lgan format qatori va


format ko'rsatkichlari. Ruxsat etilgan matn printf orqali xuddi print yoki println orqali chiqariladi.
Har bir format spetsifikatsiyasi qiymat uchun to'ldiruvchi bo'lib, chiqadigan ma'lumotlar turini belgilaydi.
Format spetsifikatsiyalari ixtiyoriy formatlash ma'lumotlarini ham o'z ichiga olishi mumkin.
Format spetsifikatsiyalari foiz belgisi (%) bilan boshlanadi, undan keyin ifodalovchi belgi keladi
ma'lumotlar turi. Misol uchun, %s format ko'rsatgichi satr uchun to'ldiruvchidir. Format
9-qatordagi satr printf har biridan keyin yangi qatordan iborat ikkita satr chiqarishi kerakligini bildiradi
xarakter. Birinchi format spetsifikatsiyasi pozitsiyasida printf birinchisining qiymatini almashtiradi
format qatoridan keyin argument. Har bir keyingi format spetsifikatsiyasi o'rnida printf
keyingi argumentning qiymatini almashtiradi. Shunday qilib, bu misol "Xush kelibsiz" so'zini almashtiradi
birinchi %s va "Java Programming!" ikkinchi %s uchun. Chiqish ikki qatorni ko'rsatadi
matnlar ikki qatorda ko'rsatiladi.
E'tibor bering, biz qochish ketma-ketligini ishlatish o'rniga \n, biz %n format spetsifikatsiyasidan foydalanganmiz,
operatsion tizimlar bo'ylab ko'chma bo'lgan chiziq ajratuvchi. Siz %n dan foydalana olmaysiz

1 // 2.6-rasm: Welcome4.java


2 // System.out.printf usuli bilan bir nechta qatorlarni ko'rsatish.
3
4 ommaviy sinf Xush kelibsiz4
5 {
6 // asosiy usul Java dasturining bajarilishini boshlaydi
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11 } // tugatish usuli asosiy
12 } // yakuniy sinf Welcome4

Ga Xush kelibsiz


Java dasturlash!

2.6-rasm | System.out.printf usuli bilan bir nechta satrlarni ko'rsatish.

System.out.printf("%s%n%s%n",
"Xush kelibsiz", "Java dasturlash!");

Yaxshi dasturlash amaliyoti 2.6


Argumentlar roʻyxatida har bir verguldan (,) keyin boʻsh joy qoʻying, bu dasturlarni oʻqishni osonlashtiradi.

Umumiy dasturlash xatosi 2.6


Identifikator yoki satr o'rtasida bayonotni ajratish sintaktik xatodir.

System.out.printf("%s%n%s%n",


"Xush kelibsiz", "Java dasturlash!");

2.5 Yana bir ilova: 45 butun sonlarni qo'shish

System.out.print yoki System.out.println ga argument; Biroq, chiziq ajratuvchi
argumentini ko'rsatgandan so'ng, System.out.println tomonidan chiqariladi
tizimlari. Onlayn 1-ilovada printf bilan formatlash bo'yicha batafsil ma'lumotlar keltirilgan.
2.5 Boshqa dastur: Butun sonlarni qo'shish
Bizning keyingi ilovamiz ikkita butun sonni o'qiydi (yoki kiritadi), masalan, -22, 7, 0 va
1024) klaviaturada foydalanuvchi tomonidan terilgan, ularning yig'indisini hisoblab chiqadi va uni ko'rsatadi. Bu dastur
keyinroq dasturda hisoblash uchun foydalanuvchi tomonidan taqdim etilgan raqamlarni kuzatib borishi kerak.
Dasturlar kompyuter xotirasidagi raqamlar va boshqa ma'lumotlarni eslab qoladi va bu ma'lumotlarga kirishga imkon beradi
o'zgaruvchilar deb ataladigan dastur elementlari orqali. 2.7-rasmdagi dastur bularni ko'rsatadi.
tushunchalar. Namunaviy chiqishda foydalanuvchi kiritgan maʼlumotlarni aniqlash uchun qalin matndan foydalanamiz (yaʼni, 45 va 72). Sifatida
oldingi dasturlarda 1-2 qatorlarda rasm raqami, fayl nomi va dasturning maqsadi ko'rsatilgan.

2.5.1 Import deklaratsiyasi


Java-ning katta kuchi uning oldindan belgilangan sinflarning boy to'plamidir, siz ularni qayta ishlatishingiz mumkin emas
"g'ildirakni qayta ixtiro qilish." Bu sinflar o'zaro bog'liq guruhlar deb nomlangan paketlarga birlashtirilgan

1 // 2.7-rasm: Addition.java


2 // Ikki raqamni kiritadigan qo'shish dasturi, so'ngra ularning yig'indisini ko'rsatadi.
3
4
5 umumiy sinf qo'shimchasi
6 {
7 // asosiy usul Java dasturining bajarilishini boshlaydi
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10
11
12
13
14
15
16
17 System.out.print("Birinchi butun sonni kiriting: "); // so'rov
18
19
20 System.out.print("Ikkinchi butun sonni kiriting: "); // so'rov
21
22
23
24
25
26 } // tugatish usuli asosiy
27 } // oxirgi sinf Qo'shimchasi

Birinchi butun sonni kiriting: 45


Ikkinchi butun sonni kiriting: 72
Jami 117

2.7-rasm | Ikki raqamni kiritadigan qo'shish dasturi, keyin ularning yig'indisini ko'rsatadi.

import java.util.Scanner; // dastur Scanner sinfidan foydalanadi

// buyruq oynasidan ma'lumot olish uchun Skaner yarating


Skaner kiritish = yangi Skaner(System.in);

int raqami 1; // qo'shiladigan birinchi raqam


int raqami2; // qo'shiladigan ikkinchi raqam
int sum; // 1 va 2 sonining yig'indisi

raqam1 = input.nextInt(); // foydalanuvchidan birinchi raqamni o'qish

raqam2 = input.nextInt(); // foydalanuvchidan ikkinchi raqamni o'qish

yig'indisi = raqam1 + raqam2; // raqamlarni qo'shing, so'ngra jami yig'indida saqlang

System.out.printf("Sum %d%n", yig'indi); // summani ko'rsatish

46 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

sinflar - va birgalikda Java sinf kutubxonasi yoki Java ilovasi deb ataladi
Dasturlash interfeysi (Java API). 3-qator

kompilyatorga ushbu dasturda ishlatiladigan sinfni topishga yordam beradigan import deklaratsiyasi.


Bu dastur oldindan belgilangan Scanner sinfidan foydalanishini bildiradi (qisqacha muhokama qilinadi).
java.util nomli paket. Keyin kompilyator sinfdan to'g'ri foydalanishingizni ta'minlaydi.

2.5.2 Sinf qo'shimchasini e'lon qilish


5-qator

sinf qo'shish deklaratsiyasini boshlaydi. Ushbu umumiy sinf uchun fayl nomi bo'lishi kerak


Addition.java. Esda tutingki, har bir sinf deklaratsiyasining asosiy qismi ochilish bilan boshlanadi
chap qavs (6-qator) va yopilish o'ng qavs bilan tugaydi (27-qator).
Ilova asosiy usul bilan bajarilishini boshlaydi (8-26-qatorlar). Chap qavs
(9-satr) asosiy usul tanasining boshlanishini va mos keladigan o'ng qavsni belgilaydi
(26-satr) uning tugashini belgilaydi. Asosiy usul qo'shilish sinfining asosiy qismida bir daraja bilan cheklanadi,
va asosiy qismidagi kod o'qilishi uchun boshqa darajaga tushirilgan.
2.5.3 Foydalanuvchi ma'lumotlarini olish uchun skanerni e'lon qilish va yaratish
Klaviatura
O'zgaruvchi - bu kompyuter xotirasidagi qiymat keyinchalik foydalanish uchun saqlanishi mumkin bo'lgan joy
dasturda. Barcha Java o'zgaruvchilari ular bo'lishidan oldin nomi va turi bilan e'lon qilinishi kerak
ishlatilgan. O'zgaruvchining nomi dasturga xotiradagi o'zgaruvchining qiymatiga kirish imkonini beradi. A

import java.util.Scanner; // dastur Scanner sinfidan foydalanadi

Umumiy dasturlash xatosi 2.7
Barcha import deklaratsiyasi fayldagi birinchi sinf deklaratsiyasidan oldin paydo bo'lishi kerak. Joylashtirish
sinf deklaratsiyasi ichida yoki undan keyin import deklaratsiyasi sintaktik xatodir.

Umumiy dasturlash xatosi 2.8


Import qilinishi kerak bo'lgan sinf uchun import deklaratsiyasini kiritishni unutish natijasida a
"ramzni topa olmadi" kabi xabarni o'z ichiga olgan kompilyatsiya xatosi. Bu sodir bo'lganda,
to'g'ri import deklaratsiyasini taqdim etganingizni va ulardagi nomlar mavjudligini tekshiring
to'g'ri, shu jumladan to'g'ri kapitallashuv.

Dasturiy ta'minot muhandisligi kuzatuvi 2.1


Har bir yangi Java versiyasida API odatda xatolarni tuzatuvchi, yaxshilaydigan yangi imkoniyatlarni o'z ichiga oladi
ishlash yoki vazifalarni bajarish uchun yaxshiroq vositalarni taklif qilish. Tegishli eski versiyalar
endi kerak emas va foydalanmaslik kerak. Bunday API-lar eskirgan deb aytiladi va mumkin
keyingi Java versiyalaridan olib tashlanishi mumkin.
Onlayn API hujjatlarini ko'rib chiqishda siz tez-tez eskirgan API-larga duch kelasiz.
Eskirgan API-lardan foydalanadigan kodni kompilyatsiya qilganingizda kompilyator sizni ogohlantiradi. Agar siz kompilyatsiya qilsangiz
Sizning kodingizni javac bilan buyruq qatori -deprecation argumentidan foydalanib, kompilyator qiladi
qaysi eskirgan funksiyalardan foydalanayotganingizni ayting. Ularning har biri uchun onlayn hujjatlar
(http://docs.oracle.com/javase/7/docs/api/) ko'rsatadi va odatda yangisiga havola qiladi.
eskirgan xususiyatni almashtiradigan xususiyat.

umumiy sinf qo'shilishi


2.5 Boshqa dastur: Butun sonlarni qo'shish 47

o'zgaruvchining nomi har qanday to'g'ri identifikator bo'lishi mumkin - yana harflardan iborat belgilar qatori,
raqamlar, pastki chiziq (_) va dollar belgilari ($) raqam bilan boshlanmaydi va ularga mos kelmaydi.
bo'shliqlar. O'zgaruvchining turi o'sha joyda qanday ma'lumot saqlanishini belgilaydi
xotira. Boshqa bayonotlar singari, deklaratsiya bayonotlari nuqta-vergul (;) bilan tugaydi.
11-qator

nomi (kirish) va turini (Skaner) ko'rsatuvchi o'zgaruvchilar deklaratsiyasi bayonotidir.


ushbu dasturda ishlatiladigan o'zgaruvchi. Skaner dasturga ma'lumotlarni o'qish imkonini beradi (masalan, raqamlar
bers va strings) dasturda foydalanish uchun. Ma'lumotlar ko'plab manbalardan olinishi mumkin, masalan
klaviaturadagi foydalanuvchi yoki diskdagi fayl. Skanerni ishlatishdan oldin uni yaratishingiz va o'rnatishingiz kerak
ma'lumotlar manbasini aniqlang.
11-qatordagi = Skaner o'zgaruvchisi kiritilishi ishga tushirilishi kerakligini bildiradi (ya'ni, oldindan
dasturda foydalanish uchun ajratilgan) o'z deklaratsiyasida o'ngdagi ifoda natijasi bilan
tenglik belgisi - yangi Skaner (System.in). Bu iborada to new kalit so'zidan foydalaniladi
klaviaturada foydalanuvchi tomonidan kiritilgan belgilarni o'qiydigan Skaner ob'ektini yarating. stan-
Dard kiritish ob'ekti, System.in ilovalarga foydalanuvchi tomonidan kiritilgan ma'lumotlarni baytlarini o'qish imkonini beradi.
Skaner bu baytlarni dasturda ishlatilishi mumkin bo'lgan turlarga (masalan, ints) tarjima qiladi.
2.5.4 Butun sonlarni saqlash uchun o'zgaruvchilarni e'lon qilish
13-15-qatorlardagi o'zgaruvchan deklaratsiya bayonotlari

number1, number2 va sum o'zgaruvchilari int tipidagi ma'lumotlarni ushlab turishini e'lon qiling - ular


teger qiymatlari (72, –1127 va 0 kabi butun sonlar). Bu o'zgaruvchilar hali boshlang'ich emas-
qilingan. Int uchun qiymatlar diapazoni -2,147,483,648 dan +2,147,483,647 gacha. [Izoh: int
dasturda foydalanadigan qiymatlarda vergul bo'lmasligi mumkin.]
Ba'zi boshqa turdagi ma'lumotlar haqiqiy raqamlarni saqlash uchun float va double va char,
belgilar ma'lumotlarini saqlash uchun. Haqiqiy raqamlar o'nli nuqtalarni o'z ichiga oladi, masalan, 3,4, 0,0 va
-11.19. Char tipidagi o‘zgaruvchilar alohida belgilarni ifodalaydi, masalan, bosh harf
(masalan, A), raqam (masalan, 7), maxsus belgi (masalan, * yoki %) yoki qochish ketma-ketligi (masalan,
yorliq belgisi, \t). int, float, double va char turlari ibtidoiy tiplar deyiladi.
Primitiv tipdagi nomlar kalit so'zlar bo'lib, barcha kichik harflarda ko'rsatilishi kerak. D ilovasi
Sakkiz ibtidoiy tipning (mantiqiy, bayt, char, qisqa,
int, long, float va double).
Bir xil turdagi bir nechta o'zgaruvchilar bitta deklaratsiyada o'zgaruvchilar bilan e'lon qilinishi mumkin.
vergul bilan ajratilgan qobiliyatli nomlar (ya'ni, o'zgaruvchilar nomlarining vergul bilan ajratilgan ro'yxati). Uchun
Masalan, 13–15 qatorlarni quyidagicha yozish mumkin:

Skaner kiritish = yangi Skaner(System.in);

int raqami 1; // qo'shiladigan birinchi raqam
int raqami2; // qo'shiladigan ikkinchi raqam
int sum; // 1 va 2 sonining yig'indisi

int raqami1, // qo'shiladigan birinchi raqam


raqam2, // qo'shiladigan ikkinchi raqam
summa; // 1 va 2 sonining yig'indisi
Yaxshi dasturlash amaliyoti 2.7
Har bir o'zgaruvchini o'z deklaratsiyasida e'lon qiling. Ushbu format tavsiflovchi sharhga imkon beradi
e'lon qilinayotgan har bir o'zgaruvchining yoniga kiritilishi kerak.

48 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

2.5.5 Foydalanuvchini kiritishni taklif qilish
17-qator

"Birinchi butun sonni kiriting:" xabarini ko'rsatish uchun System.out.print dan foydalanadi. Bu xabar


so'rov deb ataladi, chunki u foydalanuvchini muayyan harakatni bajarishga yo'naltiradi. Biz chop etish usulidan foydalanamiz
Bu yerda println o'rniga foydalanuvchi kiritgan ma'lumotlar so'rov bilan bir xil satrda paydo bo'ladi.
2.2-bo'limda bosh harflar bilan boshlanadigan identifikatorlar odatda sinfni ifodalashini esga oling
ismlar. Sinf tizimi java.lang paketining bir qismidir. E'tibor bering, tizim sinfi import qilinmaydi -
dastur boshida import deklaratsiyasi bilan ed.

2.5.6 Foydalanuvchidan kirish sifatida int olish


18-qator

kalitda foydalanuvchidan butun sonni olish uchun Scanner ob'ektini kiritishning nextInt usulidan foydalanadi.


taxta. Bu vaqtda dastur foydalanuvchi raqamni kiritishini kutadi va Enter tugmasini bosing
raqamni dasturga yuborish uchun kalit.
Bizning dasturimiz foydalanuvchi haqiqiy tamsayı qiymatini kiritishini taxmin qiladi. Agar yo'q bo'lsa, ish vaqti mantig'i
xato yuzaga keladi va dastur o'z faoliyatini to'xtatadi. 11-bob, istisnolardan foydalanish: A
Chuqurroq ko'ring, dasturlaringizni qanday qilib ularga imkon berish orqali yanada mustahkamroq qilish mumkinligini muhokama qiladi
bunday xatolarni hal qiling. Bu, shuningdek, dasturni xatolarga chidamli qilish sifatida ham tanilgan.
18-qatorda keyingiInt usuliga qo'ng'iroq natijasini (int qiymati) o'zgaruvchiga joylashtiramiz.
belgilash operatori yordamida raqam1, =. Bayonot shunday o'qiladi: "1-raqam oladi
input.nextInt() qiymati.” Operator = ikkilik operator deb ataladi, chunki unda ikkita
operandlar - 1-raqam va input.nextInt() usulini chaqirish natijasi. Ushbu bayonot
o'zgaruvchiga qiymat berganligi uchun tayinlash bayonoti deyiladi. Hamma narsaga
tayinlash operatorining huquqi, =, har doim topshiriq bajarilishidan oldin baholanadi.

Yaxshi dasturlash amaliyoti 2.8


Ma'noli o'zgaruvchilar nomlarini tanlash dasturga o'z-o'zini hujjatlashtirishga yordam beradi (ya'ni, bitta
dasturni tegishli hujjatlarni o'qish orqali emas, balki uni o'qish orqali tushunishi mumkin.
zikr qilish yoki ortiqcha sonli sharhlarni yaratish va ko'rish).
Yaxshi dasturlash amaliyoti 2.9
An'anaga ko'ra, o'zgaruvchilar nomi identifikatorlari kichik harf va har bir so'z bilan boshlanadi
birinchi so'zdan keyingi ism bosh harf bilan boshlanadi. Masalan, o'zgaruvchi nomi identifikatori-
tiifier firstNumber ikkinchi so'zi bo'lgan Raqamni bosh N harfi bilan boshlaydi. Bu nomlash sharti-
tion tuya tuyasi deb nomlanadi, chunki bosh harflar tuya dumlari kabi ajralib turadi.

System.out.print("Birinchi butun sonni kiriting: "); // so'rov

Dasturiy ta'minot muhandisligi kuzatuvi 2.2
Sukut bo'yicha java.lang to'plami har bir Java dasturiga import qilinadi; Shunday qilib, sinflar
Java API-da import deklaratsiyasini talab qilmaydigan yagona narsa java.lang.

raqam1 = input.nextInt(); // foydalanuvchidan birinchi raqamni o'qish

Yaxshi dasturlash amaliyoti 2.10
O'qish uchun ikkilik operatorning har ikki tomoniga bo'sh joy qo'ying.

2.5 Boshqa dastur: Butun sonlarni qo'shish 49

2.5.7 Ikkinchi intni so'rash va kiritish
20-qator

foydalanuvchini ikkinchi butun sonni kiritishni taklif qiladi. 21-qator

ikkinchi butun sonni o'qiydi va uni raqam2 o'zgaruvchisiga tayinlaydi.
2.5.8 Hisoblashda o'zgaruvchilardan foydalanish
23-qator

raqam1 va raqam2 oʻzgaruvchilar yigʻindisini hisoblaydigan topshiriq bayoni


keyin tayinlash operatoridan foydalanib, natijani sum o'zgaruvchisiga belgilaydi, =. Bayonot
“sum 1+2 raqamining qiymatini oladi” deb o‘qiladi. Dastur bilan duch kelganda
qo'shish operatsiyasi, u o'zgaruvchilarda saqlangan qiymatlar yordamida hisob-kitoblarni amalga oshiradi
raqam 1 va raqam 2. Oldingi gapda qo'shish operatori ikkilik operatordir.
ator - uning ikkita operandlari raqam1 va raqam2 o'zgaruvchilari. Bayonotlarning bir qismi
hisob-kitoblarni o'z ichiga olgan ifodalar deyiladi. Aslida, ifoda holatning har qanday qismidir-
u bilan bog'liq qiymatga ega bo'lgan ment. Masalan, 1-sonli ifodaning qiymati
+ raqam2 - bu raqamlar yig'indisi. Xuddi shunday, input.next- ifoda qiymati
Int() - foydalanuvchi tomonidan kiritilgan butun son.
2.5.9 Hisoblash natijasini ko'rsatish
Hisoblash amalga oshirilgandan so'ng, 25-qator

summani ko'rsatish uchun System.out.printf usulidan foydalanadi. Format ko'rsatgichi %d - bu joy-joy


er int qiymati uchun (bu holda sum qiymati) - d harfi "o'nlik butun son" degan ma'noni anglatadi.
Format satridagi qolgan belgilarning barchasi sobit matndir. Shunday qilib, printf usuli dis-
"Sum is" ni o'ynaydi, undan keyin sum qiymati (%d format spetsifikatsiyasi pozitsiyasida)
va yangi qator.
Hisoblash printf iboralari ichida ham amalga oshirilishi mumkin. Biz kelishib olishimiz mumkin edi
23 va 25-qatorlardagi bayonotlarni bayonotga birlashtirdi

Raqam1 + raqam2 iborasi atrofidagi qavslar ixtiyoriy - ular kiritilgan


butun ifodaning qiymati %d o'rnida chiqarilishini ta'kidlash uchun-
mat spetsifikatsiyasi. Bunday qavslar ortiqcha deyiladi.
2.5.10 Java API hujjatlari
Biz foydalanadigan har bir yangi Java API klassi uchun biz u joylashgan paketni ko'rsatamiz. Bu
ma'lumotlar Java API hujjatidagi har bir paket va sinf tavsiflarini topishga yordam beradi.
zikr qilish. Ushbu hujjatning veb-versiyasini quyidagi manzilda topishingiz mumkin

System.out.print("Ikkinchi butun sonni kiriting: "); // so'rov

raqam2 = input.nextInt(); // foydalanuvchidan ikkinchi raqamni o'qish

yig'indisi = raqam1 + raqam2; // raqamlarni qo'shing, so'ngra jami yig'indida saqlang

System.out.printf("Sum %d%n", yig'indi); // summani ko'rsatish

System.out.printf("Yig'indi %d%n", (1-raqam + 2-raqam));

http://docs.oracle.com/javase/7/docs/api/index.html

50 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

Siz uni qo'shimcha manbalar bo'limidan yuklab olishingiz mumkin

F ilovasi ushbu hujjatlardan qanday foydalanishni ko'rsatadi.

2.6 Xotira tushunchalari
Raqam1, raqam2 va yig'indi kabi o'zgaruvchilar nomlari aslida joylashuvga mos keladi
kompyuter xotirasi. Har bir o'zgaruvchining nomi, turi, o'lchami (baytlarda) va qiymati bor.
2.7-rasmning qo'shimcha dasturida quyidagi operator (18-satr) bajarilganda:

foydalanuvchi tomonidan kiritilgan raqam nomga mos keladigan xotira joyiga joylashtiriladi


raqam 1. Faraz qilaylik, foydalanuvchi 45 ni kiritdi. Kompyuter bu butun sonni quyidagiga joylashtiradi.
kation raqami1 (2.8-rasm), o'sha joydagi oldingi qiymatni (agar mavjud bo'lsa) almashtiradi. oldingi -
zararli qiymat yo'qoladi, shuning uchun bu jarayon halokatli deb ataladi.

Bayonot qachon (21-qator)

bajaradi, deylik, foydalanuvchi 72 ni kiritadi. Kompyuter bu butun son qiymatini lo-
kation raqami 2. Xotira endi 2.9-rasmda ko'rsatilganidek paydo bo'ladi.

2.7-rasmdagi dastur 1-raqam va 2-raqam uchun qiymatlarni olgandan so'ng, u qo'shiladi


qiymatlarni beradi va jami o'zgaruvchan summaga joylashtiradi. Bayonot (23-qator)

qo'shishni amalga oshiradi, so'ngra har qanday oldingi qiymatni summaga almashtiradi. summa hisoblangandan so'ng


kechiktirilgan, xotira 2.10-rasmda ko'rsatilganidek paydo bo'ladi. 1 va 2 raqamining qiymatlari paydo bo'ladi
ular yig'indini hisoblashda ishlatilgunga qadar xuddi shunday. Ushbu qiymatlar ishlatilgan,
lekin kompyuter hisobni amalga oshirgani uchun yo'q qilinmadi. Qiymat o'qilganda
xotira joyi, jarayon buzilmaydi.

http://www.oracle.com/technetwork/java/javase/downloads/index.html

raqam1 = input.nextInt(); // foydalanuvchidan birinchi raqamni o'qish

2.8-rasm | 1 o'zgaruvchining nomi va qiymatini ko'rsatadigan xotira joylashuvi.

raqam2 = input.nextInt(); // foydalanuvchidan ikkinchi raqamni o'qish

2.9-rasm | Raqam1 va raqam2 uchun qiymatlarni saqlagandan keyin xotira joylari.

yig'indisi = raqam1 + raqam2; // raqamlarni qo'shing, so'ngra jami yig'indida saqlang

raqami 1 45

45

72

raqam 1



raqam 2

2.7 Arifmetika 51

2.7 Arifmetika
Aksariyat dasturlar arifmetik hisob-kitoblarni bajaradi. Arifmetik operatorlar yig'indisidir.
2.11-rasmda ko'rsatilgan. Algebrada ishlatilmaydigan turli xil maxsus belgilardan foydalanishga e'tibor bering. Yulduzcha
(*) ko'paytirishni bildiradi va foiz belgisi (%) qoldiq operatori, qaysi
tez orada muhokama qilamiz. 2.11-rasmdagi arifmetik operatorlar ikkilik operatorlardir, chunki
har biri ikkita operandda ishlaydi. Masalan, f + 7 ifodasi ikkilik op-
erator + va ikkita f va 7 operandlari.

Butun sonni bo'lish butun sonni beradi. Masalan, 7/4 ifodasi baholaydi


1 ga va 17/5 ifodasi 3 ga baholanadi. Butun son bo‘linishidagi har qanday kasr qismi
oddiygina kesilgan (ya'ni, tashlangan) - yaxlitlash sodir bo'lmaydi. Java qolgan operasiyani ta'minlaydi.
ator, %, bu bo'lingandan keyin qoldiqni beradi. x % y ifodasi qoldiqni beradi
x dan keyin y ga bo'linadi. Shunday qilib, 7 % 4 dan 3 ni, 17 % 5 esa 2 ni beradi. Bu operator eng qulay hisoblanadi.
ko'pincha butun operandlar bilan ishlatiladi, lekin u boshqa arifmetik turlari bilan ham ishlatilishi mumkin. In
Ushbu bobning mashqlari va keyingi boblarda biz bir nechta qiziqarli ilovalarni ko'rib chiqamiz
qolgan operator, masalan, bir sonning ikkinchisiga karrali ekanligini aniqlash.
To'g'ri chiziq shaklidagi arifmetik ifodalar
Java tilidagi arifmetik ifodalar kiritishni osonlashtirish uchun toʻgʻri chiziq shaklida yozilishi kerak
dasturlarni kompyuterga kiritish. Shunday qilib, "a bo'lingan b" kabi iboralar yozilishi kerak
a / b sifatida, shuning uchun barcha doimiylar, o'zgaruvchilar va operatorlar to'g'ri chiziqda paydo bo'ladi. Quyidagi -
ing algebraik yozuvlar odatda kompilyatorlar uchun qabul qilinmaydi:

2.10-rasm | Raqam 1 va raqam 2 yig'indisini saqlagandan so'ng xotira joylari.

Java operatsiyasi Operator Algebraik ifoda Java ifodasi

Qo'shish + f + 7 f + 7


Ayirish – p – cp – c
Ko'paytirish * bm b * m
Bo'linish / x / y yoki yoki x ÷ yx / y
Qolgan % r mod sr % s

2.11-rasm | Arifmetik operatorlar.

45

72

117



raqam 1

raqam 2


so'm

-xy-


a
-b-

52 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

Pastki ifodalarni guruhlash uchun qavslar
Qavslar Java iboralarida atamalarni algebraikdagi kabi guruhlash uchun ishlatiladi
ifodalar. Masalan, b + c miqdorini a marta ko'paytirish uchun biz yozamiz

Agar ifodada ichki qavslar bo'lsa, masalan

Qavslarning eng ichki to'plamidagi ifoda (bu holda a + b) birinchi navbatda baholanadi.
Operator ustuvorligi qoidalari
Java arifmetik ifodalardagi operatorlarni tomonidan aniqlangan aniq ketma-ketlikda qo'llaydi
operator ustunligi qoidalari, odatda, algebrada kuzatilganlar bilan bir xil:
1. Avval ko'paytirish, bo'lish va qoldiq amallari qo'llaniladi. Agar ifoda-
sion bir nechta shunday operatsiyalarni o'z ichiga oladi, ular chapdan o'ngga qo'llaniladi. Ko'paytma
kation, bo'lish va qoldiq operatorlari bir xil darajadagi ustunlikka ega.
2. Keyingi qo‘shish va ayirish amallari qo‘llaniladi. Agar ifoda mavjud bo'lsa
bir nechta bunday operatsiyalar, operatorlar chapdan o'ngga qo'llaniladi. Qo'shish va
ayirish operatorlari bir xil darajadagi ustunlikka ega.
Bu qoidalar Java-ga operatorlarni to'g'ri tartibda qo'llash imkonini beradi.1 Buni aytganda
operatorlar chapdan o'ngga qo'llaniladi, biz ularning assotsiativligini nazarda tutamiz. Ba'zi opera-
torlar o'ngdan chapga bog'lanadi. 2.12-rasmda operator ustuvorligining ushbu qoidalari jamlangan.
To'liq ustunlik jadvali A ilovasiga kiritilgan.

Namuna algebraik va Java ifodalari


Endi operator ustuvorligi qoidalarini hisobga olgan holda bir nechta ifodalarni ko'rib chiqamiz. Har biri
misolda algebraik ifoda va uning Java ekvivalenti keltirilgan. Bunga quyidagi misol keltiriladi
besh a'zodan iborat o'rtacha arifmetik (o'rtacha):

a * (b + c)

((a + b) * c)

1. Ifodalarni baholash tartibini tushuntirish uchun oddiy misollardan foydalanamiz. Nozik muammolar yuzaga keladi


Keyinchalik kitobda duch keladigan murakkabroq iboralar. Baholash tartibi haqida ko'proq ma'lumot olish uchun -
Java™ til spetsifikatsiyasining 15-bobiga qarang (http://docs.oracle.com/javase/
specs/jls/se7/html/index.html).

Operator(lar) Operatsiya(lar) Baholash tartibi (ustunlik)

*
/
%

Ko'paytirish


Bo'lim
Qolgan

Avval baholanadi. Buning bir nechta operatorlari bo'lsa


turi, ular chapdan o'ngga qarab baholanadi.

+
-


Qo'shish
Ayirish

Keyingi baholanadi. Buning bir nechta operatorlari bo'lsa


turi, ular chapdan o'ngga qarab baholanadi.
= Topshiriq oxirgi baholandi.

2.12-rasm | Arifmetik operatorlarning ustuvorligi.


2.7 Arifmetika 53

Qavslar kerak, chunki bo'linish qo'shishdan ko'ra ko'proq ustunlikka ega. The
butun miqdor (a + b + c + d + e) 5 ga bo'linadi. Qavslar noto'g'ri bo'lsa
tashlab qo'yilgan, biz a + b + c + d + e / 5 ni olamiz, bu sifatida baholanadi

To'g'ri chiziq tenglamasiga misol:

Qavslar kerak emas. Ko'paytirish operatori birinchi bo'lib qo'llaniladi, chunki ko'paytirish
kation qo'shilishdan yuqori ustunlikka ega. Topshiriq oxirgi bo'ladi, chunki u mavjud
ko'paytirish yoki qo'shishga qaraganda pastroq ustunlik.
Quyidagi misolda qoldiq (%), ko'paytirish, bo'lish, qo'shish va
ayirish operatsiyalari:

Bayonot ostidagi doira ichida joylashgan raqamlar Java-ning operatsiyani qo'llash tartibini ko'rsatadi.


tuzatuvchilar. *, % va / operatsiyalari birinchi navbatda chapdan o'ngga tartibda baholanadi (ya'ni, ular bir-biriga bog'langan-
chapdan o'ngga yedi), chunki ular + va - dan yuqori ustunlikka ega. + va -
keyingi operatsiyalar baholanadi. Ushbu operatsiyalar chapdan o'ngga ham qo'llaniladi. As-
imzolash (=) operatsiyasi oxirgi baholanadi.
Ikkinchi darajali polinomni baholash
Operatorning ustuvorligi qoidalarini yaxshiroq tushunish uchun baholashni ko'rib chiqing.
Ikkinchi darajali ax2 + bx + c polinomini o'z ichiga olgan topshiriq ifodasi:

Ko'paytirish amallari birinchi navbatda chapdan o'ngga tartibda baholanadi (ya'ni, ular bir-biriga bog'lanadi.


chapdan o'ngga), chunki ular qo'shishdan yuqori ustunlikka ega. (Javada arif yo'q -
eksponentsiya uchun metic operatori, shuning uchun x2 x * x sifatida ifodalanadi. 5.4-bo'limda al-
ko'rsatkichni bajarish uchun alternativ.) Qo'shish amallari quyidagidan keyin baholanadi
chapdan o'ngga. Faraz qilaylik, a, b, c va x lar quyidagicha ishga tushirildi (berilgan qiymatlar): a = 2, b = 3,
c = 7 va x = 5. 2.13-rasmda operatorlarni qo'llash tartibi ko'rsatilgan.
Ifodani yaratish uchun ortiqcha qavslardan (keraksiz qavslar) foydalanishingiz mumkin
aniqroq. Misol uchun, oldingi bayonot quyidagi kabi qavs ichida bo'lishi mumkin:

Algebra:
Java: m = (a + b + c + d + e) / 5;

Algebra:
Java: y = m * x + b;

y = (a * x * x) + (b * x) + c;

ma + b + c + d + e

= ------------------5-------------------

abcde

+ + + + -5--



y = mx + b

z

6 1 2 4 3 5



= p * r % q + w / x - y;

Algebra: z = pr%q + w/x – y


Java:

6 1 2 4 3 5

y = a * x * x + b * x + c;

54 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

2.8 Qaror qabul qilish: Tenglik va aloqa operatorlari
Shart - bu to'g'ri yoki noto'g'ri bo'lishi mumkin bo'lgan ifoda. Ushbu bo'lim Java-ning if-ni tanishtiradi
tanlov bayonoti, bu dasturga shartlar asosida qaror qabul qilish imkonini beradi
qiymat. Masalan, "baho 60 dan katta yoki unga teng" sharti quyidagilarni belgilaydi:
bir talaba testdan o'tdi. Agar if gapidagi shart rost bo'lsa, if ning tanasi
bayonot bajariladi. Agar shart noto'g'ri bo'lsa, tana bajarmaydi. Biz imtihonni ko'ramiz -
qisqa vaqt ichida iltimos.
If iboralarida shartlar tenglik operatorlari (== va.) yordamida tuzilishi mumkin
!=) va relyatsion operatorlar (>, <, >= va <=) 2.14-rasmda umumlashtirilgan. Har ikkala tenglik amal-
atorlar bir xil ustuvorlik darajasiga ega, bu aloqa operatorlarinikidan past.
Tenglik operatorlari chapdan o'ngga bog'lanadi. Relyatsion operatorlarning barchasida
bir xil darajadagi ustunlik va chapdan o'ngga bog'lash.

2.13-rasm | Ikkinchi darajali polinom baholanadigan tartib.

Algebraik
operator

Java tengligi yoki


aloqa operatori

Java namunasi


shart Java holatining ma'nosi

Tenglik operatorlari


= == x == yx y ga teng
¹ != x != yx y ga teng emas

2.14-rasm | Tenglik va munosabat operatorlari. (2-qismning 1-qismi.)

(Eng chap ko'paytirish)

(Eng chap ko'paytirish)

(Qo'shishdan oldin ko'paytirish)

(Eng chap qo'shimcha)

(Oxirgi qo'shimcha)

(Oxirgi operatsiya - y-da 72-o'rin)

1-qadam. y = 2 * 5 * 5 + 3 * 5 + 7;
2 * 5 - 10

2-qadam. y = 10 * 5 + 3 * 5 + 7;


10 * 5 - 50

3-qadam. y = 50 + 3 * 5 + 7;


3 * 5 - 15

4-qadam. y = 50 + 15 + 7;


50 + 15 - 65

5-qadam. y = 65 + 7;


65 + 7 - 72

6-qadam. y = 72


2.8 Qaror qabul qilish: Tenglik va aloqa operatorlari 55

2.15-rasmda foydalanuvchi kiritgan ikkita butun sonni solishtirish uchun oltita if operatoridan foydalaniladi. Agar
Bularning birortasidagi shart if iboralari to'g'ri bo'lsa, bu bilan bog'liq bo'lgan bayonot
ment bajaradi; aks holda, bayonot o'tkazib yuboriladi. Butun sonlarni kiritish uchun biz Skanerdan foydalanamiz
foydalanuvchidan oling va ularni number1 va number2 o'zgaruvchilarida saqlang. Dastur taqqoslaydi
raqamlar va taqqoslash natijalarini ko'rsatadi.

Aloqa operatorlari


> > x > yx y dan katta
< < x < yx y dan kichik
≥ >= x >= yx y dan katta yoki teng
≤ <= x <= yx y dan kichik yoki teng

1 // 2.15-rasm: Taqqoslash.java


2 // if iboralari, relyatsion operatorlar yordamida butun sonlarni solishtiring
3 // va tenglik operatorlari.
4 import java.util.Scanner; // dastur Scanner sinfidan foydalanadi
5
6 ommaviy sinf Taqqoslash
7 {
8 // asosiy usul Java dasturining bajarilishini boshlaydi
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 // buyruq satridan ma'lumot olish uchun Skaner yarating
12 Skaner kiritish = yangi Skaner(System.in);
13
14 int raqami1; // solishtirish uchun birinchi raqam
15 int raqami2; // solishtirish uchun ikkinchi raqam
16
17 System.out.print("Birinchi butun sonni kiriting: "); // so'rov
18 raqam1 = input.nextInt(); // foydalanuvchidan birinchi raqamni o'qish
19
20 System.out.print("Ikkinchi butun sonni kiriting: "); // so'rov
21 raqam2 = input.nextInt(); // foydalanuvchidan ikkinchi raqamni o'qish
22
23
24
25
26
27
28
29
30

2.15-rasm | If iboralari, relyatsion operatorlar va tenglik operatorlari yordamida butun sonlarni solishtiring.


(2-qismning 1-qismi.)

Algebraik


operator

Java tengligi yoki


aloqa operatori

Java namunasi


shart Java holatining ma'nosi

2.14-rasm | Tenglik va munosabat operatorlari. (2-qismning 2-qismi.)

agar (1-raqam == raqam2)
System.out.printf("%d == %d%n", 1-raqam, 2-raqam);

agar (1-raqam!= raqam2)


System.out.printf("%d != %d%n", 1-raqam, 2-raqam);

agar (1-raqam
System.out.printf("%d < %d%n", 1-raqam, 2-raqam);

56 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

Taqqoslash sinfi deklaratsiyasi 6-qatordan boshlanadi

Sinfning asosiy usuli (9–40-qatorlar) dasturni bajarishni boshlaydi. 12-qator

Skaner o'zgaruvchisini kiritishni e'lon qiladi va unga stantdan ma'lumotlarni kirituvchi Skanerni tayinlaydi.
dard kiritish (ya'ni, klaviatura).
14–15 qatorlar

foydalanuvchidan kiritilgan qiymatlarni saqlash uchun ishlatiladigan int o'zgaruvchilarni e'lon qilish.


17–18 qatorlar

31
32


33
34
35
36
37
38
39
40 } // tugatish usuli asosiy
41 } // yakuniy sinf taqqoslash

Birinchi butun sonni kiriting: 777


Ikkinchi butun sonni kiriting: 777
777 == 777
777 <= 777
777 >= 777

Birinchi butun sonni kiriting: 1000


Ikkinchi butun sonni kiriting: 2000
1000 != 2000
1000 < 2000
1000 <= 2000

Birinchi butun sonni kiriting: 2000


Ikkinchi butun sonni kiriting: 1000
2000 != 1000
2000 > 1000
2000 >= 1000

umumiy sinfni taqqoslash

Skaner kiritish = yangi Skaner(System.in);

int raqami 1; // solishtirish uchun birinchi raqam


int raqami2; // solishtirish uchun ikkinchi raqam

System.out.print("Birinchi butun sonni kiriting: "); // so'rov


raqam1 = input.nextInt(); // foydalanuvchidan birinchi raqamni o'qish

2.15-rasm | If iboralari, relyatsion operatorlar va tenglik operatorlari yordamida butun sonlarni solishtiring.


(2-qismning 2-qismi.)

agar (1-raqam > 2-raqam)


System.out.printf("%d > %d%n", 1-raqam, 2-raqam);

agar (1-raqam <= raqam2)


System.out.printf("%d <= %d%n", 1-raqam, 2-raqam);

agar (1-raqam >= 2-raqam)


System.out.printf("%d >= %d%n", 1-raqam, 2-raqam);

2.8 Qaror qabul qilish: Tenglik va aloqa operatorlari 57

foydalanuvchini birinchi butun sonni kiritishni va mos ravishda qiymatni kiritishni taklif qiladi. Qiymat
o'zgaruvchi raqami 1da saqlanadi.
20–21 qatorlar

foydalanuvchini ikkinchi butun sonni kiritishni va mos ravishda qiymatni kiritishni taklif qiladi. Qiymat


o'zgaruvchi raqami 2da saqlanadi.
23–24 qatorlar

1 va 2 sonining qiymatlarini solishtirib, ularning tengligini aniqlash. Agar


bayonot har doim if kalit so'zidan boshlanadi, undan keyin qavs ichidagi shart qo'yiladi. Agar
bayonot o'z tanasida bitta bayonotni kutadi, lekin agar bir nechta iboralarni o'z ichiga olishi mumkin
ular qavslar to'plamiga ({}) o'ralgan. Tana bayonotining chegarasi bu erda ko'rsatilgan
shart emas, lekin u davlat-
24-satrdagi ment 23-satrdan boshlanadigan if operatorining bir qismidir. 24-qator faqat agar bajariladi
number1 va number2 o'zgaruvchilarda saqlangan raqamlar teng (ya'ni, shart to'g'ri).
26–27, 29–30, 32–33, 35–36 va 38–39-qatorlardagi if iboralari 1-raqam bilan taqqoslanadi.
2 raqami mos ravishda !=, <, >, <= va >= operatorlari yordamida. Agar shart bittada yoki
if iboralarining ko'pi rost bo'lsa, tegishli tana bayonoti bajariladi.

Har bir if iborasining birinchi qatori oxirida nuqta-vergul (;) qo'yilmaydi. Bunday yarim-


ikki nuqta bajarilish vaqtida mantiqiy xatolikka olib keladi. Masalan,

aslida Java tomonidan talqin qilinadi

Bu erda chiziqdagi nuqta-vergulning o'zi - bo'sh gap deb ataladi - gap
if ko'rsatmasidagi shart rost bo'lsa bajarish uchun. Bo'sh bayonot bajarilganda,
hech qanday vazifa bajarilmaydi. Keyin dastur chiqish bayonoti bilan davom etadi, bu al-
yo'llar, shartning to'g'ri yoki noto'g'ri bo'lishidan qat'i nazar, bajariladi, chunki chiqish holati-
ment if iborasining bir qismi emas.

System.out.print("Ikkinchi butun sonni kiriting: "); // so'rov


raqam2 = input.nextInt(); // foydalanuvchidan ikkinchi raqamni o'qish

agar (1-raqam == raqam2)


System.out.printf("%d == %d%n", 1-raqam, 2-raqam);

Umumiy dasturlash xatosi 2.9


Tenglik operatori == bilan belgilash operatorini chalkashtirib yuborish mantiqiy xatoga olib kelishi mumkin.
ror yoki kompilyatsiya xatosi. Tenglik operatori "teng" va "teng" deb o'qilishi kerak
tayinlash operatori “oladi” yoki “qiymatini oladi”. Chalkashmaslik uchun ba'zi odamlar o'qiydilar
tenglik operatori “ikki barobar” yoki “teng teng”.

Yaxshi dasturlash amaliyoti 2.11


O'qish uchun dasturda har bir satrga faqat bitta bayonotni joylashtiring.

agar (1-raqam == raqam2); // mantiqiy xato


System.out.printf("%d == %d%n", 1-raqam, 2-raqam);

agar (1-raqam == raqam2)


; // bo'sh bayonot
System.out.printf("%d == %d%n", 1-raqam, 2-raqam);

58 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

Oq bo'shliq
2.15-rasmdagi oq bo'shliqdan foydalanishga e'tibor bering. Eslatib o'tamiz, kompilyator odatda oq rangga e'tibor bermaydi
bo'sh joy. Shunday qilib, bayonotlar bir nechta satrlarga bo'linishi mumkin va ular sizga mos ravishda joylashtirilishi mumkin
dastur ma'nosiga ta'sir qilmasdan imtiyozlar. Identifikatorlarni ajratish noto'g'ri va
torlar. Ideal holda, bayonotlar kichik bo'lishi kerak, ammo bu har doim ham mumkin emas.

Operatorlar hozirgacha muhokama qilingan


2.16-rasmda shu paytgacha muhokama qilingan operatorlar ustuvorlikning kamayishi tartibida ko'rsatilgan. Hammasi lekin
belgilash operatori, =, chapdan o'ngga bog'lang. Tayinlash operatori, =, assosi-
o'ngdan chapga yedi. Topshiriq ifodasining qiymati oʻzgaruvchanga qanday tayinlangan boʻlsa, shunday boʻladi.
= operatorining chap tomonida mumkin - masalan, x = 7 ifodasining qiymati 7 ga teng.
x = y = 0 kabi ifoda x = (y = 0) shaklida yozilgandek baholanadi, bu birinchi navbatda
y o'zgaruvchiga 0 qiymatini beradi, so'ngra ushbu tayinlash natijasini 0 ni x ga belgilaydi.

2.9 Yakunlash


Ushbu bobda siz Java-ning ko'plab muhim xususiyatlarini, jumladan ma'lumotlarni ko'rsatishni o'rgandingiz
Buyruqlar satridagi ekran, klaviaturadan ma'lumotlarni kiritish, hisob-kitoblarni bajarish
qarorlar qabul qilish va qabul qilish. Bu erda taqdim etilgan ilovalar sizni ko'plab asosiy narsalar bilan tanishtirdi
dasturlash tushunchalari. 3-bobda ko'rib turganingizdek, Java ilovalari odatda faqat o'z ichiga oladi
Asosiy usulda bir necha qator kodlar - bu bayonotlar odatda mos keladigan ob'ektlarni yaratadi.
ilova ishini shakllantirish. 3-bobda siz o'zingizni qanday amalga oshirishni o'rganasiz
sinflar va ilovalarda ushbu sinflarning ob'ektlaridan foydalaning.

Xatolarning oldini olish bo'yicha maslahat 2.5


Uzoq bayonot bir necha qatorga tarqalishi mumkin. Agar bitta bayonot bo'linishi kerak bo'lsa
chiziqlar bo'ylab, vergul bilan ajratilgan verguldan keyin kabi tabiiy uzilish nuqtalarini tanlang
ro'yxat yoki uzun ifodadagi operatordan keyin. Agar bayonot ikki yoki undan ortiq bo'lingan bo'lsa
satrlar, bayonot oxirigacha barcha keyingi qatorlarni chekintiring.

Operatorlar assotsiativligi turi

* /% chapdan o'ngga multiplikativ
+ - chapdan o'ngga qo'shimcha
< <= > >= chapdan o'ngga relyatsion
== != chapdan o'ngga tenglik
= o'ngdan chapga topshiriq

2.16-rasm | Operatorlarning ustuvorligi va assotsiativligi muhokama qilindi.

Yaxshi dasturlash amaliyoti 2.12
Ko'p operatorlarni o'z ichiga olgan iboralarni yozishda operator ustunligiga murojaat qiling
diagramma (A ilova). Ifodada amallar bajarilganligini tasdiqlang
siz kutgan buyurtma. Agar murakkab iborada siz baholash tartibiga ishonchingiz komil bo'lmasa,
Agar algebraik ifodalarda bo'lgani kabi tartibni majburlash uchun qavslardan foydalaning.

Xulosa 59



Xulosa
2.2-bo'lim Java-dagi birinchi dasturingiz: Matn qatorini chop etish
• JVMni ishga tushirish uchun java buyrug'idan foydalanganda Java ilovasi (35-bet) ishlaydi.
• Sharhlar (36-bet) dasturlarini hujjatlash va ularning o‘qilishini yaxshilash. Kompilyator ularga e'tibor bermaydi.
• // bilan boshlangan izoh satr oxiridagi izoh bo‘lib, u satr oxirida tugaydi
unda paydo bo'ladi.
• An'anaviy izohlar (36-bet) bir nechta satrlarga yoyilishi mumkin va ular /* va */ bilan chegaralanadi.
• /** va */ bilan chegaralangan Javadoc sharhlari (36-bet) dastur hujjatlarini joylashtirish imkonini beradi.
sizning kodingizda. Javadoc yordamchi dasturi ushbu sharhlar asosida HTML sahifalarni yaratadi.
• Sintaksis xatosi (36-bet; kompilyator xatosi, kompilyatsiya vaqtidagi xato yoki kompilyatsiya xatosi deb ham ataladi) oc-
kompilyator Java tili qoidalarini buzadigan kodga duch kelganida curs. Bu grammga o'xshaydi -
tabiiy tilda xato.
• Bo'sh chiziqlar, bo'sh joy belgilari va yorliq belgilar oq bo'shliq sifatida tanilgan (37-bet). Oq bo'shliq
dasturlarni o'qishni osonlashtiradi va kompilyator tomonidan e'tiborga olinmaydi.
• Kalit so'zlar (37-bet) Java tomonidan foydalanish uchun ajratilgan va har doim barcha kichik harflar bilan yoziladi.
• Klass kalit so‘zi (37-bet) sinf deklaratsiyasini taqdim etadi.
• An'anaga ko'ra, Java tilidagi barcha sinf nomlari bosh harf bilan boshlanadi va birinchi harfini katta qiladi
ular o'z ichiga olgan har bir so'z (masalan, SampleClassName).
• Java sinf nomi identifikator — harflar, raqamlar va pastki chiziqdan iborat belgilar qatoridir.
(_) va dollar belgilari ($) raqamlar bilan boshlanmaydi va bo'sh joylar mavjud emas.
• Java katta-kichik harflarga sezgir (38-bet) — ya'ni katta va kichik harflar farqlanadi.
• Har bir sinf deklaratsiyasining asosiy qismi (38-bet) qavslar bilan ajratilgan, { va }.
• Umumiy (37-bet) sinf deklaratsiyasi kuzatilgan sinf bilan bir xil nomdagi faylda saqlanishi kerak
".java" fayl nomi kengaytmasi orqali.
• Asosiy usul (38-bet) har bir Java ilovasining boshlang'ich nuqtasi bo'lib, undan boshlanishi kerak
umumiy statik void main(String[] args)
aks holda JVM dasturni bajarmaydi.
• Usullar vazifalarni bajaradi va ularni bajargandan so'ng ma'lumotlarni qaytaradi. Kalit so‘z bekor (38-bet)
usul vazifani bajarishini, lekin hech qanday ma'lumotni qaytarmasligini bildiradi.
• Bayonotlar kompyuterga amallarni bajarishni buyuradi.
• Qo‘sh tirnoq ichidagi satr (39-bet) ba’zan belgilar qatori yoki satr literali deb ataladi.
• Standart chiqarish obyekti (System.out; 39-bet) buyruqlar oynasida belgilarni aks ettiradi.
• System.out.println usuli (39-bet) o‘z argumentini (39-bet) buyruqlar oynasida ko‘rsatadi.
chiqish kursorini keyingi satr boshiga joylashtirish uchun yangi qator belgisi bilan tushiriladi.
• Javac buyrug'i bilan dasturni kompilyatsiya qilasiz. Agar dasturda sintaksis xatosi bo'lmasa, a
ilovani ifodalovchi Java bayt kodlarini o'z ichiga olgan sinf fayli (40-bet) yaratiladi. Bular
bayt-kodlar dasturni bajarayotganda JVM tomonidan talqin qilinadi.
• Ilovani ishga tushirish uchun java so'ngidan so'ng asosiy usulni o'z ichiga olgan sinf nomini kiriting.
2.3-bo'lim Birinchi Java dasturingizni o'zgartirish
• System.out.print (42-bet) o'z argumentini ko'rsatadi va chiqish kursorini darhol joylashtiradi.
ko'rsatilgan oxirgi belgi.
• Satrdagi teskari chiziq (\) qochish belgisidir (43-bet). Java uni keyingi belgi bilan birlashtiradi
qochish ketma-ketligini hosil qiling (43-bet). Qochish ketma-ketligi \n (43-bet) yangi qator belgisini ifodalaydi.

60 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar



2.4-bo'lim Matnni printf bilan ko'rsatish
• System.out.printf usuli (43-bet; f "formatlangan" degan ma'noni anglatadi) formatlangan ma'lumotlarni ko'rsatadi.
• Printf usulining birinchi argumenti qattiq matn va/yoki formatni o'z ichiga olgan format qatori (44-bet)
spetsifikatsiyalar. Har bir format spetsifikatsiyasi (44-bet) chiqarilishi kerak bo'lgan ma'lumotlar turini ko'rsatadi va to'ldiruvchi hisoblanadi
format satridan keyin paydo bo'ladigan mos keladigan argument uchun.
• Format spetsifikatsiyalari foiz belgisi (%) bilan boshlanadi va ni ifodalovchi belgidan keyin keladi
ma'lumotlar turi. Format spetsifikatori %s (44-bet) satr uchun joy ushlagichdir.
• %n format spetsifikatsiyasi (44-bet) portativ chiziq ajratuvchidir. Argumentda %n dan foydalana olmaysiz
System.out.print yoki System.out.println; Biroq, tizim tomonidan chiziq ajratuvchi chiqishi
tem.out.println o'z argumentini ko'rsatgandan so'ng, operatsion tizimlar bo'ylab ko'chma hisoblanadi.
2.5-bo'lim Boshqa dastur: Butun sonlarni qo'shish
• Import deklaratsiyasi (46-bet) kompilyatorga dasturda ishlatiladigan sinfni topishga yordam beradi.
• Java-ning oldindan belgilangan sinflarning boy to'plami paketlarga guruhlangan (45-bet) - sinflar guruhlari deb nomlangan.
Bular Java sinf kutubxonasi (46-bet) yoki Java amaliy dasturlash inter-
yuz (Java API).
• O‘zgaruvchi (46-bet) – kompyuter xotirasidagi qiymat keyinchalik foydalanish uchun saqlanishi mumkin bo‘lgan joy.
dasturda. Barcha o'zgaruvchilar foydalanishdan oldin nom va tur bilan e'lon qilinishi kerak.
• O‘zgaruvchining nomi dasturga o‘zgaruvchining xotiradagi qiymatiga kirish imkonini beradi.
• Skaner (java.util paketi; 47-bet) dasturga dastur foydalanadigan ma'lumotlarni o'qish imkonini beradi.
Skanerni ishlatishdan oldin dastur uni yaratishi va ma'lumotlar manbasini ko'rsatishi kerak.
• O'zgaruvchilarni dasturda foydalanishga tayyorlash uchun ishga tushirish kerak (47-bet).
• new Scanner(System.in) ifodasi standart kiritishdan o'qiydigan Skanerni yaratadi.
ob'ekt (System.in; 47-bet) - odatda klaviatura.
• Int ma'lumotlar turi (47-bet) butun son qiymatlarini saqlaydigan o'zgaruvchilarni e'lon qilish uchun ishlatiladi. Qiymatlar diapazoni
int uchun -2,147,483,648 dan +2,147,483,647 gacha.
• Float va double turlari (47-bet) 3,4 va –11,19 kabi kasrli haqiqiy sonlarni bildiradi.
• Char tipidagi o‘zgaruvchilar (47-bet) alohida belgilarni ifodalaydi, masalan, bosh harf (masalan,
A), raqam (masalan, 7), maxsus belgi (masalan, * yoki %) yoki qochish ketma-ketligi (masalan, tab, \t).
• int, float, double va char kabi turlar ibtidoiy tiplardir (47-bet). Primitiv tipdagi nomlar
kalit so'zlar; shuning uchun ular barcha kichik harflarda ko'rsatilishi kerak.
• So‘rov (48-bet) foydalanuvchini muayyan harakatni amalga oshirishga yo‘naltiradi.
• nextInt skaner usuli dasturda foydalanish uchun butun sonni oladi.
• Belgilash operatori = (48-bet) dasturga o'zgaruvchiga qiymat berish imkonini beradi. Bu deyiladi
ikkilik operator (48-bet), chunki u ikkita operandga ega.
• Qiymatga ega bo'lgan gaplarning qismlari ifodalar deyiladi (49-bet).
• %d format spetsifikatori (49-bet) int qiymati uchun to‘ldiruvchidir.
2.6-bo'lim Xotira tushunchalari
• O'zgaruvchilar nomlari (50-bet) kompyuter xotirasidagi joylarga mos keladi. Har bir o'zgaruvchida a bor
nomi, turi, hajmi va qiymati.
• Xotira joyiga qo'yilgan qiymat joyning oldingi yo'qolgan qiymatini almashtiradi.
2.7-bo'lim Arifmetika
• Arifmetik operatorlar (51-bet) + (qo‘shish), - (ayirish), * (ko‘paytirish), / (bo‘lish)
va % (qolgan).

O'z-o'zini tekshirish mashqlari 61

• Butun sonni bo‘lish (51-bet) butun sonni beradi.
• Qolgan operator % (51-bet) bo'lingandan keyin qolgan qismini beradi.
• Arifmetik ifodalar to‘g‘ri chiziq shaklida yozilishi kerak (51-bet).
• Agar ifoda ichki qavslarni o'z ichiga olsa (52-bet), birinchi navbatda eng ichki to'plam baholanadi.
• Java arifmetik ifodalardagi operatorlarni qoidalar bilan belgilangan aniq ketma-ketlikda qo'llaydi
operator ustunligi (52-bet).
• Operatorlar chapdan o'ngga qo'llaniladi deganda, biz ularning assotsiativligini nazarda tutamiz
(52-bet). Ba'zi operatorlar o'ngdan chapga bog'lanadi.
• Ortiqcha qavslar (53-bet) ifodani aniqroq qilishi mumkin.
2.8-bo'lim Qaror qabul qilish: Tenglik va aloqa operatorlari
• if bayonoti (54-bet) shartning qiymatiga (to'g'ri yoki noto'g'ri) qarab qaror qabul qiladi.
• If gaplardagi shartlar tenglik (== va !=) va relyatsion (>,) yordamida tuzilishi mumkin.
<, >= va <=) operatorlari (54-bet).
• If iborasi if kalit so‘zidan boshlanib, undan keyin qavs ichidagi shart keladi va uni kutadi
uning tanasida bayonot.
• Bo‘sh gap (57-bet) vazifani bajarmaydigan gapdir.

O'z-o'zini tekshirish mashqlari


2.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) A(n) har bir usulning tanasini boshlaydi va a(n) ning tanasini tugatadi
har bir usul.
b) Siz qaror qabul qilish uchun bayonotdan foydalanishingiz mumkin.
v) satr oxiridagi izohni boshlaydi.
d) , va oq bo'shliq deyiladi.
e) Java tomonidan foydalanish uchun ajratilgan.
f) Java ilovalari usulda bajarilishini boshlaydi.
g) Usullar va ma'lumotlarni buyruqda ko'rsatish win-
dow.
2.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Sharhlar kompyuterning matnni // dan keyin ekranda chop etishiga olib keladi.
gramm bajaradi.
b) Barcha o'zgaruvchilar e'lon qilinganda ularning turi berilishi kerak.
c) Java o'zgaruvchilar soni va NuMbErni bir xil deb hisoblaydi.
d) Qolgan operator (%) faqat butun operandlar bilan ishlatilishi mumkin.
e) *, /, %, + va - arifmetik operatorlari bir xil ustuvorlik darajasiga ega.
2.3 Quyidagi vazifalarning har birini bajarish uchun bayonotlar yozing:
a) c, thisIsAVariable, q76354 o'zgaruvchilari va raqamni int tipidagi deb e'lon qiling.
b) Foydalanuvchiga butun sonni kiritishni taklif qilish.
c) Butun sonni kiriting va natijani int o'zgaruvchi qiymatiga belgilang. Skaner o'zgaruvchisini qabul qiling
kiritish klaviaturadan qiymatni o'qish uchun ishlatilishi mumkin.
d) Buyruqlar oynasida bir qatorga “Bu Java dasturi”ni chop eting. Foydalanish usuli
System.out.println.
e) Buyruqlar oynasida ikki qatorga “Bu Java dasturi”ni chop eting. Birinchi qator
Java bilan tugashi kerak. System.out.printf usuli va ikkita %s format spetsifikatsiyasidan foydalaning.
f) Agar o'zgaruvchining soni 7 ga teng bo'lmasa, "O'zgaruvchining soni 7 ga teng emas" ko'rsatiladi.

62 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

2.4 Quyidagi bayonotlarning har biridagi xatolarni aniqlang va tuzating:
a) agar (c < 7);
System.out.println("c 7 dan kichik");
b) agar (c => 7)
System.out.println("c 7 ga teng yoki undan katta");
2.5 Quyidagi vazifalarning har birini bajaradigan deklaratsiyalar, bayonotlar yoki sharhlarni yozing:
a) Dastur uchta butun sonning ko'paytmasini hisoblashini ayting.
b) standart kirishdan qiymatlarni o'qiydigan kirish deb nomlangan Skaner yarating.
c) x, y, z o'zgaruvchilar va natijani int tipidagi deb e'lon qiling.
d) Foydalanuvchiga birinchi butun sonni kiritishni taklif qilish.
e) foydalanuvchining birinchi butun sonini o'qing va uni x o'zgaruvchisida saqlang.
f) Foydalanuvchiga ikkinchi butun sonni kiritishni taklif qilish.
g) foydalanuvchidan ikkinchi butun sonni o'qing va uni y o'zgaruvchisida saqlang.
h) Foydalanuvchiga uchinchi butun sonni kiritishni taklif qilish.
i) foydalanuvchidan uchinchi butun sonni o'qing va uni z o'zgaruvchisida saqlang.
j) x, y va z o‘zgaruvchilari tarkibidagi uchta butun sonning ko‘paytmasini hisoblang va tayinlang.
natijani o'zgaruvchan natijaga.
k) System.out.printf dan “Mahsulot is” xabaridan keyin qiymatini ko‘rsatish uchun foydalaning
o'zgaruvchan natija.
2.6 2.5-mashqda yozgan gaplaringizdan foydalanib, hisoblovchi to‘liq dastur tuzing
va uchta butun sonning ko'paytmasini chop etadi.
O'z-o'zini tekshirish mashqlariga javoblar
2.1 a) chap qavs ({), o'ng qavs (}). b) agar. c) //. d) Bo'shliq belgilari, yangi qatorlar va yorliqlar.
e) kalit so'zlar. f) asosiy. g) System.out.print, System.out.println va System.out.printf.
2.2 a) noto'g'ri. Sharhlar dastur bajarilganda hech qanday harakatni amalga oshirishga sabab bo'lmaydi.
Ular dasturlarni hujjatlashtirish va ularning o'qilishini yaxshilash uchun ishlatiladi.
b) To'g'ri.
c) yolg'on. Java katta harflarga sezgir, shuning uchun bu o'zgaruvchilar farqlanadi.
d) yolg'on. Qolgan operator Java-da butun son bo'lmagan operandlar bilan ham ishlatilishi mumkin.
e) yolg'on. *, / va % operatorlari + va - operatorlariga qaraganda ustunroqdir.
2.3 a) int c, thisIsAVariable, q76354, raqam;
yoki
int c;
int thisIsAVariable;
int q76354;
int raqami;
b) System.out.print("Butun sonni kiriting: ");
c) qiymat = input.nextInt();
d) System.out.println("Bu Java dasturi");
e) System.out.printf("%s%n%s%n", "Bu Java", "dastur");
f) agar (raqam!= 7)
System.out.println("O'zgaruvchining soni 7 ga teng emas");
2.4 a) Xato: if dagi shartning o'ng qavsdan keyin (c < 7) nuqtali vergul.
Tuzatish: o'ng qavsdan keyin nuqta-vergulni olib tashlang. [Izoh: Natijada,
chiqish bayonoti if dagi shart rost boʻlishidan qatʼiy nazar bajariladi.]
b) Xato: => munosabat operatori noto'g'ri. Tuzatish: => ni >= ga o'zgartiring.

O'z-o'zini tekshirish mashqlariga javoblar 63

2.5 a) // Uchta butun sonning ko‘paytmasini hisoblang
b) Skaner kiritish = yangi Skaner(System.in);
v) int x, y, z, natija;
yoki
int x;
int y;
int z;
int natijasi;
d) System.out.print("Birinchi butun sonni kiriting: ");
e) x = input.nextInt();
f) System.out.print("Ikkinchi butun sonni kiriting: ");
g) y = input.nextInt();
h) System.out.print("Uchinchi butun sonni kiriting: ");
i) z = input.nextInt();
j) natija = x * y * z;
k) System.out.printf("Mahsulot %d%n", natija);
2.6 O'z-o'zini tekshirish 2.6 mashqining yechimi quyidagicha:

1 // Masalan. 2.6: Product.java


2 // Uchta butun sonning ko'paytmasini hisoblang.
3 import java.util.Scanner; // dastur Skanerdan foydalanadi
4
5 ommaviy toifadagi mahsulot
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // buyruqlar oynasidan ma'lumot olish uchun Skaner yarating
10 Skaner kiritish = yangi Skaner(System.in);
11
12 int x; // foydalanuvchi tomonidan kiritilgan birinchi raqam
13 int y; // foydalanuvchi tomonidan kiritilgan ikkinchi raqam
14 int z; // uchinchi raqam foydalanuvchi tomonidan kiritiladi
15 int natija; // raqamlarning hosilasi
16
17 System.out.print("Birinchi butun sonni kiriting: "); // kiritish uchun so'rov
18 x = input.nextInt(); // birinchi butun sonni o'qish
19
20 System.out.print("Ikkinchi butun sonni kiriting: "); // kiritish uchun so'rov
21 y = input.nextInt(); // ikkinchi butun sonni o'qish
22
23 System.out.print("Uchinchi butun sonni kiriting: "); // kiritish uchun so'rov
24 z = input.nextInt(); // uchinchi butun sonni o'qing
25
26 natija = x * y * z; // raqamlar ko'paytmasini hisoblash
27
28 System.out.printf("Mahsulot %d%n", natija);
29 } // tugatish usuli asosiy
30 } // oxirgi sinf mahsuloti

Birinchi butun sonni kiriting: 10


Ikkinchi butun sonni kiriting: 20
Uchinchi butun sonni kiriting: 30
Mahsulot 6000

64 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

Mashqlar
2.7 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) dasturni hujjatlashtirish va uni o'qishni yaxshilash uchun ishlatiladi.
b) a(n) bilan Java dasturida qaror qabul qilinishi mumkin.
c) Hisob-kitoblar odatda bayonotlar orqali amalga oshiriladi.
d) ko'paytirish bilan bir xil ustunlikka ega arifmetik operatorlar va

.

e) arifmetik ifodadagi qavslar ichkariga kiritilganda qavslar to'plami-


birinchi navbatda tezislar baholanadi.
f) kompyuter xotirasida turli vaqtlarda turli qiymatlarni o'z ichiga olishi mumkin bo'lgan joy
dasturning butun bajarilishi a(n) deb ataladi.
2.8 Quyidagi vazifalarning har birini bajaradigan Java bayonotlarini yozing:
a) Kursorni xuddi shu satrda qoldirib, “Bitsayı kiriting:” xabarini ko‘rsating.
b) a o'zgaruvchiga b va c o'zgaruvchilarning ko'paytmasini belgilang.
c) Dastur ish haqini hisoblashning namunaviy hisob-kitobini amalga oshirishini bildirish uchun izohdan foydalaning.
2.9 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Java operatorlari chapdan o'ngga qarab baholanadi.
b) Quyidagilarning barchasi yaroqli oʻzgaruvchilar nomlari: _under_bar_, m928134, t5, j7, her_sales$,
uning_$hisobining_jami, a, b$, c, z va z2.
c) Qavssiz Java arifmetik ifodasi chapdan o'ngga qarab baholanadi.
d) Quyidagilar yaroqsiz oʻzgaruvchilar nomlari: 3g, 87, 67h2, h22 va 2h.
2.10 X = 2 va y = 3 deb faraz qilsak, quyidagi bayonotlarning har biri nimani ko'rsatadi?
a) System.out.printf("x = %d%n", x);
b) System.out.printf("%d + %d qiymati %d%n", x, x, (x + x));
c) System.out.printf("x =");
d) System.out.printf("%d = %d%n", (x + y), (y + x));
2.11 Quyidagi Java iboralarining qaysi birida qiymatlari o'zgartirilgan o'zgaruvchilar mavjud?
a) p = i + j + k + 7;
b) System.out.println("qiymatlari o'zgartirilgan o'zgaruvchilar");
c) System.out.println("a = 5");
d) qiymat = input.nextInt();
2.12 y = ax3 + 7 ekanligini hisobga olsak, ushbu tenglama uchun quyidagi Java iboralaridan qaysi biri to‘g‘ri?
a) y = a * x * x * x + 7;
b) y = a * x * x * (x + 7);
c) y = (a * x) * x * (x + 7);
d) y = (a * x) * x * x + 7;
e) y = a * (x * x * x) + 7;
f) y = a * x * (x * x + 7);
2.13 Quyidagi Java bayonotlarining har birida operatorlarni baholash tartibini ayting va
Har bir bayonot bajarilgandan keyin x qiymatini ko'rsating:
a) x = 7 + 3 * 6 / 2 - 1;
b) x = 2 % 2 + 2 * 2 - 2/2;
c) x = (3 * 9 * (3 + (9 * 3 / (3)));
2.14 Har bir juftlik bilan bir qatorda 1 dan 4 gacha raqamlarni aks ettiruvchi dastur yozing.
bir bo'shliq bilan ajratilgan qo'shni raqamlar. Quyidagi texnikalardan foydalaning:
a) Bitta System.out.println bayonotidan foydalaning.
b) to'rtta System.out.print bayonotidan foydalaning.
c) Bitta System.out.printf bayonotidan foydalaning.

65-mashqlar

2.15 (Arifmetik) Foydalanuvchidan ikkita butun sonni kiritishni so‘raydigan, ularni oladigan dastur yozing.
foydalanuvchidan va ularning yig'indisini, mahsulotini, farqini va qismini (bo'linishini) chop etadi. Texnikalardan foydalaning
2.7-rasmda ko'rsatilgan.
2.16 (Butun sonlarni solishtirish) Foydalanuvchidan ikkita butun sonni kiritishni so‘raydigan dasturni yozing.
ularni foydalanuvchidan oladi va kattaroq raqamdan keyin "kattaroq" so'zlarini ko'rsatadi. Agar raqam-
berlar teng bo'lsa, "Bu raqamlar teng" xabarini chop eting. 2.15-rasmda ko'rsatilgan usullardan foydalaning.
2.17 (Arifmetik, eng kichik va eng katta) dan uchta butun son kiritadigan dastur yozing.
foydalanuvchi va raqamlarning yig'indisi, o'rtacha, mahsuloti, eng kichiki va eng kattasini ko'rsatadi. Texnikalardan foydalaning
2.15-rasmda ko'rsatilgan. [Izoh: Ushbu mashqda o'rtachani hisoblash butun songa olib kelishi kerak
o'rtacha ko'rsatkich. Shunday qilib, agar qiymatlar yig'indisi 7 bo'lsa, o'rtacha 2 bo'lishi kerak emas, balki
2.3333….]
2.18 (Yulduzchalar bilan shakllarni ko'rsatish) Quti, oval, ar-ni ko'rsatadigan dastur yozing.
qator va olmos yulduzcha (*) yordamida quyidagicha:

2.19 Quyidagi kod nimani chop etadi?


System.out.printf("*%n**%n***%n****%n*****%n");
2.20 Quyidagi kod nimani chop etadi?
System.out.println("*");
System.out.println("***");
System.out.println("*****");
System.out.println("****");
System.out.println("**");
2.21 Quyidagi kod nimani chop etadi?
System.out.print("*");
System.out.print("***");
System.out.print("*****");
System.out.print("****");
System.out.println("**");
2.22 Quyidagi kod nimani chop etadi?
System.out.print("*");
System.out.println("***");
System.out.println("*****");
System.out.print("****");
System.out.println("**");
2.23 Quyidagi kod nimani chop etadi?
System.out.printf("%s%n%s%n%s%n", "*", "***", "*****");
2.24 (Eng katta va eng kichik butun sonlar) Beshta butun sonni o‘qiydigan va aniqlovchi dastur yozing.
va guruhdagi eng katta va eng kichik butun sonlarni chop etadi. Faqat dasturlash texnikasidan foydalaning
ushbu bobda o'rganilgan.

********* *** * *


* * * * *** * *
* * * * ***** * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
********* *** * *

66 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

2.25 (toq yoki juft) Butun sonni o‘qiydigan va quyidagini aniqlaydigan va chop etadigan dastur yozing.
Bu g'alati yoki juft. [Maslahat: Qolgan operatordan foydalaning. Juft son 2 ga karrali.
2 ning uchi 2 ga bo'linganda 0 ning qoldig'ini qoldiradi.]
2.26 (Ko'p sonli) Ikkita butun sonni o'qiydigan, birinchisining a yoki yo'qligini aniqlaydigan dastur yozing.
soniyaning ko'pligi va natijani chop etadi. [Maslahat: Qolgan operatordan foydalaning.]
2.27 (Yulduzchalarning shaxmat taxtasi naqshi) Shaxmat taxtasini ko'rsatadigan dastur yozing.
tern, quyidagicha:

2.28 (Diametri, aylanasi va doirasi) Mana oldinga nazar. Ushbu bobda siz


butun sonlar va int turi haqida bilib oldilar. Java shuningdek, o'z ichiga olgan suzuvchi nuqtali raqamlarni ham ko'rsatishi mumkin
kasrli nuqtalar, masalan, 3.14159. Foydalanuvchidan aylana radiusini kiritadigan dastur yozing
butun son sifatida va suzuvchi nuqta qiymatidan foydalanib aylananing diametri, aylanasi va maydonini chop etadi
p uchun 3.14159 . 2.7-rasmda ko'rsatilgan usullardan foydalaning. [Izoh: Siz oldindan belgilangan konfiguratsiyadan ham foydalanishingiz mumkin.
p qiymati uchun doimiy Math.PI. Bu doimiy 3.14159 qiymatidan aniqroq. Sinf matematika
java.lang paketida aniqlanadi. Ushbu paketdagi sinflar avtomatik ravishda import qilinadi, shuning uchun siz buni qilmaysiz
Uni ishlatish uchun Math sinfini import qilish kerak.] Quyidagi formulalardan foydalaning (r - radius):
diametri = 2r
aylana = 2 p r
maydon = p r2
Har bir hisoblash natijalarini o'zgaruvchida saqlamang. Aksincha, har bir hisob-kitobni belgilang
System.out.printf bayonotida chiqariladigan qiymat. Atrof-muhit tomonidan ishlab chiqarilgan qiymatlar
ferans va maydon hisoblari suzuvchi nuqtali raqamlardir. Bunday qiymatlarni quyidagi bilan chiqarish mumkin:
System.out.printf bayonotidagi %f mat ko'rsatkichi. Siz suzuvchi nuqta haqida ko'proq bilib olasiz
3-bobdagi raqamlar.
2.29 (Belgining butun soni) Mana yana bir ko'z oldimizda. Ushbu bobda siz bu haqda bilib oldingiz
butun sonlar va int turi. Java shuningdek, katta harflar, kichik harflar va ko'rib chiqilishi mumkin
turli xil maxsus belgilar. Har bir belgi mos keladigan butun son tasviriga ega. To'plam
kompyuter foydalanadigan belgilar bilan ular uchun mos keladigan butun son ko'rinishlari
belgilar kompyuterning belgilar majmuasi deb ataladi. Siz dasturda belgi qiymatini ko'rsatishingiz mumkin
oddiygina bu belgini "A" dagi kabi bitta tirnoq ichiga olish orqali.
Belgining tamsayı ekvivalentini o'sha belgi oldiga (int) qo'yish orqali aniqlashingiz mumkin
(int) 'A'
Bu shakldagi operator cast operatori deyiladi. (Siz 4-bobda cast operatorlari haqida bilib olasiz.)
Quyidagi bayonot belgi va uning butun ekvivalentini chiqaradi:
System.out.printf("%c belgisi %d%n qiymatiga ega", 'A', ((int) 'A'));
Oldingi bayonot bajarilganda, u A belgisini va 65 qiymatini ko'rsatadi (Uni-
code® belgilar to'plami) qatorning bir qismi sifatida. %c format ko'rsatgichi belgi uchun joy ushlagichdir (in
bu holatda "A" belgisi).
Ushbu mashqda ilgari ko'rsatilganiga o'xshash gaplardan foydalanib, o'z-o'zini anglatmaydigan dastur yozing.
ba'zi katta harflar, kichik harflar, raqamlar va maxsus belgilarning butun son ekvivalentlarini o'ynaydi.
Quyidagilarning butun son ekvivalentlarini ko'rsating: ABC abc 0 1 2 $ * + / va bo'sh belgi.

* * * * * * *


* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *

Farq qilish 67

2.30 (Raqamlarni butun sonda ajratish) Bitta raqamni kiritadigan dastur yozing:
foydalanuvchidan beshta raqamni ajratib, raqamni alohida raqamlarga ajratadi va raqamlarni chop etadi
bir-biridan uchta bo'shliq bilan ajratilgan. Masalan, agar foydalanuvchi 42339 raqamini yozsa,
dastur chop etishi kerak

Foydalanuvchi raqamlarning to'g'ri sonini kiritgan deb hisoblang. a kirganingizda nima bo'ladi


beshdan ortiq raqamli raqam? Beshdan kam raqamni kiritganingizda nima bo'ladi
raqamlar? [Maslahat: Ushbu mashqni ushbu bobda o'rgangan usullaringiz bilan bajarishingiz mumkin. Siz
Har bir raqamni "tanlab olish" uchun bo'lish va qolgan amallardan foydalanish kerak.]
2.31 (Kvadratlar va kublar jadvali) Bunda faqat siz o'rgangan dasturlash usullaridan foydalaning
bob, 0 dan 10 gacha bo'lgan sonlarning kvadratlari va kublarini hisoblaydigan dastur yozing va
olingan qiymatlarni quyida ko'rsatilganidek, jadval formatida chop etadi.

2.32 (Salbiy, musbat va nol qiymatlar) Beshta raqam kiritadigan va o'z-o'zidan ma'lumotni to'xtatuvchi dastur yozing.


minalar va manfiy raqamlar kiritish sonini chop etadi, musbat raqamlar kiritish soni va
nol kiritish soni.
Farq qilish
2.33 (Tana massasi indeksi kalkulyatori) Biz tana massasi indeksi (BMI) kalkulyatorini joriy yilda joriy qildik.
1.10-mashq. BMI ni hisoblash uchun formulalar

yoki


BMI kalkulyatorini yarating, u foydalanuvchining vaznini funt va bo'yini dyuymda o'qiydi (yoki oldindan
fer, foydalanuvchining kilogrammdagi vazni va metrdagi balandligi), so'ngra foydalanuvchini hisoblab chiqadi va ko'rsatadi
tana massasi indeksi. Shuningdek, Sog'liqni saqlash vazirligidan quyidagi ma'lumotlarni ko'rsating va
Inson xizmatlari/Milliy sog'liqni saqlash institutlari foydalanuvchi o'zining BMI ni baholashi uchun:

4 2 3 3 9

raqamli kvadrat kub
0 0 0
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000

BMI QIYMATLARI


Kam vazn: 18,5 dan kam
Oddiy: 18,5 dan 24,9 gacha
Ortiqcha vazn: 25 dan 29,9 gacha
Semirib ketish: 30 yoki undan yuqori

BMI


Og'irligi InFound × 703
balandligiDyuymlar × balandligiDyuymlar

= ------------------------------------------------- ----------------------------------

BMI

vaznda Kilogramm


balandligiInMeters × balandligiInMeters

= ------------------------------------------------- ---------------------------------------


68 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar

[Izoh: Ushbu bobda siz butun sonlarni ifodalash uchun int turidan foydalanishni o'rgandingiz. BMI hisob-
int qiymatlari bilan bajarilsa, ikkalasi ham butun sonli natijalarni beradi. 3-bobda siz
sonlarni kasrli nuqtalar bilan ifodalashda qo‘sh tipdan foydalanishni o‘rganing. BMI hisoblanganda
juftlik bilan bajarilsa, ikkalasi ham kasrli sonlarni chiqaradi - bular deyiladi
"suzuvchi nuqta" raqamlari.]
2.34 (Jahon aholisining o'sishi kalkulyatori) Joriy dunyo populyatsiyasini aniqlash uchun internetdan foydalaning.
ishlab chiqarish va dunyo aholisining yillik o'sish sur'ati. Ushbu qiymatlarni kiritadigan dastur yozing,
keyin bir, ikki, uch, to'rt va besh yildan keyin taxminiy dunyo aholisini ko'rsatadi.
2.35 (Avtomobil hovuzini tejash kalkulyatori) Bir nechta avtomobillarni birlashtirish veb-saytlarini o'rganing. Ilova yarating
Bu sizning kunlik haydash narxini hisoblab chiqadi, shunda siz qancha pulni tejashingiz mumkinligini taxmin qilishingiz mumkin
uglerod chiqindilarini kamaytirish va trafikni kamaytirish kabi boshqa afzalliklarga ega bo'lgan avtomobillarni birlashtirish
tirbandlik. Ilova quyidagi ma'lumotlarni kiritishi va foydalanuvchi narxini ko'rsatishi kerak
ishga haydash kuni:
a) Bir kunda yurilgan jami mil.
b) Bir gallon benzin narxi.
c) gallon uchun o'rtacha mil.
d) Kunlik to'xtash joyi to'lovlari.
e) kunlik bojlar.

3

Sinflarga kirish,


Ob'ektlar, usullar va
Strings

Davlat xizmatchilari sizga xizmat qiladi


to'g'ri.
-Adlai E. Stivenson
Busiz hech narsa qimmatga ega bo'lmaydi
foydali ob'ekt hisoblanadi.
-Karl Marks

Oh maqsadlar


Ushbu bobda siz quyidagilarni bilib olasiz:
■ Qanday qilib sinfni e'lon qilish va
ob'ekt yaratish uchun foydalaning.
■ Sinfni qanday amalga oshirish kerak
xatti-harakatlar usullari sifatida.
■ Sinfni qanday amalga oshirish kerak
atributlar misol sifatida
o'zgaruvchilar.
■ Ob'ektni qanday chaqirish mumkin
ularni yaratish usullari
vazifalarini bajarish.
■ a ning qanday mahalliy o'zgaruvchilari
usullari va ular qanday
misol o'zgaruvchilardan farq qiladi.
■ Qanday ibtidoiy tiplar va
mos yozuvlar turlari mavjud.
■ Konstruktordan qanday foydalanish kerak
ob'ekt ma'lumotlarini ishga tushirish.
■ Qanday ifodalash va foydalanish
o'nlikdan iborat raqamlar
ball.

70 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

3.1 Kirish
[Izoh: Ushbu bob ob'ektga yo'naltirilgan dastur terminologiyasi va tushunchalariga bog'liq.
ming 1.5-bo'lim, Ob'ekt texnologiyasiga kirishda kiritilgan.]
2-bobda siz mavjud sinflar, ob'ektlar va usullar bilan ishladingiz. Oldindan foydalangansiz
belgilangan standart chiqish ob'ekti System.out, uning usullarini chaqirib print, println va
ekranda ma'lumotlarni ko'rsatish uchun printf. Siz yaratish uchun mavjud Skaner sinfidan foydalangansiz
foydalanuvchi tomonidan klaviaturada terilgan butun xotira ma'lumotlarini o'qiydigan ob'ekt. orqali -
Kitobda siz yana ko'plab oldindan mavjud bo'lgan sinflar va ob'ektlardan foydalanasiz - bu eng zo'rlaridan biri
ob'ektga yo'naltirilgan dasturlash tili sifatida Java-ning kuchli tomonlari.
Ushbu bobda siz o'z sinflaringiz va uslublaringizni qanday yaratishni o'rganasiz. Har bir yangi
Siz yaratgan sinf o'zgaruvchilarni e'lon qilish va ob'ektlarni yaratish uchun ishlatilishi mumkin bo'lgan yangi turga aylanadi.
Agar kerak bo'lsa, yangi sinflarni e'lon qilishingiz mumkin; Bu Java kengaytiriladigan dastur sifatida tanilganining sabablaridan biridir
til.
Biz oddiy, haqiqiy bank hisobini yaratish va undan foydalanish bo'yicha amaliy tadqiqotni taqdim etamiz
sinf - Hisob. Bunday sinf o'z nomi kabi o'zgaruvchilar atributlarini misol sifatida saqlashi kerak
va muvozanat va balansni so'rash (getBalance) kabi vazifalar uchun usullarni taqdim eting.
balansni (depozitni) oshiradigan omonatlarni qo'yish va kamaytiruvchi yechib olish
balans (olib tashlash). Biz getBalance va depozit usullarini sinfga yaratamiz
bobning misollari va siz mashqlarda chekinish usulini qo'shasiz.
2-bobda biz butun sonlarni ifodalash uchun int ma'lumotlar turidan foydalandik. Ushbu bobda biz kirish -
hisob balansini o'z ichiga olishi mumkin bo'lgan raqam sifatida ko'rsatish uchun ma'lumotlar turini duce duce.
imal nuqta - bunday raqamlar suzuvchi nuqtali raqamlar deb ataladi. [8-bobda, biz a olganimizda
Ob'ekt texnologiyasiga biroz chuqurroq kirsak, biz pul miqdorini aniq ifodalashni boshlaymiz
sinf BigDecimal (paket java.math) sanoat-kuch yozishda qilish kerak
pul ilovalari.]

3.1 Kirish


3.2 Instance Variables, Set Methods and
usullarini oling
3.2.1 Instance bilan hisob klassi
O'zgaruvchi, to'plam usuli va get
Usul
3.2.2 Yaratuvchi AccountTest klassi
va sinf hisobi ob'ektidan foydalanadi
3.2.3 Ilovani kompilyatsiya qilish va bajarish
Bir nechta sinflar
3.2.4 Hisob UML klassi diagrammasi bilan
Instance Variable va o'rnating va oling
Usullari
3.2.5 Sinf bo'yicha qo'shimcha eslatmalar
Hisob testi
3.2.6 Dasturiy ta'minot muhandisligi xususiy
Misol o'zgaruvchilari va umumiy to'plam
va usullarni oling

3.3 Ibtidoiy turlar va mos yozuvlar turlari


3.4 Hisob sinfi: obyektlarni ishga tushirish
Konstruktorlar bilan
3.4.1 Hisob konstruktorini e'lon qilish
Maxsus ob'ektni ishga tushirish uchun
3.4.2 Class Account Test: Boshlash
Hisob ob'ektlari ular bo'lganda
Yaratilgan
3.5 Balans bilan hisob-kitoblar sinfi;
Suzuvchi nuqta raqamlari
3.5.1 Balansga ega hisob klassi
Double tipidagi misol o'zgaruvchisi
3.5.2 ClassTest klassidan foydalanish sinfi
Hisob
3.6 (ixtiyoriy) GUI va grafik korpus
O'rganish: Dialog oynalaridan foydalanish
3.7 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish


3.2 Instance o'zgaruvchilari, Methods o'rnating va Methods 71 ni oling

Odatda, ushbu kitobda siz yaratgan ilovalar ikki yoki undan ortiq sinfdan iborat bo'ladi. Agar Siz
sanoatda ishlab chiqish guruhining bir qismi bo'lish uchun siz o'z ichiga olgan ilovalarda ishlashingiz mumkin
yuzlab, hatto minglab sinflar.
3.2 Instance o'zgaruvchilar, Methods o'rnating va Methods oling
Ushbu bo'limda siz ikkita sinf yaratasiz - Hisob (3.1-rasm) va AccountTest (3.2-rasm).
Class AccountTest - bu asosiy usul yaratadigan va ishlatadigan dastur sinfidir
Hisob sinfining imkoniyatlarini namoyish qilish uchun hisob ob'ekti.
3.2.1 Instance o'zgaruvchisi, to'siq usuli va get bilan hisob klassi
Usul
Turli xil hisoblar odatda turli nomlarga ega. Shu sababli, sinf Hisob (3.1-rasm)
nom namunasi o'zgaruvchisini o'z ichiga oladi. Sinf namunasi o'zgaruvchilari har bir ob'ekt uchun ma'lumotlarni saqlaydi
(ya'ni, har bir misol) sinf. Keyinchalik bobda biz nomli misol o'zgaruvchisini qo'shamiz
balansda hisobda qancha pul borligini kuzatishimiz mumkin. Class Account con-
ikkita usulni oladi - setName usuli hisob ob'ekti va usulida nomni saqlaydi
getName hisob obyektidan nom oladi.

Sinf deklaratsiyasi


Sinf deklaratsiyasi 5-qatordan boshlanadi:

Public kalit so'zi (8-bobda batafsil tushuntirilgan) kirish modifikatoridir. Hozircha,


Biz shunchaki har bir sinfni ochiq deb e'lon qilamiz. Har bir umumiy sinf deklaratsiyasi faylda saqlanishi kerak
sinf bilan bir xil nomga ega va .java fayl nomi kengaytmasi bilan tugaydigan; aks holda,

1 // 3.1-rasm: Account.java


2 // Ism namunasi o'zgaruvchisini o'z ichiga olgan hisob klassi
3 // va uning qiymatini belgilash va olish usullari.
4
5 umumiy sinf hisobi
6 {
7
8
9
10
11
12
13
14
15
16
17
18
19
20 } // oxirgi sinf hisobi

3.1-rasm | Nom namunasi o'zgaruvchisi va uni o'rnatish va olish usullarini o'z ichiga olgan hisob sinfi


qiymat.

umumiy sinf hisobi

xususiy string nomi; // misol o'zgaruvchisi

// ob'ektga nom o'rnatish usuli


public void setName (String nomi)
{
this.name = name; // nomini saqlang
}

// ob'ektdan nom olish usuli


public String getName()
{
qaytish nomi; // qo'ng'iroq qiluvchiga ismning qiymatini qaytaring
}

72 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

kompilyatsiya xatosi yuzaga keladi. Shunday qilib, umumiy sinflar Hisob va AccountTest (3.2-rasm)
tegishli ravishda Account.java va AccountTest.java alohida fayllarida e'lon qilinishi kerak.
Har bir sinf deklaratsiyasida sinf kalit so'zidan keyin darhol
sinf nomi - bu holda, Hisob. Har bir sinfning tanasi chap va o'ng juftlik bilan o'ralgan
3.1-rasmning 6 va 20-qatorlaridagi kabi qavslar.
Identifikatorlar va tuya holatini nomlash
Sinf nomlari, metod nomlari va oʻzgaruvchilar nomlari hammasi identifikatorlar boʻlib, anʼanaga koʻra ulardan foydalaniladi
Xuddi shu tuya ishi nomlash sxemasi biz 2-bobda muhokama qilingan. Shuningdek, konventsiya, sinf bo'yicha
nomlar bosh harf bilan boshlanadi va usul nomlari va o'zgaruvchilar nomlari boshlanadi
boshlang'ich kichik harf bilan.
Namuna oʻzgaruvchisi nomi
1.5-bo'limdan ob'ektning misol o'zgaruvchilari sifatida amalga oshirilgan atributlariga ega ekanligini eslang
va butun umri davomida u bilan birga olib bordi. Namuna o'zgaruvchilari usullardan oldin mavjud
Usullar bajarilayotganda va usullar bajarilgandan so'ng ob'ektga chaqiriladi.
kesish. Sinfning har bir ob'ekti (nasolasi) sinf misol o'zgaruvchilarining o'z nusxasiga ega.
Sinf odatda misol o'zgaruvchilarini boshqaradigan bir yoki bir nechta usullarni o'z ichiga oladi.
sinfning muayyan ob'ektlariga intilish.
Namuna o'zgaruvchilari sinf deklaratsiyasi ichida e'lon qilinadi, lekin uning tanasidan tashqarida
sinf usullari. 7-qator

String tipidagi misol o'zgaruvchisi nomini setName (satrlar) usullari tanasidan tashqarida e'lon qiladi


10–13) va getName (16–19-qatorlar). String o'zgaruvchilari belgilar qatori qiymatlarini ushlab turishi mumkin
"Jeyn Grin" sifatida. Hisob ob'ektlari ko'p bo'lsa, ularning har biri o'z nomiga ega. Chunki ism
misol o'zgaruvchisi bo'lib, u sinfning har bir usuli bilan boshqarilishi mumkin.

Umumiy va shaxsiy kirish modifikatorlari


Ko'pgina misol o'zgaruvchilari deklaratsiyasidan oldin private kalit so'zi mavjud (7-qatordagi kabi).
Ommaviy kabi, private ham kirish modifikatoridir. Kirish rejimi bilan e'lon qilingan o'zgaruvchilar yoki usullar
ifier private ga faqat ular e'lon qilingan sinf usullaridan foydalanish mumkin. Shunday qilib,
o'zgaruvchi nomi faqat har bir Hisob ob'ektining usullarida ishlatilishi mumkin (setName va getName in
bu holat). Tez orada bu kuchli dasturiy ta'minot muhandisligi imkoniyatlarini taqdim etishini ko'rasiz.
sinf hisobining setName usuli
Keling, setName usuli deklaratsiyasining kodini ko'rib chiqaylik (10-13 qatorlar):

xususiy string nomi; // misol o'zgaruvchisi

Yaxshi dasturlash amaliyoti 3.1
Siz nomlarini ko'rishingiz uchun biz sinfning misol o'zgaruvchilarini sinf tanasida birinchi bo'lib ro'yxatga olishni afzal ko'ramiz.
va o'zgaruvchilarning sinf usullarida qo'llanilishidan oldin turlari. Siz sinflarni ro'yxatga olishingiz mumkin
misol o'zgaruvchilari sinfning istalgan joyida, uning metod deklaratsiyasidan tashqarida, lekin tarqaladi
misol o'zgaruvchilari o'qish qiyin bo'lgan kodga olib kelishi mumkin.

public void setName (String nomi)


{
this.name = name; // nomini saqlang
}

Ushbu qator usul sarlavhasidir


3.2 Instance o'zgaruvchilari, Methods o'rnating va Methods 73 ni oling

Har bir usul deklaratsiyasining birinchi qatoriga (bu holda 10-satr) usul sifatida murojaat qilamiz
sarlavha. Usulning qaytish turi (usul nomidan oldin paydo bo'ladi) ni belgilaydi
usul o'z vazifasini bajargandan so'ng qo'ng'iroq qiluvchiga qaytaradigan ma'lumotlar turi. Qaytish turi bekor
(10-satr) setName vazifani bajarishini, lekin hech birini qaytarmasligini (ya'ni, qaytarib bermasligini) bildiradi
qo'ng'iroq qiluvchiga ma'lumot. 2-bobda siz ma'lumotni qaytaradigan usullardan foydalandingiz, masalan.
etarli, siz kalitda foydalanuvchi tomonidan kiritilgan butun sonni kiritish uchun nextInt Scanner usulidan foydalangansiz.
taxta. NextInt foydalanuvchidan qiymatni o'qiganda, u ushbu qiymatni faylda ishlatish uchun qaytaradi
dastur. Tez orada ko'rib turganingizdek, GetName hisob usuli qiymatni qaytaradi.
SetName usuli String tipidagi parametr nomini oladi - bu nomni ifodalaydi
bu usulga argument sifatida uzatiladi. Parametrlar va argumentlar qanday ekanligini ko'rasiz
3.2-rasmning 21-qatoridagi usul chaqiruvini muhokama qilganimizda birgalikda ishlash.
Parametrlar qavslar ichida joylashgan parametrlar ro'yxatida e'lon qilinadi
usul sarlavhasidagi usul nomiga amal qiladi. Agar bir nechta parametr mavjud bo'lsa,
har biri keyingisidan vergul bilan ajratiladi. Har bir parametr turini ko'rsatishi kerak (bu erda
case, String) so'ng o'zgaruvchi nomi (bu holda, ism).
Parametrlar mahalliy o'zgaruvchilardir
2-bobda biz ilovaning barcha o'zgaruvchilarini asosiy usulda e'lon qildik. E'lon qilingan o'zgaruvchilar
ma'lum bir usulning tanasida (masalan, asosiy) mahalliy o'zgaruvchilar mavjud bo'lib, ulardan faqat foydalanish mumkin
bu usul. Har bir usul faqat o'zining mahalliy o'zgaruvchilariga kirishi mumkin, boshqa usullarning o'zgaruvchilari emas.
ehtimol. Usul tugashi bilan uning mahalliy o'zgaruvchilari qiymatlari yo'qoladi. Bir usul pa-
rameters ham usulning mahalliy o'zgaruvchilari hisoblanadi.
setName usuli tanasi
Har bir usul tanasi bir juft qavs bilan chegaralangan (3.1-rasmning 11 va 13-qatorlarida bo'lgani kabi)
usulning vazifalarini bajaradigan bir yoki bir nechta bayonotlarni olish. Bunday holda, usul
body nom parametrining qiymatini belgilaydigan bitta bayonotni (12-qator) o'z ichiga oladi (a
String) sinf nomi namunasi o'zgaruvchisiga, shu bilan ob'ektda hisob nomini saqlaydi.
Agar usulda misol o'zgaruvchisi bilan bir xil nomga ega mahalliy o'zgaruvchi bo'lsa (masalan
mos ravishda 10 va 7 qatorlar), bu usulning tanasi mahalliy o'zgaruvchiga emas, balki mahalliy o'zgaruvchiga ishora qiladi.
misol o'zgaruvchisi. Bunday holda, mahalliy o'zgaruvchi misol o'zgaruvchisini soya qiladi
usul tanasida. Usul tanasi shad-ga murojaat qilish uchun this kalit so'zidan foydalanishi mumkin.
12-qatordagi topshiriqning chap tomonida ko'rsatilganidek, misol o'zgaruvchisi aniq qarzdor.

12-qator bajarilgandan so'ng, usul o'z vazifasini bajardi, shuning uchun u qo'ng'iroq qiluvchiga qaytadi. Sifatida


tez orada ko'rasiz, asosiy ning 21-qatoridagi bayonot (3.2-rasm) setName usulini chaqiradi.
sinf hisobining getName usuli
getName usuli (16–19-qatorlar)

Yaxshi dasturlash amaliyoti 3.2


Boshqa nom tanlash orqali biz bu yerda kalit so'zni ishlatishdan qochishimiz mumkin edi
10-qatordagi parametr, lekin 12-satrda ko'rsatilganidek this kalit so'zidan foydalanish keng tarqalgan.
identifikator nomlarining ko'payishini minimallashtirish uchun qabul qilingan amaliyot.

public String getName()


{
qaytish nomi; // qo'ng'iroq qiluvchiga ismning qiymatini qaytaring
}

Qaytish kalit so'zi String nomini qaytarib beradi


usulning chaqiruvchisi

74 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

qo'ng'iroq qiluvchiga ma'lum Hisob ob'ektining nomini qaytaradi. Usul bo'sh parametrga ega -
ter ro'yxati, shuning uchun u o'z vazifasini bajarish uchun qo'shimcha ma'lumot talab qilmaydi. Usul qayta-
Stringni aylantiradi. voiddan boshqa qaytish turini belgilaydigan usul va chaqirilganda
o'z vazifasini bajarsa, u qo'ng'iroq qiluvchiga natijani qaytarishi kerak. Get usulini chaqiradigan bayonot
Hisob ob'ektidagi nom (masalan, 3.2-rasmning 16 va 26-qatorlaridagilar) qayta ko'rib chiqilishini kutadi.
Hisob nomini qabul qiling - usul deklaratsiyasining qaytarish turida ko'rsatilganidek, String.
3.1-rasmning 18-qatoridagi qaytish bayonoti o'zgaruvchan misolning String qiymatini o'tkazadi.
qo'ng'iroq qiluvchiga ismni qaytarish mumkin. Misol uchun, qiymat in ifodasiga qaytarilganda
3.2-rasmning 25-26-qatorlari, bayonot nomni chiqarish uchun ushbu qiymatdan foydalanadi.

3.2.2 Sinf ob'ektini yaratuvchi va undan foydalanadigan AccountTest klassi


Hisob
Keyinchalik, ilovada hisob sinfidan foydalanishni va uning har bir usulini chaqirishni xohlaymiz. Bu sinf
Java ilovasining bajarilishini boshlaydigan asosiy usulni o'z ichiga oladi. Class hisobi bajarilmaydi
o'z-o'zidan, chunki u asosiy usulni o'z ichiga olmaydi - agar siz java hisobini com-ga yozsangiz.
mand oynasida “Asosiy usul hisob qaydnomasi sinfida topilmadi” degan xatolik paydo bo‘ladi.
Ushbu muammoni hal qilish uchun siz asosiy usulni o'z ichiga olgan alohida sinfni e'lon qilishingiz kerak
yoki asosiy usulni Hisob sinfiga joylashtiring.
Haydovchi sinfi hisob testi
Ushbu kitobda va keyinroq duch keladigan kattaroq dasturlarga tayyorlanishingizga yordam berish uchun
chang, biz test sinfi uchun main usulini o'z ichiga olgan alohida AccountTest sinfidan foydalanamiz (3.2-rasm).
Hisob. Main ishlay boshlagach, u shu va boshqa sinflardagi boshqa usullarni chaqirishi mumkin;
ular, o'z navbatida, boshqa usullarni chaqirishi mumkin va hokazo. Class AccountTest-ning asosiy usuli yaratish-
bitta Account obyektini egallaydi va uning getName va setName usullarini chaqiradi. Bunday sinf ba'zi-
Vaqtlar haydovchi sinfi deb ataladi - xuddi Person ob'ekti Car ob'ektini unga nima qilish kerakligini aytib, boshqargani kabi
qilish (tezroq borish, sekinroq borish, chapga, o'ngga burilish va h.k.), Class AccountTest hisobni boshqaradi
ob'ekt, uning usullarini chaqirish orqali unga nima qilish kerakligini aytadi.

1 // 3.2-rasm: AccountTest.java


2 // Hisob obyektini yaratish va manipulyatsiya qilish.
3 import java.util.Scanner;
4
5 umumiy sinf Hisob Testi
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // buyruq oynasidan ma'lumot olish uchun Skaner ob'ektini yarating
10 Skaner kiritish = yangi Skaner(System.in);
11
12
13
14
15 // nomning boshlang'ich qiymatini ko'rsatish (null)
16 System.out.printf("Boshlang'ich nomi: %s%n%n", );
17

3.2-rasm | Hisob ob'ektini yaratish va manipulyatsiya qilish. (2-qismning 1-qismi.)

// Hisob ob'ektini yarating va uni myAccount-ga tayinlang
Account myAccount = new Account();

myAccount.getName()


3.2 Instance Variables, Methods ni o'rnating va Methods 75 ni oling

Foydalanuvchidan ma'lumotlarni qabul qilish uchun skaner ob'ekti
10-qator foydalanuvchi nomini kiritish uchun kirish nomli Skaner obyektini yaratadi. Chiziq
19 foydalanuvchidan ism kiritishni taklif qiladi. 20-qator Skaner obyektining nextLine usulidan foydalanadi
foydalanuvchi nomini o'qing va uni theName mahalliy o'zgaruvchisiga tayinlang. Ismni yozasiz
va dasturga yuborish uchun Enter tugmasini bosing. Enter tugmasini bosgandan keyin yangi qator belgisi kiritiladi
siz yozgan belgilar. Keyingi qator belgilarni o'qiydi (shu jumladan oq bo'shliq belgisi
ters, masalan, "Jane Green"dagi bo'sh joy) yangi qatorga duch kelmaguncha, keyin a ni qaytaradi
Yangi satrgacha boʻlgan belgilarni oʻz ichiga olgan, lekin bekor qilingan qator.
Class Scanner turli xil kiritish usullarini taqdim etadi, buni siz butun sahifada ko'rasiz
kitob. Keyingi qatorga o'xshash usul - keyingi nomli - keyingi so'zni o'qiydi. Bosganingizda
Matnni kiritgandan so'ng kiriting, keyingi usul bo'sh bo'shliqqa duch kelmaguncha belgilarni o'qiydi
belgi (masalan, bo'sh joy, yorliq yoki yangi qator), keyin belgilarni o'z ichiga olgan Stringni qaytaradi
qadar, lekin shu jumladan, bo'sh joy belgisi, tashlanadi. Barcha ma'lumotlar
birinchi bo'shliq belgisi yo'qolmaganidan keyin - uni keyingi iboralar orqali o'qish mumkin
keyinroq dasturda Skaner usullarini chaqiring.
Ob'ektni yaratish - yangi kalit so'z va Konstruktorlar
13-qator Hisob obyektini yaratadi va uni Account turidagi myAccount o‘zgaruvchisiga tayinlaydi.
myAccount o'zgaruvchisi sinf namunasini yaratish ifodasi natijasi bilan ishga tushiriladi
yangi hisob (). new kalit so'zi belgilangan sinfning yangi ob'ektini yaratadi - bu holda, Ac-
hisoblash. Hisobning o'ng tomonidagi qavslar talab qilinadi. 3.4-bo'limda bilib olasiz,
bu qavslar sinf nomi bilan birgalikda konstruktorga qo'ng'iroqni ifodalaydi
usulga o'xshaydi, lekin ob'ektni ishga tushirish uchun new operator tomonidan bilvosita chaqiriladi
ob'ekt yaratilganda misol o'zgaruvchilari. 3.4-bo'limda siz ar-ni qanday joylashtirishni ko'rasiz.
Hisob ob'ekti nomi misoli uchun boshlang'ich qiymatni ko'rsatish uchun qavslar ichiga belgi qo'ying
o'zgaruvchi - buni yoqish uchun siz sinf hisobini yaxshilaysiz. Hozircha biz ota-onani qoldiramiz-
tezislar bo'sh. 10-qatorda Skaner obyekti uchun sinf namunasini yaratish ifodasi mavjud—

18 // nomini so'rash va o'qish


19 System.out.println("Iltimos, nomini kiriting:");
20
21
22 System.out.println(); // bo'sh qatorni chiqaradi
23
24 // myAccount ob'ektida saqlangan nomni ko'rsatish
25 System.out.printf("MyAccount ob'ektidagi nom:%n%s%n",
26);
27 }
28 } // yakuniy sinf AccountTest

Dastlabki ism: null

Iltimos, ismni kiriting:
Jeyn Green

myAccount obyektidagi nom:


Jeyn Green

3.2-rasm | Hisob ob'ektini yaratish va manipulyatsiya qilish. (2-qismning 2-qismi.)

String theName = input.nextLine(); // matn qatorini o'qish
myAccount.setName(theName); // myAccount-ga nomini qo'ying

myAccount.getName()


76 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

ifoda Skanerni System.in bilan ishga tushiradi, bu esa Skanerga qayerda ekanligini aytadi
(ya'ni, klaviaturadan) kiritilgan ma'lumotlarni o'qing.

Sinf hisobining getName usulini chaqirish


16-qatorda ob'ektning getName usulini chaqirish orqali olingan boshlang'ich nom ko'rsatiladi.
od. Xuddi biz System.out ob'ektidan foydalanib, uning usullarini print, printf va println deb atashimiz mumkin,
uning getName va setName usullarini chaqirish uchun myAccount ob'ektidan foydalanishimiz mumkin. 16-qator qo'ng'iroqlar
getName 13-qatorda yaratilgan myAccount obyekti va undan keyin nuqta ajratuvchi (.),
keyin getName usuli nomi va bo'sh qavslar to'plami, chunki hech qanday argument yo'q
o'tkazilmoqda. getName chaqirilganda:
1. Ilova dastur bajarilishini qo'ng'iroqdan (asosiy 16-qator) olish usuliga o'tkazadi.
Ism deklaratsiyasi (3.1-rasmning 16-19-qatorlari). Chunki getName my- orqali chaqirilgan.
Hisob ob'ekti, getName qaysi ob'ekt misol o'zgaruvchisini boshqarishni "biladi".
2. Keyin getName usuli o'z vazifasini bajaradi, ya'ni nomni qaytaradi (18-qatorning 18-qatori).
3.1-rasm). Qaytish bayonoti bajarilganda, dastur bajarilishi davom etadi
getName chaqirilgan (3.2-rasmdagi 16-satr).
3. System.out.printf getName usuli bilan qaytarilgan Stringni, keyin esa
dastur asosiy 19-qatorda ishlashni davom ettiradi.

null - satr o'zgaruvchilari uchun standart boshlang'ich qiymat


Chiqishning birinchi qatori "null" nomini ko'rsatadi. Mahalliy o'zgaruvchilardan farqli o'laroq, bunday emas
avtomatik ravishda ishga tushirilganda, har bir misol o'zgaruvchisi standart boshlang'ich qiymatiga ega bo'ladi - bu qiymat
misol o'zgaruvchisining boshlang'ich qiymatini ko'rsatmaganingizda Java tomonidan ed. Shunday qilib, misol turli-
qobiliyatlarni dasturda ishlatishdan oldin aniq ishga tushirish talab qilinmaydi - agar ular bundan mustasno
standart qiymatlaridan boshqa qiymatlarga ishga tushirilishi kerak. Bir misol uchun standart qiymat
String tipidagi o'zgaruvchi (bu misoldagi nom kabi) null bo'lib, biz bu haqda batafsilroq muhokama qilamiz
Malumot turlarini ko'rib chiqsak, 3.3-bo'lim.

Sinf hisobining setName usulini chaqirish


21-qator myAccounts-ning setName usulini chaqiradi. Usul chaqiruvi kimga tegishli argumentlarni taqdim etishi mumkin
qiymatlar mos keladigan usul parametrlariga beriladi. Bu holda, qiymati
main ning mahalliy oʻzgaruvchisi qavs ichidagi theName bu setName ga uzatiladigan argumentdir.
bu usul o'z vazifasini bajara oladi. setName chaqirilganda:
1. Ilova dasturning bajarilishini asosiy satrdagi 21-qatordan setName usuliga o'tkazadi
deklaratsiya (3.1-rasmning 10-13-qatorlari) va qo'ng'iroqning qavsdagi argument qiymati
tezislar (theName) usulda mos keladigan parametrga (nomga) beriladi
sarlavha (3.1-rasmning 10-qatori). setName myAccount obyekti orqali chaqirilganligi sababli,
setName qaysi ob'ektning misol o'zgaruvchisini boshqarishni "biladi".

Xatolarning oldini olish bo'yicha maslahat 3.1


Hech qachon foydalanuvchi tomonidan kiritilgan satrni format-nazorat sifatida ishlatmang. Qachon usuli
System.out.printf formatni boshqarish satrini birinchi argumentda, usulda baholaydi
ushbu satrdagi konversiya spetsifikatsiya(lar)i asosida vazifalarni bajaradi. Agar format-nazorat satri
foydalanuvchidan olingan bo'lsa, zararli foydalanuvchi konversiya spetsifikatsiyalarini taqdim etishi mumkin edi
System.out.printf tomonidan bajarilishi, ehtimol xavfsizlik buzilishiga olib kelishi mumkin.

3.2 Instance o'zgaruvchilari, Methods o'rnating va Methods 77 ni oling

2. Keyin setName usuli o'z vazifasini bajaradi, ya'ni nom parametrini tayinlaydi.
misol o'zgaruvchisi nomiga qiymat (3.1-rasmning 12-qatori).
3. Dasturning bajarilishi setName ning yopish o'ng qavsga yetganda, u qayerga qaytadi
setName chaqirildi (3.2-rasmning 21-qatori), keyin 3.2-rasmning 22-qatorida davom etadi.
Usul chaqiruvidagi argumentlar soni parametrlar soniga mos kelishi kerak
usul deklaratsiyasining parametrlar ro'yxati. Shuningdek, usul chaqiruvidagi argument turlari kerak
usul deklaratsiyasidagi mos parametrlarning turlariga mos kelishi.
(6-bobda argument turi va unga mos keladigan parametr turini bilib olasiz.
bir xil bo'lishi shart emas.) Bizning misolimizda usul chaqiruvi bitta argumentni uzatadi
type String (theName) - va usul deklaratsiyasi turning bitta parametrini belgilaydi
String (3.1-rasmning 10-qatorida e'lon qilingan nom). Shunday qilib, bu misolda argument turi
usul chaqiruvida usul sarlavhasidagi parametr turiga to'liq mos keladi.
Foydalanuvchi tomonidan kiritilgan ismni ko'rsatish
3.2-rasmning 22-qatori bo'sh qatorni chiqaradi. GetName usuliga ikkinchi qo'ng'iroq qilinganda (26-qator)
bajaradi, foydalanuvchi tomonidan 20-qatorga kiritilgan nom ko'rsatiladi. Satrlarda bayonot qachon
25–26 bajarilishni yakunlaydi, asosiy usulning oxiriga erishiladi, shuning uchun dastur tugaydi.
3.2.3 Bir nechta sinflarga ega ilovani kompilyatsiya qilish va bajarish
Shakldagi sinflarni kompilyatsiya qilishingiz kerak. Ilovani ishga tushirishdan oldin 3.1 va 3.2. Bu
bir nechta sinfga ega ilovani birinchi marta yaratganingizda. Class AccountTest-da asosiy mavjud
usul; sinf hisobi yo'q. Ushbu ilovani kompilyatsiya qilish uchun avval ushbu katalogga o'ting
ilovaning manba kodi fayllarini o'z ichiga oladi. Keyin buyruqni kiriting

ikkala sinfni bir vaqtning o'zida kompilyatsiya qilish. Agar ilovani o'z ichiga olgan katalog faqat shu ilovani o'z ichiga olsa


fayllar, siz ikkala sinfni buyruq bilan kompilyatsiya qilishingiz mumkin

*.javadagi yulduzcha (*) joriy katalogdagi barcha fayllar bilan tugaydiganligini bildiradi


fayl nomi kengaytmasi “.java” kompilyatsiya qilinishi kerak. Agar ikkala sinf ham to'g'ri tuzilgan bo'lsa, ya'ni
hech qanday kompilyatsiya xatosi ko'rsatilmaydi - keyin buyruq bilan dasturni ishga tushirishingiz mumkin

3.2.4 Instance o'zgaruvchisi va to'plami bilan hisob UML klassi diagrammasi


va usullarni oling
Biz ko'pincha sinfning atributlari va operatsiyalarini umumlashtirish uchun UML sinf diagrammalaridan foydalanamiz. ichida -
chang, UML diagrammalari tizim dizaynerlariga tizimni ixcham, grafik, pro-
Dasturchilar tizimni joriy qilishdan oldin grammatikadan mustaqil ravishda
maxsus dasturlash tili. 3.3-rasmda Ac sinfi uchun UML klassi diagrammasi keltirilgan.
3.1-rasmning soni.
Yuqori bo'lim
UMLda har bir sinf sinf diagrammasida uchta bo'linmali to'rtburchaklar shaklida modellashtirilgan.
mentlar. Ushbu diagrammada yuqori bo'linma sinf nomini o'z ichiga oladi Hisob markazida joylashgan hor-
izontal ravishda qalin shriftda.

javac Account.java AccountTest.java

javac *.java

java Account Test


78 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

O'rta bo'lim
O'rta bo'lim sinfning atribut nomini o'z ichiga oladi, u in-
Java-da bir xil nomdagi statsionar o'zgaruvchi. Namuna o'zgaruvchisi nomi Java-da shaxsiy, shuning uchun
UML klassi diagrammasi atribut nomidan oldin minus belgisi (-) kirish modifikatorini ko'rsatadi. Kuzatish -
atribut nomi ikki nuqta va atribut turi, bu holda String.
Pastki bo'lim
Pastki bo'limda sinfning setName va getName operatsiyalari mavjud
Java tilidagi bir xil nomdagi usullarga mos keladi. UML modellari operatsiyalari tomonidan
kirish modifikatoridan oldin operatsiya nomini ro'yxatga olish, bu holda + getName. Bu ortiqcha
belgisi (+) getName UMLda umumiy operatsiya ekanligini bildiradi (chunki u ommaviydir
Java-dagi usul). GetName operatsiyasida hech qanday parametr yo'q, shuning uchun qavslar quyidagi:
sinf diagrammasidagi operatsiya nomini tushirish, xuddi usulda bo'lgani kabi, bo'sh
3.1-rasmning 16-qatoridagi deklaratsiya. setName operatsiyasi, shuningdek, umumiy operatsiya, Stringga ega
nom deb ataladigan parametr.
Qaytish turlari
UML ikki nuqta qo'yish orqali operatsiyaning qaytish turini va qaytarish turini ko'rsatadi
operatsiya nomidan keyingi qavsdan keyin. GetName hisob usuli (3.1-rasm)
String qaytish turiga ega. setName usuli qiymat qaytarmaydi (chunki u voidni qaytaradi
Java'da), shuning uchun UML klassi diagrammasi qavslardan keyin qaytish turini ko'rsatmaydi
bu operatsiya.
Parametrlar
UML parametr nomini ro'yxatga olish orqali parametrni Java'dan biroz farq qiladi,
keyin ikki nuqta va operatsiya nomidan keyin qavs ichida parametr turi.
UML Java-ga o'xshash o'ziga xos ma'lumotlar turlariga ega, ammo soddaligi uchun biz foydalanamiz
Java ma'lumotlar turlari. Hisob qaydnomasi setName usuli (3.1-rasm) nomi nomli String parametriga ega,
Shunday qilib, 3.3-rasmda nom ko'rsatilgan: Usul nomidan keyingi qavslar orasidagi satr.

3.2.5 Class AccountTest bo'yicha qo'shimcha eslatmalar


statik usul asosiy
2-bobda biz e'lon qilgan har bir sinfda main deb nomlangan bitta usul mavjud edi. Eslatib o'tamiz, asosiy a
Java virtual mashinasi (JVM) tomonidan har doim avtomatik ravishda chaqiriladigan maxsus usul
ilovani ishga tushirasiz. Boshqa usullarning ko'pchiligini bajarishni aytish uchun ularni aniq chaqirishingiz kerak
ularning vazifalari.
3.2-rasmning 7-27 satrlari asosiy usulni e'lon qiladi. JVM ning joylashuvini aniqlashga imkon berishning asosiy qismi
va ilovaning bajarilishini boshlash uchun asosiy chaqiruv usuli statik kalit so'zdir (7-qator).

3.3-rasm | 3.1-rasmdagi sinf hisobi uchun UML sinf diagrammasi.

Hisob

– nomi: String


+ setName (ism: string)
+ getName(): String

Yuqori bo'lim


O'rta bo'lim

Pastki bo'lim


3.2 Instance o'zgaruvchilari, Methods o'rnating va Methods 79 ni oling

main ning statik usul ekanligini ko'rsatadi. Statik usul alohida, chunki siz uni chaqirishingiz mumkin
avval usul e'lon qilingan sinf ob'ektini yaratmasdan - bu holda sinf
Hisob testi. Statik usullarni 6-bobda batafsil muhokama qilamiz.
Import deklaratsiyasi bo'yicha eslatmalar
3.2-rasmdagi import deklaratsiyasiga e'tibor bering (3-qator), bu kompilyatorga shuni ko'rsatadiki,
dastur Scanner sinfidan foydalanadi. 2-bobda bilib olganingizdek, System va String sinflari
java.lang paketida, u har bir Java dasturiga bilvosita import qilinadi, shuning uchun barcha pro-
grammlar ushbu paketning sinflaridan ularni aniq import qilmasdan foydalanishi mumkin. Ko'pgina boshqa sinflar
Java-da ishlatadigan dasturlar aniq import qilinishi kerak.
Xuddi shu katalogda tuzilgan sinflar o'rtasida maxsus munosabatlar mavjud,
Hisob va AccountTest sinflari kabi. Odatiy bo'lib, bunday sinflar ichida hisoblanadi
bir xil paket - standart paket sifatida tanilgan. Xuddi shu paketdagi sinflar bilvosita
ushbu paketdagi boshqa sinflarning manba kodi fayllariga import qilinadi. Shunday qilib, import pasaydi.
Agar paketdagi bir sinf bir xil paketda boshqasini ishlatsa, laration talab qilinmaydi -
masalan, AccountTest sinfi hisob qaydnomasidan foydalanganda.
Skaner sinfiga murojaat qilsak, 3-qatordagi import deklaratsiyasi talab qilinmaydi
bu fayl davomida java.util.Scanner sifatida toʻliq paket nomi va sinfini oʻz ichiga oladi
nomi. Bu sinfning to'liq malakali sinf nomi sifatida tanilgan. Masalan, 10-qator
3.2-rasmni ham shunday yozish mumkin

3.2.6 Shaxsiy misol o'zgaruvchilari bilan dasturiy ta'minot muhandisligi va


umumiy to'plam va usullarni oling
Ko'rib turganingizdek, set va get usullarini qo'llash orqali siz o'zgartirishga urinishlarni tasdiqlashingiz mumkin.
shaxsiy ma'lumotlarga kationlar va bu ma'lumotlar qo'ng'iroq qiluvchiga qanday taqdim etilishini nazorat qiladi - bular
dasturiy ta'minot muhandisligining muhim afzalliklari. Buni 3.5-bo'limda batafsilroq muhokama qilamiz.
Agar misol o'zgaruvchisi ommaviy bo'lsa, sinfning istalgan mijozi, ya'ni har qanday boshqa sinf
Bu sinf usullarini chaqiradi - ma'lumotlarni ko'rishi va u bilan xohlagan narsani qilishi mumkin,
shu jumladan, uni noto'g'ri qiymatga o'rnatish.
Sinf mijozi shaxsiyga to'g'ridan-to'g'ri kira olmasa ham, deb o'ylashingiz mumkin
misol o'zgaruvchisi bo'lsa, mijoz umumiy to'plam orqali o'zgaruvchi bilan xohlagan narsani qilishi mumkin
va usullarni oling. Siz istalgan vaqtda shaxsiy ma'lumotlarni ko'rib chiqishingiz mumkin deb o'ylaysiz
public get usuli va shaxsiy ma'lumotlarni o'zingizning xohishingiz bilan o'zgartirishingiz mumkin
ommaviy to'plam usuli. Lekin o'rnatilgan usullar ularning argumentlarini tasdiqlash uchun dasturlashtirilishi mumkin va
salbiy tana harorati kabi ma'lumotlarni yomon qiymatlarga o'rnatish uchun har qanday urinishlarni rad, bir kun
mart oyida 1 dan 31 gacha bo'lgan oraliqda, kompaniya mahsulotida bo'lmagan mahsulot kodi
katalog va boshqalar. Get usuli esa ma'lumotlarni boshqa shaklda taqdim etishi mumkin. Masalan, a
Baho klassi bahoni 0 dan 100 gacha int sifatida saqlashi mumkin, ammo getGrade usuli
90 dan 100 gacha bo'lgan baholar uchun "A", "B" kabi harf bahosini String sifatida qaytarishi mumkin
80 dan 89 gacha bo'lgan sinflar uchun va hokazo. kirish va taqdimotni qattiq nazorat qilish

java.util.Scanner kiritish = yangi java.util.Scanner(System.in);


Dasturiy ta'minot muhandisligi kuzatuvi 3.1
Java kompilyatori Java manba kodi faylida import deklaratsiyasini talab qilmaydi, agar
to'liq malakali sinf nomi har safar sinf nomi ishlatilganda ko'rsatiladi. Ko'pchilik Java
dasturchilar import deklaratsiyasi bilan faollashtirilgan ixchamroq dasturlash uslubini afzal ko'rishadi.

80 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

shaxsiy ma'lumotlar ishonchliligi va xavfsizligini oshirish bilan birga xatolarni sezilarli darajada kamaytirishi mumkin
dasturlaringiz.
Maxsus kirish modifikatori bilan misol o'zgaruvchilarini e'lon qilish ma'lumotlarni yashirish yoki deb nomlanadi
ma'lumotlarni yashirish. Dastur hisob sinfining ob'ektini yaratganda (namunalashda), o'zgaruvchan
mumkin nomi ob'ektda inkapsullangan (yashirin) va unga faqat usullari bilan kirish mumkin
ob'ekt sinfi.

Inkapsulatsiyalangan ma'lumotlarga ega hisob ob'ektining kontseptual ko'rinishi


Hisob ob'ektini 3.4-rasmda ko'rsatilgandek tasavvur qilishingiz mumkin. Shaxsiy misol o'zgaruvchisi
nom ob'ekt ichida yashiringan (ismni o'z ichiga olgan ichki doira bilan ifodalangan) va pro-
Ommaviy usullarning tashqi qatlami bilan tekshiriladi (tashqi doira bilan ifodalanadi
Ism va setName). Hisob ob'ekti bilan o'zaro aloqada bo'lishi kerak bo'lgan har qanday mijoz kodi buni amalga oshirishi mumkin
shuning uchun faqat himoya tashqi qatlamning ommaviy usullarini chaqirish orqali.

3.3 Ibtidoiy turlar va mos yozuvlar turlari


Java ning turlari ibtidoiy va mos yozuvlar turlariga bo'linadi. 2-bobda siz ishladingiz
int tipidagi o'zgaruvchilar bilan - ibtidoiy turlardan biri. Boshqa ibtidoiy turlar
mantiqiy, bayt, char, qisqa, uzun, float va juft, ularning har birini biz muhokama qilamiz
kitob-bular D ilovasida jamlangan. Barcha noibtidoiy turlar mos yozuvlar turlari, shuning uchun
ob'ektlarning turlarini ko'rsatadigan sinflar mos yozuvlar turlaridir.
Primitiv tipdagi o'zgaruvchi bir vaqtning o'zida o'zining e'lon qilingan turining aynan bitta qiymatini ushlab turishi mumkin. Uchun
Masalan, int o'zgaruvchisi bir vaqtning o'zida bitta butun sonni saqlashi mumkin. Boshqa qiymat tayinlanganda
ushbu o'zgaruvchiga yangi qiymat yo'qolgan oldingisini almashtiradi.
Eslatib o'tamiz, mahalliy o'zgaruvchilar sukut bo'yicha ishga tushirilmaydi. Primitiv tipdagi misol o'zgarishi
Imkoniyatlar sukut bo'yicha ishga tushiriladi - bayt, char, short, int, long,
float va double 0 ga, boolean tipidagi o'zgaruvchilar esa ishga tushiriladi

Dasturiy ta'minot muhandisligi kuzatuvi 3.2


Har bir misol o'zgaruvchisi va usul deklaratsiyasi oldidan kirish modifikatori bilan belgilang.
Odatda, misol o'zgaruvchilari xususiy va usullar ommaviy deb e'lon qilinishi kerak. Keyinchalik ichida
Kitobda biz nima uchun usulni shaxsiy deb e'lon qilishni xohlashingiz mumkinligini muhokama qilamiz.

3.4-rasm | Hisob ob'ektining konseptual ko'rinishi uning inkapsullangan shaxsiy nusxasi bilan


o'zgaruvchan nomi va ommaviy usullarning himoya qatlami.

g

e



t

N

a



m

e

s



e

t

N



a

m

e



nomi

3.4 Hisob sinfi: Konstruktorlar bilan ob'ektlarni ishga tushirish 81

yolg'on. ni belgilash orqali ibtidoiy turdagi o'zgaruvchi uchun o'zingizning boshlang'ich qiymatingizni belgilashingiz mumkin
o'zgaruvchisi o'z deklaratsiyasidagi qiymatni, kabi

Dasturlar ma'lumotni saqlash uchun mos yozuvlar turlarining o'zgaruvchilaridan foydalanadi (odatda havolalar deb ataladi).


kompyuter xotirasidagi ob'ektlarning manzillari. Bunday o'zgaruvchi ob'ektga tegishli deyiladi
dasturda. Murojaat qilingan ob'ektlar har birida ko'plab misol o'zgaruvchilari bo'lishi mumkin. Chiziq
3.2-rasmning 10:

Scanner sinfining ob'ektini yaratadi, so'ngra kirish o'zgaruvchisiga unga havolani tayinlaydi


Skaner ob'ekti. 3.2-rasmning 13-qatori:

Hisob sinfining ob'ektini yaratadi, keyin myAccount o'zgaruvchisiga unga havolani tayinlaydi


Hisob ob'ekti. Yo'naltiruvchi tipidagi misol o'zgaruvchilari, agar aniq ishga tushirilmagan bo'lsa, ishga tushiriladi
sukut bo'yicha null qiymatiga - bu "hech narsaga havola" ni bildiradi. Shuning uchun ham
3.2-rasmning 16-qatoridagi getName-ga birinchi qo'ng'iroq nullni qaytaradi - nom qiymati hali belgilanmagan.
o'rnatildi, shuning uchun standart boshlang'ich qiymati null qaytariladi.
Ob'ektda usullarni chaqirish uchun ob'ektga havola kerak. 3.2-rasmda davlat-
main usulidagi mentlar getName usullarini chaqirish uchun myAccount o'zgaruvchisidan foydalanadi (16 va
26) va setName (21-satr) Hisob ob'ekti bilan o'zaro ta'sir qilish uchun. Primitiv tipdagi o'zgaruvchilar shunday qiladi
ob'ektlarga murojaat qilmaydi, shuning uchun bunday o'zgaruvchilar usullarni chaqirish uchun ishlatilmaydi.
3.4 Hisob sinfi: Konstruktorlar bilan ob'ektlarni ishga tushirish
3.2-bo'limda aytib o'tilganidek, Hisob sinfining ob'ekti (3.1-rasm) yaratilganda, uning
String namunasi o'zgaruvchisi nomi sukut bo'yicha null ga ishga tushiriladi. Lekin agar siz pro-
Hisob ob'ektini yaratishda nom bering?
Siz e'lon qilgan har bir sinf ixtiyoriy ravishda konstruktorga kerakli parametrlarni berishi mumkin
ob'ekt yaratilganda sinf ob'ektini ishga tushirish uchun ishlatiladi. Java dasturni talab qiladi
struktor har bir yaratilgan ob'ektni chaqiradi, shuning uchun bu ob'ektni ishga tushirish uchun ideal nuqta
misol o'zgaruvchilari. Keyingi misol konstruktor bilan sinf Hisobni (3.5-rasm) yaxshilaydi
nom olishi va undan Hisob qaydnomasi o'zgaruvchisi nomini ishga tushirish uchun foydalanishi mumkin
ob'ekt yaratiladi (3.6-rasm).
3.4.1 Shaxsiy ob'ekt uchun hisob konstruktorini e'lon qilish
Initializatsiya
Sinfni e'lon qilganingizda, maxsus boshlang'ichni belgilash uchun o'z konstruktoringizni taqdim etishingiz mumkin.
sinfingiz ob'ektlari uchun mo'ljallangan. Masalan, siz Ac- uchun nom belgilashni xohlashingiz mumkin.
3.6-rasmning 10-qatoridagi kabi ob'ekt yaratilganda ob'ektni hisoblash:

Bunday holda, "Jane Green" String argumenti Hisob ob'ektining konstruktsiyasiga uzatiladi.


tor va nom namunasi o'zgaruvchisini ishga tushirish uchun ishlatiladi. Oldingi bayonot shuni talab qiladi
sinf faqat String parametrini oladigan konstruktorni taqdim etadi. 3.5-rasmda a mavjud
Bunday konstruktor bilan o'zgartirilgan Hisob sinfi.

private int numberOfStudents = 10;

Skaner kiritish = yangi Skaner(System.in);

Account myAccount = new Account();

Hisob qaydnomasi1 = yangi hisob ("Jane Green");

82 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

Hisob konstruktori deklaratsiyasi
3.5-rasmning 9-12-qatorlarida Hisob konstruktori e'lon qilinadi. Konstruktor bir xil nomga ega bo'lishi kerak
sinf sifatida. Konstruktorning parametrlar ro'yxati konstruktor bir yoki bir nechtasini talab qilishini bildiradi
o'z vazifasini bajarish uchun ma'lumotlar bo'laklari. 9-qator konstruktorda String parametriga ega ekanligini bildiradi.
eter nomi bilan atalgan. Yangi Hisob ob'ektini yaratganingizda (3.6-rasmda ko'rasiz), siz o'tasiz
konstruktorga shaxs nomi, u parametr nomida shu nomni oladi. The
keyin konstruktor 11-qatordagi misol o'zgaruvchisi nomiga nom beradi.

Sinf hisobi konstruktorining parametr nomi va metodlar to‘plamining nomi


3.2.1-bo'limdan usul parametrlari mahalliy o'zgaruvchilar ekanligini eslang. 3.5-rasmda kon-
struktor va setName usuli ikkalasida nom deb nomlangan parametr mavjud. Garchi bu parametr-
eterlar bir xil identifikatorga (nomga) ega, 9-qatordagi parametr mahalliy o'zgaruvchidir
setName usuliga ko'rinmaydigan konstruktor va 15-qatordagi mahalliy o'zgaruvchidir
konstruktorga ko'rinmaydigan setName.
3.4.2 Class AccountTest: Hisob ob'ektlari mavjud bo'lganda ishga tushirish
Yaratilgan
AccountTest dasturi (3.6-rasm) konstruksiyadan foydalangan holda ikkita Hisob ob'ektini ishga tushiradi.
tor. 10-qator Hisob obyekti hisobini yaratadi va ishga tushiradi1. Yangi kalit so'rovlar

1 // 3.5-rasm: Account.java


2 // Ismni ishga tushiradigan konstruktor bilan hisob klassi.
3
4 umumiy sinf hisobi
5 {
6 shaxsiy string nomi; // misol o'zgaruvchisi
7
8
9
10
11
12
13
14 // nomni o'rnatish usuli
15 ommaviy bekor to'plamName (String nomi)
16 {
17 this.name = name;
18 }
19
20 // nomni olish usuli
21 ommaviy string getName()
22 {
23 qaytish nomi;
24 }
25 } // yakuniy sinf Hisob
3.5-rasm | Nomni ishga tushiradigan konstruktor bilan hisob klassi.

Xatolarning oldini olish bo'yicha maslahat 3.2


Buni qilish mumkin bo'lsa ham, konstruktorlardan usullarni chaqirmang. Buni tushuntirib beramiz
10-bobda, Ob'ektga yo'naltirilgan dasturlash: Polimorfizm va interfeyslar.

// konstruktor nomni parametr nomi bilan ishga tushiradi


umumiy hisob (String nomi) // konstruktor nomi - sinf nomi
{
this.name = name;
}

3.4 Hisob sinfi: Konstruktorlar bilan ob'ektlarni ishga tushirish 83

Hisob ob'ektini saqlash uchun tizimdan xotirani oladi, so'ngra bilvosita sinfning konfiguratsiyasini chaqiradi.
ob'ektni ishga tushirish uchun instruktor. Qo'ng'iroq sinfdan keyin qavslar bilan ko'rsatiladi
nom, unda yangi ob'ektni ishga tushirish uchun ishlatiladigan "Jane Green" argumenti mavjud
nomi. 10-qatordagi sinf misolini yaratish ifodasi yangi ob'ektga havolani qaytaradi.
o'zgaruvchan hisob1 uchun tayinlangan ob'ekt. 11-qator bu jarayonni takrorlaydi va o'tadi
hisob nomini ishga tushirish uchun "John Blue" argumenti2. 14-15 qatorlar har bir ob'ektdan foydalanadi
getName usuli ismlarni olish va ular qachon ishga tushirilganligini ko'rsatish
ob'ektlar yaratildi. Chiqish har bir Hisobni tasdiqlovchi turli nomlarni ko'rsatadi
misol o'zgaruvchisi nomining o'z nusxasini saqlaydi.

Konstruktorlar qiymatlarni qaytara olmaydi


Konstruktorlar va usullar o'rtasidagi muhim farq shundaki, konstruktorlar qayta tiklay olmaydilar.
qiymatlarni aylantiradi, shuning uchun ular qaytish turini aniqlay olmaydi (hatto bekor emas). Odatda, konstruktorlar
ommaviy deb e'lon qilinadi - keyinroq kitobda biz xususiy konstruktorlardan qachon foydalanishni tushuntiramiz.

Standart konstruktor


3.2-rasmning 13-qatorini eslang

Hisob ob'ektini yaratish uchun new ishlatilgan. "Yangi hisob" dan keyin bo'sh qavslar a ni bildiradi


sinfning standart konstruktoriga qo'ng'iroq qiling - konstruksiyani aniq e'lon qilmaydigan har qanday sinfda
tor, kompilyator standart konstruktorni taqdim etadi (uning har doim parametrlari yo'q). Qachon a
sinf faqat standart konstruktorga ega, sinfning misol o'zgaruvchilari o'zgaruvchilar uchun ishga tushiriladi.
xato qiymatlari. 8.5-bo'limda siz sinflarda bir nechta konstruktor bo'lishi mumkinligini bilib olasiz.

1 // 3.6-rasm: AccountTest.java


2 // Nom namunasini ishga tushirish uchun Hisob konstruktoridan foydalanish
3 // har bir Hisob ob'ekti yaratilgan vaqtdagi o'zgaruvchi.
4
5 umumiy sinf Hisob Testi
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12
13 // har bir hisob uchun nomning boshlang'ich qiymatini ko'rsatish
14 System.out.printf("hisob 1 nomi: %s%n", account1.getName());
15 System.out.printf("hisob 2 nomi: %s%n", account2.getName());
16 }
17 } // yakuniy sinf AccountTest

hisob1 nomi: Jeyn Green


hisob2 nomi: Jon Blue

3.6-rasm | Har bir vaqtda nom namunasi o'zgaruvchisini ishga tushirish uchun Hisob konstruktoridan foydalanish


Hisob ob'ekti yaratildi.

Account myAccount = new Account();

// ikkita Hisob ob'ektini yarating
Hisob qaydnomasi1 = yangi hisob ("Jane Green");
Hisob qaydnomasi2 = yangi hisob ("Jon Blu");

84 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

Konstruktorni e'lon qiladigan sinfda standart konstruktor yo'q
Agar siz sinf uchun konstruktorni e'lon qilsangiz, kompilyator standart konstruktor yaratmaydi
o'sha sinf. Bunday holda, siz sinfda hisob qaydnomasi ob'ektini yarata olmaysiz.
3.2-rasmda bo'lgani kabi, yangi Hisob () pozitsiyasini yaratish ifodasi - agar odatiy shartlar bo'lmasa.
Siz e'lon qilgan struktura hech qanday parametrlarni olmaydi.

Konstruktorni sinf hisobining UML sinf diagrammasiga qo'shish


3.7-rasmdagi UML klassi diagrammasi. 3.5-rasmdagi hisob-kitoblar sinfi, bu konstruksiyaga ega.
tor, String nomi parametri bilan. Operatsiyalar singari, UML ham konstruktorlarni modellashtiradi
sinf diagrammasining uchinchi bo'limi. Konstruktorni sinf operasidan farqlash uchun
UML "konstruktor" so'zi guillemets ("va") ichiga olinishini talab qiladi.
va konstruktor nomidan oldin joylashtiriladi. Konstruktorlarni boshqalardan oldin sanash odatiy holdir
uchinchi bo'limda operatsiyalar.

3.5 Balans bilan hisob-kitoblar sinfi; Suzuvchi nuqta


Raqamlar
Endi biz qo'shimcha ravishda bank hisobi balansini saqlaydigan Hisob sinfini e'lon qilamiz
nomiga. Aksariyat hisob balanslari butun son emas. Shunday qilib, hisob sinfi aktsiyani ifodalaydi.
balansni suzuvchi nuqtali raqam sifatida hisoblash - kasrli raqam, masalan, 43,95,
0,0, –129,8873. [8-bobda biz pul summalarini aniq ifodalashni boshlaymiz
sinf BigDecimal sanoat kuchli pul ilovalarini yozishda qilishingiz kerak.]
Java suzuvchi nuqtali raqamlarni xotirada saqlash uchun ikkita ibtidoiy turni taqdim etadi:
suzuvchi va ikkilamchi. float turidagi o'zgaruvchilar bir aniqlikdagi suzuvchi nuqta sonini ifodalaydi
bers va ettitagacha muhim raqamni ushlab turishi mumkin. double tipidagi o'zgaruvchilar double-ni ifodalaydi
aniq suzuvchi nuqtali raqamlar. Ular float o'zgaruvchilardan ikki baravar ko'p xotira talab qiladi
va 15 tagacha muhim raqamni ushlab turishi mumkin - float o'zgaruvchilarning aniqligi taxminan ikki barobar.
Ko'pgina dasturchilar double tipidagi suzuvchi nuqtali raqamlarni ifodalaydi. Aslida, Java
dasturning manba kodiga kiritgan barcha suzuvchi nuqtali raqamlarni (masalan, 7.33 va
0.0975) sukut bo'yicha ikki tomonlama qiymatlar sifatida. Manba kodidagi bunday qiymatlar suzuvchi deb nomlanadi.
nuqta harflari. Float uchun qiymatlarning aniq diapazonlari uchun D ilovasiga qarang, ibtidoiy turlar
va ikki barobar ortadi.

Dasturiy ta'minot muhandisligi kuzatuvi 3.3


Sinfingiz namunasi oʻzgaruvchilarining sukut boʻyicha ishga tushirilishi maqbul boʻlmasa, a taqdim eting
namuna o'zgaruvchilaringiz to'g'ri ishga tushirilganligini ta'minlash uchun maxsus konstruktor
sinfingizning har bir yangi ob'ekti yaratilganda mazmunli qiymatlar.

3.7-rasm | 3.5-rasmdagi Hisob sinfi uchun UML sinf diagrammasi.

Hisob

– nomi: String


«konstruktor» hisobi (nomi: string)
+ setName(nom: String)
+ getName(): String

3.5 Balans bilan hisob-kitoblar sinfi; Suzuvchi nuqtali raqamlar 85

3.5.1 Balansga ega bo'lgan hisob klassi Double turidagi o'zgaruvchi namunasi
Bizning keyingi ilovamizda hisob qaydnomasi klassi (3.8-rasm) mavjud bo'lib, u misol o'zgaruvchanligi sifatida saqlanadi.
bank hisobvarag'ining nomi va qoldig'ini ko'rsatishi mumkin. Oddiy bank ko'plab hisoblarga xizmat ko'rsatadi,
har biri o'z balansiga ega, shuning uchun 8-satr double tipidagi misol o'zgaruvchan balansini e'lon qiladi.
Hisob sinfining har bir nusxasi (ya'ni, ob'ekti) o'z nomi va ham nusxalarini o'z ichiga oladi
balans.

1 // 3.8-rasm: Hisob.java


2 // Ikki nusxali o'zgaruvchi balansi va konstruktorli hisob klassi
3 // va tekshirishni amalga oshiradigan depozit usuli.
4
5 umumiy sinf hisobi
6 {
7 shaxsiy string nomi; // misol o'zgaruvchisi
8
9
10 // Ikki parametrni qabul qiluvchi hisob konstruktori
11
12 {
13 this.name = name; // misol o'zgaruvchisi nomiga nom berish
14
15 // balans 0,0 dan katta ekanligini tasdiqlang; bo'lmasa,
16 // misol o'zgaruvchisi balansi standart boshlang'ich qiymatini 0,0 saqlaydi
17
18
19 }
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 // nomni o'rnatadigan usul
35 umumiy bekor setName(String nomi)
36 {
37 this.name = name;
38 }
39
40 // nomni qaytaruvchi usul
41 ommaviy string getName()
42 {

3.8-rasm | Ikki nusxali o'zgaruvchi balansi va konstruktor va bilan hisob klassi


tekshirishni amalga oshiradigan depozit usuli. (2-qismning 1-qismi.)

shaxsiy ikki tomonlama balans; // misol o'zgaruvchisi

umumiy hisob (String nomi, er-xotin balans)

agar (balans > 0,0) // balans haqiqiy bo'lsa


this.balance = muvozanat; // uni misol o'zgaruvchan balansiga tayinlash

// balansga faqat yaroqli miqdorni kiritadigan (qo'shadigan) usul


davlat bekor depoziti (ikki marta omonat summasi)
{
agar (depositAmount > 0,0) // agar depozit summasi haqiqiy bo'lsa
balans = balans + depozit summasi; // balansga qo'shing
}

// usul hisob balansini qaytaradi


umumiy ikki tomonlama getBalance()
{
qaytarish balansi;
}

86 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

Hisob klassi ikki parametrli konstruktor
Sinfda konstruktor va to'rtta usul mavjud. Kimdir hisob ochsa, bu odatiy holdir
darhol pul qo'yish uchun, shuning uchun konstruktor (11-19-qatorlar) endi ikkinchi pa-
rameter - boshlang'ich balansni ifodalovchi double tipidagi boshlang'ich Balans. 17–18 qatorlar
initialBalance 0,0 dan katta ekanligiga ishonch hosil qiling. Agar shunday bo'lsa, initialBalance qiymati tayinlanadi
misol o'zgaruvchan balansi. Aks holda, balans 0,0 da qoladi - uning standart boshlang'ich qiymati.
Hisob sinfini depozit qilish usuli
Usul depoziti (22-26-qatorlar) o'z vazifasini bajarganida hech qanday ma'lumotni qaytarmaydi, shuning uchun uning
Qaytish turi bekor. Usul depozitAmount deb nomlangan bitta parametrni oladi - ikki marta
Balansga qo'shiladigan qiymat faqat parametr qiymati haqiqiy bo'lsa (ya'ni, dan katta
nol). 25-qator birinchi navbatda joriy balans va depozit summasini qo'shib, vaqtinchalik miqdorni tashkil qiladi
so'm, keyinchalik uning oldingi qiymatini almashtirib, balansga tayinlanadi (esda tutingki, qo'shimcha a
topshiriqdan yuqori ustunlik). Hisoblash bo'yicha ekanligini tushunish muhimdir
25-qatordagi tayinlash operatorining o'ng tomoni balansni o'zgartirmaydi - bu
topshiriq nima uchun kerak.
Hisob sinfi getBalance usuli
GetBalance usuli (29-32-qatorlar) sinf mijozlariga (ya'ni, usuli boshqa sinflarga) ruxsat beradi.
ods bu sinfning usullarini chaqiradi) ma'lum bir Hisob ob'ektining qiymatini olish uchun bal-
ance. Usul double qaytish turini va bo'sh parametrlar ro'yxatini belgilaydi.
Hisobning barcha usullari balansdan foydalanishi mumkin
Yana bir bor, 18, 25 va 31-qatorlardagi bayonotlar o'zgaruvchan balansdan foydalanadi, garchi u
usullarning hech birida e'lon qilinmagan. Biz bu usullarda muvozanatdan foydalanishimiz mumkin, chunki bu
sinfning misol o'zgaruvchisi.
3.5.2 Class Account foydalanish uchun AccountTest Class
Class AccountTest (3.9-rasm) ikkita Hisob obyektini (9–10-qatorlar) yaratadi va ularni ishga tushiradi
50,00 haqiqiy balans va mos ravishda -7,53 noto'g'ri balans bilan - maqsad uchun
Bizning misollarimizda biz balanslar noldan katta yoki teng bo'lishi kerak deb taxmin qilamiz. The
13-16 qatorlardagi System.out.printf usulini chaqiradi hisob nomlari va bal-
har bir Hisobning getName va getBalance usullarini chaqirish orqali olinadi.

43 qaytish nomi; // qo'ng'iroq qiluvchiga ismning qiymatini bering


44 } // getName tugatish usuli
45 } // yakuniy sinf Hisob

1 // 3.9-rasm: AccountTest.java


2 // Hisob obyektlari bilan suzuvchi nuqtali raqamlarni kiritish va chiqarish.
3 import java.util.Scanner;

3.9-rasm | Hisob obyektlari bilan suzuvchi nuqtali raqamlarni kiritish va chiqarish. (3-qismning 1-qismi.)

3.8-rasm | Ikki nusxali o'zgaruvchi balansi va konstruktor va bilan hisob klassi
tekshirishni amalga oshiradigan depozit usuli. (2-qismning 2-qismi.)

3.5 Balans bilan hisob-kitoblar sinfi; Suzuvchi nuqtali raqamlar 87

4
5 umumiy sinf Hisob Testi
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12 // har bir ob'ektning dastlabki balansini ko'rsatish
13 System.out.printf("%s balansi: $ %n",
14 account1.getName(), );
15 System.out.printf("%s balansi: $ %n%n",
16 account2.getName(), );
17
18 // buyruqlar oynasidan ma'lumot olish uchun Skaner yarating
19 Skaner kiritish = yangi Skaner(System.in);
20
21 System.out.print("1-hisob uchun depozit summasini kiriting: "); // so'rov
22
23 System.out.printf("hisob 1 balansiga% qo'shilmoqda%n%n",
24 depozit summasi);
25
26
27 // balanslarni ko'rsatish
28 System.out.printf("%s balansi: $ %n",
29 account1.getName(), );
30 System.out.printf("%s balansi: $ %n%n",
31 account2.getName(), );
32
33 System.out.print("2-hisob uchun depozit summasini kiriting: "); // so'rov
34
35 System.out.printf("hisob 2 balansiga% qo'shilmoqda%n%n",
36 depozit summasi);
37
38
39 // balanslarni ko'rsatish
40 System.out.printf("%s balansi: $ %n",
41 account1.getName(), );
42 System.out.printf("%s balansi: $ %n%n",
43 account2.getName(), );
44 } // asosiyni tugatish
45 } // yakuniy sinf AccountTest

Jeyn Green balansi: $50.00


Jon Blue balansi: $0,00

Hisob 1 uchun depozit miqdorini kiriting: 25.53

hisob 1 balansiga 25,53 qo'shing

Jeyn Green balansi: $75,53


Jon Blue balansi: $0,00

3.9-rasm | Hisob obyektlari bilan suzuvchi nuqtali raqamlarni kiritish va chiqarish. (3 qismning 2-qismi.)

Hisob qaydnomasi1 = yangi hisob ("Jane Green", 50.00);
Hisob qaydnomasi2 = yangi hisob ("John Blue", -7.53);

%.2f
account1.getBalance()


%.2f
account2.getBalance()

double depositAmount = input.nextDouble(); // foydalanuvchi ma'lumotlarini olish


%.2f

account1.deposit(depositAmount); // hisob 1 balansiga qo'shing

%.2f
account1.getBalance()
%.2f
account2.getBalance()

depozitAmount = input.nextDouble(); // foydalanuvchi ma'lumotlarini olish


%.2f

account2.deposit(depositAmount); // hisob 2 balansiga qo'shing

%.2f
account1.getBalance()
%.2f
account2.getBalance()

88 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

Hisob ob'ektlarining dastlabki qoldiqlarini ko'rsatish
14-qatordan hisob1 uchun getBalance usuli chaqirilganda, account1 qiymati
balans 3.8-rasmning 31-qatoridan qaytariladi va System.out.printf tomonidan ko'rsatiladi.
bayonot (3.9-rasm, 13-14-qatorlar). Xuddi shunday, getBalance usuli chaqirilganda
2-hisob 16-qatordan, 2-hisob balansining qiymati 31-qatordan qaytariladi
3.8-rasm va System.out.printf bayonotida ko'rsatilgan (3.9-rasm, 15-16-qatorlar). The
Hisob 2 balansi dastlab 0,00 ni tashkil qiladi, chunki konstruktor boshlashga urinishni rad etdi
hisob 2 salbiy balansga ega, shuning uchun balans o'zining dastlabki qiymatini saqlab qoladi.
Displey uchun suzuvchi nuqta raqamlarini formatlash
Balanslarning har biri %.2f format aniqlagichi bilan printf tomonidan chiqariladi. %f formati
spetsifikatsiya float yoki double tipidagi qiymatlarni chiqarish uchun ishlatiladi. % va f o'rtasidagi .2
o'nli kasrning o'ng tomoniga chiqarilishi kerak bo'lgan o'nlik kasrlar sonini (2) yuboradi
suzuvchi nuqta sonidagi nuqta - bu raqamning aniqligi sifatida ham tanilgan. Har qanday suzuvchi -
nuqta qiymati %.2f bilan yuzinchi pozitsiyaga yaxlitlanadi, masalan,
123.457 123.46 ga yaxlitlanadi va 27.33379 27.33 ga yaxlitlanadi.
Foydalanuvchidan suzuvchi nuqta qiymatini o'qish va depozit qo'yish
21-qator (3.9-rasm) foydalanuvchini hisob qaydnomasi uchun depozit summasini kiritishni taklif qiladi1. 22-qator de-
foydalanuvchi tomonidan kiritilgan har bir depozit miqdorini saqlash uchun mahalliy o'zgaruvchan depozitAmountni aniqlaydi. Un-
misol o'zgaruvchilari (masalan, Hisob sinfidagi nom va balans), mahalliy o'zgaruvchilar (masalan
depozitAmount in main) sukut bo'yicha ishga tushirilmaydi, shuning uchun ular odatda ishga tushirilishi kerak
aniq. Bir zumda bilib olganingizdek, o'zgaruvchan depozitAmountning boshlang'ich qiymati pasayadi.
foydalanuvchi kiritishi bilan tugatiladi.

22-qator Scanner ob'ektining keyingiDouble kiritishiga qo'ng'iroq qilish orqali foydalanuvchidan kirishni oladi.


usul, bu foydalanuvchi tomonidan kiritilgan ikki tomonlama qiymatni qaytaradi. 23–24 qatorlar ko'rsatiladi
depozit miqdori. 25-qator depozitAmount bilan ob'ekt hisobining 1 depozit usulini chaqiradi
usulning argumenti sifatida. Usul chaqirilganda, argumentning qiymati tayinlanadi
parametr depozit usuli depozit summasi (3.8-rasmning 22-qatori); keyin usul
depozit ushbu qiymatni balansga qo'shadi. 28–31 qatorlar (3.9-rasm) nomlarni va bal-
Faqat hisob 1 balansi o'zgarganligini ko'rsatish uchun har ikkala Hisobning ma'lumotlarini yana ko'rsating.

Hisob 2 uchun depozit miqdorini kiriting: 123.45

hisob 2 balansiga 123,45 qo'shing

Jeyn Green balansi: $75,53


Jon Blue balansi: $123,45

Umumiy dasturlash xatosi 3.1


Agar siz un-ning qiymatidan foydalanmoqchi bo'lsangiz, Java kompilyatori kompilyatsiya xatosini chiqaradi.
ishga tushirilgan mahalliy o'zgaruvchi. Bu xavfli bajarilish vaqtidagi mantiqiy xatolardan qochishga yordam beradi. Bu
exe-dan ko'ra kompilyatsiya vaqtida dasturlaringizdan xatolarni olib tashlash har doim yaxshiroqdir.
kesish vaqti.

3.9-rasm | Hisob obyektlari bilan suzuvchi nuqtali raqamlarni kiritish va chiqarish. (3 qismning 3-qismi.)


3.5 Balans bilan hisob-kitoblar sinfi; Suzuvchi nuqtali raqamlar 89

33-qator foydalanuvchidan hisob 2 uchun depozit miqdorini kiritishni taklif qiladi. 34-qatorni oladi
Scanner ob'ektini kiritishning nextDouble usulini chaqirish orqali foydalanuvchidan kiritish. 35–36 qatorlar
depozit miqdorini ko'rsatish. 37-qator ob'ekt hisobi2 ning depozit usulini chaqiradi
depozitAmount usuli argumenti sifatida; keyin usul depoziti ushbu qiymatga qo'shiladi
muvozanat. Nihoyat, 40-43 satrlarda ikkala Hisobning nomlari va balanslari yana ko'rsatiladi
faqat hisob 2 balansi o'zgarganligini ko'rsating.
Asosiy usulda takrorlangan kod
13–14, 15–16, 28–29, 30–31, 40–41 va 42–43 qatorlardagi oltita bayonot deyarli
bir xil - ularning har biri Hisob nomi va balansini chiqaradi. Ular faqat nomda farqlanadi
Hisob ob'ektining - hisob 1 yoki hisob2. Bu kabi takroriy kod kod yaratishi mumkin
ushbu kodni yangilash kerak bo'lganda texnik muammolar - bir xil kodning olti nusxasi bo'lsa
barchasida bir xil xato yoki yangilanishlar mavjud bo'lsa, siz bu o'zgartirishni olti marta bajarishingiz kerak
xatolar qilish. 3.15-mashq sizdan 3.9-rasmni o'zgartirishni so'raydi, ekran hisob qaydnomasini o'z ichiga oladi.
Hisob ob'ektini parametr sifatida qabul qiladigan va ob'ekt nomini chiqaradigan usul va
muvozanat. Keyin asosiyning takrorlangan bayonotlarini ko'rsatish uchun oltita chaqiruv bilan almashtirasiz.
count, shu bilan dasturingiz hajmini qisqartiradi va ega bo'lish orqali uning barqarorligini yaxshilaydi
Hisob nomi va balansini aks ettiruvchi kodning bir nusxasi.

Class hisobi uchun UML sinf diagrammasi


3.10-rasmdagi UML sinf diagrammasi 3.8-rasmdagi sinf hisobini qisqacha modellashtiradi. dia-
gramm modellari ikkinchi bo'limida String va tipidagi xususiy atributlar nomi
ikki turdagi balans.

Class Account konstruktori parametrlar nomi bilan uchinchi bo'limda modellashtirilgan


tipidagi String va double tipidagi initialBalance. Sinfning to'rtta ommaviy usullari ham
uchinchi bo'limda modellashtirilgan - depozitAmount parametri bilan operatsion depozit -
double tipidagi eter, double qaytaruvchi turdagi getBalance operatsiyasi, operatsiya to'plami-
String tipidagi nom parametri bilan nom va qaytarish turi bilan getName operatsiyasi
String.

Dasturiy ta'minot muhandisligi kuzatuvi 3.4


Kodning bir nusxasini o'z ichiga olgan usulga qo'ng'iroqlar bilan takrorlangan kodni almashtirish mumkin
dasturingiz hajmini kamaytiring va uning barqarorligini yaxshilang.

3.10-rasm | 3.8-rasmdagi Hisob sinfi uchun UML sinf diagrammasi.

Hisob

– nomi: String


- muvozanat: ikki barobar
«konstruktor» hisobi (nomi: string, balans: double)
+ depozit (depozit miqdori: ikki baravar)
+ getBalance(): ikki barobar
+ setName (ism: string)
+ getName(): String

90 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

3.6 (ixtiyoriy) GUI va grafik misollar: foydalanish
Dialog oynalari
Ushbu ixtiyoriy amaliy tadqiqot Java-ning kuchli tilini o'rganishni istaganlar uchun mo'ljallangan
kitobning boshida grafik foydalanuvchi interfeyslari (GUI) va grafiklarni yaratish imkoniyatlari,
keyinroq kitobda bu mavzularni chuqurroq muhokama qilishdan oldin. Ushbu misolni o'rganish xususiyatlari
Java-ning etuk Swing texnologiyasi, bu yozuv hali ham bir oz ko'proq mashhur
keyingi boblarda taqdim etilgan yangi JavaFX texnologiyasi.
Ushbu GUI va Grafik misollar 10 ta qisqa bo'limda keltirilgan (3.11-rasmga qarang). Har biri
bo'lim yangi tushunchalarni taqdim etadi va ko'rsatadigan ekran tasvirlari bilan misollar beradi
o'zaro ta'sirlar va natijalar namunalari. Birinchi bir necha bo'limda siz birinchi grafik tasviringizni yaratasiz
ilovalar. Keyingi bo'limlarda siz yaratish uchun ob'ektga yo'naltirilgan dasturlash tushunchalaridan foydalanasiz
turli shakllarni chizadigan dastur. 12-bobda GUI-larni rasmiy ravishda kiritganimizda,
sichqoncha yordamida aniq qaysi shakllarni chizish va qayerda chizishni tanlaymiz. In
13-bobda biz turli xil shakllarni chizish uchun Java 2D grafik API imkoniyatlarini qo'shamiz.
ferent chiziq qalinligi va plomba. Umid qilamizki, siz ushbu amaliy tadqiqotni ma'lumotli va qiziqarli deb topasiz
olish.

Matnni dialog oynasida ko'rsatish


Hozirgacha taqdim etilgan dasturlar buyruqlar oynasida chiqishni ko'rsatadi. Ko'pgina ilovalar foydalanadi
oynalar yoki dialog oynalari (shuningdek, dialoglar deb ataladi) chiqishni ko'rsatish uchun. kabi veb-brauzerlar
Chrome, Firefox, Internet Explorer, Safari va Opera veb-sahifalarini o'zlarining yutuqlarida ko'rsatadilar.
pastga. Elektron pochta dasturlari xabarlarni oynada yozish va o'qish imkonini beradi. Odatda, dialog
qutilar - bu dasturlar foydalanuvchilarga muhim xabarlarni ko'rsatadigan oynalar. JOption sinfi -
Panjada dasturlarga oynalarni o'z ichiga olgan oynalarni ko'rsatishga imkon beruvchi oldindan tuzilgan dialog oynalari mavjud
xabarlar — bunday oynalar xabarlar dialoglari deb ataladi. 3.12-rasmda String ko'rsatilgan
Xabar muloqot oynasida "Javaga xush kelibsiz".

Joy nomi — mashq(lar)

3.6-bo'lim Dialog oynalaridan foydalanish - dialog oynalari bilan asosiy kiritish va chiqarish
4.15-bo'lim Oddiy chizmalarni yaratish - ekranda chiziqlarni ko'rsatish va chizish
ekran
5.11-bo'lim To'rtburchaklar va tasvirlar chizish - ma'lumotlarni tasvirlash uchun shakllardan foydalanish
6.13-bo'lim Ranglar va to'ldirilgan shakllar - buqa va tasodifiy grafiklarni chizish
7.17-bo'lim Yoylarni chizish - yoylar bilan spirallarni chizish
8.16-bo'lim Ob'ektlarni grafik bilan ishlatish - Shakllarni ob'ektlar sifatida saqlash
9.7-bo'lim Yorliqlar yordamida matn va tasvirlarni ko'rsatish - holatni ta'minlash
ma `lumot
10.10-bo'lim Polimorfizm bilan chizish - o'zaro o'xshashliklarni aniqlash
shakllar
Mashq 12.17 Interfeysni kengaytirish - GUI komponentlaridan foydalanish va hodisalarni boshqarish
13.31-mashq Java 2D-ni qo'shish - chizmalarni yaxshilash uchun Java 2D API-dan foydalanish

3.11-rasm | Har bir bobda GUI va Grafik misollarining qisqacha tavsifi.


3.6 (ixtiyoriy) GUI va grafik misollar: dialog oynalaridan foydalanish 91

JOptionPane Class statik usuli showMessagDialog
3-qator dastur javax.swing paketidagi JOptionPane sinfidan foydalanishini bildiradi. Bu
to'plam grafik foydalanuvchi interfeyslarini (GUI) yaratishga yordam beradigan ko'plab sinflarni o'z ichiga oladi. GUI
komponentlar dastur foydalanuvchisi tomonidan ma'lumotlarni kiritish va natijalarni taqdim etishni osonlashtiradi
foydalanuvchi. 10-qator dialog oynasini ko'rsatish uchun JOptionPane usuli showMessageDialogni chaqiradi.
xabar olish. Usul ikkita argumentni talab qiladi. Birinchisi Java ilovasini o'chirishga yordam beradi
dialog oynasini qaerga joylashtirishni tugating. Muloqot oynasi odatda GUI ilovasidan ko'rsatiladi
o'z oynasi bilan. Birinchi argument o'sha oynaga ishora qiladi (ota-ona g'alabasi sifatida tanilgan)
dow) va dialogning ilova oynasining markazida paydo bo'lishiga olib keladi. Agar birinchi dalil bo'lsa
null bo'lsa, dialog oynasi ekraningizning markazida ko'rsatiladi. Ikkinchi dalil
dialog oynasida ko'rsatiladigan satr.
Statik usullar bilan tanishtirish
JOptionPane usuli showMessageDialog statik usul deb ataladi. Bunday usullar
tez-tez ishlatiladigan vazifalarni aniqlang. Masalan, ko'pgina dasturlar dialog oynalarini ko'rsatadi va
buni qilish uchun kod har safar bir xil bo'ladi. Sizdan "qayta ixtiro qilishni" talab qilish o'rniga
g'ildirak ”va dialogni ko'rsatish uchun kod yarating, JOptionPane sinfining dizaynerlari a
bu vazifani siz uchun bajaradigan statik usul. Statik usul o'z sinfidan foydalanib chaqiriladi
nomidan keyin nuqta (.) va usul nomi, quyidagi kabi

E'tibor bering, siz JOptionPane sinfining statik usulidan foydalanish uchun ob'ekt yaratmaysiz


showMessageDialog. Statik usullarni 6-bobda batafsilroq muhokama qilamiz.
Muloqot oynasiga matn kiritish
3.13-rasmda kirish dialogi deb ataladigan boshqa oldindan belgilangan JOptionPane dialog oynasidan foydalaniladi
foydalanuvchi dasturga ma'lumotlarni kiritish uchun. Dastur foydalanuvchining ismini so'raydi va javob beradi
salomlashish va foydalanuvchi kiritgan ismni o'z ichiga olgan xabar dialogi bilan.

1 // 3.12-rasm: Dialog1.java


2 // Muloqot oynasida bir nechta satrlarni ko'rsatish uchun JOptionPane-dan foydalanish.
3 import javax.swing.JOptionPane;
4
5 ommaviy sinf Dialog1
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11 }
12 } // oxirgi sinf Dialog1

3.12-rasm | Muloqot oynasida bir nechta satrlarni ko'rsatish uchun JOptionPane-dan foydalanish.

ClassName.methodName(argumentlar)

// xabarli dialog oynasini ko'rsatish


JOptionPane.showMessageDialog(null, "Java'ga xush kelibsiz");

92 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish

JOptionPane Class statik usuli showInputDialog
10-qator o'z ichiga olgan kiritish dialogini ko'rsatish uchun showInputDialog JOptionPane usulidan foydalanadi
so'rov va foydalanuvchi matn kiritishi mumkin bo'lgan maydon (matn maydoni sifatida tanilgan). Usul ko'rsatish -
InputDialog argumenti foydalanuvchi nimani kiritishi kerakligini ko'rsatadigan taklifdir. Foydalanuvchi
matn maydoniga belgilar kiriting, keyin OK tugmasini bosing yoki qayta kiritish uchun Enter tugmasini bosing.
Stringni dasturga aylantiring. showInputDialog usuli o'z ichiga olgan Stringni qaytaradi
foydalanuvchi tomonidan kiritilgan belgilar. Biz Stringni o'zgaruvchi nomida saqlaymiz. tugmasini bossangiz
dialog oynasining Bekor qilish tugmasi yoki Esc tugmasini bosing, usul nullni qaytaradi va dastur o'chiriladi.
ism sifatida "null" so'zini o'ynaydi.
String Class statik usul formati
13–14 qatorlar salomlashuvni o‘z ichiga olgan Stringni qaytarish uchun statik String usuli formatidan foydalanadi
foydalanuvchi nomi bilan. Usul formati System.out.printf usuli kabi ishlaydi, bundan tashqari
format buyruqlar oynasida ko'rsatish o'rniga formatlangan Stringni qaytaradi.
17-qatorda salomlashish xabar dialog oynasida aks etadi, xuddi biz 3.12-rasmda qilganimizdek.
GUI va grafik misollarni o'rganish mashqlari
3.1 Dialogga asoslangan kirish va chiqishdan foydalanish uchun 2.7-rasmdagi qo'shish dasturini o'zgartiring.
JOptionPane sinfining usullari. showInputDialog usuli Stringni qaytargani uchun siz aylantirishingiz kerak
Hisoblashda foydalanish uchun foydalanuvchi int ga kiritadigan satr. Sinfning parseInt statik usuli
Integer (java.lang paketi) butun sonni ifodalovchi String argumentini oladi va qiymatni qaytaradi
int sifatida. Agar Stringda yaroqli butun son bo'lmasa, dastur xato bilan tugaydi.

1 // 3.13-rasm: NameDialog.java


2 // Muloqot oynasidan foydalanuvchi ma'lumotlarini olish.
3
4
5 umumiy sinf NameDialog
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12
13
14
15
16
17
18 } // asosiyni tugatish
19 } // oxirgi sinf NameDialog

3.13-rasm | Muloqot oynasidan foydalanuvchi ma'lumotlarini olish.

import javax.swing.JOptionPane;

// foydalanuvchi nomini kiritishni taklif qiladi


String name = JOptionPane.showInputDialog("Ismingiz nima?");

// xabar yarating


String xabar =
String.format("Xush kelibsiz, %s, Java Programmingga!", nomi);

// foydalanuvchini nomi bilan kutib olish uchun xabarni ko'rsatish


JOptionPane.showMessageDialog(null, xabar);

3.7 Yakunlash 93

3.7 Yakunlash
Ushbu bobda siz o'z sinflaringizni va usullarini yaratish, ob'ektlarni yaratishni o'rgandingiz
foydali amallarni bajarish uchun ushbu ob'ektlarning sinflari va usullarini chaqirish. Siz e'lon qildingiz -
sinfning har bir ob'ekti uchun ma'lumotlarni saqlash uchun sinfning pozitsiya o'zgaruvchilari va siz e'lon qildingiz
ushbu ma'lumotlar bilan ishlashning o'z usullari. Siz unga aytish usulini qanday chaqirishni o'rgandingiz
o'z vazifasini bajarish va ma'lumotni qiymatlari bo'lgan argumentlar sifatida usulga qanday o'tkazish
Usul parametrlari bilan belgilanadi. Siz mahalliy o'zgaruvchi o'rtasidagi farqni bilib oldingiz
bir usul va sinfning misol o'zgaruvchisi va faqat misol o'zgaruvchilari boshlang'ich bo'ladi -
avtomatik tarzda tuziladi. Siz boshlang'ichni belgilash uchun sinf konstruktoridan qanday foydalanishni ham o'rgandingiz
ob'ektning misol o'zgaruvchilari uchun qiymatlar. UML sinf diagrammalarini qanday yaratishni ko'rdingiz
sinflarning usullari, atributlari va konstruktorlarini modellashtirish. Nihoyat, siz float haqida bilib oldingiz -
ing-nuqta raqamlari (o'nli nuqtali raqamlar) - ularni qanday o'zgaruvchilar bilan saqlash
ibtidoiy turdagi double, ularni Scanner ob'ekti bilan qanday kiritish va ularni qanday formatlash
ko'rsatish maqsadida printf va %f format spetsifikatsiyasi bilan. [8-bobda biz takrorlashni boshlaymiz
BigDecimal klassi bilan pul summalarini aniq ko'rib chiqish.] Siz ham boshlagan bo'lishingiz mumkin
ixtiyoriy GUI va Grafik amaliy ish, birinchi GUI ilovangizni qanday yozishni o'rganing
lar. Keyingi bobda biz ko'rsatgan boshqaruv iboralari bilan tanishishni boshlaymiz
dastur harakatlarini bajarish tartibi. Siz ulardan o'z usullaringizda foydalanasiz
o'z vazifalarini qanday tartibga solish kerakligini aniqlang.

Xulosa
Bo'lim 3.2 Instance o'zgaruvchilari, Methods o'rnating va Methods oling


• Siz yaratgan har bir sinf o'zgaruvchilarni e'lon qilish va ob'ektlar yaratish uchun ishlatilishi mumkin bo'lgan yangi turga aylanadi.
• Zarur bo'lganda yangi sinflarni e'lon qilishingiz mumkin; Java kengaytiriladigan til sifatida tanilganining sabablaridan biri bu.
3.2.1-bo'lim, Instance o'zgaruvchisi, to'siq usuli va olish usuli bilan hisob klassi
• Umumiy kirish modifikatori (71-bet) bilan boshlanadigan har bir sinf deklaratsiyasi faylda saqlanishi kerak.
bu sinf bilan bir xil nomga ega va .java fayl nomi kengaytmasi bilan tugaydi.
• Har bir sinf deklaratsiyasi sinf kalit so'zidan keyin darhol sinf nomini o'z ichiga oladi.
• Sinf, usul va o‘zgaruvchilar nomlari identifikator hisoblanadi. An'anaga ko'ra, hamma tuya ishi nomlaridan foydalanadi. Sinf
nomlar bosh harf bilan boshlanadi, usul va o‘zgaruvchilar nomlari esa kichik harf bilan boshlanadi
xat.
• Ob'ektda misol o'zgaruvchilari sifatida amalga oshiriladigan (72-bet) va u bilan birga olib boriladigan atributlar mavjud.
butun umri davomida.
• Ob'ektda usullar chaqirilishidan oldin, usullar bajarilayotganda misol o'zgaruvchilari mavjud
va usullar tugallangandan keyin.
• Sinf odatda o'zgaruvchilarni boshqaradigan bir yoki bir nechta usullarni o'z ichiga oladi.
sinfning alohida ob'ektlariga uzoq.
• Namuna o'zgaruvchilari sinf deklaratsiyasida e'lon qilinadi, lekin sinf meth-ning tanasidan tashqarida e'lon qilinadi.
od deklaratsiyalari.
• Sinfning har bir ob'ekti (nasolasi) har bir sinf misol o'zgaruvchilarining o'z nusxasiga ega.
• Ko‘pchilik misol o‘zgaruvchilari deklaratsiyasidan oldin private kalit so‘zi (72-bet) qo‘yiladi.
kirish modifikatori. Maxsus kirish modifikatori bilan e'lon qilingan o'zgaruvchilar yoki usullardan faqat foydalanish mumkin
ular e'lon qilingan sinfning usullariga.

94 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish



• Parametrlar vergul bilan ajratilgan parametrlar ro'yxatida e'lon qilinadi (73-bet), ular ichida joylashgan.
usul deklaratsiyasida usul nomidan keyin keladigan qavslar. Bir nechta parametrlar mavjud
vergul bilan ajratiladi. Har bir parametr o'zgaruvchi nomidan keyin turni ko'rsatishi kerak.
• Muayyan usulning tanasida e'lon qilingan o'zgaruvchilar mahalliy o'zgaruvchilar bo'lib, faqat quyidagi hollarda ishlatilishi mumkin.
bu usul. Usul tugashi bilan uning mahalliy o'zgaruvchilari qiymatlari yo'qoladi. Bir usul pa-
rametrlar usulning mahalliy o'zgaruvchilari.
• Har bir usulning tanasi chap va o'ng qavslar ({ va }) bilan ajratilgan.
• Har bir usul tanasida metod vazifasi(lar)ni bajaradigan bir yoki bir nechta bayonotlar mavjud.
• Usulning qaytish turi usul chaqiruvchisiga qaytarilgan ma'lumotlar turini belgilaydi. Kalit so'z bekor
usul vazifani bajarishini, lekin hech qanday ma'lumotni qaytarmasligini bildiradi.
• Usul nomidan keyingi boʻsh qavslar metod hech qanday pa- ri talab qilmasligini bildiradi.
o'z vazifasini bajarish uchun rameters.
• voiddan boshqa qaytish turini (73-bet) ko'rsatuvchi usul chaqirilsa va uni yakunlasa.
vazifa, usul natijani chaqiruv usuliga qaytarishi kerak.
• Qaytish bayonoti (74-bet) chaqirilgan usuldan qiymatni uning chaqiruvchisiga qaytaradi.
• Sinflar ko'pincha sinf mijozlariga shaxsiy misolni o'rnatish yoki olish imkonini beradigan umumiy usullarni taqdim etadi
o'zgaruvchilar. Ushbu usullarning nomlari set yoki get bilan boshlanishi shart emas, balki ushbu nomlash konventsiyasidir
tavsiya etiladi.
3.2.2-bo'lim Hisob qaydnomasi ob'ektini yaratuvchi va foydalanadigan AccountTest klassi
• Boshqa sinf ob'ektini yaratadigan, so'ngra ob'ektning usullarini chaqiradigan sinf haydovchi sinfidir.
• Keyingi qator (75-bet) skaner usuli yangi satr belgisiga duch kelmaguncha belgilarni o‘qiydi, keyin
belgilarni String sifatida qaytaradi.
• Keyingi skaner usuli (75-bet) har qanday bo‘sh joy belgisiga duch kelmaguncha belgilarni o‘qiydi,
keyin belgilarni String sifatida qaytaradi.
• Sinf namunasini yaratish ifodasi (75-bet) new kalit so'zi bilan boshlanadi va yangi ob'ektni yaratadi.
• Konstruktor usulga o'xshaydi, lekin uni ishga tushirish uchun new operator tomonidan bevosita chaqiriladi
ob'ekt yaratilgan vaqtda ob'ektning namunasi o'zgaruvchilari.
• Ob'ektning usulini chaqirish uchun nuqta ajratuvchi (76-bet) bilan ob'ekt nomiga amal qiling, usul
nom va usul argumentlarini o'z ichiga olgan qavslar to'plami.
• Mahalliy o'zgaruvchilar avtomatik ravishda ishga tushirilmaydi. Har bir misol o'zgaruvchisi standart boshlang'ich qiymatiga ega
ue - misol o'zgaruvchisining boshlang'ich qiymatini ko'rsatmaganingizda Java tomonidan taqdim etiladigan qiymat.
• String tipidagi misol o‘zgaruvchisi uchun standart qiymat null.
• Usul chaqiruvi usulning har bir parametri uchun argumentlar deb nomlanuvchi qiymatlarni taqdim etadi. Har biri
argumentning qiymati usul sarlavhasidagi mos parametrga tayinlanadi.
• Usul chaqiruvidagi argumentlar soni usuldagi parametrlar soniga mos kelishi kerak
deklaratsiya parametrlari ro'yxati.
• Usul chaqiruvidagi argument turlari mos keladiganlarning turlariga mos kelishi kerak
usul deklaratsiyasidagi parametrlar.
3.2.3-bo'lim Bir nechta sinflar bilan ilovani kompilyatsiya qilish va bajarish
• Javac buyrug'i bir vaqtning o'zida bir nechta sinflarni kompilyatsiya qilishi mumkin. Shunchaki manba kodi fayl nomlarini sanab o'ting
buyruqdan keyin har bir fayl nomi keyingisidan bo'sh joy bilan ajratilgan. Agar katalog mos kelsa
ilovani saqlash faqat bitta ilovaning fayllarini o'z ichiga oladi, siz uning barcha sinflarini buyruq bilan kompilyatsiya qilishingiz mumkin
javac *.java. *.javadagi yulduzcha (*) joriy katalogdagi barcha fayllar tugashini bildiradi
fayl nomi kengaytmasi bilan “.java” kompilyatsiya qilinishi kerak.

Xulosa 95



3.2.4 bo'lim Instance o'zgaruvchi bilan hisob UML sinf diagrammasi va o'rnatish va
usullarini oling
• UMLda har bir sinf sinf diagrammasida (77-bet) uchta bo'linmali to'rtburchak shaklida modellashtirilgan.
mentlar. Yuqori qismida gorizontal ravishda qalin shrift bilan markazlashtirilgan sinf nomi mavjud. O'rtasi
Java-dagi misol o'zgaruvchilariga mos keladigan sinfning atributlarini o'z ichiga oladi. Pastki
Java tilidagi usullar va konstruktorlarga mos keladigan sinf operatsiyalarini o'z ichiga oladi (78-bet).
• UML atribut nomi sifatida misol o'zgaruvchilarini, so'ngra ikki nuqta va turni ifodalaydi.
• UMLda xususiy atributlar oldidan minus belgisi (–) qo'yiladi.
• UML operatsiya nomidan keyin qavslar to'plamini ro'yxatga olish orqali operatsiyalarni modellashtiradi. A
Operatsiya nomi oldidagi qo'shimcha belgisi (+) operatsiyaning umumiy ekanligini bildiradi
UML (ya'ni, Java-da umumiy usul).
• UML operatsiya parametrini parametr nomidan keyin ikki nuqta qo‘yish orqali modellashtiradi
va operatsiya nomidan keyin qavslar orasidagi parametr turi.
• UML ikki nuqta qo'yish orqali operatsiyaning qaytish turini va orqaga qaytish turini ko'rsatadi
operatsiya nomidan keyingi qavslar.
• UML sinf diagrammalarida qiymatlarni qaytarmaydigan operatsiyalar uchun qaytarish turlari belgilanmagan.
• Misol o'zgaruvchilarni shaxsiy deb e'lon qilish ma'lumotlarni yashirish yoki ma'lumotni yashirish deb nomlanadi.
3.2.5-bo'lim Class AccountTest bo'yicha qo'shimcha eslatmalar
• Ularga o'z vazifalarini bajarishlarini aytish uchun asosiy usullardan boshqa usullarni aniq chaqirishingiz kerak.
• JVMga ilovani ishga tushirish uchun asosiy usulni aniqlash va chaqirish imkonini berishning asosiy qismi hisoblanadi.
statik kalit so'z, bu main birinchisiz chaqirilishi mumkin bo'lgan statik usul ekanligini ko'rsatadi
usul e'lon qilingan sinf ob'ektini yaratish.
• Java dasturlarida foydalanadigan ko'pgina sinflar aniq import qilinishi kerak. Maxsus munosabat bor -
bir xil katalogda tuzilgan sinflar o'rtasida jo'natish. Odatiy bo'lib, bunday sinflar quyidagilar hisoblanadi:
bir xil paketda bo'lishi kerak - standart paket sifatida tanilgan. Xuddi shu paketdagi sinflar
ushbu paketdagi boshqa sinflarning manba kodi fayllariga bilvosita import qilinadi. Import deklaratsiyasi
Agar paketdagi bir sinf bir xil paketda boshqasini ishlatsa, ratsion talab qilinmaydi.
• To'liq malakali sinfga doimo murojaat qilsangiz, import deklaratsiyasi talab qilinmaydi
paket nomi va sinf nomini o'z ichiga olgan nom.
3.2.6-bo'lim shaxsiy instantsiya o'zgaruvchilari va ommaviy to'plam bilan dasturiy ta'minot muhandisligi
va usullarni oling
• Misol o'zgaruvchilarni shaxsiy deb e'lon qilish ma'lumotlarni yashirish yoki ma'lumotni yashirish deb nomlanadi.
3.3-bo'lim ibtidoiy turlar va mos yozuvlar turlari
• Java tilidagi turlar ikki toifaga bo'linadi - ibtidoiy tiplar va mos yozuvlar turlari. Ibtidoiy
turlari boolean, bayt, char, short, int, long, float va double. Boshqa barcha turlar mos yozuvlar hisoblanadi
turlari, shuning uchun ob'ektlarning turlarini ko'rsatadigan sinflar mos yozuvlar turlari hisoblanadi.
• Primitiv tipdagi o'zgaruvchi bir vaqtning o'zida o'zining e'lon qilingan turining aynan bitta qiymatini saqlashi mumkin.
• Primitiv tipdagi misol o'zgaruvchilari sukut bo'yicha ishga tushiriladi. Bayt, char, short, turdagi o'zgaruvchilar
int, long, float va double 0 ga ishga tushiriladi. Boolean tipidagi o'zgaruvchilar noto'g'ri ishga tushiriladi.
• Yo'naltiruvchi tipdagi o'zgaruvchilar (spravkalar deb ataladi; 81-bet) kompyuterda ob'ektning joylashuvini saqlaydi.
erning xotirasi. Bunday o'zgaruvchilar dasturdagi ob'ektlarga tegishli. Havola qilingan ob'ekt bo'lishi mumkin
ko'p misol o'zgaruvchilari va usullarini o'z ichiga oladi.
• Murojaat tipidagi misol o'zgaruvchilari sukut bo'yicha null qiymatiga ishga tushiriladi.

96 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish



• Ob'ekt usullarini chaqirish uchun ob'ektga havola (81-bet) talab qilinadi. Ibtidoiy turdagi o'zgaruvchan
able ob'ektga ishora qilmaydi va shuning uchun usulni chaqirish uchun ishlatilmaydi.
3.4-bo'lim Hisob sinfi: Konstruktorlar bilan ob'ektlarni ishga tushirish
• Siz e'lon qilgan har bir sinf ixtiyoriy ravishda konstruktorga foydalanish mumkin bo'lgan parametrlarni taqdim etishi mumkin
ob'ekt yaratilganda sinf ob'ektini ishga tushirish.
• Java har bir yaratilgan obyekt uchun konstruktor chaqiruvini talab qiladi.
• Konstruktorlar parametrlarni belgilashi mumkin, lekin turlarni qaytara olmaydi.
• Agar sinf konstruktorlarni aniqlamasa, kompilyator standart konstruktorni (83-bet) taqdim etadi.
hech qanday parametr yo'q va sinfning misol o'zgaruvchilari standart qiymatlariga ishga tushiriladi.
• Agar siz sinf uchun konstruktorni e'lon qilsangiz, kompilyator buning uchun standart konstruktor yaratmaydi.
sinf.
• UML konstruktorlarni sinf diagrammasining uchinchi bo'limida modellashtiradi. Ajratish uchun
sinf operatsiyalaridan konstruktor sifatida UML "konstruktor" so'zini guillemetlar orasiga qo'yadi
(«va»; 84-bet) yasovchi nomidan oldin.
3.5-bo'lim Balans bilan hisob klassi; Suzuvchi nuqta raqamlari va turi dou-
ble
• Suzuvchi nuqtali raqam (84-bet) kasrli sondir. Java ikkita primitivni taqdim etadi
suzuvchi nuqtali raqamlarni xotirada saqlash uchun turlar — float va double (84-bet).
• float tipidagi o'zgaruvchilar bir aniqlikdagi suzuvchi nuqtali raqamlarni ifodalaydi va ettita ma'noga ega:
aniq raqamlar. Double tipidagi o'zgaruvchilar ikki tomonlama aniqlikdagi suzuvchi nuqtali sonlarni ifodalaydi. Bular
float o'zgaruvchilardan ikki baravar ko'p xotira talab qiladi va 15 ta muhim raqamni ta'minlaydi - taxminan
float o'zgaruvchilarning aniqligini ikki baravar oshiradi.
• Oʻzgaruvchan nuqtali harflar (84-bet) sukut boʻyicha double turiga ega.
• NextDouble skaner usuli (88-bet) ikkilamchi qiymatni qaytaradi.
• Format spetsifikatsiyasi %f (88-bet) float yoki double tipidagi qiymatlarni chiqarish uchun ishlatiladi. Format xususiyatlari -
%.2f identifikatori aniqlikning ikki raqami (88-bet) kasrning o'ng tomonida chiqishi kerakligini bildiradi.
suzuvchi nuqta raqamidagi nuqta.
• Double tipidagi misol o‘zgaruvchisi uchun standart qiymat 0,0 va in-
int tipidagi statsionar o'zgaruvchi 0 ga teng.
O'z-o'zini tekshirish mashqlari
3.1 Quyidagilarning har biridagi bo'sh joylarni to'ldiring:
a) Kalit so'z bilan boshlanadigan har bir sinf deklaratsiyasi shunday faylda saqlanishi kerak
sinf bilan aynan bir xil nomga ega va .java fayl nomi kengaytmasi bilan tugaydi.
b) Sinf deklaratsiyasidagi kalit so'zdan keyin darhol sinf nomi keladi.
c) Kalit so'z ob'ektni saqlash uchun tizimdan xotirani so'raydi, so'ngra uni chaqiradi
ob'ektni ishga tushirish uchun mos keladigan sinf konstruktori.
d) Har bir parametr a(n) va a(n) ni ham belgilashi kerak.
e) Odatiy bo'lib, bitta katalogda tuzilgan sinflar
deb nomlanuvchi bir xil paket.
f) Java suzuvchi nuqtali raqamlarni xotirada saqlash uchun ikkita ibtidoiy turni taqdim etadi:
va .
g) double tipidagi o‘zgaruvchilar suzuvchi nuqtali sonlarni ifodalaydi.
h) Skaner usuli ikki tomonlama qiymatni qaytaradi.
i) public kalit so'zi kirishdir.

O'z-o'zini tekshirish mashqlariga javoblar 97



j) Qaytish turi usul qiymatni qaytarmasligini bildiradi.
k) Skaner usuli belgilarni yangi qator belgisiga duch kelguncha o‘qiydi;
keyin bu belgilarni String sifatida qaytaradi.
l) Class String paketda.
m) Agar siz har doim to'liq malakali sinfga murojaat qilsangiz, A(n) shart emas
nomi.
n) A(n) - kasrli son, masalan, 7,33, 0,0975 yoki 1000,12345.
o) float tipidagi o'zgaruvchilar _ -aniq suzuvchi nuqtali sonlarni ifodalaydi.
p) format spetsifikatsiyasi float yoki double tipidagi qiymatlarni chiqarish uchun ishlatiladi.
q) Java tilidagi turlar ikki toifaga bo'linadi - turlar va turlar.
3.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ayting. Agar yolg'on bo'lsa, sababini tushuntiring.
a) An'anaga ko'ra, usul nomlari birinchi harfning bosh harfi bilan boshlanadi va barcha keyingi harflar
nomidagi so'zlar bosh bosh harf bilan boshlanadi.
b) Agar paketdagi bir sinf boshqa sinfdan foydalansa, import deklaratsiyasi talab qilinmaydi
bir xil paket.
c) Usul deklaratsiyasida usul nomidan keyingi boʻsh qavslar shuni koʻrsatadiki
Usul o'z vazifasini bajarish uchun hech qanday parametrlarni talab qilmaydi.
d) Usulni chaqirish uchun ibtidoiy tipdagi o'zgaruvchidan foydalanish mumkin.
e) Muayyan usulning tanasida e'lon qilingan o'zgaruvchilar misol o'zgaruvchilari sifatida tanilgan
va sinfning barcha usullarida qo'llanilishi mumkin.
f) Har bir usulning tanasi chap va o'ng qavslar ({ va }) bilan chegaralanadi.
g) ibtidoiy tipdagi mahalliy o'zgaruvchilar sukut bo'yicha inisializatsiya qilinadi.
h) Yo'naltiruvchi tipidagi misol o'zgaruvchilari sukut bo'yicha null qiymatiga ishga tushiriladi.
i) Umumiy statik void main (String [] args) ni o'z ichiga olgan har qanday sinfni bajarish uchun foydalanish mumkin.
yoqimli ilova.
j) Usul chaqiruvidagi argumentlar soni parametrlar soniga mos kelishi kerak
usul deklaratsiyasining parametrlar ro'yxati.
k) manba kodida paydo bo'ladigan suzuvchi nuqta qiymatlari suzuvchi nuqtali harflar va deb nomlanadi
sukut bo'yicha float turi hisoblanadi.
3.3 Mahalliy o'zgaruvchi va misol o'zgaruvchisi o'rtasidagi farq nima?
3.4 Usul parametrining maqsadini tushuntiring. Parametr o'rtasidagi farq nima
va argument?
O'z-o'zini tekshirish mashqlariga javoblar
3.1 a) ommaviy. b) sinf. c) yangi. d) turi, nomi. e) standart paket. f) suzib yuruvchi, qo‘sh. g) ikki barobar -
aniqlik. h) keyingi Double. i) o‘zgartiruvchi. j) bekor. k) keyingi qator. l) java.lang. m) import deklaratsiyasi. n)
suzuvchi nuqta raqami. o) yagona. p) %f. q) ibtidoiy, mos yozuvlar.
3.2 a) noto'g'ri. An'anaga ko'ra, usul nomlari kichik birinchi harf va barcha pastki harflar bilan boshlanadi.
nomdagi quent so'zlari bosh bosh harf bilan boshlanadi. b) To'g'ri. c) To'g'ri. d) yolg'on. Primitiv tip
o'zgaruvchini usulni chaqirish uchun ishlatib bo'lmaydi - ob'ektni chaqirish uchun ob'ektga havola kerak.
ob'ekt usullari. e) yolg'on. Bunday o'zgaruvchilar mahalliy o'zgaruvchilar deb ataladi va faqat usulda ishlatilishi mumkin
unda ular e'lon qilinadi. f) To'g'ri. g) yolg'on. Primitiv tipdagi misol o'zgaruvchilari de-
ayb. Har bir mahalliy o'zgaruvchiga aniq qiymat berilishi kerak. h) To'g'ri. i) To'g'ri. j) To'g'ri. k) yolg'on. Bunday
literallar sukut bo'yicha double turiga ega.
3.3 Mahalliy o'zgaruvchi usulning tanasida e'lon qilinadi va faqat nuqtadan foydalanish mumkin.
u usul deklaratsiyasining oxirigacha e'lon qilinadi. Misol o'zgaruvchisi a da e'lon qilinadi
sinf, lekin sinfning har qanday usullarining tanasida emas. Bundan tashqari, misol o'zgaruvchilari hamma uchun ochiqdir
sinf usullari. (Biz 8-bobda bundan istisnoni ko'ramiz.)

98 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish



3.4 Parametr o'z vazifasini bajarish uchun usul talab qiladigan qo'shimcha ma'lumotni ifodalaydi.
Usul tomonidan talab qilinadigan har bir parametr usul deklaratsiyasida ko'rsatilgan. Argument - bu
usul parametri uchun haqiqiy qiymat. Usul chaqirilganda, argument qiymatlari unga uzatiladi
o'z vazifasini bajarishi uchun usulning tegishli parametrlarini.
Mashqlar
3.5 (Yangi kalit so'z) new kalit so'zining maqsadi nima? Uni ishlatganda nima sodir bo'lishini tushuntiring.
3.6 (Birlamchi konstruktorlar) Standart konstruktor nima? Ob'ektning misol o'zgaruvchilari qanday
Agar sinfda faqat standart konstruktor bo'lsa, ishga tushiriladimi?
3.7 (Namunali o'zgaruvchilar) Namuna o'zgaruvchisining maqsadini tushuntiring.
3.8 (Klasslarni import qilmasdan foydalanish) Aksariyat sinflarni import qilishdan oldin import qilish kerak
ilovada foydalanish mumkin. Nima uchun har bir ilovaga avval import qilmasdan System va String sinflaridan foydalanishga ruxsat berilgan?
ular?
3.9 (Klassni import qilmasdan foydalanish) Dastur qanday qilib sinf skaneridan foydalanishi mumkinligini tushuntiring:
uni import qilish.
3.10 (Usullarni o'rnatish va olish) Nima uchun sinf to'siq usuli va olish usulini taqdim etishi mumkinligini tushuntiring.
misol o'zgaruvchisi.
3.11 (O'zgartirilgan hisob sinfi) Hisob sinfini o'zgartiring (3.8-rasm) bilan chaqirilgan usulni ta'minlash uchun.
Hisobdan pul yechib oladigan chizish. Pul o'tkazish miqdori oshmasligiga ishonch hosil qiling
hisob balansi. Agar shunday bo'lsa, balans o'zgarishsiz qoldirilishi kerak va usul chop etilishi kerak
"Echib olish summasi hisob balansidan oshib ketdi" degan xabar. AccountTest sinfini o'zgartirish
(3.9-rasm) sinov usulini olib tashlash uchun.
3.12 (Invoice Class) Uskuna do'koni taqdim etish uchun foydalanishi mumkin bo'lgan Invoice deb nomlangan sinf yarating
do'konda sotilgan buyum uchun hisob-faktura. Hisob-faktura to'rtta ma'lumotni o'z ichiga olishi kerak
misol o'zgaruvchilari - qism raqami (String turi), qism tavsifi (String turi), miqdor
xarid qilinayotgan mahsulot (int turi) va har bir mahsulot narxi (ikki marta). Sizning sinfingizda konstruktor bo'lishi kerak
bu to'rtta misol o'zgaruvchisini ishga tushiradi. Har bir misol o'zgaruvchisi uchun to'plam va get usulini taqdim eting.
Bundan tashqari, hisob-faktura miqdorini hisoblaydigan getInvoiceAmount nomli usulni taqdim eting (ya'ni,
miqdorni har bir element narxiga ko'paytiradi), keyin miqdorni ikki barobar qiymat sifatida qaytaradi. Agar
miqdori ijobiy emas, u 0 ga o'rnatilishi kerak. Agar mahsulot narxi ijobiy bo'lmasa, uni o'rnatish kerak
0,0. InvoiceTest nomli sinov ilovasini yozing, u Invoice sinfining imkoniyatlarini namoyish etadi.
3.13 (Xodimlar klassi) Uchta misol o'zgaruvchisini o'z ichiga olgan "Xodim" deb nomlangan sinf yarating - a
ismingiz (String turi), familiyangiz (String turi) va oylik ish haqi (ikki marta). Shartnoma bering
uchta misol o'zgaruvchisini ishga tushiradigan struktura. Har bir misol uchun to'plam va olish usulini taqdim eting
o'zgaruvchan. Agar oylik ish haqi ijobiy bo'lmasa, uning qiymatini belgilamang. Employ- nomli sinov ilovasini yozing.
Sinf Xodimlarining imkoniyatlarini ko'rsatadigan eeTest. Ikkita Xodim ob'ektini yarating va har birini ko'rsating
ob'ektning yillik ish haqi. Keyin har bir Xodimga 10% ko'taring va har bir xodimning yillik maoshini ko'rsating
yana.
3.14 (Sana sinfi) Date nomli sinf yarating, u uchta misol o'zgaruvchisini o'z ichiga oladi - oy (turi).
int), kun (int turi) va yil (int turi). Uchta misolni ishga tushiradigan konstruktorni taqdim eting
o'zgaruvchilar va berilgan qiymatlarni to'g'ri deb hisoblaydi. Har biri uchun to'plam va olish usulini taqdim eting
misol o'zgaruvchisi. Oy, kun va yilni ajratib ko'rsatadigan displayDate usulini taqdim eting
oldinga qiyshiq chiziqlar (/) bilan. Date sinfining imkoniyatlarini namoyish qiluvchi DateTest nomli sinov ilovasini yozing.
3.15 (Usulning asosiy qismida takrorlangan kodni olib tashlash) 3.9-rasmdagi AccountTest sinfida, usul
Asosiy oltita bayonotni o'z ichiga oladi (13–14, 15–16, 28–29, 30–31, 40–41 va 42–43 qatorlar)
Hisob ob'ektining nomi va balansini o'ynang. Ushbu bayonotlarni o'rganing va ular bir-biridan farq qilishini sezasiz

Farq qilish 99



faqat manipulyatsiya qilinayotgan Hisob ob'ektida - hisob 1 yoki hisob2. Ushbu mashqda siz aniqlaysiz
ushbu chiqish bayonotining bir nusxasini o'z ichiga olgan yangi displayAccount usuli. Usul pa-
rameter Hisob ob'ekti bo'ladi va usul ob'ekt nomi va balansini chiqaradi. Siz
so'ngra asosiy oltita takrorlangan bayonotni argument sifatida uzatib, displayAccount qo'ng'iroqlari bilan almashtiring.
chiqish uchun maxsus Hisob ob'ektini kiriting.
Quyidagi displayAccount usulini e'lon qilish uchun 3.9-rasmdagi AccountTest sinfini o'zgartiring
Asosiy o‘ng qavsdan keyin va AccountTest sinfining o‘ng qavsdan oldin:
umumiy statik void displayAccount(Account accountToDisplay)
{
// ko'rsatiladigan bayonotni joylashtiring
// accountToDisplay nomi va balansi bu yerda
}
Usul tanasidagi izohni accountToDisplay ko'rsatadigan bayonot bilan almashtiring
ism va balans.
Eslatib o'tamiz, main statik usul, shuning uchun uni avval ob'ekt yaratmasdan chaqirish mumkin
asosiysi e'lon qilingan sinf. Shuningdek, biz displayAccount usulini statik usul sifatida e'lon qildik.
Qachon main birinchi navbatda ob'ektni yaratmasdan, xuddi shu sinfdagi boshqa usulni chaqirishi kerak
sinfda, boshqa usul ham statik deb e'lon qilinishi kerak.
displayAccount deklaratsiyasini tugatganingizdan so'ng, bayonotlarni almashtirish uchun main ni o'zgartiring
Bu har bir Hisob nomini va balansini ko'rsatadi
tegishlicha account1 yoki account2 obyektini argument qiling. Keyin yangilangan AccountTest-ni sinab ko'ring
3.9-rasmda ko'rsatilganidek, bir xil mahsulot ishlab chiqarishini ta'minlash uchun sinf.
Farq qilish
3.16 (Maqsadli yurak urish tezligi kalkulyatori) Mashq qilish paytida siz yurak urish tezligi monitoridan foydalanishingiz mumkin.
sizning yurak urish tezligi murabbiylaringiz va shifokorlaringiz tomonidan tavsiya etilgan xavfsiz diapazonda qoladi. Amerikaga ko'ra -
ican Heart Association (AHA) (www.americanheart.org/presenter.jhtml?identifier=4736),
Maksimal yurak urish tezligini daqiqada urish tezligida hisoblash formulasi 220 minus sizning yoshingizni yillardagi.
Maqsadli yurak urish tezligi maksimal yurak urish tezligining 50–85 foizini tashkil qiladi. [Izoh: Bu formulalar
AHA tomonidan taqdim etilgan taxminlar. Maksimal va maqsadli yurak urish tezligi sog'liq, fitnesga qarab farq qilishi mumkin
va shaxsning jinsi. Oldin har doim shifokor yoki malakali sog'liqni saqlash mutaxassisi bilan maslahatlashing
mashqlar dasturini boshlash yoki oʻzgartirish.] HeartRates deb nomlangan sinf yarating. Sinf atributlari
shaxsning ismi, familiyasi va tug'ilgan sanasini o'z ichiga olishi kerak (alohida atributlardan iborat
oyi, kuni va tug'ilgan yili). Sizning sinfingiz ushbu ma'lumotlarni pa- sifatida qabul qiladigan konstruktorga ega bo'lishi kerak.
rametrlar. Har bir atribut uchun to'plam va olish usullarini taqdim eting. Sinf, shuningdek, bir usulni o'z ichiga olishi kerak
shaxsning yoshini (yillarda) hisoblab chiqadi va qaytaradi, bu usul odamning yoshini hisoblab chiqadi va qaytaradi
maksimal yurak tezligi va odamning maqsadli yurak tezligini hisoblaydigan va qaytaradigan usul. a yozing
Shaxs ma'lumotlarini so'raydigan Java ilovasi HeartRates sinfi ob'ektini va
ushbu ob'ektdan ma'lumotni, jumladan, shaxsning ismi, familiyasi va sanasini chop etadi
tug'ilish - keyin odamning yoshini (yillarda), maksimal yurak urish tezligini va maqsadli yurak urish tezligini hisoblab chiqadi va chop etadi
diapazon.
3.17 (Sog'liqni saqlash yozuvlarini kompyuterlashtirish) So'nggi paytlarda yangiliklarda bo'lgan sog'liqni saqlash muammosi
sog'liqni saqlash hujjatlarini kompyuterlashtirish. Ushbu imkoniyat tufayli ehtiyotkorlik bilan yondashilmoqda
maxfiylik va xavfsizlik masalalari, shu jumladan. [Biz bunday tashvishlarni keyingi mashg'ulotlarda ko'rib chiqamiz.]
Sog'liqni saqlash yozuvlarini kompyuterlashtirish bemorlarga o'zlarining sog'lig'i haqida ma'lumot almashishni osonlashtirishi mumkin.
turli xil sog'liqni saqlash mutaxassislari orasida tories. Bu tibbiy xizmat sifatini oshirishi mumkin,
giyohvand moddalar mojarolari va noto'g'ri retseptlardan qochishga yordam beradi, xarajatlarni kamaytiradi va favqulodda vaziyatlarda mumkin
hayotni saqlab qolish. Ushbu mashqda siz bir kishi uchun "boshlang'ich" HealthProfile sinfini loyihalashtirasiz. Sinf attri-
Butesda shaxsning ismi, familiyasi, jinsi, tug'ilgan sanasi (alohida

100 3-bob Sinflar, ob'ektlar, usullar va satrlarga kirish

Tug'ilgan oy, kun va yil uchun atributlar, bo'y (dyuymlarda) va vazn (funtlarda). Sizning sinfingiz
ushbu ma'lumotlarni qabul qiluvchi konstruktorga ega bo'lishi kerak. Har bir atribut uchun to'plam va olish usullarini taqdim eting.
Sinf shuningdek, foydalanuvchining yoshini maksimal yillar bo'yicha hisoblaydigan va qaytaradigan usullarni o'z ichiga olishi kerak
yurak urish tezligi va maqsadli yurak urish tezligi diapazoni (3.16-mashqga qarang) va tana massasi indeksi (BMI; qarang.
2.33-mashq). Shaxsning ma'lumotlarini so'raydigan, ob'ektni yaratadigan Java ilovasini yozing
o'sha shaxs uchun HealthProfile klassi va o'sha ob'ektdan ma'lumotni chop etadi, shu jumladan,
o'g'ilning ismi, familiyasi, jinsi, tug'ilgan sanasi, bo'yi va vazni - keyin hisoblab chiqadi va chop etadi.
yillardagi odamning yoshi, BMI, maksimal yurak urish tezligi va maqsadli yurak urishi diapazoni. Shuningdek, u ko'rsatilishi kerak
2.33-mashqdagi BMI qiymatlari jadvali.

4

Nazorat bayonotlari: 1-qism;


Topshiriq, ++ va --
Operatorlar

Keling, hamma bir joyga ko'chaylik.


- Lyuis Kerroll
Qancha olma tushdi
Nyutonning boshini olishdan oldin
maslahat!
- Robert Frost

Oh maqsadlar


Ushbu bobda siz:
■ Asosiy muammolarni hal qilishni o'rganing
texnikalar.
■ orqali algoritmlarni ishlab chiqish
yuqoridan pastga o'tish jarayoni,
bosqichma-bosqich takomillashtirish.
■ if va if … else dan foydalaning
tanlov bayonotlari
muqobildan birini tanlang
harakatlar.
■ Vaqtni takrorlashdan foydalaning
bajarish uchun bayonot
dasturdagi bayonotlar
qayta-qayta.
■ Qarama-qarshi nazorat ostida foydalaning
takrorlash va nazoratchi-
nazorat ostida takrorlash.
■ Murakkabdan foydalaning
tayinlash operatori va
oshirish va kamaytirish
operatorlar.
■ Portativligi haqida bilib oling
ibtidoiy ma'lumotlar turlari.

102 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

4.1 Kirish
Muammoni hal qilish uchun dastur yozishdan oldin, siz to'liq tushunishingiz kerak
muammo va uni hal qilish uchun puxta rejalashtirilgan yondashuv. Dastur yozishda,
Shuningdek, siz mavjud qurilish bloklarini tushunishingiz va tasdiqlangan dasturlardan foydalanishingiz kerak.
qurilish texnikasi. Ushbu va keyingi bobda biz ushbu masalalarni taqdimotda muhokama qilamiz
tuzilgan dasturlash nazariyasi va tamoyillari. Bu erda keltirilgan tushunchalar
sinflarni qurish va ob'ektlarni boshqarishda hal qiluvchi ahamiyatga ega. Biz Java-ning if iborasini reklamada muhokama qilamiz.
qo'shimcha tafsilotlarni kiriting va if…else va while iboralarini kiriting - bularning barchasi
bloklar o'z vazifalarini bajarish uchun usullar uchun zarur bo'lgan mantiqni belgilash imkonini beradi. Biz ham
Murakkab belgilash operatorini va oshirish va kamaytirish operasiyalarini tanishtiring.
torlar. Nihoyat, biz Java-ning ibtidoiy turlarining portativligini ko'rib chiqamiz.
4.2 Algoritmlar
Har qanday hisoblash muammosini ma'lum bir tartibda bir qator harakatlarni bajarish orqali hal qilish mumkin.
nuqtai nazaridan muammoni hal qilish tartibi
1. bajariladigan harakatlar va
2. bu harakatlarning bajarilish tartibi
algoritm deb ataladi. Quyidagi misol to'g'ri ko'rsatilishini ko'rsatadi
harakatlarning qanday tartibda bajarilishi muhim ahamiyatga ega.
“Ko'tarilish va porlash algoritmi” ni ko'rib chiqing, undan keyin bitta boshqaruvchi chiqib ketish uchun.
yotish va ishga ketish: (1) yotoqdan turing; (2) pijamani echib oling; (3) dush qabul qilish; (4) olish
kiyingan; (5) nonushta qilish; (6) ishlash uchun avtomashina. Bu tartib ijrochini yaxshi ishlashga undaydi
muhim qarorlar qabul qilishga tayyor. Aytaylik, xuddi shu qadamlar biroz bajariladi
turli tartib: (1) yotoqdan turing; (2) pijamani echib oling; (3) kiyinish; (4) dush qabul qilish;
(5) nonushta qilish; (6) ishlash uchun avtomashina. Bu holda, bizning ijrochi ish ho'llash uchun ko'rsatadi
nam. Dasturda operatorlar (amallar) bajarilish tartibini ko'rsatish pro- deyiladi.
gramm nazorati. Ushbu bo'lim Java boshqaruv bayonotlaridan foydalangan holda dastur boshqaruvini o'rganadi.

4.1 Kirish


4.2 Algoritmlar
4.3 Psevdokod
4.4 Boshqaruv tuzilmalari
4.5 Agar bitta tanlovli bayonot
4.6 if...else Ikki marta tanlash
Bayonot
4.7 Talabalar sinfi: agar… bo‘lmasa ichki o‘rnatilgan
Bayonotlar
4.8 Takrorlash bayonoti
4.9 Algoritmlarni shakllantirish: qarshi
Boshqariladigan takrorlash

4.10 Algoritmlarni shakllantirish: Sentinel-


Boshqariladigan takrorlash
4.11 Algoritmlarni shakllantirish: ichki
Nazorat bayonotlari
4.12 Murakkab tayinlash operatorlari
4.13 O'stirish va kamaytirish operatorlari
4.14 Primitiv tiplar
4.15 (ixtiyoriy) GUI va grafik ishi
O'rganish: Oddiy chizmalar yaratish
4.16 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish


4.3 Psevdokod 103



4.3 Psevdokod
Pseudocode - bu norasmiy til bo'lib, algoritmlarni kerak bo'lmasdan ishlab chiqishga yordam beradi
Java tili sintaksisining qat'iy tafsilotlari haqida qayg'uring. Biz taqdim etgan psevdokod par-
ning tuzilgan qismlariga aylantiriladigan algoritmlarni ishlab chiqish uchun juda foydali
Java dasturlari. Ushbu kitobda biz ishlatadigan psevdokod kundalik ingliz tiliga o'xshaydi - bu
qulay va foydalanuvchilarga qulay, lekin bu haqiqiy kompyuter dasturlash tili emas.
4.7-rasmda psevdokodda yozilgan algoritmni ko'rasiz. Siz, albatta, o'zingizdan foydalanishingiz mumkin
O'zingizning psevdokodingizni ishlab chiqish uchun o'z ona til(lar)ingiz.
Pseudocode kompyuterlarda bajarilmaydi. Aksincha, bu sizga “o'ylash”ga yordam beradi.
grammni Java kabi dasturlash tilida yozishga urinishdan oldin. Ushbu bob
Java dasturlarini ishlab chiqish uchun psevdokoddan foydalanishning bir nechta misollarini taqdim etadi.
Biz taqdim etayotgan psevdokod uslubi faqat belgilardan iborat, shuning uchun siz yozishingiz mumkin
har qanday matn muharriri dasturidan foydalangan holda psevdokodni qulay. Ehtiyotkorlik bilan tayyorlangan psevdokod
dasturni mos keladigan Java dasturiga osongina aylantirish mumkin.
Pseudocode odatda faqat sodir bo'lgan harakatlarni ifodalovchi bayonotlarni tavsiflaydi
dasturni psevdokoddan Java-ga o'zgartirganingizdan so'ng va dastur birlashmada ishga tushiriladi.
puter. Bunday harakatlar kiritish, chiqish yoki hisob-kitoblarni o'z ichiga olishi mumkin. Psevdokodimizda biz yozamiz -
o'zgaruvchilar deklaratsiyasini o'z ichiga olmaydi, lekin ba'zi dasturchilar o'zgaruvchilar ro'yxatini tanlashadi
va ularning maqsadlarini aytib bering.
4.4 Boshqaruv tuzilmalari
Odatda, dasturdagi operatorlar ketma-ket bajariladi
ular yozilgan. Bu jarayon ketma-ket bajarilish deb ataladi. Har xil Java bayonotlari,
Biz tez orada muhokama qilamiz, sizga keyingi bajariladigan bayonot emasligini belgilash imkonini beradi
albatta navbatdagisi. Bu boshqaruvni uzatish deb ataladi.
1960-yillarda nazorat o'tkazmalaridan beg'araz foydalanish aniq bo'ldi
dasturiy ta'minotni ishlab chiqish guruhlari boshidan kechirgan ko'p qiyinchiliklarning ildizi edi. Ayb
goto iborasiga ishora qilingan (o'sha davrdagi ko'pgina dasturlash tillarida ishlatilgan),
Bu sizga boshqaruvning keng doiradagi yo'nalishlardan biriga o'tkazilishini belgilash imkonini beradi
dastur. [Izoh: Java-da goto iborasi yo'q; ammo, goto so'zi zaxiralangan
Java tomonidan yaratilgan va dasturlarda identifikator sifatida ishlatilmasligi kerak.]
Bom va Yakopini1 tadqiqoti dasturlar bo'lishi mumkinligini ko'rsatdi
hech qanday goto iboralarisiz yozilgan. Dasturchilar uchun davr muammosi siljish edi
ularning uslublarini "kamroq dasturlash" ga aylantiradi. Strukturaviy dasturlash atamasi paydo bo'ldi
deyarli "bartaraf qilish" bilan sinonimdir. 1970-yillarga qadar ko'pchilik dasturchilar buni qilishmadi
tuzilgan dasturlashni jiddiy qabul qilishni boshlang. Natijalar ta'sirli bo'ldi. Dasturiy ta'minot
Rivojlanish guruhlari qisqaroq rivojlanish vaqtlari, tez-tez o'z vaqtida yetkazib berish haqida xabar berishdi
tizimlar va dasturiy ta'minot loyihalarini byudjet ichida tez-tez yakunlash. Buning kaliti
bu muvaffaqiyatlar tuzilgan dasturlarning aniqroq, disk raskadrovka va o'zgartirishni osonlashtirganligi edi
birinchi navbatda xatosiz bo'lish ehtimoli ko'proq.
Bom va Yakopini ishlari barcha dasturlarni shartlar asosida yozish mumkinligini ko‘rsatdi
faqat uchta boshqaruv tuzilmasidan iborat - ketma-ketlik tuzilishi, tanlash tuzilmasi va

1. C. Bom va G. Jacopini, “Flow diagrams, Turing machines, and languages with only two for-


mation Rules,” ACM kommunikatsiyalari, jild. 9, No5, 1966 yil, may, 336–371-betlar.

104 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

takrorlash tuzilishi. Java-ning boshqaruv tuzilmalarini joriy qilganimizda, biz buni qilamiz
Java tili spetsifikatsiyasi terminologiyasida ularga “nazorat bayonotlari” deb murojaat qiling.
Java-da ketma-ketlik tuzilishi
Ketma-ketlik tuzilishi Java-ga o'rnatilgan. Agar boshqacha ko'rsatilmagan bo'lsa, kompyuter ishlaydi
Java iboralari birin-ketin yozilish tartibida, ya'ni ketma-ketlikda.
vaqt. 4.1-rasmdagi faoliyat diagrammasi odatdagi ketma-ketlik tuzilishini ko'rsatadi, unda
tartibda ikkita hisob-kitob amalga oshiriladi. Java sizga xohlagancha ko'p amallarni bajarish imkonini beradi
ketma-ketlik tuzilishi. Tez orada ko'rib turganimizdek, har qanday joyda bitta harakat joylashtirilishi mumkin, biz ham qila olamiz
bir nechta amallarni ketma-ket joylashtiring.

UML faoliyat diagrammasi qismning ish jarayonini (shuningdek, faoliyat deb ataladi) modellashtiradi


dasturiy ta'minot tizimi. Bunday ish oqimlari algoritmning bir qismini o'z ichiga olishi mumkin, masalan
4.1-rasmdagi ketma-ketlik tuzilishi. Faoliyat diagrammalari harakatlar kabi belgilardan iborat.
davlat ramzlari (chap va o'ng tomonlari tashqi yoylar bilan almashtirilgan to'rtburchaklar), dia-
monds va kichik doiralar. Ushbu belgilar o'tish strelkalari bilan bog'langan, ular
faoliyat oqimidan, ya'ni harakatlar sodir bo'lishi kerak bo'lgan tartibdan norozi.
Psevdokod singari, faoliyat diagrammalari algoritmlarni ishlab chiqish va ifodalashda yordam beradi.
Faoliyat diagrammalari boshqaruv tuzilmalari qanday ishlashini aniq ko'rsatadi. Bunda biz UML dan foydalanamiz
bob va 5-bob nazorat bayonotlarida boshqaruv oqimini ko'rsatish uchun. Onlayn boblar 33–
34 UML dan real dunyoda avtomatlashtirilgan-teller-mashina misolida foydalanish.
4.1-rasmdagi ketma-ketlik-tuzilma faoliyat diagrammasini ko'rib chiqing. U ikkita harakatni o'z ichiga oladi
holatlar, har birida harakat ifodasi mavjud, masalan, “jamiga baho qo‘shish” yoki “1 qo‘shish
qarshi turish" - bu muayyan harakatni amalga oshirishni belgilaydi. Boshqa harakatlar o'z ichiga olishi mumkin
hisob-kitoblar yoki kiritish/chiqarish operatsiyalari. Faoliyat diagrammasidagi o'qlar ifodalaydi
o'tishlar, bu harakat bilan ifodalangan harakatlarning holatini ko'rsatadi
yuzaga keladi. 4.1-rasmdagi diagrammada ko'rsatilgan tadbirlarni amalga oshiradigan dastur
avval jamiga baho qo'shadi, keyin hisoblagichga 1 qo'shadi.
Faoliyat diagrammasining yuqori qismidagi qattiq doira boshlang'ich holatni ifodalaydi
dastur modellashtirilgan amallarni bajarishdan oldin ish jarayonining boshlanishi. Qattiq
diagrammaning pastki qismidagi ichi bo'sh doira bilan o'ralgan doira finalni ifodalaydi
davlat - dastur o'z harakatlarini bajargandan so'ng ish jarayonining tugashi.
4.1-rasmda yuqori o'ng burchaklari buklangan to'rtburchaklar ham mavjud. Bular
UML eslatmalari (Java tilidagi sharhlar kabi) - simlilik maqsadini tavsiflovchi tushuntirishlar.

4.1-rasm | Ketma-ketlik-tuzilma faoliyat diagrammasi.

hisoblagichga 1 qo'shing

jami Tegishli Java bayonotiga baho qo'shing:


jami = jami + baho;

Tegishli Java bayonoti:


hisoblagich = hisoblagich + 1;

4.5 Agar bitta tanlov bayonnomasi 105



diagrammada bolts. 4.1-rasmda har biriga bog'langan Java kodini ko'rsatish uchun UML eslatmalaridan foydalaniladi
harakat holati. Nuqtali chiziq har bir eslatmani tasvirlangan element bilan bog'laydi. Faoliyat diagrammalari
odatda faoliyatni amalga oshiradigan Java kodini ko'rsatmaydi. Buni biz tasvirlash uchun qilamiz
diagrammaning Java kodi bilan qanday bog'liqligi. UML haqida qo'shimcha ma'lumot olish uchun bizning variantimizga qarang
ob'ektga yo'naltirilgan dizayn bo'yicha onlayn misollar (33-34-boblar) yoki www.uml.org saytiga tashrif buyuring.
Java-da tanlash bayonotlari
Java-da uchta turdagi tanlov bayonotlari mavjud (ushbu bobda va 5-bobda muhokama qilingan). The
if iborasi harakatni bajaradi (tanlaydi), agar shart rost bo'lsa yoki uni o'tkazib yuborsa, agar
tarqatish noto'g'ri. if…else iborasi, agar shart rost va to'g'ri bo'lsa, amalni bajaradi.
shart noto'g'ri bo'lsa, boshqa harakat hosil qiladi. Switch bayonoti (5-bob)
ifoda qiymatiga qarab turli xil amallardan birini bajaradi.
If iborasi bitta tanlovli bayonotdir, chunki u bittasini tanlaydi yoki e'tiborsiz qoldiradi
harakat (yoki yaqinda ko'rib turganimizdek, bitta harakatlar guruhi). if…else ifodasi a deyiladi
Ikki marta tanlash iborasi, chunki u ikki xil harakat (yoki guruhlar
harakatlar). Switch operatori tanlaganligi sababli ko'p tanlovli operator deb ataladi
turli xil harakatlar (yoki harakatlar guruhlari) orasida.
Java-da takrorlash bayonotlari
Java uchta takrorlash bayonotini taqdim etadi (shuningdek, takrorlash bayonotlari yoki tsikl deb ataladi
bayonotlar) bu dasturlarga shartlar bo'lganda takroriy bayonotlarni bajarishga imkon beradi
(loopning davom etish sharti deb ataladi) haqiqat bo'lib qoladi. Takrorlash bayonotlari
while, do…while, for va iboralar uchun kengaytirilgan. (5-bobda nima qilish kerakligi ko'rsatilgan
va bayonotlar uchun va 7-bobda kengaytirilgan for bayonoti berilgan.) The while va
bayonotlar uchun o'z tanasida nol yoki undan ko'p harakatni (yoki harakatlar guruhini) amalga oshiradi
marta - agar tsikl davom etish sharti dastlab noto'g'ri bo'lsa, harakat (yoki harakatlar guruhi)
bajarmaydi. do…while iborasi o‘z tarkibidagi harakatni (yoki harakatlar guruhini) bajaradi
tanani bir yoki bir necha marta. If, else, switch, while, do va for so'zlari Java kalit so'zlaridir.
Java kalit so'zlarining to'liq ro'yxati C ilovasida keltirilgan.
Java-da boshqaruv bayonotlarining qisqacha mazmuni
Java-da faqat uchta turdagi boshqaruv tuzilmalari mavjud bo'lib, biz shu nuqtadan boshlab ularga murojaat qilamiz
boshqaruv bayonotlari sifatida: ketma-ketlik bayonoti, tanlash bayonoti (uch xil) va takrorlash
bayonotlar (uch xil). Har bir dastur ushbu davlatlarning ko'pchiligini birlashtirish orqali shakllanadi.
dastur amalga oshiradigan algoritmga mos keladigan tarzda. Biz har birini modellashtirishimiz mumkin
nazorat bayonoti faoliyat diagrammasi sifatida. 4.1-rasmga o'xshab, har bir diagrammada bosh harf mavjud
nazorat bayonotining kirish va chiqish nuqtasini ifodalovchi holat va yakuniy holat, qayta
spektakl. Yagona kirish/bitta chiqish boshqaruvi bayonotlari dasturlarni yaratishni osonlashtiradi -
biz shunchaki birining chiqish nuqtasini keyingisining kirish nuqtasiga ulaymiz. Biz buni nazorat deb ataymiz -
bayonotni yig'ish. Biz davlatni boshqarishning faqat bitta usuli borligini bilib olamiz.
mentlar bir-biriga bog'langan bo'lishi mumkin - boshqaruv bayonoti joylashtirish - unda bitta boshqaruv bayonoti
boshqa ichida paydo bo'ladi. Shunday qilib, Java dasturlarida algoritmlar faqat uchtadan tuzilgan
faqat ikkita usulda birlashtirilgan boshqaruv bayonotlarining turlari. Bu oddiylikning mohiyati.
4.5 Agar bitta tanlovli bayonot
Dasturlar muqobil harakat yo'nalishlarini tanlash uchun tanlov bayonotlaridan foydalanadi. sobiq uchun -
etarli, deylik, imtihondan o'tish bahosi 60. Pseudocode bayonoti

106 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

“o‘quvchining bahosi 60 dan katta yoki teng” shartining to‘g‘ri yoki yo‘qligini aniqlaydi. Agar
Shunday qilib, "O'tdi" chop etiladi va navbatdagi psevdokod bayonoti "bajarildi". (qayta-
a'zo, psevdokod haqiqiy dasturlash tili emas.) Agar shart noto'g'ri bo'lsa,
Chop etish bayonoti e'tiborga olinmaydi va navbatdagi psevdokod bayonoti bajariladi. The
ushbu tanlov bayonotining ikkinchi qatoriga chekinish ixtiyoriy, lekin tavsiya etiladi,
chunki u tuzilgan dasturlarning o'ziga xos tuzilishiga urg'u beradi.
Oldingi psevdokod If bayonoti Java-da shunday yozilishi mumkin

Java kodi psevdokodga juda mos keladi. Bu xususiyatlardan biridir


psevdokod, bu uni juda foydali dastur ishlab chiqish vositasiga aylantiradi.
If bayonoti uchun UML faoliyat diagrammasi
4.2-rasmda bitta tanlovli if operatori tasvirlangan. Bu raqam eng im-
faoliyat diagrammasidagi muhim belgi - olmos yoki qaror belgisi, bu ko'rsatadi
qaror qabul qilinishi kerak. Ish jarayoni sim bilan belgilangan yo'l bo'ylab davom etadi.
to'g'ri yoki noto'g'ri bo'lishi mumkin bo'lgan bolning bog'langan qo'riqlash shartlari. Har bir o'tish o'qi paydo bo'ladi
Qaror belgisidan ing qo'riqlash shartiga ega (yandagi kvadrat qavs ichida ko'rsatilgan
o'q). Agar qo'riqlash sharti to'g'ri bo'lsa, ish oqimi o'tkaziladigan harakat holatiga kiradi.
joylashish o'qi nuqtalari. 4.2-rasmda, agar baho 60 dan katta yoki teng bo'lsa, dastur
“Oʻtdi” ni chop etadi, soʻngra faoliyatning yakuniy holatiga oʻtadi. Agar baho 60 dan kam bo'lsa,
dastur xabarni ko'rsatmasdan darhol yakuniy holatga o'tadi.

If operatori bitta kirish/bitta chiqish boshqaruv bayonotidir. Biz buni ko'ramiz


Qolgan boshqaruv bayonotlari uchun faoliyat diagrammalarida boshlang'ich holatlar, o'tish ham mavjud
o'qlar, bajarilishi kerak bo'lgan harakatlarni ko'rsatadigan harakat holatlari, qaror belgilari (bog'langan
qo'riqlash shartlari) qabul qilinadigan qarorlar va yakuniy holatlarni ko'rsatadi.
4.6 if...else Ikki marta tanlash bayonnomasi
Agar bitta tanlab olish operatori ko'rsatilgan amalni faqat shart bajarilganda bajaradi
haqiqat; aks holda, harakat o'tkazib yuboriladi. if…else ikki marta tanlash iborasi ruxsat beradi
shart to'g'ri bo'lganda bajarilishi kerak bo'lgan harakatni va qachon boshqa harakatni belgilashingiz kerak
shart noto'g'ri. Masalan, psevdokod bayonoti

Talabaning bahosi 60 dan katta yoki teng bo'lsa


"O'tdi" deb chop eting

agar (talaba darajasi >= 60)


System.out.println("O'tdi");

4.2-rasm | agar bitta tanlovli bayonot UML faoliyat diagrammasi.

[baho >= 60] “Oʻtdim” deb chop eting

[baho <60]


4.6 if...else Ikki marta tanlash bayonnomasi 107

Agar talabaning bahosi 60 dan katta yoki unga teng boʻlsa, “Oʻtdi” deb chop etadi, agar talaba bahosi 60 dan katta yoki unga teng boʻlsa, “Omadsiz” deb chop etadi.
u 60 dan kam. Har ikki holatda ham chop etilgandan so'ng, keyingi psevdokod bayonoti se-
quence "bajarildi".
Oldingi If…Else psevdokod bayonoti Java-da shunday yozilishi mumkin

Boshqasining tanasi ham chuqurlashtirilgan. Siz tanlagan chekinish konventsiyasidan qat'iy nazar


dasturlaringiz davomida doimiy ravishda qo'llanilishi kerak.

if…else bayonoti uchun UML faoliyat diagrammasi


4.3-rasmda if…else bayonotidagi boshqaruv oqimi tasvirlangan. Yana bir bor, sim-
UML faoliyat diagrammasida bols (boshlang'ich holat, o'tish strelkalari va yakuniydan tashqari
davlat) harakat holatlari va qarorlarini ifodalaydi.

Ichkariga kiritilgan if…else bayonotlari


Dastur bir nechta holatlarni if…else ifodalarini other if…else ichiga joylashtirish orqali sinab ko'rishi mumkin
o'rnatilgan if…else iboralarini yaratish uchun bayonotlar. Masalan, quyidagi psevdo-
kod imtihon baholari dan katta yoki teng bo'lganligi uchun A ni bosib chiqaradigan if…else ni ifodalaydi
90, 80-89-sinflar uchun B, 70-79-sinflar uchun C, 60-69-sinflar uchun D va qolgan barcha sinflar uchun F.
baholar:

Talabaning bahosi 60 dan katta yoki teng bo'lsa


"O'tdi" deb chop eting
Boshqa
“Muvaffaqiyatsiz” chop etish

agar (baho >= 60)


System.out.println("O'tdi");
boshqa
System.out.println("Muvaffaqiyatsiz");

Yaxshi dasturlash amaliyoti 4.1


if…else iborasining ikkala asosiy bayonotiga ham chek qo'ying. Ko'pgina IDElar buni siz uchun qiladi.

Yaxshi dasturlash amaliyoti 4.2


Agar bir nechta chekinish darajasi mavjud bo'lsa, har bir darajaga bir xil qo'shimcha chekinish kerak
bo'sh joy miqdori.

4.3-rasm | if...else ikki marta tanlash bayonoti UML faoliyat diagrammasi.

chop etish “Muvaffaqiyatsiz” [baho < 60] [baho >= 60] “O‘tdi” chop etish

108 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

Ushbu psevdokod Java-da shunday yozilishi mumkin

Agar studentGrade o'zgaruvchisi 90 dan katta yoki teng bo'lsa, birinchi to'rtta shart


ichki qo'yilgan if…else ifodasi to'g'ri bo'ladi, lekin faqat birinchisining if qismidagi gap
if...else bayonoti bajariladi. Ushbu bayonot bajarilgandan so'ng, ning boshqa qismi
“eng tashqi” if…else iborasi oʻtkazib yuborilsa. Ko'pgina dasturchilar oldindan yozishni afzal ko'radilar.
ceding nested if…else iborasi sifatida

Talabaning bahosi 90 dan katta yoki teng bo'lsa


"A" harfini chop eting
boshqa
Talabaning bahosi 80 dan katta yoki teng bo'lsa
"B" harfini chop eting
boshqa
Talabaning bahosi 70 dan katta yoki teng bo'lsa
"C" harfini chop eting
boshqa
Talabaning bahosi 60 dan katta yoki teng bo'lsa
"D" harfini chop eting
boshqa
"F" harfini chop eting

agar (talaba darajasi >= 90)


System.out.println("A");
boshqa
agar (talaba darajasi >= 80)
System.out.println("B");
boshqa
agar (talaba sinfi >= 70)
System.out.println("C");
boshqa
agar (talaba darajasi >= 60)
System.out.println("D");
boshqa
System.out.println("F");

Xatolarning oldini olish bo'yicha maslahat 4.1


Ichki if…else bayonotida barcha mumkin bo'lgan holatlar uchun sinovdan o'tganingizga ishonch hosil qiling.

agar (talaba darajasi >= 90)


System.out.println("A");
Aks holda (studentGrade >= 80)
System.out.println("B");
Aks holda (studentGrade >= 70)
System.out.println("C");
Aks holda (studentGrade >= 60)
System.out.println("D");
boshqa
System.out.println("F");

4.6 if...else Ikki marta tanlash bayonnomasi 109

Ikki shakl bir xil bo'lib, kompilyator bo'lgan oraliq va chekinishdan tashqari
mensimaydi. Oxirgi shakl kodni o'ngga chuqur kiritishdan qochadi. Bunday chekinish
ko'pincha manba kodlari qatorida kam joy qoldiradi, bu esa qatorlarni bo'linishga majbur qiladi.

Boshqa muammo


Java kompilyatori, agar aytilmagan bo'lsa, har doim boshqasini darhol oldingi bilan bog'laydi
qavslarni ({ va }) joylashtirish orqali boshqacha qilish. Bu xatti-harakat nimaga olib kelishi mumkin
dangling-else muammosi deb ataladi. Masalan,

Agar x 5 dan katta bo'lsa, ichki o'rnatilgan if iborasi yoki yo'qligini aniqlaydi


y ham 5 dan katta. Agar shunday bo'lsa, "x va y > 5" qatori chiqariladi. Aks holda, paydo bo'ladi
agar x 5 dan katta bo'lmasa, if…else ning boshqa qismi "x is <= 5" qatorini chiqaradi.
Ogoh bo'ling! Ushbu ichki o'rnatilgan if…else buyrug'i paydo bo'lganidek bajarilmaydi. Kompilyator ac-
bayonotni to'liq talqin qiladi

bunda birinchi if ning tanasi o‘rnatilgan if…else. Tashqi if bayonoti yoki yo'qligini tekshiradi


x 5 dan katta. Agar shunday bo'lsa, y 5 dan katta yoki yo'qligini tekshirish orqali bajarish davom etadi.
ikkinchi shart to'g'ri, tegishli qator - "x va y > 5" - ko'rsatiladi. Biroq,
agar ikkinchi shart noto'g'ri bo'lsa, biz bilsak ham, "x is <= 5" qatori ko'rsatiladi.
bu x 5 dan katta. Xuddi shunday yomon, agar tashqi if bayonotining sharti noto'g'ri bo'lsa, ichki
if…else oʻtkazib yuboriladi va hech narsa koʻrsatilmaydi.
Ichki if…else iborasini dastlab mo'ljallanganidek bajarishga majburlash uchun biz
uni quyidagicha yozish kerak:

Qavslar ikkinchi if birinchisining tanasida, boshqasi esa ekanligini bildiradi


birinchi if bilan bog'langan. 4.27–4.28 mashqlari osilgan boshqa muammoni o'rganadi
yana.

Bloklar
If bayonoti odatda o'z tanasida faqat bitta bayonotni kutadi. Bir nechta shtatlarni kiritish uchun


if ning tanasidagi yozuvlar (yoki if…else ifodasi uchun else ning tanasi), ilova qiling
qavs ichidagi gaplar. Bir juft qavs ichidagi bayonotlar (masalan, a. tanasi kabi

agar (x > 5)


agar (y > 5)
System.out.println("x va y > 5");
boshqa
System.out.println("x <= 5");

agar (x > 5)


agar (y > 5)
System.out.println("x va y > 5");
boshqa
System.out.println("x <= 5");

agar (x > 5)


{
agar (y > 5)
System.out.println("x va y > 5");
}
boshqa
System.out.println("x <= 5");

110 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

usuli) blok hosil qiladi. Blok bitta bayonotdan iborat bo'lgan usulning istalgan joyiga joylashtirilishi mumkin
joylashtirilishi mumkin.
Quyidagi misol if…else iborasining else qismidagi blokni o'z ichiga oladi:

Bunday holda, agar baho 60 dan kam bo'lsa, dastur ikkala bayonotni ham tanasida bajaradi


boshqa va chop etadi

else bandidagi ikkita gap atrofidagi qavslarga e'tibor bering. Bu qavslar -


muhim. Qavslarsiz, bayonot

if…else iborasining else qismining tanasidan tashqarida bo‘ladi va bajariladi


baho 60 dan past bo'lganidan qat'i nazar.
Sintaktik xatolar (masalan, blokdagi bitta qavs dasturdan tashqarida qolganda) tomonidan ushlanadi
kompilyator. Mantiqiy xato (masalan, blokdagi ikkala qavs dasturdan tashqarida qolganda)
bajarilish vaqtida o'z ta'sirini ko'rsatadi. Fatal mantiqiy xato dasturning ishlamay qolishiga va tugatilishiga olib keladi
muddatidan oldin. Fatal bo'lmagan mantiqiy xato dasturga ishlashni davom ettirishga imkon beradi, lekin uni keltirib chiqaradi
noto'g'ri natijalarga erishish uchun.
Blok bitta bayonot joylashtiriladigan har qanday joyga joylashtirilishi mumkin bo'lgani kabi, u ham
bo'sh bayonotga ega bo'lish mumkin. Eslatib o'tamiz, 2.8-bandda bo'sh bayonot takrorlanadi.
odatda gap boʻladigan joyga nuqta-vergul (;) qoʻyish orqali norozilik bildiriladi.

Shartli operator (? :)


Java shartli operatorni (?:) taqdim etadi, u if…else o‘rniga ishlatilishi mumkin
bayonot. Bu sizning kodingizni qisqaroq va aniqroq qilishi mumkin. Shartli operator Java operatoridir
faqat uchlik operator (ya'ni, uchta operandni qabul qiluvchi operator). Birgalikda, operandlar
va ?: belgisi shartli ifoda hosil qiladi. Birinchi operand (? ning chap tomonida)
mantiqiy ifodadir (ya'ni, mantiqiy qiymatga baholanadigan shart - rost yoki
noto'g'ri), ikkinchi operand (? va :) o'rtasidagi shartli ifodaning qiymati.
Agar mantiqiy ifoda to'g'ri bo'lsa va uchinchi operand ( :) ning o'ng tomonida bo'lsa
agar mantiqiy ifoda noto'g'ri bo'lsa, shartli ifodaning qiymati. sobiq uchun -
keng, bayonot

agar (baho >= 60)


System.out.println("O'tdi");
boshqa
{
System.out.println("Muvaffaqiyatsiz");
System.out.println("Siz bu kursni qaytadan o'tishingiz kerak.");
}

Muvaffaqiyatsiz


Siz bu kursni qaytadan o'tishingiz kerak.

System.out.println("Siz bu kursni qaytadan o'tishingiz kerak.");

Umumiy dasturlash xatosi 4.1
If yoki if…else gaplarida shartdan keyin nuqta-vergul qo‘yish mantiqqa olib keladi
bitta tanlovli if iboralarida xatolik va ikki marta tanlashda sintaksis xatosi if…else
bayonotlar (if-qismi haqiqiy asosiy bayonotni o'z ichiga olgan bo'lsa).

System.out.println(studentGrade >= 60 ? "O'tdi" : "Muvaffaqiyatsiz");


4.7 Talabalar sinfi: Ichki oʻrnatilgan if…else bayonotlari 111

println shartli ifoda argumentining qiymatini chop etadi. Shartli ifoda -
Agar mantiqiy ifoda student- bo'lsa, ushbu bayonotdagi sion "O'tdi" qatoriga baholanadi.
Baho >= 60 rost va agar noto'g'ri bo'lsa "Muvaffaqiyatsiz" qatori uchun. Shunday qilib, bu bayonot bilan
shartli operator if...else ifodasi bilan bir xil funktsiyani bajaradi
ushbu bo'limning boshida ko'rsatilgan. Shartli operatorning ustuvorligi past, shuning uchun
shina shartli ifodasi odatda qavs ichida joylashtiriladi. Biz bu shartli sobiqni ko'ramiz.
bosishlar ba'zi holatlarda qo'llanilishi mumkin, bunda if...else iboralari mumkin emas.

4.7 Talabalar sinfi: ichki oʻrnatilgan if…else bayonotlari


Shakllarning misoli. 4.4–4.5 ni aniqlaydigan ichki qoʻyilgan if…else iborasini koʻrsatadi
kurs bo‘yicha talabaning o‘rtacha bahosiga asoslangan talabaning xat bahosi.
Sinf talabasi
Sinf talabasi (4.4-rasm) sinf hisobiga o'xshash xususiyatlarga ega (bu erda muhokama qilingan
3-bob). Class Student talabaning ismini va oʻrtachasini saqlaydi va usullarini taqdim etadi
bu qiymatlarni manipulyatsiya qilish. Sinf tarkibiga quyidagilar kiradi:
• Talaba nomini saqlash uchun String tipidagi misol o'zgaruvchisi nomi (5-qator).
• Talabaning o'rtacha qiymatini saqlash uchun double tipidagi o'rtacha o'zgaruvchan misol (6-qator).
kurs
• nom va o'rtachani ishga tushiradigan konstruktor (9–18-qatorlar) - 5.9-bo'limda,
15–16 va 37–38-qatorlarni mantiqiy ravishda qisqacha ifodalashni oʻrganasiz.
bir nechta shartlarni sinab ko'rishi mumkin bo'lgan operatorlar
• Talaba ismini belgilash va olish uchun setName va getName usullari (21–30-qatorlar)
• SetAverage va getAverage usullari (33–46-qatorlar) Talabani oʻrnatish va olish
o'rtacha
• getLetterGrade usuli (49–65-qatorlar), u ichki oʻrnatilgan if…else iboralaridan foydalanadi.
Talabaning o'rtacha bahosi asosida Talabaning harf bahosini aniqlang
Konstruktor va setAverage usuli har biri ichki if iboralaridan foydalanadi (15–17-qatorlar).
va 37-39) o'rtachani o'rnatish uchun ishlatiladigan qiymatni tasdiqlash uchun - bu bayonotlar shuni ta'minlaydi
qiymat 0,0 dan katta va 100,0 dan kichik yoki teng; aks holda, o'rtacha qiymat qoladi
o'zgarmagan. Har bir if bayonotida oddiy shart mavjud. Agar 15-qatordagi shart to'g'ri bo'lsa,
shundan keyingina 16-satrdagi shart sinovdan o'tkaziladi va faqat 15-qatordagi shartlar bo'lsa
va 16-satr rost bo'lsa, 17-satrdagi bayonot bajariladi.

Xatolarning oldini olish bo'yicha maslahat 4.2


?: operatorining ikkinchi va uchinchi operandlari uchun bir xil turdagi ifodalardan foydalaning
nozik xatolardan qoching.

Dasturiy ta'minot muhandisligi kuzatuvi 4.1


3-bobdan konstruktorlardan usullarni chaqirmaslik kerakligini eslang (biz nima uchun buni tushuntiramiz
10-bobda, Ob'ektga yo'naltirilgan dasturlash: Polimorfizm va interfeyslar). Buning uchun
Buning sababi, 4.4-rasmning 15-17 va 37-39-qatorlarida takroriy tasdiqlash kodi mavjud.
keyingi misollar.

112 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

1 // 4.4-rasm: Student.java
2 // Talaba nomi va o'rtacha ma'lumotlarni saqlaydigan talaba sinfi.
3 umumiy sinf talabasi
4 {
5 shaxsiy string nomi;
6 xususiy ikki tomonlama o'rtacha;
7
8 // konstruktor misol o'zgaruvchilarini ishga tushiradi
9 ta umumiy talaba(String nomi, oʻrtacha ikki barobar)
10 {
11 this.name = name;
12
13 // o'rtacha > 0,0 va <= 100,0 ekanligini tasdiqlang; aks holda,
14 // misol o'zgaruvchisining o'rtacha standart qiymatini saqlang (0.0)
15
16
17
18 }
19
20 // Talaba ismini belgilaydi
21 umumiy bekor setName(String nomi)
22 {
23 this.name = name;
24 }
25
26 // Talaba ismini oladi
27 ommaviy string getName()
28 {
29 qaytish nomi;
30 }
31
32 // Talabaning o'rtacha qiymatini belgilaydi
33 umumiy bekor toʻplamiOʻrtacha(ikki kishilik oʻrtacha)
34 {
35 // o'rtacha > 0,0 va <= 100,0 ekanligini tasdiqlang; aks holda,
36 // misol o'zgaruvchisining joriy qiymatini saqlang
37
38
39
40 }
41
42 // Talabaning o'rtacha qiymatini oladi
43 umumiy juft getAverage()
44 {
45 o'rtacha daromad;
46 }
47
48 // Talabaning harf bahosini aniqlaydi va qaytaradi
49 ommaviy satr getLetterGrade()
50 {
51 String letterGrade = ""; // bo'sh Stringga ishga tushirildi
52

4.4-rasm | Talaba nomi va o'rtacha ma'lumotlarini saqlaydigan talaba sinfi. (2-qismning 1-qismi.)

agar (o'rtacha > 0,0)
agar (o'rtacha <= 100,0)
this.average = o'rtacha; // misol o'zgaruvchisiga tayinlash

agar (o'rtacha > 0,0)


agar (o'rtacha <= 100,0)
this.average = o'rtacha; // misol o'zgaruvchisiga tayinlash

4.8 Takrorlash bayonoti 113

Sinf talabalari testi
Talabaning getLetterGrade sinfidagi ichki qo'yilgan if…else iboralarini ko'rsatish uchun
usuli, klassi StudentTestning asosiy usuli (4.5-rasm) ikkita Student ob'ektini yaratadi (7-qatorlar).
8). Keyin 10–13 satrlarda ob'ektlarni chaqirish orqali har bir talabaning ismi va harf bahosi ko'rsatiladi.
mos ravishda getName va getLetterGrade usullari.

4.8 Takrorlash bayonoti


Takrorlash iborasi dastur amalni ayni vaqtda takrorlashi kerakligini belgilash imkonini beradi
ba'zi shartlar haqiqiyligicha qolmoqda. Pseudocode bayonoti

53
54


55
56
57
58
59
60
61
62
63
64 qaytish maktubiGrade;
65 }
66 } // yakuniy sinf talabasi

1 // 4.5-rasm: StudentTest.java


2 // Student ob'ektlarini yaratish va sinab ko'rish.
3 ommaviy sinf talabalar testi
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7 Talaba hisobi1 = yangi Talaba("Jane Green", 93,5);
8 Talaba hisobi2 = yangi Talaba("Jon Blu", 72,75);
9
10 System.out.printf("%s ning harf bahosi: %s%n",
11 account1.getName(), );
12 System.out.printf("%s ning harf bahosi: %s%n",
13 account2.getName(), );
14 }
15 } // yakuniy sinf StudentTest

Jeyn Grinning harf darajasi: A


Jon Bluning harf darajasi: C

4.5-rasm | Student ob'ektlarini yaratish va sinab ko'rish.

Mening xaridlar ro'yxatimda ko'proq narsalar bor
Keyingi elementni sotib oling va uni ro'yxatimdan kesib tashlang

4.4-rasm | Talaba nomi va o'rtacha ma'lumotlarini saqlaydigan talaba sinfi. (2-qismning 2-qismi.)

agar (o'rtacha >= 90,0)
letterGrade = "A";
Aks holda (o'rtacha >= 80,0)
letterGrade = "B";
Aks holda (o'rtacha >= 70,0)
letterGrade = "C";
Aks holda (o'rtacha >= 60,0)
letterGrade = "D";
boshqa
letterGrade = "F";

account1.getLetterGrade()

account2.getLetterGrade()

114 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

xarid qilish safari paytida takrorlashni tasvirlaydi. Shart "mening ustida ko'proq narsalar bor
xarid roʻyxati” toʻgʻri yoki notoʻgʻri boʻlishi mumkin. Agar bu to'g'ri bo'lsa, "Keyingi elementni sotib oling va kesib o'ting
u mening ro'yxatimdan tashqarida" ijrosi. Shart o'zgarganda, bu harakat qayta-qayta bajariladi.
asosiy haqiqat. Takrorlash bayonotida mavjud bo'lgan bayonot(lar) uning tanasini tashkil qiladi,
Bu bitta bayonot yoki blok bo'lishi mumkin. Oxir-oqibat, shart noto'g'ri bo'ladi
(xarid qilish ro'yxatining oxirgi elementi sotib olinganda va kesib tashlanganda). Shu nuqtada,
takrorlash tugaydi va takrorlash bayonotidan keyingi birinchi gap bajariladi.
Java-ning while takrorlash bayonotiga misol sifatida dastur segmentini ko'rib chiqing
100 dan katta 3 ning birinchi darajasini topadi. Faraz qilaylik, int o'zgaruvchining mahsuloti boshlang'ich-
3 ga bo'lingan. Quyidagi while bajarilgandan so'ng mahsulot natijani o'z ichiga oladi:

while ifodasining har bir iteratsiyasi mahsulotni 3 ga ko'paytiradi, shuning uchun mahsulot qabul qiladi


9, 27, 81 va 243 qiymatlari. Mahsulot 243 bo'lganda, mahsulot <= 100 bo'ladi -
yolg'on keladi. Bu takrorlashni tugatadi, shuning uchun mahsulotning yakuniy qiymati 243. Bunda
nuqta, dasturning bajarilishi while operatoridan keyingi keyingi operator bilan davom etadi.

Bir muddat UML faoliyat diagrammasi bayonoti


4.6-rasmdagi UML faoliyat diagrammasi oldingi boshqaruv oqimini tasvirlaydi.
while bayonoti. Yana bir bor, diagrammadagi belgilar (boshlang'ich holatdan tashqari, o'tish-
strelkalar, yakuniy holat va uchta eslatma) harakat holati va qarorni ifodalaydi. Bu di-
agram UML ning birlashtirish belgisini taqdim etadi. UML ikkala birlashma belgisini ham ifodalaydi
va olmos sifatida qaror belgisi. Birlashtirish belgisi ikkita faoliyat oqimini birlashtiradi
bitta. Ushbu diagrammada birlashma belgisi boshlang'ich holatdan va dan o'tishlarni birlashtiradi
harakat davlat, shuning uchun ular har ikkala halqa yoki yo'qligini belgilaydi qaror ichiga oqib
bajarishni boshlashi (yoki davom ettirishi) kerak.

esa (mahsulot <= 100)


mahsulot = 3 * mahsulot;

Umumiy dasturlash xatosi 4.2


Vaqt iborasining tanasida oxir-oqibat ziddiyatga olib keladigan harakatni taqdim etmaslik
“while”ning noto‘g‘ri bo‘lishi odatda cheksiz tsikl deb ataladigan mantiqiy xatolikka olib keladi
(loop hech qachon tugamaydi).

4.6-rasm | takrorlash bayonoti esa UML faoliyat diagrammasi.

uch baravar mahsulot qiymati

Tegishli Java bayonoti:


mahsulot = 3 * mahsulot;

qaror


[mahsulot <= 100]

[mahsulot > 100]

birlashtirish

4.9 Algoritmlarni shakllantirish: qarshi boshqariladigan takrorlash 115



Qaror va birlashma belgilarini "kiruvchi" soni bilan farqlash mumkin.
va "chiqish" o'tish strelkalari. Qaror belgisida bitta o'tish o'qi bor
olmos va undan mumkin bo'lgan o'tishlarni ko'rsatish uchun undan ikkita yoki undan ko'p ishora
o'sha nuqta. Bundan tashqari, qaror belgisiga ishora qiluvchi har bir o'tish o'qi qo'riqchiga ega
yonidagi holat. Birlashtirish belgisi ikki yoki undan ortiq o'tish strelkasiga ega
olmos va olmosdan faqat bitta ishora, bir nechta faoliyat oqimini ko'rsatish uchun
faoliyatni davom ettirish uchun birlashtirish. Birlashma bilan bog'liq o'tish strelkalarining hech biri
belgi qo'riqlash shartiga ega.
4.6-rasmda avvalroq muhokama qilingan while iborasining takrorlanishi aniq ko'rsatilgan
Bo'lim. Harakat holatidan chiqadigan o'tish strelkasi birlashishni ko'rsatadi,
qaysi dastur oqimi boshida sinovdan o'tgan qarorga qaytadi
tsiklning har bir iteratsiyasi. Loop qo'riqlash holatiga qadar bajarishda davom etadi
mahsulot > 100 haqiqatga aylanadi. Keyin while ifodasi chiqadi (yakuniy holatga keladi) va
boshqaruv dasturdagi ketma-ketlikda keyingi operatorga o'tadi.
4.9 Algoritmlarni shakllantirish: qarshi boshqariladigan
Takrorlash
Algoritmlar qanday ishlab chiqilishini ko'rsatish uchun biz muammoning ikkita variantini hal qilamiz:
talabalarning baholarini oshiradi. Quyidagi muammo bayonotini ko'rib chiqing:
O‘n nafar o‘quvchidan iborat sinf viktorinada qatnashdi. Buning uchun baholar (0–100 oralig'idagi butun sonlar).
viktorina siz uchun mavjud. Viktorina bo'yicha o'rtacha sinfni aniqlang.
O'rtacha sinf o'quvchilar soniga bo'lingan baholar yig'indisiga teng. The
Bu masalani kompyuterda yechish algoritmi har bir bahoni kiritishi, bahoni kuzatib borishi kerak
kiritilgan barcha baholarning jami, o'rtacha hisobni bajaring va natijani chop eting.
Qarama-qarshi boshqariladigan takrorlash bilan psevdokod algoritmi
Pseudocode yordamida bajariladigan amallarni sanab o'tamiz va ularning tartibini belgilaymiz
bajarishi kerak. Biz baholarni birma-bir kiritish uchun qarshi boshqariladigan takrorlashdan foydalanamiz.
Ushbu uslub raqamni boshqarish uchun hisoblagich (yoki nazorat o'zgaruvchisi) deb nomlangan o'zgaruvchidan foydalanadi
necha marta bayonotlar to'plami bajariladi. Qarama-qarshi boshqariladigan takrorlash ko'pincha defi-
nite takrorlash, chunki takrorlashlar soni tsikl boshlanishidan oldin ma'lum -
ing. Ushbu misolda, hisoblagich 10 dan oshganda takrorlash tugaydi. Ushbu bo'lim
to'liq ishlab chiqilgan psevdokod algoritmi (4.7-rasm) va tegishli Java pro-
algoritmni amalga oshiradigan gramm (4.8-rasm). 4.10-bo'limda biz buni qanday qilishni ko'rsatamiz
noldan bunday algoritmni ishlab chiqish uchun psevdokoddan foydalaning.
4.7-rasmdagi algoritmdagi jami va hisoblagichga havolalarga e'tibor bering. Jami a
bir nechta qiymatlar yig'indisini to'plash uchun ishlatiladigan o'zgaruvchi. Hisoblagich bu uchun ishlatiladigan o'zgaruvchidir
hisoblash - bu holda, baho hisoblagichi 10 bahodan qaysi biri bo'lishini ko'rsatadi
foydalanuvchi tomonidan kiritilgan. Umumiy miqdorlarni saqlash uchun ishlatiladigan o'zgaruvchilar odatda avval nolga tenglashtiriladi
dasturda foydalaniladi.
Dasturiy ta'minot muhandisligi kuzatuvi 4.2
Tajriba shuni ko'rsatadiki, kompyuterda muammoni hal qilishning eng qiyin qismi
hal qilish algoritmini ishlab chiqish. To'g'ri algoritm aniqlangandan so'ng,
undan ishlaydigan Java dasturini ishlab chiqarish odatda oddiy.

116 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

Qarama-qarshi boshqariladigan takrorlashni amalga oshirish
4.8-rasmda ClassAverage sinfining asosiy usuli (7–31-qatorlar) sinf oʻrtacha qiymatini amalga oshiradi.
4.7-rasmdagi psevdokod bilan tavsiflangan algoritm — foydalanuvchiga 10 bahoni kiritish imkonini beradi,
keyin hisoblab chiqadi va o'rtacha ko'rsatadi.

1 Jami nolga o'rnating


2 Baho hisoblagichini bittaga o'rnating
3
4 Baho hisoblagichi o'ndan kichik yoki teng bo'lsa
5 Foydalanuvchiga keyingi bahoni kiritishni taklif qiling
6 Keyingi bahoni kiriting
7 Umumiy ballga baho qo'shing
8 Baho hisoblagichiga bitta qo'shing
9
10 O'rtacha sinfni o'nga bo'lingan jamiga o'rnating
11 O'rtacha sinfni chop eting

4.7-rasm | Sinfni hal qilish uchun qarshi boshqariladigan takrorlashdan foydalanadigan psevdokod algoritmi


o'rtacha muammo.

1 // 4.8-rasm: ClassAverage.java


2 // Qarama-qarshi boshqariladigan takrorlash yordamida sinf o'rtacha masalasini hal qilish.
3 import java.util.Scanner; // dastur Scanner sinfidan foydalanadi
4
5 umumiy sinf ClassAverage
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // buyruqlar oynasidan ma'lumot olish uchun Skaner yarating
10 Skaner kiritish = yangi Skaner(System.in);
11
12 // ishga tushirish bosqichi
13 int jami = 0; // foydalanuvchi tomonidan kiritilgan baholar yig'indisini ishga tushirish
14
15
16 // ishlov berish bosqichi qarama-qarshi boshqariladigan takrorlashdan foydalanadi
17 while ( ) // 10 marta aylanish
18 {
19 System.out.print("Bahoni kiriting: "); // so'rov
20 int darajasi = input.nextInt(); // keyingi sinfni kiriting
21 jami = jami + baho; // jamiga baho qo'shing
22
23 }
24
25 // tugatish bosqichi
26 int o'rtacha = jami / 10; // butun sonni bo'lish butun sonni beradi
27
28 // umumiy va oʻrtacha baholarni koʻrsatish
29 System.out.printf("%nBarcha 10 ta baholarning jami %d%n", jami);

4.8-rasm | Qarama-qarshi boshqariladigan takrorlash yordamida sinf o'rtacha masalasini hal qilish. (2-qismning 1-qismi.)

int gradeCounter = 1; // keyingi kiritish uchun # bahoni ishga tushiring

gradeCounter <= 10

gradeCounter = gradeCounter + 1; // hisoblagichni 1 ga oshiring

4.9 Algoritmlarni shakllantirish: qarshi boshqariladigan takrorlash 117

Asosiy usulda mahalliy o'zgaruvchilar
10-qator qiymatlarni o'qish uchun ishlatiladigan Skaner o'zgaruvchisi kiritishni e'lon qiladi va ishga tushiradi
foydalanuvchi tomonidan kiritilgan. 13, 14, 20 va 26 qatorlar jami mahalliy o'zgaruvchilarni e'lon qiladi, gradeCounter,
navbati bilan baho va oʻrtacha int turi boʻlishi kerak. O'zgaruvchan baho foydalanuvchi kiritgan ma'lumotlarni saqlaydi.
Ushbu deklaratsiyalar usulning asosiy qismida ko'rinadi. Esda tutingki, o'zgaruvchilar e'lon qilingan
Usul tanasida mahalliy o'zgaruvchilar mavjud va ular faqat deklaratsiya satridan foydalanish mumkin
usul deklaratsiyasining oxirgi o'ng qavsga. Mahalliy o'zgaruvchining deklaratsiyasi bo'lishi kerak
o'zgaruvchi bu usulda qo'llanilishidan oldin paydo bo'ladi. Mahalliy o'zgaruvchiga kirish mumkin emas -
u e'lon qilingan usul tomoni. O'zgaruvchan daraja, vaqt tanasida e'lon qilingan
loop, faqat shu blokda ishlatilishi mumkin.
Initializatsiya bosqichi: o'zgaruvchilarning jami va gradeCounterni ishga tushirish
Topshiriqlar (13–14-qatorlarda) jami 0 ga va gradeCounter ni 1 ga ishga tushiradi.
o'zgaruvchilar hisob-kitoblarda qo'llanilishidan oldin o'zgarishlar sodir bo'ladi.

Qayta ishlash bosqichi: Foydalanuvchidan 10 baho o'qish


17-qator while iborasi tsiklni davom ettirishi kerakligini bildiradi (shuningdek, iteratsiya deb ataladi)
gradeCounter qiymati 10 dan kichik yoki teng bo'lsa. Bu holat saqlanib qolsa
rost, while iborasi qavslar orasidagi gaplarni qayta-qayta bajaradi.
uning tanasini cheklash (18-23-qatorlar).

30 System.out.printf("O'rtacha sinf %d%n", o'rtacha);


31 }
32 } // oxirgi sinf ClassAverage

Bahoni kiriting: 67


Bahoni kiriting: 78
Bahoni kiriting: 89
Bahoni kiriting: 67
Bahoni kiriting: 87
Bahoni kiriting: 98
Bahoni kiriting: 93
Bahoni kiriting: 85
Bahoni kiriting: 82
Bahoni kiriting: 100

Barcha 10 ta sinflar jami 846 ta


O'rtacha sinf - 84

Umumiy dasturlash xatosi 4.3


Lokal o'zgaruvchining qiymatini ishga tushirishdan oldin ishlatish kompilyatsiya xatosiga olib keladi. Hammasi
mahalliy o'zgaruvchilar ularning qiymatlari ifodalarda ishlatilishidan oldin ishga tushirilishi kerak.

Xatolarning oldini olish bo'yicha maslahat 4.3


Har bir jami va hisoblagichni deklaratsiyada yoki topshiriq bayonnomasida boshlang.
Jami odatda 0 ga ishga tushiriladi. Hisoblagichlar odatda 0 yoki 1 ga ishga tushiriladi.
Ularning qanday qo'llanilishi haqida ma'lumot bering (biz 0 va qachon 1 dan foydalanishga misollar ko'rsatamiz).

4.8-rasm | Qarama-qarshi boshqariladigan takrorlash yordamida sinf o'rtacha masalasini hal qilish. (2-qismning 2-qismi.)


118 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

19-qatorda "Bahoni kiriting:" degan so'rov ko'rsatiladi. 20-qator tomonidan kiritilgan baho o'qiladi
foydalanuvchi va uni o'zgaruvchan darajaga tayinlaydi. Keyin 21-qator foydalanuvchi kiritgan yangi bahoni qo'shadi
jamiga va natijani jamiga tayinlaydi, bu uning oldingi qiymatini almashtiradi.
22-satr dastur bahoni qayta ishlaganligini ko'rsatish uchun gradeCounter ga 1 qo'shadi va
foydalanuvchidan keyingi bahoni kiritishga tayyor. gradeCounterni oshirish oxir-oqibat sabab bo'ladi
u 10 dan oshib ketadi. Keyin tsikl tugaydi, chunki uning sharti (17-satr) noto'g'ri bo'ladi.
Tugatish bosqichi: O'rtacha sinfni hisoblash va ko'rsatish
Loop tugagach, 26-satr o'rtacha hisoblashni amalga oshiradi va uning natijasini belgilaydi
o'zgaruvchan o'rtachaga. 29-qator "To-" matnini ko'rsatish uchun System.out-ning printf usulidan foydalanadi.
Barcha 10 ta baholarning talmasidan keyin " jami o'zgaruvchining qiymati keladi. 30-qator keyin printf dan foydalanadi.
"Sinf o'rtachasi" matnini ko'rsatish uchun o'rtacha o'zgaruvchan qiymatdan keyin. exe qachon -
kesish 31-qatorga yetadi, dastur tugaydi.
E'tibor bering, bu misol faqat bitta sinfni o'z ichiga oladi, asosiy usul barchani bajaradi
ish. Ushbu bobda va 3-bobda siz ikkita sinfdan iborat misollarni ko'rdingiz - bitta
misol o'zgaruvchilari va ushbu o'zgaruvchilar yordamida vazifalarni bajaradigan usullarni o'z ichiga olgan va bitta
boshqa sinf ob'ektini yaratadigan va uning usullarini chaqiradigan asosiy usulni o'z ichiga oladi.
Ba'zan, a ko'rsatish uchun qayta foydalanish mumkin sinf yaratishga harakat qilish mantiqiy bo'lmaganda
kontseptsiya bo'lsa, biz dasturning bayonotlarini butunlay bitta sinfning asosiy usuliga joylashtiramiz.
Butun sonlarni bo'lish va kesish bo'yicha eslatmalar
Asosiy usul bilan bajarilgan o'rtacha hisoblash butun sonni beradi. tarafdori
grammning chiqishi namunaviy bajarilishdagi baho qiymatlarining yig'indisi 846 ekanligini ko'rsatadi,
Bu 10 ga bo'linganda 84,6 suzuvchi nuqtani berishi kerak. Biroq,
jami/10 (4.8-rasmning 26-satri) hisobining natijasi 84 butun son, chunki jami
va 10 ikkala butun sondir. Ikkita butun sonni bo'lish butun son bo'linishiga olib keladi - har qanday kasr
hisoblashning bir qismi qisqartiriladi (ya'ni, yo'qolgan). Keyingi bo'limda biz a ni qanday olishni ko'rib chiqamiz
o'rtacha hisobdan suzuvchi nuqta natijasi.

Arifmetik to'ldirish haqida eslatma


4.8-rasmda 21-qator

foydalanuvchi tomonidan kiritilgan har bir bahoni jamiga qo'shdi. Hatto bu oddiy bayonot ham potentsialga ega


muammo - butun sonlarni qo'shish int variantida saqlash uchun juda katta qiymatga olib kelishi mumkin.
qodir. Bu arifmetik to'lib ketish deb nomlanadi va aniqlanmagan xatti-harakatlarga olib keladi, bu esa olib kelishi mumkin
kutilmagan natijalar (http://en.wikipedia.org/wiki/Integer_overflow#Security_)
oqibatlar). 2.7-rasmdagi Qo'shish dasturi 23-qatorda bir xil muammoga ega edi, bu
foydalanuvchi tomonidan kiritilgan ikkita int qiymatining yig'indisi kechiktirildi:

Int o'zgaruvchida saqlanishi mumkin bo'lgan maksimal va minimal qiymatlar takrorlanadi.


sinfda aniqlangan mos ravishda MIN_VALUE va MAX_VALUE konstantalari tomonidan yuborilgan

Umumiy dasturlash xatosi 4.4


Agar butun sonlarni bo'linish davrlari (qisqartirish o'rniga) noto'g'ri natijalarga olib kelishi mumkin.
Masalan, an'anaviy arifmetikada 1,75 ga teng bo'lgan 7 ÷ 4 oraliqda 1 ga qisqaradi.
2 ga yaxlitlashdan ko'ra ger arifmetikasi.

jami = jami + baho; // jamiga baho qo'shing

yig'indisi = raqam1 + raqam2; // raqamlarni qo'shing, so'ngra jami yig'indida saqlang

4.10 Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan takrorlash 119

Butun son. Boshqa integral turlari va suzuvchi nuqta turlari uchun shunga o'xshash konstantalar mavjud.
Har bir ibtidoiy tip java.lang paketida mos keladigan sinf turiga ega. ni ko'rishingiz mumkin
har bir sinfning onlayn hujjatlarida ushbu konstantalarning qiymatlari. Onlayn hujjatlar
sinf uchun Integer quyidagi manzilda joylashgan:

Arifmetik hisob-kitoblarni amalga oshirishdan oldin buni ta'minlash yaxshi amaliyot hisoblanadi


4.8-rasmning 21-qatoridagi va 2.7-rasmning 23-qatoridagi kabi, ular toshib ketmasligi uchun. The
Buning uchun kod CERT veb-saytida ko'rsatilgan www.securecoding.cert.org—faqatgina
“NUM00-J” yoʻriqnomasini qidiring. Kod && (mantiqiy AND) va || dan foydalanadi (mantiqiy OR)
operatorlar, ular 5-bobda keltirilgan. Sanoat-quvvat kodeksida,
barcha hisob-kitoblar uchun bu kabi tekshiruvlarni shakllantiring.

Foydalanuvchi ma'lumotlarini qabul qilishga chuqurroq qarash


Har safar dastur foydalanuvchidan ma'lumot olganida, turli muammolar yuzaga kelishi mumkin. sobiq uchun -
keng, 4.8-rasmning 20-qatorida

biz foydalanuvchi 0 dan 100 gacha bo'lgan oraliqda butun son bahosini kiritadi deb taxmin qilamiz. Biroq,


Bahoga kiruvchi 0 dan kichik butun sonni, 100 dan katta butun sonni kiritishi mumkin.
int o'zgaruvchida saqlanishi mumkin bo'lgan qiymatlar oralig'idan tashqarida joylashgan butun son
o'nli nuqta yoki harflar yoki maxsus belgilarni o'z ichiga olgan qiymatni kiritish
teger.
Kirishlar to'g'riligiga ishonch hosil qilish uchun sanoat quvvat dasturlari barcha mumkin bo'lgan narsalarni sinab ko'rishlari kerak
noto'g'ri holatlar. Baholarni kirituvchi dastur diapazondan foydalanib baholarni tasdiqlashi kerak
0 dan 100 gacha qiymatlar mavjudligini tekshirish. Keyin foydalanuvchidan qayta kiritishni soʻrashingiz mumkin.
diapazondan tashqarida bo'lgan har qanday qiymat. Agar dastur ma'lum qiymatlar to'plamidan kirishni talab qilsa (masalan,
ketma-ket mahsulot kodlari), har bir kirish to'plamdagi qiymatga mos kelishiga ishonch hosil qilishingiz mumkin.

4.10 Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan


Takrorlash
4.9-bo'limning sinf o'rtacha masalasini umumlashtiramiz. Quyidagi muammoni ko'rib chiqing:
O'zboshimchalik soni uchun baholarni qayta ishlaydigan sinf o'rtacha dasturini ishlab chiqing
har safar ishga tushirilganda talabalar.
Oldingi sinf o'rtacha misolida, muammo bayoni o'quvchilar sonini ko'rsatdi.
dents, shuning uchun sinflar soni (10) oldindan ma'lum edi. Ushbu misolda ko'rsatma yo'q
dasturni bajarish jarayonida foydalanuvchi qancha baho qo'yishi ko'rsatilgan. tarafdori
gramm ixtiyoriy sonli baholarni qayta ishlashi kerak. Qachon to'xtatish kerakligini qanday aniqlash mumkin
baholarni kiritish? O'rtacha sinfni qachon hisoblash va chop etish kerakligini qanday biladi?
Ushbu muammoni hal qilishning bir usuli - sentinel qiymat deb ataladigan maxsus qiymatdan foydalanish (shuningdek
"ma'lumotlarni kiritish tugashini" ko'rsatish uchun signal qiymati, soxta qiymat yoki bayroq qiymati deb ataladi. The
foydalanuvchi barcha qonuniy baholar kiritilgunga qadar baholarni kiritadi. Keyin foydalanuvchi yozadi
boshqa baholar kiritilmasligini bildirish uchun sentinel qiymati. Sentinel tomonidan boshqariladigan takrorlash
tion ko'pincha noma'lum takrorlash deb ataladi, chunki takrorlanishlar soni ma'lum emas
sikl bajarilishini boshlashdan oldin.

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

int darajasi = input.nextInt(); // keyingi sinfni kiriting

120 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

Shubhasiz, qabul qilinadigan qiymat bilan aralashtirib bo'lmaydigan sentinel qiymatini tanlash kerak
kirish qiymati. Viktorinadagi baholar manfiy bo'lmagan butun sonlar, shuning uchun -1 qabul qilinadigan nazorat qiymati hisoblanadi
bu muammo uchun. Shunday qilib, sinf o'rtacha dasturini ishga tushirish kirishlar oqimini qayta ishlashi mumkin
95, 96, 75, 74, 89 va –1 kabi. Keyin dastur sinfni hisoblab chiqadi va chop etadi
95, 96, 75, 74 va 89-sinflar uchun o'rtacha; chunki -1 - sentinel qiymat, bunday bo'lmasligi kerak
o'rtacha hisob-kitobga kiriting.
Yuqoridan pastga, bosqichma-bosqich takomillashtirish bilan psevdokod algoritmini ishlab chiqish:
Yuqori va birinchi takomillashtirish
Biz ushbu o'rtacha sinf dasturiga yuqoridan pastga, bosqichma-bosqich qayta ishlash deb nomlangan usul bilan yaqinlashamiz.
yaxshi tuzilgan dasturlarni ishlab chiqish uchun zarur bo'lgan nozik. Biz boshlaymiz
tepaning psevdokod ko'rinishi bilan - umumiy ma'lumotni bildiradigan yagona bayonot
dasturning vazifasi:

Yuqori qismi, aslida, dasturning to'liq ifodasidir. Afsuski, tepa kamdan-kam hollarda


Java dasturini yozish uchun yetarlicha tafsilotlarni beradi. Shunday qilib, biz endi tozalashni boshlaymiz -
mentlash jarayoni. Biz yuqori qismini kichikroq vazifalar qatoriga ajratamiz va ularni tartibda ro'yxatlaymiz
qaysi ular ijro etiladi. Bu quyidagi birinchi takomillashtirishga olib keladi:

Ushbu takomillashtirish faqat ketma-ketlik strukturasidan foydalanadi - sanab o'tilgan qadamlar tartibda bajarilishi kerak,


birin-ketin.

Ikkinchi takomillashtirishga o'tish


Avvalgi dasturiy ta'minot muhandisligi kuzatuvi ko'pincha birinchi takomillashtirish uchun kerak bo'lgan narsadir.
yuqoridan pastga jarayonda. Keyingi takomillashtirish darajasiga o'tish uchun, ya'ni
ikkinchi takomillashtirish - biz aniq o'zgaruvchilarga bog'lanamiz. Ushbu misolda bizga yugurish kerak
raqamlarning jami, qancha raqam qayta ishlanganligini hisoblash, o'zgaruvchiga
foydalanuvchi tomonidan kiritilgan har bir bahoning qiymatini va hisoblangan qiymatni ushlab turish uchun o'zgaruvchini oling
o'rtacha. Pseudocode bayonoti

quyidagicha aniqlanishi mumkin:

Viktorina uchun o'rtacha sinfni aniqlang

O'zgaruvchilarni ishga tushirish


Viktorina baholarini kiriting, jamlang va hisoblang
O'rtacha sinfni hisoblang va chop eting

Dasturiy ta'minot muhandisligi kuzatuvi 4.3


Har bir takomillashtirish, shuningdek, yuqori qismning o'zi algoritmning to'liq tavsifidir -
faqat tafsilotlar darajasi farq qiladi.
Dasturiy ta'minot muhandisligi kuzatuvi 4.4
Ko'pgina dasturlarni mantiqan uch bosqichga bo'lish mumkin: ishga tushirish bosqichi
o'zgaruvchilarni ishga tushiradi; ma'lumotlar qiymatlarini kiritadigan va dasturni sozlaydigan ishlov berish bosqichi
mos ravishda o'zgaruvchilar; va yakuniy natijalarni hisoblaydigan va chiqaradigan tugatish bosqichi.

O'zgaruvchilarni ishga tushirish

Jami nolga tenglashtiring
Hisoblagichni nolga tenglashtiring

4.10 Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan takrorlash 121

Faqat total va counter o'zgaruvchilari foydalanishdan oldin ishga tushirilishi kerak. O'zgaruvchilar
o'rtacha va baho (mos ravishda hisoblangan o'rtacha va foydalanuvchi kiritish uchun) bo'lishi shart emas
ishga tushirilgan, chunki ularning qiymatlari hisoblangan yoki kiritilganda almashtiriladi.
Pseudocode bayonoti

Har bir bahoni ketma-ket kiritish uchun takrorlashni talab qiladi. Qanchaligini oldindan bilmaymiz


baholar kiritiladi, shuning uchun biz nazoratchi tomonidan boshqariladigan takrorlashdan foydalanamiz. Foydalanuvchi birinchi darajaga kiradi
bir vaqtning o'zida. Oxirgi bahoni kiritgandan so'ng, foydalanuvchi sentinel qiymatini kiritadi. Dastur sinovlari
har bir baho kiritilgandan so'ng sentinel qiymati uchun va foydalanuvchi kirganda tsiklni tugatadi
sentinel qiymati. Oldingi psevdokod bayonotining ikkinchi takomillashtirilishi keyin

Psevdokodda biz iboraning tanasini tashkil etuvchi gaplar atrofida qavslardan foydalanmaymiz


Tuzilish paytida. Biz shunchaki bo'lgan gaplarni ko'rsatish uchun "Wale" ning ostidagi bayonotlarni joylashtiramiz.
vaqtgacha. Shunga qaramay, psevdokod faqat dasturni ishlab chiqish uchun norasmiy yordamdir.
Pseudocode bayonoti

quyidagicha aniqlanishi mumkin:

Biz bu erda nolga bo'linish imkoniyatini sinab ko'rish uchun ehtiyot bo'lamiz - bu mantiqiy xato, agar bajarilmasa.
tekshirilsa, dastur ishlamay qolishiga yoki noto'g'ri natijaga olib kelishi mumkin. To'liq ikkinchi
o'rtacha sinf muammosi uchun psevdokodni takomillashtirish 4.9-rasmda ko'rsatilgan.

Viktorina baholarini kiriting, jamlang va hisoblang

Foydalanuvchiga birinchi sinfga kirishni taklif qiling
Birinchi sinfni kiriting (ehtimol qo'riqchi)
Foydalanuvchi hali qo'riqchiga kirmagan bo'lsa-da
Ushbu bahoni bajarilgan jamiga qo'shing
Baho hisoblagichiga bittasini qo'shing
Foydalanuvchiga keyingi sinfga kirishni taklif qiling
Keyingi bahoni kiriting (ehtimol qo'riqchi)

O'rtacha sinfni hisoblang va chop eting

Hisoblagich nolga teng bo'lmasa
O'rtachani hisoblagichga bo'lingan jamiga o'rnating
O'rtachani chop eting
boshqa
"Hech qanday baholar kiritilmagan" ni chop eting

Xatolarning oldini olish bo'yicha maslahat 4.4


To'g'ri operand bo'lgan bo'linish (/) yoki qoldiq (%) hisoblarini bajarishda
nolga teng bo'lishi mumkin, buni sinab ko'ring va uni boshqaring (masalan, xato xabarini ko'rsatish).
yuzaga keladigan xatolikni kamaytiradi.

1 Jami nolga boshlang


2 Hisoblagichni nolga aylantiring
3

4.9-rasm | Sentinel tomonidan boshqariladigan takrorlash bilan sinf o'rtacha psevdokod algoritmi. (2-qismning 1-qismi.)


122 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

4.7-rasmda va 4.9-rasmda biz psevdokodga bo'sh satrlar va chekinishni kiritdik.
uni yanada o'qilishi uchun. Bo'sh satrlar algoritmlarni fazalariga ajratadi va o'rnatadi
nazoratdan tashqari bayonotlar; chekinish nazorat bayonotlarining jismlarini ta'kidlaydi.
4.9-rasmdagi psevdokod algoritmi umumiyroq sinf o'rtacha masalasini hal qiladi.
Ushbu algoritm ikki marta takomillashtirishdan so'ng ishlab chiqilgan. Ba'zan ko'proq talab qilinadi.

Sentinel tomonidan boshqariladigan takrorlashni amalga oshirish


4.10-rasmda asosiy usul (7-46-qatorlar) 4.9-rasmdagi psevdokod algoritmini amalga oshiradi.
Garchi har bir baho butun son bo'lsa-da, o'rtacha hisob raqamni keltirib chiqarishi mumkin
kasrli nuqta bilan - boshqacha aytganda, haqiqiy (suzuvchi nuqta) son. int turi mumkin emas
bunday sonni ifodalaydi, shuning uchun bu sinf buni amalga oshirish uchun double turidan foydalanadi. Siz ushbu boshqaruvni ham ko'rasiz
bayonotlar bir-birining ustiga joylashtirilishi mumkin (ketma-ket). while iborasi (satr
22–30)dan keyin ketma-ket if…else ifodasi keladi (34–45-qatorlar). Kodning katta qismi
bu dasturda 4.8-rasmdagi bilan bir xil, shuning uchun biz yangi tushunchalarga e'tibor qaratamiz.

4 Foydalanuvchiga birinchi sinfga kirishni taklif qiling


5 Birinchi darajani kiriting (ehtimol qo'riqchi)
6
7 Foydalanuvchi hali qo'riqchiga kirmagan bo'lsa
8 Ushbu bahoni yugurish jamiga qo'shing
9 Baho hisoblagichiga bitta qo'shing
10 Foydalanuvchiga keyingi sinfga kirishni taklif qiling
11 Keyingi bahoni kiriting (ehtimol qo'riqchi)
12
13 Hisoblagich nolga teng bo'lmasa
14 O'rtachani hisoblagichga bo'lingan jamiga o'rnating
15 O'rtachani chop eting
yana 16
17 “Baholar kiritilmagan” ni chop eting

Dasturiy ta'minot muhandisligi kuzatuvi 4.5


Psevdokodni belgilaganingizdan so'ng, yuqoridan pastga, bosqichma-bosqich takomillashtirish jarayonini to'xtating
psevdokodni Java-ga aylantirishingiz uchun etarli darajada batafsil algoritm. Odatda,
Java dasturini amalga oshirish oson.
Dasturiy ta'minot muhandisligi kuzatuvi 4.6
Ba'zi dasturchilar psevdokod kabi dastur ishlab chiqish vositalaridan foydalanmaydi. Ular buni his qilishadi
ularning yakuniy maqsadi kompyuterda muammoni hal qilish va psevdokod yozishdir
faqat yakuniy mahsulot ishlab chiqarishni kechiktiradi. Garchi bu oddiy va uchun ishlashi mumkin
tanish muammolar, bu katta, murakkab loyihalarda jiddiy xatolar va kechikishlarga olib kelishi mumkin.

1 // 4.10-rasm: ClassAverage.java


2 // Sentinel tomonidan boshqariladigan takrorlash yordamida sinf o'rtacha muammosini hal qilish.
3 import java.util.Scanner; // dastur Scanner sinfidan foydalanadi

4.10-rasm | Sentinel tomonidan boshqariladigan takrorlash yordamida sinf o'rtacha muammosini hal qilish. (2-qismning 1-qismi.)

4.9-rasm | Sentinel tomonidan boshqariladigan takrorlash bilan sinf o'rtacha psevdokod algoritmi. (2-qismning 2-qismi.)

4.10 Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan takrorlash 123

4
5 umumiy sinf ClassAverage
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // buyruqlar oynasidan ma'lumot olish uchun Skaner yarating
10 Skaner kiritish = yangi Skaner(System.in);
11
12 // ishga tushirish bosqichi
13 int jami = 0; // baholar yig'indisini ishga tushirish
14
15
16 // qayta ishlash bosqichi
17
18
19
20
21
22 vaqt (baho != -1)
23 {
24 jami = jami + baho; // jamiga baho qo'shing
25 gradeCounter = gradeCounter + 1; // o'sish hisoblagichi
26
27
28
29
30 }
31
32 // tugatish bosqichi
33 // agar foydalanuvchi kamida bitta baho kiritgan bo'lsa...
34 agar ( )
35 {
36
37
38
39 // jami va o'rtachani ko'rsatish (aniqlikning ikki raqami bilan)
40 System.out.printf("%nKiritilgan %d baholarning umumiy soni %d%n",
41 sinf Hisoblagich, jami);
42 System.out.printf("O'rtacha sinf %.2f%n", o'rtacha);
43 }
44 ta // hech qanday baholar kiritilmagan, shuning uchun tegishli xabarni chiqaring
45 System.out.println("Hech qanday baholar kiritilmagan");
46 }
47 } // oxirgi sinf ClassAverage

Chiqish uchun baho yoki -1 ni kiriting: 97


Chiqish uchun baho yoki -1 ni kiriting: 88
Chiqish uchun baho yoki -1 ni kiriting: 72
Chiqish uchun bahoni kiriting yoki -1: -1

Kiritilgan 3 ta sinfning jami 257 tasi


O'rtacha sinf - 85,67

4.10-rasm | Sentinel tomonidan boshqariladigan takrorlash yordamida sinf o'rtacha muammosini hal qilish. (2-qismning 2-qismi.)

int gradeCounter = 0; // hozirgacha kiritilgan # baholarni ishga tushiring

// foydalanuvchidan kiritish va o'qish bahosini so'rash


System.out.print("Chiqish uchun bahoni kiriting yoki -1: ");
int darajasi = input.nextInt();

// foydalanuvchidan sentinel qiymati o'qilguncha aylanish

// kiritishni so'rang va foydalanuvchidan keyingi bahoni o'qing
System.out.print("Chiqish uchun bahoni kiriting yoki -1: ");
baho = input.nextInt();

gradeCounter != 0

// o'rtacha baholarni hisoblash uchun kasrli raqamdan foydalaning
ikki barobar o'rtacha = (ikki marta) jami / gradeCounter;

124 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

Sentinel tomonidan boshqariladigan takrorlash va qarshi boshqariladigan takrorlash uchun dastur mantig'i
37-qator ikki o'zgaruvchan o'rtachani e'lon qiladi, bu bizga sinf o'rtachasini a sifatida saqlashga imkon beradi
suzuvchi nuqta raqami. 14-qator gradeCounter-ni 0 ga ishga tushiradi, chunki hech qanday baho qo'yilmagan
hali kirgan. Esda tutingki, ushbu dasturni kiritish uchun sentinel tomonidan boshqariladigan takrorlashni ishlatadi
baholar. Kiritilgan baholar sonini aniq qayd etish uchun dastur
ments gradeCounter faqat foydalanuvchi to'g'ri baho kiritganida.
Ushbu ilovada sentinel tomonidan boshqariladigan takrorlash uchun dastur mantiqini solishtiring
4.8-rasmda qarama-qarshi boshqariladigan takrorlash uchun. Qarama-qarshi nazorat ostida takrorlashda, har biri
while bayonotining takrorlanishi (4.8-rasmning 17-23-qatorlari) foydalanuvchidan qiymatni o'qiydi,
takrorlashning belgilangan soni. Sentinel tomonidan boshqariladigan takrorlashda dastur o'qiydi
birinchi qiymat (4.10-rasmning 18-19-qatorlari) vaqtga yetmasdan oldin. Bu qiymat belgilaydi
dasturning boshqaruv oqimi vaqt tanasiga kirishi kerakmi. Agar shart
while qiymati noto'g'ri bo'lsa, foydalanuvchi sentinel qiymatini kiritdi, shuning uchun while tanasi kiritmaydi
bajarish (ya'ni, baholar kiritilmagan). Agar boshqa tomondan, shart to'g'ri bo'lsa, tana
bajarishni boshlaydi va tsikl umumiy qiymatga baho qiymatini qo'shadi va ni oshiradi
gradeCounter (24–25-qatorlar). Keyin pastadir tanasidagi 28-29 qatorlar keyingi qiymatni kiritadi
foydalanuvchi. Keyinchalik, dastur boshqaruvi 30-qatorda pastadir tanasining o'ng yopilish burchagiga etib boradi,
shuning uchun bajarish while shartini tekshirish bilan davom etadi (22-qator). Shart foydalanadi
Loop tanasi bajarilishi kerakligini aniqlash uchun foydalanuvchi tomonidan kiritilgan eng so'nggi baho
yana yoqimli. O'zgaruvchan bahoning qiymati har doim foydalanuvchi tomonidan darhol oldin kiritiladi
dastur while holatini tekshiradi. Bu dasturga bor yoki yo'qligini aniqlash imkonini beradi
faqat kiritilgan qiymat dastur ushbu qiymatni qayta ishlashdan oldin (ya'ni, uni qo'shishdan oldin) sentinel qiymatdir
jami). Agar sentinel qiymati kiritilsa, tsikl tugaydi va dastur tugamaydi
jamiga -1 qo'shing.

Davra tugagach, 34–45-qatorlardagi if…else operatori bajariladi. kon-


34-qatordagi belgi har qanday baholar kiritilganligini aniqlaydi. Hech biri kiritilmagan bo'lsa, boshqasi
if…else operatorining qismi (44–45-qatorlar) bajariladi va “Yo‘q” xabarini ko‘rsatadi.
baholar kiritildi" va usul boshqaruvni chaqiruv usuliga qaytaradi.
Qavslar a while bayonotida
4.10-rasmdagi while iborasining blokiga e'tibor bering (23–30-qatorlar). Qavslarsiz,
loop o'z tanasini faqat birinchi ibora deb hisoblaydi, bu esa ga baho qo'shadi
jami. Blokdagi so'nggi uchta ibora loop tanasidan tashqariga tushib, sabab bo'ladi
kompyuter kodni quyidagi tarzda noto'g'ri talqin qilish uchun:

Agar foydalanuvchi kiritmagan bo'lsa, oldingi kod dasturda cheksiz tsiklga olib keladi


sentinel -1 19-qatorda (while iborasidan oldin).

Yaxshi dasturlash amaliyoti 4.3


Qo'riqchi tomonidan boshqariladigan tsiklda ko'rsatmalar foydalanuvchiga qo'riqchi haqida eslatishi kerak.

esa (baho!= -1)


jami = jami + baho; // jamiga baho qo'shing
gradeCounter = gradeCounter + 1; // o'sish hisoblagichi
// kiritishni so'rang va foydalanuvchidan keyingi bahoni o'qing
System.out.print("Chiqish uchun bahoni kiriting yoki -1: ");
baho = input.nextInt();

4.10 Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan takrorlash 125

Ibtidoiy turlar orasiga aniq va bilvosita konvertatsiya qilish
Agar kamida bitta baho kiritilgan bo'lsa, 4.10-rasmning 37-qatori baholarning o'rtacha qiymatini hisoblab chiqadi.
4.8-rasmdan eslaylik, butun songa bo'linish butun son natija beradi. O'zgaruvchan bo'lsa ham
Agar biz o'rtacha hisobni shunday yozgan bo'lsak, o'rtacha ikki barobar deb e'lon qilinadi

bo'linish natijasi tayinlanmaguncha u qismning kasr qismini yo'qotadi


o'rtacha. Buning sababi, total va gradeCounter ikkala tamsayı va butun sondir
bo'linish butun sonli natijani beradi.
Aksariyat o'rtachalar butun sonlar emas (masalan, 0, –22 va 1024). Shu sababli, biz shunday deb nomlaymiz -
Ushbu misolda o'rtacha sinfni suzuvchi nuqtali raqam sifatida hisoblang. Suzuvchini bajarish uchun -
nuqtani butun son qiymatlari bilan hisoblash uchun biz bu qiymatlarni vaqtincha suzuvchi sifatida ko'rib chiqishimiz kerak.
hisoblashda foydalanish uchun nuqta raqamlari. Java unary cast operatorini ta'minlaydi:
bu vazifani bajaring. 4.10-rasmning 37-qatorida (ikki tomonlama) uzatish operatori — unar operator — foydalaniladi.
operand jamining vaqtinchalik suzuvchi nuqtali nusxasini yaratish uchun (o'ngda ko'rinadi
operatori). Translatsiya operatoridan shu tarzda foydalanish aniq konversiya yoki tur deb ataladi
quyish. Jami saqlangan qiymat hali ham butun sondir.
Hisoblash endi suzuvchi nuqta qiymatidan iborat (vaqtinchalik ikki nusxasi
jami) gradeCounter butun soniga bo'linadi. Java faqat arifmetik ifodalarni baholay oladi
operandlarning turlari bir xil bo'ladi. Buni ta'minlash uchun Java operatsiyani bajaradi
tanlangan operandlarda reklama (yoki yashirin konvertatsiya) deb ataladi. Masalan, a
int va double qiymatlarini o'z ichiga olgan ifoda, int qiymatlari ikki barobarga ko'tariladi
ifodada foydalanish uchun qiymatlar. Ushbu misolda gradeCounter qiymati ko'tarilgan
double kiritish uchun, keyin suzuvchi nuqtali bo'linish amalga oshiriladi va hisoblash natijasi
o'rtachaga tayinlanadi. Har qanday o'zgaruvchiga (ikki tomonlama) uzatish operatori qo'llanilsa
hisob, hisob ikki barobar natija beradi. Ushbu bobda keyinroq muhokama qilamiz
barcha ibtidoiy turlari. Siz 6.7-bo'limda reklama qoidalari haqida ko'proq bilib olasiz.

Cast operatori har qanday tur nomi atrofida qavslar qo'yish orqali hosil bo'ladi. Operator -


ator - unar operator (ya'ni, faqat bitta operandni qabul qiluvchi operator). Java ham qo'llab-quvvatlaydi
plyus (+) va minus (–) operatorlarining unar versiyalari, shuning uchun siz - kabi iboralarni yozishingiz mumkin.
7 yoki +5. Cast operatorlari o'ngdan chapga bog'lanadi va boshqalar bilan bir xil ustunlikka ega
unary operatorlar, masalan, unary + va unary -. Bu ustunlik undan bir daraja yuqori
multiplikativ operatorlardan *, / va %. (Operator ustunligi jadvaliga qarang
Ilova A.) Biz ustunligimizdagi yozuv (tur) bilan cast operatorini ko'rsatamiz
diagrammalar, har qanday turdagi nomdan cast operatorini yaratish uchun foydalanish mumkinligini ko'rsatish uchun.

Umumiy dasturlash xatosi 4.5


Blokni chegaralovchi qavslarni olib tashlash mantiqiy xatolarga olib kelishi mumkin, masalan, cheksiz tsikllar. Kimga
Ushbu muammoning oldini olish uchun ba'zi dasturchilar har bir boshqaruv bayonotining asosiy qismini o'z ichiga oladi
qavslar, hatto tanada faqat bitta bayonot mavjud bo'lsa ham.

ikki barobar o'rtacha = umumiy / gradeCounter;

Umumiy dasturlash xatosi 4.6
cast operatori int va kabi ibtidoiy sonli turlar o'rtasida konvertatsiya qilish uchun ishlatilishi mumkin
double va tegishli mos yozuvlar turlari o'rtasida (biz 10-bobda muhokama qilganimizdek, ob'ektga yo'naltirilgan-
Ed Dasturlash: Polimorfizm va interfeyslar). Noto'g'ri turga quyish sabab bo'lishi mumkin
kompilyatsiya xatolari yoki ish vaqti xatolari.

126 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

42-qator sinfning o'rtacha ko'rsatkichini ko'rsatadi. Ushbu misolda biz sinf o'rtacha yaxlitlanganini ko'rsatamiz
yuzdan bir qismigacha. Printf formatini boshqarish satridagi %.2f format aniqlovchisi
o'zgaruvchan o'rtacha qiymati ikki raqamga aniqlik bilan ko'rsatilishi kerakligini ta'kidlaydi
kasrning o'ng tomonida - format spetsifikatsiyasida.2 bilan ko'rsatilgan. Uch daraja
namunani bajarish paytida kiritilgan (4.10-rasm) jami 257, bu o'rtacha ko'rsatkichni beradi
85.666666…. Printf usuli qiymatni yaxlitlash uchun format aniqlagichidagi aniqlikdan foydalanadi
belgilangan raqamlar soniga. Ushbu dasturda o'rtacha ko'rsatkich hun-ga yaxlitlanadi.
dredths pozitsiyasi va 85.67 sifatida ko'rsatiladi.
Suzuvchi nuqtali raqamlarning aniqligi
Suzuvchi nuqtali raqamlar har doim ham 100% aniq emas, lekin ular juda ko'p qo'llanilishi mumkin.
lar. Misol uchun, biz 98,6 "normal" tana harorati haqida gapirganda, biz buni qilmaymiz
ko'p sonli raqamlar uchun aniq bo'lishi kerak. Biz termostatdagi haroratni o'qiganimizda -
metr 98,6 bo'lsa, u aslida 98,5999473210643 bo'lishi mumkin. Bu raqamga qo'ng'iroq qilish oddiygina 98.6
tana harorati bilan bog'liq ko'pgina ilovalar uchun juda mos keladi.
Suzuvchi nuqtali raqamlar ko'pincha bo'linish natijasida paydo bo'ladi, masalan, ushbu misolda
sinf o'rtacha hisobi. An'anaviy arifmetikada 10 ni 3 ga bo'lsak, natija bo'ladi
3.3333333…, 3s ketma-ketligi cheksiz takrorlanadi. Kompyuter faqat a ajratadi
Bunday qiymatni ushlab turish uchun belgilangan bo'sh joy miqdori, shuning uchun saqlangan suzuvchi nuqta qiymati aniq bo'lishi mumkin
faqat taxminiy bo'lishi kerak.
Suzuvchi nuqtali raqamlarning noaniq tabiati tufayli double turi afzallik beriladi
float turi ustida, chunki qo'sh o'zgaruvchilar suzuvchi nuqtali raqamlarni ko'proq ifodalashi mumkin
aniq. Shuning uchun biz kitob davomida birinchi navbatda double turidan foydalanamiz. Ba'zilarida
ilovalarda float va double o'zgaruvchilarning aniqligi etarli bo'lmaydi. Aniqlik uchun
suzuvchi nuqtali raqamlar (masalan, pul hisob-kitoblari uchun talab qilinadiganlar), Java taqdim etadi
sinf BigDecimal (java.math paketi), biz 8-bobda muhokama qilamiz.

4.11 Algoritmlarni shakllantirish: ichki o'rnatilgan boshqaruv bayonotlari


Keyingi misol uchun biz yana bir bor psevdokod va top--dan foydalanib algoritmni shakllantiramiz.
pastga, bosqichma-bosqich takomillashtirish va tegishli Java dasturini yozish. Biz buni ko'rdik -
trol bayonotlari bir-birining ustiga joylashtirilishi mumkin (ketma-ketlikda). Ushbu vaziyatni o'rganishda biz
Boshqaruv iboralarini ulashning yagona boshqa tuzilgan usulini ko'rib chiqing, ya'ni
bitta boshqaruv bayonotini boshqasiga joylashtirish.
Quyidagi muammo bayonotini ko'rib chiqing:
Kollej talabalarni ko'chmas mulkni litsenziyalash bo'yicha davlat imtihoniga tayyorlaydigan kursni taklif qiladi
brokerlar. O‘tgan yili ushbu kursni tamomlagan talabalardan o‘n nafari imtihon topshirdi. kol-
lege o'z o'quvchilari imtihonda qanchalik yaxshi o'tganini bilmoqchi. Sizdan a yozishni so'rashdi
natijalarni umumlashtirish dasturi. Sizga ushbu 10 nafar talabaning ro'yxati berildi. Yonidagi
Agar talaba imtihondan muvaffaqiyatli o'tgan bo'lsa, har bir ismga 1, agar talaba muvaffaqiyatsiz bo'lsa, 2 yoziladi.
Sizning dasturingiz imtihon natijalarini quyidagicha tahlil qilishi kerak:
1. Har bir test natijasini kiriting (ya'ni, 1 yoki 2). Ekranda "Natijani kiriting" xabarini ko'rsating
har safar dastur boshqa test natijasini so'raganda.

Umumiy dasturlash xatosi 4.7


Suzuvchi nuqtali raqamlarni ular aniq ifodalangan deb hisoblaydigan tarzda ishlatish mumkin
noto'g'ri natijalarga olib keladi.

4.11 Algoritmlarni shakllantirish: ichki o'rnatilgan boshqaruv bayonotlari 127

2. Har bir turdagi test natijalari sonini hisoblang.
3. Sinov natijalarining qisqacha mazmunini ko'rsating, bunda o'tgan talabalar soni va
muvaffaqiyatsizlikka uchragan raqam.
4. Agar sakkiz nafardan ortiq talaba imtihondan muvaffaqiyatli o'tgan bo'lsa, "O'qituvchiga bonus!"
Muammo bayonotini diqqat bilan o'qib chiqqach, biz quyidagi fikrlarni qilamiz:
1. Dastur 10 nafar talaba uchun test natijalarini qayta ishlashi kerak. Qarama-qarshi boshqariladigan halqa
foydalanish mumkin, chunki test natijalarining soni oldindan ma'lum.
2. Har bir test natijasi raqamli qiymatga ega — 1 yoki 2. Har safar testni oʻqiganida
Natijada, dastur 1 yoki 2 ekanligini aniqlashi kerak. Biz 1 ballni sinab ko'ramiz
algoritm. Agar raqam 1 bo'lmasa, biz uni 2 deb hisoblaymiz. (4.24-mashq).
bu taxminning oqibatlarini hisobga oladi.)
3. Imtihon natijalarini hisobga olish uchun ikkita hisoblagich qo'llaniladi - biri raqamlarni hisoblash uchun
imtihondan o'tgan talabalar soni va muvaffaqiyatsiz bo'lganlar sonini hisoblash uchun.
4. Dastur barcha natijalarni qayta ishlagandan so'ng, undan ko'p yoki ko'p emasligini hal qilishi kerak
sakkiz nafar talaba imtihondan o‘tdi.
Keling, yuqoridan pastga, bosqichma-bosqich takomillashtirishni davom ettiramiz. Biz pseudocode rep-dan boshlaymiz
yuqoridan norozilik:

Yana bir bor, yuqori qism dasturning to'liq ifodasidir, lekin bir nechta takomillashtirish


Psevdokod tabiiy ravishda Java dasturiga aylanishidan oldin kerak bo'lishi mumkin.
Bizning birinchi takomillashtirishimiz

Bu erda ham, biz butun dasturning to'liq vakiliga ega bo'lsak ham, bundan keyin


takomillashtirish zarur. Endi biz ma'lum o'zgaruvchilarga amal qilamiz. Qayta ishlash uchun hisoblagichlar kerak
o'tish va nosozliklarni bog'lang, aylanish jarayonini boshqarish uchun hisoblagich ishlatiladi va a
o'zgaruvchi foydalanuvchi ma'lumotlarini saqlash uchun kerak. Foydalanuvchi kiritishi bo'ladigan o'zgaruvchi
saqlangan algoritm boshida ishga tushirilmaydi, chunki uning qiymati foydalanuvchi tomonidan o'qiladi
tsiklning har bir iteratsiyasi davomida.
Pseudocode bayonoti

quyidagicha aniqlanishi mumkin:

E'tibor bering, algoritm boshida faqat hisoblagichlar ishga tushiriladi.
Pseudocode bayonoti

Imtihon natijalarini tahlil qiling va bonus to'lanishi kerakligini hal qiling

O'zgaruvchilarni ishga tushirish
10 ta imtihon natijalarini kiriting va o'tish va muvaffaqiyatsizliklarni hisoblang
Imtihon natijalarining qisqacha mazmunini chop eting va bonus to'lanishi kerakligini hal qiling

O'zgaruvchilarni ishga tushirish

O'tishlarni nolga aylantiring
Muvaffaqiyatsizliklarni nolga tenglashtiring
Talaba hisoblagichini birga boshlang

10 ta imtihon natijalarini kiriting va o'tish va muvaffaqiyatsizliklarni hisoblang


128 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

har bir imtihon natijasini ketma-ket kiritadigan tsiklni talab qiladi. Biz buni oldindan bilamiz
aniq 10 imtihon natijalari mavjud, shuning uchun qarama-qarshi nazorat ostida aylanish mos keladi. Ichkarida
loop (ya'ni, pastadir ichiga o'rnatilgan), ikki tomonlama tanlash strukturasi har biri yoki yo'qligini aniqlaydi
imtihon natijasi o'tish yoki muvaffaqiyatsiz bo'lib, tegishli hisoblagichni oshiradi. tozalash -
oldingi psevdokod bayonoti keyin

If…Else boshqaruv tuzilmasini ajratish uchun bo'sh satrlardan foydalanamiz, bu esa o'qishni yaxshilaydi.


Pseudocode bayonoti

quyidagicha aniqlanishi mumkin:

Psevdokodni ikkinchi marta takomillashtirish va sinf tahliliga o'tkazish
To'liq ikkinchi takomillashtirish 4.11-rasmda ko'rsatilgan. E'tibor bering, bo'sh qatorlar ham ishlatiladi
Dasturni o'qish uchun while strukturasini o'rnatish. Bu psevdokod hozir yetarli
Java-ga o'tkazish uchun yaxshilangan.

Talaba hisoblagichi 10 dan kichik yoki teng bo'lsa


Foydalanuvchiga keyingi imtihon natijasini kiritishni taklif qiling
Keyingi imtihon natijasini kiriting
Agar talaba o'tgan bo'lsa
O'tishlarga bitta qo'shing
Boshqa
Muvaffaqiyatsizliklarga bitta qo'shing
Talabalar hisoblagichiga bitta qo'shing

Imtihon natijalarining qisqacha mazmunini chop eting va bonus to'lanishi kerakligini hal qiling

O'tishlar sonini chop eting
Nosozliklar sonini chop eting
Sakkiz nafardan ortiq talaba o'tgan bo'lsa
“O‘qituvchiga bonus!” chop eting.

1 O'tishlarni nolga aylantiring


2 Nosozliklarni nolga tenglashtiring
3 Talaba hisoblagichini birga boshlang
4
5 Talaba hisoblagichi 10 dan kichik yoki teng bo'lsa
6 Foydalanuvchiga keyingi imtihon natijasini kiritishni taklif qiling
7 Keyingi imtihon natijasini kiriting
8
9 Agar talaba o'tgan bo'lsa
10 O'tishlarga bitta qo'shing
11 Boshqa
12 Muvaffaqiyatsizliklarga bitta qo'shing
13
14 Talaba hisoblagichiga bitta qo'shing

4.11-rasm | Tekshiruv natijalari muammosi uchun psevdokod. (2-qismning 1-qismi.)


4.11 Algoritmlarni shakllantirish: ichki o'rnatilgan boshqaruv bayonotlari 129

Pseudocode algoritmini va ikkita namunali bajarilishini amalga oshiradigan Java klassi
4.12-rasmda ko'rsatilgan. Asosiy satrning 13, 14, 15 va 22-qatorlari ishlatiladigan o'zgaruvchilarni e'lon qiladi.
imtihon natijalarini qayta ishlash.

15
16 O'tishlar sonini chop eting


17 Nosozliklar sonini chop eting
18
19 Sakkiz nafardan ortiq talaba o'tgan bo'lsa
20 "O'qituvchiga bonus!"

Xatolarning oldini olish bo'yicha maslahat 4.5


Mahalliy o'zgaruvchilar e'lon qilinganda ularni ishga tushirish har qanday kompilyatsiya xatolaridan qochishga yordam beradi
ishga tushirilmagan o'zgaruvchilardan foydalanishga urinishlar natijasida paydo bo'lishi mumkin. Java talab qilmasa ham
mahalliy o'zgaruvchan initsializatsiyalar deklaratsiyalarga kiritilishini talab qiladi
mahalliy o'zgaruvchilar ularning qiymatlari ifodada ishlatilishidan oldin ishga tushirilishi kerak.

1 // 4.12-rasm: Analysis.java


2 // Ichki nazorat bayonotlari yordamida imtihon natijalarini tahlil qilish.
3 import java.util.Scanner; // sinf Scanner sinfidan foydalanadi
4
5 Ommaviy sinf tahlili
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // buyruqlar oynasidan ma'lumot olish uchun Skaner yarating
10 Skaner kiritish = yangi Skaner(System.in);
11
12
13
14
15
16
17 // qarama-qarshi boshqariladigan pastadir yordamida 10 talabani qayta ishlash
18 vaqt (studentCounter <= 10)
19 {
20 // foydalanuvchini kiritishni so'raydi va foydalanuvchidan qiymatni oladi
21 System.out.print("Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): ");
22 int natijasi = input.nextInt();
23
24
25
26
27
28
29

4.12-rasm | Ichki nazorat bayonotlari yordamida imtihon natijalarini tahlil qilish. (2-qismning 1-qismi.)

4.11-rasm | Tekshiruv natijalari muammosi uchun psevdokod. (2-qismning 2-qismi.)

// deklaratsiyalarda o'zgaruvchilarni ishga tushirish


int o'tishlari = 0;
int nosozliklari = 0;
int studentCounter = 1;

// if...else while operatorida joylashtirilgan


agar (natija == 1)
o'tish = o'tish + 1;
boshqa
muvaffaqiyatsizliklar = muvaffaqiyatsizliklar + 1;

130 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

while iborasi (18-32-qatorlar) 10 marta aylanadi. Har bir iteratsiya paytida, pastadir
bitta imtihon natijasini kiritadi va qayta ishlaydi. E'tibor bering, if...else iborasi (25–28-qatorlar)
qayta ishlash uchun har bir natija while ifodasiga joylashtirilgan. Agar natija 1 bo'lsa, agar ... boshqacha
bayonotning o'sishi; aks holda, u natijani 2 deb hisoblaydi va o'sishlar muvaffaqiyatsiz bo'ladi
urlar. 31-qator satrda tsikl sharti qayta tekshirilishidan oldin studentCounter sonini oshiradi
18. 10 ta qiymat kiritilgandan so'ng, tsikl tugaydi va 35-satrda raqam ko'rsatiladi.
o'tishlar va muvaffaqiyatsizliklar. 38–39-qatorlardagi if iborasi ko'p yoki ko'p emasligini aniqlaydi
sakkiz talaba imtihondan o'tdi va agar shunday bo'lsa, "O'qituvchiga bonus!" xabarini chiqaradi.

30 // studentCounter ni oshiring, shuning uchun tsikl tugaydi


31 studentCounter = studentCounter + 1;
32 }
33
34 // tugatish bosqichi; natijalarni tayyorlash va namoyish qilish
35
36
37
38
39
40 }
41 } // yakuniy sinf tahlili

Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1


Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 2
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
O'tdi: 9
Muvaffaqiyatsiz: 1
O'qituvchiga bonus!

Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1


Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 2
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 2
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 2
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 2
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
Natijani kiriting (1 = o'tish, 2 = muvaffaqiyatsiz): 1
O'tdi: 6
Muvaffaqiyatsiz: 4

4.12-rasm | Ichki nazorat bayonotlari yordamida imtihon natijalarini tahlil qilish. (2-qismning 2-qismi.)

System.out.printf("O'tdi: %d%nMuvaffaqiyatsiz: %d%n", o'tishlar, muvaffaqiyatsizliklar);

// 8 dan ortiq talaba o'tganligini aniqlash


agar (> 8 o'tsa)
System.out.println("O'qituvchiga bonus!");

4.12 Murakkab tayinlash operatorlari 131

4.12-rasmda dasturning ikkita namunaviy bajarilishidan kirish va chiqish ko'rsatilgan.
Birinchisida, asosiy usulning 38-qatoridagi shart to'g'ri - sakkizdan ortiq stu-
dents imtihondan o'tdi, shuning uchun dastur o'qituvchiga bonus berish uchun xabar chiqaradi.

4.12 Murakkab tayinlash operatorlari


Murakkab belgilash operatorlari tayinlash ifodalarini qisqartiradi. kabi bayonotlar

Bu erda operator +, -, *, / yoki % ikkilik operatorlaridan biri (yoki boshqalarni keyinroq muhokama qilamiz


matn) shaklida yozilishi mumkin

Misol uchun, siz bayonotni qisqartirishingiz mumkin

qo'shish birikmasini belgilash operatori bilan +=, kabi

+= operatori o'zining o'ng tomonidagi ifoda qiymatini on o'zgaruvchining qiymatiga qo'shadi


uning chap tomoni va natijani operatorning chap tomonidagi o'zgaruvchida saqlaydi. Shunday qilib, topshiriq
c += 3 ifodasi c ga 3 ni qo'shadi. 4.13-rasmda arifmetik birikma topshirig'i ko'rsatilgan.
eratorlar, operatorlar yordamida namunali iboralar va operatorlar nima qilishlari haqida tushuntirishlar.

4.13 O'stirish va kamaytirish operatorlari


Java 1 ni qo'shish yoki ayirish uchun ikkita unar operatorni taqdim etadi (4.14-rasmda umumlashtirilgan).
Raqamli o'zgaruvchining qiymatidan 1. Bular birlik o'sish operatori, ++ va
birlik kamaytiruvchi operator, --. Dastur o'zgaruvchining qiymatini 1 ga oshirishi mumkin
c = c + 1 yoki c += 1 ifodasidan ko'ra ++ o'sish operatori yordamida c deb ataladi.
O'zgaruvchining oldiga qo'yilgan (oldinga qo'yilgan) oshirish yoki kamaytirish operatoriga havola qilinadi.
mos ravishda prefiksni oshirish yoki prefiksni kamaytirish operatori sifatida. O'sish yoki
o'zgaruvchiga postfiks qo'yilgan (keyin qo'yilgan) kamaytirish operatori postfiks deb ataladi.
mos ravishda oshirish yoki postfiksni kamaytirish operatori.

o'zgaruvchi = o'zgaruvchi operator ifodasi;

o'zgaruvchi operator= ifoda;

c = c + 3;

c += 3;

Tayinlash operatori Namuna ifodasi Tushuntirish

Faraz qilaylik: int c = 3, d = 5, e = 4, f = 6, g = 12;
+= c += 7 c = c + 7 10 dan c gacha
-= d -= 4 d = d - 4 1 dan d gacha
*= e *= 5 e = e * 5 20 dan e gacha
/= f /= 3 f = f / 3 2 dan f gacha
%= g %= 9 g = g % 9 3 dan g gacha

4.13-rasm | Arifmetik birikma belgilash operatorlari.


132 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

1 ga qo'shish (yoki 1 ni ayirish) uchun o'stirish (yoki kamaytirish) operatoridan foydalanish
o'zgaruvchini oldindan oshirish (yoki oldindan kamaytirish) deb nomlanadi. Bu o'zgaruvchiga sabab bo'ladi
1 ga oshirilsin (kamaytirilsin); keyin o'zgaruvchining yangi qiymati ishlatiladi
qaysi ifodada namoyon bo'ladi. Qo'shish uchun postfiks oshirish (yoki kamaytirish) operatoridan foydalanish
1 ga (yoki 1 ni ayirish) o'zgaruvchiga postincrementing (yoki postdecrementing) deb nomlanadi.
Bu o'zgaruvchining joriy qiymati u joylashgan ifodada ishlatilishiga olib keladi
paydo bo'ladi; keyin o'zgaruvchining qiymati 1 ga oshiriladi (kamaytiriladi).

Prefiksni oshirish va postfiksni oshirish operatorlari o'rtasidagi farq


4.15-rasmda prefiks ortishi va postfiks ortishi o'rtasidagi farq ko'rsatilgan.
++ oshirish operatorining mentli versiyalari. Dekrement operatori (--) xuddi shunday ishlaydi.
9-satr c o'zgaruvchisini 5 ga initsializatsiya qiladi va 10-satr c ning boshlang'ich qiymatini chiqaradi. 11-qator -
c++ ifoda qiymatini qo'yadi. Bu ifoda c o'zgaruvchisini postincrements, shuning uchun c
asl qiymati (5) chiqariladi, keyin c qiymati ortadi (6 ga). Shunday qilib, 11-qator c ni chiqaradi
boshlang'ich qiymati (5) yana. 12-satr o'zgaruvchining qiymatini isbotlash uchun c ning yangi qiymatini (6) chiqaradi
haqiqatan ham 11-qatorda oshirildi.
17-qator c qiymatini 5 ga qaytaradi va 18-satr c qiymatini chiqaradi. 19-qator qiymatni chiqaradi
++c ifodasi. Bu ifoda c ni oldindan oshiradi, shuning uchun uning qiymati ortadi; keyin
yangi qiymat (6) chiqariladi. 20-qator c ning qiymatini ko'rsatish uchun yana c qiymatini chiqaradi
19-satr bajarilgandan keyin hali ham 6.

Operator


Operator
nomi

Namuna
ifoda tushuntirish

++ prefiksi
oshirish

++a a ni 1 ga oshiring, keyin yangi qiymatdan foydalaning


a joylashgan ifodadagi a ning.

++ postfiks


oshirish

a++ Ifodada a ning joriy qiymatidan foydalaning


unda a joylashgan, keyin a ni 1 ga oshiring.

-- prefiks


kamaytirish

--b b ni 1 ga kamaytiring, keyin yangi qiymatdan foydalaning


b joylashgan ifodadagi b ning.

-- postfiks


kamaytirish

b-- Ifodada b ning joriy qiymatidan foydalaning


b joylashgan bo'lsa, b ni 1 ga kamaytiring.

4.14-rasm | O'stirish va kamaytirish operatorlari.

Yaxshi dasturlash amaliyoti 4.4
Ikkilik operatorlardan farqli o'laroq, unarli oshirish va kamaytirish operatorlari joylashtirilishi kerak
ularning operandlari yonida, intervalgacha bo'shliqlarsiz.

1 // 4.15-rasm: Increment.java


2 // Prefiks oshirish va postfiks oshirish operatorlari.
3
4 ommaviy sinf o'sishi
5 {

4.15-rasm | Prefiks ortishi va postfiks ortishi operatorlari. (2-qismning 1-qismi.)


4.13 O'stirish va kamaytirish operatorlari 133

Arifmetik birikma bilan ifodalarni soddalashtirish
Operatorlarni kamaytirish
Arifmetik birikma tayinlash operatorlari va oshirish va kamaytirish operatorlari.
atorlardan dastur bayonotlarini soddalashtirish uchun foydalanish mumkin. Masalan, uchta topshiriq holati-
4.12-rasm (26, 28 va 31-qatorlar)

kabi birikma belgilash operatorlari bilan ixchamroq yozilishi mumkin

kabi prefiks oshirish operatorlari bilan

yoki postfiks oshirish operatorlari bilan

6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // postfiksni oshirish operatorini ko'rsatish
9 int c = 5;
10 System.out.printf("c postincrementdan oldin: %d%n", c); // chop etadi 5
11
12
13
14 System.out.println(); // qatorni o'tkazib yuborish
15
16 // prefiksni oshirish operatorini ko'rsatish
17 c = 5;
18 System.out.printf(" c oldingi o'sishdan oldin: %d%n", c); // chop etadi 5
19
20
21 }
22 } // end sinf O'sish

c postincrementdan oldin: 5


postincrementing c: 5
c postincrementdan keyin: 6

c oldingi o'sishdan oldin: 5


Oldindan oshirish c: 6
c oldingi o'sishdan keyin: 6

o'tish = o'tish + 1;


muvaffaqiyatsizliklar = muvaffaqiyatsizliklar + 1;
studentCounter = studentCounter + 1;

o'tadi += 1;


nosozliklar += 1;
studentCounter += 1;

++o'tadi;


++muvaffaqiyatsizliklar;
++studentCounter;

o'tadi++;


muvaffaqiyatsizliklar ++;
studentCounter++;

4.15-rasm | Prefiks ortishi va postfiks ortishi operatorlari. (2-qismning 2-qismi.)

System.out.printf(" postincrementing c: %d%n", c++); // chop etadi 5
System.out.printf(" postincrementdan keyin c: %d%n", c); // chop etadi 6

System.out.printf("oldindan oshirish c: %d%n", ++c); // chop etadi 6


System.out.printf(" Oldindan oshirilgandan keyin c: %d%n", c); // chop etadi 6

134 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

Ko'rsatmalardagi o'zgaruvchini o'z-o'zidan oshirish yoki kamaytirishda prefiks
o'sish va postfiks o'sish shakllari bir xil ta'sirga ega va prefiks kamaytiruvchi va
postfiksni kamaytirish shakllari bir xil ta'sirga ega. Bu faqat konfiguratsiyada o'zgaruvchi paydo bo'lganda.
o'zgaruvchini oldindan o'stirish va oshirishdan keyin ega bo'lgan kattaroq ifoda matni
turli effektlar (va shunga o'xshash, oldingi va postdekrementing uchun).

Operatorning ustuvorligi va assotsiativligi


4.16-rasmda biz kiritgan operatorlarning ustuvorligi va assotsiativligi ko'rsatilgan.
Ular yuqoridan pastga qarab kamayib boruvchi ustuvorlik tartibida ko'rsatiladi. Ikkinchi ustun
har bir ustunlik darajasida operatorlarning assotsiativligini tavsiflaydi. Shartli op-
tuzatuvchi (?:); birlik operatorlar oshirish (++), kamaytirish (--), ortiqcha (+) va minus (-);
cast operatorlari va tayinlash operatorlari =, +=, -=, *=, /= va %= o'ngdan bog'lanadi
chapga. 4.16-rasmdagi operator ustunligi diagrammasidagi barcha boshqa operatorlar dan bog'lanadi
chapdan o'ngga. Uchinchi ustunda har bir operator guruhining turi ko'rsatilgan.

4.14 Primitiv tiplar


D-ilovadagi jadvalda Java-ning sakkizta ibtidoiy turlari keltirilgan. O'zidan oldingi lan-
C va C++ tillarida Java barcha o'zgaruvchilarning turiga ega bo'lishini talab qiladi. Shuning uchun Java tiliga murojaat qilinadi
kuchli terilgan til sifatida.

Umumiy dasturlash xatosi 4.8


Birdan boshqa ifodada oshirish yoki kamaytirish operatoridan foydalanishga urinish
qiymat tayinlanishi mumkin bo'lgan sintaksis xatosi. Masalan, ++(x + 1) yozish sintaksisdir
xato, chunki (x + 1) o'zgaruvchi emas.

Yaxshi dasturlash amaliyoti 4.5


Oldini yozishda operator ustunligi va assotsiativlik jadvaliga (A ilovasiga) qarang.
ko'p operatorlarni o'z ichiga olgan presslar. Ifodadagi operatorlar mos ekanligini tasdiqlang
siz kutgan tartibda shakllantiriladi. Agar siz a da baholash tartibiga ishonchingiz komil bo'lmasa
murakkab ifoda, ifodani kichikroq iboralarga ajrating yoki majburlash uchun qavslardan foydalaning
baholash tartibi, xuddi algebraik ifodada qilganingizdek. Kuzatishga ishonch hosil qiling
tayinlash (=) kabi ba'zi operatorlar chapdan o'ngga emas, balki o'ngdan chapga bog'lanadi.

Operatorlar assotsiativligi turi

++ -- o'ngdan chapga unar postfiks
++ -- + - (turi) o'ngdan chapga unar prefiks
* /% chapdan o'ngga multiplikativ
+ - chapdan o'ngga qo'shimcha
< <= > >= chapdan o'ngga relyatsion
== != chapdan o'ngga tenglik
?: o'ngdan chapga shartli
= += -= *= /= %= o'ngdan chapga tayinlash

4.16-rasm | Hozirgacha muhokama qilingan operatorlarning ustuvorligi va assotsiativligi.


4.15 (ixtiyoriy) GUI va grafik misollar: oddiy chizmalar yaratish 135

C va C++ tillarida dasturchilar ko'pincha dasturlarning alohida versiyalarini yozishlari kerak bo'ladi
turli kompyuter platformalarini qo'llab-quvvatlash, chunki ibtidoiy turlari kafolatlanmaydi
kompyuterdan kompyuterga bir xil bo'lishi kerak. Masalan, bitta mashinada int bo'lishi mumkin
16 bit (2 bayt) xotira bilan, ikkinchi mashinada 32 bit (4 bayt) bilan ifodalanadi va
boshqa mashinada 64 bit (8 bayt). Java-da int qiymatlari har doim 32 bit (4 bayt) bo'ladi.

Ilova Ddagi har bir tur o'z o'lchami bilan bitlarda berilgan (bir baytga sakkiz bit bor)


va uning qiymatlari diapazoni. Java dizaynerlari portativlikni ta'minlashni xohlashgani uchun ular foydalanadilar
belgilar formatlari uchun xalqaro tan olingan standartlar (Unicode; qo'shimcha ma'lumot uchun
www.unicode.org) va suzuvchi nuqta raqamlari (IEEE 754; qo'shimcha ma'lumot uchun)
grouper.ieee.org/groups/754/ saytiga tashrif buyuring).
3.2-bo'limdan esda tutingki, ibtidoiy turdagi o'zgaruvchilar usuldan tashqarida e'lon qilingan
sinfning misol o'zgaruvchilari, agar aniq belgilanmagan bo'lsa, avtomatik ravishda standart qiymatlarni tayinlaydi.
bog'langan. char, bayt, short, int, long, float va double tipidagi misol o'zgaruvchilari hammasi
sukut bo'yicha 0 qiymati berilgan. Boolean tipidagi misol o'zgaruvchilariga false qiymati beriladi
avvalboshdan. Malumot turidagi misol o'zgaruvchilari sukut bo'yicha null qiymatiga ishga tushiriladi.
4.15 (ixtiyoriy) GUI va grafik misollar: yaratish
Oddiy chizmalar
Java-ning jozibador xususiyati uning grafik qo'llab-quvvatlashidir, bu sizni vizual ravishda yaxshilash imkonini beradi
ilovalaringiz. Endi biz Java-ning grafik imkoniyatlaridan birini - chizilgan chiziqlarni tanishtiramiz.
Shuningdek, u kompyuter ekranida chizmani ko'rsatish uchun oyna yaratish asoslarini ham o'z ichiga oladi.
Java koordinata tizimi
Java-da chizish uchun siz Java-ning koordinata tizimini tushunishingiz kerak (4.17-rasm).
ekrandagi nuqtalarni aniqlash. Odatiy bo'lib, GUI komponentining yuqori chap burchagi
koordinatalariga ega (0, 0). Koordinatalar juftligi x-koordinatadan (gorizont-
tal koordinata) va y-koordinata (vertikal koordinata). x-koordinata - bu hor-
izontal joylashuvi chapdan o'ngga siljiydi. Y-koordinata - bu harakatlanuvchi vertikal joy
yuqoridan pastgacha. X o'qi har bir gorizontal koordinatani, y o'qi esa har birini tavsiflaydi
vertikal koordinata. Koordinatalar ekranda grafiklar qayerda ko'rsatilishi kerakligini ko'rsatadi.
Koordinata birliklari piksellarda o'lchanadi. Piksel atamasi "rasm elementi" degan ma'noni anglatadi. A
piksel displey monitorining eng kichik ruxsat birligidir.

Portativlik bo'yicha maslahat 4.1


Java-ning ibtidoiy turlari Java-ni qo'llab-quvvatlaydigan barcha kompyuter platformalarida portativdir.

4.17-rasm | Java koordinata tizimi. Birliklar piksellarda o'lchanadi.

(0, 0)

+y (x,y)


+x

y o'qi


x o'qi

136 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

Birinchi chizilgan dastur
Bizning birinchi chizma dasturimiz oddiygina ikkita chiziq chizadi. Class DrawPanel (4.18-rasm) boshiga
haqiqiy chizmani hosil qiladi, DrawPanelTest klassi esa (4.19-rasm) o'chirish uchun oyna yaratadi.
chizmani o'ynang. DrawPanel sinfida 3-4-qatorlardagi import bayonotlari bizga foydalanishga imkon beradi
Grafika sinfi (java.awt to'plamidan), unda turli xil chizish usullari mavjud
ekranga matn va shakllar va JPanel klassi (javax.swing paketidan)
Biz chizishimiz mumkin bo'lgan maydonni ko'rsatadi.

1 // 4.18-rasm: DrawPanel.java


2 // Panelning burchaklarini ulash uchun drawLine-dan foydalanish.
3
4
5
6
7 {
8 // panel burchaklaridan X belgisini chizadi
9
10 {
11 // panel to'g'ri ko'rsatilishini ta'minlash uchun paintComponent-ga qo'ng'iroq qiling
12
13
14
15
16
17 // yuqori chapdan pastki o'ngga chiziq torting
18
19
20 // pastki chapdan yuqori o'ngga chiziq torting
21
22 }
23 } // DrawPanel klassining oxiri

4.18-rasm | Panelning burchaklarini ulash uchun drawLine-dan foydalanish.

1 // 4.19-rasm: DrawPanelTest.java
2 // DrawPanel ko'rsatish uchun JFrame yaratish.
3
4
5 ochiq sinf DrawPanelTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // bizning chizmamizni o'z ichiga olgan panelni yarating
10 DrawPanel paneli = yangi DrawPanel();
11
12 // panelni ushlab turish uchun yangi ramka yarating
13
14
15 // ramka yopilganda chiqish uchun sozlash
16

4.19-rasm | DrawPanel-ni ko'rsatish uchun JFrame yaratish. (2-qismning 1-qismi.)

import java.awt.Graphics;
import javax.swing.JPanel;

umumiy sinf DrawPanel JPanel-ni kengaytiradi

public void paintComponent (Grafika g)

super.paintComponent(g);

int kengligi = getWidth(); // umumiy kenglik
int balandligi = getHeight(); // umumiy balandlik

g.drawLine(0, 0, kenglik, balandlik);

g.drawLine(0, balandlik, kenglik, 0);

import javax.swing.JFrame;

JFrame ilovasi = yangi JFrame();

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


4.15 (ixtiyoriy) GUI va grafik misollar: oddiy chizmalar yaratish 137

6-qatorda DrawPanel sinfi kengaytirilgan tur ekanligini ko'rsatish uchun extensions kalit so'zidan foydalaniladi
JPanel. extensions kalit so'zi meros munosabati deb ataladigan narsani anglatadi
bizning yangi DrawPanel sinfimiz sinfdagi mavjud a'zolar (ma'lumotlar va usullar) bilan boshlanadi
JPanel. DrawPanel meros qilib olgan sinf JPanel kalit so'zning o'ng tomonida ko'rinadi
uzaytiradi. Ushbu meros munosabatlarida JPanel superklass deb ataladi va DrawPanel
pastki sinf deb ataladi. Bu atributlarga (ma'lumotlarga) ega bo'lgan DrawPanel sinfiga olib keladi va
JPanel sinfining xatti-harakatlari (usullari), shuningdek Draw-ga qo'shayotgan yangi xususiyatlar -
Panel sinfi deklaratsiyasi - xususan, diagonallar bo'ylab ikkita chiziq chizish qobiliyati
panel. Meros 9-bobda batafsil tushuntirilgan. Hozircha siz bizni taqlid qilishingiz kerak
O'zingizning grafik dasturlaringizni yaratishda DrawPanel klassi.
PaintComponent usuli
Har bir JPanel, jumladan DrawPanel, paintComponent usuliga ega (9–22-qatorlar),
DrawPanel-ni ko'rsatish uchun tizim har safar avtomatik ravishda qo'ng'iroq qiladi. Usul
paintComponent 9-qatorda ko'rsatilganidek e'lon qilinishi kerak - aks holda tizim qo'ng'iroq qilmaydi
bu. Ushbu usul JPanel ekranda birinchi marta ko'rsatilganda, u qoplanganda chaqiriladi
keyin ekrandagi oyna tomonidan ochiladi va u paydo bo'lgan oyna qachon bo'lsa
hajmi o'zgartirildi. PaintComponent usuli bitta argumentni, ya'ni Grafik ob'ektini talab qiladi.
PaintComponentni chaqirganda tizim tomonidan ed. Ushbu Grafik ob'ekti chiziqlar chizish uchun ishlatiladi,
to'rtburchaklar, tasvirlar va boshqa grafikalar.
Siz yaratgan har bir paintComponent usulidagi birinchi bayonot har doim bo'lishi kerak

Bu panelni chizishni boshlashdan oldin to'g'ri ko'rsatilishini ta'minlaydi. Keyingisi,


DrawPanel klassi JPanel'dan meros bo'lib qolgan 14-15 qatorlar chaqiruv usullari. Chunki DrawPanel
JPanel-ni kengaytirsa, DrawPanel JPanel-ning har qanday umumiy usullaridan foydalanishi mumkin. GetWidth usullari
va getHeight mos ravishda JPanel kengligi va balandligini qaytaradi. 14-15 qatorlar bularni saqlaydi
mahalliy o'zgaruvchilar kengligi va balandligidagi qiymatlar. Nihoyat, 18 va 21 qatorlar Grafikadan foydalanadi
ikki chiziq chizish uchun drawLine usulini chaqirish uchun g o'zgaruvchisi. DrawLine usuli chiziq chizadi

17
18


19
20
21 }
22 } // yakuniy sinf DrawPanelTest

super.paintComponent(g);

4.19-rasm | DrawPanel-ni ko'rsatish uchun JFrame yaratish. (2-qismning 2-qismi.)

application.add(panel); // panelni ramkaga qo'shing


application.setSize(250, 250); // ramka o'lchamini o'rnating
application.setVisible(rost); // ramkani ko'rinadigan qilish

138 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

uning to'rt argumenti bilan ifodalangan ikki nuqta o'rtasida. Birinchi ikkita argument x-
va bitta so'nggi nuqta uchun y-koordinatalari va oxirgi ikkita argumentlar uchun koordinatalar
boshqa yakuniy nuqta. Agar siz oynaning o'lchamini o'zgartirsangiz, chiziqlar mos ravishda masshtablanadi, chunki argu-
mentlar panelning kengligi va balandligiga asoslanadi. Ushbu ilovada oyna hajmini o'zgartirish
katyon tizimni DrawPanel tarkibini qayta chizish uchun paintComponent-ni chaqirishga majbur qiladi.

DrawPanelTest sinfi


DrawPanel-ni ekranda ko'rsatish uchun uni oynaga joylashtirishingiz kerak. Siz g'alaba qozonasiz -
JFrame sinfidagi ob'ekt bilan dow. DrawPanelTest.java da (4.19-rasm), 3-qator import qilinadi
javax.swing paketidan JFrame sinfi. Asosiy 10-qator DrawPanel obyektini yaratadi,
unda bizning chizmamiz mavjud va 13-qator ushlab turishi va ko'rsatishi mumkin bo'lgan yangi JFrame-ni yaratadi
bizning panelimiz. 16-qator argument bilan JFrame usuli setDefaultCloseOperation ni chaqiradi
JFrame.EXIT_ON_CLOSE ilova foydalanuvchi qachon tugashi kerakligini bildiradi
oynani yopadi. 18-qator DrawPanel-ni biriktirish uchun JFrame sinfining qo'shish usulidan foydalanadi
JFrame. 19-qator JFrame hajmini belgilaydi. setSize usuli ikkita parametrni oladi
mos ravishda JFrame kengligi va balandligini ifodalaydi. Nihoyat, 20-qator ko'rsatiladi
JFrame o'zining setVisible usulini true argumenti bilan chaqiradi. JFrame qachon
ko'rsatilganda DrawPanel'ning paintComponent usuli (4.18-rasmning 9–22-qatorlari) bilvosita ko'rsatilgan.
chaqiriladi va ikkita chiziq chiziladi (4.19-rasmdagi namunaviy chiqishlarga qarang). Oʻlchamini oʻzgartirib koʻring
oynasi chiziqlar har doim oynaning joriy kengligi va balandligi asosida chizilganligini ko'rish uchun oyna.

GUI va grafik misollarni o'rganish mashqlari


4.1 Chiziqlarni chizish uchun halqalar va boshqaruv iboralaridan foydalanish ko'plab qiziqarli dizaynlarga olib kelishi mumkin.
a) 4.20-rasmdagi chap ekran tasvirida dizaynni yarating. Ushbu dizayn dan chiziqlar tortadi
yuqori chap burchakda, panelning yuqori chap yarmini qoplamaguncha ularni shamollating.
Bir yondashuv - kenglik va balandlikni teng miqdordagi qadamlarga bo'lish (biz topdik
15 qadam yaxshi ishladi). Chiziqning birinchi oxirgi nuqtasi har doim yuqori chap burchakda bo'ladi
(0, 0). Ikkinchi oxirgi nuqtani pastki chap burchakdan boshlab topish mumkin va
bir vertikal qadam yuqoriga va o'ngga bir gorizontal qadam. Ikkisi o'rtasida chiziq torting
so'nggi nuqtalar. Har bir ketma-ket yakunni topish uchun bir qadam yuqoriga va o'ngga o'tishda davom eting.
nuqta. Oyna o'lchamini o'zgartirganda, rasm mos ravishda o'lchanishi kerak.

4.20-rasm | Burchakdan yelpig'ich chiziqlar.


4.16 Yakunlash 139

b) O'ng ekranda ko'rsatilganidek, (a) qismini barcha to'rt burchakdan chiziqlar chiqib ketishi uchun o'zgartiring
4.20-rasmni qo'lga olish. Qarama-qarshi burchaklardagi chiziqlar o'rta bo'ylab kesishishi kerak.
4.2 4.21-rasmda while looplari va drawLine yordamida yaratilgan ikkita qo'shimcha dizayn ko'rsatilgan.
a) 4.21-rasmdagi chap ekran tasvirida dizaynni yarating. Har bir chetini bo'lish bilan boshlang
teng sonli o'sishga (biz yana 15 tani tanladik). Birinchi qator yuqoridan boshlanadi -
chap burchak va pastki chetida bir qadam o'ngga tugaydi. Har bir keyingi qator uchun harakatlaning
chap chetida bir qadam pastga va pastki chetida o'ng bir qadam. Con-
pastki o'ng burchakka yetguncha chizilgan chiziqlarni davom ettiring. Rasm o'lchami kabi bo'lishi kerak
so'nggi nuqtalar har doim qirralarga tegishi uchun oynaning o'lchamini o'zgartirasiz.
b) Javobingizni (a) qismida ko'rsatilganidek, dizaynni to'rtta burchakda aks ettirish uchun o'zgartiring
4.21-rasmning o'ng ekran tasviri.

4.16 Yakunlash


Ushbu bobda sinflarni qurish va ishlab chiqish usullari uchun asosiy muammolarni hal qilish ko'rsatilgan
bu sinflar uchun. Biz algoritmni qanday qurishni ko'rsatdik (ya'ni
muammoni hal qilish), keyin psevdokodning bir necha bosqichlari orqali algoritmni qanday takomillashtirish
ishlab chiqish, natijada metodning bir qismi sifatida bajarilishi mumkin bo'lgan Java kodi. bob
aniq harakatlarni rejalashtirish uchun yuqoridan pastga, bosqichma-bosqich takomillashtirishdan qanday foydalanishni ko'rsatdi
usul bajarilishi kerak va usul bu harakatlarni bajarishi kerak bo'lgan tartib.
Boshqaruv tuzilmalarining faqat uchta turi mavjud - ketma-ketlik, tanlash va takrorlash
har qanday muammoni hal qilish algoritmini ishlab chiqish uchun zarur. Xususan, ushbu bob ko'rsatilgan
if bitta tanlash operatori, if…else ikkilamchi tanlash operatori va while
takrorlash bayonoti. Bu yechimlarni qurish uchun ishlatiladigan qurilish bloklarining ba'zilari
ko'p muammolar. Jami va o'rtachani hisoblash uchun biz nazorat-bayon stackingdan foydalandik
Qarama-qarshi va qo'riqchi tomonidan boshqariladigan takrorlash bilan o'quvchilar baholari to'plami va biz konstitutsiyadan foydalandik.
imtihon natijalari to'plami asosida tahlil qilish va qarorlar qabul qilish uchun trol-bayonot uyasi. Biz
Java ning murakkab tayinlash operatorlari va uni oshirish va kamaytirish operatsiyalarini taqdim etdi.
mualliflar. Va nihoyat, biz Java-ning ibtidoiy turlarini muhokama qildik. 5-bobda biz munozarani davom ettiramiz -
for, do…while va switch iboralarini kiritgan holda boshqaruv iboralari.

4.21-rasm | Ilgaklar va DrawLine bilan chizilgan rasm.


140 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar



Xulosa
4.1-bo'lim Kirish
• Muammoni hal qilish uchun dastur yozishdan oldin, siz uni to'liq tushunib olishingiz kerak
muammo va uni hal qilish uchun puxta rejalashtirilgan yondashuv. Binoni ham tushunishingiz kerak
mavjud bo'lgan va tasdiqlangan dastur-qurilish texnikasidan foydalanadigan bloklar.
4.2-bo'lim Algoritmlar
• Har qanday hisoblash muammosini muayyan tartibda bir qator harakatlarni (102-bet) bajarish orqali hal qilish mumkin.
• Bajariladigan harakatlar va ularni bajarish tartibi nuqtai nazaridan muammoni hal qilish tartibi
bajarish algoritm deb ataladi (102-bet).
• Dasturda operatorlarning bajarilish tartibini belgilash dastur boshqaruvi deyiladi (102-bet).
4.3-bo'lim Psevdokod
• Pseudocode (103-bet) - bu norasmiy til bo‘lib, u sizga algoritmlarsiz ishlab chiqishda yordam beradi.
Java tili sintaksisining qat'iy tafsilotlari haqida tashvishlanish.
• Ushbu kitobda biz ishlatadigan psevdokod kundalik ingliz tiliga o'xshaydi — bu qulay va foydalanuvchi
do'stona, lekin bu haqiqiy kompyuter dasturlash tili emas. Siz, albatta, o'zingizdan foydalanishingiz mumkin
O'zingizning psevdokodingizni ishlab chiqish uchun o'z ona til(lar)ingiz.
• Pseudocode dasturni dasturlash tiliga yozishdan oldin uni “o‘ylab ko‘rishga” yordam beradi.
guage, masalan, Java.
• Ehtiyotkorlik bilan tayyorlangan psevdokodni mos keladigan Java dasturiga osongina aylantirish mumkin.
4.4-bo'lim Boshqarish tuzilmalari
• Odatda, dasturdagi operatorlar ketma-ket ketma-ket bajariladi
yozilgan. Bu jarayon ketma-ket bajarilish deb ataladi (103-bet).
• Har xil Java bayonotlari keyingi bajarilishi kerak bo'lgan bayonot shart emasligini belgilash imkonini beradi
navbatdagisi. Bu boshqaruvni uzatish deb ataladi (103-bet).
• Bom va Yakopini barcha dasturlarni faqat uchta nazorat nuqtai nazaridan yozish mumkinligini ko'rsatdi
tuzilmalar (103-bet) — ketma-ketlik strukturasi, tanlash strukturasi va takroriy tuzilma.
• “Boshqaruv tuzilmalari” atamasi informatika sohasidan kelib chiqqan. Java tili spetsifikatsiyasi -
ification "nazorat tuzilmalari" ni "nazorat bayonotlari" deb anglatadi (104-bet).
• Ketma-ketlik strukturasi Java-ga o'rnatilgan. Agar boshqacha ko'rsatilmagan bo'lsa, kompyuter Java-ni bajaradi
gaplar birin-ketin yozilish tartibida, ya'ni ketma-ketlikda.
• Har qanday joyda bitta harakat joylashtirilishi mumkin, bir nechta harakatlar ketma-ket joylashtirilishi mumkin.
• Faoliyat diagrammalari (104-bet) UML ning bir qismidir. Faoliyat diagrammasi ish jarayonini modellashtiradi
(104-bet; faoliyat deb ham ataladi) dasturiy tizimning bir qismi.
• Faoliyat diagrammalari belgilardan (104-bet) iborat, masalan, harakat holati belgilari, olmos va
kichik doiralar - ular faoliyat oqimini ifodalovchi o'tish strelkalari bilan bog'langan.
• Harakat holatlari (104-bet) bajarilishi kerak bo'lgan muayyan harakatlarni belgilovchi harakat ifodalarini o'z ichiga oladi.
• Faoliyat diagrammasidagi o'qlar o'tishlarni ko'rsatadi, ular o'tish tartibini ko'rsatadi
harakat holatlari bilan ifodalangan harakatlar sodir bo'ladi.
• Faoliyat diagrammasi tepasida joylashgan qattiq doira faoliyatning dastlabki holatini ifodalaydi
(104-bet) — dastur modellashtirilgan amallarni bajarishdan oldin ish jarayonining boshlanishi.
• Diagrammaning pastki qismida paydo bo'lgan ichi bo'sh doira bilan o'ralgan qattiq doira.
yakuniy holatni yuboradi (104-bet) - dastur o'z harakatlarini bajargandan so'ng ish jarayonining tugashi.

Xulosa 141



• Yuqori o'ng burchaklari buklangan to'rtburchaklar UML yozuvlari (104-bet) — izohli qayta-
diagrammadagi belgilarning maqsadini tavsiflovchi belgilar.
• Java-da uchta turdagi tanlash bayonotlari mavjud (105-bet).
• Agar bitta tanlash iborasi (105-bet) bir yoki bir nechta amalni tanlaydi yoki e'tiborsiz qoldiradi.
• if…else ikki marta tanlash iborasi ikkita amal yoki harakatlar guruhini tanlaydi.
• Switch operatori ko‘p tanlash operatori (105-bet) deb ataladi, chunki u orasidan tanlanadi
ko'p turli harakatlar yoki harakatlar guruhlari.
• Java while, do…while va takrorlash uchun (iteratsiya yoki sikl deb ham ataladi) holatini taqdim etadi-
Dasturlarga tsikl davom etar ekan, ko'rsatmalarni takror-takror bajarishga imkon beruvchi elementlar.
taxmin haqiqat bo'lib qolmoqda.
• while va for iboralari o‘z tanasida harakat(lar)ni nol yoki undan ko‘p marta bajaradi—agar bo‘lsa
tsiklni davom ettirish sharti (105-bet) dastlab noto'g'ri, harakat(lar) bajarilmaydi. The
do...bu vaqtda bayonot o‘z tanasidagi harakat(lar)ni bir yoki bir necha marta bajaradi.
• If, else, switch, while, do va for so‘zlari Java kalit so‘zlaridir. Kalit so'zlardan foydalanib bo'lmaydi
identifikatorlar, masalan, o'zgaruvchilar nomlari.
• Har bir dastur shuncha ko'p ketma-ketlik, tanlash va takrorlash iboralarini birlashtirish orqali tuziladi
(105-bet) dastur amalga oshiradigan algoritmga mos keladi.
• Yagona kirish/bitta chiqish boshqaruv bayonotlari (105-bet) bir-biriga ulanish orqali biriktiriladi.
birining chiqish nuqtasi keyingisining kirish nuqtasiga. Bu boshqaruv bayonoti stacking deb nomlanadi.
• Boshqaruv bayonoti boshqa boshqaruv bayonoti ichiga ham joylashtirilishi mumkin (105-bet).
4.5-bo'lim, agar bitta tanlov bayonoti
• Dasturlar muqobil harakat yo'nalishlarini tanlash uchun tanlov bayonotlaridan foydalanadi.
• Yagona tanlovli if bayonotining faoliyat diagrammasi olmos belgisini o'z ichiga oladi.
qaror qabul qilish zarurligini bildiradi. Ish jarayoni belgi bilan belgilanadigan yo'l bo'ylab boradi:
bog'langan qo'riqlash shartlari (106-bet). Agar qo'riqlash sharti rost bo'lsa, ish jarayoni harakatga kiradi
tegishli o'tish strelkasi qaysi davlatga ishora qiladi.
• if operatori bitta kirish/bitta chiqish boshqaruv bayonotidir.
4.6-qism, agar…else Ikki marta tanlash bayonnomasi
• Agar bitta tanlovli buyruq faqat shart rost bo'lganda ko'rsatilgan amalni bajaradi.
• if…else ikki marta tanlash (105-bet) operatori shart bajarilganda bitta amalni bajaradi.
true va shart noto'g'ri bo'lganda boshqa harakat.
• Dastur bir nechta holatlarni o'rnatilgan if…else iboralari bilan sinab ko'rishi mumkin (107-bet).
• Shartli operator (110-bet; ?:) Java-ning yagona uchlik operatori bo'lib, u uchta operandni oladi.
Operandlar va ?: belgisi birgalikda shartli ifoda hosil qiladi (110-bet).
• Java kompilyatori, agar boshqasini bajarish buyurilmagan bo'lsa, boshqasini darhol oldingi bilan bog'laydi-
qavslarni joylashtirish bilan dono.
• if bayonoti o'z tanasida bitta gapni kutadi. Tanaga bir nechta bayonotlarni kiritish
if ning (yoki if…else ifodasi uchun else ning tanasi) gaplarni qavs ichiga yozing.
• Izohlar bloki (110-bet) bitta bayonot joylashtiriladigan istalgan joyga joylashtirilishi mumkin.
• Mantiqiy xatolik (110-bet) bajarilish vaqtida o'z ta'sirini ko'rsatadi. Muhim mantiqiy xato (110-bet) dasturga sabab bo'ladi
muvaffaqiyatsiz bo'lish va muddatidan oldin tugatish. Favqulodda bo'lmagan mantiqiy xato (110-bet) dasturni davom ettirishga imkon beradi
amalga oshiradi, lekin noto'g'ri natijalarga olib keladi.

142 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar



• Blok bitta bayonot joylashtiriladigan har qanday joyga joylashtirilishi mumkin bo'lgani kabi, siz ham bo'sh foydalanishingiz mumkin
bayonot, odatda gap bo'ladigan joyga nuqta-vergul (;) qo'yish bilan ifodalanadi.
4.8-qism Takrorlash bayonnomasi
• while takrorlash bayonoti (114-bet) dasturni takrorlash kerakligini belgilash imkonini beradi
ba'zi shartlar to'g'riligicha qoladigan harakat.
• UML birlashtirish (114-bet) belgisi ikkita faoliyat oqimini bittaga birlashtiradi.
• Qaror va birlashma belgilarini kiruvchi va chiquvchi soni bilan farqlash mumkin
o'tish strelkalari. Qaror belgisi olmosga ishora qiluvchi bitta o'tish o'qi va ikkitasiga ega
yoki olmosdan mumkin bo'lgan o'tishlarni ko'rsatadigan bir nechta o'tish o'qlari
o'sha nuqta. Qaror belgisiga ishora qiluvchi har bir o'tish strelkasi himoya holatiga ega. A
Birlashtirish belgisi olmosga ishora qiluvchi ikki yoki undan ortiq o'tish strelkalariga ega va faqat bitta o'tish
olmosdan ishora qiluvchi strelka, davom etish uchun bir nechta faoliyat oqimlarini ko'rsatish
faoliyat. Birlashma belgisi bilan bog'langan o'tish o'qlarining hech biri himoya holatiga ega emas.
4.9-bo'lim Algoritmlarni shakllantirish: Qarama-qarshi boshqariladigan takrorlash
• Qarshi boshqariladigan takrorlash (115-bet) hisoblagich (yoki nazorat o‘zgaruvchisi) deb ataladigan o‘zgaruvchidan foydalanadi.
bayonotlar to'plamining necha marta bajarilishini nazorat qilish.
• Qarama-qarshi boshqariladigan takrorlash ko'pincha aniq takrorlash deb ataladi (115-bet), chunki ularning soni
takrorlashlar sikl bajarilish boshlanishidan oldin ma'lum bo'ladi.
• Jami (115-bet) bir necha qiymatlar yig‘indisini jamlash uchun foydalaniladigan o‘zgaruvchidir. Saqlash uchun ishlatiladigan o'zgaruvchilar
umumiy miqdorlar odatda dasturda foydalanishdan oldin nolga tenglashtiriladi.
• Mahalliy o'zgaruvchining deklaratsiyasi ushbu usulda o'zgaruvchidan foydalanishdan oldin paydo bo'lishi kerak. Mahalliy xilma-xillik
imkoniyatiga u e'lon qilingan usuldan tashqari kirish mumkin emas.
• Ikkita butun sonni bo‘lish natijasida butun son bo‘linadi — hisobning kasr qismi kesiladi.
4.10-bo'lim Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan takrorlash
• Qo'riqchi tomonidan boshqariladigan takrorlashda (119-bet) maxsus qiymat sentinel qiymat deb ataladi (shuningdek, sig'im deb ataladi).
nal qiymat, soxta qiymat yoki bayroq qiymati) "ma'lumotlarni kiritish tugashini" ko'rsatish uchun ishlatiladi.
• Qabul qilinadigan kirish qiymati bilan chalkashtirib bo'lmaydigan nazorat qiymati tanlanishi kerak.
• Yuqoridan pastga, bosqichma-bosqich takomillashtirish (120-bet) yaxshi tuzilgan pro-texnikani ishlab chiqish uchun zarurdir.
gramm.
• Nolga bo'linish mantiqiy xatodir.
• Butun son qiymatlari bilan suzuvchi nuqtali hisoblashni amalga oshirish uchun butun sonlardan birini double yozing.
• Java faqat operand turlari aniqlangan arifmetik ifodalarni qanday baholashni biladi.
kal. Buni ta'minlash uchun Java tanlangan operandlarda promotion deb nomlangan operatsiyani bajaradi.
• Unary cast operatori tur nomi atrofida qavslar qo‘yish orqali hosil bo‘ladi.
4.12-bo'lim Murakkab tayinlash operatorlari
• Murakkab belgilash operatorlari (131-bet) tayinlash ifodalarini qisqartiradi. bayonotlari
shakl
o'zgaruvchi = o'zgaruvchi operator ifodasi;
bu yerda operator ikkilik operatorlardan biri +, -, *, / yoki % shaklida yozilishi mumkin
o'zgaruvchi operator= ifoda;
• += operatori operatorning o'ng tomonidagi ifoda qiymatini qiymatiga qo'shadi
operatorning chap tomonidagi o'zgaruvchi va natijani operatorning chap tomonidagi o'zgaruvchida saqlaydi.

O'z-o'zini tekshirish mashqlari 143



4.13 Bo'lim oshirish va kamaytirish operatorlari
• Birlik o'sish operatori ++ va birlik kamaytiruvchi operator --, 1 ga 1 qo'shing yoki ayiradi
sonli o‘zgaruvchining qiymatidan (131-bet).
• O‘zgaruvchiga old qo‘shilgan (131-bet) o‘sish yoki kamaytirish operatori prefiks o‘sishidir.
yoki mos ravishda prefiksni kamaytirish operatori. Postfikslangan oshirish yoki kamaytirish operatori
(131-bet) o‘zgaruvchiga mos ravishda postfiksni oshirish yoki postfiksni kamaytirish operatori.
• 1 ni qo‘shish yoki ayirish uchun old qo‘shish yoki kamaytirish operatoridan foydalanish preincrement- deb nomlanadi.
mos ravishda ing yoki predekrementing.
• O‘zgaruvchini oldindan oshirish yoki kamaytirish o‘zgaruvchining ortishi yoki kamayishiga sabab bo‘ladi.
1 tomonidan eslatib o'tilgan; keyin o'zgaruvchining yangi qiymati u paydo bo'lgan ifodada ishlatiladi.
• 1 ni qo'shish yoki ayirish uchun postfiksni oshirish yoki kamaytirish operatoridan foydalanish postincre- deb nomlanadi.
mos ravishda eslatish yoki postdekrementatsiya qilish.
• O‘zgaruvchining ortishi yoki kamayishi uning qiymatini ifodada ishlatilishiga olib keladi
unda paydo bo'ladi; keyin o'zgaruvchining qiymati 1 ga oshiriladi yoki kamayadi.
• O‘zgaruvchini ifodada o‘z-o‘zidan oshirish yoki kamaytirishda prefiks va postfiks
o'sish bir xil ta'sirga ega va prefiks va postfiks kamayishi bir xil ta'sirga ega.
4.14-bo'lim Primitiv turlari
• Java barcha o'zgaruvchilarning turiga ega bo'lishini talab qiladi. Shunday qilib, Java kuchli terilgan til deb ataladi
(134-bet).
• Java Unicode belgilar va IEEE 754 suzuvchi nuqtali raqamlardan foydalanadi.
O'z-o'zini tekshirish mashqlari
4.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Barcha dasturlarni uchta turdagi boshqaruv tuzilmalari nuqtai nazaridan yozish mumkin: ,
va .
b) Shart to'g'ri bo'lganda bitta harakatni bajarish uchun bayonot ishlatiladi va
bu shart noto'g'ri bo'lsa, boshqasi.
v) Ko'rsatmalar to'plamini ma'lum bir necha marta takrorlash takrorlash deyiladi.
d) Agar gaplar to'plami necha marta takrorlanishi oldindan noma'lum bo'lsa,
a(n) qiymati takrorni tugatish uchun ishlatilishi mumkin.
e) tuzilma Java-ga qurilgan; sukut bo'yicha, bayonotlar tartibda bajariladi
ular paydo bo'ladi.
f) char, bayt, short, int, long, float va double tipidagi misol o'zgaruvchilari berilgan.
sukut bo'yicha qiymat.
g) Java (n) tildir; u barcha o'zgaruvchilarning turiga ega bo'lishini talab qiladi.
h) Agar o'sish operatori o'zgaruvchiga bo'lsa, avval o'zgaruvchi ga oshiriladi
1, keyin uning yangi qiymati ifodada ishlatiladi.
4.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ayting. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Algoritm - bajariladigan amallar nuqtai nazaridan masalani yechish tartibi va
ular amalga oshirish tartibi.
b) Qavslar ichida joylashgan gaplar to'plami blok deyiladi.
c) Tanlov bayonoti, ba'zi bir shartlar bajarilganda, harakat takrorlanishi kerakligini bildiradi.
asosiy haqiqat.
d) ichki o'rnatilgan boshqaruv bayonoti boshqa boshqaruv bayonotining tanasida paydo bo'ladi.
e) Java +=, -=, *=, /= va %= arifmetik birikma belgilash operatorlarini taqdim etadi.
topshiriq ifodalarini qisqartirish.

144 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

f) ibtidoiy tiplar (boolean, char, bayt, short, int, long, float va double) por-
jadval faqat Windows platformalarida.
g) Dasturda operatorlarning bajarilish tartibini belgilash dastur boshqaruvi deyiladi.
h) Unar cast operatori (double) o'z operandining vaqtinchalik butun nusxasini yaratadi.
i) Boolean tipidagi misol o'zgaruvchilarga sukut bo'yicha true qiymati beriladi.
j) Pseudocode dasturni dasturga yozishdan oldin uni o'ylab ko'rishga yordam beradi -
aralash til.
4.3 X butun o'zgaruvchisiga har biri 1 qo'shadigan to'rt xil Java bayonotini yozing.
4.4 Quyidagi vazifalarning har birini bajarish uchun Java bayonotlarini yozing:
a) X va y ning yig'indisini z ga belgilash uchun bitta bayonotdan foydalaning, so'ngra x ni 1 ga oshiring.
b) O'zgaruvchilar soni 10 dan katta yoki yo'qligini tekshirib ko'ring. Agar shunday bo'lsa, "Sab 10 dan katta" deb chop eting.
c) x o'zgaruvchisini 1 ga kamaytirish uchun bitta iboradan foydalaning, so'ngra uni o'zgaruvchining umumiy sonidan ayiring
va natijani o'zgaruvchan jamida saqlang.
d) q bo'luvchiga bo'lingandan keyingi qoldiqni hisoblang va natijani q ga belgilang. Yozing
bu bayonot ikki xil tarzda.
4.5 Quyidagi vazifalarning har birini bajarish uchun Java bayonotini yozing:
a) int tipidagi o'zgaruvchilar summasini e'lon qiling va uni 0 ga boshlang.
b) int tipidagi x o'zgaruvchilarni e'lon qiling va uni 1 ga boshlang.
c) sum o'zgaruvchisiga x o'zgaruvchisini qo'shing va natijani sum o'zgaruvchisiga belgilang.
d) “Yig‘indi: “, so‘ng o‘zgaruvchining qiymati qo‘yiladi.
4.6 4.5-mashqda yozgan gaplaringizni Java dasturiga birlashtiring.
1 dan 10 gacha bo'lgan butun sonlar yig'indisini kechiktiradi va chop etadi.
hisoblash va oshirish bayonotlari. X qiymati 11 ga aylanganda tsikl tugashi kerak.
4.7 Ko'rsatkich mahsulotidagi o'zgaruvchilar qiymatini aniqlang *= x++; hisoblashdan keyin
bajariladi. Faraz qilaylik, barcha o'zgaruvchilar int tipida va dastlab 5 qiymatiga ega.
4.8 Quyidagi kodlar to'plamining har biridagi xatolarni aniqlang va tuzating:
a) while (c <= 5)
{
mahsulot *= c;
++c;
b) agar (jinsi == 1)
System.out.println("Ayol");
boshqa;
System.out.println("Odam");
4.9 Quyidagi while iborasida nima noto'g'ri?
esa (z >= 0)
summa += z;

O'z-o'zini tekshirish mashqlariga javoblar


4.1 a) ketma-ketlik, tanlash, takrorlash. b) agar ... bo'lmasa. c) qarama-qarshi boshqariladigan (yoki aniq). d) sen-
tinel, signal, bayroq yoki qo'g'irchoq. e) ketma-ketlik. f) 0 (nol). g) kuchli terilgan. h) prefiksli.
4.2 a) To'g'ri. b) yolg'on. Bir juft qavs ({ va }) ichida joylashgan gaplar to‘plami a deyiladi
blok. c) yolg'on. Takrorlash bayonoti, ba'zi bir shartlar mavjud bo'lganda, harakat takrorlanishi kerakligini bildiradi.
to'g'riligicha qolmoqda. d) To'g'ri. e) To'g'ri. f) yolg'on. Ibtidoiy turlar (boolean, char, bayt, short, int,
long, float va double) Java-ni qo'llab-quvvatlaydigan barcha kompyuter platformalarida portativdir. g) To'g'ri.
h) yolg'on. Unar cast operatori (ikki marta) operandning vaqtinchalik suzuvchi nuqtali nusxasini yaratadi.
i) yolg'on. Boolean tipidagi misol o'zgaruvchilariga sukut bo'yicha false qiymati beriladi. j) To'g'ri.

145-mashqlar

4,3 x = x + 1;
x += 1;
++x;
x++;
4.4 a) z = x++ + y;
b) agar (hisoblash > 10)
System.out.println("Son 10 dan katta");
c) jami -= --x;
d) q %= bo‘luvchi;
q = q % bo‘luvchi;
4,5 a) int sum = 0;
b) int x = 1;
c) yig'indisi += x; yoki summa = summa + x;
d) System.out.printf("Yig'indi: %d%n", yig'indisi);
4.6 Dastur quyidagicha:

4,7 mahsulot = 25, x = 6


4.8 a) Xato: while iborasining asosiy oʻng tomonidagi qavs yoʻq.
Tuzatish: ++c; iborasidan keyin o'ng qavs qo'shing.
b) Xato: elsedan keyingi nuqtali vergul mantiqiy xatolikka olib keladi. Ikkinchi chiqish bayonoti
har doim ijro etiladi.
Tuzatish: boshqasidan keyin nuqta-vergulni olib tashlang.
4.9 z o‘zgaruvchining qiymati while ifodasida hech qachon o‘zgarmaydi. Shuning uchun, agar tsikl -
davom etish sharti (z >= 0) rost, cheksiz sikl hosil bo‘ladi. Cheksiz pastadirni oldini olish uchun
sodir bo'lganda, z oxir-oqibat 0 dan kichik bo'lishi uchun kamayishi kerak.
Mashqlar
4.10 If bir tanlamali gapni va while takrorlash gapini solishtiring va taqqoslang.
Bu ikki bayonot qanday o'xshash? Ular qanday farq qiladi?

1 // 4.6-mashq: Calculate.java


2 // 1 dan 10 gacha bo'lgan butun sonlar yig'indisini hisoblang
3 ommaviy sinf Hisoblash
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7 int sum = 0;
8 int x = 1;
9
10 while (x <= 10) // while x 10 dan kichik yoki teng
11 {
12 so'm += x; // yig'indiga x qo'shing
13 ++x; // x oshirish
14 }
15
16 System.out.printf("Yig'indi: %d%n", summa);
17 }
18 } // yakuniy sinf Hisoblash

Jami: 55

146 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

4.11 Java dasturi bir butun sonni ikkinchisiga bo'lishga harakat qilganda nima sodir bo'lishini tushuntiring.


Hisoblashning kasr qismi bilan nima sodir bo'ladi? Qanday qilib bunday natijadan qochishingiz mumkin?
4.12 Boshqaruv bayonotlarini birlashtirishning ikkita usulini tavsiflang.
4.13 Birinchi 100 ta pozitsiyaning yig'indisini hisoblash uchun qaysi turdagi takrorlash mos keladi?
butun sonlar? Ixtiyoriy sonlar yig'indisini hisoblash uchun qaysi tur mos keladi
butun sonlar? Ushbu vazifalarning har birini qanday bajarish mumkinligini qisqacha tasvirlab bering.
4.14 O'zgaruvchini oldindan oshirish va keyin oshirish o'rtasidagi farq nima?
4.15 Quyidagi kod qismlarining har biridagi xatolarni aniqlang va tuzating. [Izoh: bo'lishi mumkin
har bir kod qismida bir nechta xato.]
a) agar (yoshi >= 65);
System.out.println("Yoshi 65 dan katta yoki unga teng");
boshqa
System.out.println("Yoshi 65 dan kichik)";
b) int x = 1, jami;
esa (x <= 10)
{
jami += x;
++x;
}
c) while (x <= 100)
jami += x;
++x;
d) esa (y > 0)
{
System.out.println(y);
++y;
4.16 Quyidagi dastur nimani chop etadi?

4.17-mashq 4.20- mashq uchun quyidagi bosqichlarning har birini bajaring:


a) muammo bayonini o‘qing.
b) psevdokod va yuqoridan pastga, bosqichma-bosqich takomillashtirish yordamida algoritmni shakllantirish.
c) Java dasturini yozing.

1 // 4.16-mashq: Mystery.java


2 ommaviy sinf Sir
3 {
4 ta umumiy statik bekor asosiy(String[] args)
5 {
6 int x = 1;
7 jami = 0;
8
9 vaqt (x <= 10)
10 {
11 int y = x * x;
12 System.out.println(y);
13 jami += y;
14 ++x;
15 }
16
17 System.out.printf("Jami %d%n", jami);
18 }
19 } // yakuniy sinf Sir

147-mashqlar



d) Java dasturini sinab ko'ring, disk raskadrovka qiling va bajaring.
e) uchta to'liq ma'lumotlar to'plamini qayta ishlash.
4.17 (Gaz Mileage) Haydovchilar o'z avtomobillari olgan masofadan xavotirda. Bir haydovchi bor
Har bir tank uchun sarflangan millar va gallonlarni yozib, bir nechta sayohatlarni kuzatib bordi. Rivojlantiring
Har bir sayohat uchun yurilgan millar va foydalanilgan gallonlarni (ikkalasi ham butun son sifatida) kiritadigan Java ilovasi.
Dastur har bir sayohat uchun olingan gallon uchun milni hisoblashi va ko'rsatishi va chop etishi kerak
Shu nuqtaga qadar barcha sayohatlar uchun olingan gallon boshiga birlashtirilgan milya. Barcha o'rtacha hisob-kitoblar bo'lishi kerak
suzuvchi nuqta natijalarini ishlab chiqarish. olish uchun sinf Skaneri va sentinel tomonidan boshqariladigan takrorlashdan foydalaning
foydalanuvchidan olingan ma'lumotlar.
4.18 (Kredit limiti kalkulyatori) Java dasturini ishlab chiqing, u bir nechta dasturlardan birortasi mavjudligini aniqlaydi.
do'kon mijozlari to'lov hisobvarag'idagi kredit limitidan oshib ketgan. Har bir mijoz uchun,
quyidagi faktlar mavjud:
a) hisob raqami
b) oy boshidagi qoldiq
c) mijoz tomonidan shu oyda to'langan barcha narsalarning jami
d) shu oyda mijozning hisobvarag'iga qo'yilgan barcha kreditlar jami
e) ruxsat etilgan kredit limiti.
Dastur ushbu faktlarning barchasini butun sonlar sifatida kiritishi, yangi balansni hisoblashi kerak (= boshlang'ich balans
+ to'lovlar - kreditlar), yangi balansni ko'rsating va yangi balansdan oshib ketishini aniqlang
mijozning kredit limiti. Kredit limiti oshib ketgan mijozlar uchun dastur o'chirilishi kerak
"Kredit chegarasi oshdi" xabarini o'ynang.
4.19 (Sotish komissiyasi kalkulyatori) Katta kompaniya o'z sotuvchilariga komissiya asosida to'laydi.
Sotuvchilar haftasiga 200 dollar va shu haftadagi yalpi savdosining 9 foizini oladi. Masalan, a
Bir haftada 5000 dollarlik tovar sotgan sotuvchi 200 dollar va 5000 dollarning 9 foizini oladi yoki
jami 650 dollar. Sizga har bir sotuvchi tomonidan sotilgan mahsulotlar ro'yxati taqdim etildi. ning qiymatlari
bu elementlar quyidagilardan iborat:
Element qiymati
1 239,99
2 129,75
3 99,95
4 350.89
Bitta sotuvchining o'tgan haftada sotilgan buyumlarini kiritadigan va hisoblaydigan Java dasturini ishlab chiqing
sotuvchining daromadini ko'rsatadi. Sotish mumkin bo'lgan narsalar sonida cheklov yo'q.
4.20 (Ish haqi kalkulyatori) Har biri uchun yalpi ish haqini aniqlaydigan Java dasturini ishlab chiqing.
uchta xodim. Kompaniya har bir xodim ishlagan dastlabki 40 soat uchun to'g'ridan-to'g'ri to'laydi
va 40 dan ortiq ishlagan barcha soatlar uchun bir yarim vaqt. Sizga xodimlarning ro'yxati beriladi, ularning
o'tgan haftada ishlagan soatlar soni va ularning soatlik stavkalari. Sizning dasturingiz ushbu ma'lumotni kiritishi kerak
Har bir xodim uchun tsionni belgilang, so'ngra xodimning yalpi ish haqini aniqlang va ko'rsating. Sinf skaneridan foydalaning
ma'lumotlarni kiriting.
4.21 (Eng katta raqamni toping) Eng katta qiymatni topish jarayoni tez-tez birgalikda ishlatiladi.
kompyuter ilovalari. Misol uchun, savdo tanlovi g'olibini aniqlaydigan dastur kiritiladi
har bir sotuvchi tomonidan sotilgan birliklar soni. Eng ko'p birlik sotgan sotuvchi g'alaba qozonadi.
sinov. Psevdokod dasturini, so'ngra 10 ta butun sonlar qatorini kirituvchi va o'z-o'zidan ma'lumot beruvchi Java dasturini yozing.
minalar va eng katta butun sonni chop etadi. Sizning dasturingiz kamida quyidagi uchta o'zgaruvchidan foydalanishi kerak:
a) hisoblagich: 10 ga qadar sanash uchun hisoblagich (ya'ni, qancha son bo'lganligini kuzatish uchun).
kiritish va barcha 10 ta raqam qachon qayta ishlanganligini aniqlash uchun).
b) raqam: foydalanuvchi tomonidan oxirgi kiritilgan butun son.
c) eng katta: Hozirgacha topilgan eng katta raqam.

148 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

4.22 (jadvalli chiqish) Quyidagi jadvalni chop etish uchun tsikldan foydalanadigan Java dasturini yozing.
qiymatlar:

4.23 (Eng katta ikkita raqamni toping) 4.21-mashqdagi kabi yondashuvdan foydalanib, toping.


kiritilgan 10 ta qiymatning ikkita eng katta qiymati. [Izoh: Har bir raqamni faqat bir marta kiritishingiz mumkin.]
4.24 (Foydalanuvchi kiritishini tekshirish) 4.12-rasmdagi dasturni kiritishlarini tekshirish uchun o'zgartiring. Har qanday in-
qo'ying, agar kiritilgan qiymat 1 yoki 2 dan boshqa bo'lsa, foydalanuvchi to'g'ri qiymat kiritmaguncha aylanishni davom eting.
4.25 Quyidagi dastur nimani chop etadi?

4.26 Quyidagi dastur nimani chop etadi?

N 10*N 100*N 1000*N

1 10 100 1000


2 20 200 2000
3 30 300 3000
4 40 400 4000
5 50 500 5000

1 // 4.25-mashq: Mystery2.java


2 ommaviy sinf Sir 2
3 {
4 ta umumiy statik bekor asosiy(String[] args)
5 {
6 int soni = 1;
7
8 vaqt (hisoblash <= 10)
9 {
10 System.out.println(hisoblash % 2 == 1 ? "****" : "++++++++");
11 ++son;
12 }
13 }
14 } // yakuniy sinf Mystery2

1 // 4.26-mashq: Mystery3.java


2 ommaviy sinf Sir 3
3 {
4 ta umumiy statik bekor asosiy(String[] args)
5 {
6 int qator = 10;
7
8 vaqt (qator >= 1)
9 {
10 int ustun = 1;
11
12 esa (ustun <= 10)
13 {
14 System.out.print(satr % 2 == 1 ? "<" : ">");
15 ++ustun;
16 }
17
18 - qator;
19 System.out.println();
20 }
21 }
22 } // yakuniy sinf Mystery3

149-mashqlar

4.27 (Dangling-else muammosi) x bo'lganda berilgan kodlar to'plamining har birining chiqishini aniqlang.
9 va y 11 va x 11 va y 9 bo'lganda. Kompilyator Java dasturidagi chekinishga e'tibor bermaydi.
Bundan tashqari, Java kompilyatori, agar aytilmagan bo'lsa, har doim boshqasini darhol oldingi bilan bog'laydi
qavslarni ({}) joylashtirish orqali boshqacha qiling. Bir qarashda, siz qaysi biri ekanligini bilmasligingiz mumkin.
Ticular else mos keladi - bu holat "boshqa osilgan muammo" deb ataladi. Biz yo'q qildik -
Muammoni yanada qiyinlashtirish uchun quyidagi koddan chekinishni o'rnating. [Maslahat: Qo'llash
Siz o'rgangan chekinish qoidalari.]
a) agar (x <10)
agar (y > 10)
System.out.println("*****");
boshqa
System.out.println("#####");
System.out.println("$$$$$");
b) agar (x < 10)
{
agar (y > 10)
System.out.println("*****");
}
boshqa
{
System.out.println("#####");
System.out.println("$$$$$");
}
4.28 (Boshqa bir muammo) Ko'rsatilgan kodni o'zgartiring.
muammoning har bir qismi. To'g'ri chiziq chizish usullaridan foydalaning. Qo'shishdan boshqa hech qanday o'zgartirish kiritmang
qavslar va kodning chekinishini o'zgartirish. Kompilyator Java pro-dagi indentatsiyaga e'tibor bermaydi.
gramm. Muammoni yanada qiyinlashtirish uchun biz berilgan koddan chekinishni olib tashladik -
ing. [Izoh: Ba'zi qismlarga hech qanday o'zgartirish kerak bo'lmasligi mumkin.]
agar (y == 8)
agar (x == 5)
System.out.println("@@@@@");
boshqa
System.out.println("#####");
System.out.println("$$$$$");
System.out.println("&&&&&");
a) x = 5 va y = 8 deb faraz qilsak, quyidagi mahsulot hosil bo'ladi:
@@@@@
$$$$$
&&&&&
b) x = 5 va y = 8 deb faraz qilsak, quyidagi mahsulot hosil bo'ladi:
@@@@@
c) x = 5 va y = 8 deb faraz qilsak, quyidagi mahsulot hosil bo'ladi:
@@@@@
d) x = 5 va y = 7 deb faraz qilsak, quyidagi mahsulot ishlab chiqariladi. [Izoh: oxirgi uchtasi
else dan keyingi chiqish bayonotlari blokning bir qismidir.]
#####
$$$$$
&&&&&

150 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar

4.29 (Yulduzchalar kvadrati) Foydalanuvchiga tomonning o'lchamini kiritishni taklif qiladigan dastur yozing.
kvadratdan iborat, keyin yulduzchalardan yasalgan o'lchamdagi ichi bo'sh kvadratni ko'rsatadi. Sizning dasturingiz ishlashi kerak
1 dan 20 gacha bo'lgan barcha uzunlikdagi kvadratlar uchun.
4.30 (Palindromlar) Palindrom - bu bir xil orqaga qarab o'qiladigan belgilar ketma-ketligi.
palata. Masalan, quyidagi besh xonali butun sonlarning har biri palindromdir: 12321, 55555, 45554
va 11611. Besh xonali butun sonda o‘qiydigan va uning pal-
indrom. Agar raqam besh raqamdan iborat bo'lmasa, xato xabarini ko'rsating va foydalanuvchiga kirishiga ruxsat bering
yangi qiymat.
4.31 (Ikkilik sonning oʻnlik ekvivalentini chop etish) ni kirituvchi dastur yozing.
faqat 0 va 1 larni o'z ichiga olgan butun son (ya'ni, ikkilik butun son) va uning o'nlik ekvivalentini chop etadi. [Maslahat: Foydalanish
o'ngdan ikkilik sonning raqamlarini birma-bir ajratib olish uchun qolgan va bo'lish operatorlari
chapga. O'nlik sanoq sistemasida eng o'ngdagi raqam 1 va keyingi raqamning pozitsion qiymatiga ega
chapdagi raqam pozitsion qiymat 10, keyin 100, keyin 1000 va hokazo. O'nlik soni 234
4 * 1 + 3 * 10 + 2 * 100 deb talqin qilish mumkin. Ikkilik sanoq sistemasida eng o'ngdagi raqam mavjud.
pozitsion qiymat 1, chapdagi keyingi raqam 2 pozitsion qiymat, keyin 4, keyin 8 va hokazo.
Ikkilik 1101 ning kasr ekvivalenti 1 * 1 + 0 * 2 + 1 * 4 + 1 * 8 yoki 1 + 0 + 4 + 8 yoki, 13.]
4.32 (Yulduzchalarning shaxmat taxtasi) Faqat chiqish holatini ishlatadigan dastur yozing.
mentlar
System.out.print("* ");
System.out.print(" ");
System.out.println();
Quyidagi shaxmat taxtasi naqshini ko'rsatish uchun. Argumentsiz System.out.println usuli chaqiruvi
ments dasturni bitta yangi satr belgisini chiqarishga olib keladi. [Maslahat: Takrorlash bayonotlari
talab qilinadi.]

4.33 (Cheksiz tsikl bilan 2 ning ko'pligi) Diskda doimiy ravishda ko'rsatiladigan dasturni yozing.


buyruq oynasi butun son 2 ning ko'paytmalari, ya'ni 2, 4, 8, 16, 32, 64 va hokazo. Sizning halqangiz
tugatmasligi kerak (ya'ni, u cheksiz tsikl yaratishi kerak). Ushbu pro-ni ishga tushirsangiz nima bo'ladi
gramm?
4.34 (Ushbu Kodeksda nima noto'g'ri?) Quyidagi bayonotda nima noto'g'ri? ni taqdim eting
x va y yig'indisiga bitta qo'shish uchun to'g'ri bayonot.
System.out.println(++(x + y));
4.35 (Uchburchakning tomonlari) Kiritilgan uchta nolga teng boʻlmagan qiymatlarni oʻqiydigan dastur yozing.
foydalanuvchi va ular uchburchak tomonlarini ifodalashi mumkinligini aniqlaydi va chop etadi.
4.36 (To'g'ri burchakli uchburchakning tomonlari) uchta nolga teng bo'lmagan butun sonni o'qiydigan dastur yozing.
uchlari va to'g'ri burchakli uchburchak tomonlarini ko'rsatishi mumkinligini ko'rsatadi.
4.37 (Faktorial) n manfiy bo'lmagan butun sonning faktoriali n sifatida yoziladi! (talaffuzi “n faktori-
al") va quyidagicha ta'riflanadi:

* * * * * * *


* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *
* * * * * * *

Farq qilish 151

n! = n · (n – 1) · (n – 2) · … · 1 (n ning 1 dan katta yoki teng qiymatlari uchun)

va

n! = 1 (n = 0 uchun)


Masalan, 5! = 5 · 4 · 3 · 2 · 1, bu 120 ga teng.
a) manfiy bo'lmagan butun sonni o'qiydigan va uning faktini hisoblaydigan va chop etadigan dastur yozing.
torial.
b) yordamida matematik doimiy e ning qiymatini baholovchi ilova yozing
quyidagi formula. Foydalanuvchiga hisoblash uchun atamalar sonini kiritishiga ruxsat bering.

c) Quyidagi formula yordamida ex qiymatini hisoblaydigan dastur yozing. Al-


hisoblash uchun atamalar sonini kiritish uchun foydalanuvchi past.

Farq qilish


4.38 (Kriptografiya bilan maxfiylikni ta'minlash) Internet aloqalarining keskin o'sishi
va internetga ulangan kompyuterlarda ma'lumotlarni saqlash maxfiylik bilan bog'liq muammolarni sezilarli darajada oshirdi. Maydon
Kriptografiya ma'lumotlarini kodlash bilan bog'liq bo'lib, uni qiyinlashtiradi (va umid qilamanki, eng ko'p
kengaytirilgan sxemalar - imkonsiz) ruxsatsiz foydalanuvchilar o'qishi uchun. Ushbu mashqda siz a ni tekshirasiz
ma'lumotlarni shifrlash va parolini ochishning oddiy sxemasi. Internet orqali ma'lumotlarni jo'natmoqchi bo'lgan kompaniya
ternet sizdan uni shifrlaydigan dastur yozishingizni so'radi, shunda u yanada ko'proq uzatilishi mumkin.
shifo. Barcha ma'lumotlar to'rt xonali butun sonlar sifatida uzatiladi. Sizning arizangiz to'rt xonali raqamni o'qishi kerak
foydalanuvchi tomonidan kiritilgan butun sonni kiriting va uni quyidagicha shifrlang: Har bir raqamni 7 qo'shish natijasi bilan almashtiring.
raqamga o'tkazing va yangi qiymatni 10 ga bo'lgandan keyin qoldiqni oling. Keyin birinchi raqamni almashtiring
uchinchisi bilan va ikkinchi raqamni to'rtinchisi bilan almashtiring. Keyin shifrlangan butun sonni chop eting. Yozing
shifrlangan to'rt xonali butun sonni kiritadigan va uni parolini hal qiluvchi alohida dastur
shifrlash sxemasi) asl raqamni shakllantirish. [Ixtiyoriy o'qish loyihasi: Tadqiqot "ommaviy kalit
kriptografiya” umumiy va PGP (Pretty Good Privacy) maxsus ochiq kalit sxemasi. Sizga mumkin
Shuningdek, sanoat quvvatli ilovalarda keng qo'llaniladigan RSA sxemasini tekshirishni xohlayman.]
4.39 (Jahon aholisining o'sishi) Dunyo aholisi asrlar davomida sezilarli darajada o'sdi.
O'sishning davom etishi oxir-oqibat nafas oladigan havo, ichimlik suvi, haydaladigan suv chegaralariga qarshi chiqishi mumkin
ekin maydonlari va boshqa cheklangan resurslar. So'nggi yillarda o'sish sekinlashgani haqida dalillar mavjud
va bu asrda dunyo aholisining eng yuqori cho'qqisiga chiqishi mumkin, keyin esa kamayishi mumkin.
Ushbu mashq uchun dunyo aholisining o'sish muammolarini onlayn tarzda o'rganing. Har xil narsalarni tekshirishga ishonch hosil qiling
nuqtai nazarlar. Joriy dunyo aholisi va uning o'sish sur'atlari uchun hisob-kitoblarni oling (foiz
bu yil u oshishi mumkin). Dunyo aholisining o'sishini hisoblaydigan dastur yozing
har yili keyingi 75 yil davomida joriy o'sish sur'ati saqlanib qoladi degan soddalashtirilgan taxmindan foydalangan holda
doimiy. Natijalarni jadvalga chop eting. Birinchi ustunda 1 yildan boshlab yil ko'rsatilishi kerak
75. Ikkinchi ustunda o'sha yil oxirida kutilayotgan dunyo aholisi ko'rsatilishi kerak.
Uchinchi ustunda dunyo aholisining soni ko'payishi ko'rsatilishi kerak
o'sha yili. Natijalaringizdan foydalanib, aholi soni ikki baravar ko'paygan yilni aniqlang
Agar bu yilgi o'sish sur'ati saqlanib qolsa, bugungi kunda.

e 1 1


-1---!-

1
-2---!-

1
= + + + -3---!- + …

masalan 1 x

-1---!-

x2
-2---!-

x3
= + + + -3---!- + …

5

Nazorat bayonotlari: 2-qism;


Mantiqiy operatorlar

G'ildirak to'liq aylanaga aylanadi.


- Uilyam Shekspir
Biz bilgan barcha evolyutsiya
noaniqdan to gacha boradi
aniq.
- Charlz Sanders Pirs

Oh maqsadlar


Ushbu bobda siz:
■ ning asosiylarini bilib oling
qarama-qarshi boshqariladigan takrorlash.
■ for va do … while tugmalaridan foydalaning
uchun takrorlash bayonotlari
a dagi bayonotlarni bajarish
dastur qayta-qayta.
■ Ko'p narsani tushunish
kalit yordamida tanlash
tanlov bayonoti.
■ tanaffusdan foydalaning va
dastur nazoratini davom ettiring
oqimni o'zgartirish uchun bayonotlar
nazorat qilish.
■ uchun mantiqiy operatorlardan foydalaning
murakkab shartli shakl
boshqaruvdagi ifodalar
bayonotlar.

5.1 Kirish 153

5.1 Kirish
Ushbu bobda tuzilgan dasturlash nazariyasi va tamoyillari haqidagi taqdimotimiz davom etadi
Java-ning qolgan boshqaruv iboralaridan biridan tashqari hammasini kiritish orqali. Biz Java-ni namoyish qilamiz
for, do… while va switch iboralari. while dan foydalangan holda bir qator qisqa misollar orqali
va uchun, Biz qarama-qarshi nazorat takrorlash muhim o'rganish. Biz kalit holatidan foydalanamiz -
raqamli baholar to'plamida A, B, C, D va F darajali ekvivalentlar sonini hisoblash
foydalanuvchi tomonidan kiritilgan. Biz tanaffus va davom dastur-nazorat bayonotlarini kiritamiz.
Biz Java-ning mantiqiy operatorlarini muhokama qilamiz, ular sizga yanada murakkab shartli ex-dan foydalanish imkonini beradi.
nazorat bayonotlaridagi bosimlar. Va nihoyat, biz Java-ning boshqaruv bayonotlarini va
Ushbu bobda va 4-bobda keltirilgan muammoni hal qilishning tasdiqlangan usullari.
5.2 Qarama-qarshi boshqariladigan takrorlashning asoslari
Ushbu bo'lim 4-bobda keltirilgan while takrorlash bayonotidan foydalanadi
qarama-qarshi boshqariladigan takrorlashni amalga oshirish uchun zarur bo'lgan elementlar, bu talab qiladi
1. nazorat o'zgaruvchisi (yoki tsikl hisoblagichi)
2. boshqaruv o‘zgaruvchisining boshlang‘ich qiymati
3. boshqaruv o'zgaruvchisi orqali har safar o'zgartiriladigan o'sish
halqa (shuningdek, tsiklning har bir iteratsiyasi deb ham ataladi)
4. sikl davom etish sharti, bu tsikl davom etishi kerakmi yoki yo‘qligini aniqlaydi.
Qarama-qarshi boshqariladigan takrorlashning ushbu elementlarini ko'rish uchun ilovani ko'rib chiqing
1 dan 10 gacha raqamlarni ko'rsatish uchun tsikldan foydalanadigan 5.1-rasm.

5.1 Kirish


5.2 Qarama-qarshi nazorat qilishning asosiy jihatlari
Takrorlash
5.3 Takrorlash bayonoti uchun
5.4 For bayonotidan foydalanishga misollar
5.5 Takrorlash bayonoti paytida ... bajaring
5.6 Ko'p tanlovli bayonotni almashtirish

5.7 Class AutoPolicy Case Study:


Switch bayonotlaridagi satrlar
5.8 Tanaffus va davom bayonotlari
5.9 Mantiqiy operatorlar
5.10 Strukturaviy dasturlash bo'yicha xulosa
5.11 (ixtiyoriy) GUI va grafik ishi
O'rganish: To'rtburchaklar va tasvirlar chizish
5.12 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish

1 // 5.1-rasm: WhileCounter.java
2 // while takrorlash bayonoti bilan qarama-qarshi boshqariladigan takrorlash.
3
4 jamoat sinfi WhileCounter
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {

5.1-rasm | while takrorlash gapi bilan qarama-qarshi boshqariladigan takrorlash. (2-qismning 1-qismi.)


154 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

5.1-rasmda qarama-qarshi boshqariladigan takrorlash elementlari 8, 10-qatorlarda aniqlangan.
va 13. 8-qatorda boshqaruv o‘zgaruvchisi (hisoblagich) int sifatida e’lon qilinadi, u uchun bo‘sh joy ajratiladi.
xotira va uning boshlang'ich qiymatini 1 ga o'rnatadi. O'zgaruvchi hisoblagich ham e'lon qilinishi mumkin edi va
quyidagi mahalliy o'zgaruvchan deklaratsiya va tayinlash bayonotlari bilan ishga tushirilgan:

12-qator tsiklning har bir iteratsiyasi davomida nazorat o'zgaruvchisi hisoblagichining qiymatini ko'rsatadi. Chiziq


13 tsiklning har bir iteratsiyasi uchun boshqaruv o'zgaruvchisini 1 ga oshiradi. Loop-davomi-
while (10-satr)dagi tion sharti nazorat o'zgaruvchisining qiymati kichik yoki yo'qligini tekshiradi
dan yoki 10 ga teng (shart to'g'ri bo'lgan yakuniy qiymat). Dastur -
boshqaruv oʻzgaruvchisi 10 boʻlsa ham buning tanasini hosil qiladi. sikl tugaydi
nazorat o'zgaruvchisi 10 dan oshganda (ya'ni, hisoblagich 11 ga aylanadi).

5.1-rasmdagi dasturni qatordagi hisoblagichni 0 ga ishga tushirish orqali ixchamroq qilish mumkin


8 va while holatida hisoblagichni quyidagi tarzda oshirish:

Bu kod bayonotni saqlaydi, chunki while sharti oldingi o'sishni amalga oshiradi


holatini sinab ko'rish. (4.13-bo'limdan ++ ustunligi yuqoriroq ekanligini eslang
Bu <=.) Bunday siqilgan shaklda kodlash amaliyotni talab qiladi, kodni yanada farq qilishi mumkin.
o'qish, disk raskadrovka qilish, o'zgartirish va saqlash uchun mo'ljallangan va odatda undan qochish kerak.

8
9
10 while ( ) // tsikl davom etish sharti


11 {
12 System.out.printf("%d ", hisoblagich);
13
14 }
15
16 System.out.println();
17 }
18 } // klassni tugatish WhileCounter

1 2 3 4 5 6 7 8 9 10

int hisoblagich; // hisoblagichni e'lon qilish
hisoblagich = 1; // hisoblagichni 1 ga ishga tushiring

Umumiy dasturlash xatosi 5.1


Suzuvchi nuqta qiymatlari taxminiy bo'lishi mumkinligi sababli, suzuvchi nuqtali boshqaruv tsikllari
o'zgaruvchilar noto'g'ri hisoblagich qiymatlari va noto'g'ri tugatish testlariga olib kelishi mumkin.
Xatolarning oldini olish bo'yicha maslahat 5.1
Hisoblash davrlarini boshqarish uchun butun sonlardan foydalaning.

while (++hisoblagich <= 10) // tsiklni davom ettirish sharti


System.out.printf("%d ", hisoblagich);

Dasturiy ta'minot muhandisligi kuzatuvi 5.1


“Oddiy tuting” bu siz yozadigan kodlarning aksariyati uchun yaxshi maslahatdir.

5.1-rasm | while takrorlash gapi bilan qarama-qarshi boshqariladigan takrorlash. (2-qismning 2-qismi.)

int hisoblagichi = 1; // boshqaruv o'zgaruvchisini e'lon qilish va ishga tushirish

hisoblagich <= 10

++hisoblagich; // nazorat o'zgaruvchisini oshirish

Takrorlash bayonoti uchun 5.3 155

5.3 Takrorlash bayonoti uchun
5.2-bo'lim qarama-qarshi nazorat ostida takrorlashning asosiy qoidalarini taqdim etdi. while bayonoti
har qanday qarshi boshqariladigan pastadirni amalga oshirish uchun ishlatilishi mumkin. Java shuningdek takrorlashni ta'minlaydi
ning bitta satrida qarama-qarshi boshqariladigan takrorlash tafsilotlarini belgilaydigan bayonot
kod. 5.2-rasmda for yordamida 5.1-rasmning qo'llanilishi ko'rsatilgan.

For operatori (10-11-qatorlar) bajarila boshlaganda, boshqaruv o'zgaruvchisi hisoblagichi


1 ga e'lon qilinadi va ishga tushiriladi. (5.2-bo'limdan eslaylikki, birinchi ikkita element
qarama-qarshi boshqariladigan takrorlash - bu boshqaruv o'zgaruvchisi va uning boshlang'ich qiymati.) Keyinchalik, pro-
gramm halqa davom etish shartini tekshiradi, hisoblagich <= 10, bu ikkisi o'rtasida
zarur nuqtali vergul. Hisoblagichning boshlang'ich qiymati 1 ga teng bo'lganligi sababli, dastlabki shart
rost. Shunday qilib, tana bayonoti (11-qator) boshqaruv o'zgaruvchisi hisoblagich qiymatini ko'rsatadi,
ya'ni 1. Loop tanasi bajarilgandan so'ng, dastur hisoblagichni ifodada oshiradi.
sion counter++, ikkinchi nuqtali vergulning o'ng tomonida ko'rinadi. Keyin loop-con-
Dastur davom etishi kerakmi yoki yo'qligini aniqlash uchun yana test sinovi o'tkaziladi
tsiklning keyingi iteratsiyasi. Bu nuqtada nazorat o'zgaruvchisining qiymati 2 ga teng, shuning uchun shart
tion hali ham to'g'ri (yakuniy qiymat oshmaydi) - shunday qilib, dastur tanani bajaradi
yana bayonot (ya'ni, tsiklning keyingi iteratsiyasi). Bu jarayon soni tugaguncha davom etadi.
1 dan 10 gacha bo'lgan raqamlar ko'rsatiladi va hisoblagich qiymati 11 ga aylanadi, bu esa
tsiklni davom ettirish testi muvaffaqiyatsiz tugadi va takrorlash tugaydi (10 ta takroriy tsikldan keyin).
tanasi). Keyin dastur for dan keyingi birinchi operatorni bajaradi - bu holda 13-qator.
5.2-rasmda (10-qatorda) halqani davom ettirish sharti hisoblagichi ishlatiladi <= 10. Agar siz
shart sifatida noto'g'ri ko'rsatilgan hisoblagich <10 bo'lsa, tsikl faqat to'qqiz marta takrorlanadi.
Bu birma-bir xato deb ataladigan keng tarqalgan mantiqiy xatodir.

1 // 5.2-rasm: ForCounter.java


2 // for repetition bayonoti bilan qarama-qarshi boshqariladigan takrorlash.
3
4 ommaviy sinf ForCounter
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8
9
10
11
12
13 System.out.println();
14 }
15 } // oxirgi sinf ForCounter

1 2 3 4 5 6 7 8 9 10

5.2-rasm | For repetition iborasi bilan qarama-qarshi boshqariladigan takrorlash.

Umumiy dasturlash xatosi 5.2


Noto'g'ri relyatsion operatordan yoki pastadir hisoblagichining noto'g'ri yakuniy qiymatidan foydalanish
Takrorlash bayonotining tsikl davom etish sharti birdan-bir xatoga olib kelishi mumkin.

// for bayonot sarlavhasi ishga tushirishni o'z ichiga oladi,


// sikl davom etish sharti va o'sish
uchun (int counter = 1; counter <= 10; counter++)
System.out.printf("%d ", hisoblagich);

156 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

For bayonotining sarlavhasiga yaqinroq qarash
5.3-rasmda 5.2-rasmdagi for bayonoti batafsil ko'rib chiqilgan. Birinchi qator - shu jumladan
for kalit so'zi va qavs ichidagi hamma narsa for uchun (5.2-rasmdagi 10-satr) - bu ba'zi-
marta for bayonoti sarlavhasini chaqirdi. For sarlavhasi "hammasini qiladi" - u har bir elementni belgilaydi
nazorat o'zgaruvchisi bilan qarshi boshqariladigan takrorlash uchun kerak. Agar bir nechta bo'lsa
for tanasidagi bayonot, sikl tanasini aniqlash uchun qavslar talab qilinadi.

Bayonotning umumiy formati


For bayonotining umumiy formati

bu erda ishga tushirish ifodasi tsiklning boshqaruv o'zgaruvchisini nomlaydi va ixtiyoriy ravishda beradi


uning boshlang'ich qiymati, loopContinuationCondition sikl davom etishi yoki davom etishini aniqlaydi.
o'zgartirish va oshirish boshqaruv o'zgaruvchisining qiymatini o'zgartiradi, shuning uchun tsikl davom etadi.
shart oxir-oqibat noto'g'ri bo'ladi. For sarlavhasida ikkita nuqta-vergul qo'yilishi shart. Agar
tsiklni davom ettirish sharti dastlab noto'g'ri, dastur for ni bajarmaydi
bayonot tanasi. Buning o'rniga, ijro for dan keyingi bayonot bilan davom etadi.
For bayonotini while ekvivalenti bilan ifodalash
For bayonoti ko'pincha while ifodasi ekvivalenti bilan quyidagicha ifodalanishi mumkin:

Xatolarning oldini olish bo'yicha maslahat 5.2


Yakuniy qiymat va <= operatoridan tsikl holatida foydalanish birma-bir xatolardan qochishga yordam beradi.
1 dan 10 gacha chiqadigan sikl uchun tsiklni davom ettirish sharti hisoblagich <= 10 bo'lishi kerak.
hisoblagich o'rniga < 10 (bu birma-bir xatoga olib keladi) yoki hisoblagich < 11 (bu mos
to'g'ri). Ko'pgina dasturchilar 10 marta sanash uchun nolga asoslangan hisoblashni afzal ko'rishadi,
hisoblagich nolga ishga tushiriladi va tsiklni davom ettirish testi hisoblagich <10 bo'ladi.

Xatolarning oldini olish bo'yicha maslahat 5.3


4-bobda aytib o'tilganidek, butun sonlar to'lib toshib, mantiqiy xatolarga olib kelishi mumkin. Loopni boshqarish o'zgaruvchanligi
toshib ketishi ham mumkin. Buning oldini olish uchun loop shartlarini diqqat bilan yozing.

o

5.3-rasm | bayonot sarlavhasi komponentlari uchun.



for (boshlash; loopContinuationCondition; oshirish)
bayonot

ishga tushirish;


while (loopContinuationCondition)
{
bayonot
o'sish;
}

ning boshlang'ich qiymati


nazorat o'zgaruvchisi

Loop-davomi


holat

ning ortishi


nazorat o'zgaruvchisi

kalit so'z uchun Boshqarish o'zgaruvchisi Kerakli nuqtali vergul Majburiy nuqtali vergul

uchun (int counter = 1; counter <= 10; counter++)

Takrorlash bayonoti uchun 5.3 157

5.8-bo'limda biz for ifodasini an bilan ifodalab bo'lmaydigan holatni ko'rsatamiz
ekvivalent while ifodasi. Odatda, for bayonotlari qarama-qarshi boshqariladigan replikatsiya uchun ishlatiladi.
etition va while iboralari sentinel tomonidan boshqariladigan takrorlash uchun. Biroq, qachon va uchun
har bir takrorlash turi uchun ishlatilishi mumkin.

a for bayonotining nazorat o'zgaruvchisi doirasi


Agar for sarlavhasidagi ishga tushirish ifodasi boshqaruv o'zgaruvchisini e'lon qilsa (ya'ni, kon-
trol o'zgaruvchisining turi o'zgaruvchi nomidan oldin ko'rsatilgan, 5.2-rasmdagi kabi), boshqaruv o'zgaruvchisi
faqat o'sha for bayonotida ishlatilishi mumkin - u undan tashqarida mavjud bo'lmaydi. Bu cheklangan foydalanish hisoblanadi
o'zgaruvchining qamrovi sifatida tanilgan. O'zgaruvchining qamrovi uni qayerda ishlatish mumkinligini belgilaydi
dastur. Misol uchun, mahalliy o'zgaruvchidan faqat uni e'lon qiladigan usulda foydalanish mumkin va
faqat deklaratsiya nuqtasidan usulning oxirigacha. Qo'llanish doirasi bo'yicha muhokama qilinadi
batafsil 6-bob, Usullar: Chuqurroq qarash.

For bayonotining sarlavhasidagi ifodalar ixtiyoriy


for sarlavhasidagi uchta ifoda ixtiyoriydir. Agar loopContinuationCondition bo'lsa
o'tkazib yuborilgan bo'lsa, Java tsiklni davom ettirish sharti har doim to'g'ri deb hisoblaydi va shu bilan hosil qiladi
cheksiz tsikl. Agar dastur ishga tushirsa, ishga tushirish ifodasini o'tkazib yuborishingiz mumkin
tsikldan oldin boshqaruv o'zgaruvchisi. Agar dasturda o'sish ifodasini o'tkazib yuborishingiz mumkin
o'sishni tsiklning tanasidagi iboralar bilan hisoblab chiqadi yoki agar o'sish kerak bo'lmasa.
a for dagi o'sish ifodasi oxiridagi mustaqil ifoda kabi ishlaydi
forning tanasi. Shuning uchun iboralar

for bayonotidagi ekvivalent o'sish ifodalari. Ko'pchilik dasturchilarni afzal ko'radi


ter++ chunki u ixcham va for tsikli o'zining o'sish ifodasini keyin baholaydi
uning tanasi bajaradi, shuning uchun postfiksning o'sish shakli tabiiyroq ko'rinadi. Bunday holda, o'zgaruvchan
qodir bo'lish incremented kattaroq ifodada ko'rinmaydi, shuning uchun preincrementing va
postincrementing aslida bir xil ta'sirga ega.

Umumiy dasturlash xatosi 5.3


ning ishga tushirish bo'limida for bayonotining boshqaruv o'zgaruvchisi e'lon qilinganda
for ning sarlavhasida, for ning tanasidan keyin boshqaruv o'zgaruvchisidan foydalanish kompilyatsiya xatosidir.

hisoblagich = hisoblagich + 1


hisoblagich += 1
++ hisoblagich
hisoblagich ++

Umumiy dasturlash xatosi 5.4


Nuqtali vergulni darhol o'ng qavsning o'ng tomoniga qo'yish for sarlavhasini hosil qiladi
Bu tana uchun bo'sh bayonot. Bu odatda mantiqiy xatodir.

Xatolarning oldini olish bo'yicha maslahat 5.4


Cheksiz tsikllar takrorlash gapidagi tsikl davom etish sharti hech qachon sodir bo'lmaganda sodir bo'ladi
yolg'onga aylanadi. Qarama-qarshi boshqariladigan pastadirda bu vaziyatni oldini olish uchun, ishonch hosil qiling
nazorat o'zgaruvchisi tsiklning har bir iteratsiyasi davomida o'zgartiriladi, shunda tsikl davom etadi
shart oxir-oqibat noto'g'ri bo'ladi. Qo'riqchi tomonidan boshqariladigan pastadirda sen-
tinel qiymati kiritilishi mumkin.

158 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

For bayonotining sarlavhasiga arifmetik ifodalarni joylashtirish
Initsializatsiya, tsiklni davom ettirish sharti va for bayonotining o'sish qismlari
arifmetik ifodalarni o‘z ichiga olishi mumkin. Masalan, x = 2 va y = 10, deb faraz qiling. Agar x va y bo'lsa
tsiklning, bayonotning tanasida o'zgartirilmaydi

bayonotga tengdir

for iborasining ortishi ham manfiy boʻlishi mumkin, bu holda u kamayish hisoblanadi va
halqa pastga qarab hisoblanadi.

Bayonot tanasida for bayonotining boshqaruv o'zgaruvchisidan foydalanish


Dasturlar tez-tez boshqaruv o'zgaruvchisi qiymatini ko'rsatadi yoki uni tsikldagi hisob-kitoblarda ishlatadi
tanasi, lekin bu foydalanish shart emas. Tekshirish o'zgaruvchisi odatda takrorlashni boshqarish uchun ishlatiladi.
for ning tanasida zikr qilinmagan holda.

For bayonoti uchun UML faoliyat diagrammasi


For bayonotining UML faoliyat diagrammasi while operatoriga o'xshaydi
(4.6-rasm). 5.4-rasmda 5.2-rasmdagi for bayonotining faollik diagrammasi ko'rsatilgan. The
diagramma shuni ko'rsatadiki, ishga tushirish tsiklni davom ettirish testidan oldin bir marta sodir bo'ladi
birinchi marta baholanadi va bu o'sish har safar tsikldan keyin sodir bo'ladi
tana bayonoti bajariladi.

uchun (int j = x; j <= 4 * x * y; j += y / x)

uchun (int j = 2; j <= 80; j += 5)

Xatolarning oldini olish bo'yicha maslahat 5.5


Boshqarish o'zgaruvchisining qiymati for tsiklining tanasida o'zgartirilishi mumkin bo'lsa-da, undan qoching
shunday qilish, chunki bu amaliyot nozik xatolarga olib kelishi mumkin.

5.4-rasm | 5.2-rasmdagi for bayonoti uchun UML faoliyat diagrammasi.

Yo'qligini aniqlang
aylanish kerak
davom eting

System.out.printf(“%d ”, hisoblagich);

[hisoblagich > 10]

[hisoblagich <= 10]

int hisoblagichi = 1

hisoblagich ++

ni ko'rsatish
hisoblagich qiymati

Boshlash
nazorat o'zgaruvchisi

ni oshiring
nazorat o'zgaruvchisi

5.4 For bayonotidan foydalanishga misollar 159

5.4 For bayonotidan foydalanishga misollar
Quyidagi misollarda boshqaruv o'zgaruvchisini for holatida o'zgartirish usullari ko'rsatilgan.
ment. Har bir holatda biz faqat sarlavhaga mos keladiganini yozamiz. Munosabatdagi o'zgarishlarga e'tibor bering
boshqaruv o'zgaruvchisini kamaytiruvchi tsikllar uchun tional operator.
a) Boshqaruv o'zgaruvchisini 1 dan 100 gacha o'zgartiring.

b) Boshqaruvchi o'zgaruvchini 1 ga kamayishi bilan 100 dan 1 gacha o'zgartiring.

c) Boshqaruvchi o'zgaruvchini 7 dan 77 gacha o'zgartiring.

d) Boshqaruvchi o'zgaruvchini 2 ga kamayishi bilan 20 dan 2 gacha o'zgartiring.

e) Boshqaruvchi o'zgaruvchini 2, 5, 8, 11, 14, 17, 20 qiymatlari bo'yicha o'zgartiring.

f) 99, 88, 77, 66, 55, 44, 33, 22, 11, 0 qiymatlari bo‘yicha boshqaruv o‘zgaruvchisini o‘zgartiring.

Ilova: 2 dan 20 gacha bo'lgan juft butun sonlarni yig'ish
Endi biz for dan oddiy foydalanishni ko'rsatadigan ikkita namunaviy ilovani ko'rib chiqamiz. ilova-
5.5-rasmdagi takrorlash 2 dan 20 gacha bo'lgan juft sonlarni yig'ish va saqlash uchun for operatoridan foydalanadi.
natijada total deb nomlangan int o'zgaruvchisi paydo bo'ladi.

uchun (int i = 1; i <= 100; i++)

uchun (int i = 100; i >= 1; i--)

uchun (int i = 7; i <= 77; i += 7)

uchun (int i = 20; i >= 2; i -= 2)

uchun (int i = 2; i <= 20; i += 3)

uchun (int i = 99; i >= 0; i -= 11)

Umumiy dasturlash xatosi 5.5


siklning tsikl davom etish shartida noto'g'ri relyatsion operatordan foydalanish
pastga qarab sanaydi (masalan, 1 gacha sanash siklida i >= 1 o‘rniga i <= 1 dan foydalanish)
odatda mantiqiy xato.

Umumiy dasturlash xatosi 5.6


Tenglik operatorlarini (!= yoki ==) siklni davom ettirish sharoitida ishlatmang, agar sikl boshqaruvi
o'zgaruvchilarni 1 dan ortiq oshirish yoki kamaytirish. Masalan, for bayonotini ko'rib chiqing
uchun sarlavha (int counter = 1; counter != 10; counter += 2). Loop-davomi testi
counter != 10 hech qachon noto'g'ri bo'lmaydi (natijada cheksiz tsikl paydo bo'ladi), chunki hisoblagich o'sadi-
Har bir iteratsiyadan keyin 2 ga oshadi.

1 // 5.5-rasm: Sum.java


2 // for bayonoti bilan butun sonlarni yig'ish.
3
4 umumiy sinf Sum
5 {

5.5-rasm | Butun sonlarni for bayonoti bilan yig'ish. (2-qismning 1-qismi.)


160 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Boshlash va oshirish ifodalari vergul bilan ajratilgan ro'yxatlar bo'lishi mumkin
bir nechta ishga tushirish ifodalarini yoki bir nechta o'sish ifodalarini ishlatishingiz mumkin. Uchun
Misol uchun, bu tavsiya etilmaydi, lekin siz for iborasining asosiy qismini birlashtira olasiz
5.5-rasmning 11–12 qatorlari for sarlavhasining o'sish qismiga vergul yordamida kiriting.
quyidagicha:

Ilova: Murakkab foizlarni hisoblash


Murakkab foizlarni hisoblash uchun for bayonotidan foydalanamiz. Quyidagi muammoni ko'rib chiqing -
lem:
Bir kishi 5% foizli omonat hisobvarag'iga 1000 dollar sarmoya kiritadi. Hammasini faraz qilsak
foizlar depozitda qoldiriladi, hisobdagi pul miqdorini hisoblab chiqing va chop eting
10 yil davomida har yilning oxirida. Aniqlash uchun quyidagi formuladan foydalaning
miqdor:
a = p (1 + r) n
qayerda
p - investitsiya qilingan dastlabki miqdor (ya'ni, asosiy qarz)
r - yillik foiz stavkasi (masalan, 5% uchun 0,05 dan foydalaning.
n - yillar soni
a - n-yil oxiridagi depozit summasi.
Ushbu muammoni hal qilish (5.6-rasm) ko'rsatilgan ishlarni bajaradigan pastadirni o'z ichiga oladi
har bir 10 yil uchun pul omonatda qoladi. Usuldagi 8-10 qatorlar
main ikki tomonlama o'zgaruvchilar summasini, asosiy va stavkasini e'lon qiladi va asosiyni ishga tushiradi
1000,0 va darajasi 0,05 gacha. Java 1000.0 va 0.05 kabi suzuvchi nuqta konstantalarini tur sifatida ko'rib chiqadi
ikki barobar. Xuddi shunday, Java 7 va -22 kabi butun sonli konstantalarni int turi sifatida ko'rib chiqadi.

6 ta umumiy statik bekor asosiy(String[] args)


7 {
8
9
10 // 2 dan 20 gacha bo'lgan umumiy juft sonlar
11
12
13
14 System.out.printf("Yig'indi %d%n", jami);
15 }
16 } // yakuniy sinf Sum

Jami 110


uchun (int soni = 2; raqam <= 20; jami += raqam, raqam += 2)
; // bo'sh bayonot
Yaxshi dasturlash amaliyoti 5.1
Iloji bo'lsa, o'qilishi uchun boshqaruv bayonoti sarlavhalari hajmini bitta qatorga cheklang.

5.5-rasm | Butun sonlarni for bayonoti bilan yig'ish. (2-qismning 2-qismi.)

int jami = 0;

uchun (int raqami = 2; raqam <= 20; raqam += 2)


jami += son;

5.4 For bayonotidan foydalanishga misollar 161

Maydon kengligi va asoslanishi bilan satrlarni formatlash
13-qator ikkita chiqish ustunining sarlavhalarini chiqaradi. Birinchi ustun yilni ko'rsatadi
ikkinchi ustunda esa o'sha yil oxiridagi depozit bo'yicha summa. Biz formatdan foydalanamiz
"Depozitdagi summa" qatorini chiqarish uchun %20s spetsifikatsiyasi. % lar orasidagi 20 butun son
va konvertatsiya belgisi s qiymat maydon bilan ko'rsatilishi kerakligini bildiradi
kengligi 20 - ya'ni printf qiymati kamida 20 ta belgi joylashuviga ega bo'lgan qiymatni ko'rsatadi. Agar
chiqarilishi kerak bo'lgan qiymat 20 ta belgi pozitsiyasidan kam (bu misolda 17 ta belgi),
qiymat sukut bo'yicha maydonda to'g'ri oqlanadi. Chiqariladigan yil qiymati ko'proq bo'lsa
to'rtta belgi pozitsiyasidan ko'ra, maydon kengligi o'ngga kengaytiriladi
butun qiymatni moslashtiring - bu miqdor maydonini o'ngga suradi va xafa qiladi
jadvalli chiqishimizning chiroyli ustunlari. Chapga oqlangan qiymatlarni chiqarish uchun shunchaki oldiga qo'ying
minus belgisi (-) formatlash bayrog'i bilan maydon kengligi (masalan, -20s).

1 // 5.6-rasm: Interest.java


2 // Murakkab foizli hisob-kitoblar uchun.
3
4 ommaviy sinf Qiziqish
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 ikki baravar; // har yil oxirida omonat summasi
9 juft asosiy = 1000,0; // foizlardan oldingi boshlang'ich summa
10 ikki barobar stavka = 0,05; // stavka foizi
11
12 // sarlavhalarni ko'rsatish
13 System.out.printf("%s %n", "Yil", "Depozitdagi summa");
14
15
16
17
18
19
20
21
22
23
24 }
25 } // end sinf Qiziqish

Yil Omonatdagi summa


1 1050,00
2 1102,50
3 1157,63
4 1215,51
5 1,276,28
6 1,340,10
7 1,407,10
8 1,477,46
9 1,551,33
10 1628,89

5.6-rasm | For bilan murakkab foizlarni hisoblash.

%20s

// har o'n yil uchun depozit miqdorini hisoblash


uchun (int yil = 1; yil <= 10; ++ yil)
{
// belgilangan yil uchun yangi miqdorni hisoblang
summa = asosiy * Math.pow (1,0 + kurs, yil);
// yil va miqdorni ko'rsatish
System.out.printf("%4d%,20.2f%n", yil, summa);
}

162 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Matematik sinfning statik usuli yordamida foizlarni hisoblashni bajarish
For bayonoti (16-23-qatorlar) o'z tanasini 10 marta bajaradi, o'zgaruvchan nazorat o'zgaruvchisi yil
1 dan 10 gacha 1 ga oshib boradi. Yil 11 ga kelganda bu tsikl tugaydi. (Oʻzgaruvchi
yil muammo bayonotida n ni ifodalaydi.)
Sinflar ob'ektlarda umumiy vazifalarni bajaradigan usullarni taqdim etadi. Aslida, ko'pchilik
usullar ma'lum bir ob'ektda chaqirilishi kerak. Masalan, 5.6-rasmdagi matnni chiqarish uchun qator
13 ta System.out obyektida printf usulini chaqiradi. Ba'zi sinflar ham shunday usullarni taqdim etadi
umumiy vazifalarni bajaring va avval ushbu sinflarning ob'ektlarini yaratishingizni talab qilmaydi. Bular
statik usullar deyiladi. Misol uchun, Java ko'rsatkichni o'z ichiga olmaydi
ator, shuning uchun Java Math sinfining dizaynerlari qiymatni oshirish uchun statik usulni aniqladilar.
bir kuch. Statik usulni sinf nomidan keyin nuqta (.) qo'yish orqali chaqirishingiz mumkin.
va usul nomi, quyidagi kabi

6-bobda siz o'z sinfingizda statik usullarni qanday qo'llashni o'rganasiz.


Murakkab foizlarni hisoblash uchun biz matematika sinfining statik usulidan foydalanamiz.
5.6-rasmda ko'rsatilgan. Math.pow(x, y) x ning y darajaga ko'tarilgan qiymatini hisoblab chiqadi. The
usul ikkita juft argumentni oladi va ikki tomonlama qiymatni qaytaradi. 19-qator bajaradi
hisoblash a = p (1 + r) n, bu erda a - miqdor, p - asosiy, r - stavka va n - yil. Sinf
Matematik java.lang paketida aniqlangan, shuning uchun uni ishlatish uchun Math sinfini import qilishingiz shart emas.
For bayonotining asosiy qismida 1,0 + stavka hisobi mavjud bo'lib, u quyidagicha ko'rinadi
Math.pow usuliga argument. Aslida, bu hisob bir xil natijani beradi
har safar tsikl orqali, shuning uchun uni tsiklning har bir iteratsiyasida takrorlash behudadir.

Suzuvchi nuqtali raqamlarni formatlash


Har bir hisob-kitobdan so'ng, 22-qatorda yil va yil oxiridagi depozit summasi ko'rsatiladi
o'sha yili. Yil to'rtta belgidan iborat maydon kengligida chiqariladi (%4d tomonidan ko'rsatilgandek). The
summa suzuvchi nuqtali raqam sifatida %,20.2f format ko'rsatkichi bilan chiqariladi. kom-
ma (,) formatlash bayrog'i suzuvchi nuqta qiymatini a bilan chiqarish kerakligini bildiradi
guruhlash ajratuvchi. Amaldagi haqiqiy ajratuvchi foydalanuvchi mahalliy (ya'ni, mamlakat) uchun xosdir.
Misol uchun, Qo'shma Shtatlarda raqam ajratish uchun vergul yordamida chiqariladi
kabi sonning kasr qismini ajratish uchun har uch raqam va kasr nuqtasi
1234,45. Format spetsifikatsiyasidagi 20 raqami qiymat bo'lishi kerakligini ko'rsatadi
20 belgidan iborat maydon kengligida to'g'ri oqlangan chiqish. .2 formatlangan raqamni belgilaydi
ber ning aniqligi - bu holda, raqam eng yaqin yuzlikgacha yaxlitlanadi va chiqadi
kasrning o'ng tomonida ikkita raqam bilan.
Yaxlitlangan qiymatlarni ko'rsatish haqida ogohlantirish
Ushbu misolda summa, asosiy va stavka o'zgaruvchilari double turini e'lon qildik.
Biz dollarning kasr qismlari bilan ishlayapmiz va shuning uchun kasrga ruxsat beruvchi tur kerak
uning qiymatlarida nuqtalar. Afsuski, suzuvchi nuqtali raqamlar muammoga olib kelishi mumkin. Mana a
dollarni ifodalash uchun double (yoki float) dan foydalanganda nima noto'g'ri bo'lishi mumkinligini oddiy tushuntirish

ClassName.methodName(argumentlar)

Ishlash bo'yicha maslahat 5.1
Looplarda, natijasi hech qachon o'zgarmaydigan hisob-kitoblardan qoching - bunday hisoblar kerak
odatda pastadirdan oldin joylashtiriladi. Ko'pgina zamonaviy optimallashtiruvchi kompilyatorlar buni amalga oshiradilar
kompilyatsiya qilingan kodda bunday hisob-kitoblarni tsikllardan tashqarida joylashtiring.

5.5 takrorlash bayonnomasi 163 paytida… bajaring

summalar (agar dollar summalari o'ng tomonda ikki raqam bilan ko'rsatilgan bo'lsa
kasr nuqtasi): Mashinada saqlangan ikkita ikki barobar dollar miqdori 14,234 bo'lishi mumkin
(odatda ko'rsatish uchun 14,23 ga yaxlitlanadi) va 18,673 (bu
ko'rsatish uchun odatda 18,67 ga yaxlitlanadi). Ushbu miqdorlar qo'shilganda -
ed, ular odatda 32,91 ga yaxlitlanadigan 32,907 ichki summani ishlab chiqaradilar.
ko'rsatish maqsadlari. Shunday qilib, sizning chiqishingiz sifatida ko'rinishi mumkin

lekin ko'rsatilgandek individual raqamlarni qo'shadigan kishi yig'indini kutadi


32.90. Siz ogohlantirildingiz!

5.5 Takrorlash bayonoti paytida ... bajaring


do…while takrorlash gapi while gapiga o‘xshaydi. Shu bilan birga,
Dastur tsiklning davom etish shartini bajarishdan oldin tsikl boshida sinovdan o'tkazadi.
halqa tanasini inglash; agar shart noto'g'ri bo'lsa, tana hech qachon bajarmaydi. Do... aytayotganda-
ment sikl tanasini bajargandan so'ng halqa davom etish shartini tekshiradi; shuning uchun,
tana har doim kamida bir marta bajaradi. Do…while bayonoti tugashi bilan, bajarilish davom etadi.
navbatdagi gap bilan davom etadi. 5.7-rasmda do… ni chiqarishda foydalaniladi
1–10 raqamlari.

14.23
+ 18,67


-------
32.91

Xatolarning oldini olish bo'yicha maslahat 5.6


Aniq pul hisob-kitoblarini amalga oshirish uchun double (yoki float) turidagi o'zgaruvchilardan foydalanmang.
Suzuvchi nuqtali raqamlarning noaniqligi xatolarga olib kelishi mumkin. Mashqlarda siz o'rganasiz
Aniq pul hisob-kitoblarini amalga oshirish uchun butun sonlardan qanday foydalanish — Java ham sinfni taqdim etadi
Buning uchun java.math.BigDecimal, biz 8.16-rasmda ko'rsatamiz.

1 // 5.7-rasm: DoWhileTest.java


2 // do...while takrorlash bayoni.
3
4 ochiq sinf DoWhileTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 int hisoblagich = 1;
9
10
11
12
13
14
15
16 System.out.println();
17 }
18 } // DoWhileTest sinfini yakunlash

5.7-rasm | takrorlash bayonoti paytida ... bajaring. (2-qismning 1-qismi.)

qil
{
System.out.printf("%d ", hisoblagich);
++hisoblagich;
} while (hisoblagich <= 10); // end do...while

164 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

8-qator boshqaruv o'zgaruvchisi hisoblagichini e'lon qiladi va ishga tushiradi. Do'konga kirganingizdan so'ng
bayonot, 12-satr hisoblagich qiymatini chiqaradi va 13-satr hisoblagichni oshiradi. Keyin pro-
gramm pastadirning pastki qismidagi pastadir-davom testini baholaydi (14-qator). Agar shart-
tion to'g'ri, tsikl birinchi tana bayonotida davom etadi (12-qator). Agar shart noto'g'ri bo'lsa,
sikl tugaydi va dastur sikldan keyingi keyingi operatorda davom etadi.

Takrorlash bayonnomasi uchun UML faoliyat diagrammasi


5.8-rasmda do…while bayonoti uchun UML faoliyat diagrammasi mavjud. Ushbu diagramma
sikl davom etish sharti tsikldan keyingacha baholanmasligini aniq ko'rsatadi
harakat holatini kamida bir marta bajaradi. Ushbu faoliyat diagrammasini o'sha paytdagi bilan solishtiring
bayonot (4.6-rasm).

Qavslar do…while Takrorlash bayonotida


Qavslardan foydalanish shart emas... takrorlash bayonotida, agar bitta bo'lsa.
tanadagi bayonot. Biroq, ko'plab dasturchilar chalkashmaslik uchun qavslarni o'z ichiga oladi.
while va do…while gaplari orasidagi sion. Masalan,

odatda while ifodasining birinchi qatori. Qavssiz do…while ifodasi


bitta bayonot tanasi atrofida quyidagicha ko'rinadi:

1 2 3 4 5 6 7 8 9 10

5.8-rasm | Do…while takrorlash bayonoti UML faoliyat diagrammasi.

while (shart)

5.7-rasm | takrorlash bayonoti paytida ... bajaring. (2-qismning 2-qismi.)

Yo'qligini aniqlang


aylanish kerak
davom eting [hisoblagich > 10]

[hisoblagich <= 10]

++ hisoblagich

ni ko'rsatish


hisoblagich qiymati

ni oshiring


nazorat o'zgaruvchisi

System.out.printf( “%d ”, hisoblagich );


5.6 165-sonli ko'p tanlovli kommutator

bu chalkash bo'lishi mumkin. O'quvchi oxirgi qatorni noto'g'ri talqin qilishi mumkin - while (shart); - kabi
bo'sh gapni o'z ichiga olgan while iborasi (o'z-o'zidan nuqta-vergul). Shunday qilib,
do… holbuki bitta tanali bayonot odatda qavslar bilan quyidagicha yoziladi:

5.6 Ko'p tanlovli bayonotni almashtirish


4-bobda bitta tanlovli if va if…else ikkilamchi tanlovi muhokama qilingan
bayonot. Switch bir nechta tanlash bayonoti asosida turli harakatlarni amalga oshiradi
bayt, short, int yoki char tipidagi doimiy integral ifodaning mumkin bo'lgan qiymatlari. Sifatida
Java SE 7 da ifoda 5.7-bo'limda muhokama qilinadigan String bo'lishi mumkin.
A, B, C, D va F baholarini hisoblash uchun almashtirish bayonotidan foydalanish
5.9-rasmda foydalanuvchi tomonidan kiritilgan raqamli baholar to'plamining sinf o'rtacha qiymati hisoblab chiqiladi va
har bir baho A, B, C ga ekvivalent ekanligini aniqlash uchun switch bayonotidan foydalanadi,
D yoki F va tegishli sinf hisoblagichini oshirish uchun. Dastur shuningdek, summani ko'rsatadi
har bir baho olgan talabalar sonining mari.
Sinf o'rtacha dasturining oldingi versiyalari singari, sinfning asosiy usuli Letter-
Baholar (5.9-rasm) jami (9-satr) va gradeCounter (10-satr) mahalliy oʻzgaruvchilarni eʼlon qiladi.
foydalanuvchi tomonidan kiritilgan baholar yig'indisini va kiritilgan baholar sonini kuzatib boring,
mos ravishda. 11-15 qatorlar har bir sinf toifasi uchun hisoblagich o'zgaruvchilarini e'lon qiladi. E'tibor bering,
9-15 qatorlardagi o'zgaruvchilar aniq 0 ga ishga tushiriladi.
Asosiy usul ikkita asosiy qismdan iborat. 26-56 qatorlar ixtiyoriy sonni o'qiydi
Sentinel tomonidan boshqariladigan takrorlash yordamida foydalanuvchidan baholar, jami misol o'zgaruvchilarini yangilash
va gradeCounter va har bir baho uchun tegishli harf bahosi hisoblagichini oshiring
kirgan. 59-80 qatorlar kiritilgan barcha baholarning jami, o'rtacha qiymatini o'z ichiga olgan hisobotni chiqaradi
baholar va har bir harf bahosini olgan talabalar soni. Keling, tekshiramiz
bu qismlarni batafsilroq.

qil
bayonot


while (shart);

qil
{


bayonot
} while (shart);
Yaxshi dasturlash amaliyoti 5.2
Do…while iborasiga har doim qavs qo'shing. Bu o'rtasidagi noaniqlikni bartaraf etishga yordam beradi
while iborasi va do…while iborasi faqat bitta gapdan iborat.

1 // 5.9-rasm: LetterGrades.java


2 // LetterGrades sinfi harf baholarini hisoblash uchun switch iborasidan foydalanadi.
3 import java.util.Scanner;
4
5 ommaviy sinf LetterGrades
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {

5.9-rasm | LetterGrades klassi harf baholarini hisoblash uchun switch iborasidan foydalanadi. (3-qismning 1-qismi.)


166 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

9
10
11
12
13
14
15
16
17 Skaner kiritish = yangi Skaner(System.in);
18
19 System.out.printf("%s%n%s%n %s%n %s%n",
20 "0-100 oralig'ida butun sonlarni kiriting.",
21 "Kirishni tugatish uchun fayl oxiri indikatorini kiriting:",
22 "UNIX/Linux/Mac OS X da d yozing va Enter tugmasini bosing",
23 "Windows tizimida z ni kiriting, keyin Enter tugmasini bosing");
24
25 // foydalanuvchi fayl oxiri indikatorini kiritmaguncha aylanish
26 vaqt ( )
27 {
28 int baho = input.nextInt(); // o'qish bahosi
29 jami += baho; // jamiga baho qo'shing
30 ++ darajali hisoblagich; // baholar sonini oshirish
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 } // tugash vaqti
57
58 // baho hisobotini ko'rsatish
59 System.out.printf("%nGrade hisoboti:%n");
60

5.9-rasm | LetterGrades klassi harf baholarini hisoblash uchun switch iborasidan foydalanadi. (3 qismning 2-qismi.)

int jami = 0; // baholar yig'indisi
int gradeCounter = 0; // kiritilgan baholar soni
int aCount = 0; // A baholar soni
int bCount = 0; // B baholar soni
int cCount = 0; // C baholari soni
int dCount = 0; // D baholari soni
int fCount = 0; // F baholar soni

input.hasNext()

// tegishli harf darajasi hisoblagichini oshiring
kalit (daraj / 10)
{
9-holat: // baho 90 orasida edi
holat 10: // va 100, shu jumladan
++aCount;
sindirish; // kalitdan chiqadi
8-holat: // baho 80 dan 89 gacha edi
++bCount;
sindirish; // kalitdan chiqadi
7-holat: // baho 70 dan 79 gacha edi
++cCount;
sindirish; // kalitdan chiqadi
6-holat: // baho 60 dan 69 gacha edi
++dCount;
sindirish; // kalitdan chiqadi
sukut bo'yicha: // baho 60 dan kam edi
++fCount;
sindirish; // ixtiyoriy; baribir chiqish tugmasi
} // tugatish tugmasi

5.6 167-sonli ko'p tanlovli kommutator

Foydalanuvchining o'qish baholari
19–23 qatorlar foydalanuvchidan butun sonlarni kiritishga va fayl tugashi indikatorini kiritishga taklif qiladi.
kiritishni tugatish uchun. Fayl tugashi indikatori tizimga bog'liq bo'lgan tugmalar birikmasidir.

61 // agar foydalanuvchi kamida bitta baho kiritgan bo'lsa...


62 agar (gradeCounter != 0)
63 {
64 // kiritilgan barcha baholarning o'rtacha qiymatini hisoblang
65 ikki barobar o'rtacha = (ikki marta) jami / gradeCounter;
66
67 // natijalarning xulosasi
68 System.out.printf("Kiritilgan %d baholarning umumiy soni %d%n",
69 sinf Hisoblagich, jami);
70 System.out.printf("O'rtacha sinf %.2f%n", o'rtacha);
71 System.out.printf("%n%s%n%n%s%d%n%s%d%n%s%d%n%s%d%n%s%d%n",
72 "Har bir baho olgan talabalar soni:",
73 "A: ", aCount, // A baholar sonini ko'rsatish
74 "B: ", bCount, // B baholari sonini ko'rsatish
75 "C: ", cCount, // C darajalari sonini ko'rsatish
76 "D: ", dCount, // D baholari sonini ko'rsatish
77 "F: ", fCount); // F baholar sonini ko'rsatish
78 } // agar tugaydi
79 boshqa // hech qanday baholar kiritilmagan, shuning uchun tegishli xabarni chiqaring
80 System.out.println("Hech qanday baholar kiritilmagan");
81 } // asosiyni tugating
82 } // oxirgi sinf LetterGrades

Butun sonlarni 0-100 oralig'ida kiriting.


Kirishni tugatish uchun fayl oxiri indikatorini kiriting:
UNIX/Linux/Mac OS X da d yozing va Enter tugmasini bosing
Windows tizimida z yozing va Enter tugmasini bosing
99
92
45
57
63
71
76
85
90
100
^Z

Baho hisoboti:


Kiritilgan 10 ta sinfning jami 778 tasi
O'rtacha sinf - 77,80

Har bir baho olgan talabalar soni:


A: 4
B: 1
C: 2
D: 1
F: 2

5.9-rasm | LetterGrades klassi harf baholarini hisoblash uchun switch iborasidan foydalanadi. (3 qismning 3-qismi.)


168 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

foydalanuvchi kiritish uchun boshqa ma'lumot yo'qligini bildirish uchun kiritadigan millat. 15-bobda,
Fayllar, oqimlar va ob'ektlarni ketma-ketlashtirish, siz fayl oxiri ko'rsatkichi qanday ishlatilishini ko'rasiz
dastur fayldan kiritilgan ma'lumotlarni o'qiganda.
UNIX/Linux/Mac OS X tizimlarida fayl oxiri ketma-ketlikni kiritish orqali kiritiladi.

o'z-o'zidan chiziqda. Ushbu belgi bir vaqtning o'zida Ctrl tugmachasini va tugmachasini bosishni anglatadi


d tugmasi. Windows tizimlarida fayl oxirini yozish orqali kiritish mumkin

[Izoh: Ba'zi tizimlarda fayl oxiri tugmalari ketma-ketligini kiritgandan so'ng Enter tugmasini bosishingiz kerak.


Bundan tashqari, Windows odatda fayl oxiri o'rnatilganda ekranda ^Z belgilarini ko'rsatadi.
5.9-rasmda ko'rsatilganidek, dikator teriladi.]

while ifodasi (26–56-qatorlar) foydalanuvchi kiritishini oladi. 26-qatordagi holat


Kiritish uchun ko'proq ma'lumot mavjudligini aniqlash uchun Scanner usuli hasNext-ni chaqiradi. Bu
usul ko'proq ma'lumot bo'lsa, mantiqiy qiymatni true qaytaradi; aks holda, u false qaytaradi.
Qaytarilgan qiymat keyin esa while ifodasida shartning qiymati sifatida ishlatiladi.
HasNext usuli foydalanuvchi fayl oxiri indikatorini kiritgandan so'ng false qiymatini qaytaradi.
28-qator foydalanuvchi tomonidan baho qiymatini kiritadi. 29-qator jamiga baho qo'shadi. 30-qator
gradeCounterni oshiradi. Ushbu o'zgaruvchilar o'rtacha baholarni hisoblash uchun ishlatiladi.
33–55-qatorlar tegishli harf bahosi hisoblagichini oshirish uchun switch iborasidan foydalanadi
kiritilgan raqamli baho asosida.

Baholarni qayta ishlash


Switch bayonoti (33-55-qatorlar) qaysi hisoblagichni oshirish kerakligini aniqlaydi. Biz taxmin qilamiz
foydalanuvchi 0-100 oralig'ida haqiqiy bahoni kiritadi. 90-100 oralig'idagi baho
A yuboradi, 80-89 B ni, 70-79 C ni, 60-69 D ni va 0-59 ni ifodalaydi
F. Switch operatori blokdan iborat bo'lib, u holda belgilar ketma-ketligini va
ixtiyoriy standart holat. Bu misolda qaysi hisoblagichni aniqlash uchun foydalaniladi
darajaga qarab o'sish.
Boshqarish oqimi kalitga yetganda, dastur ichidagi ifodani baholaydi
kalit so'zni o'zgartirishdan keyingi qavslar (daraj / 10). Bu kalitni boshqarish
ifoda. Dastur ushbu ifodaning qiymatini taqqoslaydi (uni integral bilan baholash kerak).
bayt, char, short yoki int tipidagi gral qiymati yoki Stringga) har bir holat belgisi bilan. kon-
33-qatordagi trolling ifodasi kasr qismini qisqartiradigan butun son bo'linishini amalga oshiradi
natijadan. Shunday qilib, biz 0 dan 100 gacha bo'lgan qiymatni 10 ga bo'lsak, natija har doim qiymat bo'ladi
0 dan 10 gacha. Biz ushbu qiymatlarning bir nechtasini ish belgilarida ishlatamiz. Masalan, agar foydalanuvchi
85 butun sonini kiritadi, boshqaruvchi ifoda 8 ga baholanadi. Kalit 8 ni solishtiradi
har bir holat belgisi bilan. Agar mos kelsa (8-holat: 40-qatorda), dastur buni amalga oshiradi
ishning bayonotlari. Butun son 8 uchun 41-qator bCountni oshiradi, chunki 80-yillardagi baho
Bu B. Tanaffus bayonoti (42-qator) dastur boshqaruvini birinchisi bilan davom ettirishga olib keladi
o'tishdan keyingi bayonot - bu dasturda biz while tsiklining oxiriga yetamiz, shuning uchun

d

z

Portativlik bo'yicha maslahat 5.1


Fayl oxirini kiritish uchun tugmalar birikmalari tizimga bog'liq.

5.6 169-sonli ko'p tanlovli kommutator

trol 26-qatordagi halqani davom ettirish shartiga qaytib, halqa yoki yo‘qligini aniqlaydi
amalga oshirishni davom ettirishi kerak.
Bizning kalitimizdagi holatlar 10, 9, 8, 7 va 6 qiymatlarini aniq sinab ko'radi. Quyidagi holatlarga e'tibor bering.
9 va 10 qiymatlarni sinab ko'radigan 35–36 qatorlar (ikkalasi ham A darajasini bildiradi). Roʻyxat
ishlar shu tarzda ketma-ket, ular orasida hech qanday bayonotsiz, ishlarni bajarishga imkon beradi
bir xil bayonotlar to'plamini hosil qiling - nazorat qiluvchi ifoda 9 yoki 10 ga baholanganda,
37–38-qatorlardagi bayonotlar bajariladi. Switch bayonoti mexanizmni ta'minlamaydi
qiymatlar diapazonlarini sinash uchun, shuning uchun siz sinab ko'rishingiz kerak bo'lgan har bir qiymat alohida holatda ko'rsatilishi kerak
teg. Har bir holatda bir nechta bayonot bo'lishi mumkin. Switch bayonoti boshqa shartlardan farq qiladi.
trol iboralari, chunki u holda bir nechta iboralar atrofida qavslar kerak emas.
tanaffussiz holat Bayonot
Tanaffus iboralarisiz, har safar kommutatorda mos kelsa, buning uchun bayonotlar
case va keyingi holatlar break operatori yoki kalit tugaguniga qadar bajariladi.
qarshi chiqdi. Bu ko'pincha keyingi bayonotlarga "tushish" deb ataladi
holatlar. (Ushbu xususiyat iterativ qo'shiqni ko'rsatadigan ixcham dastur yozish uchun juda mos keladi
5.29-mashqdagi "Rojdestvoning o'n ikki kuni".)

Standart Case


Nazorat qiluvchi ifodaning qiymati va katta-kichik yorliq o'rtasida mos kelmasa,
standart holat (52–54-qatorlar) bajariladi. Qayta ishlash uchun biz ushbu misoldagi standart holatdan foydalanamiz
6 dan kichik bo'lgan barcha nazorat-ifoda qiymatlari, ya'ni barcha muvaffaqiyatsiz baholar. Agar mos kelmasa
sodir bo'ladi va kalitda standart holat bo'lmasa, dasturni boshqarish shunchaki davom etadi
almashtirishdan keyingi birinchi bayonot bilan.

Baho hisoboti ko'rsatilmoqda


59-80 qatorlar kiritilgan baholar asosida hisobot chiqaradi (kirish/chiqishda ko'rsatilganidek)
5.9-rasmdagi oyna). 62-qator foydalanuvchining kamida bitta sinfni kiritganligini aniqlaydi - bu
nolga bo'linmaslikka yordam beradi. Agar shunday bo'lsa, 65-qator baholarning o'rtacha qiymatini hisoblab chiqadi. 68-qatorlar
77, keyin barcha baholar, sinf o'rtacha va talabalar soni jami chiqdi
har bir harf bahosini oldi. Agar baholar kiritilmagan bo'lsa, 80-qator tegishli xabarni chiqaradi.
adaçayı. 5.9-rasmdagi chiqish 10 bahoga asoslangan namunaviy baho hisobotini ko'rsatadi.
switch bayonoti UML faoliyat diagrammasi
5.10-rasmda umumiy switch bayonoti uchun UML faoliyat diagrammasi ko'rsatilgan. Ko'pchilik
switch iboralari pro-dan keyin switch iborasini tugatish uchun har bir holatda tanaffusdan foydalanadi.
ishni tugatish. 5.10-rasmda faoliyatga break iboralarini kiritish orqali buni ta'kidlaydi
diagramma. Diagramma ish oxiridagi break iborasi sabab bo'lishini aniq ko'rsatadi
switch bayonotidan darhol chiqishni boshqarish.

Umumiy dasturlash xatosi 5.7


Kommutatorda kerak bo'lganda break iborasini unutish mantiqiy xatodir.

Xatolarning oldini olish bo'yicha maslahat 5.7


Switch bayonotida boshqaruv ifodasining barcha mumkin bo'lgan qiymatlarini sinab ko'rganingizga ishonch hosil qiling.
sion.

170 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Kommutatorning oxirgi holati (yoki ixtiyoriy) uchun break bayonoti talab qilinmaydi
sukut bo'yicha, oxirgi marta paydo bo'lganda), chunki bajarish keyingi bayonot bilan davom etadi
kalitdan keyin.

Kommutatorning har bir holatidagi ifodaga oid eslatmalar


Switch iborasidan foydalanganda, har bir holatda doimiy integratsiya bo'lishi kerakligini yodda tuting.
gral ifodasi - bu doimiyga baholanadigan butun son konstantalarining har qanday birikmasi
butun son qiymati (masalan, –7, 0 yoki 221) — yoki String. Butun son konstantasi shunchaki butun son qiymatidir.
u. Bundan tashqari, siz belgilar konstantalaridan foydalanishingiz mumkin - bitta tirnoq ichidagi o'ziga xos belgilar, masalan
'A', '7' yoki '$' sifatida - bu belgilarning butun qiymatlari va raqam konstantalarini ifodalaydi (in-
6.10-bandda kiritilgan). (B ilovasida belgilarning butun qiymatlari ko'rsatilgan
Java tomonidan ishlatiladigan Unicode® belgilar to'plamining kichik to'plami bo'lgan ASCII belgilar to'plami.)
Har bir holatda ifoda doimiy o'zgaruvchi bo'lishi mumkin - a ni o'z ichiga olgan o'zgaruvchi
butun dastur uchun o'zgarmaydigan qiymat. Bunday o'zgaruvchi kalit bilan e'lon qilinadi -
yakuniy so'z (6-bobda muhokama qilingan). Java-da enum turlari deb ataladigan xususiyat mavjud, biz ham
6-bobda mavjud — enum tipidagi konstantalar ish belgilarida ham ishlatilishi mumkin.

5.10-rasm | ko'p tanlash bayonoti UML faoliyat diagrammasini break iboralari bilan almashtiring.

Xatolarning oldini olish bo'yicha maslahat 5.8
Switch bayonotlarida standart holatni taqdim eting. Bu sizning e'tiboringizni sobiq qayta ishlash zarurligiga qaratadi.
qabul qilish shartlari.

Yaxshi dasturlash amaliyoti 5.3


Har bir holat va kalitdagi standart holat har qanday tartibda sodir bo'lishi mumkin bo'lsa-da, o'chirish tugmachasini joylashtiring.
xato holati oxirgi. Birlamchi holat oxirgi ro'yxatda bo'lsa, bu holat uchun tanaffus talab qilinmaydi.

...


standart harakatlar(lar)

vaziyatda harakatlar(lar)

b holatidagi harakatlar(lar)

case z amal(lar)ni buzish

tanaffus

tanaffus


holat b

hol z


holat a

[noto'g'ri]

[to'g'ri]

[to'g'ri]

[to'g'ri]

[noto'g'ri]

[noto'g'ri]

5.7 Class AutoPolicy Case Study: 171-sonli kommutatordagi satrlar

Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar 10-bobida biz
switch mantiqini amalga oshirishning yanada oqlangan usulini taqdim etamiz - biz poli-
morfizm ko'pincha aniqroq bo'lgan dasturlarni yaratish, parvarish qilish osonroq va kengaytirilishi oson
switch mantiqidan foydalanadigan dasturlarga qaraganda.

5.7 Class AutoPolicy Case Study: Kommutatordagi satrlar


Bayonotlar
Satrlardan switch iboralarida va String literallarida boshqaruvchi ifodalar sifatida foydalanish mumkin
yorliqlarida foydalanish mumkin. Stringlarni boshqaruvchi ifoda sifatida foydalanish mumkinligini ko'rsatish uchun
switch iboralarida sions va String literallari case yorliqlarida ishlatilishi mumkin, biz quyidagilarni amalga oshiramiz:
quyidagi talablarga javob beradigan ilovani tanlang:
Sizni shimoli-sharqiy shtatlarga xizmat ko'rsatadigan avtoulov sug'urtasi kompaniyasi ishga oldi -
Konnektikut, Meyn, Massachusets, Nyu-Xempshir, Nyu-Jersi, Nyu-York, Pensil-
Vaniya, Rod-Aylend va Vermont. Kompaniya sizdan dastur yaratishingizni xohlaydi
Bu ularning har bir avtosug'urta polisi bo'yicha hisobot tayyorlaydi
polis "aybsiz" avtomobil sug'urtasi bo'lgan shtatda o'tkaziladi - Massachusets, Nyu-Jersi,
Nyu-York va Pensilvaniya.
Ushbu talablarga javob beradigan Java ilovasi ikkita sinfni o'z ichiga oladi - AutoPolicy (5.11-rasm)
va AutoPolicyTest (5.12-rasm).
Class Autopolicy
Class AutoPolicy (Fig. 5.11) avtosug'urta polisini ifodalaydi. Sinf tarkibiga quyidagilar kiradi:
• siyosat hisob raqamini saqlash uchun int instance o'zgaruvchan accountNumber (5-qator).
• Mashina markasi va modelini saqlash uchun makeAndModel o'zgaruvchisi qatori (6-qator).
(masalan, "Toyota Camry")
• Ikki belgili holat qisqartmasini saqlash uchun satr namunasi o'zgaruvchan holati (7-qator).
siyosat yuritilayotgan shtatni ifodalaydi (masalan, Massachusets uchun "MA")
• sinf misol o'zgaruvchilarini ishga tushiradigan konstruktor (10–15-qatorlar)
• sozlash va olish uchun setAccountNumber va getAccountNumber usullari (18–27-qatorlar)
AutoPolicy's accountNumber misol o'zgaruvchisi
• sozlash va olish uchun setMakeAndModel va getMakeAndModel usullari (30–39-qatorlar)
AutoPolicy makeAndModel misol o'zgaruvchisi
• AutoPolicy'ni o'rnatish va olish uchun setState va getState usullari (42–51-qatorlar)
davlat namunasi o'zgaruvchisi
• isNoFaultState usuli (54–70-qatorlar) boolean qiymatini ko'rsatadi
polis hech qanday aybi yo'q avtosug'urta holatida o'tkaziladimi; usuliga e'tibor bering
nom - mantiqiy qiymatni qaytaradigan get usuli uchun nomlash konventsiyasi
ismni "olish" emas, balki "is" bilan boshlash (bunday usul odatda
predikat usuli deb ataladi).
isNoFaultState usulida switch operatorining boshqaruvchi ifodasi (59-satr) hisoblanadi
GetState AutoPolicy usuli bilan qaytarilgan satr. Switch iborasi ni solishtiradi
iboraning qiymatini ish belgilari bilan nazorat qilish (61-qator) pol-
icy Massachusets, Nyu-Jersi, Nyu-York yoki Pensilvaniyada (aybsiz shtatlar) o'tkaziladi.

172 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Agar mos keladigan bo'lsa, 62-qator noFaultState mahalliy o'zgaruvchisini true ga o'rnatadi va kalit
bayonot tugatiladi; aks holda, standart holat noFaultState ni false ga o'rnatadi (65-satr).
Keyin isNoFaultState usuli noFaultState mahalliy o'zgaruvchining qiymatini qaytaradi.
Oddiylik uchun biz konstruktor yoki to'plamdagi AutoPolicy ma'lumotlarini tasdiqlamadik
usullari va biz davlat qisqartmalari har doim ikkita katta harfdan iborat deb hisoblaymiz. Bundan tashqari -
Haqiqiy AutoPolicy klassi, ehtimol, boshqa ko'plab misol o'zgaruvchilari va
hisob egasining ismi, manzili va boshqalar kabi ma'lumotlar usullari. 5.30-mashqda siz
usullaridan foydalangan holda davlat qisqartmasini tasdiqlash orqali AutoPolicy sinfini yaxshilashni so'radi
5.9-bo'limda bilib olasiz.

1 // 5.11-rasm: AutoPolicy.java


2 // Avto sug'urta polisini ifodalovchi sinf.
3 ommaviy sinf AutoPolicy
4 {
5 shaxsiy int hisob raqami; // siyosat hisob raqami
6 xususiy String makeAndModel; // siyosat qo'llaniladigan mashina
7 xususiy String holati; // ikki harfli davlat qisqartmasi
8
9 // konstruktor
10 ommaviy AutoPolicy (int accountNumber, String makeAndModel, String state)
11 {
12 this.accountNumber = accountNumber;
13 this.makeAndModel = makeAndModel;
14 this.state = state;
15 }
16
17 // hisob raqamini o'rnatadi
18 umumiy bekor to'plamAccountNumber(int accountNumber)
19 {
20 this.accountNumber = accountNumber;
21 }
22
23 // hisob raqamini qaytaradi
24 umumiy int getAccountNumber()
25 {
26 hisob raqamini qaytarish;
27 }
28
29 // makeAndModel-ni o'rnatadi
30 ommaviy bekor setMakeAndModel(String makeAndModel)
31 {
32 this.makeAndModel = makeAndModel;
33 }
34
35 // makeAndModelni qaytaradi
36 ommaviy string getMakeAndModel()
37 {
38 makeAndModelni qaytarish;
39 }
40

5.11-rasm | Avtomatik sug'urta polisini ifodalovchi sinf. (2-qismning 1-qismi.)


5.7 Class AutoPolicy Case Study: 173-sonli kommutatordagi satrlar

Class AutoPolicyTest
Class AutoPolicyTest (5.12-rasm) ikkita AutoPolicy obyektini yaratadi (asosiy 8–11-qatorlar).
14-15-qatorlar har bir ob'ektni statik usul policyInNoFaultState-ga o'tkazadi (20-28-qatorlar),
ob'ektni olayotganligini aniqlash va ko'rsatish uchun AutoPolicy usullaridan foydalanadi
aybsiz avtosug'urta holatidagi siyosatni ifodalaydi.

41 // holatni o'rnatadi


42 umumiy bekor setState(String holati)
43 {
44 this.state = state;
45 }
46
47 // holatni qaytaradi
48 ommaviy string getState()
49 {
50 qaytish holati;
51 }
52
53 // predikat usuli shtatda aybsiz sug'urta bor yoki yo'qligini qaytaradi
54
55 {
56 mantiqiy noFaultState;
57
58
59
60
61
62
63
64
65
66
67
68
69 noFaultState qaytaradi;
70 }
71 } // oxirgi sinf AutoPolicy

1 // 5.12-rasm: AutoPolicyTest.java


2 // Kommutatorda satrlarni ko'rsatish.
3 ommaviy sinf AutoPolicyTest
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7 // ikkita AutoPolicy obyektini yarating
8 AutoPolicy siyosati1 =
9 ta yangi AutoPolicy(11111111, "Toyota Camry", );
10 AutoPolicy siyosati2 =
11 ta yangi AutoPolicy(22222222, "Ford Fusion", );

5.12-rasm | Kommutatorda satrlarni ko'rsatish. (2-qismning 1-qismi.)

5.11-rasm | Avtomatik sug'urta polisini ifodalovchi sinf. (2-qismning 2-qismi.)

ommaviy mantiqiy isNoFaultState()

// shtatda avtomashinani aybsiz sug'urta qilish yoki yo'qligini aniqlash
switch (getState()) // AutoPolicy obyektining davlat qisqartmasini oling
{
"MA" ishi: "NJ" ishi: "NY" ishi: "PA" ishi:
noFaultState = rost;
sindirish;
standart:
noFaultState = noto'g'ri;
sindirish;
}

"NJ"


"ME"

174 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

5.8 Tanaffus va davom bayonotlari
Tanlash va takrorlash iboralariga qo'shimcha ravishda, Java break iboralarini taqdim etadi (qaysi
biz switch bayonoti kontekstida muhokama qildik) va davom eting (ushbu bo'limda keltirilgan)
Boshqaruv oqimini o'zgartirish uchun L) ilovasi va onlayn. Oldingi bo'lim ko'rsatdi
switch iborasining bajarilishini tugatish uchun break qanday ishlatilishi mumkin. Ushbu bo'lim muhokama qilinadi
takroriy gaplarda breakdan qanday foydalanish kerak.
break bayonoti
break iborasi biroz vaqt ichida bajarilganda, for, do…while yoki switch, imme-ni keltirib chiqaradi.
bu bayonotdan chiqish. Ijro etilishdan keyingi birinchi bayonot bilan davom etadi.
trol bayonoti. Break iborasining keng tarqalgan qo'llanilishi tsikldan erta qochish yoki to
kalitning qolgan qismini o'tkazib yuboring (5.9-rasmdagi kabi). 5.13-rasmda uzilish holati ko'rsatilgan.
a for dan chiqish.

12
13 // har bir siyosat xatosiz holatda yoki yo'qligini ko'rsatish


14 policyInNoFaultState(policy1);
15 policyInNoFaultState(policy2);
16 }
17
18 // AutoPolicy yoki yo'qligini ko'rsatadigan usul
19 // avtomashinani aybsiz sug'urtalangan holatda
20 umumiy statik bekor siyosatiInNoFaultState(AutoPolicy siyosati)
21 {
22 System.out.println("Avtomatik siyosat:");
23 System.out.printf(
24 "Hisob №: %d; Avtomobil: %s; Holat %s %sa nosozlik holati%n%n",
25 policy.getAccountNumber(), policy.getMakeAndModel(),
26 policy.getState(),
27);
28 }
29 } // yakuniy sinf AutoPolicyTest

Avtomatik siyosat:


Hisob raqami: 11111111; Avtomobil: Toyota Camry;
Shtat NJ - aybsiz davlat
Avtomatik siyosat:
Hisob raqami: 22222222; Avtomobil: Ford Fusion;
Davlat ME aybsiz holat emas

1 // 5.13-rasm: BreakTest.java


2 // for bayonotidan chiqadigan break operatori.
3 ommaviy sinf BreakTest
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {

5.13-rasm | for bayonotidan chiqadigan break bayonoti. (2-qismning 1-qismi.)

5.12-rasm | Kommutatorda satrlarni ko'rsatish. (2-qismning 2-qismi.)

(policy.isNoFaultState() ? "is": "is not")


5.8 Tanaffus va davom etish bayonotlari 175

for bayonotida (9-15-qatorlar) 11-12-qatorlarda joylashgan if operatori aniqlanganda
bu raqam 5 ga teng, 12-qatordagi break operatori bajariladi. Bu for bayonotini tugatadi,
va dastur 17-qatorga o'tadi (darhol for bayonotidan keyin), u ko'rsatiladi
tsikl tugagach, boshqaruv o'zgaruvchisining qiymatini ko'rsatadigan xabar. Loop
o'z tanasini 10 o'rniga to'rt marta to'liq bajaradi.
Bayonotni davom ettirish
Davom iborasi bir muncha vaqt ichida bajarilsa, for yoki do…hozirda, qolgan-ni o'tkazib yuboradi.
iboralarni tsikl tanasiga kiriting va siklning keyingi iteratsiyasi bilan davom etadi. Vaqtida
va do...while so'zlari, dastur halqani davom ettirish testini darhol baholaydi
davom operatori bajarilgandan keyin. for bayonotida o'sish ifodasi exe-
cutes, keyin dastur loop-davomi testini baholaydi.

7 int hisobi; // boshqaruv o'zgaruvchisi tsikl tugagandan keyin ham ishlatiladi


8
9 uchun (hisoblash = 1; hisoblash <= 10; hisoblash++) // 10 marta aylanish
10 {
11 bo'lsa (hisoblash == 5)
12
13
14 System.out.printf("%d ", hisoblash);
15 }
16
17 System.out.printf("%nSonchadan chiqib ketdi = %d%n", hisoblash);
18 }
19 } // BreakTest sinfini yakunlash

1 2 3 4
Hisoblashda tsikldan chiqib ketdi = 5

1 // 5.14-rasm: ContinueTest.java
2 // for bayonotining iteratsiyasini tugatuvchi davomli bayonot.
3 ommaviy sinf ContinueTest
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7 uchun (int count = 1; count <= 10; count++) // 10 marta aylanish
8 {
9 bo'lsa (hisoblash == 5)
10
11
12 System.out.printf("%d ", hisoblash);
13 }
14
15 System.out.printf("%nUsed 5%n chop etishni o'tkazib yuborishni davom ettirmoqda");
16 }
17 } // yakuniy sinf ContinueTest

5.14-rasm | for bayonotining iteratsiyasini tugatuvchi davomli bayonot. (2-qismning 1-qismi.)

5.13-rasm | for bayonotidan chiqadigan break bayonoti. (2-qismning 2-qismi.)

sindirish; // agar sana 5 bo'lsa, tsikl tugaydi

davom ettirish; // agar raqam 5 bo'lsa, tsikl tanasida qolgan kodni o'tkazib yuboring

176 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

5.14-rasmda 12-qatordagi bayonotni o'tkazib yuborish uchun davom (10-qator) ishlatiladi.
if sanoqning qiymati 5 ga teng ekanligini aniqlaydi. Continue operatori bajarilganda dastur
boshqarish for operatoridagi boshqaruv o'zgaruvchisining o'sishi bilan davom etadi (7-qator).
5.3-bo'limda biz while dan ko'p hollarda for o'rniga ishlatilishi mumkinligini aytdik. Bu
while dagi o'sish ifodasi davom iborasidan keyin kelganda to'g'ri emas. In
bu holda, o'sish dastur takrorlanishni baholashdan oldin bajarilmaydi.
davom etish sharti, shuning uchun while for bilan bir xil tarzda bajarilmaydi.

5.9 Mantiqiy operatorlar


if, if…else, while, do…while va for iboralarining har biri bekor qilish shartini talab qiladi.
dasturni boshqarish oqimini qanday davom ettirishni tugatish. Hozirgacha biz oddiy narsalarni o'rganib chiqdik
count <= 10, raqam != sentinelValue va jami > 1000 kabi shartlar. Oddiy kon-
nisbatlar >, <, >= va <= munosabat operatorlari va tenglik bilan ifodalanadi.
== va != operatorlari va har bir ifoda faqat bitta shartni tekshiradi. Bir nechta shartlarni sinab ko'rish uchun
qaror qabul qilish jarayonida biz ushbu testlarni alohida bayonotlarda o'tkazdik
yoki ichki o'rnatilgan if yoki if...else iboralarida. Ba'zan nazorat bayonotlari ko'proq ma'lumotni talab qiladi.
dasturni boshqarish oqimini aniqlash uchun pleks shartlari.
Java ning mantiqiy operatorlari birlashtirib, murakkabroq shartlarni yaratishga imkon beradi
oddiy shartlar. Mantiqiy operatorlar && (shartli AND), || (shartli OR) &
(mantiqiy mantiqiy AND), | (mantiqiy mantiqiy inklyuziv OR), ^ (mantiqiy mantiqiy eksklyuziv OR)
va ! (mantiqiy EMAS). [Izoh: &, | va ^ operatorlari ular bo'lganda ham bitli operatorlardir
integral operandlarga qo'llaniladi. Bitli operatorlarni onlayn K ilovasida muhokama qilamiz.]
Shartli VA (&&) operatori
Faraz qilaylik, biz dasturning qaysidir nuqtasida ikkala shart ham to'g'ri ekanligini ta'minlamoqchimiz
biz ijro etishning ma'lum bir yo'lini tanlashimizdan oldin. Bunday holda, biz && (shartli
AND) operatori quyidagicha:

1 2 3 4 6 7 8 9 10


Chop etishni o‘tkazib yuborishda davom eting 5

Dasturiy ta'minot muhandisligi kuzatuvi 5.2


Ba'zi dasturchilar tizimli dasturlashni buzish va buzishda davom etishlarini his qilishadi. dan beri
Xuddi shu effektlarga tuzilgan dasturlash texnikasi bilan erishish mumkin, bu dasturchilar
break yoki davom dan foydalanmang.

Dasturiy ta'minot muhandisligi kuzatuvi 5.3


Sifatli dasturiy ta'minot muhandisligiga erishish va eng yaxshi natijaga erishish o'rtasida keskinlik mavjud.
dasturiy ta'minotni amalga oshirish. Ba'zan bu maqsadlardan biri ikkinchisi hisobidan amalga oshiriladi.
Eng ko'p ishlash talab qiladigan vaziyatlardan tashqari hamma uchun quyidagi asosiy qoidani qo'llang:
Birinchidan, kodingizni sodda va to'g'ri qiling; keyin uni tez va kichik qiling, lekin agar kerak bo'lsa.

agar (jins == AYOL && yosh >= 65)


++keksa ayollar;

5.14-rasm | for bayonotining iteratsiyasini tugatuvchi davomli bayonot. (2-qismning 2-qismi.)


5.9 Mantiqiy operatorlar 177

Bu if bayonotida ikkita oddiy shart mavjud. Vaziyat jinsi == AYOL
odamning ayol ekanligini aniqlash uchun oʻzgaruvchan jinsni doimiy AYOLga ajratadi. The
Shaxsning yoshi > = 65 bo'lganligi, odamning keksa fuqaro ekanligini aniqlash uchun baholanishi mumkin.
If bayonoti birlashtirilgan shartni ko'rib chiqadi

bu ikkala oddiy shart ham to'g'ri bo'lsa va faqat to'g'ri bo'ladi. Bunday holda, if iborasi


body seniorFemales 1 ga oshiradi. Agar oddiy shartlardan biri yoki ikkalasi noto‘g‘ri bo‘lsa,
dastur o'sishni o'tkazib yuboradi. Ba'zi dasturchilar avvalgilarini birlashtirganligini aniqlaydilar
shart ortiqcha qavslar qo'shilganda o'qilishi mumkin bo'ladi, masalan:

5.15-rasmdagi jadval && operatorini umumlashtiradi. Jadvalda barcha mumkin bo'lgan to'rtta ko'rsatilgan


ifoda1 va ifoda2 uchun noto'g'ri va haqiqiy qiymatlarning kombinatsiyasi. Bunday jadvallar
haqiqat jadvallari deb ataladi. Java munosabatlarni o'z ichiga olgan barcha ifodalarni noto'g'ri yoki rost deb baholaydi
operatorlar, tenglik operatorlari yoki mantiqiy operatorlar.

Shartli OR (||) operatori


Endi biz ikkita shartdan biri yoki ikkalasi ham oldimizda to'g'ri ekanligini ta'minlashni xohlaymiz
ijro etishning ma'lum bir yo'lini tanlang. Bunday holda biz || dan foydalanamiz (shartli OR) operatori,
quyidagi dastur segmentida bo'lgani kabi:

Bu bayonotda ikkita oddiy shart ham mavjud. Shart semestr O'rtacha >=


90 talabaning kursda A ga loyiqligini aniqlash uchun baholaydi.
semestr davomida id ishlashi. Yakuniy imtihon >= 90 sharti de-
A’lo bahosi tufayli talaba kursda A ga loyiqmi yoki yo‘qligini to‘xtatadi
yakuniy imtihonda ishlash. If iborasi keyin birlashtirilgan shartni ko'rib chiqadi

oddiy shartlardan biri yoki ikkalasi ham to‘g‘ri bo‘lsa, talabaga A bahosini beradi. Faqat


"Talaba bahosi A" degan xabar chop etilmasa, ikkala oddiy shart ham
fikrlar yolg'ondir. 5.16-rasm shartli OR (||) operatori uchun haqiqat jadvali. Operator &&
operatorga nisbatan ustunlikka ega ||. Ikkala operator ham chapdan o'ngga bog'lanadi.

jins == AYOL && yoshi >= 65

(jins == AYOL) && (yosh >= 65)

ifoda1 ifoda2 ifoda1 && ifoda2

yolg'on yolg'on yolg'on
yolg'on haqiqiy yolg'on
rost yolg'on yolg'on
haqiqat haqiqat haqiqat

5.15-rasm | && (shartli AND) operator haqiqat jadvali.

agar ((semestr oʻrtacha >= 90) || (yakuniy imtihon >= 90))
System.out.println ("Talaba bahosi A");

(semestr o'rtacha >= 90) || (yakuniy imtihon >= 90)


178 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Murakkab sharoitlarni qisqa tutashuvli baholash
&& yoki || ni o'z ichiga olgan ifoda qismlari operatorlar faqat ma'lum bo'lgunga qadar baholanadi
shart to'g'ri yoki noto'g'ri. Shunday qilib, ifodani baholash

Agar jins AYOLga teng bo'lmasa (ya'ni, butun ifoda noto'g'ri bo'lsa) va darhol to'xtaydi


Agar jins AYOLga teng bo'lsa, davom etadi (ya'ni, agar bo'lsa, butun ifoda to'g'ri bo'lishi mumkin
shart yoshi >= 65 to'g'ri). Shartli VA va shartli OR ning bu xususiyati
bosimlar qisqa tutashuvni baholash deb ataladi.

Mantiqiy mantiqiy VA (&) va mantiqiy mantiqiy inklyuziv OR (|) operatorlari


Mantiqiy mantiqiy AND (&) va mantiqiy mantiqiy inklyuziv OR (|) operatorlari bir xil.
&& va || ga operatorlari, bundan mustasno & va | operatorlar har doim ikkalasini ham baholaydilar
operandlar (ya'ni, ular qisqa tutashuvni baholashni amalga oshirmaydi). Shunday qilib, ifoda

jinsi 1 ga teng bo'lishidan qat'i nazar, yosh >= 65 ni baholaydi. Bu to'g'ri bo'lsa foydali bo'ladi.


operand talab qilinadigan yon ta'sirga ega - o'zgaruvchining qiymatini o'zgartirish. Masalan,
ifoda

shart ++yosh >= 65 baholanishini kafolatlaydi. Shunday qilib, o'zgaruvchan yosh -


umumiy ifodaning toʻgʻri yoki notoʻgʻri ekanligidan qatʼi nazar, krementlanadi.

ifoda1 ifoda2 ifoda1 || ifoda 2

yolg'on yolg'on yolg'on
yolg'on haqiqat haqiqat
rost yolg'on haqiqat
haqiqat haqiqat haqiqat

5.16-rasm | || (shartli OR) operator haqiqat jadvali.

(jins == AYOL) && (yosh >= 65)

Umumiy dasturlash xatosi 5.8


&& operatoridan foydalanadigan iboralarda shart - biz buni bog'liq shart deb ataymiz -
bog'liq shartni baholash uchun boshqa shart to'g'ri bo'lishini talab qilishi mumkin
mazmunli. Bunda tobe shart && operatoridan keyin qo`yilishi kerak
xatolarni oldini olish. (i != 0) && (10 / i == 2) ifodasini ko'rib chiqing. Bog'liq holat
Nolga bo'lish imkoniyatini oldini olish uchun && operatoridan keyin (10 / i == 2) kelishi kerak.

(jinsi == 1) & (yosh >= 65)

(tug'ilgan kun == rost) | (++yosh >= 65)

Xatolarning oldini olish bo'yicha maslahat 5.9


Aniqlik uchun sharoitlarda nojo'ya ta'sirlar (masalan, topshiriqlar) bo'lgan iboralardan qoching. Ular
kodni tushunishni qiyinlashtirishi va nozik mantiqiy xatolarga olib kelishi mumkin.

Xatolarning oldini olish bo'yicha maslahat 5.10


Belgilash (=) iboralari odatda shartlarda ishlatilmasligi kerak. Har bir shart
mantiqiy qiymatga olib kelishi kerak; aks holda kompilyatsiya xatosi yuzaga keladi. Bir holatda, an
Agar mantiqiy o'zgaruvchiga mantiqiy ifoda tayinlangan bo'lsa, topshiriq kompilyatsiya qilinadi.

5.9 Mantiqiy operatorlar 179

Mantiqiy mantiqiy eksklyuziv OR (^)
Mantiqiy mantiqiy eksklyuziv OR (^) operatorini o'z ichiga olgan oddiy shart, agar va agar rost bo'lsa
faqat uning operandlaridan biri rost, ikkinchisi noto'g'ri bo'lsa. Agar ikkalasi ham to'g'ri yoki ikkalasi ham yolg'on bo'lsa,
barcha shart noto'g'ri. 5.17-rasm mantiqiy eksklyuziv uchun haqiqat jadvalidir
OR operatori (^). Ushbu operator ikkala operandni ham baholashi kafolatlangan.

Mantiqiy inkor (!) operatori


The ! (mantiqiy EMAS, mantiqiy inkor yoki mantiqiy to'ldiruvchi deb ham ataladi) operatori “revers-
es” shartning ma’nosi. &&, ||, &, | mantiqiy operatorlaridan farqli o'laroq va ^, bular
Ikki shartni birlashtirgan ikkilik operatorlar, mantiqiy inkor operatori birlamchi op-
operand sifatida faqat bitta shartga ega bo'lgan erator. Operator shartdan oldin qo'yiladi
asl shart bo'lsa (mantiqiy inkor operatsiyasisiz) bajarish yo'lini tanlash.
ator) dastur segmentidagi kabi noto'g'ri

Agar baho sentinelValue ga teng bo'lmasa, printf chaqiruvini bajaradi. ota-


shart darajasi bo'yicha tezislar == sentinelValue kerak, chunki mantiqiy no-
gation operatori tenglik operatoriga qaraganda yuqoriroq ustunlikka ega.
Aksariyat hollarda mantiqiy inkor qilish shartini ifodalash orqali qochishingiz mumkin.
Tegishli munosabat yoki tenglik operatori bilan. Masalan, oldingi
bayonot quyidagi tarzda ham yozilishi mumkin:

Bu moslashuvchanlik shartni yanada qulayroq ifodalashga yordam beradi. 5.18-rasm


mantiqiy inkor operatori uchun haqiqat jadvalidir.

Mantiqiy operatorlar misoli


5.19-rasmda ushbu bo'limda ko'rib chiqilgan haqiqat jadvallarini yaratish uchun mantiqiy operatorlardan foydalaniladi.
Chiqish baholangan mantiqiy ifodani va uning natijasini ko'rsatadi. dan foydalandik

ifoda1 ifoda2 ifoda1 ^ ifoda2

yolg'on yolg'on yolg'on
yolg'on haqiqat haqiqat
rost yolg'on haqiqat
rost haqiqiy yolg'on

5.17-rasm | ^ (mantiqiy eksklyuziv OR) operator haqiqat jadvali.

agar (! (baho == sentinelValue))
System.out.printf("Keyingi baho %d%n", baho);

agar (baho!= sentinelValue)


System.out.printf("Keyingi baho %d%n", baho);

ifoda !ifoda

yolg'on haqiqat
haqiqiy yolg'on

5.18-rasm | ! (mantiqiy EMAS) operator haqiqat jadvali.


180 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Mantiqiy soʻz asosida “toʻgʻri” soʻzini yoki “notoʻgʻri” soʻzini koʻrsatish uchun %b format spetsifikatsiyasi.
pressning qiymati. 9–13 qatorlar && uchun haqiqat jadvalini chiqaradi. 16-20 qatorlar haqiqatni keltirib chiqaradi
|| uchun jadval. 23–27 qatorlar & uchun haqiqat jadvalini chiqaradi. 30-35 qatorlar haqiqatni keltirib chiqaradi
uchun jadval |. 38–43 qatorlar ^ uchun haqiqat jadvalini chiqaradi. 46-47 qatorlar haqiqat jadvalini chiqaradi
uchun !.

1 // 5.19-rasm: LogicalOperators.java


2 // Mantiqiy operatorlar.
3
4 ommaviy sinf LogicalOperators
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // && (shartli AND) operatori uchun haqiqat jadvalini yarating
9 System.out.printf("%s%n%s: %b%n%s: %b%n%s: %b%n%s: %b%n%n",
10 "Shartli VA (&&)", "noto'g'ri && noto'g'ri", ,
11 "noto'g'ri && rost", ,
12 "to'g'ri && noto'g'ri", ,
13 "to'g'ri && rost", );
14
15 // || uchun haqiqat jadvalini yarating (shartli OR) operatori
16 System.out.printf("%s%n%s: %b%n%s: %b%n%s: %b%n%s: %b%n%n",
17 "Shartli OR (||)", "noto'g'ri || noto'g'ri", ,
18 "noto'g'ri || rost", ,
19 "to'g'ri || noto'g'ri", ,
20 "to'g'ri || rost", );
21
22 // & (mantiqiy mantiqiy AND) operatori uchun haqiqat jadvalini yarating
23 System.out.printf("%s%n%s: %b%n%s: %b%n%s: %b%n%s: %b%n%n",
24 "Mantiqiy mantiqiy VA (&)", "noto'g'ri va noto'g'ri", ,
25 "yolg'on va rost", ,
26 "to'g'ri va noto'g'ri", ,
27 "to'g'ri va haqiqat", );
28
29 // | uchun haqiqat jadvalini yarating (mantiqiy mantiqiy inklyuziv OR) operatori
30 System.out.printf("%s%n%s: %b%n%s: %b%n%s: %b%n%s: %b%n%n",
31 "Mantiqiy mantiqiy inklyuziv OR (|)",
32 "noto'g'ri | noto'g'ri", ,
33 "noto'g'ri | rost", ,
34 "to'g'ri | noto'g'ri", ,
35 "to'g'ri | rost", );
36
37 // ^ (mantiqiy mantiqiy eksklyuziv OR) operatori uchun haqiqat jadvalini yarating
38 System.out.printf("%s%n%s: %b%n%s: %b%n%s: %b%n%s: %b%n%n",
39 "Mantiqiy mantiqiy eksklyuziv OR (^)",
40 "yolg'on ^ noto'g'ri", ,
41 "yolg'on ^ rost", ,
42 "haqiqiy ^ noto'g'ri", ,
43 "haqiqiy ^ rost", );
44

5.19-rasm | Mantiqiy operatorlar. (2-qismning 1-qismi.)

(noto'g'ri && noto'g'ri)

(noto'g'ri && rost)


(to'g'ri && noto'g'ri)
(to'g'ri && rost)

(noto'g'ri || noto'g'ri)

(noto'g'ri || rost)
(to'g'ri || noto'g'ri)
(to'g'ri || rost)

(noto'g'ri va noto'g'ri)

(noto'g'ri va rost)
(to'g'ri va noto'g'ri)
(to'g'ri va haqiqat)

(noto'g'ri | noto'g'ri)


(noto'g'ri | rost)
(to'g'ri | noto'g'ri)
(to'g'ri | haqiqat)

(noto'g'ri ^ noto'g'ri)


(noto'g'ri ^ rost)
(to'g'ri ^ noto'g'ri)
(to'g'ri ^ rost)

5.9 Mantiqiy operatorlar 181

Hozirgacha taqdim etilgan operatorlarning ustuvorligi va assotsiativligi
5.20-rasmda hozirgacha kiritilgan Java operatorlarining ustuvorligi va assotsiativligi ko'rsatilgan.
Operatorlar yuqoridan pastga qarab, ustuvorlikning kamayishi tartibida ko'rsatilgan.

45 // uchun haqiqat jadvalini yarating! (mantiqiy inkor) operatori


46 System.out.printf("%s%n%s: %b%n%s: %b%n", "Mantiqiy EMAS (!)",
47 "!yolg'on", , "!to'g'ri", );
48 }
49 } // oxirgi sinf LogicalOperators

Shartli VA (&&)


noto'g'ri && noto'g'ri: noto'g'ri
noto'g'ri && rost: noto'g'ri
rost && noto'g'ri: noto'g'ri
rost && rost: rost
Shartli OR (||)
noto'g'ri || yolg'on: yolg'on
noto'g'ri || rost: rost
rost || yolg'on: rost
rost || rost: rost
Mantiqiy mantiqiy VA (&)
noto'g'ri va noto'g'ri: noto'g'ri
noto'g'ri va rost: yolg'on
rost va noto'g'ri: noto'g'ri
rost va rost: rost
Mantiqiy mantiqiy inklyuziv OR (|)
noto'g'ri | yolg'on: yolg'on
noto'g'ri | rost: rost
rost | yolg'on: rost
rost | rost: rost
Mantiqiy mantiqiy eksklyuziv OR (^)
noto'g'ri ^ noto'g'ri: noto'g'ri
noto'g'ri ^ rost: rost
rost ^ yolgʻon: rost
rost ^ rost: yolgʻon
Mantiqiy EMAS (!)
!false: rost
!to'g'ri: yolg'on

Operatorlar assotsiativligi turi

++ -- o'ngdan chapga unar postfiks
++ -- + -! (turi) o'ngdan chapga unar prefiks
* /% chapdan o'ngga multiplikativ

5.20-rasm | Hozirgacha muhokama qilingan operatorlarning ustuvorligi/assotsiativligi. (2-qismning 1-qismi.)

5.19-rasm | Mantiqiy operatorlar. (2-qismning 2-qismi.)

(!yolg'on) (!to'g'ri)


182 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

5.10 Strukturaviy dasturlash bo'yicha xulosa
Me'morlar o'z kasbining umumiy donoligidan foydalangan holda binolarni loyihalashtirganidek,
dasturchilar dasturlarni ishlab chiqishlari kerak. Bizning sohamiz arxitekturadan ancha yosh,
va bizning jamoaviy donoligimiz ancha siyrakdir. Biz tuzilgan dasturni bilib oldik -
ming tushunish, sinab ko'rish, tuzilmagan dasturlarga qaraganda osonroq dasturlarni ishlab chiqaradi.
disk raskadrovka, o'zgartirish va hatto matematik ma'noda to'g'riligini isbotlash.

Java boshqaruv bayonotlari bitta kirish/bitta chiqish


5.21-rasmda Java boshqaruv bayonotlarini umumlashtirish uchun UML faoliyat diagrammalaridan foydalaniladi. ini-
oxirgi va yakuniy holatlar har bir boshqaruvning yagona kirish nuqtasini va bitta chiqish nuqtasini ko'rsatadi
bayonot. Faoliyat diagrammasidagi individual belgilarni o'zboshimchalik bilan bog'lash noto'g'ri ishlashga olib kelishi mumkin.
tuzilgan dasturlar. Shuning uchun dasturlash kasbi cheklangan to'plamni tanladi
boshqaruv iboralari, ularni faqat ikkita oddiy usulda birlashtirish mumkin bo'lgan tizimli pro-
gramm.
Oddiylik uchun Java faqat bitta kirish/bitta chiqish boshqaruv bayonotlarini o'z ichiga oladi - mavjud
kirishning faqat bitta usuli va har bir nazorat bayonotidan chiqishning faqat bitta usuli. Ulanish boshqaruvi
tuzilgan dasturlarni shakllantirish uchun ketma-ket bayonotlar oddiy. Bitta konning yakuniy holati
trol bayonoti keyingisining boshlang'ich holatiga, ya'ni boshqaruv bayonotlariga bog'langan
ketma-ket dasturda birin-ketin joylashtiriladi. Biz buni boshqaruv bayonoti deb ataymiz
stacking. Strukturaviy dasturlarni shakllantirish qoidalari, shuningdek, boshqaruv bayonotlari bo'lishiga imkon beradi
o'rnatilgan.

Strukturaviy dasturlarni shakllantirish qoidalari


5.22-rasmda tuzilgan dasturlarni shakllantirish qoidalari ko'rsatilgan. Qoidalar bu harakatni nazarda tutadi
holatlar har qanday harakatni ko'rsatish uchun ishlatilishi mumkin. Qoidalar, shuningdek, biz bilan boshlanadi deb taxmin qiladi
eng oddiy faoliyat diagrammasi (5.23-rasm) faqat boshlang'ich holat, harakat holati, a
yakuniy holat va o'tish strelkalari.

+ - chapdan o'ngga qo'shimcha


< <= > >= chapdan o'ngga relyatsion
== != chapdan o'ngga tenglik
& chapdan o'ngga mantiqiy mantiqiy AND
^ chapdan o'ngga mantiqiy mantiqiy eksklyuziv OR
| chapdan o'ngga mantiqiy mantiqiy inklyuziv OR
&& chapdan o'ngga shartli AND
|| chapdan o'ngga shartli OR
?: o'ngdan chapga shartli
= += -= *= /= %= o'ngdan chapga tayinlash

Operatorlar assotsiativligi turi

5.20-rasm | Hozirgacha muhokama qilingan operatorlarning ustuvorligi/assotsiativligi. (2-qismning 2-qismi.)

5.10 Strukturaviy dasturlashning qisqacha mazmuni 183

5.21-rasm | Java ning bitta kirish/bitta chiqish ketma-ketligi, tanlash va takrorlash bayonotlari.

tanaffus


[f] [t]

agar ... boshqacha bayonot


(ikki marta tanlash)

agar bayonot


(yagona tanlov)

[t]


[f]

[t]


[f]

tanaffus


[t]

tanaffus


[t]

[f]


[f]

uzilishlar bilan switch iborasi


(bir nechta tanlov)

Ketma-ket tanlash

Takrorlash

standart ishlov berish

ishga tushirish

oshirish


...

...


[t]

[f]


bayonot uchun

[t]


[f]

while bayonoti

[t]

[f]


Bayonot paytida ... bajaring

184 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

5.22-rasmdagi qoidalarni qo'llash har doim to'g'ri tuzilgan faoliyat diagrammasini keltirib chiqaradi
toza, qurilish bloklari ko'rinishi bilan. Masalan, 2-qoidani simga qayta-qayta qo'llash
plest faoliyat diagrammasi ketma-ketlikda ko'plab harakat holatlarini o'z ichiga olgan faoliyat diagrammasini beradi
(5.24-rasm). 2-qoida nazorat iboralari toʻplamini hosil qiladi, shuning uchun 2-qoidani stacking qoidasi deb ataymiz.
5.24-rasmdagi vertikal chiziqli chiziqlar UML ning bir qismi emas - biz ularni ajratish uchun foydalanamiz.
5.22-rasmning 2-qoidasini ko'rsatadigan to'rtta faoliyat diagrammasi qo'llaniladi.

Strukturaviy dasturlarni shakllantirish qoidalari

1. Eng oddiy faoliyat diagrammasidan boshlang (5.23-rasm).
2. Har qanday harakat holatini ketma-ket ikkita harakat holati bilan almashtirish mumkin.
3. Har qanday harakat holati har qanday boshqaruv bayonoti bilan almashtirilishi mumkin (ketma-ket
harakat holatlari, if, if…else, switch, while, do…while yoki for).
4. 2 va 3-qoidalar xohlagancha tez-tez va istalgan tartibda qo'llanilishi mumkin.

5.22-rasm | Strukturaviy dasturlarni shakllantirish qoidalari.

5.23-rasm | Eng oddiy faoliyat diagrammasi.

o

5.24-rasm | Eng oddiy faoliyat diagrammasi uchun 5.22-rasmning 2-qoidasini takroran qo'llash.



harakat holati

harakat holati harakat holati

murojaat qiling
qoida 2

murojaat qiling


qoida 2

murojaat qiling


qoida 2

harakat holati harakat holati

harakat holati harakat holati

harakat holati harakat holati

...

5.10 Strukturaviy dasturlashning qisqacha mazmuni 185

3-qoida uy qurish qoidasi deb ataladi. 3-qoidani takroran eng oddiy faoliyat diagrammasiga qo'llash
gramm aniq joylashtirilgan nazorat bayonotlari bilan bir natija beradi. Masalan, 5.25-rasmda
Eng oddiy faoliyat diagrammasidagi harakat holati ikki marta tanlash bilan almashtiriladi (agar… bo'lmasa)
bayonot. Keyin 3-qoida yana ikki marta tanlash bayonotidagi harakat holatlariga qo'llaniladi,
har birini ikki marta tanlash bayonoti bilan almashtirish. Atrofdagi chiziqli harakat-holat belgisi
har bir ikki marta tanlash bayonoti almashtirilgan harakat holatini ifodalaydi. [Izoh: The
5.25-rasmda ko'rsatilgan chiziqli o'qlar va chiziqli harakat holati belgilari UML tarkibiga kirmaydi.
Ular bu erda har qanday harakat holatini boshqaruv bayonoti bilan almashtirish mumkinligini ko'rsatish uchun ishlatiladi.]

4-qoida kattaroq, ko'proq jalb qilingan va chuqurroq joylashtirilgan bayonotlarni yaratadi. dia-


5.22-rasmdagi qoidalarni qo'llash natijasida paydo bo'ladigan grammlar barcha mumkin bo'lganlar to'plamini tashkil qiladi.
tuzilgan faoliyat diagrammalari va shuning uchun barcha mumkin bo'lgan tuzilgan dasturlar to'plami. The
tuzilgan yondashuvning go'zalligi shundaki, biz faqat ettita oddiy bitta kirish/bitta chiqishdan foydalanamiz
boshqaruv bayonotlari va ularni faqat ikkita oddiy usulda yig'ing.

5.25-rasm | 5.22-rasmdagi 3-qoidani eng oddiy faoliyat diagrammasi uchun takroran qo'llash.

harakat holati harakat holati

[f] [t]


[f] [t]

[f] [t] [f] [t]

harakat holati

harakat holati harakat holati harakat holati harakat holati

murojaat qiling
qoida 3

murojaat qiling


qoida 3

murojaat qiling


qoida 3

186 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Agar 5.22-rasmdagi qoidalarga rioya qilingan bo'lsa, "tuzilmagan" faoliyat diagrammasi (masalan,
5.26-rasmda) yaratish mumkin emas. Agar ma'lum bir diagramma mavjudligiga ishonchingiz komil bo'lmasa
tuzilgan, 5.22-rasmdagi qoidalarni teskari tartibda qo'llang, uni eng oddiy faoliyat dia-
gramm. Agar siz uni qisqartirishingiz mumkin bo'lsa, asl diagramma tuzilgan; aks holda, unday emas.

Nazoratning uchta shakli


Strukturaviy dasturlash soddalikni ta'minlaydi. Faqat uchta nazorat shakli kerak
algoritmni amalga oshirish:
• ketma-ketlik
• tanlash
• takrorlash
Ketma-ket tuzilishi ahamiyatsiz. Shunchaki tartibda bajarilishi kerak bo'lgan iboralarni sanab o'ting
ular amalga oshirishlari kerak bo'lgan. Tanlov uchta usuldan biri bilan amalga oshiriladi:
• if bayonoti (bitta tanlov)
• if...else bayonoti (ikki marta tanlash)
• switch bayonoti (bir nechta tanlash)
Aslida, oddiy if iborasi taqdim etish uchun etarli ekanligini isbotlash oson
tanlashning har qanday shakli - if...else va iboralar yordamida bajarilishi mumkin bo'lgan hamma narsa
switch iborasini if iboralarini birlashtirish orqali amalga oshirish mumkin (garchi bo'lmasa ham
aniq va samarali).
Takrorlash uchta usuldan biri bilan amalga oshiriladi:
• while bayoni
• do…while bayonoti
• bayonot uchun
[Izoh: Biz muhokama qiladigan to'rtinchi takrorlash bayonoti - kengaytirilgan bayonot bor
7.7-bo'limda.] while iborasi buni tasdiqlash uchun etarli ekanligini isbotlash oson.
takrorlashning har qanday shaklini ko'rsating. Do bilan bajarilishi mumkin bo'lgan hamma narsa…hozirda va uchun bo'lishi mumkin
while iborasi bilan bajarilgan (garchi unchalik qulay bo'lmasa ham).
Ushbu natijalarni birlashtirish shuni ko'rsatadiki, Java dasturida har qanday boshqaruv shakli kerak bo'ladi.
gramm bilan ifodalanishi mumkin

5.26-rasm | "Tuzilishsiz" faoliyat diagrammasi.

harakat holati

harakat holati

harakat holati harakat holati

5.11 (ixtiyoriy) GUI va grafik misol: To‘rtburchaklar va tasvirlar chizish 187

• ketma-ketlik
• if bayonoti (tanlov)
• while bayoni (takrorlash)
va bularni faqat ikkita usulda birlashtirish mumkin - stacking va innering. Darhaqiqat, tuzilgan
dasturlash soddalikning mohiyatidir.

5.11 (ixtiyoriy) GUI va grafik misollar: chizmachilik


To'rtburchaklar va tasvirlar
Ushbu bo'lim Grafik usullaridan foydalangan holda to'rtburchaklar va tasvirlar chizishni ko'rsatadi
mos ravishda drawRect va drawOval. Bu usullar 5.27-rasmda ko'rsatilgan.

1 // 5.27-rasm: Shakllar.java


2 // Foydalanuvchi tanlovi asosida shakllar kaskadini chizish.
3 import java.awt.Graphics;
4 import javax.swing.JPanel;
5
6 umumiy sinf Shakllar JPanel-ni kengaytiradi
7 {
8 xususiy int tanlovi; // foydalanuvchi qaysi shaklni chizishni tanlashi
9
10 // konstruktor foydalanuvchining tanlovini belgilaydi
11 umumiy shakl (int userChoice)
12 {
13 tanlov = userChoice;
14 }
15
16 // yuqori chap burchakdan boshlab shakllar kaskadini chizadi
17 ommaviy bekor bo'yoq Komponenti (Grafika g)
18 {
19 super.paintComponent(g);
20
21 uchun (int i = 0; i < 10; i++)
22 {
23 // foydalanuvchining tanlovi asosida shaklni tanlang
24 kalit (tanlov)
25 {
26 1-holat: // to'rtburchaklar chizish
27
28
29 tanaffus;
30 holat 2: // ovallarni chizish
31
32
33 tanaffus;
34 }
35 }
36 }
37 } // oxirgi sinf Shakllar

5.27-rasm | Foydalanuvchi tanlovi asosida shakllar kaskadini chizish.

g.drawRect(10 + i * 10, 10 + i * 10,
50 + i * 10, 50 + i * 10);

g.drawOval(10 + i * 10, 10 + i * 10,


50 + i * 10, 50 + i * 10);

188 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

6-qator JPanel-ni kengaytiradigan Shakllar uchun sinf deklaratsiyasini boshlaydi. Turli xil misollar
qodir tanlov paintComponent to'rtburchaklar yoki tasvirlar chizish kerakligini aniqlaydi. The
Shakllar konstruktori tanlovni userChoice parametrida berilgan qiymat bilan ishga tushiradi.
PaintComponent usuli haqiqiy chizmani bajaradi. Esingizda bo'lsin, birinchi bayonot
har bir paintComponent usulida qatordagi kabi super.paintComponent ga qo'ng'iroq bo'lishi kerak
19. 21-35 chiziqlar 10 ta shaklni chizish uchun 10 marta pastadir. Ichki o'zgartirish bayonoti (24-qatorlar)
34) to‘rtburchaklar chizish va oval chizish o‘rtasida tanlov qiladi.
Agar tanlov 1 bo'lsa, dastur to'rtburchaklar chizadi. 27-28 qatorlar Grafik usulini chaqiradi
drawRect. DrawRect usuli to'rtta argumentni talab qiladi. Birinchi ikkitasi x- va ni ifodalaydi
y-to'rtburchakning yuqori chap burchagining koordinatalari; keyingi ikkitasi to'g'rini ifodalaydi -
burchakning kengligi va balandligi. Ushbu misolda biz 10 piksel pastga va 10 pozitsiyadan boshlaymiz
piksellar yuqori chap burchakning o'ng tomonida joylashgan va pastadirning har bir iteratsiyasi yuqori chap tomonga siljiydi.
yana 10 piksel pastga va o'ngga burang. To'rtburchakning kengligi va balandligi
50 pikseldan boshlang va har bir iteratsiyada 10 pikselga oshiring.
Agar tanlov 2 bo'lsa, dastur ovallarni chizadi. A deb nomlangan xayoliy to'rtburchak hosil qiladi
chegaralovchi to'rtburchak va uning ichiga to'rt tomonning o'rta nuqtalariga tegib turgan ovalni joylashtiradi.
DrawOval usuli (31–32-qatorlar) drawRect usuli bilan bir xil toʻrtta argumentni talab qiladi.
Argumentlar oval uchun chegaralovchi to'rtburchakning joylashuvi va o'lchamini belgilaydi. The
Ushbu misolda drawOval-ga o'tkazilgan qiymatlar drawRect-ga o'tkazilgan qiymatlar bilan bir xil
27–28 qatorlarda. Bunda chegaralovchi to'rtburchakning kengligi va balandligi bir xil bo'lgani uchun
masalan, 27-28 chiziqlar aylana chizadi. Mashq sifatida ikkalasini ham chizish uchun dasturni o'zgartirib ko'ring
drawOval va drawRect qanday bog'liqligini ko'rish uchun to'rtburchaklar va tasvirlar.

Sinf shakllari testi


5.28-rasm foydalanuvchi kiritgan ma'lumotlarni qayta ishlash va o'chirish uchun oyna yaratish uchun javobgardir.
foydalanuvchining javobi asosida tegishli chizmani o'ynang. 3-qator JFrame-ni import qiladi.
displeyni o'chiring va 4-qator kirishni boshqarish uchun JOptionPane-ni import qiladi. 11-13 qatorlar so'rovi
kirish dialog oynasi bilan foydalanuvchi va foydalanuvchining javobini o'zgaruvchan kiritishda saqlang. E'tibor bering
JOptionPane-da bir nechta satr so'rov matnini ko'rsatishda boshlash uchun \n dan foydalaning
%n emas, balki yangi matn qatori. 15-qator konvertatsiya qilish uchun parseInt Integer usulidan foydalanadi
Foydalanuvchi tomonidan int ga kiritilgan satr va natijani o'zgaruvchi tanlovida saqlaydi. 18-qator
Shapes ob'ektini oladi va foydalanuvchining tanlovini konstruktorga o'tkazadi. 20-25 qatorlar bajariladi
Ushbu misolda oyna yaratadigan va o'rnatadigan standart operatsiyalar - ramka yaratish,
uni yopilganda dasturdan chiqish uchun sozlash, chizmani ramkaga qo'shish, ramka hajmini o'rnatish
va uni ko'rinadigan qilib qo'ying.

1 // 5.28-rasm: ShapesTest.java


2 // Foydalanuvchi ma'lumotlarini olish va Shakllarni ko'rsatish uchun JFrame yaratish.
3 import javax.swing.JFrame; // displeyni boshqaring
4 import javax.swing.JOptionPane;
5
6 ommaviy sinf ShapesTest
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {

5.28-rasm | Foydalanuvchi ma'lumotlarini olish va Shakllarni ko'rsatish uchun JFrame yaratish. (2-qismning 1-qismi.)


5.11 (ixtiyoriy) GUI va grafik misol: To‘rtburchaklar va tasvirlar chizish 189

GUI va grafik misollarni o'rganish mashqlari
5.1 JPanel markazida 12 ta konsentrik doira chizing (5.29-rasm). Eng ichki doira
radiusi 10 piksel bo'lishi kerak va har bir keyingi aylana radiusi 10 pikseldan kattaroq bo'lishi kerak.
oldingi. JPanel markazini topish bilan boshlang. Doiraning yuqori chap burchagini olish uchun,
markazdan bir radius yuqoriga va bir radius chapga siljiting. Chegaraning kengligi va balandligi -
ing to'rtburchaklar ikkalasi ham aylananing diametri bilan bir xil (ya'ni, radiusning ikki barobari).

10 // foydalanuvchining tanlovini olish


11 String kiritish = JOptionPane.showInputDialog(
12 "To'rtburchaklar chizish uchun 1 ni kiriting" +
13 "Ovallarni chizish uchun 2 ni kiriting");
14
15 int tanlovi = Integer.parseInt(kiritish); // kiritilgan ma'lumotlarni int ga aylantiring
16
17 // foydalanuvchi kiritishi bilan panel yarating
18 Shakl paneli = yangi Shakllar(tanlov);
19
20 JFrame ilovasi = yangi JFrame(); // yangi JFrame yaratadi
21
22 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
23 application.add(panel);
24 application.setSize(300, 300);
25 application.setVisible(rost);
26 }
27 } // oxirgi sinf ShapesTest

5.28-rasm | Foydalanuvchi ma'lumotlarini olish va Shakllarni ko'rsatish uchun JFrame yaratish. (2-qismning 2-qismi.)

\n

190 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

5.2 Bob oxiridagi mashqlardan 5.16-mashqni dialog oynalari yordamida kiritilgan ma’lumotlarni o‘qish va
turli uzunlikdagi to'rtburchaklar yordamida shtrixli diagrammani ko'rsatish.
5.12 Yakunlash
Ushbu bobda biz boshqaruv bayonotlariga kirishni yakunladik, bu sizga imkon beradi
usullarda bajarilish jarayonini nazorat qilish. 4-bobda, agar, agar… bo'lmasa va vaqt muhokama qilinadi. Bu
bob ko'rsatilgan bo'lim uchun, do...while va switch. Biz har qanday algoritm bo'lishi mumkinligini ko'rsatdik
ketma-ketlik tuzilmasi kombinatsiyalaridan foydalangan holda ishlab chiqilgan, uch turdagi tanlov holati-
ments—if, if...else va switch— va uch xil takrorlash gaplari—hozirda,
qil... hozir va uchun. Ushbu bobda va 4-bobda biz ularni qanday qilib birlashtirish mumkinligini muhokama qildik
isbotlangan dastur qurish va muammolarni hal qilish usullaridan foydalanish uchun qurilish bloklari.
Siz switch iborasidan chiqish va a ni darhol tugatish uchun break iborasidan foydalandingiz
siklni yaratdi va tsiklning joriy iteratsiyasini tugatish va davom ettirish uchun davom iborasidan foydalangan
tsiklning keyingi iteratsiyasi. Ushbu bobda Java ning mantiqiy operatorlari ham tanishtirildi, ular faollashtiradi
boshqaruv iboralarida murakkabroq shartli iboralardan foydalanasiz. 6-bobda biz sobiq -
amin usullarini chuqurroq o'rganish.

5.29-rasm | Konsentrik doiralarni chizish.

Xulosa
5.2-bo'lim Qarama-qarshi nazorat ostida takrorlashning asoslari
• Qarshi boshqariladigan takrorlash (153-bet) boshqaruv o‘zgaruvchisini, boshqaruvning boshlang‘ich qiymatini talab qiladi.
o'zgaruvchi, nazorat o'zgaruvchisi tsikl bo'ylab har safar o'zgartiriladigan o'sish (al-
siklning har bir iteratsiyasi deb nomlanadi) va hal qiluvchi davrni davom ettirish sharti
aylanish davom etishi kerakmi.
• Siz o'zgaruvchini e'lon qilishingiz va uni xuddi shu bayonotda ishga tushirishingiz mumkin.
Takrorlash bayonoti uchun 5.3-bo'lim
• while operatori har qanday qarama-qarshi boshqariladigan siklni amalga oshirish uchun ishlatilishi mumkin.
• for bayonoti (155-bet) uning sarlavhasida qarama-qarshi boshqariladigan takrorlashning barcha tafsilotlarini belgilaydi.
• for operatori bajarila boshlaganda, uning boshqaruv o'zgaruvchisi e'lon qilinadi va ishga tushiriladi. Agar
sikl davom etish sharti dastlab rost, tana bajaradi. Loop tanasini bajargandan so'ng,
oshirish ifodasi bajariladi. Keyin halqani davom ettirish testi yana o'tkaziladi.
dastur tsiklning keyingi iteratsiyasi bilan davom etishi kerakmi yoki yo'qligini aniqlang.

Xulosa 191



• for bayonotining umumiy formati
for (boshlash; loopContinuationCondition; oshirish)
bayonot
bu erda ishga tushirish ifodasi tsiklning boshqaruv o'zgaruvchisini nomlaydi va uning boshlang'ich qiymatini beradi,
loopContinuationCondition sikl bajarilishda davom etishi va ortishi kerakligini aniqlaydi.
ment boshqaruv o'zgaruvchisining qiymatini o'zgartiradi, natijada tsiklning davom etish sharti -
yolg'on keladi. For sarlavhasida ikkita nuqta-vergul qo'yilishi shart.
• Most for iboralari ekvivalent while ifodalari bilan quyidagicha ifodalanishi mumkin:
ishga tushirish;
while (loopContinuationCondition)
{
bayonot
o'sish;
}
• Odatda, for iboralari qarama-qarshi boshqariladigan takrorlash uchun va while ifodalari for uchun ishlatiladi
qo'riqchi tomonidan boshqariladigan takrorlash.
• Agar for sarlavhasidagi ishga tushirish ifodasi boshqaruv o'zgaruvchisini e'lon qilsa, boshqaruv o'zgaruvchisi
faqat o'sha for bayonotida ishlatilishi mumkin - u for bayonotidan tashqarida mavjud bo'lmaydi.
• for sarlavhasidagi ifodalar ixtiyoriy. Agar loopContinuationCondition o'tkazib yuborilsa, Java
u har doim to'g'ri deb hisoblaydi, shuning uchun cheksiz tsiklni yaratadi. Avval ishga tushirishni o'tkazib yuborishingiz mumkin
Agar boshqaruv o'zgaruvchisi sikldan oldin ishga tushirilsa, bosish. Siz o'sish ifodasini o'tkazib yuborishingiz mumkin -
sion, agar o'sish tsiklning tanasidagi bayonotlar bilan hisoblansa yoki o'sish kerak bo'lmasa.
• a uchun o‘sish ifodasi for ning tanasi oxiridagi mustaqil ifoda kabi ishlaydi.
• A for iborasi salbiy o'sish, ya'ni kamayish yordamida pastga qarab sanash mumkin (158-bet).
• Agar tsikl davom etish sharti dastlab noto'g'ri bo'lsa, for operatorining tanasi bajarilmaydi.
5.4-bo'lim for bayonotidan foydalanishga misollar
• Java 1000.0 va 0.05 kabi suzuvchi nuqta konstantalarini double turi sifatida ko'rib chiqadi. Xuddi shunday, Java ham muomala qiladi
7 va -22 kabi butun sonli konstantalar int turi sifatida.
• %4s format aniqlovchisi 4 dan maydon kengligidagi (161-bet) Stringni chiqaradi—ya’ni printf ko‘rsatadi.
kamida 4 ta belgi pozitsiyasiga ega qiymat. Chiqariladigan qiymat 4 ta belgidan kam bo'lsa
sitions keng, qiymat sukut bo'yicha maydonda to'g'ri oqlangan (161-bet). Agar qiymat kattaroq bo'lsa
4 ta belgi pozitsiyasi keng, maydon kengligi tegishli sonni joylashtirish uchun kengayadi
belgilar. Qiymatni chapga tekislash (161-bet) uchun maydon kengligini belgilash uchun manfiy butun sondan foydalaning.
• Math.pow(x, y) (162-bet) x ning y darajaga ko'tarilgan qiymatini hisoblaydi. Usul qabul qiladi
ikkita juft argument va ikki barobar qiymatni qaytaradi.
• Format spetsifikatsiyasidagi vergul (,) formatlash belgisi (162-bet) suzuvchi nuqta qiymatini bildiradi.
guruhlash ajratgich bilan chiqarilishi kerak (162-bet). Amaldagi haqiqiy ajratuvchi xosdir
foydalanuvchi lokali (ya'ni, mamlakat). Qo'shma Shtatlarda raqam har birini ajratuvchi vergulga ega bo'ladi
1234.45 da bo'lgani kabi sonning kasr qismini ajratuvchi uchta raqam va kasr nuqtasi.
• The . format spetsifikatsiyasida uning o'ng tomonidagi butun son raqamning aniqligi ekanligini bildiradi.
5.5-bo'limni takrorlash bayonoti paytida bajaring
• do…while gapi (163-bet) while gapiga o‘xshaydi. Shu vaqt ichida dastur sinovdan o'tadi
sikl boshida, uning tanasini bajarishdan oldin tsikl davom etish sharti; agar ziddiyat -
dition yolg'on, tana hech qachon bajarmaydi. do…while iborasi sikl davomini tekshiradi.
loop tanasini bajargandan so'ng dition; shuning uchun tana har doim kamida bir marta bajaradi.

192 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar



5.6-bo'lim Ko'p tanlovli bayonotni o'zgartiring
• Switch operatori (165-bet) doimiyning mumkin bo‘lgan qiymatlari asosida turli amallarni bajaradi
integral ifoda (bayt, short, int yoki char tipidagi doimiy qiymat, lekin uzun emas) yoki String.
• Fayl tugashi ko'rsatkichi tizimga bog'liq bo'lgan tugmalar birikmasi bo'lib, foydalanuvchini
qo'yish. UNIX/Linux/Mac OS X tizimlarida fayl oxiri ketma-ketligini kiritish orqali kiritiladi.
d o'z-o'zidan bir qatorda. Bu belgi bir vaqtning o'zida Ctrl va d tugmachalarini bosishni anglatadi.
Windows tizimlarida z ni kiritish orqali fayl oxirini kiriting.
• Skaner usuli hasNext (168-bet) kiritish uchun ko‘proq ma’lumot mavjudligini aniqlaydi. Bu usul
agar ko'proq ma'lumot bo'lsa, mantiqiy qiymatni true qaytaradi; aks holda, u false qaytaradi. ekan
fayl oxiri indikatori yozilmagan, hasNext usuli rost qaytaradi.
• Switch operatori blokdan iborat bo‘lib, unda ish belgilari ketma-ketligi (168-bet) va
ixtiyoriy standart holat (168-bet).
• Kommutatorda dastur boshqaruvchi ifodani baholaydi va uning qiymatini har biri bilan solishtiradi
kassa yorlig'i. Agar mos kelsa, dastur ushbu holat uchun bayonotlarni bajaradi.
• Ishlarni ketma-ket ro'yxatlash, ular orasida hech qanday bayonot bo'lmagan holda, ishlarni bajarishga imkon beradi
bir xil bayonotlar to'plami.
• Kommutatorda sinab ko'rmoqchi bo'lgan har bir qiymat alohida holat yorlig'ida ko'rsatilishi kerak.
• Har bir holatda bir nechta bayonot bo'lishi mumkin va ularni qavs ichiga qo'yish shart emas.
• Ishning gaplari, odatda, kommutatorni tugatuvchi break bayonoti (168-bet) bilan tugaydi.
ijro.
• Tanaffus iboralarisiz, har safar kommutatorda moslik sodir bo'lganda, bu holat uchun bayonotlar
va keyingi holatlar break operatori yoki kommutatorning oxiriga duch kelguncha bajariladi.
• Agar boshqaruvchi ifodaning qiymati va registr belgisi o'rtasida mos kelmasa, ixtiyoriy
standart holat bajariladi. Agar mos kelmasa va kalitda standart holat bo'lmasa, pro-
gramm nazorati shunchaki kalitdan keyingi birinchi bayonot bilan davom etadi.
5.7-bo'lim AutoPolicy klassi misoli: Switch bayonotlaridagi satrlar
• Satrlardan switch operatorining boshqaruvchi ifodasi va registr belgilarida foydalanish mumkin.
5.8-bo'limni buzish va davom ettirish bayonotlari
• break operatori bir muncha vaqt ichida bajarilganda, for, do…while yoki switch, darhol sabab bo'ladi.
bu bayonotdan chiqish.
• Davom etish iborasi (174-bet) bir muncha vaqt ichida bajarilganda, for yoki do…hozirda, tsiklni o'tkazib yuboradi.
qolgan asosiy bayonotlar va uning keyingi iteratsiyasi bilan davom etadi. In while va do…while state-
ments, dastur loop davomi testini darhol baholaydi. for bayonotida, in-
krement ifodasi bajariladi, so'ngra dastur tsiklni davom ettirish testini baholaydi.
5.9-bo'lim Mantiqiy operatorlar
• Oddiy shartlar >, <, >= va <= munosabat operatorlari va teng-- bilan ifodalanadi.
ity operatorlari == va != va har bir ifoda faqat bitta shartni tekshiradi.
• Mantiqiy operatorlar (176-bet) oddiy konturlarni birlashtirib, murakkabroq shartlarni yaratishga imkon beradi.
ajratmalar. Mantiqiy operatorlar && (shartli AND), || (shartli OR), & (mantiqiy mantiqiy
VA), | (mantiqiy mantiqiy inklyuziv OR), ^ (mantiqiy mantiqiy eksklyuziv OR) va ! (mantiqiy EMAS).
• Ikkala shart ham to'g'ri bo'lishini ta'minlash uchun && (shartli AND) operatoridan foydalaning. Agar yoki bo'lsa
oddiy shartlarning ikkalasi ham noto'g'ri, butun ifoda noto'g'ri.
• Ikki shartdan biri yoki ikkalasi ham to'g'ri ekanligiga ishonch hosil qilish uchun || dan foydalaning (shartli OR) operatori,
oddiy shartlardan biri yoki ikkalasi ham rost bo'lsa, rost deb baholanadi.

O'z-o'zini tekshirish mashqlari 193

• && yoki || yordamida shart operatorlar (176-bet) qisqa tutashuvni baholashdan foydalanadi (178-bet) — ular
shartning toʻgʻri yoki notoʻgʻri ekanligi maʼlum boʻlguncha baholanadi.
• & va | operatorlari (178-bet) && va || bilan bir xil ishlaydi operatorlar, lekin har doim baholang
ikkala operand.
• Mantiqiy mantiqiy eksklyuziv OR (^; 179-bet) operatorini o‘z ichiga olgan oddiy shart, agar va bo‘lsa, rost bo‘ladi.
faqat uning operandlaridan biri rost, ikkinchisi noto'g'ri bo'lsa. Agar ikkala operand ham to'g'ri yoki ikkalasi ham noto'g'ri bo'lsa,
barcha shart noto'g'ri. Ushbu operator o'zining ikkala operandini ham baholashi kafolatlangan.
• Birlik! (mantiqiy EMAS; 179-bet) operator shart qiymatini “teskari” qiladi.

O'z-o'zini tekshirish mashqlari


5.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Odatda, iboralar qarama-qarshi boshqariladigan takrorlash uchun ishlatiladi va
qo'riqchi tomonidan boshqariladigan takrorlash uchun bayonotlar.
b) do…while operatori sikl davom etish sharti bajarilishini tekshiradi
halqa tanasi; shuning uchun tana har doim kamida bir marta bajaradi.
c) Bayonot mumkin bo'lgan qiymatlar asosida bir nechta harakatlar orasidan tanlaydi
butun son o'zgaruvchisi yoki ifodasi yoki String.
d) Takroriy gapda bajarilgan gap qolgan qismini o'tkazib yuboradi
sikl tanasidagi bayonotlar va tsiklning keyingi iteratsiyasi bilan davom etadi.
e) Operator ikki shartning ikkalasi ham oldin to'g'ri ekanligini ta'minlash uchun ishlatilishi mumkin
muayyan ijro yo'lini tanlash.
f) Agar for sarlavhasida sikl davom etish sharti dastlab , dastur
for bayonotining tanasini bajarmaydi.
g) Umumiy vazifalarni bajaradigan va ob'ektlarni talab qilmaydigan usullar deyiladi
usullari.
5.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Kommutatorni tanlash bayonotida standart holat talab qilinadi.
b) kommutator tanlash operatorining oxirgi holatida break operatori talab qilinadi.
c) ((x > y) && (a < b)) ifodasi to'g'ri bo'ladi, agar x > y yoki a < b rost bo'lsa.
d) || ni o'z ichiga olgan ifoda operator, agar uning operandlaridan biri yoki ikkalasi ham rost bo'lsa, rost bo'ladi.
e) Format spetsifikatsiyasidagi vergul (,) formatlash belgisi (masalan, %,20.2f) qiymatni bildiradi.
minglik ajratgich bilan chiqishi kerak.
f) Switch bayonotidagi qiymatlar diapazonini tekshirish uchun boshlang'ich o'rtasida chiziqcha (-) qo'ying
va ish yorlig'idagi diapazonning oxirgi qiymatlari.
g) Ishlarni ketma-ket ro'yxatga olish, ular orasida hech qanday bayonot bo'lmagan holda, ishlarni bajarishga imkon beradi:
bir xil bayonotlar to'plamini hosil qiladi.
5.3 Quyidagi vazifalarning har birini bajarish uchun Java bayonoti yoki Java bayonotlari to‘plamini yozing:
a) 1 dan 99 gacha bo'lgan toq sonlarni for bayonotidan foydalanib yig'ing. Faraz qiling, butun son
sum va count o'zgaruvchilari e'lon qilindi.
b) pow usuli yordamida 2,5 ning 3 ning darajasiga ko'tarilgan qiymatini hisoblang.
c) while tsikli va hisoblagich o‘zgaruvchisi i yordamida 1 dan 20 gacha butun sonlarni chop eting. Faraz qilaylik
i o'zgaruvchisi e'lon qilingan, lekin ishga tushirilmagan. Har bir satrda faqat beshta tamsayı chop eting.
[Maslahat: i % 5 hisobini ishlating. Bu ifodaning qiymati 0 boʻlsa, yangi qatorni chop eting.
xarakter; aks holda, yorliq belgisini chop eting. Ushbu kodni ilova deb hisoblang. Foydalanish
Yangi satr belgisini chiqarish uchun System.out.println() usuli va Sys-dan foydalaning.
tab belgisini chiqarish uchun tem.out.print('\t') usuli.]
d) for iborasidan foydalanib (c) qismini takrorlang.

194 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

5.4 Quyidagi kod segmentlarining har birida xatolikni toping va uni qanday tuzatish kerakligini tushuntiring:
a) i = 1;
while (i <= 10);
++i;
}
b) uchun (k = 0,1; k != 1,0; k += 0,1)
System.out.println(k);
c) kalit (n)
{
1-holat:
System.out.println("Raqam 1");
2-holat:
System.out.println("Raqam 2");
sindirish;
standart:
System.out.println("Raqam 1 yoki 2 emas");
sindirish;
}
d) Quyidagi kod 1 dan 10 gacha qiymatlarni chop etishi kerak:
n = 1;
esa (n < 10)
System.out.println(n++);

O'z-o'zini tekshirish mashqlariga javoblar


5.1 a) uchun, vaqt. b) keyin. c) almashtirish. d) davom eting. e) && (shartli AND). f) yolg'on. g) statik.
5.2 a) noto'g'ri. Standart holat ixtiyoriy. Agar standart harakatlar talab qilinmasa, unda buning hojati yo'q
standart holat uchun. b) yolg'on. break operatori switch operatoridan chiqish uchun ishlatiladi. Tanaffus
switch bayonotidagi oxirgi holat uchun bayonot shart emas. c) yolg'on. Har ikki munosabatlar sobiq
&& operatoridan foydalanganda butun ifoda to'g'ri bo'lishi uchun bosishlar rost bo'lishi kerak. d) To'g'ri.
e) To'g'ri. f) yolg'on. Switch bayonoti qiymatlar diapazonini sinab ko'rish mexanizmini ta'minlamaydi,
shuning uchun sinovdan o'tkazilishi kerak bo'lgan har bir qiymat alohida ish yorlig'ida ko'rsatilishi kerak. g) To'g'ri.
5.3 a) yig'indisi = 0;
uchun (hisoblash = 1; hisoblash <= 99; hisoblash += 2)
summa += hisoblash;
b) juft natija = Math.pow(2.5, 3);
c) i = 1;

esa (i <= 20)


{
System.out.print(i);

agar (i % 5 == 0)


System.out.println();
boshqa
System.out.print('\t');

++i;
}


195-mashqlar

d) uchun (i = 1; i <= 20; i++)
{
System.out.print(i);

agar (i % 5 == 0)


System.out.println();
boshqa
System.out.print('\t');
}
5.4 a) Xato: while sarlavhasidan keyingi nuqtali vergul cheksiz tsiklni keltirib chiqaradi va xatolik bor
chap qavs.
Tuzatish: nuqtali vergulni { bilan almashtiring yoki ikkalasini ham olib tashlang; va }.
b) Xato: for iborasini boshqarish uchun suzuvchi nuqtali raqamdan foydalanish ishlamasligi mumkin, chunki
suzuvchi nuqtali raqamlar ko'pchilik kompyuterlar tomonidan faqat taxminan ifodalanadi.
Tuzatish: butun sondan foydalaning va qiymatlarni olish uchun to'g'ri hisob-kitoblarni bajaring
siz hohlaysiz:
uchun (k = 1; k != 10; k++)
System.out.println((juft) k / 10);
c) Xato: etishmayotgan kod birinchi holat uchun bayonotlardagi tanaffus bayonotidir.
Tuzatish: Birinchi holat uchun bayonotlar oxirida tanaffus iborasini qo'shing. Bu
Agar siz 2-holat bayonotini bajarishni istasangiz, har doim ham xato bo'lishi shart emas
1-holatning vaqti: bayonot bajariladi.
d) Xato: while davom etish shartida noto'g'ri munosabat operatori ishlatiladi.
Tuzatish: < o'rniga <= dan foydalaning yoki 10 ni 11 ga o'zgartiring.

Mashqlar
5.5 Qarama-qarshi boshqariladigan takrorlashning to'rtta asosiy elementini tavsiflang.


5.6 Vaqt va takroriy gaplarni solishtiring va taqqoslang.
5.7 Do…while iborasidan foydalanish maqsadga muvofiqroq bo'lgan vaziyatni muhokama qiling
bir muddat bayonotdan ko'ra. Sababini tushuntiring.
5.8 Tanaffus va davom gaplarini solishtiring va taqqoslang.
5.9 Quyidagi kod segmentlarining har biridagi xato(lar)ni toping va tuzating:
a) uchun (i = 100, i >= 1, i++)
System.out.println(i);
b) Quyidagi kod butun sonning toq yoki juftligini chop etishi kerak:
almashtirish (qiymat % 2)
{
holat 0:
System.out.println("Juft butun son");
1-holat:
System.out.println("Toq butun son");
}
c) Quyidagi kod 19 dan 1 gacha bo'lgan toq sonlarni chiqarishi kerak:
uchun (i = 19; i >= 1; i += 2)
System.out.println(i);

196 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

d) Quyidagi kod 2 dan 100 gacha bo'lgan juft sonlarni chiqarishi kerak:
hisoblagich = 2;
qil
{
System.out.println(hisoblagich);
hisoblagich += 2;
} while (hisoblagich < 100);
5.10 Quyidagi dastur nima qiladi?

5.11 (Eng kichik qiymatni toping) Bir nechta butun sonlarning eng kichigini topadigan dastur yozing.


Faraz qilaylik, birinchi o'qilgan qiymat foydalanuvchidan kiritiladigan qiymatlar sonini belgilaydi.
5.12 (Toq butun sonlar mahsulotini hisoblash) Mahsulotni hisoblaydigan dastur yozing.
1 dan 15 gacha bo'lgan toq sonlar.
5.13 (Omillar) Faktoriallar ehtimollik masalalarida tez-tez ishlatiladi. Ijobiy faktorial
n butun soni (n! yoziladi va “n faktorial” deb talaffuz qilinadi) musbat sonlar ko‘paytmasiga teng.
1 dan n gacha. 1 dan 20 gacha faktoriallarni hisoblaydigan dastur yozing. Long turidan foydalaning. ni ko'rsatish
natijalar jadval shaklida. 100 faktorialini hisoblashingizga qanday qiyinchilik xalaqit berishi mumkin?
5.14 (O'zgartirilgan murakkab foizli dastur) Murakkab foiz ilovasini o'zgartirish
5.6-rasm 5%, 6%, 7%, 8%, 9% va 10% foiz stavkalari uchun qadamlarini takrorlang. to sikldan foydalaning
foiz stavkasini o'zgartiring.
5.15 (Uchburchak chop etish dasturi) Quyidagi naqshlarni aks ettiruvchi dastur yozing.
bir-biridan pastda. Naqshlarni yaratish uchun for looplaridan foydalaning. Barcha yulduzcha (*) chop etilishi kerak-
System.out.print('*') shaklining yagona bayonoti bilan yoziladi; bu yulduzchalarning yon tomonda chop etilishiga olib keladi
yonma-yon. System.out.println(); keyingi qatorga o'tish uchun ishlatilishi mumkin. A
System.out.print(' ') shaklining bayonoti; oxirgi ikki pat- uchun bo'sh joy ko'rsatish uchun foydalanish mumkin
terns. Dasturda boshqa chiqish bayonotlari bo'lmasligi kerak. [Maslahat: Oxirgi ikkita naqsh qaytadan
Har bir satr tegishli miqdordagi bo'sh joylar bilan boshlanishini talab qiling.]
(a B C D)
* ********** ********* *
** ******** ********* **
*** ******** ******** ***
**** ******* ******* ****
***** ****** ****** *****
******** ***** ***** ******
******* **** **** *******
******** *** *** ********
********* ** ** *********
********** * * ************

1 // 5.10-mashq: Printing.java


2 ommaviy sinf Chop etish
3 {
4 ta umumiy statik bekor asosiy(String[] args)
5 {
6 uchun (int i = 1; i <= 10; i++)
7 {
8 uchun (int j = 1; j <= 5; j++)
9 System.out.print('@');
10
11 System.out.println();
12 }
13 }
14 } // yakuniy sinf Chop etish

197-mashqlar

5.16 (Shtrixli diagrammalarni chop etish dasturi) Kompyuterlarning qiziqarli ilovalaridan biri bu displeydir
grafiklar va shtrixli diagrammalar. 1 dan 30 gacha bo'lgan beshta raqamni o'qiydigan dastur yozing. Har biri uchun
Agar o'qilgan raqam bo'lsa, dasturingiz bir xil miqdordagi qo'shni yulduzchalarni ko'rsatishi kerak. Imtihon uchun -
Agar dasturingiz 7 raqamini o'qisa, u ***** ko'rsatishi kerak. Yulduzchalar qatorlarini keyin ko'rsating
siz barcha beshta raqamni o'qidingiz.
5.17 (Sotishni hisoblash) Onlayn sotuvchi chakana narxlari quyidagicha bo'lgan beshta mahsulotni sotadi:
1-mahsulot, $2,98; 2-mahsulot, $4,50; 3-mahsulot, $9,98; mahsulot 4, $4,49 va mahsulot 5, $6,87.
Bir qator juft raqamlarni o'qiydigan ilovani quyidagicha yozing:
a) mahsulot raqami
b) sotilgan miqdor
Sizning dasturingiz har bir mahsulot uchun chakana narxni aniqlash uchun switch bayonotidan foydalanishi kerak. Bu
sotilgan barcha mahsulotlarning umumiy chakana qiymatini hisoblashi va ko'rsatishi kerak. Sentinel tomonidan boshqariladigan vositadan foydalaning
dastur qachon aylanishni to'xtatishi va yakuniy natijalarni ko'rsatishi kerakligini aniqlash uchun tsikl.
5.18 (Modifikatsiyalangan Murakkab foizli dastur) 5.6-rasmdagi ilovani faqat o'z-o'zidan foydalanish uchun o'zgartiring.
Murakkab foizlarni hisoblash uchun tegers. [Maslahat: Barcha pul summalarini integral sonlar sifatida ko'rib chiqing
tiyinlar. Keyin bo'linish yordamida natijani dollar va sent qismlariga ajrating va
mos ravishda asosiy operatsiyalar. Dollar va sentlar qismlari orasiga nuqta qo'ying.]
5.19 i = 1, j = 2, k = 3 va m = 2 deb faraz qilaylik. Quyidagi gaplarning har biri nimani chop etadi?
a) System.out.println(i == 1);
b) System.out.println(j == 3);
c) System.out.println((i >= 1) && (j < 4));
d) System.out.println((m <= 99) & (k < m));
e) System.out.println((j >= i) || (k == m));
f) System.out.println((k + m < j) | (3 - j >= k));
g) System.out.println(!(k > m));
p ning qiymatini hisoblash ) cheksiz qatordan p qiymatini hisoblang.

Birinchi 200 000 ta shartni hisoblash orqali p ning taxminiy qiymatini ko'rsatadigan jadvalni chop eting.


seriya. 3.14159 bilan boshlanadigan qiymatni olishdan oldin nechta atama ishlatishingiz kerak?
5.21 (Pifagor uchlari) To'g'ri burchakli uchburchakning barcha uzunliklari butun son bo'lgan tomonlari bo'lishi mumkin. To'plam
To'g'ri burchakli uchburchak tomonlari uzunligi uchun uchta butun son qiymati Pifagor uchligi deyiladi.
Uch tomonning uzunligi ikki tomonning kvadratlari yig'indisi nisbatini qondirishi kerak
tomonlari gipotenuzaning kvadratiga teng. ning jadvalini ko'rsatadigan dastur yozing
Yon1, yon 2 va gipotenuza uchun Pifagor uchlari, barchasi 500 dan katta emas.
barcha imkoniyatlarni sinab ko'radigan for tsikli. Ushbu usul "qo'pol kuch" hisoblashning namunasidir. Siz
Informatika bo'yicha ilg'or kurslarda o'rganing, bu ko'plab qiziqarli muammolar uchun yo'q
aniq qo'pol kuch ishlatishdan boshqa ma'lum algoritmik yondashuv.
5.22 (O'zgartirilgan uchburchak chop etish dasturi) 5.15-mashqni o'zgartiring va kodingizni birlashtiring.
to'rtta alohida yulduzcha uchburchagi, shunday qilib to'rtta naqsh yonma-yon chop etiladi. [Maslahat: Klaviatura qiling-
nested for looplardan foydalanish.]
5.23 (De Morgan qonunlari) Bu bobda biz &&, &, ||, |, ^ va ! mantiqiy operatorlarini muhokama qildik.
De Morgan qonunlari ba'zan biz uchun mantiqiy ifodani ifodalash uchun qulayroq bo'lishi mumkin.
Bu qonunlar !(shart1 && shart2) ifodasi mantiqiy jihatdan ifodaga ekvivalent ekanligini bildiradi.
sion (!shart1 || !2-shart). Shuningdek, !(shart1 || shart2) ifodasi mantiqan
(!shart1 && !shart2) ifodasiga ekvivalent. Ekvivalent yozish uchun De Morgan qonunlaridan foydalaning

p 4 4


– -3--

4
-5--

4
– -7--

4
-9--

4
-11

= + + – ----- + …


198 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar

Quyidagilarning har biri uchun iboralarni kiriting, so'ngra ikkalasi ham asl eski ekanligini ko'rsatish uchun ariza yozing.
bosish va har bir holatda yangi ifoda bir xil qiymatni hosil qiladi:
a) !(x < 5) && !(y >= 7)
b) !(a == b) || !(g != 5)
c) !((x <= 8) && (y > 4))
d) !((i > 4) || (j <= 6))
5.24 (Olmosni chop etish dasturi) Quyidagi olmosni chop etuvchi dastur yozing
shakli. Siz bitta yulduzcha (*), bitta bo'sh joy yoki bitta yangi belgini chop etadigan chiqish bayonotlaridan foydalanishingiz mumkin.
chiziq belgisi. Takrorlashdan maksimal darajada foydalanishni (ijobiy so'zlar bilan) va minimallashtirish
chiqish bayonotlari soni.

5.25 (O'zgartirilgan olmos bosib chiqarish dasturi) 5.24-mashqda yozgan dasturni o'zgartiring


olmosdagi qatorlar sonini ko'rsatish uchun 1 dan 19 gacha bo'lgan oraliqdagi toq sonni o'qish. Sizning
keyin dastur tegishli o'lchamdagi olmosni ko'rsatishi kerak.
5.26 Tanaffus va davom iborasining tanqidi shundan iboratki, ularning har biri tuzilmagan.
Aslida, bu bayonotlar har doim tuzilgan bayonotlar bilan almashtirilishi mumkin, ammo buni amalga oshirish mumkin
noqulay bo'l. Umuman olganda, dasturdagi tsikldan har qanday break iborasini qanday olib tashlashni tasvirlab bering
va uni ba'zi tuzilgan ekvivalenti bilan almashtiring. [Maslahat: break iborasi tsikldan chiqadi
halqa tanasi. Chiqishning yana bir yo'li - tsiklni davom ettirish testidan o'tish. dan foydalanishni o'ylab ko'ring
halqani davom ettirish testi ikkinchi sinov bo'lib, u "uzilish" holati tufayli erta chiqishni ko'rsatadi.]
Ilovadan break iborasini olib tashlash uchun bu yerda ishlab chiqqan texnikadan foydalaning
5.13-rasm.
5.27 Quyidagi dastur segmenti nima qiladi?
uchun (i = 1; i <= 5; i++)
{
uchun (j = 1; j <= 3; j++)
{
uchun (k = 1; k <= 4; k++)
System.out.print('*');
System.out.println();
} // end ichki uchun
System.out.println();
} // uchun tashqi tugatish
5.28 Dasturdagi sikldan davom etish bayonotini qanday olib tashlashni umumiy tavsiflab bering
va uni ba'zi tuzilgan ekvivalenti bilan almashtiring. O'chirish uchun bu erda ishlab chiqilgan texnikadan foydalaning
5.14-rasmdagi dasturning bayonotini davom ettiring.
5.29 (“Rojdestvoning o‘n ikki kuni” qo‘shig‘i) Takrorlash va ishlatadigan dastur yozing.
"Rojdestvoning o'n ikki kuni" qo'shig'ini chop etish uchun bayonotlarni almashtiring. Bitta switch bayonoti bo'lishi kerak
kunni chop etish uchun ishlatiladi ("birinchi", "ikkinchi" va boshqalar). Alohida switch bayonotidan foydalanish kerak

*
***


*****
*******
*********
*******
*****
***
*

Farq qilish 199



har bir oyatning qolgan qismini chop etish uchun. En.wikipedia.org/wiki/The_Twelve_Days_ veb-saytiga tashrif buyuring
of_Rojdestvo_(qo'shiq) qo'shiq matni uchun.
5.30 (O'zgartirilgan AutoPolicy klassi) Ikki harfdan iboratligini tasdiqlash uchun 5.11-rasmdagi AutoPolicy sinfini o'zgartiring.
shimoli-sharqiy shtatlar uchun davlat kodlari. Kodlar: Konnektikut uchun CT, Massachusets uchun MA, ME
Meyn uchun, Nyu-Xempshir uchun NH, Nyu-Jersi uchun NJ, Nyu-York uchun NY, Pensilvaniya uchun PA
va Vermont uchun VT. AutoPolicy setState usulida mantiqiy OR (||) operatoridan foydalaning
(5.9-bo'lim) usulni taqqoslaydigan if…else iborasida qo'shma shart yaratish
har ikki harfli kod bilan argument. Agar kod noto'g'ri bo'lsa, if...else iborasining boshqa qismi
xato xabarini ko'rsatishi kerak. Keyingi boblarda siz istisnolardan foydalanishni o'rganasiz.
usul noto'g'ri qiymat olganligini ko'rsating.
Farq qilish
5.31 (Global isish faktlari viktorinasi) Global isishning munozarali muammosi keng tarqalgan.
sobiq vitse-prezident Al Gor ishtirokidagi "Noqulay haqiqat" filmi tomonidan e'lon qilingan. Janob Gor
va BMTning olimlar tarmog'i, Iqlim o'zgarishi bo'yicha hukumatlararo panel 2007 y.
Tinchlik uchun Nobel mukofoti "kattaroq bilimlarni shakllantirish va tarqatish bo'yicha ularning sa'y-harakatlari" uchun
texnogen iqlim o'zgarishi haqida." Global isish muammosining har ikki tomonini onlayn tadqiq qiling (siz
"global isish skeptiklari" kabi iboralarni qidirishni xohlashingiz mumkin). Beshta savolli ko'p savol yarating
global isish bo'yicha tanlov viktorinasi, har bir savol to'rtta javobga ega (1-4 raqamlari). Obuna bo'ling -
ob'ektiv va masalaning har ikki tomonini adolatli ko'rsatishga harakat qiling. Keyinchalik, boshqaruvchi dasturni yozing
viktorina, to'g'ri javoblar sonini (noldan beshgacha) hisoblab chiqadi va xabarni qaytaradi
foydalanuvchi. Agar foydalanuvchi beshta savolga to'g'ri javob bersa, "A'lo" deb chop eting; agar to'rtta bo'lsa, "Juda yaxshi" deb chop eting; agar
uchta yoki undan kam bo'lsa, "Global isish haqidagi bilimlaringizni yangilash vaqti" deb chop eting va ro'yxatni qo'shing
faktlaringizni topgan ba'zi veb-saytlar.
5.32 (Soliq rejasining alternativlari; “FairTax”) Soliq solishni adolatli qilish uchun ko'plab takliflar mavjud.
Qo'shma Shtatlardagi FairTax tashabbusini www.fairtax.org saytida ko'rib chiqing. Qanday qilib pro-
FairTax ishlarini taqdim etdi. Bir taklif daromad solig'i va boshqa ko'pgina soliqlarni foydasiga olib tashlashdir
siz sotib olgan barcha mahsulot va xizmatlar uchun 23% iste'mol solig'i. Ba'zi FairTax muxoliflari savol berishadi -
23% ko'rsatkichni ayting va soliqni hisoblash usuli tufayli bu aniqroq bo'lishini ayting
stavka 30% deb aytish uchun - buni diqqat bilan tekshiring. Foydalanuvchiga xarajatlarni kiritishni taklif qiladigan dastur yozing
har xil xarajatlar toifalarida (masalan, uy-joy, oziq-ovqat, kiyim-kechak, transport, ta'lim,
sog'liqni saqlash, ta'tillar), keyin u kishi to'lashi kerak bo'lgan taxminiy FairSolig'ini chop etadi.
5.33 (Facebook foydalanuvchilari bazasining o'sishi) CNNMoney.com ma'lumotlariga ko'ra, Facebook bir milliard dollarni tashkil etdi.
ers 2012 yil oktyabr oyida.
uning foydalanuvchi bazasi oyiga 4% ga o'sadi, Facebook o'sishi uchun necha oy kerak bo'ladi
uning foydalanuvchi bazasi 1,5 milliard foydalanuvchiga? Facebook o'z foydalanuvchi bazasini ko'paytirish uchun necha oy kerak bo'ladi
ikki milliard foydalanuvchiga?

6 ta usul: chuqurroq qarash


Shakl har doim funktsiyadan keyin keladi.
- Lui Anri Sallivan
E pluribus unum.
(Biri ko'pdan iborat.)
- Virgil
O! Kecha qo'ng'iroq qiling, taklif vaqti
qaytish.
- Uilyam Shekspir
Menga bir so'z bilan javob bering.
- Uilyam Shekspir
Bir nuqta bor
usullar o'zini yutib yuboradi.
- Frants Fanon
Oh maqsadlar
Ushbu bobda siz quyidagilarni bilib olasiz:
■ Qanday statik usullar va
maydonlar bilan bog'langan
ob'ektlar emas, balki sinflar.
■ Qanday qilib qo'ng'iroq qilish/qaytish usuli
mexanizmi tomonidan quvvatlanadi
usul-chaqiruv stek.
■ Argumentlarni ilgari surish haqida
va kasting.
■ Paketlar qanday guruhlangan
sinflar.
■ xavfsiz tasodifiy foydalanish-
raqam yaratish
o'yin o'ynashni amalga oshirish
ilovalar.
■ Ko'rinishi qanday
deklaratsiyalar bilan cheklanadi
dasturlarning muayyan hududlari.
■ Haddan tashqari yuklash qanday usul
va haddan tashqari yukni qanday yaratish kerak
usullari.

6.1 Kirish 201

6.1 Kirish
Tajriba shuni ko'rsatadiki, katta dasturni ishlab chiqish va qo'llab-quvvatlashning eng yaxshi usuli -
uni kichik, oddiy qismlardan yoki modullardan tuzing. Ushbu texnika "bo'lish va birlashtirish" deb ataladi.
so'roq. Biz 3-bobda tanishtirgan usullar dasturlarni modullashtirishga yordam beradi. Bunda
bobda biz usullarni chuqurroq o'rganamiz.
Siz statik usullar haqida ko'proq bilib olasiz, ularni talab qilmasdan chaqirish mumkin
mavjud bo'lgan sinf ob'ekti. Shuningdek, Java qanday usulni kuzatib borishini bilib olasiz
hozirda bajarilmoqda, usullarning mahalliy o'zgaruvchilari xotirada qanday saqlanadi va qanday
usul ijroni tugatgandan so'ng qaerga qaytishni biladi.
Biz tasodifiy sonlar avlodlari bilan simulyatsiya usullariga qisqacha to'xtalib o'tamiz.
tion va dasturlash eng foydalanadi craps deb nomlangan zar o'yin versiyasini ishlab chiqish
Siz kitobning shu nuqtasiga qadar ishlatgan texnikalar. Bundan tashqari, siz qanday deklaratsiya qilishni o'rganasiz
dasturlaringizdagi konstantalar.
Ilovalarni ishlab chiqishda foydalanadigan yoki yaratadigan ko'plab sinflar ko'proq bo'ladi
bir xil nomdagi bir nechta usul. Haddan tashqari yuklash deb ataladigan bu usul:
Har xil turdagi yoki har xil argumentlar uchun o'xshash vazifalarni bajaradigan usullar
argumentlar soni.
Biz usullarni muhokama qilishni 18-bob, Rekursiyada davom ettiramiz. Rekursiya tarafdori
usullar va algoritmlar haqida qiziqarli fikrlash usulini taqdim etadi.
6.2 Java tilidagi dastur modullari
Siz Java dasturlarini yangi usullar va sinflarni oldindan belgilangan usullar bilan birlashtirib yozasiz
Java ilovalari dasturlash interfeysida mavjud (shuningdek, Java API deb ataladi
yoki Java sinf kutubxonasi) va boshqa turli sinf kutubxonalarida. Tegishli sinflar odatda
dasturlarga import qilish va qayta foydalanish uchun paketlarga guruhlangan. Siz o'rganasiz
21.4.10-bo'limda o'z sinflaringizni paketlarga qanday guruhlashingiz mumkin. Java API taqdim etadi
Umumiy matematikani bajarish usullarini o'z ichiga olgan oldindan belgilangan sinflarning boy to'plami
ematik hisoblar, string manipulyatsiyasi, belgilar manipulyatsiyasi, kiritish/chiqish opera-
ma'lumotlar bazasi operatsiyalari, tarmoq operatsiyalari, fayllarni qayta ishlash, xatolarni tekshirish va
Ko'proq.

6.1 Kirish


6.2 Java tilidagi dastur modullari
6.3 Statik usullar, statik maydonlar
va sinf matematika
6.4 Ko'p sonli usullarni e'lon qilish
Parametrlar
6.5 Deklaratsiya va foydalanish bo'yicha eslatmalar
Usullari
6.6 Metod-Stek va stek ramkalarini chaqirish
6.7 Argumentlarni ilgari surish va kasting

6.8 Java API paketlari


6.9 Vaziyatni o'rganish: Xavfsiz tasodifiy raqam
Avlod
6.10 Case Study: Imkoniyatlar o'yini;
Enum turlari bilan tanishtirish
6.11 Deklaratsiyalar doirasi
6.12 Usulning haddan tashqari yuklanishi
6.13 (ixtiyoriy) GUI va grafik ishi
O'rganish: Ranglar va to'ldirilgan shakllar
6.14 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish


202 6-bob Usullar: Chuqurroq qarash

Sinflar va usullar bilan bo'ling va g'alaba qozoning
Sinflar va usullar dasturni vazifalarni o'z-o'zini boshqarishga ajratish orqali modullashtirishga yordam beradi.
biriktirilgan birliklar. Usul tanasidagi gaplar faqat bir marta yoziladi, ulardan yashiriladi
boshqa usullar va dasturning bir nechta joylaridan qayta foydalanish mumkin.
Dasturni sinflar va usullarga modullashtirish uchun motivatsiyalardan biri bu bo'linishdir.
va-g'alaba qozonish yondashuvi, bu esa dasturni ishlab chiqish orqali yanada boshqariladigan qiladi.
kichik, oddiy qismlardan dasturlarni tuzish. Yana biri dasturiy ta'minotni qayta ishlatish - foydalanish
mavjud sinflar va usullar yangi dasturlarni yaratish uchun qurilish bloklari sifatida. Ko'pincha, mumkin
dasturlarni maxsus qurish orqali emas, balki asosan mavjud sinflar va usullardan yarating.
kodlangan kod. Misol uchun, oldingi dasturlarda biz ma'lumotlarni qanday o'qishni aniqlamadik
klaviatura - Java ushbu imkoniyatlarni Scanner sinfining usullarida taqdim etadi. Uchinchi motiv -
vation kodni takrorlashdan qochishdir. Dasturni mazmunli sinflar va usullarga bo'lish
dasturni disk raskadrovka va saqlashni osonlashtiradi.

Usul chaqiruvlari orasidagi ierarxik munosabat


Ma'lumki, usul usul chaqiruvi orqali chaqiriladi va chaqirilgan usul birlashganda.
o'z vazifasini bajaradi, u boshqaruvni va ehtimol natijani qo'ng'iroq qiluvchiga qaytaradi. Ushbu pro-ga o'xshashlik
gramm tuzilishi boshqaruvning ierarxik shaklidir (6.1-rasm). Bir xo'jayin (qo'ng'iroq qiluvchi) so'raydi
ishchi (chaqirilgan usul) vazifani bajarish va natijalarni keyin hisobot berish (qaytarish).
vazifani bajarish. Boss usuli ishchi usuli qanday ishlashini bilmaydi
uning belgilangan vazifalari. Ishchi o'ziga ma'lum bo'lmagan boshqa ishchi usullarini ham chaqirishi mumkin
xo'jayin. Amalga oshirish tafsilotlarini "yashirish" yaxshi dasturiy ta'minot muhandisligiga yordam beradi.
6.1-rasmda yuqori darajadagi bir nechta ishchi usullari bilan bog'lanishning boss usuli ko'rsatilgan.
erarxik uslub. Boss usuli o'z vazifalarini turli ishchilar o'rtasida taqsimlaydi
usullari. Bu yerda ishchi1 ishchi4 va ishchi5 uchun “boshliq usuli” vazifasini bajaradi.

Dasturiy ta'minot muhandisligi kuzatuvi 6.1


Java tomonidan taqdim etilgan sinflar va usullarning boy to'plami bilan tanishing
API (http://docs.oracle.com/javase/7/docs/api/). 6.8-bo'lim bir nechta sharhlarni ko'rib chiqadi
umumiy paketlar. Onlayn F ilovasi API hujjatlarida qanday harakat qilishni tushuntiradi.
G'ildirakni qayta ixtiro qilmang. Iloji bo'lsa, Java API sinflari va usullaridan qayta foydalaning. Bu kamaytiradi
dasturni ishlab chiqish vaqti va dasturlash xatolarini kiritishdan qochadi.

Dasturiy ta'minot muhandisligi kuzatuvi 6.2


Dasturiy ta'minotning qayta ishlatilishini targ'ib qilish uchun har bir usul bitta,
aniq belgilangan vazifa va usulning nomi bu vazifani samarali ifodalashi kerak.
Xatolarning oldini olish bo'yicha maslahat 6.1
Bitta vazifani bajaradigan usulni sinab ko'rish va disk raskadrovka qilish ko'p vazifalarni bajaradigan usuldan osonroqdir.

Dasturiy ta'minot muhandisligi kuzatuvi 6.3


Agar siz usulning vazifasini ifodalovchi qisqa nomni tanlay olmasangiz, sizning usulingiz bo'lishi mumkin
juda ko'p vazifalarni bajarishga urinish. Bunday usulni bir nechta kichikroqlarga ajrating.

Xatolarning oldini olish bo'yicha maslahat 6.2


Usul bajarilganligini ko'rsatadigan qiymatni qaytaradigan usulni chaqirganingizda
uning vazifasi muvaffaqiyatli bajarilgan bo'lsa, ushbu usulning qaytish qiymatini tekshiring va agar bu usul bo'lsa
muvaffaqiyatsiz bo'ldi, muammoni to'g'ri hal qiling.

6.3 Static Methods, Static Fields va Class Math 203

6.3 Statik usullar, statik maydonlar va sinf matematikasi
Ko'pgina usullar ma'lum ob'ektlardagi usul chaqiruvlariga javoban bajarilsa-da, bunday emas
har doim shunday. Ba'zan usul ob'ektga bog'liq bo'lmagan vazifani bajaradi.
Bunday usul bir butun sifatida e'lon qilingan va statistik deb nomlanuvchi sinfga nisbatan qo'llaniladi.
ic usuli yoki sinf usuli.
Sinflar umumiy bajarish uchun qulay statik usullarni o'z ichiga olishi odatiy holdir
vazifalar. Misol uchun, biz qiymatni oshirish uchun Math sinfining pow statik usulidan foydalanganimizni eslang
5.6-rasmdagi quvvat. Usulni statik deb e'lon qilish uchun static kalit so'zini oldinga qo'ying
usul deklaratsiyasida qaytish turi. Dasturingizga import qilingan har qanday sinf uchun siz
bo'lgan sinf nomini ko'rsatib, sinfning statik usullarini chaqirishi mumkin
usul e'lon qilinadi, undan keyin nuqta (.) va usul nomi, dagi kabi

Matematika dars usullari


Statik usullar tushunchasini taqdim qilish uchun bu yerda turli Matematik sinf usullaridan foydalanamiz. Sinf
Matematika umumiy matematik ishlarni bajarishga imkon beruvchi usullar to'plamini taqdim etadi
hisob-kitoblar. Masalan, statik bilan 900,0 kvadrat ildizini hisoblashingiz mumkin
usul chaqiruvi

Bu ifoda 30.0 ga baholanadi. Sqrt usuli double tipidagi argumentni oladi va qayta


double tipidagi natijani aylantiradi. Oldingi usulning qiymatini chiqarish uchun com-da qo'ng'iroq qiling.
mand oynasida siz bayonot yozishingiz mumkin

Ushbu bayonotda sqrt qaytaradigan qiymat println usuli uchun argumentga aylanadi.


Sqrt usulini chaqirishdan oldin Math ob'ektini yaratishning hojati yo'q edi. Shuningdek, barcha matematika darslari
usullar statikdir - shuning uchun har biri o'z nomidan oldin sinf nomi bilan chaqiriladi
Matematika va nuqta (.) ajratuvchi.

6.1-rasm | Ierarxik xo'jayin-usuli/ishchi-usuli munosabati.

ClassName.methodName(argumentlar)

Math.sqrt(900.0)

System.out.println(Math.sqrt(900.0));

Dasturiy ta'minot muhandisligi kuzatuvi 6.4


Matematik sinf java.lang paketining bir qismi bo'lib, kompilyator tomonidan bilvosita import qilinadi,
shuning uchun uning usullaridan foydalanish uchun Math sinfini import qilish shart emas.

xo'jayin


ishchi1 ishchi2 ishchi3

ishchi4 ishchi5


204 6-bob Usullar: Chuqurroq qarash

Usul argumentlari doimiylar, o'zgaruvchilar yoki ifodalar bo'lishi mumkin. Agar c = 13,0 bo'lsa, d = 3,0 va
f = 4.0, keyin bayonot

13,0 + 3,0 * 4,0 = 25,0 kvadrat ildizini hisoblab chiqadi va chop etadi - ya'ni 5,0. 6.2-rasm


Matematika darsining bir qancha usullarini umumlashtiradi. Rasmda x va y double tipiga ega.

statik o'zgaruvchilar


3.2-bo'limni eslatib o'tamizki, sinfning har bir ob'ekti har bir misolning o'ziga xos nusxasini saqlaydi
sinf o'zgaruvchisi. Sinfning har bir ob'ektiga kerak bo'lmagan o'zgaruvchilar mavjud
alohida nusxaga ega bo'ling (bir lahzada ko'rasiz). Bunday o'zgaruvchilar statik deb e'lon qilinadi va bo'ladi
sinf o'zgaruvchilari sifatida ham tanilgan. Statik o'zgaruvchilarni o'z ichiga olgan sinf ob'ektlari yaratilganda
Bu sinfning barcha ob'ektlari ushbu o'zgaruvchilarning bir nusxasini bo'lishadi. Birgalikda sinfning statik holati
o'zgaruvchilar va misol o'zgaruvchilari uning maydonlari sifatida tanilgan. Statik haqida ko'proq bilib olasiz
8.11-bo'limdagi maydonlar.
Matematik sinf statik konstantalari PI va E
Math sinfi yuqori aniqlikdagi ilovalarni ifodalovchi Math.PI va Math.E kabi ikkita doimiyni e'lon qiladi.
tez-tez ishlatiladigan matematik konstantalarga yaqinlik. Math.PI (3.141592653589793)
aylana aylanasining diametriga nisbati. Math.E (2.718281828459045) - bu

System.out.println(Math.sqrt(c + d * f));

Usul tavsifi Misol

abs(x) abs(23,7) ning abs(x) mutlaq qiymati 23,7 ga teng


abs(0,0) 0,0 ga teng
abs(-23,7) 23,7 ga teng
ceil(x) x ni eng kichik butun songa yaxlitlaydi
x dan kichik

tavan (9,2) 10,0 ga teng


shift (-9,8) -9,0
cos(x) x ning trigonometrik kosinasi (x radianda) cos(0,0) 1,0 ga teng
exp(x) eksponensial usuli ex exp(1.0) 2.71828
exp (2.0) - 7.38906
qavat(x) x ni eng katta emas butun songa yaxlitlaydi
x dan katta

qavat (9.2) - 9.0


qavat (-9,8) -10,0
log(x) x (e asosi) log(Math.E) ning natural logarifmi 1,0 ga teng
log(Math.E * Math.E) 2,0 ni tashkil qiladi
max(x, y) kattaroq x va y qiymati max(2,3, 12,7) 12,7 ga teng
max(-2,3, -12,7) -2,3
min(x, y) x va y ning kichik qiymati min(2,3, 12,7) 2,3 ga teng.
min(-2,3, -12,7) -12,7 ga teng
pow(x, y) x y (ya'ni xy) quvvatga ko'tarilgan pow(2,0, 7,0) 128,0 ga teng
pow (9,0, 0,5) 3,0 ga teng
sin(x) x ning trigonometrik sinusi (x radianda) sin(0,0) 0,0 ga teng
x sqrt(900,0) ning sqrt(x) kvadrat ildizi 30,0 ga teng
tan(x) x ning trigonometrik tangensi (x radianda) tan(0,0) 0,0 ga teng

6.2-rasm | Matematika dars usullari.


6.4 Ko'p parametrli usullarni e'lon qilish 205

tabiiy logarifmlar uchun asosiy qiymat (statik Math metodi jurnali bilan hisoblangan). Bular -
stentlar Math sinfida ochiq, yakuniy va statik modifikatorlar bilan e'lon qilinadi. yasash
ularni ommaga o'z darslarida foydalanish imkonini beradi. Kalit so'z bilan e'lon qilingan har qanday maydon
final doimiy - maydon ishga tushirilgandan keyin uning qiymati o'zgarmaydi. Bu maydonlarni yaratish
static ularga Math sinf nomi va nuqta (.) ajratgich orqali kirish imkonini beradi, xuddi shunday
sinf matematikasi usullari.
Nima uchun asosiy usul statik deb e'lon qilinadi?
Java virtual mashinasini (JVM) java buyrug'i bilan bajarganingizda, JVM
siz ko'rsatgan sinfning asosiy usulini chaqirishga urinishlar - bu nuqtada hech qanday ob'ekt yo'q
sinf yaratildi. Asosiyni statik deb e'lon qilish JVM ga asosiyni chaqirish imkonini beradi -
sinfning namunasini yaratish. Ilovangizni bajarganingizda, siz uni belgilaysiz
java buyrug'iga argument sifatida sinf nomi, kabi

JVM ClassName tomonidan belgilangan sinfni yuklaydi va usulni chaqirish uchun shu sinf nomidan foydalanadi


asosiy. Oldingi buyruqda ClassName JVM uchun buyruq qatori argumentidir
bu qaysi sinfni bajarish kerakligini aytadi. ClassName dan so'ng siz ro'yxatni ham belgilashingiz mumkin
JVM sizga o'tadigan buyruq qatori argumentlari sifatida satrlar (bo'shliqlar bilan ajratilgan).
ilova. Bunday argumentlar ishga tushirish variantlarini (masalan, fayl nomi) belgilash uchun ishlatilishi mumkin
ilova. Massivlar va massivlar roʻyxatining 7-bobida bilib olganingizdek, ilovangiz quyidagi amallarni bajarishi mumkin:
ushbu buyruq qatori argumentlarini o'chiring va ulardan ilovani sozlash uchun foydalaning.
6.4 Ko'p parametrli usullarni e'lon qilish
Usullar o'z vazifalarini bajarish uchun ko'pincha bir nechta ma'lumotni talab qiladi. Biz hozir
bir nechta parametrlar bilan o'z usullaringizni qanday yozishni ko'rib chiqing.
6.3-rasmda uchtadan eng kattasini aniqlash va qaytarish uchun maksimal deb nomlangan usul qo'llaniladi
ikki tomonlama qiymatlar. Asosan, 14–18 qatorlar foydalanuvchini uchta qo'sh qiymat kiritishni taklif qiladi
ularni foydalanuvchidan o'qing. 21-qator maksimal usulni chaqiradi (28-41-qatorlarda e'lon qilingan)
argument sifatida qabul qiladigan uchta qiymatdan eng kattasini qazib oling. Qachon usul maksimal
natijani 21-satrga qaytaradi, dastur mahalliy o'zgaruvchiga maksimalning qaytish qiymatini belgilaydi
natija. Keyin 24-qator maksimal qiymatni chiqaradi. Ushbu bo'limning oxirida biz muhokama qilamiz
24-qatorda + operatoridan foydalanish.

java ClassName argument1 argument2 …

1 // 6.3-rasm: MaximumFinder.java
2 // Dasturchi tomonidan e'lon qilingan maksimal usul uchta juft parametr bilan.
3 import java.util.Scanner;
4
5 umumiy sinf MaximumFinder
6 {
7 // uchta suzuvchi nuqta qiymatini oling va maksimal qiymatni toping
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // buyruqlar oynasidan kiritish uchun skaner yarating
11 Skaner kiritish = yangi Skaner(System.in);
12

6.3-rasm | Dasturchi tomonidan e'lon qilingan maksimal uchta ikkita parametrli usul. (2-qismning 1-qismi.)


206 6-bob Usullar: Chuqurroq qarash

Umumiy va statik kalit so'zlar
Maksimal usulning e'lon qilinishi usul ekanligini ko'rsatish uchun public kalit so'zi bilan boshlanadi
"omma uchun mavjud" - uni boshqa sinflarning usullaridan chaqirish mumkin. Kalit so'z
statik asosiy usulga (boshqa statik usul) ko'rsatilgandek maksimalni chaqirish imkonini beradi
21-qator usul nomini sinf nomi bilan MaximumFinder-statik bilan kvalifikatsiya qilmasdan
bir sinfdagi usullar bir-birini to'g'ridan-to'g'ri chaqirishi mumkin. Maksimal foydalanadigan har qanday boshqa sinf
usul nomini sinf nomi bilan to'liq moslashtirishi kerak.

13 // uchta suzuvchi nuqta qiymatini so'rash va kiritish


14 System.out.print(
15 "Bo'shliqlar bilan ajratilgan uchta suzuvchi nuqta qiymatini kiriting: ");
16 juft raqam1 = input.nextDouble(); // birinchi dublni o'qing
17 juft raqam2 = input.nextDouble(); // ikkinchi dublni o'qing
18 juft raqam3 = input.nextDouble(); // uchinchi dublni o'qing
19
20 // maksimal qiymatni aniqlang
21
22
23 // maksimal qiymatni ko'rsatish
24 System.out.println( );
25 }
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 } // MaximumFinder oxirgi sinfi

Bo'shliqlar bilan ajratilgan uchta suzuvchi nuqta qiymatini kiriting: 9,35 2,74 5.1


Maksimal: 9,35

Bo'shliqlar bilan ajratilgan uchta suzuvchi nuqta qiymatini kiriting: 5,8 12,45 8,32


Maksimal: 12.45

Bo'shliqlar bilan ajratilgan uchta suzuvchi nuqta qiymatini kiriting: 6,46 4,12 10,54


Maksimal: 10,54

6.3-rasm | Dasturchi tomonidan e'lon qilingan maksimal uchta ikkita parametrli usul. (2-qismning 2-qismi.)

er-xotin natija = maksimal (1-raqam, 2-raqam, 3-raqam);

"Maksimal: " + natija

// uchta juft parametrning maksimalini qaytaradi
umumiy statik ikki baravar maksimal (ikki marta x, ikki y, ikki marta z)
{
double maksimalValue = x; // faraz qilaylik, x boshlash uchun eng katta
// y maksimalValue dan katta yoki yo'qligini aniqlang
agar (y > maksimal qiymat)
maksimalValue = y;
// z maksimal qiymatdan katta ekanligini aniqlang
agar (z > maksimal qiymat)
maksimalValue = z;
maksimal qiymatni qaytarish;
}

6.4 Ko'p parametrli usullarni e'lon qilish 207

Maksimal usul
Maksimal deklaratsiyani ko'rib chiqing (28–41-qatorlar). 28-qator ikki tomonlama qiymatni qaytarishini bildiradi.
ue, usul nomi maksimal va usul uchta juft parametrni talab qiladi
(x, y va z) o'z vazifasini bajarish uchun. Bir nechta parametrlar vergul bilan ajratilgan
ro'yxati. 21-qatordan maksimal chaqirilganda, x, y va z parametrlari nusxalar bilan ishga tushiriladi.
mos ravishda number1, number2 va number3 argumentlari qiymatlarining. Bitta bo'lishi kerak
usul deklaratsiyasidagi har bir parametr uchun usul chaqiruvidagi argument. Shuningdek, har bir dalil
ment mos keladigan parametr turiga mos kelishi kerak. Masalan, pa-
double tipidagi rametr 7.35, 22 yoki –0.03456 kabi qiymatlarni qabul qilishi mumkin, lekin qatorlarni emas.
"salom" yoki mantiqiy qiymatlar true yoki false emas. 6.7-bo'limda argument turlari muhokama qilinadi
ibtidoiy turdagi har bir parametr uchun usul chaqiruvida taqdim etilishi mumkin.
Maksimal qiymatni aniqlash uchun biz x parametrini taxmin qilishdan boshlaymiz
eng katta qiymatni o'z ichiga oladi, shuning uchun 30-satr mahalliy maksimalValue o'zgaruvchisini e'lon qiladi va uni ishga tushiradi
x parametrining qiymati bilan. Albatta, y yoki z parametrlari o'z ichiga olishi mumkin
haqiqiy eng katta qiymat, shuning uchun biz ushbu qiymatlarning har birini maksimalValue bilan solishtirishimiz kerak. Agar
33–34-qatorlardagi bayonot y maksimal qiymatdan katta ekanligini aniqlaydi. Agar shunday bo'lsa, 34-qator
y ni maksimalValue ga belgilaydi. 37–38-qatorlardagi if iborasi z ning mavjudligini aniqlaydi
maksimal qiymatdan katta. Agar shunday bo'lsa, 38-qator z qiymatini maksimalValue ga belgilaydi. Shu nuqtada
uchta qiymatdan eng kattasi maksimal qiymatda joylashgan, shuning uchun 40-satr bu qiymatni 21-qatorga qaytaradi.
Dastur boshqaruvi dasturning maksimal chaqirilgan nuqtasiga qaytganda,
maksimalning x, y va z parametrlari endi xotirada mavjud emas.

Metodni qayta ishlatish orqali maksimal usulni amalga oshirish Math.max


Bizning maksimal usulimizning butun tanasi ikkita chaqiruv bilan ham amalga oshirilishi mumkin
Math.max, quyidagicha:

Math.max ga birinchi qo'ng'iroq x va Math.max(y, z) argumentlarini belgilaydi. Har qanday usuldan oldin


chaqirilishi mumkin, ularning qiymatlarini aniqlash uchun uning argumentlari baholanishi kerak. Agar argument bo'lsa
usul chaqiruvi, uning qaytish qiymatini aniqlash uchun usul chaqiruvi bajarilishi kerak. Shunday qilib, ichida
oldingi bayonotda Math.max(y, z) y va z ning maksimalini aniqlash uchun baholanadi.
Keyin natija Math.max ga boshqa chaqiruvga ikkinchi argument sifatida uzatiladi, bu esa qayta-
uning ikkita argumentidan kattarog'ini aylantiradi. Bu dasturiy ta'minotni qayta ishlatishning yaxshi namunasidir - biz topamiz
ikkita qiymatdan kattasini topadigan Math.max ni qayta ishlatish orqali uchta qiymatdan eng kattasi. Qanday qilib
qisqacha bu kod 6.3-rasmning 30-38-qatorlari bilan taqqoslanadi.

Dasturiy ta'minot muhandisligi kuzatuvi 6.5


Usullar ko'pi bilan bitta qiymatni qaytarishi mumkin, ammo qaytarilgan qiymat bir ga havola bo'lishi mumkin
ko'p qiymatlarni o'z ichiga olgan ob'ekt.

Dasturiy ta'minot muhandisligi kuzatuvi 6.6


O'zgaruvchilar faqat bir nechta usulda foydalanish uchun zarur bo'lsa, maydonlar sifatida e'lon qilinishi kerak
sinfning yoki dastur sinf usullariga qo'ng'iroqlar orasida ularning qiymatlarini saqlashi kerak bo'lsa.

Umumiy dasturlash xatosi 6.1


float x, float o'rniga float x, y bilan bir xil turdagi usul parametrlarini e'lon qilish
y - sintaksis xatosi - parametrlar ro'yxatidagi har bir parametr uchun tur talab qilinadi.

return Math.max(x, Math.max(y, z));


208 6-bob Usullar: Chuqurroq qarash

Satrlarni birlashma bilan yig'ish
Java + yoki += operatorlari yordamida String ob'ektlarini kattaroq satrlarga yig'ish imkonini beradi.
Bu qatorni birlashtirish deb nomlanadi. Operator + ning ikkala operandlari String ob-
jects, operator + to'g'ri operandning belgilari joylashgan yangi String ob'ektini yaratadi
chap operanddagilarning oxirida joylashtiriladi, masalan, "salom" + "bor" iborasi
“Salom u yerda” satrini yaratadi.
6.3-rasmning 24-qatoridagi “Maksimal:” ifodasi + natijada operator + bilan ishlatiladi.
String va double tipidagi operandlar. Java-dagi har bir ibtidoiy qiymat va ob'ekt rep- bo'lishi mumkin.
String sifatida norozi. Agar + operatorining operandlaridan biri String bo'lsa, ikkinchisi -
String ga aylantiriladi, keyin ikkalasi birlashtiriladi. 24-qatorda er-xotin qiymat o'zgartiriladi
uning String tasviriga va String oxirida joylashtirilgan "Maksimal: ". Agar bor bo'lsa
qo'sh qiymatdagi har qanday keyingi nollar bo'lsa, raqam mos bo'lganda, ular o'chiriladi.
Stringga o'zgartirildi - masalan, 9.3500 9.35 sifatida ifodalanadi.
String birlashmasida ishlatiladigan ibtidoiy qiymatlar Stringsga aylantiriladi. Boolean
bilan birlashtirilgan String "to'g'ri" yoki "noto'g'ri" ga aylantiriladi. Barcha ob'ektlar mavjud
ob'ektning String tasvirini qaytaradigan toString usuli. (Biz toString-ni muhokama qilamiz
Keyingi boblarda batafsilroq.) Ob'ekt String bilan birlashtirilganda, the
ob'ektning toString usuli ning String tasvirini olish uchun bilvosita chaqiriladi
ob'ekt. Method toString ham aniq chaqirilishi mumkin.
Katta String literallarini bir nechta kichikroq satrlarga ajratishingiz va ularni joylashtirishingiz mumkin
o'qish uchun bir nechta satr kodlari. Bunday holda, Strings yordamida qayta yig'ish mumkin
birikma. Biz 14-bobda Strings tafsilotlarini muhokama qilamiz.

6.5 Usullarni e'lon qilish va ulardan foydalanish bo'yicha eslatmalar


Metodni chaqirishning uchta usuli mavjud:
1. Xuddi shu sinfning boshqa usulini chaqirish uchun metod nomidan foydalanish, masalan
maksimal(1-raqam, 2-raqam, 3-raqam) 6.3-rasmning 21-qatorida.
2. Ob'ektga havolani o'z ichiga olgan o'zgaruvchidan foydalanish, keyin nuqta (.) va
havola qilingan ob'ektning statik bo'lmagan usulini chaqirish uchun usul nomi - masalan
3.2-rasmning 16-qatoridagi usul chaqiruvi, myAccount.getName(), u meth-ni chaqiradi.
od of class AccountTestning asosiy usulidan hisob. Statik bo'lmagan usul -
ods odatda misol usullari deb ataladi.

Umumiy dasturlash xatosi 6.2


String literalini satrlar bo'ylab buzish sintaktik xatodir. Agar kerak bo'lsa, Stringni ajratishingiz mumkin
bir nechta kichikroq satrlarga aylantiring va kerakli Stringni yaratish uchun birlashmadan foydalaning.

Umumiy dasturlash xatosi 6.3


Satrni birlashtirish uchun ishlatiladigan + operatorini qo'shimcha uchun ishlatiladigan + operatori bilan aralashtirib yuborish
g'alati natijalarga olib kelishi mumkin. Java operator operandlarini chapdan chapga qarab baholaydi
to'g'ri. Misol uchun, agar y butun o'zgaruvchisi 5 qiymatiga ega bo'lsa, "y + 2 = " + y + 2 ifodasi
natijada "y + 2 = 7" emas, "y + 2 = 52" qatori paydo bo'ladi, chunki birinchi navbatda y (5) qiymati con-
"y + 2 =" qatoriga biriktirilgan bo'lsa, keyin 2 qiymati yangi kattaroq satrga birlashtiriladi
"y + 2 = 5". "y + 2 = " + (y + 2) ifodasi "y + 2 = 7" kerakli natijani beradi.

6.6 Metod-Stek va stek ramkalarini chaqirish 209

3. Sinf nomi va nuqta (.) yordamida sinfning statik usulini chaqirish, masalan.
6.3-bo'limda Math.sqrt(900.0).
Statik usul to'g'ridan-to'g'ri bir xil sinfning boshqa statik usullarini chaqirishi mumkin (ya'ni
Usul nomining o'zi) va bir xil sinfdagi statik o'zgaruvchilarni to'g'ridan-to'g'ri boshqarishi mumkin.
Sinfning misol o'zgaruvchilari va misol usullariga kirish uchun statik usuldan foydalanish kerak
sinf ob'ektiga havola. Namuna usullari barcha maydonlarga kirishi mumkin (statik o'zgaruvchilar
va misol o'zgaruvchilari) va sinfning usullari.
Eslatib o'tamiz, statik usullar bir butun sifatida sinfga tegishli, misol usullari esa
sinfning muayyan namunasi (ob'ekti) bilan bog'langan va misolni boshqarishi mumkin
ushbu ob'ektning o'zgaruvchilari. Sinfning ko'plab ob'ektlari, ularning har biri namunaning o'z nusxalariga ega
o'zgaruvchilar, bir vaqtning o'zida mavjud bo'lishi mumkin. Aytaylik, statik usul misolni chaqiradi
to'g'ridan-to'g'ri usul. Statik usul qaysi ob'ektning misol o'zgaruvchilari ekanligini qanday biladi
manipulyatsiya qilish? Agar o'sha paytda sinfning ob'ektlari mavjud bo'lmasa nima bo'lar edi
misol usuli chaqirildimi? Shunday qilib, Java statik usulga to'g'ridan-to'g'ri ruxsat bermaydi
kirish namunasi o'zgaruvchilari va bir xil sinfning misol usullari.
Usulni chaqiruvchi bayonotga boshqaruvni qaytarishning uchta usuli mavjud. Agar
usul natijani qaytarmaydi, dastur oqimi ga yetganda boshqaruv qaytadi
usul tugaydigan o'ng qavs yoki gap qachon

bajariladi. Agar usul natijani qaytarsa, bayonot

ifodani baholaydi, so'ngra natijani chaqiruvchiga qaytaradi.

6.6 Metod-Stek va stek ramkalarini chaqirish


Java usul chaqiruvlarini qanday amalga oshirishini tushunish uchun avvalo ma'lumotlar strukturasini ko'rib chiqishimiz kerak
(ya'ni, tegishli ma'lumotlar to'plami) stek sifatida tanilgan. Siz stekni analog deb o'ylashingiz mumkin.
bir uyum idish-tovoqlarga gous. Idish qoziqqa qo'yilsa, u odatda tepaga qo'yiladi
(tovoqni to'plamga surish deb ataladi). Xuddi shunday, idish olib tashlanganda
qoziq, u odatda tepadan olib tashlanadi (tovoqni to'pdan tashlash deb ataladi).

qaytish;


qaytarish ifodasi;

Umumiy dasturlash xatosi 6.4


Usulni sinf deklaratsiyasining tanasidan tashqarida yoki boshqasining tanasi ichida e'lon qilish
usul sintaktik xatodir.

Umumiy dasturlash xatosi 6.5


Parametrni metod tanasida mahalliy o'zgaruvchi sifatida qayta e'lon qilish kompilyatsiya xatosidir.

Umumiy dasturlash xatosi 6.6


Qiymatni qaytarishi kerak bo'lgan usuldan qiymatni qaytarishni unutish - kompilyatsiya
xato. Agar voiddan boshqa qaytish turi ko'rsatilgan bo'lsa, usulda qaytarish bo'lishi kerak
usulning qaytish turiga mos keladigan qiymatni qaytaradigan bayonot. Qiymatni qaytarish
Qaytish turi bekor deb e'lon qilingan usuldan kompilyatsiya xatosi.

210 6-bob Usullar: Chuqurroq qarash

Staklar oxirgi kiruvchi, birinchi chiquvchi (LIFO) ma'lumotlar tuzilmalari sifatida tanilgan - oxirgi element ustiga surilgan.
stek - bu stekdan chiqarilgan birinchi element.
Dastur metodni chaqirganda, chaqirilgan usul unga qanday qaytishni bilishi kerak
qo'ng'iroq qiluvchi, shuning uchun qo'ng'iroq qilish usulining qaytish manzili usul-chaqiruv stekiga suriladi. Agar
bir qator usul chaqiruvlari sodir bo'ladi, ketma-ket qaytish manzillari stekga suriladi
har bir usul o'z qo'ng'iroq qiluvchiga qaytishi uchun oxirgi kirish, birinchi chiqish tartibi.
Usul chaqiruv stegi mahalliy o'zgaruvchilar uchun xotirani ham o'z ichiga oladi (shu jumladan
usul parametrlari) dasturni bajarish jarayonida usulni har bir chaqirishda foydalaniladi.
Usul chaqiruv stekining bir qismi sifatida saqlanadigan bu ma'lumotlar stek ramkasi (yoki
faollashtirish yozuvi) usul chaqiruvi. Usul chaqiruvi amalga oshirilganda, uchun stek ramkasi
bu usul chaqiruvi metod chaqiruvi stekiga suriladi. Usul o'ziga qaytganda
qo'ng'iroq qiluvchida, ushbu usul chaqiruvi uchun stek ramkasi stekdan va o'sha mahalliy o'zgaruvchilardan chiqariladi
endi dasturga ma'lum emas. Agar ob'ektga havolani ushlab turadigan mahalliy o'zgaruvchi bo'lsa
bu ob'ektga havola bilan dasturdagi yagona o'zgaruvchi, keyin, qachon stek ramka
o'z ichiga olgan mahalliy o'zgaruvchi stekdan o'chirilgan bo'lsa, ob'ektga endi kirish mumkin emas
dastur tomonidan va axlat paytida JVM tomonidan xotiradan o'chiriladi
to'plam, biz 8.10-bo'limda muhokama qilamiz.
Albatta, kompyuterning xotirasi cheklangan, shuning uchun faqat ma'lum miqdorda foydalanish mumkin
stek ramkalarini usul chaqiruv stekida saqlang. Agar ular bo'lishi mumkin bo'lgandan ko'ra ko'proq usul chaqiruvlari sodir bo'lsa
stek freymlari saqlanganida, stekning to'lib ketishi deb nomlanuvchi xatolik yuzaga keladi — biz bu haqda ko'proq gaplashamiz
11-bobda, istisnolardan foydalanish: chuqurroq qarash.

6.7 Argumentlarni ilgari surish va kasting


Usul chaqiruvlarining yana bir muhim xususiyati argumentlarni ilgari surish - argumentni konvertatsiya qilishdir.
mentning qiymati, agar iloji bo'lsa, usul mos keladigan tarzda olishni kutayotgan turga
parametr. Masalan, dastur hatto int argumenti bilan Math usuli sqrtni chaqirishi mumkin
garchi ikki tomonlama argument kutilmoqda. Bayonot

Math.sqrt(4) ni to'g'ri baholaydi va 2.0 qiymatini chop etadi. Usul deklaratsiyasi pa-


rameter ro'yxati Java-ga o'tishdan oldin int qiymati 4 ni ikki baravar 4.0 qiymatiga aylantirishga olib keladi
sqrt usuli qiymati. Bunday o'zgartirishlar, agar Java pro-
harakat qoidalari qanoatlanmaydi. Ushbu qoidalar qaysi konvertatsiyalarga ruxsat berilishini belgilaydi, ya'ni
qaysi biri ma'lumotlarni yo'qotmasdan bajarilishi mumkin. Yuqoridagi sqrt misolida int hisoblanadi
qiymatini o'zgartirmasdan dublga aylantiriladi. Biroq, doubleni int ga aylantirish
qo'sh qiymatning kasr qismini qisqartiradi - shuning uchun qiymatning bir qismi yo'qoladi. Konvertatsiya qilinmoqda
Katta butun son turlaridan kichik tamsayılar turlariga (masalan, long to int yoki int to short) ham natija berishi mumkin
o'zgartirilgan qiymatlarda.
Rag'batlantirish qoidalari ikki yoki undan ortiq ibtidoiy qiymatlarni o'z ichiga olgan ifodalarga nisbatan qo'llaniladi
turlari va ibtidoiy tipdagi qiymatlar usullarga argument sifatida uzatiladi. Har bir qiymat pro-
ifodadagi “eng yuqori” turga ko‘chiriladi. Aslida, ibora vaqtinchalikdan foydalanadi
har bir qiymatning nusxasi - asl qiymatlarning turlari o'zgarishsiz qoladi. 6.4-rasmda ko'rsatilgan
ibtidoiy turlari va har biriga ko'tarilishi mumkin bo'lgan turlar. a uchun amaldagi aksiyalar
berilgan tur har doim jadvalda yuqoriroq turga bo'ladi. Misol uchun, int ko'tarilishi mumkin
yuqori turlarga uzun, suzuvchi va qoʻsh.

System.out.println(Math.sqrt(4));


6.8 Java API paketlari 211

6.4-rasmdagi jadvaldagi qiymatlarni pastroq turlarga aylantirish turli qiymatlarga olib keladi
agar pastki tur yuqori turning qiymatini ifodalay olmasa (masalan, int qiymati 2000000).
qisqa va har qanday suzuvchi nuqtali raqamni o'zidan keyin raqamlar bilan ifodalash mumkin emas
kasrli nuqta butun son turida ifodalanishi mumkin emas, masalan, long, int yoki short). U yerda-
avvalo, konversiya natijasida ma'lumot yo'qolishi mumkin bo'lgan hollarda Java kompilyatori talab qiladi
ga aylantirishni aniq majburlash uchun cast operatoridan (4.10-bo'limda keltirilgan) foydalanishingiz kerak.
sodir bo'ladi - aks holda kompilyatsiya xatosi yuzaga keladi. Bu sizga "nazorat qilish" imkonini beradi
kompilyator. Siz aslida shunday deysiz: "Men bu konvertatsiya ma'lumotlarning yo'qolishiga olib kelishi mumkinligini bilaman, lekin
Bu erda mening maqsadlarim uchun, bu yaxshi." Faraz qilaylik, kvadrat usuli a ning kvadratini hisoblaydi
butun son va shuning uchun int argumentini talab qiladi. Kvadratni ikkita argument bilan chaqirish uchun
doubleValue, bizdan usul chaqiruvini shunday yozishimiz talab qilinadi

Ushbu usul chaqiruvi doubleValue qiymatini aa vaqtinchalik tamsayıga aniq aylantiradi (o'zgartiradi)


usul kvadratida foydalanish uchun. Shunday qilib, agar doubleValue qiymati 4,5 bo'lsa, usul qabul qiladi
qiymat 4 va 20,25 emas, 16 ni qaytaradi.

6.8 Java API paketlari


Ko'rib turganingizdek, Java-da toifalarga guruhlangan ko'plab oldindan belgilangan sinflar mavjud
paketlar deb ataladigan tegishli sinflar. Ular birgalikda Java Application Pro- deb nomlanadi.
gramming interfeysi (Java API) yoki Java sinf kutubxonasi. Java tilining katta kuchi bu
Java API-ning minglab sinflari. Ushbu kitobda biz foydalanadigan ba'zi asosiy Java API paketlari
6.5-rasmda tasvirlangan, bu qayta foydalanish mumkin bo'lgan komponentlarning faqat kichik bir qismini ifodalaydi
Java API.

kvadrat((int) doubleValue)

Umumiy dasturlash xatosi 6.7
Primitiv turdagi qiymatni boshqa ibtidoiy turga o'tkazish, agar yangi bo'lsa, qiymatni o'zgartirishi mumkin
turi haqiqiy reklama emas. Masalan, suzuvchi nuqta qiymatini butun songa chiqarish
qiymat natijaga kesish xatolarini (kasr qismini yo'qotish) kiritishi mumkin.

Yaroqli aksiyalarni yozing

ikki barobar Yo'q
ikki marta suzadi
uzoq suzuvchi yoki juftlik
int long, float yoki double
char int, long, float yoki double
short int, long, float yoki double (lekin belgi emas)
byte short, int, long, float yoki double (lekin char emas)
boolean Yo'q (mantiqiy qiymatlar hisoblanmaydi
Java tilidagi raqamlar)

6.4-rasm | Aktsiyalarga ibtidoiy turlarga ruxsat beriladi.


212 6-bob Usullar: Chuqurroq qarash

Paket tavsifi

java.awt.event Java Abstract Window Toolkit Voqealar to'plamida sinflar va


ikkalasida ham GUI komponentlari uchun hodisalarni boshqarish imkonini beruvchi interfeyslar
java.awt va javax.swing paketlari. (Qarang: 12-bob, GUI Compo-
entts: 1-qism va 22-bob, GUI komponentlari: 2-qism.)
java.awt.geom Java 2D Shapes to'plami ish uchun sinflar va interfeyslarni o'z ichiga oladi.
Java-ning ilg'or ikki o'lchovli grafik imkoniyatlari bilan ishlash. (Qarang
13-bob,.)
java.io Java kiritish/chiqish paketi sinflar va interfeyslarni o'z ichiga oladi
dasturlarga ma'lumotlarni kiritish va chiqarish imkonini beradi. (Qarang: 15-bob, Fayllar,
Oqimlar va obyektlarni ketma-ketlashtirish.)
java.lang Java til to'plami sinflar va interfeyslarni o'z ichiga oladi (muhokama qilingan
kitob bo'ylab) ko'plab Java dasturlari tomonidan talab qilinadi. Bu
paket kompilyator tomonidan barcha dasturlarga import qilinadi.
java.net Java tarmoq paketi sinflar va interfeyslarni o'z ichiga oladi
dasturlarni kompyuter tarmoqlari orqali muloqot qilish imkonini beradi.
to'r. (Onlayn 28-bobga qarang, Tarmoq.)
java.security Java Xavfsizlik paketi yaxshilash uchun sinflar va interfeyslarni o'z ichiga oladi
ilova xavfsizligi.
java.sql JDBC to'plamida ishlash uchun sinflar va interfeyslar mavjud
ma'lumotlar bazalari. (24-bobga qarang, JDBC yordamida ma'lumotlar bazalariga kirish.)
java.util Java Utilities to'plami utilita sinflari va interfeyslarni o'z ichiga oladi
katta hajmdagi ma'lumotlarni saqlash va qayta ishlash imkonini beradi. Bularning ko'pchiligi
sinflar va interfeyslar Java SE 8-ning yangisini qo'llab-quvvatlash uchun yangilandi
lambda imkoniyatlari. (Qarang: 16-bob, Umumiy toʻplamlar.)
java.util.concurrent Java Concurrency to'plami yordamchi dasturlar sinflari va interfeyslarni o'z ichiga oladi
bir nechta vazifalarni parallel ravishda bajara oladigan dasturlarni amalga oshirish uchun.
(Qarang: 23-bob, Parametrlar.)
javax.swing Java Swing GUI komponentlari to'plami sinflar va inter-
portlarni qo'llab-quvvatlaydigan Java Swing GUI komponentlari uchun yuzlar.
ble GUI'lar. Ushbu paket hali ham eski java.awt ning ba'zi elementlaridan foydalanadi
paket. (Qarang: 12-bob, GUI komponentlari: 1-qism va 22-bob,
GUI komponentlari: 2-qism.)
javax.swing.event Java Swing voqealar to'plami sinflar va interfeyslarni o'z ichiga oladi
GUI uchun hodisalarni boshqarishni yoqish (masalan, tugmani bosish uchun javob berish)
javax.swing paketidagi ponents. (Qarang: 12-bob, GUI komponentlari:
1-qism va 22-bob, GUI komponentlari: 2-qism.)
javax.xml.ws JAX-WS paketida ishlash uchun sinflar va interfeyslar mavjud
Java-da veb-xizmatlar. (Onlayn 32-bobga qarang, REST-ga asoslangan veb-xizmatlar.)
javafx paketlari JavaFX kelajak uchun afzal qilingan GUI texnologiyasidir. Bularni muhokama qilamiz
paketlar 25-bob, JavaFX GUI: 1-qism va onlayn JavaFX-da
GUI va multimedia bo'limlari.

6.5-rasm | Java API paketlari (quyi to'plam). (2-qismning 1-qismi.)


6.9 Case Study: Xavfsiz tasodifiy raqamlarni yaratish 213

Java-da mavjud bo'lgan paketlar to'plami juda katta. Xulosa qilinganlarga qo'shimcha ravishda
6.5-rasmda Java murakkab grafiklar uchun paketlarni, ilg'or grafik foydalanuvchi inter-
yuzlar, chop etish, ilg'or tarmoq, xavfsizlik, ma'lumotlar bazasini qayta ishlash, multimedia, kirish
qobiliyat (nogironlar uchun), bir vaqtda dasturlash, kriptografiya, XML
qayta ishlash va boshqa ko'plab imkoniyatlar. Java-dagi paketlar haqida umumiy ma'lumot uchun tashrif buyuring

Oldindan belgilangan Java sinfining usullari haqida qo'shimcha ma'lumotni quyidagi sahifada topishingiz mumkin


Java API hujjatlari

Ushbu saytga tashrif buyurganingizda, barcha sinflarning alifbo tartibida ro'yxatini ko'rish uchun Indeks havolasini bosing


va Java API-dagi usullar. Sinf nomini toping va uning havolasini bosing va onlayn de-
sinf skripti. Sinf usullari jadvalini ko'rish uchun METOD havolasini bosing. Har biri
statik usul qaytish turidan oldin "statik" so'zi bilan ro'yxatga olinadi.
6.9 Tasodifiy misol: Xavfsiz tasodifiy raqamlarni yaratish
Endi biz dasturlashning mashhur turiga qisqacha to'xtalamiz - simula-
tion va o'yin o'ynash. Ushbu va keyingi bo'limda biz o'yin o'ynash dasturini ishlab chiqamiz
bir nechta usullar bilan. Dastur shu tarzda taqdim etilgan boshqaruv iboralarining ko'pchiligidan foydalanadi
kitobda uzoq va bir nechta yangi dasturlash tushunchalarini taqdim etadi.
Tasodif elementi Secure- sinf ob'ekti orqali dasturga kiritilishi mumkin.
Tasodifiy (java.security paketi). Bunday ob'ektlar tasodifiy mantiqiy, bayt,
float, double, int, long va Gauss qiymatlari. Keyingi bir nechta misollarda biz ob'ektlardan foydalanamiz
tasodifiy qiymatlarni ishlab chiqarish uchun SecureRandom sinfining.
Xavfsiz tasodifiy raqamlarga o'tish
Ushbu kitobning so'nggi nashrlarida "tasodifiy" qiymatlarni olish uchun Java-ning Random sinfidan foydalanilgan. Bu sinf
zararli dasturchilar tomonidan bashorat qilinishi mumkin bo'lgan deterministik qiymatlarni ishlab chiqardi. Xavfsiz -
Tasodifiy ob'ektlar oldindan aytib bo'lmaydigan deterministik bo'lmagan tasodifiy sonlarni ishlab chiqaradi.
Deterministik tasodifiy sonlar ko'plab dasturiy ta'minot xavfsizligining manbai bo'lib kelgan
buzilishlar. Ko'pgina dasturlash tillari endi Java-ning Secure-ga o'xshash kutubxona xususiyatlariga ega.

Ushbu kitobda foydalanilgan ba'zi Java SE 8 paketlari


java.time Yangi Java SE 8 Date/Time API paketi sinflar va inter-
sana va vaqt bilan ishlash uchun yuzlar. Bu xususiyatlar uchun mo'ljallangan
java.util paketining eski sana va vaqt imkoniyatlarini almashtiring. (Qarang
23-bob, bir vaqtdalik.)
java.util.function va
java.util.stream

Ushbu paketlar Java bilan ishlash uchun sinflar va interfeyslarni o'z ichiga oladi


SE 8 ning funktsional dasturlash imkoniyatlari. (Qarang: 17-bob, Java SE 8
Lambdalar va oqimlar.)

http://docs.oracle.com/javase/7/docs/api/overview-summary.html


http://download.java.net/jdk8/docs/api/overview-summary.html

http://docs.oracle.com/javase/7/docs/api/

Paket tavsifi

6.5-rasm | Java API paketlari (quyi to'plam). (2-qismning 2-qismi.)


214 6-bob Usullar: Chuqurroq qarash

Bunday muammolarni oldini olish uchun deterministik bo'lmagan tasodifiy sonlarni ishlab chiqarish uchun tasodifiy sinf
lems. Shu nuqtadan boshlab, matnda "tasodifiy raqamlar" deganda biz nazarda tutamiz
"Tasodifiy raqamlarni himoya qilish."
SecureRandom obyektini yaratish
Yangi xavfsiz tasodifiy sonlar generatori obyekti quyidagicha yaratilishi mumkin:

Keyinchalik u tasodifiy qiymatlarni yaratish uchun ishlatilishi mumkin - biz bu erda faqat tasodifiy int qiymatlarini muhokama qilamiz.


SecureRandom sinfi haqida qo'shimcha ma'lumot olish uchun docs.oracle.com/javase/7/docs/ ga qarang.
api/java/security/SecureRandom.html.
Tasodifiy int qiymatini olish
Quyidagi bayonotni ko'rib chiqing:

SecureRandom usuli nextInt tasodifiy int qiymatini hosil qiladi. Agar u haqiqatan ham qiymatlarni ishlab chiqarsa


tasodifiy, keyin diapazondagi har bir qiymat teng imkoniyatga (yoki ehtimollikka) ega bo'lishi kerak
KeyingiInt har safar chaqirilganda tanlanadi.
NextInt tomonidan ishlab chiqarilgan qiymatlar oralig'ini o'zgartirish
NextInt usuli boʻyicha ishlab chiqarilgan qiymatlar diapazoni odatda qiymatlar oraligʻidan farq qiladi.
ma'lum bir Java ilovasida talab qilinadi. Masalan, tangani simulyatsiya qiladigan dastur
otish uchun "boshlar" uchun faqat 0 va "dumlar" uchun 1 kerak bo'lishi mumkin. Simulyatsiya qiluvchi dastur
Olti qirrali matritsani aylantirish uchun 1-6 oralig'ida tasodifiy butun sonlar kerak bo'lishi mumkin. Bunday dastur
bo'ylab uchib o'tadigan kosmik kemaning keyingi turini (to'rtta imkoniyatdan) tasodifiy bashorat qiladi
video o'yindagi ufq 1–4 oralig'ida tasodifiy butun sonlarni talab qilishi mumkin. Kabi holatlar uchun
bular, SecureRandom klassi keyingiInt usulining yana bir versiyasini taqdim etadi, u an
int argumenti va 0 dan argument qiymatini o'z ichiga olmaydi, lekin qiymatni qaytaradi.
Masalan, tanga otish uchun quyidagi bayonot 0 yoki 1 ni qaytaradi.

Olti qirrali matritsani aylantirish


Tasodifiy raqamlarni ko'rsatish uchun keling, oltitadan 20 ta rulonni taqlid qiluvchi dastur ishlab chiqaylik.
qirrali qolip va har bir rulonning qiymatini ko'rsatadi. Biz ran-ni ishlab chiqarish uchun nextInt dan foydalanishni boshlaymiz.
dom qiymatlari 0–5 oralig'ida, quyidagicha:

6-argument - masshtablash omili deb ataladi - noyob qiymatlar sonini ifodalaydi


nextInt ishlab chiqarishi kerak (bu holda oltita - 0, 1, 2, 3, 4 va 5). Ushbu manipulyatsiya deyiladi
SecureRandom keyingiInt usuli bilan ishlab chiqarilgan qiymatlar oralig'ini masshtablash.
Olti qirrali matritsaning yuzlarida 0-5 emas, 1-6 raqamlari bor. Shunday qilib, biz diapazonni o'zgartiramiz
Bizning oldingi natijamizga o'zgaruvchan qiymatni qo'shish orqali hosil qilingan raqamlar - bu holda 1

O'zgaruvchan qiymat (1) tasodifiy butun sonlarning kerakli diapazonidagi birinchi qiymatni belgilaydi. The


oldingi bayonot 1-6 oralig'ida tasodifiy butun sonni tayinlaydi.

SecureRandom randomNumbers = yangi SecureRandom();

int randomValue = randomNumbers.nextInt();

int randomValue = randomNumbers.nextInt(2);

int face = randomNumbers.nextInt(6);

int face = 1 + randomNumbers.nextInt(6);


6.9 Vaziyatni o'rganish: Xavfsiz tasodifiy raqamlarni yaratish 215

Olti qirrali matritsani 20 marta aylantirish
6.6-rasmda oldingi hisob-kitoblarning natijalarini tasdiqlovchi ikkita namunaviy chiqish ko'rsatilgan.
hisoblash 1–6 oralig'idagi butun sonlar bo'lib, dasturning har bir ishga tushirilishi a hosil qilishi mumkin
tasodifiy sonlarning turli ketma-ketligi. 3-qator SecureRandom sinfini import qiladi
java.xavfsizlik paketi. 10-qatorda SecureRandom obyekti randomNumbers-ni yaratadi.
tasodifiy qiymatlarni o'zgartirish. 16-qator matritsani aylantirish uchun pastadirda 20 marta bajariladi. if bayonoti
(21–22-qatorlar) tsikldagi har beshta raqamdan keyin chiqishning yangi qatorini yaratish uchun boshlanadi.
toza, besh ustunli format.

Olti tomonli matritsani 6 000 000 marta aylantirish


NextInt tomonidan ishlab chiqarilgan raqamlar taxminan bir xil ehtimollik bilan sodir bo'lishini ko'rsatish uchun
kaput, keling, 6.7-rasmdagi dastur yordamida 6 000 000 ta o'lim matritsasini simulyatsiya qilaylik. Har bir butun son
1 dan 6 gacha taxminan 1 000 000 marta paydo bo'lishi kerak.

1 // 6.6-rasm: RandomIntegers.java


2 // Shiftlangan va masshtabli tasodifiy butun sonlar.
3
4
5 ta umumiy sinf RandomIntegers
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12 // 20 marta aylanish
13 uchun (int counter = 1; counter <= 20; counter++)
14 {
15 // 1 dan 6 gacha tasodifiy butun sonni tanlang
16 int face = 1 + randomNumbers.nextInt(6);
17
18 System.out.printf("%d ", yuz); // yaratilgan qiymatni ko'rsatish
19
20 // agar hisoblagich 5 ga bo'linadigan bo'lsa, chiqishning yangi qatorini boshlang
21 agar (hisoblagich % 5 == 0)
22 System.out.println();
23 }
24 }
25 } // end sinfi RandomIntegers

1 5 3 6 2


5 2 6 5 2
4 4 4 2 6
3 1 6 2 2

6 5 4 2 6


1 2 5 1 3
6 3 2 2 1
6 4 2 6 4

6.6-rasm | Shiftlangan va masshtabli tasodifiy butun sonlar.

import java.security.SecureRandom; // dastur SecureRandom sinfidan foydalanadi

// randomNumbers obyekti xavfsiz tasodifiy sonlarni ishlab chiqaradi


SecureRandom randomNumbers = yangi SecureRandom();

216 6-bob Usullar: Chuqurroq qarash

1 // 6.7-rasm: RollDie.java
2 // Olti qirrali qolipni 6 000 000 marta aylantiring.
3 import java.security.SecureRandom;
4
5 ommaviy sinf RollDie
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // randomNumbers obyekti xavfsiz tasodifiy sonlarni ishlab chiqaradi
10 SecureRandom randomNumbers = yangi SecureRandom();
11
12 int chastota1 = 0; // 1s soni
13 int chastotasi2 = 0; // qaytarilgan 2 soniyalar soni
14 int chastotasi3 = 0; // 3s soni
15 int chastotasi4 = 0; // aylantirilgan 4s soni
16 int chastota5 = 0; // aylantirilgan 5 soniyalar soni
17 int chastotasi6 = 0; // 6s soni
18
19 // 6 000 000 rulonli o'lim uchun hisob
20 uchun (int roll = 1; roll <= 6000000; roll++)
21 {
22
23
24 // qaysi hisoblagichni oshirish kerakligini aniqlash uchun 1-6 nominal qiymatidan foydalaning
25 kalit ( )
26 {
27 1-holat:
28 ++chastota1; // 1s hisoblagichini oshiring
29 tanaffus;
30 2-holat:
31 ++chastota2; // 2s hisoblagichini oshiring
32 tanaffus;
33 3-holat:
34 ++chastota3; // 3s hisoblagichini oshiring
35 tanaffus;
36 4-holat:
37 ++chastota4; // 4s hisoblagichini oshiring
38 tanaffus;
39 5-holat:
40 ++chastota5; // 5s hisoblagichini oshiring
41 tanaffus;
42 6-holat:
43 ++chastota6; // 6s hisoblagichini oshiring
44 tanaffus;
45 }
46 }
47
48 System.out.println("Yuz\tFrequency"); // chiqish sarlavhalari
49 System.out.printf("1\t%d%n2\t%d%n3\t%d%n4\t%d%n5\t%d%n6\t%d%n",
50 chastota1, chastota2, chastota3, chastota4,
51 chastota5, chastota6);
52 }
53 } // oxirgi sinf RollDie

6.7-rasm | Olti qirrali matritsani 6 000 000 marta aylantiring. (2-qismning 1-qismi.)

int face = 1 + randomNumbers.nextInt(6); // 1 dan 6 gacha raqamlar

yuz

6.9 Case Study: Xavfsiz tasodifiy raqamlarni yaratish 217

Namuna natijalari ko'rsatganidek, nextInt tomonidan ishlab chiqarilgan qiymatlarni masshtablash va o'zgartirish


dasturga olti qirrali matritsani taqlid qilish imkonini beradi. Ilova ichki o'rnatilgan boshqaruvdan foydalanadi
har bir tomonning sonini aniqlash uchun bayonotlar (kalit for ichiga joylashtirilgan).
o'lim paydo bo'ladi. For bayonoti (20–46-qatorlar) 6 000 000 marta takrorlanadi. Har biri davomida
iteratsiya, 22-satr 1 dan 6 gacha tasodifiy qiymat hosil qiladi. Keyin bu qiymat shart sifatida ishlatiladi.
switch bayonotining trolling ifodasi (25-satr) (25-45-qatorlar). Nominal qiymatiga asoslanib,
switch bayonoti har bir iteratsiya paytida oltita hisoblagich o'zgaruvchidan birini oshiradi
halqa. Ushbu switch iborasida standart holat yo'q, chunki bizda har bir holat uchun holat mavjud.
22-satrdagi ifoda ishlab chiqishi mumkin bo'lgan sible o'lim qiymati. Dasturni ishga tushiring va kuzating
natijalar. Ko'rib turganingizdek, ushbu dasturni har safar ishga tushirganingizda, u turli natijalar beradi.
7-bobda massivlarni o‘rganganimizda, biz butunni almashtirishning oqlangan usulini ko‘rsatamiz
ushbu dasturda bitta bayonot bilan switch operatori. Keyin, biz Java SE ni o'rganganimizda
8-ning yangi funktsional dasturlash imkoniyatlarini 17-bobda biz qanday almashtirishni ko'rsatamiz
zarlarni aylantiruvchi halqa, switch bayonoti va natijalarni aks ettiruvchi bayonot
bitta bayonot bilan!
Tasodifiy sonlarni umumlashtirilgan masshtablash va siljitish
Ilgari biz bayonot bilan olti qirrali matritsaning aylanishini simulyatsiya qildik

Ushbu bayonot har doim yuz o'zgaruvchisiga 1 ≤ face ≤ 6 oralig'ida butun sonni belgilaydi.


bu diapazonning kengligi (ya'ni, diapazondagi ketma-ket butun sonlar soni) 6 ga teng va boshlang'ich-
diapazondagi raqam 1 ga teng. Oldingi bayonotda diapazonning kengligi hal qiluvchi-
SecureRandom keyingiInt usuliga argument sifatida berilgan 6 raqami bilan qazib olinadi,
va diapazonning boshlang'ich raqami randomNumbers.nex-ga qo'shilgan 1 raqamidir.
tInt(6). Bu natijani quyidagicha umumlashtirishimiz mumkin

bu erda shiftingValue kerakli ketma-ket butun sonlar oralig'idagi birinchi raqamni belgilaydi


va scalingFactor diapazonda nechta raqam borligini belgilaydi.

Yuz chastotasi


1 999501
2 1000412
3 998262
4 1000820
5 1002245
6 998760

Yuz chastotasi


1 999647
2 999557
3 999571
4 1000376
5 1000701
6 1000148

int face = 1 + randomNumbers.nextInt(6);

int raqami = shiftingValue + randomNumbers.nextInt(scalingFactor);

6.7-rasm | Olti qirrali matritsani 6 000 000 marta aylantiring. (2-qismning 2-qismi.)


218 6-bob Usullar: Chuqurroq qarash

Bundan tashqari, diapazonlardan tashqari qiymatlar to'plamidan tasodifiy butun sonlarni tanlash mumkin
ketma-ket butun sonlar. Masalan, 2, 5, 8, 11 ketma-ketligidan tasodifiy qiymat olish uchun
va 14, siz bayonotdan foydalanishingiz mumkin

Bu holda randomNumbers.nextInt(5) 0–4 oralig'ida qiymatlarni ishlab chiqaradi. Har bir qiymat


0, 3, 6, 9 va 12 ketma-ketligidagi son hosil qilish uchun ishlab chiqarilgan 3 ga ko'paytiriladi.
qiymatlar diapazonini siljitish va 2, 5 qatoridan qiymat olish uchun ushbu qiymatga 2 qo'shing,
8, 11 va 14. Bu natijani quyidagicha umumlashtirishimiz mumkin

bu erda shiftingValue kerakli qiymatlar oralig'idagi birinchi raqamni belgilaydi, farq-


BetweenValues qatordagi ketma-ket raqamlar orasidagi doimiy farqni ifodalaydi.
quence va scalingFactor diapazonda qancha raqam borligini belgilaydi.
Ishlash haqida eslatma
Yuqori darajadagi xavfsizlikka erishish uchun Random o'rniga SecureRandom-dan foydalanish muhim ahamiyatga ega.
ijro uchun jarima. "Tasodifiy" ilovalar uchun siz Random sinfidan foydalanishingiz mumkin
java.util paketidan — SecureRandom ni Random bilan almashtiring.
6.10 Case Study: Imkoniyatlar o'yini; Enum bilan tanishtirish
Turlari
A mashhur tasodif o'yin craps deb nomlanuvchi bir zar o'yin, qaysi kazino o'ynadi va
butun dunyo bo'ylab orqa xiyobonlar. O'yin qoidalari juda oddiy:
Siz ikkita zar tashlaysiz. Har bir o'lim oltita yuzga ega bo'lib, ularda bir, ikki, uch, to'rt, besh va
mos ravishda oltita nuqta. Zarlar dam olgandan so'ng, ikkalasidagi dog'lar yig'indisi
yuqoriga qaragan yuzlar hisoblanadi. Agar birinchi otishda yig'indi 7 yoki 11 bo'lsa, siz g'alaba qozonasiz. Agar summa
birinchi otishda 2, 3 yoki 12 ("craps" deb ataladi), siz yo'qotasiz (ya'ni, "uy" g'alaba qozonadi). Agar
birinchi otishda yig'indi 4, 5, 6, 8, 9 yoki 10 bo'lsa, bu summa sizning "nuqta" ga aylanadi. G'alaba qozonish uchun,
Siz "o'z fikringizni bildirmaguningizcha" zarlarni tashlashni davom ettirishingiz kerak (ya'ni, xuddi shunday
nuqta qiymati). Siz o'z fikringizni bildirishdan oldin 7 ballni yo'qotasiz.
Shakl 6.8 o'yin mantiqini amalga oshirish usullaridan foydalangan holda craps o'yinini simulyatsiya qiladi. The
asosiy usul (21-65-qatorlar) rollDice usulini (68-81-qatorlar) aylantirish uchun kerak bo'lganda chaqiradi.
zarlar va ularning summasini hisoblang. Namuna natijalari birinchi bo'lib g'alaba va mag'lubiyatni ko'rsatadi
rulon, va g'alaba qozonish va keyingi rulonni yo'qotish.

int raqami = 2 + 3 * randomNumbers.nextInt(5);

int raqami = shiftingValue +
FarqO'rtasidagi qiymatlar * randomNumbers.nextInt(scalingFactor);

1 // 6.8-rasm: Craps.java


2 // Craps sinf zar o'yini craps simüle.
3 import java.security.SecureRandom;
4
5 davlat sinf Craps
6 {
7 // rollDice usulida foydalanish uchun xavfsiz tasodifiy sonlar generatorini yarating
8 ta xususiy statik yakuniy SecureRandom randomNumbers = yangi SecureRandom();

6.8-rasm | Craps sinf zar o'yini craps simüle. (3-qismning 1-qismi.)


6.10 Case Study: Imkoniyatlar o'yini; Enum turlari bilan tanishtirish 219

9
10
11
12
13 // zarlarning umumiy o'ramlarini ifodalovchi konstantalar
14
15
16
17
18
19
20 // craps bir o'yin o'ynaydi
21 ta umumiy statik bekor asosiy(String[] args)
22 {
23 int myPoint = 0; // birinchi rollda g'alaba yoki mag'lubiyat bo'lmasa, ball
24
25
26
27
28 // birinchi roll asosida o'yin holati va nuqtani aniqlang
29 kalit (sumOfDice)
30 {
31
32
33
34 tanaffus;
35
36
37
38
39 tanaffus;
40
41
42
43 System.out.printf("Nuqta %d%n", myPoint);
44 tanaffus;
45 }
46
47 // o'yin tugallanmagan bo'lsa
48 while ( ) // G'olib yoki yutqazmagan
49 {
50
51
52 // o'yin holatini aniqlash
53 if (sumOfDice == myPoint) // nuqta qo'yib g'alaba qozoning
54;
yana 55
56 if (sumOfDice == SEVEN) // nuqtadan oldin 7 marta aylanib, yutqazamiz
57
58 }
59

6.8-rasm | Craps sinf zar o'yini craps simüle. (3 qismning 2-qismi.)

// o'yin holatini ifodalovchi doimiylar bilan enum turi
xususiy enum Holati {DAVOM ETILGAN, yutildi, yutqazildi};

xususiy statik yakuniy int SNAKE_EYES = 2;


xususiy statik yakuniy int TREY = 3;
xususiy statik final int SEVEN = 7;
xususiy statik final int YO_LEVEN = 11;
xususiy statik final int BOX_CARS = 12;

O'yin holati holati; // Davom etish, yutqazish yoki yutqazish bo'lishi mumkin

int sumOfDice = rollDice(); // zarning birinchi tashlanishi

SEVEN hodisasi: // birinchi rollda 7 bilan g'alaba qozonish


Case YO_LEVEN: // birinchi rollda 11 bilan g'alaba qozonish
gameStatus = Status.WON;

case SNAKE_EYES: // birinchi rollda 2 bilan yutqazadi


case TREY: // birinchi rollda 3 bilan yo'qotish
case BOX_CARS: // birinchi rollda 12 bilan yutqazadi
gameStatus = Status.LOST;

sukut bo'yicha: // g'alaba qozonmadi yoki yutqazmadi, shuning uchun nuqtani eslang


gameStatus = Status.CONTINUE; // o'yin tugamadi
myPoint = sumOfDice; // nuqtani eslab qoling

gameStatus == Status. DAVOM ET

sumOfDice = rollDice(); // zarlarni yana ag'daring

gameStatus = Status.WON

gameStatus = Status.LOST;

220 6-bob Usullar: Chuqurroq qarash

rollDice usuli
O'yin qoidalariga ko'ra, o'yinchi birinchi va keyingi barcha rulonlarda ikkita zarni tashlashi kerak.
Biz zarlarni tashlash va ularni hisoblash va chop etish uchun rollDice usulini e'lon qilamiz (68-81-qatorlar).
so'm. RollDice usuli bir marta e'lon qilinadi, lekin u ikki joydan chaqiriladi (26 va 50-qatorlar)
asosiy, qaysi craps bir to'liq o'yin uchun mantiq o'z ichiga oladi. Usul rollDice oladi

60 // yutgan yoki yo'qolgan xabarni ko'rsatish


61 agar ( )
62 System.out.println("O'yinchi g'alaba qozonadi");
yana 63
64 System.out.println("O'yinchi yutqazadi");
65 }
66
67 // zarlarni aylantiring, summani hisoblang va natijalarni ko'rsating
68
69 {
70 // tasodifiy o'lim qiymatlarini tanlang
71 int die1 = 1 + randomNumbers.nextInt(6); // birinchi o'lim rulosi
72 int die2 = 1 + randomNumbers.nextInt(6); // ikkinchi rulon
73
74 int summa = die1 + die2; // o'lim qiymatlari yig'indisi
75
76 // ushbu rolik natijalarini ko'rsatish
77 System.out.printf("O'yinchi %d + %d = %d%n o'ynadi",
78 o'lim1, o'lim2, yig'indisi);
79
80
81 }
82 } // end sinf Craps

O'yinchi 5 + 6 = 11 ga aylantirildi


O'yinchi g'alaba qozonadi

O'yinchi 5 + 4 = 9 o'girildi


Nuqta 9
O'yinchi 4 + 2 = 6 ga aylantirdi
O'yinchi 3 + 6 = 9 ga aylantirdi
O'yinchi g'alaba qozonadi

O'yinchi 1 + 2 = 3 aylantirdi


O'yinchi yutqazadi

O'yinchi 2 + 6 = 8 ga aylantirdi


Nuqta 8
O'yinchi 5 + 1 = 6 ga aylantirdi
O'yinchi 2 + 1 = 3 ga aylantirdi
O'yinchi 1 + 6 = 7 ga aylantirdi
O'yinchi yutqazadi

6.8-rasm | Craps sinf zar o'yini craps simüle. (3 qismning 3-qismi.)

gameStatus == Status.WON

umumiy statik int rollDice()

qaytarish summasi;

6.10 Case Study: Imkoniyatlar o'yini; Enum turlari bilan tanishtirish 221

argumentlar yo'q, shuning uchun u bo'sh parametrlar ro'yxatiga ega. Har safar chaqirilganda, rollDice qaytadi
zarlarning yig'indisi, shuning uchun qaytarish turi int usuli sarlavhasida ko'rsatilgan (68-satr).
71 va 72 qatorlar bir xil ko'rinishga ega bo'lsa-da (qo'l nomlaridan tashqari), ular shart emas.
bir xil natija beradi. Ushbu bayonotlarning har biri 1– oralig'ida tasodifiy qiymat hosil qiladi.
6. O'zgaruvchan randomNumbers (71-72 qatorlarda qo'llaniladi) usulda e'lon qilinmagan. Buning o'rniga u
sinfning shaxsiy statik yakuniy o'zgaruvchisi sifatida e'lon qilingan va 8-satrda ishga tushirilgan.
rollDice uchun har bir chaqiruvda qayta ishlatiladigan bitta SecureRandom obyektini yaratishga imkon beradi. Agar bor bo'lsa
sinf Craps bir necha misollarni o'z ichiga olgan dastur edi, Ular barcha bu bir baham edim
SecureRandom obyekti.
Asosiy usulning mahalliy o'zgaruvchilari
O'yin oqilona ishtirok etadi. O'yinchi birinchi ruloda g'alaba qozonishi yoki yutqazishi yoki g'alaba qozonishi mumkin
yoki har qanday keyingi rulonni yo'qotish. Asosiy usul (21-65-qatorlar) myPoint mahalliy o'zgaruvchisidan foydalanadi (satr
23) agar o'yinchi birinchi o'yinda g'alaba qozonmasa yoki yutmasa, "nuqta" ni saqlash uchun, mahalliy o'zgaruvchi
GameStatus (24-qator) umumiy oʻyin holatini va mahalliy oʻzgaruvchi sumOfDiceni kuzatib borish uchun
(26-qator) so'nggi otish uchun zarlar yig'indisini ushlab turish. myPoint o'zgaruvchisi ishga tushirildi
Ilova kompilyatsiya qilinishini ta'minlash uchun 0 ga. Agar siz myPoint-ni ishga tushirmasangiz, com-
piler xatoga yo'l qo'yadi, chunki myPoint-ga kalitning har bir holatida qiymat belgilanmagan
bayonoti va shuning uchun dastur qiymat tayinlanishidan oldin myPoint dan foydalanishga harakat qilishi mumkin. tomonidan
farqli o'laroq, gameStatus-ga switch bayonotining har bir holatida qiymat beriladi (shu jumladan
standart holat) - shuning uchun uni ishlatishdan oldin ishga tushirish kafolatlanadi, shuning uchun biz buni qilmaymiz
uni 24-qatorda ishga tushirish kerak.
enum Turi holati
Mahalliy o'zgaruvchi gameStatus (24-qator) Status deb nomlangan yangi turdagi deb e'lon qilindi (e'lon qilingan).
11-qatorda). Turi Status sinf Craps xususiy a'zosi, Status ishlatiladi, chunki
faqat shu sinfda. Status - bu enum tipi deb ataladigan tur bo'lib, u eng oddiy shaklda e'lon qiladi
identifikatorlar bilan ifodalangan doimiylar to'plami. Enum turi - bu sinfning maxsus turi
enum kalit so'zi va tur nomi (bu holda Status) bilan kiritilgan. Sinflarda bo'lgani kabi,
qavslar enum deklaratsiyasining tanasini chegaralaydi. Qavslar ichida vergul bilan ajratilgan ro'yxat mavjud
har biri noyob qiymatni ifodalovchi enum konstantalari. Enumdagi identifikatorlar bo'lishi kerak
noyob. Enum turlari haqida ko'proq ma'lumotni 8-bobda bilib olasiz.

Status tipidagi o'zgaruvchilarga faqat raqamda e'lon qilingan uchta konstanta tayinlanishi mumkin


(11-satr) yoki kompilyatsiya xatosi yuzaga keladi. O'yin g'olib bo'lgach, dastur mahalliy o'rnatadi
o'zgaruvchan gameStatus to Status.WON (33 va 54-qatorlar). O'yin yo'qolganda, dastur
mahalliy o'zgaruvchi gameStatusni Status.LOST ga o'rnatadi (38 va 57-qatorlar). Aks holda, dastur
mahalliy oʻzgaruvchi gameStatusni Status.CONTINUE (41-qator) ga oʻrnatib, oʻyinni koʻrsatadi.
tugamaydi va zarlarni qaytadan tashlash kerak.

Yaxshi dasturlash amaliyoti 6.1


Enum konstantalari nomlarida faqat katta harflardan foydalaning, ularni alohida ajratib ko'rsatish va qayta ko'rsatish uchun.
ular o'zgaruvchan emasligini yodda tuting.

Yaxshi dasturlash amaliyoti 6.2


Enum konstantalaridan foydalanish (masalan, Status.WON, Status.LOST va Status.CONTINUE)
literal qiymatlardan (masalan, 0, 1 va 2) dasturlarni o'qish va saqlashni osonlashtiradi.

222 6-bob Usullar: Chuqurroq qarash

Asosiy usulning mantiqiyligi
1 dan 6 gacha bo'lgan ikkita tasodifiy qiymatni tanlaydigan rollDice asosiy qo'ng'iroqlaridagi 26-qatorda
birinchi o'lim, ikkinchi o'lim va ularning yig'indisi qiymatlari va yig'indini qaytaradi. Asosiy usul
keyingi satrdan sumOfDice qiymatidan foydalanadigan switch operatori (29–45-qatorlar) kiradi
26 o'yin g'alaba qozongan yoki mag'lubiyatga uchraganligini yoki boshqasi bilan davom etishi kerakligini aniqlash uchun
rulon. Birinchi ro'yxatda g'alaba yoki mag'lubiyatga olib keladigan qiymatlar shaxsiy statik deb e'lon qilinadi
14–18-qatorlardagi yakuniy int konstantalari. Identifikator nomlari bular uchun kazino tilidan foydalanadi
so'm. Bu konstantalar, enum konstantalari kabi, konventsiya bilan barcha bosh harflar bilan e'lon qilinadi.
ters, ularni dasturda ajralib turishi uchun. 31-34 qatorlar o'yinchi yoki yo'qligini aniqlaydi
SEVEN (7) yoki YO_LEVEN (11) bilan birinchi rolda g'alaba qozondi. 35–39 qatorlar
o'yinchi SNAKE_EYES (2), TREY (3) yoki BOX_CARS (12) bilan birinchi aylanishda yutqazdi. Birinchisidan keyin
Agar o'yin tugamagan bo'lsa, standart holat (40–44-qatorlar) gameStatus-ni Sta-ga o'rnatadi.
tus.CONTINUE, myPoint-da sumOfDice-ni saqlaydi va nuqtani ko'rsatadi.
Agar biz hali ham "o'z fikrimizni bildirishga" harakat qilsak (ya'ni, o'yin oldingi bosqichdan davom etmoqda),
48-58 qatorlar bajariladi. 50-qator zarlarni yana tashlaydi. Agar sumOfDice myPoint (53-qator) mos kelsa,
54-satr gameStatus-ni Status.WON-ga o'rnatadi, keyin tsikl tugaydi, chunki o'yin aralash
to'liq. Agar sumOfDice YETTI bo'lsa (56-qator), 57-qator gameStatusni Status.LOST ga o'rnatadi va
Loop tugaydi, chunki o'yin tugallangan. O'yin tugagach, 61-64 qatorlar o'chiriladi.
o'yinchi g'alaba qozongan yoki yutqazganligini ko'rsatadigan xabarni o'ynang va dastur tugaydi.
Dastur biz muhokama qilgan turli xil dastur boshqaruv mexanizmlaridan foydalanadi. The
Craps klassi ikkita usuldan foydalanadi - asosiy va rollDice (asosiydan ikki marta chaqiriladi) va
switch, while, if…else va ichki joylashtirilgan if boshqaruv iboralari. Ko'pdan foydalanishga ham e'tibor bering
SEVEN va yig'indilari uchun bir xil operatorlarni bajarish uchun switch operatoridagi case yorliqlari
YO_LEVEN (31–32-qatorlar) va SNAKE_EYES, TREY va BOX_CARS (35–37-qatorlar) summalari uchun.

Nima uchun ba'zi doimiylar enum konstantalari sifatida aniqlanmagan


Nega biz zar yig'indisini shaxsiy statik final deb e'lon qilganimizga hayron bo'lishingiz mumkin
enum konstantalari sifatida emas, balki int doimiylari. Sababi, dasturni solishtirish kerak
sumOfDice int o'zgaruvchisi (26-satr) har birining natijasini aniqlash uchun ushbu konstantalarga
rulon. Faraz qilaylik, biz konstantalarni o'z ichiga olgan yig'indini e'lon qildik (masalan, Sum.SNAKE_EYES)
O'yinda foydalanilgan besh so'mni kiriting, so'ngra bu konstantalarni switch bayonotida ishlating (chiziqlar
29–45). Shunday qilish bizni sumOfDice dan switch iborasi sifatida foydalanishimizga to'sqinlik qiladi.
trolling ifodasi, chunki Java intni enum doimiysi bilan solishtirishga ruxsat bermaydi.
Joriy dastur bilan bir xil funktsiyaga erishish uchun biz o'zgaruvchidan foydalanishimiz kerak
switchning boshqaruv ifodasi sifatida Sum turidagi joriy summa. Afsuski, Java shunday qiladi
int qiymatini ma'lum bir enum konstantasiga aylantirishning oson usulini ta'minlamaydi. Bu mumkin
alohida almashtirish bayonoti bilan amalga oshiriladi. Bu mashaqqatli bo'lar edi va bu qiyin bo'lmaydi
dasturning o'qilishi mumkinligini isbotlash (shunday qilib enumdan foydalanish maqsadini yo'q qilish).

6.11 Deklaratsiyalar doirasi


Siz turli xil Java ob'ektlari deklaratsiyasini ko'rdingiz, masalan, sinflar, usullar, o'zgaruvchilar va pa-
rametrlar. Deklaratsiyalar bunday Java ob'ektlariga murojaat qilish uchun ishlatilishi mumkin bo'lgan nomlarni kiritadi. The
deklaratsiya doirasi - dasturning e'lon qilingan shaxsga murojaat qilishi mumkin bo'lgan qismi.
uning nomi. Bunday ob'ekt dasturning ushbu qismi uchun "ko'lamda" deb aytiladi. Bu sek-
bir qancha muhim ko'lamli masalalarni taqdim etadi.

6.11 Deklaratsiyalar doirasi 223

Qo'llash sohasining asosiy qoidalari quyidagilardan iborat:
1. Parametr deklaratsiyasining doirasi deklaratsiya qilinadigan usulning asosiy qismidir.
laratsiya paydo bo'ladi.
2. Mahalliy o'zgaruvchi deklaratsiyasining doirasi deklaratsiya qilingan nuqtadan boshlab.
tion ushbu blokning oxirida paydo bo'ladi.
3. Initsializatsiya bo'limida paydo bo'ladigan mahalliy o'zgaruvchan deklaratsiya doirasi
for bayonotining sarlavhasi for bayonotining tanasi va boshqa ifodasidir.
sarlavhadagi sionlar.
4. Usul yoki sohaning qamrovi sinfning butun tanasidir. Bu sinfga kirishga imkon beradi
maydonlarni va sinfning boshqa usullarini qo'llash uchun pozitsiya usullari.
Har qanday blokda o'zgaruvchan deklaratsiyalar bo'lishi mumkin. Agar mahalliy o'zgaruvchi yoki parametr a
Usul sinf maydoni bilan bir xil nomga ega, maydon blok tugaguniga qadar yashirin bo'ladi.
ijroni ta'minlaydi - bu soyalanish deb ataladi. Blokdagi soyali maydonga kirish uchun:
• Agar maydon misol o'zgaruvchisi bo'lsa, uning nomidan oldin this kalit so'zi va a bilan yozing
nuqta (.), bu kabi.x.
• Agar maydon statik sinf o'zgaruvchisi bo'lsa, uning nomidan oldin sinf nomini va yozing
nuqta (.), ClassName.x da bo'lgani kabi.
6.9-rasmda maydonlar va mahalliy o'zgaruvchilar bilan bog'liq muammolar ko'rsatilgan. 7-qator e'lon qiladi
va x maydonini 1 ga ishga tushiradi. Bu maydon e'lon qiladigan har qanday blokda (yoki usulda) soyalanadi.
x nomli mahalliy o'zgaruvchi. Asosiy usul (11-23-qatorlar) x mahalliy o'zgaruvchini e'lon qiladi (13-qator)
va uni 5 ga ishga tushiradi. Bu mahalliy o'zgaruvchining qiymati x maydoni (kimning) ekanligini ko'rsatish uchun chiqariladi.
qiymat 1) asosiyda soyalanadi. Dastur yana ikkita usulni e'lon qiladi - useLocalVa-
riable (26-35-qatorlar) va useField (38-45-qatorlar) - har birida argument va dalillar yo'q
natijalar qaytarilmaydi. Asosiy usul har bir usulni ikki marta chaqiradi (17-20-qatorlar). Mahalliy foydalanish usuli -
O'zgaruvchi mahalliy x o'zgaruvchini e'lon qiladi (28-satr). useLocalVariable birinchi marta chaqirilganda (line
17), u mahalliy x o'zgaruvchisini yaratadi va uni 25 ga (28-satr) ishga tushiradi, x qiymatini chiqaradi (satrlar).
30–31), x (32-satr) oshiradi va x qiymatini yana chiqaradi (33–34-qatorlar). Qachon
uselLocalVariable ikkinchi marta chaqiriladi (19-qator), u mahalliy x o'zgaruvchisini qayta yaratadi va qayta tiklaydi.
uni 25 ga italizatsiya qiladi, shuning uchun har bir useLocalVariable chaqiruvining chiqishi bir xil bo'ladi.

1 // 6.9-rasm: Scope.java


2 // Scope klassi maydon va mahalliy o'zgaruvchilar doiralarini namoyish etadi.
3
4 ommaviy sinf Qo'llash doirasi
5 {
6
7
8
9 // main usuli mahalliy x o'zgaruvchisini yaratadi va ishga tushiradi
10 // va useLocalVariable va useField usullarini chaqiradi
11 ta umumiy statik bekor asosiy(String[] args)
12 {
13
14

6.9-rasm | Scope klassi maydon va mahalliy o'zgaruvchan doiralarni ko'rsatadi. (2-qismning 1-qismi.)

// ushbu sinfning barcha usullari uchun ochiq bo'lgan maydon
xususiy statik int x = 1;

int x = 5; // usulning mahalliy o'zgaruvchisi x soyalar maydoni x


224 6-bob Usullar: Chuqurroq qarash

Method useField hech qanday mahalliy o'zgaruvchilarni e'lon qilmaydi. Shuning uchun, u x ga ishora qilganda,
sinfning x maydoni (7-qator) ishlatiladi. UseField usuli birinchi marta chaqirilganda (18-qator), u tashqariga chiqadi-
x maydonining qiymatini (1) qo'yadi (40–41-qatorlar), x maydonini 10 ga (42-satr) ko'paytiradi va chiqadi

15 System.out.printf("mahalliy x - %d%n", x);


16
17 useLocalVariable(); // useLocalVariableda mahalliy x mavjud
18 useField(); // useField Scope sinfining x maydonidan foydalanadi
19 useLocalVariable(); // useLocalVariable mahalliy x-ni qayta ishga tushiradi
20 useField(); // sinf Scope ning x maydoni o'z qiymatini saqlab qoladi
21
22 System.out.printf("asosiy %nlocal x - %d%n", x);
23 }
24
25 // har bir qo'ng'iroq paytida mahalliy x o'zgaruvchisini yarating va ishga tushiring
26 umumiy statik bekor foydalanishLocalVariable()
27 {
28
29
30 System.out.printf(
31 "%nlocal x useLocalVariable usulini kiritishda %d%n", x);
32
33 System.out.printf(
34 "local x useLocalVariable usulidan chiqishdan oldin %d%n", x);
35 }
36
37 // har bir qo'ng'iroq paytida Scope ning x maydonini o'zgartiring
38 umumiy statik bekor foydalanishField()
39 {
40 System.out.printf(
41 "%nfield x usulini kiritishda useField %d%n", x);
42
43 System.out.printf(
44 "usuldan chiqishdan oldin x maydoni useField is %d%n", x);
45 }
46 } // oxirgi sinf Qo'llanish doirasi

Asosiy mahalliy x 5 ga teng

useLocalVariable usulini kiritishda mahalliy x 25 ga teng
useLocalVariable usulidan chiqishdan oldin mahalliy x 26 ga teng

useField usulini kiritishda x maydoni 1 ga teng


UseField usulidan chiqishdan oldin x maydoni 10 ga teng

useLocalVariable usulini kiritishda mahalliy x 25 ga teng


useLocalVariable usulidan chiqishdan oldin mahalliy x 26 ga teng

useField usulini kiritishda x maydoni 10 ga teng


useField usulidan chiqishdan oldin x maydoni 100 ga teng

Asosiy mahalliy x 5 ga teng

6.9-rasm | Scope klassi maydon va mahalliy o'zgaruvchan doiralarni ko'rsatadi. (2-qismning 2-qismi.)

int x = 25; // useLocalVariable har safar chaqirilganda ishga tushiriladi

++x; // ushbu usulning x mahalliy o'zgaruvchisini o'zgartiradi

x *= 10; // Scope sinfining x maydonini o'zgartiradi


6.12 Usulni ortiqcha yuklash 225

qaytishdan oldin x maydonining qiymati (10) yana (43-44-qatorlar). Keyingi safar usuldan foydalanish -
Maydon chaqiriladi (20-satr), maydon o'zgartirilgan qiymatiga ega (10), shuning uchun usul 10 ni chiqaradi,
keyin 100. Nihoyat, main usulida dastur x mahalliy o'zgaruvchining qiymatini yana chiqaradi
(22-satr) usullarning hech biri o'zgartirilmagan main mahalliy o'zgaruvchisi x ni chaqirmasligini ko'rsatish uchun, chunki
usullarning barchasi boshqa sohalarda x deb nomlangan o'zgaruvchilarga tegishli.
Eng kam imtiyozlar printsipi
Umuman olganda, "narsalar" o'z ishlarini bajarish uchun zarur bo'lgan qobiliyatlarga ega bo'lishi kerak,
lekin ortiq emas. O'zgaruvchining qamrovi misol bo'la oladi. O'zgaruvchi qachon ko'rinmasligi kerak
kerak emas.

6.12 Usulning haddan tashqari yuklanishi


Xuddi shu nomdagi usullar, agar ular har xil bo'lsa, bir xil sinfda e'lon qilinishi mumkin
parametrlar to'plami (parametrlarning soni, turlari va tartibi bilan belgilanadi) - bu
usulni ortiqcha yuklash deb ataladi. Haddan tashqari yuklangan usul chaqirilganda, kompilyator tanlaydi
argumentlar soni, turlari va tartibini o'rganish orqali tegishli usul
Qo'ng'iroq. Usulni haddan tashqari yuklash odatda bir xil usullarni yaratish uchun ishlatiladi
bir xil yoki o'xshash vazifalarni bajaradigan, lekin har xil turdagi yoki har xil raqamlardagi nom
argumentlar. Masalan, matematik usullar abs, min va max (6.3-bo'limda umumlashtirilgan).
har biri to'rtta versiya bilan haddan tashqari yuklangan:
1. Ikkita juft parametrli biri.
2. Ikkita float parametrli biri.
3. Ikkita int parametrli bittasi.
4. Ikkita uzun parametrli biri.
Bizning keyingi misolimiz haddan tashqari yuklangan usullarni e'lon qilish va chaqirishni ko'rsatadi. Biz jin-
8-bobda haddan tashqari yuklangan konstruktorlar.
Haddan tashqari yuklangan usullarni e'lon qilish
Class MethodOverload (6.10-rasm) kvadrat usulning ikkita haddan tashqari yuklangan versiyasini o'z ichiga oladi—
int kvadratini hisoblaydigan (va intni qaytaradigan) va hisoblaydigan biri
dublning kvadrati (va dublni qaytaradi). Garchi bu usullar bir xil nomga ega bo'lsa-da
va shunga o'xshash parametrlar ro'yxati va jismlari, ularni oddiygina turli usullar deb hisoblang. Bo'lishi mumkin
usul nomlarini mos ravishda “int kvadrati” va “ikki barobar kvadrat” deb hisoblashga yordam beradi.

Yaxshi dasturlash amaliyoti 6.3


O'zgaruvchilarni iloji boricha birinchi ishlatilgan joyga yaqinroq e'lon qiling.

1 // 6.10-rasm: MethodOverload.java


2 // Haddan tashqari yuklangan usul deklaratsiyasi.
3
4 ommaviy sinf MethodOverload
5 {

6.10-rasm | Haddan tashqari yuklangan usul deklaratsiyasi. (2-qismning 1-qismi.)


226 6-bob Usullar: Chuqurroq qarash

9-qator 7-argument bilan usul kvadratini chaqiradi. Literal butun son qiymatlari ko'rib chiqiladi
int turi sifatida, shuning uchun 9-qatordagi usul chaqiruvi 14-19-qatorlardagi kvadrat versiyasini chaqiradi
int parametrini belgilaydi. Xuddi shunday, 10-satr argument bilan usul kvadratini chaqiradi
7.5. Literal suzuvchi nuqta qiymatlari double turi sifatida qabul qilinadi, shuning uchun usul 10-qatorda chaqiriladi
22–27-satrlarda ikki tomonlama parametrni belgilaydigan kvadrat versiyasini chaqiradi. Har biri
usul har bir holatda to'g'ri usul chaqirilganligini isbotlash uchun birinchi navbatda matn qatorini chiqaradi.
10 va 24-qatorlardagi qiymatlar %f format ko'rsatkichi bilan ko'rsatiladi. Biz aniqlamadik
har ikkala holatda ham aniqlik. Odatiy bo'lib, suzuvchi nuqta qiymatlari oltita raqam bilan ko'rsatiladi
aniqlik format spetsifikatsiyasida ko'rsatilmagan bo'lsa.
Haddan tashqari yuklangan usullarni farqlash
Kompilyator haddan tashqari yuklangan usullarni imzolari bilan ajratib turadi - ularning kombinatsiyasi
usulning nomi va uning parametrlarining soni, turlari va tartibi, lekin uning qaytish turi emas. Agar
kompilyator kompilyatsiya paytida faqat usul nomlarini ko'rib chiqdi, 6.10-rasmdagi kod
noaniq bo'ling - kompilyator ikkita kvadratni qanday ajratishni bilmaydi
usullari (14-19 va 22-27-qatorlar). Ichkarida, kompilyator uzoqroq usul nomlaridan foydalanadi
asl usul nomini, har bir parametrning turlarini va aniq tartibini o'z ichiga oladi
sinfdagi usullar shu sinfda yagona ekanligini aniqlash uchun parametrlar.

6 // haddan tashqari yuklangan kvadrat usullarini sinab ko'ring


7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 System.out.printf("7 butun sonning kvadrati %d%n", );
10 System.out.printf("Qo'shaloq 7,5 kvadrati %f%n", );
11 }
12
13 // int argumenti bilan kvadrat usuli
14
15 {
16 System.out.printf("%nInt argumenti bilan chaqirilgan kvadrat: %d%n",
17 intValue);
18 intValue * intValue ni qaytaradi;
19 }
20
21 // juft argumentli kvadrat usuli
22
23 {
24 System.out.printf("%nCalled kvadrat ikki argumentli: %f%n",
25 doubleValue);
26 doubleValue * doubleValue qaytaradi;
27 }
28 } // oxirgi sinf MethodOverload

Int argumenti bilan kvadrat chaqiriladi: 7


7 butun sonining kvadrati 49 ga teng

Ikki argumentli kvadrat chaqirildi: 7.500000


Ikki karra 7,5 kvadrati 56,250000

6.10-rasm | Haddan tashqari yuklangan usul deklaratsiyasi. (2-qismning 2-qismi.)

kvadrat(7)
kvadrat(7,5)

umumiy statik int kvadrat (int intValue)

umumiy statik ikki kvadrat (double doubleValue)

6.13 (ixtiyoriy) GUI va grafik misol: ranglar va to‘ldirilgan shakllar 227

Masalan, 6.10-rasmda kompilyator (ichki) mantiqiy nomdan foydalanishi mumkin.
int parametrini belgilaydigan kvadrat usuli uchun “int kvadrati” va “kvadrat
double" kvadrat usuli uchun double parametrni belgilaydi (haqiqiy nomlar
kompilyatordan foydalanish ancha murakkab). Agar metod1 ning deklaratsiyasi sifatida boshlansa

keyin kompilyator "int va floatning 1-usuli" mantiqiy nomidan foydalanishi mumkin. Agar parametr-


eters sifatida belgilanadi

keyin kompilyator "float va int ning 1-usuli" mantiqiy nomidan foydalanishi mumkin. ning tartibi


parametr turlari muhim - kompilyator oldingi ikkita usulni ko'rib chiqadi1
sarlavhalar alohida bo'lishi kerak.
Ortiqcha yuklangan usullarning qaytish turlari
Kompilyator tomonidan qo'llaniladigan usullarning mantiqiy nomlarini muhokama qilishda biz zikr qilmadik
usullarning qaytish turlari. Usul chaqiruvlarini faqat qaytish turi bo'yicha ajratib bo'lmaydi. Agar Siz
faqat qaytarish turlari bilan farq qiladigan haddan tashqari yuklangan usullarga ega edi va siz ulardan birini chaqirdingiz
Mustaqil bayonotdagi usullar quyidagi kabi:

kompilyator qo'ng'iroq qilish usulining versiyasini aniqlay olmaydi, chunki


Qaytish qiymati e'tiborga olinmaydi. Ikki usul bir xil imzo va turli xil qaytishga ega bo'lganda
turlari bo'lsa, kompilyator usul allaqachon aniqlanganligini ko'rsatuvchi xato xabarini chiqaradi
sinf. Agar usullar boshqacha bo'lsa, haddan tashqari yuklangan usullar turli xil qaytish turlariga ega bo'lishi mumkin
parametrlar ro'yxati. Bundan tashqari, haddan tashqari yuklangan usullar bir xil miqdordagi parametrlarga ega bo'lishi shart emas.

6.13 (ixtiyoriy) GUI va grafik misollar: Ranglar


va Toʻldirilgan shakllar
Garchi siz faqat chiziqlar va asosiy shakllar, sinf bilan ko'plab qiziqarli dizaynlarni yaratishingiz mumkin
Grafika boshqa ko'plab imkoniyatlarni taqdim etadi. Keyingi ikkita xususiyat - bu ranglar
va to'ldirilgan shakllar. Rang qo'shish foydalanuvchi kompyuter ekranida ko'radigan chizmalarni boyitadi.
Shakllar qattiq ranglar bilan to'ldirilishi mumkin.
Kompyuter ekranlarida ko'rsatiladigan ranglar qizil, yashil va ko'k ranglar bilan belgilanadi.
0 dan 255 gacha butun son qiymatlariga ega bo'lgan ponentlar (RGB qiymatlari deb ataladi). Qiymat qanchalik baland bo'lsa
komponent rangi bo'lsa, bu rangning soyasi qanchalik boy bo'ladi. Java rang sinfidan foydalanadi (paket
java.awt) RGB qiymatlari yordamida ranglarni ifodalash uchun. Qulaylik uchun rang mosligi sinfi
turli xil oldindan belgilangan statik Rangli ob'ektlarni bo'yadi - QORA, KO'K, CYAN, TO'YIQ_GRAY, GRAY,
YASHIL, OCH_KUZI, MAGENTA, TO'QINCHI, PUSHTI, QIZIL, OQ VA SARIQ. Har biriga kirish mumkin
Rang.REDdagi kabi sinf nomi va nuqta (.) orqali. O'tish orqali maxsus ranglar yaratishingiz mumkin
Rang konstruktori sinfidagi qizil, yashil va ko'k komponent qiymatlari:

bekor usuli1 (int a, float b)

bekor usuli1 (float a, int b)

kvadrat(2);

Umumiy dasturlash xatosi 6.8
Haddan tashqari yuklangan usullarni bir xil parametrlar roʻyxati bilan eʼlon qilish kompilyatsiya xatosi hisoblanadi.
qaytish turlari har xil bo'lishidan qat'iy nazar.

umumiy rang(int r, int g, int b)


228 6-bob Usullar: Chuqurroq qarash

Grafik usullari to'ldirish va to'ldirishOval bilan to'ldirilgan to'rtburchaklar va ovallarni chizish.
ehtiyotkorlik bilan. Bular drawRect va drawOval bilan bir xil parametrlarga ega; birinchi ikkitasi
shaklning yuqori chap burchagi uchun koordinatalar, keyingi ikkitasi esa kenglikni aniqlaydi
va balandligi. Shakldagi misol. 6.11–6.12 ranglar va toʻldirilgan shakllarni koʻrsatadi
ekranda sariq kulgichni chizish va ko'rsatish.

6.11-rasmning 3–5-qatorlaridagi import bayonotlari Rang, Grafik va import sinflari.


JPanel. DrawSmiley sinfi (7–30-qatorlar) chizma ranglarini belgilash uchun Color sinfidan foydalanadi va
Chizish uchun grafika sinfi.
JPanel klassi yana biz chizadigan maydonni taqdim etadi. Bo'yoq usulida 14-qator
Komponent joriy chizma rangini belgilash uchun setColor Grafik usulidan foydalanadi
Rang.SARIQ. SetColor usuli bitta argumentni, chizma sifatida o'rnatish uchun Rangni talab qiladi
rang. Bu holda biz oldindan belgilangan Color.SARI ob'ektdan foydalanamiz.
15-chiziq yuzni ifodalash uchun diametri 200 bo'lgan doira chizadi-kenglik va
balandlik argumentlari bir xil, fillOval usuli doira chizadi. Keyinchalik, 18-qator o'rnatiladi
rangdan Rangga. Qora va 19-20 chiziqlar ko'zlarni tortadi. 23-qator og'izni oval shaklida chizadi,
lekin bu biz xohlagan narsa emas.

1 // 6.11-rasm: DrawSmiley.java


2 // Ranglar va to'ldirilgan shakllar yordamida tabassumni chizish.
3
4 import java.awt.Graphics;
5 import javax.swing.JPanel;
6
7 jamoat sinfi DrawSmiley JPanel-ni kengaytiradi
8 {
9 umumiy bekor bo'yoq Komponenti (Grafika g)
10 {
11 super.paintComponent(g);
12
13 // yuzni chizish
14
15
16
17 // ko'zlarni chizish
18
19
20
21
22 // og'izni chizish
23
24
25 // og'izni tabassumga "tegish"
26
27
28
29 }
30 } // yakuniy sinf DrawSmiley

6.11-rasm | Ranglar va to'ldirilgan shakllar yordamida kulgili yuzni chizish.

import java.awt.Color;

g.setColor(Color.YELLOW);


g.fillOval(10, 10, 200, 200);

g.setColor(Color.BLACK);


g.fillOval(55, 65, 30, 30);
g.fillOval(135, 65, 30, 30);

g.fillOval(50, 110, 120, 60);

g.setColor(Color.YELLOW);
g.fillRect(50, 110, 120, 30);
g.fillOval(50, 120, 120, 40);

6.13 (ixtiyoriy) GUI va grafik misol: ranglar va to‘ldirilgan shakllar 229

Baxtli yuzni yaratish uchun biz og'izni tegizamiz. 26-qator rangni o'rnatadi
Rang.SARIQ, shuning uchun biz chizgan har qanday shakllar yuz bilan uyg'unlashadi. 27-chiziq to'rtburchak chizadi
bu og'izning yarmiga teng. Bu og'izning yuqori yarmini o'chiradi va faqat qoldiradi
pastki yarmi. Yaxshiroq tabassum yaratish uchun 28-qator yuqori qismini biroz yopish uchun yana bir ovalni tortadi
og'izning bir qismi. Class DrawSmileyTest (6.12-rasm) JFrame-ni yaratadi va ko'rsatadi.
chizmani o'z ichiga oladi. JFrame ko'rsatilganda tizim bo'yoq usulini chaqiradi.
Tabassum yuzini chizish uchun komponent.

GUI va grafik misollarni o'rganish mashqlari


6.1 FillOval usulidan foydalanib, quyidagi kabi ikkita tasodifiy rang o'rtasida almashinadigan buqa ko'zini chizing.
6.13-rasm. Ranni yaratish uchun tasodifiy argumentlar bilan Color(int r, int g, int b) konstruktoridan foydalaning.
dom ranglari.
6.2 Tasodifiy ranglar, pozitsiyalar va o'lchamlarda tasodifiy to'ldirilgan 10 ta shaklni chizadigan dastur tuzing
(6.14-rasm). PaintComponent usuli 10 marta takrorlanadigan tsiklni o'z ichiga olishi kerak. Har bir iteratsiyada,
pastadir to'ldirilgan to'rtburchaklar yoki oval chizish yoki tasodifiy rang yaratish yoki yo'qligini aniqlash kerak
tasodifiy koordinatalar va o'lchamlarni tanlang. Koordinatalar panorama asosida tanlanishi kerak.
elning kengligi va balandligi. Yonlarning uzunligi derazaning kengligi yoki balandligining yarmi bilan cheklangan bo'lishi kerak.

1 // 6.12-rasm: DrawSmileyTest.java


2 // Tabassumni ko'rsatadigan sinov ilovasi.
3 import javax.swing.JFrame;
4
5 ommaviy sinf DrawSmileyTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 DrawSmiley paneli = yangi DrawSmiley();
10 JFrame ilovasi = yangi JFrame();
11
12 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13 application.add(panel);
14 application.setSize(230, 250);
15 application.setVisible(rost);
16 }
17 } // yakuniy sinf DrawSmileyTest

6.12-rasm | Tabassumni ko'rsatadigan sinov ilovasi.


230 6-bob Usullar: Chuqurroq qarash

6.14 Yakunlash
Ushbu bobda siz usul deklaratsiyasi haqida ko'proq bilib oldingiz. Siz ham farqni o'rgandingiz -
misol usullari va statik usullar o'rtasidagi va statik usullarni qanday chaqirish kerakligi
Usul nomidan oldin u paydo bo'ladigan sinf nomi va nuqta (.)
ajratuvchi. Siz satrlarni birlashtirish uchun + va += operatorlaridan qanday foydalanishni o'rgandingiz.
Biz stek va stek freymlarini chaqirish usuli qanday usullarni kuzatib borishini muhokama qildik
chaqirilgan va har bir usul o'z vazifasini bajargandan so'ng qaytishi kerak bo'lgan joyga. Biz
shuningdek, ibtidoiy turlar o'rtasida bilvosita konvertatsiya qilish uchun Java-ning reklama qoidalarini muhokama qildi va
cast operatorlari bilan aniq konvertatsiyalarni qanday amalga oshirish kerak. Keyinchalik, siz ba'zilari haqida bilib oldingiz
Java API-da tez-tez ishlatiladigan paketlar.
Enum turlaridan va shaxsiy statikdan foydalangan holda nomlangan konstantalarni qanday e'lon qilishni ko'rdingiz
yakuniy o'zgaruvchilar. Simulyatsiya uchun tasodifiy raqamlarni yaratish uchun SecureRandom sinfidan foydalangansiz.
lar. Siz sinfdagi maydonlar va mahalliy o'zgaruvchilar haqida ham bilib oldingiz. Nihoyat, siz
usullar bilan ta'minlash orqali bir sinfdagi bir nechta usullarni ortiqcha yuklash mumkinligini bilib oldilar
bir xil ism va turli xil imzolar. Xuddi shunday usullarni bajarish uchun foydalanish mumkin
yoki shunga o'xshash vazifalar har xil turdagi yoki turli xil parametrlar sonidan foydalangan holda.

6.13-rasm | Ikki o'zgaruvchan, tasodifiy rangga ega buqalar ko'zi.

6.14-rasm | Tasodifiy yaratilgan shakllar.

Xulosa 231

7-bobda siz massivlardagi ma'lumotlar ro'yxati va jadvallarini qanday saqlashni o'rganasiz. Ko'rasiz
6 000 000 marta aylanadigan dasturning yanada oqlangan amalga oshirilishi. Biz qilamiz
Baholar boʻyicha oʻquvchilarning baholari toʻplamini saqlaydigan GradeBook amaliy ishining ikkita versiyasini taqdim eting.
Kitob ob'ekti. Shuningdek, siz ilovaning buyruq qatori argumentlariga qanday kirishni o'rganasiz
Ilova bajarila boshlaganda main usuliga o'tkaziladi.

Xulosa
6.1-bo'lim Kirish


• Tajriba shuni ko'rsatadiki, katta dasturni ishlab chiqish va uni qo'llab-quvvatlashning eng yaxshi yo'li qurilishdir
uni kichik, oddiy qismlardan yoki modullardan. Bu usul “bo‘l va zabt et” deb ataladi (201-bet).
6.2-bo'lim Java-da dastur modullari
• Usullar sinflar ichida e'lon qilinadi. Sinflar odatda paketlarga guruhlanadi, shuning uchun ular bo'lishi mumkin
import qilinadi va qayta ishlatiladi.
• Metodlar dasturni uning vazifalarini mustaqil birliklarga ajratish orqali modullashtirish imkonini beradi. The
metoddagi gaplar faqat bir marta yoziladi va boshqa usullardan yashiriladi.
• Yangi dasturlarni yaratish uchun mavjud usullarni qurilish bloklari sifatida ishlatish dasturiy ta'minotni qayta ishlatish shaklidir.
ity (202-bet), bu dastur ichida kodni takrorlashdan qochish imkonini beradi.
6.3-bo'lim Statik usullar, statik maydonlar va sinf matematikasi
• Usul chaqiruvi chaqiriladigan usulning nomini belgilaydi va chaqirilgan argumentlarni beradi
usul o'z vazifasini bajarishni talab qiladi. Usul chaqiruvi tugagach, usul ham qaytariladi
natija, yoki oddiygina nazorat, uning qo'ng'iroq qiluvchiga.
• Sinf ob'ektni talab qilmaydigan umumiy vazifalarni bajarish uchun statik usullarni o'z ichiga olishi mumkin
sinf. Statik usul o'z vazifalarini bajarish uchun talab qilishi mumkin bo'lgan har qanday ma'lumot usulga yuborilishi mumkin
usul chaqiruvidagi argumentlar sifatida. Statik usul sinf nomini ko'rsatish orqali chaqiriladi
qaysi usul e'lon qilinadi, undan keyin nuqta (.) va usul nomi, dagi kabi
ClassName.methodName(argumentlar)
• Class Math umumiy matematik hisoblarni bajarish uchun statik usullarni taqdim etadi.
• Doimiy Math.PI (204-bet; 3.141592653589793) aylana aylanasining uning doirasiga nisbati.
diametri. Doimiy Math.E (204-bet; 2.718281828459045) tabiiy loga uchun asosiy qiymatdir.
ritmlar (statik Matematik usul jurnali bilan hisoblangan).
• Math.PI va Math.E ochiq, yakuniy va statik modifikatorlar bilan e'lon qilinadi. Ularni yasash
public ushbu maydonlardan o'z sinfingizda foydalanishga imkon beradi. Final kalit so'zi bilan e'lon qilingan maydon
(205-bet) doimiy bo‘lib, uni ishga tushirgandan so‘ng uning qiymatini o‘zgartirib bo‘lmaydi. PI ham, E ham e'lon qilinadi
yakuniy, chunki ularning qadriyatlari hech qachon o'zgarmaydi. Ushbu maydonlarni statik qilish ularga kirish imkonini beradi
sinf nomi Math va nuqta (.) ajratgich orqali, xuddi sinf Math usullari kabi.
• Sinfning barcha ob'ektlari sinfning statik maydonlarining bir nusxasini baham ko'radi. Sinf o'zgaruvchilari birgalikda
(204-bet) va misol o'zgaruvchilari sinf maydonlarini ifodalaydi.
• Java virtual mashinasini (JVM) java buyrug'i bilan bajarganingizda, JVM yuklaydi
siz belgilagan sinf va asosiy usulni chaqirish uchun ushbu sinf nomidan foydalanadi. Siz qo'shimcha belgilashingiz mumkin
JVM ilovangizga o'tishi haqidagi buyruq qatori argumentlari (205-bet).
• Siz e'lon qilgan har bir sinfga asosiy metodni joylashtirishingiz mumkin — faqat siz tanlagan sinfdagi asosiy usul
ilovani bajarish uchun foydalanish java buyrug'i bilan chaqiriladi.

232 6-bob Usullar: Chuqurroq qarash



6.4-bo'lim Ko'p parametrli usullarni e'lon qilish
• Usul chaqirilganda dastur usulning argument qiymatlaridan nusxa oladi va tayinlaydi
ularni usulning mos parametrlariga moslang. Dastur boshqaruvi kirish nuqtasiga qaytganda
usul chaqirilgan dastur, usulning parametrlari xotiradan o'chiriladi.
• Usul ko'pi bilan bitta qiymatni qaytarishi mumkin, lekin qaytarilgan qiymat ob'ektga havola bo'lishi mumkin
ko'p qiymatlarni o'z ichiga oladi.
• O‘zgaruvchilar faqat bir nechta maydonlarda foydalanish uchun zarur bo‘lgandagina sinf maydonlari sifatida e’lon qilinishi kerak.
sinf usuli yoki dastur sinf usullariga qo'ng'iroqlar orasida o'z qiymatlarini saqlashi kerak bo'lsa.
• Usul bir nechta parametrga ega bo'lsa, parametrlar vergul bilan ajratilgan holda belgilanadi
ro'yxati. Metod deklaratsiyasidagi har bir parametr uchun usul chaqiruvida bitta argument bo'lishi kerak.
tion. Bundan tashqari, har bir argument mos keladigan parametr turiga mos kelishi kerak. Agar a
usul argumentlarni qabul qilmaydi, parametrlar ro'yxati bo'sh.
• O'ngdagi belgilarni joylashtirgan + operatori yordamida satrlarni birlashtirish mumkin (208-bet).
chap operanddagilarning oxiridagi operand.
• Java'dagi har bir ibtidoiy qiymat va ob'ekt String sifatida taqdim etilishi mumkin. Ob'ekt birlashganda -
String bilan bog'langan holda, ob'ekt Stringga aylantiriladi, so'ngra ikkita String birlashtiriladi.
• Agar mantiqiy qiymat String bilan birlashtirilgan bo'lsa, "true" so'zi yoki "yolg'on" so'zi takrorlash uchun ishlatiladi.
mantiqiy qiymatdan norozi.
• Java’dagi barcha obyektlarda String tasvirini qaytaruvchi toString nomli maxsus metod mavjud
ob'ektning mazmuni. Ob'ekt String bilan birlashtirilganda, JVM bilvosita chaqiradi
ob'ektning satr tasvirini olish uchun ob'ektning toString usuli.
• Katta String literallarini bir nechta kichikroq satrlarga ajratishingiz va ularni bir nechta satrlarga joylashtirishingiz mumkin
o'qilishi uchun kodni tanlang, so'ngra birlashma yordamida Stringlarni qayta yig'ing.
6.5-bo'lim Deklaratsiya va usullardan foydalanish bo'yicha eslatmalar
• Usulni chaqirishning uchta usuli mavjud - boshqa usulni chaqirish uchun usul nomidan foydalanish
bir xil sinf; ob'ektga havolani o'z ichiga olgan o'zgaruvchidan foydalanib, keyin nuqta (.) va
havola qilingan ob'ektning usulini chaqirish uchun usul nomi; va sinf nomi va nuqtadan foydalanish
(.) sinfning statik usulini chaqirish.
• Usulni chaqiruvchi bayonotga boshqaruvni qaytarishning uchta usuli mavjud. Agar usul bo'lmasa
natijani qaytarish, dastur oqimi usul tugaydigan o'ng qavsga yoki yetganda boshqaruv qaytadi
bayonot qachon
qaytish;
bajariladi. Agar usul natijani qaytarsa, bayonot
qaytarish ifodasi;
ifodani baholaydi, so'ngra olingan qiymatni darhol chaqiruvchiga qaytaradi.
6.6-bo'lim - Stack va Stack ramkalarini chaqirish usuli
• Staklar (209-bet) oxirgi kiruvchi, birinchi chiquvchi (LIFO) ma'lumotlar tuzilmalari sifatida tanilgan - oxirgi kiritilgan element (in-
stekga qo'yilgan) - stekdan chiqarilgan (olib tashlangan) birinchi element.
• Chaqirilgan usul o'z qo'ng'iroq qiluvchiga qanday qaytishni bilishi kerak, shuning uchun qo'ng'iroq qiluvchining qaytish manzili-
od usul chaqirilganda usul chaqiruv stekiga suriladi. Agar bir qator usul chaqirsa
sodir bo'lganda, ketma-ket qaytish manzillari stekga oxirgi kirish, birinchi chiqish tartibida suriladi, shunda
bajariladigan oxirgi usul birinchi bo'lib qo'ng'iroq qiluvchiga qaytib keladi.
• Usul chaqiruv stegi (210-bet) har bir chaqiruvda ishlatiladigan mahalliy o'zgaruvchilar uchun xotirani o'z ichiga oladi.
dasturni bajarish jarayonida usulni ko'rsatish. Ushbu ma'lumotlar usul chaqiruvi to'plami sifatida tanilgan

Xulosa 233



ramka yoki faollashtirish yozuvi. Usul chaqiruvi amalga oshirilganda, ushbu usul chaqiruvi uchun stek ramkasi bo'ladi
usul chaqiruv stekiga surildi. Usul o'z chaqiruvchisiga qaytganida, uning stek ramka chaqiruvi bo'ladi
stekdan chiqib ketdi va mahalliy o'zgaruvchilar endi dasturga ma'lum emas.
• Agar metod chaqiruvlari stekida ularning stek ramkalari saqlanishi mumkin bo'lgandan ko'proq usul chaqiruvlari bo'lsa,
stekning to'lib ketishi (210-bet) deb nomlanuvchi xatolik yuzaga keladi. Ilova to'g'ri kompilyatsiya qilinadi, lekin
uning bajarilishi stekning to'lib ketishiga olib keladi.
6.7-bo'lim Argumentlarni ilgari surish va kasting
• Argumentni ilgari surish (210-bet) argument qiymatini usul kutgan turga aylantiradi
tegishli parametrda qabul qilish.
• Rag'batlantirish qoidalari (210-bet) ikki yoki undan ortiq ibtidoiy turdagi qiymatlarni o'z ichiga olgan ifodalarga nisbatan qo'llaniladi
metodlarga argument sifatida uzatiladigan primitiv tipdagi qiymatlarga esa. Har bir qiymat yuqoriga ko'tariladi
ifodadagi “eng yuqori” turi. Konvertatsiya tufayli ma'lumotlar yo'qolishi mumkin bo'lgan hollarda
Java kompilyatori konvertatsiyani aniq majburlash uchun sizdan cast operatoridan foydalanishni talab qiladi.
6.9-bo'lim Case Study: xavfsiz tasodifiy raqamlarni yaratish
• SecureRandom (java.security paketi; 213-bet) klassi ob'ektlari deterministik bo'lmagan ma'lumotlarni ishlab chiqishi mumkin.
tasodifiy qiymatlar.
• SecureRandom usuli nextInt (214-bet) tasodifiy int qiymatini hosil qiladi.
• Class SecureRandom int argumentini qabul qiluvchi nextInt usulining boshqa versiyasini taqdim etadi
va 0 dan argument qiymatini hisobga olmaganda, qiymatni qaytaradi.
• Diapazondagi tasodifiy raqamlar (214-bet) yordamida yaratilishi mumkin
int raqami = shiftingValue + randomNumbers.nextInt(scalingFactor);
bu erda shiftingValue kerakli ketma-ket butun sonlar oralig'idagi birinchi raqamni belgilaydi va
scalingFactor diapazonda nechta raqam borligini aniqlaydi.
• Tasodifiy raqamlar quyidagi kabi ketma-ket bo'lmagan butun son diapazonlaridan tanlanishi mumkin
int raqami = shiftingValue +
FarqO'rtasidagi qiymatlar * randomNumbers.nextInt(scalingFactor);
bu erda shiftingValue qiymatlar oralig'idagi birinchi raqamni belgilaydi, farq o'rtasidagi farq
ketma-ketlikdagi ketma-ket raqamlar orasidagi farqni norozi qiladi va scalingFactor belgilaydi
diapazonda nechta raqam bor.
6.10-bo'lim Case Study: Imkoniyatlar o'yini; Enum turlari bilan tanishtirish
• Enum turi (221-bet) enum kalit so'zi va tur nomi bilan kiritiladi. Har qanday sinfda bo'lgani kabi,
qavslar ({ va }) enum deklaratsiyasining asosiy qismini chegaralaydi. Qavslar ichida vergul bilan ajratilgan
Har biri o'ziga xos qiymatni ifodalovchi enum konstantalari ro'yxati. Enumdagi identifikatorlar bo'lishi kerak
noyob. Enum tipidagi o'zgaruvchilarga faqat shu enum tipidagi konstantalar tayinlanishi mumkin.
• Konstantalar xususiy statik yakuniy o'zgaruvchilar sifatida ham e'lon qilinishi mumkin. Bunday konstantalar tomonidan e'lon qilinadi
dasturda ajralib turishi uchun barcha bosh harflar bilan konventsiya.
6.11-bo'lim Deklaratsiyalar doirasi
• Qo‘llanish doirasi (222-bet) – dasturning o‘zgaruvchi yoki usul kabi ob’ekt bo‘limi.
nomi bilan atash mumkin. Bunday tashkilot proporsiyaning ushbu qismi uchun "ko'lamda" deb aytiladi.
gramm.
• Parametr deklaratsiyasining doirasi deklaratsiya paydo bo'ladigan usulning asosiy qismidir.
• Mahalliy o'zgaruvchan deklaratsiyaning ko'lami deklaratsiya paydo bo'lgan paytdan boshlab
bu blokning oxiri.

234 6-bob Usullar: Chuqurroq qarash

• For state-ning ishga tushirish bo'limida paydo bo'ladigan mahalliy o'zgaruvchi deklaratsiyasi doirasi-
ment sarlavhasi for iborasining va sarlavhadagi boshqa ifodalarning asosiy qismidir.
• Sinf usuli yoki sohasi doirasi sinfning butun tanasidir. Bu sinfning uslubiga imkon beradi
sinfning boshqa usullarini chaqirish va sinf maydonlariga kirish uchun oddiy nomlardan foydalanish imkoniyati.
• Har qanday blokda o'zgaruvchan deklaratsiyalar bo'lishi mumkin. Agar usuldagi mahalliy o'zgaruvchi yoki parametr mavjud bo'lsa
maydon bilan bir xil nomga ega bo'lsa, blok bajarishni tugatmaguncha maydon soyalanadi (223-bet).

6.12-bo'lim Usulni ortiqcha yuklash


• Java sinfda haddan tashqari yuklangan usullarga (225-bet) ruxsat beradi, agar metodlar turli xil to'plamlarga ega bo'lsa.
parametrlar (parametrlarning soni, tartibi va turlari bo'yicha aniqlanadi).
• Haddan tashqari yuklangan usullar o'zlarining imzolari bilan ajralib turadi (226-bet) - metodlarning kombinatsiyasi -
ods nomlari va ularning parametrlarining soni, turlari va tartibi, lekin ularning qaytish turlari emas.

O'z-o'zini tekshirish mashqlari


6.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) usul a(n) bilan chaqiriladi.
b) faqat o'zi e'lon qilingan usulda ma'lum bo'lgan o'zgaruvchiga a(n) deyiladi.
c) chaqirilgan usuldagi bayonot ifoda qiymatini uzatish uchun ishlatilishi mumkin.
chaqiruv usuliga qayting.
d) Kalit so'z usulning qiymat qaytarmasligini bildiradi.
e) Ma'lumotlarni faqat stekga qo'shish yoki olib tashlash mumkin.
f) steklar ma'lumotlar tuzilmalari deb nomlanadi; ustiga surilgan (qo'yilgan) oxirgi element
stek - bu stekdan chiqarilgan (olib tashlangan) birinchi element.
g) boshqaruvni chaqirilgan usuldan chaqiruvchiga qaytarishning uchta usuli:
va .
h) Sinf ob'ekti haqiqiy tasodifiy sonlarni hosil qiladi.
i) Usul chaqiruvi stegi a ning har bir chaqiruvida mahalliy o'zgaruvchilar uchun xotirani o'z ichiga oladi
dasturni bajarish paytidagi usul. Ushbu ma'lumotlar usul chaqiruvining bir qismi sifatida saqlanadi
stek yoki usul chaqiruvi sifatida tanilgan.
j) Agar usul chaqiruvi stekida saqlanishi mumkin bo'lgandan ko'proq usul chaqiruvlari mavjud bo'lsa, xato
a (n) sifatida tanilgan.
k) Deklaratsiya - bu dasturning ob'ektga murojaat qilishi mumkin bo'lgan qismi
nomi bilan deklaratsiya.
l) Har biri turlicha ishlaydigan bir xil nomli bir nechta usullarga ega bo'lish mumkin
argumentlarning turlari yoki soni. Bu xususiyat usul deb ataladi.
6.2 6.8-rasmdagi Craps sinfi uchun quyidagi ob'ektlarning har birining qamrovini ko'rsating:
a) randomNumbers o'zgaruvchisi.
b) die1 o'zgaruvchisi.
c) rollDice usuli.
d) asosiy usul.
e) sumOfDice o'zgaruvchisi.
6.3 Matematik sinf usuli misollari ko'rsatilganligini tekshiradigan dastur yozing
6.2-rasmda ko'rsatilgan natijalarni beradi.
6.4 Quyidagi usullarning har biri uchun usul sarlavhasini bering:
a) Ikkita aniqlik, suzuvchi nuqtali argumentlarni qabul qiluvchi gipotenuza usuli
side1 va side2 va ikki tomonlama aniqlik, suzuvchi nuqtali natijani qaytaradi.
b) X, y va z uchta butun sonni oladigan va butun sonni qaytaruvchi eng kichik usul.

O'z-o'zini tekshirish mashqlariga javoblar 235

c) argumentlarni qabul qilmaydigan va qiymat qaytarmaydigan usul ko'rsatmalari.
[Izoh: Bunday usullar odatda foydalanuvchiga ko'rsatmalarni ko'rsatish uchun ishlatiladi.]
d) intToFloat usuli, u butun son argument raqamini oladi va floatni qaytaradi.
6.5 Quyidagi dastur segmentlarining har biridagi xatoni toping. Xatoni qanday tuzatish kerakligini tushuntiring.
a) bekor g()
{
System.out.println("Ichki usul g");
void h()
{
System.out.println("Ichki usul h");
}
}
b) int summasi (int x, int y)
{
int natijasi;
natija = x + y;
}
v) void f (float a);
{
float a;
System.out.println(a);
}
d) bekor mahsulot()
{
int a = 6, b = 5, c = 4, natija;
natija = a * b * c;
System.out.printf("Natija %d%n", natija);
natijani qaytarish;
}
6.6 Sfera hajmini hisoblash va qaytarish uchun sphereVolume usulini e'lon qiling. dan foydalaning
hajmini hisoblash uchun quyidagi bayonot:
ikki barobar hajm = (4.0 / 3.0) * Math.PI * Math.pow (radius, 3)
Foydalanuvchiga sharning ikki radiusini taklif qiladigan, sphereVolume chaqiradigan Java ilovasini yozing.
hajmini hisoblash va natijani ko'rsatish uchun.
O'z-o'zini tekshirish mashqlariga javoblar
6.1 a) usul chaqiruvi. b) mahalliy o'zgaruvchi. c) qaytish. d) bekor. e) yuqori. f) oxirgi kiruvchi, birinchi chiquvchi (LIFO).
g) qaytish; yoki qaytarish ifodasi; yoki usulning yopilish o'ng qavsi bilan uchrashish. h) SecureRan-
dom. i) stek ramkasi, faollashtirish yozuvi. j) stekning to'lib ketishi. k) qamrovi. l) usulning haddan tashqari yuklanishi.
6.2 a) sinf tanasi. b) rollDice ning tanasi usulini belgilaydigan blok. c) sinf tarkibi. d) sinf tarkibi.
e) asosiy usul tanasini belgilaydigan blok.
6.3 Quyidagi yechim 6.2-rasmdagi Matematik sinf usullarini ko'rsatadi:

1 // 6.3-mashq: MathTest.java


2 // Matematika dars usullarini sinab ko'rish.
3 umumiy sinf matematik test
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {

236 6-bob Usullar: Chuqurroq qarash

6.4 a) ikki tomonlama gipotenuza (ikki tomon 1, ikki tomon 2)
b) int eng kichik (int x, int y, int z)
c) bekor qilingan ko'rsatmalar ()
d) float intToFloat (int raqami)
6.5 a) Xato: h usuli g usuli ichida e'lon qilingan.
Tuzatish: h deklaratsiyasini g deklaratsiyasidan tashqariga o'tkazing.
b) Xato: Usul butun sonni qaytarishi kerak, lekin qaytarmaydi.
Tuzatish: o'zgaruvchan natijani o'chiring va bayonotni joylashtiring
qaytish x + y;
usulda yoki usul tanasining oxiriga quyidagi bayonotni qo'shing:
natijani qaytarish;

7 System.out.printf("Math.abs(23.7) = %f%n", Math.abs(23.7));


8 System.out.printf("Math.abs(0.0) = %f%n", Math.abs(0.0));
9 System.out.printf("Math.abs(-23.7) = %f%n", Math.abs(-23.7));
10 System.out.printf("Math.ceil(9.2) = %f%n", Math.ceil(9.2));
11 System.out.printf("Math.ceil(-9.8) = %f%n", Math.ceil(-9.8));
12 System.out.printf("Math.cos(0.0) = %f%n", Math.cos(0.0));
13 System.out.printf("Math.exp(1.0) = %f%n", Math.exp(1.0));
14 System.out.printf("Math.exp(2.0) = %f%n", Math.exp(2.0));
15 System.out.printf("Math.floor(9.2) = %f%n", Math.floor(9.2));
16 System.out.printf("Math.floor(-9.8) = %f%n", Math.floor(-9.8));
17 System.out.printf("Math.log(Math.E) = %f%n", Math.log(Math.E));
18 System.out.printf("Math.log(Math.E * Math.E) = %f%n",
19 Math.log(Math.E * Math.E));
20 System.out.printf("Math.max(2.3, 12.7) = %f%n", Math.max(2.3, 12.7));
21 System.out.printf("Math.max(-2.3, -12.7) = %f%n",
22 Math.max(-2.3, -12.7));
23 System.out.printf("Math.min(2.3, 12.7) = %f%n", Math.min(2.3, 12.7));
24 System.out.printf("Math.min(-2.3, -12.7) = %f%n",
25 Math.min(-2.3, -12.7));
26 System.out.printf("Math.pow(2.0, 7.0) = %f%n", Math.pow(2.0, 7.0));
27 System.out.printf("Math.pow(9.0, 0.5) = %f%n", Math.pow(9.0, 0.5));
28 System.out.printf("Math.sin(0.0) = %f%n", Math.sin(0.0));
29 System.out.printf("Math.sqrt(900.0) = %f%n", Math.sqrt(900.0));
30 System.out.printf("Math.tan(0.0) = %f%n", Math.tan(0.0));
31 } // asosiyni tugatish
32 } // yakuniy sinf MathTest

Math.abs(23,7) = 23,700000


Math.abs(0,0) = 0,000000
Math.abs(-23,7) = 23,700000
Math.ceil(9.2) = 10.000000
Math.ceil(-9.8) = -9.000000
Math.cos(0,0) = 1,000000
Math.exp(1.0) = 2.718282
Math.exp(2.0) = 7.389056
Math.floor(9.2) = 9.000000
Math.floor(-9.8) = -10.000000
Math.log(Math.E) = 1.000000
Math.log(Math.E * Math.E) = 2.000000
Math.max(2.3, 12.7) = 12.700000
Math.max(-2.3, -12.7) = -2.300000
Math.min(2.3, 12.7) = 2.300000
Math.min(-2.3, -12.7) = -12.700000
Math.pow (2.0, 7.0) = 128.000000
Math.pow (9,0, 0,5) = 3,000000
Math.sin(0,0) = 0,000000
Math.sqrt(900.0) = 30.000000
Math.tan(0,0) = 0,000000

237-mashqlar

c) Xato: Parametrlar roʻyxatining oʻngdagi qavsdan keyingi nuqtali vergul notoʻgʻri va
a parametri usulda qayta e'lon qilinmasligi kerak.
Tuzatish: Parametrlar roʻyxatining oʻngdagi qavsdan keyin nuqtali vergulni oʻchiring va
float deklaratsiyasini o'chirish a;.
d) Xato: Usul kerak bo'lmaganda qiymatni qaytaradi.
Tuzatish: Qaytish turini voiddan intga o'zgartiring.
6.6 Quyidagi yechim foydalanuvchi kiritgan radiusdan foydalanib, shar hajmini hisoblab chiqadi:

Mashqlar
6.7 Quyidagi buyruqlarning har biri bajarilgandan keyin x ning qiymati qanday bo'ladi?


a) x = Math.abs(7.5);
b) x = Math.floor(7.5);
c) x = Math.abs(0,0);
d) x = Math.ceil(0,0);
e) x = Math.abs(-6,4);
f) x = Math.ceil(-6,4);
g) x = Math.ceil(-Math.abs(-8 + Math.floor(-5,5)));
6.8 (To'xtab turish uchun to'lovlar) Garaj uch kishigacha mashinani to'xtatish uchun kamida $2,00 to'lov oladi.
soat. Garaj har bir soat yoki uning uchdan ortiq qismi uchun soatiga qo'shimcha 0,50 dollar to'laydi
soat. Har qanday 24 soatlik muddat uchun maksimal to'lov $10.00. Mashinalar uchun to'xtash joylari yo'q deb faraz qiling
bir vaqtning o'zida 24 soatdan ortiq. Avtoturargoh to'lovlarini hisoblaydigan va ko'rsatadigan ariza yozing
kecha garajda to'xtab qolgan har bir mijoz uchun. Har biri uchun to'xtab turish soatlarini kiritishingiz kerak
mijoz. Dastur joriy mijoz uchun to'lovni ko'rsatishi va hisoblashi kerak va
kechagi tushumlarning amaldagi jami ma'lumotlarini ko'rsatish. Buni bekor qilish uchun hisoblashCharges usulidan foydalanish kerak.
har bir mijoz uchun to'lovni bekor qilish.

1 // 6.6-mashq: Sphere.java


2 // Sfera hajmini hisoblash.
3 import java.util.Scanner;
4
5 ommaviy sinf Sfera
6 {
7 // foydalanuvchidan radiusni oling va sfera hajmini ko'rsating
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 Skaner kiritish = yangi Skaner(System.in);
11
12 System.out.print("Sfera radiusini kiriting: ");
13 juft radius = input.nextDouble();
14
15 System.out.printf("Hajm - %f%n", sharVolume(radius));
16 } // yakuniy usuli aniqlashSphereVolume
17
18 // shar hajmini hisoblash va qaytarish
19 umumiy statik ikki sharsimon hajm(ikki radius)
20 {
21 juft hajm = (4.0 / 3.0) * Math.PI * Math.pow (radius, 3);
22 qaytish hajmi;
23 } // end usuli sphereVolume
24 } // oxirgi sinf Sphere

Sfera radiusini kiriting: 4


Hajmi: 268.082573

238 6-bob Usullar: Chuqurroq qarash



6.9 (Raqamlarni yaxlitlash) Math.floor qiymatlarni eng yaqin butun songa yaxlitlash uchun ishlatilishi mumkin, masalan,
y = Math.floor(x + 0,5);
x sonini eng yaqin butun songa yaxlitlaydi va natijani y ga tayinlaydi. Buning uchun ariza yozing
qo'sh qiymatlarni o'qiydi va har bir raqamni eng yaqingacha yaxlitlash uchun oldingi iboradan foydalanadi
butun son. Qayta ishlangan har bir raqam uchun asl raqam va yaxlitlangan raqamni ko'rsating.
6.10 (Raqamlarni yaxlitlash) Raqamlarni ma'lum o'nlik kasrlarga yaxlitlash uchun quyidagi kabi bayonotdan foydalaning
y = Math.floor(x * 10 + 0,5) / 10;
qaysi x ni o'ninchi pozitsiyasiga yaxlitlaydi (ya'ni, kasrning o'ng tomonidagi birinchi pozitsiya) yoki
y = Math.floor(x * 100 + 0,5) / 100;
x ni yuzdan birlik holatiga yaxlitlaydi (ya'ni, o'nlik kasrning o'ng tomonidagi ikkinchi pozitsiya
nuqta). X sonini turli usullar bilan yaxlitlashning to'rtta usulini belgilaydigan dastur yozing:
a) roundToInteger (raqam)
b) round To Tenths (son)
c) yuzdan birgacha (raqam)
d) mingdan birgacha (raqam)
Har bir o'qilgan qiymat uchun dasturingiz asl qiymatni ko'rsatishi kerak, raqam yaxlitlangan
eng yaqin butun son, eng yaqin o'ndan biriga yaxlitlangan son, eng yaqin hun-
dredth va son mingdan biriga yaxlitlangan.
6.11 Quyidagi savollarning har biriga javob bering:
a) “Tasodifiy” raqamlarni tanlash nimani anglatadi?
b) SecureRandom sinfining nextInt usuli nima uchun o'yinlarni simulyatsiya qilish uchun foydali?
imkoniyat?
c) Nima uchun SecureRandom ob'ekti tomonidan ishlab chiqarilgan qiymatlarni o'zgartirish yoki o'zgartirish kerak?
d) Nima uchun real vaziyatlarni kompyuterlashtirilgan simulyatsiya qilish foydali texnika hisoblanadi?
6.12 Quyidagi diapazonlarda n o‘zgaruvchisiga tasodifiy butun sonlarni belgilaydigan gaplarni yozing:
a) 1 ≤ n ≤ 2.
b) 1 ≤ n ≤ 100.
c) 0 ≤ n ≤ 9.
d) 1000 ≤ n ≤ 1112.
e) –1 ≤ n ≤ 1.
f) –3 ≤ n ≤ 11.
6.13 Quyidagi to'plamlarning har biridan tasodifiy sonni ko'rsatadigan bayonotlarni yozing:
a) 2, 4, 6, 8, 10.
b) 3, 5, 7, 9, 11.
v) 6, 10, 14, 18, 22.
6.14 (Exponentsiya) ning qiymatini qaytaruvchi integerPower (asosiy, ko‘rsatkich) usulini yozing.
asosiy ko'rsatkich
Masalan, integerPower(3, 4) 34 ni (yoki 3 * 3 * 3 * 3) hisoblaydi. Ko'rsatkichni pozitiv deb faraz qilaylik.
tive, nolga teng bo'lmagan butun son va bu asos butun sondir. Hisobni boshqarish uchun for yoki while ifodasidan foydalaning.
lash. Matematika darsi usullaridan foydalanmang. Ushbu usulni o'qiydigan ilovaga qo'shing
baza va ko'rsatkich uchun butun son qiymatlari va integerPower usuli bilan hisoblashni amalga oshiradi.
6.15 (Gipotenuzani hisoblash) gipotenuzani hisoblaydigan usulni aniqlang.
boshqa ikki tomonning uzunliklari berilganda to'g'ri burchakli uchburchak. Usul ikkita ar-
double tipidagi gumentlar va gipotenuzani dubl sifatida qaytaring. Ushbu usulni birga qo'shing

239-mashqlar

tomon1 va yon 2 qiymatlarini o'qiydi va gipotenuza bilan hisobni bajaradigan dastur
usul. Har bir gipotenuzaning uzunligini aniqlash uchun pow va sqrt Matematik usullaridan foydalaning
6.15-rasmdagi uchburchaklar. [Izoh: Class Math ushbu hisobni amalga oshirish uchun gipot usulini ham taqdim etadi.]

6.16 (Ko'p sonlar) Butun sonlar juftligini aniqlaydigan isMultiple usulini yozing.


ikkinchi butun son birinchisining karrali. Usul ikkita tamsayı argumentini olishi va qaytishi kerak
ikkinchisi birinchining karrali bo'lsa rost, aks holda noto'g'ri. [Maslahat: Qolgan operatordan foydalaning.]
Ushbu usulni bir qator butun sonlarni kirituvchi ilovaga qo'shing (bir juftlik bilan bir qatorda).
vaqt) va har bir juftlikdagi ikkinchi qiymat birinchisining karrali ekanligini aniqlaydi.
6.17 (Juft yoki toq) aniqlash uchun qolgan operator (%) ishlatadigan isEven usulini yozing.
butun son juft bo'ladimi. Usul butun son argumentini olishi kerak va agar in-
teger juft va noto'g'ri. Ushbu usulni se-ni kiritadigan ilovaga qo'shing.
butun sonlar soni (bir vaqtning o'zida bitta) va har birining juft yoki toq ekanligini aniqlaydi.
6.18 (Yulduzchalar kvadratini ko'rsatish) Qattiq jismni ko'rsatadigan squareOfAsterisks usulini yozing
tomoni butun son parametrida ko'rsatilgan yulduzchalarning kvadrati (bir xil miqdordagi qatorlar va ustunlar)
abadiy tomoni. Misol uchun, agar tomon 4 bo'lsa, usul ko'rsatilishi kerak
****
****
****
****
Ushbu usulni foydalanuvchidan tomon uchun butun son qiymatini o'qiydigan dasturga kiriting va
yulduzchalarni squareOfAsterisks usuli bilan chiqaradi.
6.19 (Har qanday belgi kvadratini ko'rsatish) 6.18-mashqda yaratilgan usulni qayta ishlash uchun o'zgartiring.
fillCharacter deb nomlangan char tipidagi ikkinchi parametrni oling. Char pro- yordamida kvadrat hosil qiling.
dalil sifatida keltirildi. Shunday qilib, agar tomon 5 va fillCharacter # bo'lsa, usul ko'rsatilishi kerak
#####
#####
#####
#####
#####
Foydalanuvchining belgini o'qish uchun quyidagi bayonotdan foydalaning (qaysi kirish Skaner ob'ektidir).
klaviaturada:
char to'ldirish = input.next().charAt(0);
6.20 (Doira maydoni) Foydalanuvchiga aylana radiusini so'raydigan va foydalanadigan dasturni yozing.
doira maydonini hisoblash uchun circleArea deb nomlangan usul.
6.21 (Raqamlarni ajratish) Quyidagi vazifalarning har birini bajaradigan usullarni yozing:
a) a butun son b ga bo'linganda qismning butun qismini hisoblang.
b) a butun son b ga bo'linganda butun son qoldiqni hisoblang.

Uchburchakning 1 tomoni 2 tomoni

1 3,0 4,0
2 5,0 12,0
3 8,0 15,0

6.15-rasm | 6.15-mashqdagi uchburchaklar tomonlari uchun qiymatlar.


240 6-bob Usullar: Chuqurroq qarash



c) (a) va (b) qismlarida ishlab chiqilgan usullardan foydalanib, displayDigits usulini yozing
1 dan 99999 gacha bo'lgan butun sonni oladi va uni bir-biridan ajratib turadigan raqamlar ketma-ketligi sifatida ko'rsatadi.
har bir juft raqam ikkita bo'sh joy bilan. Masalan, 4562 butun soni sifatida ko'rinishi kerak
4 5 6 2
Butun sonni kiritadigan va displeyni chaqiradigan dasturga usullarni qo'shing.
Butun son kiritilgan usuldan o'tish orqali raqamlar. Natijalarni ko'rsatish.
6.22 (haroratni o'zgartirish) Quyidagi butun usullarni amalga oshiring:
a) Selsiy usuli Farengeyt haroratining Selsiy ekvivalentini qaytaradi.
hisoblash
Tselsiy = 5,0 / 9,0 * (farengeyt - 32);
b) Farengeyt usuli Selsiy bo'yicha Farengeyt ekvivalentini qaytaradi.
hisoblash
farengeyt = 9,0 / 5,0 * Selsiy + 32;
c) (a) va (b) qismlaridagi usullardan foydalanib, foydalanuvchiga ei-
u erda Farengeyt haroratini kiritish va Selsiy ekvivalentini ko'rsatish yoki a kiritish uchun
Tselsiy bo'yicha harorat va Farengeyt ekvivalentini ko'rsating.
6.23 (Minimumni toping) Uchta suzuvchining eng kichigini qaytaradigan minimal3 usulini yozing.
nuqta raqamlari. Minimum 3 ni amalga oshirish uchun Math.min usulidan foydalaning. Usulni a ichiga kiriting
foydalanuvchidan uchta qiymatni o'qiydigan, eng kichik qiymatni aniqlaydigan va qayta ko'rsatadigan dastur
sukut.
6.24 (Mukammal sonlar) Agar butun son mukammal son deyiladi, agar uning omillari, shu jumladan
1 (lekin raqamning o'zi emas), songa yig'indi. Masalan, 6 mukammal son, chunki 6 =
1 + 2 + 3. Parametr raqami mukammal son ekanligini aniqlaydigan isPerfect usulini yozing.
1 dan 1000 gacha bo'lgan barcha mukammal raqamlarni ko'rsatadigan ilovada ushbu usuldan foydalaning. Displey
har bir mukammal sonning omillari bu raqamning haqiqatdan ham mukammal ekanligini tasdiqlash uchun. Jamoaga e'tiroz bildiring
1000 dan kattaroq raqamlarni sinab ko'rish orqali kompyuteringizning quvvatini oshirish. Natijalarni ko'rsatish.
6.25 (tutuvchi sonlar) Musbat butun son faqat 1 ga va oʻziga boʻlinadigan boʻlsa tub son hisoblanadi. Masalan,
2, 3, 5 va 7 tub, lekin 4, 6, 8 va 9 emas. 1 raqami, ta'rifiga ko'ra, tub emas.
a) Sonning tub ekanligini aniqlaydigan usulni yozing.
b) Bu usuldan barcha tub sonlarni aniqlaydigan va aks ettiruvchi ilovada foydalaning
10 000 dan kam. Bunga ishonch hosil qilish uchun 10 000 gacha bo'lgan qancha raqamni sinab ko'rishingiz kerak
barcha asosiy sonlarni topdingizmi?
c) Dastlab, siz n/2 ko'rish uchun sinab ko'rishingiz kerak bo'lgan yuqori chegara deb o'ylashingiz mumkin
n soni tub bo'ladimi, lekin siz faqat n ning kvadrat ildizi qadar yuqori bo'lishingiz kerak. Qayta-
dasturni yozing va uni ikkala yo'nalishda ham ishga tushiring.
6.26 (Raqamlarni teskari aylantirish) Butun qiymatni oladigan va raqamni qaytaruvchi usulni yozing.
uning raqamlari teskari. Masalan, 7631 raqamini hisobga olgan holda, usul 1367 ni qaytarishi kerak.
usulni foydalanuvchidan qiymatni o'qiydigan va natijani ko'rsatadigan dasturga baholang.
6.27 (Eng katta umumiy boʻluvchi) Ikki butun sonning eng katta umumiy boʻluvchisi (GCD) eng kattasidir.
ikki sonning har birini teng taqsimlovchi butun son. Eng kattasini qaytaradigan gcd usulini yozing
ikkita butun sonning umumiy bo'luvchisi. [Maslahat: Evklid algoritmidan foydalanishni xohlashingiz mumkin. topishingiz mumkin
u haqida ma'lumot en.wikipedia.org/wiki/Euclidean_algorithm.] Usulni qo'shing.
foydalanuvchidan ikkita qiymatni o'qiydigan va natijani ko'rsatadigan dasturga.
6.28 Talabaning o‘rtacha qiymatini kiritadigan va 90–100 bo‘lsa, 4 ni qaytaradigan qualityPoints usulini yozing,
80–89 bo‘lsa 3, 70–79 bo‘lsa 2, 60–69 bo‘lsa 1 va 60 dan past bo‘lsa 0. Usulni ilovaga kiriting
foydalanuvchidan qiymatni o'qiydi va natijani ko'rsatadi.

Farq qilish 241



6.29 (Tanga otish) Tanga tashlashni taqlid qiluvchi dastur yozing. Dastur tanga tashlasin
har safar foydalanuvchi "Tanga tashlash" menyu opsiyasini tanlaganida. Har bir tomonining sonini hisoblang
tanga paydo bo'ladi. Natijalarni ko'rsatish. Dastur alohida usulni chaqirishi kerak, bu esa yo'q
argumentlar kiritadi va Coin raqamidan qiymat qaytaradi (HEADS va TAILS). [Eslatma: Agar dastur haqiqatga to'g'ri kelsa
tanga tashlashni taqlid qiladi, tanganing har bir tomoni vaqtning yarmida paydo bo'lishi kerak.]
6.30 (Raqamni toping) “Raqamni taxmin qiling” quyidagi tarzda o‘ynaydigan dastur yozing: Sizning
dastur 1 dan 1000 gacha bo'lgan oraliqdagi tasodifiy butun sonni tanlab, taxmin qilinadigan sonni tanlaydi.
Ilova 1 dan 1000 gacha bo'lgan raqamni taxmin qilish taklifini ko'rsatadi. O'yinchi birinchi raqamni kiritadi.
taxmin qiling. Agar o'yinchining taxmini noto'g'ri bo'lsa, dasturingiz juda baland ko'rsatishi kerak. Qayta urinib ko'ring. yoki ham
past. Qayta urinib ko'ring. o'yinchiga to'g'ri javobda "nolga" yordam berish. Dastur so'rashi kerak
keyingi taxmin uchun foydalanuvchi. Foydalanuvchi to'g'ri javobni kiritganida, tabriklar ekranini ko'rsating. Siz
raqamni taxmin qildim! va foydalanuvchiga yana oʻynashni tanlashiga ruxsat bering. [Izoh: taxmin qilish texnologiyasi-
Ushbu muammoda qo'llaniladigan nique ikkilik qidiruvga o'xshaydi, bu 19-bobda muhokama qilinadi,
Qidiruv, saralash va katta O.]
6.31 (Raqamning o'zgarishini taxmin qiling) 6.30-mashq dasturini sonlarni hisoblash uchun o'zgartiring.
o'yinchining taxminlari. Agar raqam 10 yoki undan kam bo'lsa, Yoki siz sirni bilasiz
yoki omadingiz bor! Agar o'yinchi 10 ta urinishda raqamni taxmin qilsa, Aha! Siz sirni bilasiz!
Agar o'yinchi 10 dan ortiq taxmin qilsa, ko'rsating Siz yaxshiroq qila olishingiz kerak! Nega kerak
10 tadan ko'p taxmin qilmaysizmi? Xo'sh, har bir "yaxshi taxmin" bilan o'yinchi bartaraf etishi kerak
raqamlarning yarmi, keyin qolgan raqamlarning yarmi va boshqalar.
6.32 (Nuqtalar orasidagi masofa) Ikki orasidagi masofani hisoblash uchun masofani yozish usuli
nuqtalar (x1, y1) va (x2, y2). Barcha raqamlar va qaytariladigan qiymatlar double turida bo'lishi kerak. Birlashtirish
bu usul foydalanuvchiga nuqtalar koordinatalarini kiritish imkonini beruvchi dasturga kiritiladi.
6.33 (Craps o'yinini o'zgartirish) Gambling o'ynashga ruxsat berish uchun 6.8-rasmdagi craps dasturini o'zgartiring. Ini-
o'zgaruvchan bank Balansni 1000 dollarga tenglashtiring. O'yinchiga pul tikishni taklif qiling. Bu tikishni tekshiring
bankBalance dan kam yoki unga teng bo'lsa, agar u bo'lmasa, foydalanuvchidan haqiqiy tikish bo'lgunga qadar tikishni qayta kiriting.
kiritiladi. Keyin, bitta craps o'yinini boshqaring. Agar o'yinchi g'alaba qozonsa, pul tikish orqali bank balansini oshiring va o'chiring.
yangi bank Balance o'ynang. Agar o'yinchi yutqazsa, pul tikish orqali bank balansini kamaytiring, yangi bankni ko'rsating-
Balans, bank Balans nolga aylanganligini tekshiring va agar shunday bo'lsa, "Kechirasiz. Siz" xabarini ko'rsating.
Busted!" O'yin davom etar ekan, turli xil xabarlarni ko'rsating, masalan, "Oh, suhbat" yaratish.
siz buzilib ketmoqchisiz, ha?" yoki "Voy, imkoniyatni qo'llang!" yoki "Siz kattasan. Endi vaqt
chipslaringizni naqd qilish uchun!”
ko'rsatish uchun string.
6.34 (Ikkilik, sakkizlik va o'n oltilik raqamlar jadvali) ni ko'rsatadigan dastur yozing.
1 diapazonidagi o'nlik sonlarning ikkilik, sakkizlik va o'n oltilik ekvivalentlari jadvali
orqali 256. Agar siz ushbu sanoq tizimlari bilan tanish bo'lmasangiz, avval J ilovasini onlayn o'qing.
Farq qilish
Kompyuter narxining pasayishi bilan, iqtisodiy sharoitlardan qat'i nazar, bu har bir talaba uchun mumkin bo'ladi.
kompyuterga ega bo'lish va uni maktabda ishlatish. Bu yaxshilash uchun ajoyib imkoniyatlar yaratadi
Keyingi beshta mashq taklif qilganidek, butun dunyo bo'ylab barcha talabalarning ta'lim tajribasi. [Eslatma:
“Bolaga bitta noutbuk” loyihasi (www.laptop.org) kabi tashabbuslarni ko‘rib chiqing. Shuningdek, tadqiqot
"Yashil" noutbuklar - bu qurilmalarning asosiy "yashil" xususiyatlari qanday? ga qarang
Elektron mahsulotni atrof-muhitni baholash vositasi (www.epeat.net), bu sizga baholashga yordam beradi
Ish stollari, noutbuklar va monitorlarning “yashilligi” qaysi mahsulotlarni sotib olishni tanlashga yordam beradi.
ketidan quvmoq.]
6.35 (Kompyuter yordamida o'qitish) Ta'limda kompyuterlardan foydalanish com- deb ataladi.
puter-assisted instruction (CAI). Boshlang'ich sinf o'quvchisiga o'rganishga yordam beradigan dastur yozing

242 6-bob Usullar: Chuqurroq qarash



ko'paytirish. Ikkita musbat bir xonali butun son hosil qilish uchun SecureRandom obyektidan foydalaning. Dastur
keyin foydalanuvchiga savol berishi kerak, masalan
6 karra 7 ni qancha bo'ladi?
Keyin talaba javobni kiritadi. Keyin dastur talabaning javobini tekshiradi. To'g'ri bo'lsa,
"Juda yaxshi!" xabarini ko'rsating. va yana ko'paytirish savolini bering. Agar javob noto'g'ri bo'lsa,
"Yo'q. Iltimos, qayta urinib ko'ring" degan xabarni ko'rsating. va talabaga bir xil savolni qayta-qayta berishga ruxsat bering
talaba nihoyat to'g'ri tushunmaguncha. Har bir yangi savolni yaratish uchun alohida usuldan foydalanish kerak.
tion. Ushbu usul ilova ishga tushirilganda va har safar ishga tushirilganda bir marta chaqirilishi kerak
foydalanuvchi savolga to'g'ri javob beradi.
6.36 (Kompyuter yordamida o'qitish: Talabalarning charchoqlarini kamaytirish) CAI muhitidagi bitta muammo -
Bu talabalarning charchashidir. Buni kompyuterning o'qishni ushlab turish uchun javoblarini o'zgartirish orqali kamaytirish mumkin.
dentning e'tibori. 6.35-mashq dasturini turli izohlar ko'rsatiladigan tarzda o'zgartiring
har bir javob quyidagicha:
To'g'ri javobga mumkin bo'lgan javoblar:
Juda yaxshi!
Ajoyib!
Yaxshi ish!
Yaxshi ishlashda davom eting!
Noto'g'ri javobga mumkin bo'lgan javoblar:
Yoʻq. Qayta urinib koʻring.
Noto'g'ri. Yana bir marta urinib ko'ring.
Taslim bo'lmang!
Yo'q. Urinishda davom eting.
Tanlash uchun ishlatiladigan 1 dan 4 gacha bo'lgan raqamni tanlash uchun tasodifiy sonlarni yaratishdan foydalaning
har bir toʻgʻri yoki notoʻgʻri javobga toʻrtta mos javobdan biri. switch iborasidan foydalaning
javoblarni chiqaring.
6.37 (Kompyuter yordamida o'qitish: Talabalar faoliyatini monitoring qilish) yanada murakkab
kompyuter yordamida o‘qitish tizimlari ma’lum vaqt davomida talabaning ish faoliyatini nazorat qiladi. The
Yangi mavzuni boshlash qarori ko'pincha talabaning oldingi mavzular bilan erishgan muvaffaqiyatiga asoslanadi. O'zgartirish
tomonidan yozilgan to'g'ri va noto'g'ri javoblar sonini hisoblash uchun 6.36-mashq dasturi.
talaba. Talaba 10 ta javobni yozgandan so'ng, dasturingiz ularning foizini hisoblashi kerak
to'g'ri. Agar foiz 75% dan past bo'lsa, "Iltimos, o'qituvchingizdan qo'shimcha yordam so'rang" ni ko'rsating.
keyin dasturni boshqa talaba sinab ko'rishi uchun qayta o'rnating. Agar foiz 75% yoki undan yuqori bo'lsa, ko'rsatish
"Tabriklaymiz, siz keyingi bosqichga o'tishga tayyormiz!", keyin dasturni boshqasiga o'rnating
talaba sinab ko'rishi mumkin.
6.38 (Kompyuter yordamida oʻqitish: qiyinchilik darajalari) 6.35–6.37-mashqlar kommutatsiyani ishlab chiqdi.
Boshlang'ich maktab o'quvchilariga ko'paytirishni o'rgatishda yordam beradigan o'quv dasturi. Mod-
dasturni foydalanuvchiga qiyinchilik darajasiga kirishga ruxsat berish. 1 qiyinchilik darajasida, dastur
masalalarda faqat bitta xonali raqamlardan foydalanish kerak; qiyinchilik darajasida 2, kabi katta raqamlar
ikki raqam va boshqalar.
6.39 (Kompyuter yordamida ko'rsatma: Muammolar turlarini o'zgartirish) Dasturni o'zgartirish.
6.38-mashq foydalanuvchiga o'rganish uchun arifmetik masala turini tanlash imkonini beradi. Variant 1 degani
faqat qo'shish masalalari, 2 faqat ayirish masalalari, 3 faqat ko'paytirish masalalari,
4 - faqat bo'linish muammolari va 5 - bu barcha turdagi tasodifiy aralashmani anglatadi.

Massivlar va massivlar roʻyxati 7


Boshidan boshlang, ... va
oxirigacha davom eting:
keyin to'xtating.
- Lyuis Kerroll
Ortiqcha o'tish, xuddi shunday noto'g'ri
qisqarish.
— Konfutsiy
Oh maqsadlar
Ushbu bobda siz:
■ Massivlar nima ekanligini bilib oling.
■ Ma'lumotlarni saqlash uchun massivlardan foydalaning
va ro'yxatlardan ma'lumotlarni olish
va qiymatlar jadvallari.
■ Massivlarni e'lon qilish, ishga tushirish
massivlar va individualga murojaat qiling
massivlar elementlari.
■ bilan massivlar orqali takrorlash
bayonot uchun kengaytirilgan.
■ Massivlarni usullarga o'tkazish.
■ E'lon qilish va manipulyatsiya qilish
ko'p o'lchovli massivlar.
■ O'zgaruvchan uzunlikdagi argumentdan foydalaning
ro'yxatlar.
■ Buyruqlar qatorini o'qing
argumentlarni dasturga kiriting.
■ Ob'ektga yo'naltirilgan yaratish
o'qituvchi sinf kitobi.
■ Umumiy massivni bajaring
bilan manipulyatsiyalar
Massivlar sinfining usullari.
■ ArrayList sinfidan foydalaning
dinamik tarzda manipulyatsiya qilish
massivga o'xshash o'lchamdagi ma'lumotlar
tuzilishi.

244 7-bob Massivlar va massivlar ro‘yxati

7.1 Kirish
Ushbu bobda ma'lumotlar tuzilmalari - tegishli ma'lumotlar elementlari to'plami taqdim etiladi. Massiv obyektlari
bir xil turdagi tegishli ma'lumotlar elementlaridan tashkil topgan ma'lumotlar tuzilmalari. Massivlar uni o'tkazishga imkon beradi
bog'liq qadriyatlar guruhlarini qayta ishlashga to'g'ri kelmaydi. Massivlar yaratilgandan keyin bir xil uzunlikda qoladi.
berilgan. Biz 16–21-boblarda maʼlumotlar tuzilmalarini chuqur oʻrganamiz.
Massivlar qanday e'lon qilinishi, yaratilishi va ishga tushirilishini muhokama qilgandan so'ng, biz amaliy narsalarni taqdim etamiz
umumiy massiv manipulyatsiyalarini ko'rsatadigan misollar. Biz Java-ning istisnosini kiritamiz -
ishlov berish mexanizmini o'rnating va undan dastur urinishda davom etishiga ruxsat berish uchun foydalaning
mavjud bo'lmagan massiv elementiga kirish uchun. Shuningdek, biz ko'rib chiqadigan misolni taqdim etamiz
Massivlar karta o'yinida o'yin kartalarini aralashtirish va o'ynashni taqlid qilishga qanday yordam berishi mumkin
ilova. Biz Java-ning kengaytirilgan for bayonotini taqdim etamiz, bu dasturga kirish imkonini beradi
Massivdagi ma'lumotlar, taqdim etilgan qarshi boshqariladigan bayonotga qaraganda osonroq
5.3-bo'limda. Biz massivlardan foydalanadigan instruktor GradeBook amaliy tadqiqotining ikkita versiyasini yaratamiz
o‘quvchilar baholari to‘plamini xotirada saqlash va o‘quvchilar baholarini tahlil qilish. Biz qanday qilishni ko'rsatamiz
o'zgaruvchan uzunlikdagi argumentlar ro'yxatidan turli xil raqamlar bilan chaqirilishi mumkin bo'lgan usullarni yaratish uchun foydalaning.
argumentlar va biz buyruq qatori argumentlarini usulda qanday qayta ishlashni ko'rsatamiz
asosiy. Keyinchalik, sinfning statik usullari bilan bir nechta umumiy massiv manipulyatsiyalarini taqdim etamiz
java.util paketidagi massivlar.
Keng tarqalgan bo'lsa-da, massivlar cheklangan imkoniyatlarga ega. Masalan, kerak
massiv oʻlchamini belgilang va agar bajarilish vaqtida uni oʻzgartirmoqchi boʻlsangiz, buni amalga oshirishingiz kerak.
yangi massiv yaratish. Ushbu bobning oxirida biz Java-ning oldindan tuzilgan ma'lumotlaridan birini taqdim etamiz

7.1 Kirish


7.2 Massivlar
7.3 Massivlarni e’lon qilish va yaratish
7.4 Massivlardan foydalanishga misollar
7.4.1 Massivni yaratish va ishga tushirish
7.4.2 Massiv initializerdan foydalanish
7.4.3 Saqlash uchun qiymatlarni hisoblash
Massiv
7.4.4 Massiv elementlarini yig'ish
7.4.5 Massivni ko'rsatish uchun chiziqli diagrammalardan foydalanish
Grafik ma'lumotlar
7.4.6 Massiv elementlaridan sifatida foydalanish
Hisoblagichlar
7.4.7 So'rov natijalarini tahlil qilish uchun massivlardan foydalanish
7.5 Istisnolarni qayta ishlash: qayta ishlash
Noto'g'ri javob
7.5.1 Sinab ko'rish bayonoti
7.5.2 Tutish blokini bajarish
7.5.3 Istisnoning String usuli
Parametr
7.6 Case Study: Kartani aralashtirish va
Dialing simulyatsiyasi

7.7 Bayonot uchun kengaytirilgan


7.8 Massivlarni metodlarga o‘tkazish
7.9 Pass-by-value va boshqalar
7.10 Case Study: Sinf Baho kitobidan foydalanish
Baholarni saqlash uchun massiv
7.11 Ko'p o'lchovli massivlar
7.12 Case Study: Sinf Baho kitobidan foydalanish
Ikki o'lchovli massiv
7.13 O'zgaruvchan uzunlikdagi argumentlar ro'yxati
7.14 Buyruqlar qatori argumentlaridan foydalanish
7.15 Sinf massivlari
7.16 To'plamlar va sinfga kirish
ArrayList
7.17 (ixtiyoriy) GUI va grafik ishi
O'rganish: Yoylarni chizish
7.18 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar |


Maxsus bo'lim: O'z kompyuteringizni yaratish | Farq qilish

7.2 245-massivlar

Java API to'plami sinflaridan tuzilmalar. Ular an'anaviyga qaraganda ko'proq imkoniyatlarni taklif qiladi.
tional massivlar. Ular qayta foydalanish mumkin, ishonchli, kuchli va samarali. Biz e'tiborni ArrayList-ga qaratamiz
yig'ish. ArrayLists massivlarga o'xshaydi, lekin qo'shimcha funktsiyalarni ta'minlaydi, masalan
ko'proq yoki kamroq elementlarni joylashtirish uchun kerak bo'lganda dinamik o'lchamlarni o'zgartirish.

Java SE 8


17-bob, Java SE 8 Lambdas va Streamsni oʻqib chiqqaningizdan soʻng siz uni qaytadan oʻrnatishingiz mumkin boʻladi.
7-bobning ko'plab misollari yanada ixcham va oqlangan tarzda va shu tarzda
bugungi ko'p yadroli tizimlarda ishlashni yaxshilash uchun ularni parallellashtirishni osonlashtiradi.
7.2 Massivlar
Massiv - barcha qiymatlarni o'z ichiga olgan o'zgaruvchilar guruhi (elementlar yoki komponentlar deb ataladi).
bir xil turga ega. Massivlar ob'ektlardir, shuning uchun ular mos yozuvlar turlari hisoblanadi. Tez orada bo'lganidek
Qarang, biz odatda massiv deb o'ylaydigan narsa aslida xotiradagi massiv ob'ektiga havoladir.
or. Massivning elementlari ibtidoiy turlar yoki mos yozuvlar turlari (jumladan, massivlar,
7.11-bo'limda ko'rib chiqamiz). Massivdagi muayyan elementga murojaat qilish uchun biz ni belgilaymiz
massivga havola nomi va massivdagi elementning joylashuv raqami. The
elementning joylashuv raqami element indeksi yoki pastki belgisi deb ataladi.

Mantiqiy massivni ko'rsatish


7.1-rasmda c deb nomlangan butun sonli massivning mantiqiy tasviri ko'rsatilgan. Ushbu massivni o'z ichiga oladi
12 element. Dastur massivga kirish ifodasi bilan ushbu elementlarning istalgan biriga ishora qiladi
Bu massiv nomini va undan keyin ma'lum element indeksini o'z ichiga oladi
kvadrat qavslar ([]). Har bir massivdagi birinchi element indeks nolga ega va ba'zan bo'ladi
nolinchi element deb ataladi. Shunday qilib, c massivning elementlari c[0], c[1], c[2] va hokazo.
c massivdagi eng yuqori indeks 11 ni tashkil etadi, bu 12 dan 1 ga kam - bu massivdagi elementlar soni
massiv. Massiv nomlari boshqa o‘zgaruvchilar nomlari bilan bir xil konventsiyalarga amal qiladi.

7.1-rasm | 12 elementli massiv.

-45

62
-3


1
6453
78

0

-89



1543

72

0



6

c[ 0 ]


Massiv nomi (c)

ning indeksi (yoki pastki belgisi).

c[ 7 ]
c[ 8 ]
c[ 9 ]
c[ 10 ]
c[ 11 ]

c[ 6 ]


c[ 5 ]

c[ 4 ]


c[ 3 ]

c[ 2 ]


c[ 1 ]

massivdagi element c


246 7-bob Massivlar va massivlar ro‘yxati

Indeks manfiy bo'lmagan butun son bo'lishi kerak. Dastur ifodadan indeks sifatida foydalanishi mumkin.
Misol uchun, agar a o'zgaruvchisi 5, b o'zgaruvchisi 6 deb faraz qilsak, u holda bayonot

c[11] massiv elementiga 2 qo‘shadi. Indekslangan massiv nomi massivga kirish ifodasidir, qaysi


massiv elementiga yangi qiymatni joylashtirish uchun topshiriqning chap tomonida foydalanish mumkin.

7.1-rasmdagi c massivni batafsil ko'rib chiqamiz. Massivning nomi c. Har bir massiv


ob'ekt o'z uzunligini biladi va uni uzunlik namunasi o'zgaruvchisida saqlaydi. Ifodasi
c.length c massiv uzunligini qaytaradi. Massivning uzunlik namunasi o'zgaruvchisi bo'lsa ham
ommaviy, uni o'zgartirib bo'lmaydi, chunki u yakuniy o'zgaruvchidir. Bu massivning 12 ta elementi
c[0], c[1], c[2], …, c[11] deb ataladi. c[0] qiymati -45, c[1] qiymati
6, c[2] qiymati 0, c[7] qiymati 62 va c[11] qiymati 78. Hisoblash uchun
c massivning dastlabki uchta elementidagi qiymatlar yig'indisi va natijani saqlang
o'zgaruvchan summada yozamiz

c[6] qiymatini 2 ga bo'lish va natijani x o'zgaruvchiga belgilash uchun biz yozamiz

7.3 Massivlarni e’lon qilish va yaratish
Massiv obyektlari xotirada joy egallaydi. Boshqa ob'ektlar singari, massivlar ham kalit so'z bilan yaratiladi
yangi. Massiv obyektini yaratish uchun siz massiv elementlarining turini va sonini ko'rsatasiz
new kalit so'zidan foydalanadigan massiv yaratish ifodasining bir qismi sifatida elementlarning. Bunday ifoda-
sion massiv o'zgaruvchisida saqlanishi mumkin bo'lgan havolani qaytaradi. Quyidagi deklaratsiya
va massiv yaratish ifodasi 12 ta int elementdan iborat massiv obyektini yaratadi va saqlaydi
c nomli massiv o'zgaruvchisidagi massiv havolasi:

Bu ifoda 7.1-rasmdagi massivni yaratish uchun ishlatilishi mumkin. Massiv yaratilganda, har bir


uning elementlari standart qiymatni oladi - raqamli ibtidoiy turdagi elementlar uchun nolga,
mantiqiy elementlar uchun false va havolalar uchun null. Tez orada ko'rib turganingizdek, siz taqdim eta olasiz
massiv yaratishda standart bo'lmagan element qiymatlari.
7.1-rasmdagi massivni yaratish ham quyidagi tarzda ikki bosqichda bajarilishi mumkin:

Deklaratsiyada turdan keyingi kvadrat qavslar c ning o'zgaruvchi ekanligini ko'rsatadi


massivga murojaat qiladi (ya'ni, o'zgaruvchi massiv havolasini saqlaydi). Topshiriq holatida -
c massiv o'zgaruvchisi 12 int elementdan iborat yangi massivga havolani oladi.

c[a + b] += 2;

Umumiy dasturlash xatosi 7.1
Indeks int qiymati yoki int ga ko'tarilishi mumkin bo'lgan turdagi qiymat bo'lishi kerak, ya'ni,
bayt, qisqa yoki char, lekin uzoq emas; aks holda kompilyatsiya xatosi yuzaga keladi.

yig'indisi = c[0] + c[1] + c[2];

x = c[6] / 2;

int[] c = new int[12];

int[] c; // massiv o'zgaruvchisini e'lon qilish
c = new int[12]; // massiv yaratish; massiv o'zgaruvchisiga tayinlang

Umumiy dasturlash xatosi 7.2


Massiv deklaratsiyasida kvadrat qavs ichidagi elementlar sonini ko'rsatadi
deklaratsiya (masalan, int[12] c;) sintaktik xatodir.

7.4 Massivlardan foydalanishga misollar 247

Dastur bitta deklaratsiyada bir nechta massivlarni yaratishi mumkin. Quyidagi deklaratsiya
b uchun 100 ta element va x uchun 27 ta element saqlaydi:

Massivning turi va kvadrat qavslar boshida birlashtirilganda


deklaratsiya, deklaratsiyadagi barcha identifikatorlar massiv o'zgaruvchilari. Bunday holda, o'zgaruvchilar b
va x String massivlariga ishora qiladi. O'qish uchun biz har bir deklaratsiyada faqat bitta o'zgaruvchini e'lon qilishni afzal ko'ramiz.
laratsiya. Oldingi deklaratsiya quyidagilarga teng:

Har bir deklaratsiyada faqat bitta o'zgaruvchi e'lon qilinganda, kvadrat qavslar bo'lishi mumkin


turidan keyin yoki massiv oʻzgaruvchi nomidan keyin joylashtiriladi, masalan:

lekin kvadrat qavslarni turdan keyin qo'yish afzaldir.

Dastur har qanday turdagi massivlarni e'lon qilishi mumkin. Primitiv tipdagi massivning har bir elementi
massivning e'lon qilingan element turining qiymatini oladi. Xuddi shunday, mos yozuvlar turidagi massivda,
har bir element massivning e'lon qilingan element turidagi ob'ektga havoladir. Masalan,
int massivining har bir elementi int qiymati va String massivining har bir elementi ref-
String ob'ektiga o'tish.
7.4 Massivlardan foydalanishga misollar
Ushbu bo'limda massivlarni e'lon qilish, massivlarni yaratish,
massivlarni ishga tushirish va massiv elementlarini manipulyatsiya qilish.
7.4.1 Massivni yaratish va ishga tushirish
7.2-rasm ilovasida 10 ta int elementli massiv yaratish uchun new kalit so‘zidan foydalaniladi.
dastlab nolga teng (int o'zgaruvchilari uchun standart boshlang'ich qiymat). 9-qator massivni e'lon qiladi - ref-
erence int elementlar massiviga murojaat qila oladi - keyin o'zgaruvchini ishga tushiradi
10 ta int elementni o'z ichiga olgan massiv ob'ektiga havola. 11-qator ustunni chiqaradi
sarlavhalar. Birinchi ustunda har bir massiv elementining indeksi (0-9), ikkinchisida esa mavjud
ustun har bir massiv elementining standart boshlang'ich qiymatini (0) o'z ichiga oladi.

String[] b = new String[100], x = new String[27];

String[] b = new String[100]; // b massivini yarating
String[] x = new String[27]; // x massivini yarating
Yaxshi dasturlash amaliyoti 7.1
O'qish uchun har bir deklaratsiyada faqat bitta o'zgaruvchini e'lon qiling. Har bir deklaratsiyani sentyabr oyida saqlang
arate liniyasi va e'lon qilinayotgan o'zgaruvchini tavsiflovchi izohni qo'shing.

String b[] = new String[100]; // b massivini yarating


String x[] = new String[27]; // x massivini yarating

Umumiy dasturlash xatosi 7.3


Bitta deklaratsiyada bir nechta massiv o'zgaruvchilarini e'lon qilish nozik xatolarga olib kelishi mumkin. O'ylab ko'ring
deklaratsiya int[] a, b, c;. Agar a, b va c massiv o'zgaruvchilari sifatida e'lon qilinishi kerak bo'lsa, bu
deklaratsiya to'g'ri - to'g'ridan-to'g'ri turdan keyin kvadrat qavs qo'yish hammasini bildiradi
deklaratsiyadagi identifikatorlar massiv o'zgaruvchilari. Biroq, agar faqat a bo'lishi uchun mo'ljallangan bo'lsa
massiv o'zgaruvchisi va b va c alohida int o'zgaruvchilari bo'lish uchun mo'ljallangan bo'lsa, bu deklaratsiya-
tion noto'g'ri — deklaratsiya int a[], b, c; kerakli natijaga erishadi.

248 7-bob Massivlar va massivlar ro‘yxati

For bayonoti (14-15-qatorlar) indeksni (hisoblagich bilan ifodalangan) va qiymatni chiqaradi
massivning har bir elementi (massiv[hisoblagich] bilan ifodalanadi). Boshqaruv o'zgaruvchisi hisoblagichi dastlab
0 - indeks qiymatlari 0 dan boshlanadi, shuning uchun nolga asoslangan hisoblashdan foydalanish tsiklga har bir elementga kirish imkonini beradi.
massivning menti. for ning sikl davom etish sharti array.length ifodasidan foydalanadi
(14-satr) massiv uzunligini aniqlash uchun. Ushbu misolda massiv uzunligi 10 ga teng,
shuning uchun nazorat o'zgaruvchisi hisoblagichining qiymati dan kichik bo'lsa, sikl ishlashni davom ettiradi
10. 10 elementli massivning eng yuqori indeks qiymati 9 ga teng, shuning uchun kichik operatordan foydalanish
tsiklni davom ettirish sharti tsiklning elementga kirishga harakat qilmasligini kafolatlaydi
massivning oxiridan tashqarida (ya'ni, tsiklning oxirgi iteratsiyasi paytida hisoblagich 9 ga teng). Biz qilamiz
Tez orada Java bajarilish vaqtida bunday chegaradan tashqari indeksga duch kelganida nima qilishini ko'ring.
7.4.2 Massiv initializerdan foydalanish
Siz massiv yaratishingiz va uning elementlarini massiv initsializatori - vergul-sep- bilan boshlashingiz mumkin.
Qavslar ichiga olingan ifodalar ro'yxati (initsializator ro'yxati deb ataladi). Bunday holda, massiv
uzunlik boshlang'ich ro'yxatidagi elementlar soni bilan belgilanadi. Masalan,

indeks qiymatlari 0-4 bo'lgan besh elementli massivni yaratadi. n[0] elementi 10, n[1] ga ishga tushirildi


20 ga ishga tushiriladi va hokazo. Kompilyator massiv deklaratsiyasiga duch kelganida,

1 // 7.2-rasm: InitArray.java


2 // Massiv elementlarini standart nol qiymatlariga ishga tushirish.
3
4 ommaviy sinf InitArray
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8
9
10
11 System.out.printf("%s%8s%n", "Indeks", "Qiymat"); // ustun sarlavhalari
12
13
14
15
16 }
17 } // InitArray klassi

Indeks qiymati


0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0

7.2-rasm | Massiv elementlarini nolning standart qiymatlariga ishga tushirish.

int[] n = { 10, 20, 30, 40, 50 };

// o'zgaruvchan massivni e'lon qiling va uni massiv ob'ekti bilan ishga tushiring


int[] massivi = new int[10]; // massiv obyektini yarating

// har bir massiv elementining qiymatini chiqarish


for (int counter = 0; counter < array.length; counter++)
System.out.printf("%5d%8d%n", hisoblagich, massiv[hisoblagich]);

7.4 Massivlardan foydalanishga misollar 249

ishga tushiruvchilar ro'yxatini o'z ichiga oladi, o'lchamni aniqlash uchun ro'yxatdagi ishga tushiruvchilar sonini hisoblaydi
massivni tanlang, so'ngra "sahna ortida" tegishli yangi operatsiyani o'rnatadi.
7.3-rasmdagi ilova 10 ta qiymatli (9-qator) butun sonli massivni ishga tushiradi va dis-
massivni jadval formatida o'ynaydi. Massiv elementlarini ko'rsatish uchun kod (14-15 qatorlar)
7.2-rasmdagi bilan bir xil (15-16-qatorlar).

7.4.3 Massivda saqlash uchun qiymatlarni hisoblash


7.4-rasmdagi dastur 10 elementli massiv hosil qiladi va har bir elementga quyidagilardan birini tayinlaydi.
2 dan 20 gacha bo'lgan juft butun sonlar (2, 4, 6, …, 20). Keyin dastur qatorni ko'rsatadi
jadval formati. 12–13 qatorlardagi for bayonoti massiv elementining qiymatini hisoblab chiqadi
nazorat o'zgaruvchisi hisoblagichining joriy qiymatini 2 ga ko'paytirish, keyin 2 ni qo'shish.

1 // 7.3-rasm: InitArray.java


2 // Massiv elementlarini massiv initsializer yordamida ishga tushirish.
3
4 ommaviy sinf InitArray
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8
9
10
11 System.out.printf("%s%8s%n", "Indeks", "Qiymat"); // ustun sarlavhalari
12
13 // har bir massiv elementining qiymatini chiqarish
14 uchun (int counter = 0; counter < array.length; counter++)
15 System.out.printf("%5d%8d%n", hisoblagich, massiv[counter]);
16
17 } // InitArray klassi

Indeks qiymati


0 32
1 27
2 64
3 18
4 95
5 14
6 90
7 70
8 60
9 37

7.3-rasm | Massivning elementlarini massiv initsializer bilan ishga tushirish.

1 // 7.4-rasm: InitArray.java
2 // Massiv elementlariga joylashtiriladigan qiymatlarni hisoblash.
3
4 ommaviy sinf InitArray
5 {

7.4-rasm | Massiv elementlariga joylashtiriladigan qiymatlarni hisoblash. (2-qismning 1-qismi.)

// ishga tushirish ro'yxati har bir element uchun boshlang'ich qiymatni belgilaydi
int[] massiv = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37};

250 7-bob Massivlar va massivlar ro‘yxati

8-qator ARRAY_LENGTH doimiy o‘zgaruvchisini e’lon qilish uchun final modifikatoridan foydalanadi.
qiymat 10. Doimiy o'zgaruvchilar foydalanishdan oldin ishga tushirilishi kerak va ularni o'zgartirib bo'lmaydi
keyin. Agar siz yakuniy o'zgaruvchini deklaratsiyada ishga tushirilgandan keyin o'zgartirishga harakat qilsangiz,
kompilyator xato xabari chiqaradi

6 ta umumiy statik bekor asosiy(String[] args)


7 {
8
9
10
11 // har bir massiv elementi uchun qiymatni hisoblash
12 uchun (int counter = 0; counter < array.length; counter++)
13
14
15 System.out.printf("%s%8s%n", "Indeks", "Qiymat"); // ustun sarlavhalari
16
17 // har bir massiv elementining qiymatini chiqarish
18 uchun (int counter = 0; counter < array.length; counter++)
19 System.out.printf("%5d%8d%n", hisoblagich, massiv[counter]);
20 }
21 } // InitArray klassi

Indeks qiymati


0 2
1 4
2 6
3 8
4 10
5 12
6 14
7 16
8 18
9 20

variableName yakuniy oʻzgaruvchisiga qiymat bera olmaydi


Yaxshi dasturlash amaliyoti 7.2
Doimiy o'zgaruvchilarga nomli konstantalar ham deyiladi. Ular ko'pincha ko'proq dasturlar yaratadilar
literal qiymatlardan foydalanadigan dasturlarga qaraganda o'qilishi mumkin (masalan, 10) - kabi nomlangan doimiy
ARRAY_LENGTH uning maqsadini aniq ko'rsatib turibdi, so'zma-so'z qiymati esa boshqacha bo'lishi mumkin
uning kontekstiga asoslangan ma'nolar.

Yaxshi dasturlash amaliyoti 7.3


Ko'p so'zli konstantalarda har bir so'z keyingisidan un- belgisi bilan ajratilishi kerak.
ARRAY_LENGTHda bo'lgani kabi (_)

Umumiy dasturlash xatosi 7.4


Yakuniy o'zgaruvchiga qiymatni u ishga tushirilgandan so'ng belgilash kompilyatsiya xatosidir.
Xuddi shunday, ishga tushirilgunga qadar yakuniy o'zgaruvchining qiymatiga kirishga urinish natija beradi
"variableName o'zgaruvchisi ishga tushirilmagan bo'lishi mumkin" kabi kompilyatsiya xatosi.

7.4-rasm | Massiv elementlariga joylashtiriladigan qiymatlarni hisoblash. (2-qismning 2-qismi.)

yakuniy int ARRAY_LENGTH = 10; // doimiylikni e'lon qilish
int[] massiv = yangi int[ARRAY_LENGTH]; // massiv yaratish

massiv[hisoblagich] = 2 + 2 * hisoblagich;


7.4 Massivlardan foydalanishga misollar 251

7.4.4 Massiv elementlarini yig'ish
Ko'pincha massivning elementlari hisoblashda foydalaniladigan qiymatlar qatorini ifodalaydi. Agar,
masalan, ular imtihon baholarini ifodalaydi, professor elementlarni jamlashni xohlashi mumkin
massiv va imtihon uchun o'rtacha sinfni hisoblash uchun ushbu summadan foydalaning. GradeBook misollari
Shakllarda. 7.14 va 7.18 ushbu texnikadan foydalanadi.
7.5-rasmda 10 elementli butun massivdagi qiymatlar jamlangan. Dastur
8-satrdagi massivni e'lon qiladi, yaratadi va ishga tushiradi. For operatori hisob-kitoblarni amalga oshiradi.
munosabatlar. [Izoh: Massivni ishga tushiruvchilar sifatida taqdim etilgan qiymatlar ko'pincha dasturda o'qiladi
ishga tushirish ro'yxatida ko'rsatilganidan ko'ra. Masalan, ilova qiymatlarni dan kiritishi mumkin
foydalanuvchi yoki diskdagi fayldan (15-bobda muhokama qilinganidek, Fayllar, oqimlar va ob'ektlar seriyasi-
izatsiya). Ma'lumotlarni dasturga o'qish (dasturga "qo'lda kodlash" o'rniga)
dasturni qayta foydalanishga yaroqli qiladi, chunki u turli ma'lumotlar to'plamlari bilan ishlatilishi mumkin.]

7.4.5 Massiv ma'lumotlarini grafik ko'rsatish uchun chiziqli diagrammalardan foydalanish


Ko'pgina dasturlar foydalanuvchilarga ma'lumotlarni grafik tarzda taqdim etadi. Masalan, raqamli qiymatlar
ko'pincha shtrixli diagrammada chiziqlar sifatida ko'rsatiladi. Bunday diagrammada uzunroq chiziqlar mutanosiblikni ifodalaydi -
kattaroq raqamli qiymatlar. Raqamli ma'lumotlarni grafik ko'rsatishning oddiy usullaridan biri a
har bir raqamli qiymatni yulduzcha (*) chizig'i sifatida ko'rsatadigan chiziqli diagramma.
Professorlar ko'pincha imtihonda baholarning taqsimlanishini tekshirishni yaxshi ko'radilar. Professor
Baho displeyini tasavvur qilish uchun bir nechta toifalarning har biridagi baholar sonini grafikda ko'rsatishi mumkin.
azob. Aytaylik, imtihondagi baholar 87, 68, 94, 100, 83, 78, 85, 91, 76 va 87 bo'lgan.
Ularga bir baho 100, 90-yillarda ikkita, 80-yillarda to‘rtta, ikkita baho kiradi.
70-yillarda, 60-yillarda bitta baho va 60-dan past baholar yoʻq. Bizning keyingi arizamiz (7.6-rasm)
Ushbu darajadagi taqsimot ma'lumotlarini har biri mushukka mos keladigan 11 elementdan iborat massivda saqlaydi.
baholarning egoizmi. Masalan, massiv[0] 0–9 oralig'idagi baholar sonini ko'rsatadi,
massiv[7] 70–79 oralig'idagi baholar soni va massiv[10] 100 soni

1 // 7.5-rasm: SumArray.java


2 // Massiv elementlari yig'indisini hisoblash.
3
4 umumiy sinf SumArray
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 int[] massiv = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };
9 jami = 0;
10
11
12
13
14
15 System.out.printf("Masiv elementlarining umumiy soni: %d%n", jami);
16 }
17 } // oxirgi sinf SumArray

Massiv elementlarining umumiy soni: 849

7.5-rasm | Massiv elementlari yig‘indisini hisoblash.

// har bir element qiymatini jamiga qo'shing


for (int counter = 0; counter < array.length; counter++)
jami += massiv [hisoblagich];

252 7-bob Massivlar va massivlar ro‘yxati

baholar. Keyinchalik bobdagi GradeBook sinflari (7.14 va 7.18-rasmlar) quyidagi kodlarni o'z ichiga oladi.
baholar majmui asosida bu daraja chastotalarini hisoblab chiqadi. Hozircha biz qo'lda yaratamiz
berilgan sinf chastotalari bilan massiv.

Ilova massivdagi raqamlarni o'qiydi va ma'lumotni chiziq shaklida chizadi


diagramma. U har bir daraja diapazonini va undan keyin yulduzchalar qatorini ko'rsatadi
bu diapazondagi baholar. Har bir satrni belgilash uchun 16–20-qatorlar sinf oraligʻini chiqaradi (masalan, “70-79:”)
hisoblagichning joriy qiymatiga asoslanadi. Hisoblagich 10 bo'lsa, 17-qator 100 ni a bilan chiqaradi

1 // 7.6-rasm: BarChart.java


2 // Shtrixli diagrammani chop etish dasturi.
3
4 ommaviy sinf BarChart
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 int[] massivi = { 0, 0, 0, 0, 0, 0, 1, 2, 4, 2, 1 };
9
10 System.out.println("Baho taqsimoti:");
11
12 // har bir massiv elementi uchun diagramma satrini chiqaring
13 uchun (int counter = 0; counter < array.length; counter++)
14 {
15 // chiqish paneli yorlig'i ("00-09: ", ..., "90-99: ", "100:")
16 agar (hisoblagich == 10)
17 System.out.printf("%5d: ", 100);
yana 18
19 System.out.printf("%02d-%02d: ",
20 hisoblagich * 10, hisoblagich * 10 + 9);
21
22
23
24
25
26 System.out.println();
27 }
28 }
29 } // BarChart sinfini yakunlash

Baho taqsimoti:


00-09:
10-19:
20-29:
30-39:
40-49:
50-59:
60-69: *
70-79: **
80-89: ****
90-99: **
100: *

7.6-rasm | Chiziqli diagrammalarni chop etish dasturi.

// yulduzchalarni chop etish satri
uchun (int stars = 0; stars < array[counter]; stars++)
System.out.print("*");

7.4 Massivlardan foydalanishga misollar 253

“100:” yorlig‘ini boshqasi bilan tekislash uchun maydon kengligi 5, undan keyin ikki nuqta va bo‘sh joy qo‘ying
bar belgilari. Ichki joylashtirilgan for bayonoti (23–24-qatorlar) barlarni chiqaradi. Loop-con-ga e'tibor bering
23-qatorda davom etish sharti (yulduzlar < massiv [hisoblagich]). Har safar dastur yetib kelganida
ichki for, sikl 0 dan massiv [hisoblagich] gacha sanaladi, shuning uchun massivdagi qiymatdan foydalaniladi
ko'rsatiladigan yulduzchalar sonini aniqlash. Bu misolda hech bir talaba a ni olmagan
60 dan past baho, shuning uchun massiv[0]–massiv[5] nollarni o'z ichiga oladi va keyingi yulduzcha ko'rsatilmaydi
birinchi olti sinf oralig'iga. 19-satrda %02d format spesifikaci int qiymatini bildiradi
ikki raqamdan iborat maydon sifatida formatlanishi kerak. Format ko'rsatgichidagi 0 bayrog'i a ni ko'rsatadi
maydon kengligidan (2) kamroq raqamlarga ega bo'lgan qiymatlar uchun 0 yetakchisi.
7.4.6 Massiv elementlaridan hisoblagich sifatida foydalanish
Ba'zida dasturlar ma'lumotlarni umumlashtirish uchun hisoblagich o'zgaruvchilardan foydalanadi, masalan, sur'at natijalari
vey. 6.7-rasmda biz raqamni kuzatib borish uchun o'lik-rolling dasturimizda alohida hisoblagichlardan foydalandik
Dastur matritsani 6 000 000 marta aylantirganda olti qirrali matritsaning har bir tomonining paydo bo'lishi.
Ushbu ilovaning massiv versiyasi 7.7-rasmda ko'rsatilgan.

7.7-rasmda massiv chastotasi (10-qator) har bir tomonning sodir bo'lishini hisoblash uchun ishlatiladi.


o'lim. Ushbu dasturning 14-qatoridagi yagona bayonot 6.7-rasmning 22-45 qatorlarini almashtiradi. Chiziq

1 // 7.7-rasm: RollDie.java


2 // Kalit o'rniga massivlardan foydalangan holda o'chirish dasturi.
3 import java.security.SecureRandom;
4
5 ommaviy sinf RollDie
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 SecureRandom randomNumbers = yangi SecureRandom();
10 int[] chastotasi = yangi int[7]; // chastota hisoblagichlari massivi
11
12 // rulonli qolip 6 000 000 marta; chastota indeksi sifatida o'lim qiymatidan foydalaning
13 uchun (int roll = 1; roll <= 6000000; roll++)
14
15
16 System.out.printf("%s%10s%n", "Yuz", "Chastota");
17
18 // har bir massiv elementining qiymatini chiqarish
19 uchun (int face = 1; yuz 20 System.out.printf("%4d%10d%n", yuz, chastota[yuz]);
21 }
22 } // oxirgi sinf RollDie

Yuz chastotasi


1 999690
2 999512
3 1000575
4 999815
5 999781
6 1000627

7.7-rasm | Kalit o'rniga massivlar yordamida Die-rolling dasturi.

++chastota[1 + randomNumbers.nextInt(6)];

254 7-bob Massivlar va massivlar ro‘yxati

14 qaysi chastota elementi davomida ortishi kerakligini aniqlash uchun tasodifiy qiymatdan foydalanadi
tsiklning har bir iteratsiyasi. 14-qatordagi hisob 1 dan tasodifiy sonlarni ishlab chiqaradi
6, shuning uchun massiv chastotasi oltita hisoblagichni saqlash uchun etarlicha katta bo'lishi kerak. Biroq, biz a dan foydalanamiz
Biz chastotani [0] e'tiborsiz qoldiradigan yetti elementli massiv — yuzga ega bo'lish mantiqiyroq
qiymat 1 chastotani[1] chastotaga[0] ga nisbatan oshiradi. Shunday qilib, har bir nominal qiymat sifatida ishlatiladi
massiv chastotasi indeksi. 14-qatorda kvadrat qavs ichidagi hisob-kitob baholanadi
birinchi navbatda massivning qaysi elementini oshirish kerakligini aniqlash uchun, keyin ++ operatori bittasini qo'shadi
bu elementga. Shuningdek, biz 6.7-rasmdagi 49–51-chi qatorlarni massivlar boʻylab oʻtish orqali almashtirdik.
natijalarni chiqarish miqdori (19–20-qatorlar). Biz Java SE 8 ning yangi funktsional pro-
17-bobda grammatika imkoniyatlari, biz 13-14 va 19-20 qatorlarni qanday almashtirishni ko'rsatamiz
bitta bayonot bilan!

7.4.7 So'rov natijalarini tahlil qilish uchun massivlardan foydalanish


Keyingi misolimiz so'rovda to'plangan ma'lumotlarni umumlashtirish uchun massivlardan foydalanadi. Quyidagilarni ko'rib chiqing
muammo haqida bayonot:
Yigirma nafar talabadan 1 dan 5 gacha bo'lgan shkala bo'yicha ovqatlanish sifatini baholash so'ralgan
talabalar oshxonasi, 1 tasi “dahshatli” va 5 tasi “a’lo”. 20 ta javobni joylashtiring
butun sonli massivda va har bir reytingning chastotasini aniqlang.
Bu massivlarni qayta ishlash uchun odatiy dasturdir (7.8-rasm). Biz raqamlarni umumlashtirmoqchimiz -
Har bir turdagi javoblar soni (ya'ni 1-5). Massiv javoblari (9–10-qatorlar) 20 elementdan iborat
talabalarning so'rov javoblarini o'z ichiga olgan butun sonli massiv. Massivdagi oxirgi qiymat inten-
noto'g'ri javob (14). Java dasturi bajarilganda, massiv elementi indekslari
haqiqiyligi tekshiriladi - barcha indekslar 0 dan katta yoki teng va undan kichik bo'lishi kerak
massiv uzunligi. Ushbu indeks diapazonidan tashqaridagi elementga kirishga har qanday urinish natija beradi
ArrayIndexOutOfBoundsException deb nomlanuvchi ish vaqti xatosida. Oxirida
Ushbu bo'limda yaroqsiz javob qiymatini muhokama qilamiz, massiv chegaralarini tekshirishni ko'rsatamiz
va aniqlash uchun ishlatilishi mumkin bo'lgan Java-ning istisnolarni qayta ishlash mexanizmini joriy qiling
ArrayIndexOutOfBoundsException ni ishlating.

1 // 7.8-rasm: StudentPoll.java


2 // So'rovni tahlil qilish dasturi.
3
4 ommaviy sinf StudentPoll
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // talaba javob massivi (odatda, ish vaqtida kiritish)
9 ta int[] javob = { 1, 2, 5, 4, 3, 5, 2, 1, 3, 3, 1, 4, 3, 3, 3,
10 2, 3, 3, 2, 14 };
11
12
13
14
15
16

7.8-rasm | So'rovni tahlil qilish dasturi. (2-qismning 1-qismi.)

int[] chastotasi = new int[6]; // chastota hisoblagichlari massivi

// har bir javob uchun javoblar elementini tanlang va shu qiymatdan foydalaning


// o'sish uchun elementni aniqlash uchun chastota indeksi sifatida
uchun (int javob = 0; javob < answers.length; javob ++)
{

7.4 Massivlardan foydalanishga misollar 255

Chastota massivi
Biz olti elementli massiv chastotasidan foydalanamiz (11-qator) hodisalar sonini hisoblash uchun.
har bir javob. Har bir element so'rovning mumkin bo'lgan turlaridan biri uchun hisoblagich sifatida ishlatiladi.
sponses—chastotasi[1] ovqatni 1, chastotasi sifatida baholagan talabalar sonini hisoblaydi.
cy[2] ovqatni 2 deb baholagan talabalar sonini sanaydi va hokazo.
Natijalarni sarhisob qilish
For bayonoti (15–27-qatorlar) massiv javoblaridan olingan javoblarni birma-bir o'qiydi.
vaqt va hisoblagichlardan birini chastotani[1] chastotaga[5] oshiradi; biz e'tibor bermaymiz
Quency[0], chunki so'rov javoblari 1–5 oralig'i bilan cheklangan. Asosiy bayonot
pastadirda 19-satrda paydo bo'ladi. Bu bayonot tegishli chastotalar sonini oshiradi.
javoblar qiymati bilan belgilanadi[javob].
Keling, for bayonotining dastlabki bir necha iteratsiyasini ko'rib chiqaylik:
• Qarshi javob 0 bo'lsa, javoblar[javob] javoblar qiymati[0]
(ya'ni, 1 - 9-qatorga qarang). Bu holda chastota[javoblar[javob]] izohlanadi-
chastota[1] sifatida qabul qilinadi va hisoblagich chastotasi[1] bittaga oshiriladi. Kimga
ifodani baholaymiz, biz qavslarning eng ichki to'plamidagi qiymatdan boshlaymiz
(javob, hozirda 0). Javobning qiymati ifodaga ulanadi va

17
18


19
20
21
22
23
24
25
26
27
28
29 System.out.printf("%s%10s%n", "Reyting", "Chastota");
30
31 // har bir massiv elementining qiymatini chiqarish
uchun 32 (int reyting = 1; reyting < chastota. uzunlik; reyting++)
33 System.out.printf("%6d%10d%n", reyting, chastota [reyting]);
34 }
35 } // yakuniy sinf StudentPoll

java.lang.ArrayIndexOutOfBoundsException: 14


javoblar[19] = 14

Reyting chastotasi


1 3
2 4
3 8
4 2
5 2

7.8-rasm | So'rovni tahlil qilish dasturi. (2-qismning 2-qismi.)

harakat qilib ko'ring
{
++chastotasi[javoblar[javob]];
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println(e); // toString usulini chaqiradi
System.out.printf("javoblar[%d] = %d%n%n",
javob, javoblar[javob]);
}
}

256 7-bob Massivlar va massivlar ro‘yxati



keyingi qavslar to'plami (javoblar[javob]) baholanadi. Bu qiymat sifatida ishlatiladi
Qaysi hisoblagichni oshirishni aniqlash uchun chastotalar qatori indeksi (bunda
holat, chastota [1]).
• Keyingi bosqichda javob 1 bo'lsa, javoblar[javob] qiymati hisoblanadi
javoblar[1] (ya'ni, 2—9-qatorga qarang), shuning uchun [javoblar[javob]] chastotasi -
chastota[2] deb talqin qilinadi, bu esa chastotaning[2] oshishiga olib keladi.
• Javob 2 bo‘lsa, javoblar[javob] javoblar[2] qiymati hisoblanadi (ya’ni 5—
9-satrga qarang), shuning uchun chastota[javoblar[javob]] chastota[5] sifatida talqin qilinadi,
chastota [5] ning oshishiga olib keladi va hokazo.
Qayta ishlangan javoblar sonidan qat'i nazar, faqat oltita elementli massiv (biz o'z ichiga olgan
nore element nore) natijalarni umumlashtirish uchun talab qilinadi, chunki barcha to'g'ri javob
ues 1 dan 5 gacha bo'lgan qiymatlar va olti elementli massiv uchun indeks qiymatlari 0-5. In
dasturning chiqishida, Chastotalar ustuni qayta ko'rsatilgan 20 qiymatdan faqat 19 tasini jamlaydi.
spons massivi - massiv javoblarining oxirgi elementi (qasddan) o'z ichiga oladi
hisobga olinmagan to'g'ri javob. 7.5-bo'lim dasturni ishga tushirganda nima sodir bo'lishini muhokama qiladi
7.8-rasmda massiv javoblarining oxirgi elementida yaroqsiz javob (14) uchraydi.
7.5 Istisnolarni ko'rib chiqish: noto'g'ri ishlov berish
Javob
Istisno dastur bajarilayotganda yuzaga keladigan muammoni bildiradi. Ismi "istisno-
tion" muammo kamdan-kam hollarda yuzaga kelishini ko'rsatadi - agar "qoida" oddiy bayonot bo'lsa -
ly to'g'ri bajarilgan bo'lsa, muammo "qoidadan istisno" ni ifodalaydi. Istisno
ishlov berish istisnolarni hal qila oladigan (yoki ishlov beradigan) xatolarga chidamli dasturlarni yaratishga yordam beradi.
Ko'pgina hollarda, bu dasturga hech qanday muammo bo'lmagandek ishlashni davom ettirishga imkon beradi.
tered. Misol uchun, StudentPoll ilovasi hali ham natijalarni ko'rsatadi (7.8-rasm).
javoblardan biri chegaradan tashqarida edi. Keyinchalik jiddiy muammolar dasturga to'sqinlik qilishi mumkin
normal bajarishni davom ettirish, buning o'rniga dastur foydalanuvchini muammo haqida xabardor qilishni talab qiladi.
lem, keyin tugating. JVM yoki usul noto'g'ri massiv kabi muammoni aniqlaganda
indeks yoki noto'g'ri usul argumenti bo'lsa, u istisno qiladi, ya'ni istisno paydo bo'ladi.
8-bobda bilib olganingizdek, o'z sinflaringizdagi usullar ham istisnolardan voz kechishi mumkin.
7.5.1 Sinab ko'rish bayonoti
Istisnoni hal qilish uchun try iborasida istisno keltirishi mumkin bo'lgan har qanday kodni joylashtiring
(17–26 qatorlar). Sinab ko'rish bloki (17-20-qatorlar) istisnolarni tashlashi mumkin bo'lgan kodni o'z ichiga oladi.
tion va catch bloki (21–26-qatorlar) agar bitta istisno bo'lsa, uni boshqaradigan kodni o'z ichiga oladi.
yuzaga keladi. Har xil turdagi istisnolarni hal qilish uchun sizda ko'plab ushlash bloklari bo'lishi mumkin
tegishli try blokiga tashlanadi. 19-qator elementni to'g'ri oshirganda
chastotalar qatorining 21-26 qatorlari e'tiborga olinmaydi. Tanalarini chegaralovchi qavslar
try and catch bloklari talab qilinadi.
7.5.2 Tutish blokini bajarish
Dastur javoblar qatorida yaroqsiz 14 qiymatiga duch kelganda, u harakat qiladi
chastotaga[14] 1 qo'shing, bu massiv chegarasidan tashqarida - chastotalar qatori

7.6 Case Study: Kartalarni aralashtirish va muomala simulyatsiyasi 257

faqat oltita elementga ega (0-5 indekslari bilan). Chunki massiv chegaralarini tekshirish da amalga oshiriladi
bajarilish vaqtida, JVM istisno hosil qiladi - xususan, 19-satr a tashlaydi
Ushbu muammo haqida dasturni xabardor qilish uchun ArrayIndexOutOfBoundsException. Ayni paytda
try bloki tugaydi va catch bloki bajarila boshlaydi - agar siz biron bir mahalliy deb e'lon qilgan bo'lsangiz
sinab ko'rish blokidagi o'zgaruvchilar, ular endi amal qilmaydi (va endi mavjud emas), shuning uchun ular amal qilmaydi.
ushlash blokida o'tish mumkin.
Catch bloki (IndexOutOfRangeEx-) turdagi istisno parametrini (e) e'lon qiladi.
qabul qilish). Catch bloki belgilangan turdagi istisnolarni boshqarishi mumkin. Tutqich ichida
blokda tutilgan istisno ob'ekti bilan ishlash uchun parametr identifikatoridan foydalanishingiz mumkin.

7.5.3 Istisno parametrining toString usuli


21-26 qatorlar istisnoni ushlaganda, dastur ko'rsatuvchi xabarni ko'rsatadi
yuzaga kelgan muammo. 23-qator istisno obyektining toString usulini bilvosita chaqiradi
istisno ob'ektida bilvosita saqlangan xato xabarini oling va uni ko'rsating. Bir marta
xabar ushbu misolda ko'rsatilgan, istisno ko'rib chiqiladi va pro-
gramm catch blokining yopilish qavsdan keyingi gapi bilan davom etadi. Bu sobiq -
etarli bo'lsa, for iborasining oxiri (27-satr), shuning uchun dastur bilan davom etadi
15-qatordagi nazorat o'zgaruvchisini oshirish. Biz istisnolarni qayta ishlashni muhokama qilamiz
8-bob va 11-bobda chuqurroq.
7.6 Case Study: Kartalarni aralashtirish va muomala simulyatsiyasi
Hozirgacha bobdagi misollarda ibtidoiy elementlarni o'z ichiga olgan massivlar ishlatilgan
turlari. 7.2-bo'limni eslaylikki, massivning elementlari ibtidoiy turdagi bo'lishi mumkin
yoki mos yozuvlar turlari. Ushbu bo'lim tasodifiy raqamlarni yaratish va ma'lumot majmuasidan foydalanadi.
simulyatsiya qiluvchi sinfni ishlab chiqish uchun turdagi elementlar, ya'ni o'yin kartalarini ifodalovchi ob'ektlar
kartani aralashtirish va muomala qilish. Keyinchalik bu sinf o'ynaydigan ilovalarni amalga oshirish uchun ishlatilishi mumkin
maxsus karta o'yinlari. Bob oxiridagi mashqlarda bu yerda ishlab chiqilgan sinflardan foydalaniladi
oddiy poker ilovasini yaratish.
Biz birinchi sinf Card ishlab chiqish (Fig. 7.9), qaysi bir yuzi bor o'yin kartasini ifodalaydi
(masalan, "Ace", "Deuce", "Three", ..., "Jek", "Queen", "Shoh") va kostyum (masalan, "Hearts",
"Olmoslar", "Klublar", "Spades"). Keyinchalik, biz DeckOfCards sinfini ishlab chiqamiz (7.10-rasm),
har bir element Card ob'ekti bo'lgan 52 ta o'yin kartasidan iborat pastki yaratadi. Biz keyin
DeckOfCards klassi kartalarini aralashtirishni ko'rsatadigan test dasturini yarating (7.11-rasm).
va muomala qobiliyatlari.

Xatolarning oldini olish bo'yicha maslahat 7.1


Massiv elementiga kirish uchun kod yozishda massiv indeksi kattaroq bo‘lishini ta’minlang
dan yoki 0 ga teng va massiv uzunligidan kichik. Bu ArrayIndex-ni oldini oladi
Agar dasturingiz to'g'ri bo'lsa, OutOfBoundsExceptions.

Dasturiy ta'minot muhandisligi kuzatuvi 7.1


Keng qamrovli sinovdan o'tgan sanoat tizimlari hali ham xatolarni o'z ichiga olishi mumkin.
Sanoat quvvatiga ega tizimlar uchun bizning afzalligimiz - bu ish vaqtini hisobga olish va ularni hal qilishdir.
ArrayIndexOutOfBoundsExceptions kabi tizim ishlamay turishini ta'minlash uchun
va yaxshi ishlayotgan yoki yomonlashadi va tizim ishlab chiquvchilarini muammo haqida xabardor qilish uchun.

258 7-bob Massivlar va massivlar ro‘yxati

Sinf kartasi
Sinf kartasi (7.9-rasm) ikkita String namunasi o'zgaruvchisini o'z ichiga oladi - yuz va kostyum - ular
ma'lum bir karta uchun yuz nomi va kostyum nomiga havolalarni saqlash uchun ishlatiladi. Konstruktor
sinf uchun (10–14-qatorlar) yuz va kostyumni ishga tushirish uchun foydalanadigan ikkita satrni oladi.
toString usuli (17–20-qatorlar) kartaning yuzidan iborat Stringni yaratadi,
"of" qatori va karta kostyumi. Cardning toString usuli aniq chaqirilishi mumkin
Card ob'ektining satrli tasvirini olish uchun (masalan, "Ace of Spades"). toString
Ob'ekt String kutilgan joyda foydalanilganda ob'ekt usuli bilvosita chaqiriladi
(masalan, printf ob'ektni %s format spetsifikatsiyasi yordamida String sifatida chiqarganda yoki qachon
ob'ekt + operatori yordamida Stringga birlashtiriladi). Bunday xatti-harakat sodir bo'lishi uchun,
toString 7.9-rasmda ko'rsatilgan sarlavha bilan e'lon qilinishi kerak.

DeckOfCards klassi


DeckOfCards klassi (7.10-rasm) misol o'zgaruvchisi sifatida deck deb nomlangan Card massivini e'lon qiladi.
(7-qator). Malumot tipidagi massiv boshqa har qanday massiv kabi e'lon qilinadi. DeckOfCards klassi ham
ketma-ketlik sonini ifodalovchi butun son misol o'zgaruvchisi currentCard (8-satr) e'lon qiladi.
ber (0–51) pastki massivdan tarqatiladigan keyingi Karta va nomli konstanta
NUMBER_OF_CARDS (9-qator) palubadagi Kartalar sonini bildiradi (52).

1 // 7.9-rasm: Card.java


2 // Karta sinfi o'yin kartasini ifodalaydi.
3
4 umumiy sinf kartasi
5 {
6 ta xususiy yakuniy String yuzi; // kartaning yuzi ("Ace", "Deuce", ...)
7 ta xususiy final String kostyumi; // karta kostyumi ("Yuraklar", "Olmoslar", ...)
8
9 // ikki argumentli konstruktor kartaning yuzi va kostyumini ishga tushiradi
10 ta umumiy karta (String cardFace, String cardSuit)
11 {
12 this.face = cardFace; // karta yuzini ishga tushiring
13 this.suit = cardSuit; // karta kostyumini ishga tushiring
14 }
15
16
17
18
19
20
21 } // oxirgi sinf kartasi

7.9-rasm | Karta sinfi o'yin kartasini ifodalaydi.

1 // 7.10-rasm: DeckOfCards.java
2 // DeckOfCards klassi o'yin kartalari to'plamini ifodalaydi.
3 import java.security.SecureRandom;
4

7.10-rasm | DeckOfCards klassi o'yin kartalari to'plamini ifodalaydi. (2-qismning 1-qismi.)

// Kartaning string tasvirini qaytarish
umumiy string toString()
{
Qaytish yuzi + "ning" + kostyum;
}

7.6 Case Study: Kartalarni aralashtirish va muomala simulyatsiyasi 259

5 ommaviy toifadagi DeckOfCards
6 {
7
8 shaxsiy joriy karta; // tarqatiladigan keyingi kartaning indeksi (0-51)
9 ta shaxsiy statik yakuniy int NUMBER_OF_CARDS = 52; // doimiy kartalar soni
10 // tasodifiy sonlar generatori
11 ta xususiy statik yakuniy SecureRandom randomNumbers = yangi SecureRandom();
12
13 // konstruktor kartalar palubasini to'ldiradi
14 ta umumiy DeckOfCards()
15 {
16
17
18
19
20
21 joriy karta = 0; // birinchi tarqatilgan karta pastki bo'ladi[0]
22
23
24
25
26
27 }
28
29 // bir martalik algoritmli kartalarni aralashtirib yuborish
30 ommaviy bekor aralashtirish()
31 {
32 // dealCard usuliga keyingi qo'ng'iroq yana deck[0] da boshlanishi kerak
33 joriy karta = 0;
34
35 // Har bir karta uchun boshqa tasodifiy kartani (0-51) tanlang va ularni almashtiring
36 uchun (int first = 0; first < deck.length; first++)
37 {
38 // 0 dan 51 gacha bo'lgan tasodifiy sonni tanlang
39 int soniya = randomNumbers.nextInt(NUMBER_OF_CARDS);
40
41 // joriy kartani tasodifiy tanlangan karta bilan almashtiring
42
43
44
45 }
46 }
47
48 // bitta kartani tarqatish
49 davlat kartasi delegatsiyasi kartasi()
50 {
51 // Kartalar tarqatilishi kerakmi yoki yo'qligini aniqlang
52 agar ( )
53 qaytish pastki[currentCard++]; // massivdagi joriy kartani qaytaring
yana 54
55 qaytish null; // barcha kartalar tarqatilganligini bildirish uchun nullni qaytaring
56 }
57 } // oxirgi sinf DeckOfCards

7.10-rasm | DeckOfCards klassi o'yin kartalari to'plamini ifodalaydi. (2-qismning 2-qismi.)

shaxsiy karta[] pastki; // Karta ob'ektlari massivi

String [] yuzlar = { "Ace", "Deuce", "Uch", "To'rt", "Besh", "Olti",


"Yetti", "Sakkiz", "To'qqiz", "O'nta", "Jek", "Qirolicha", "Qirol" };
String [] kostyumlar = { "Yuraklar", "Olmoslar", "Klublar", "Spades" };

pastki = yangi karta[NUMBER_OF_CARDS]; // Karta ob'ektlari qatorini yaratish

// Karta ob'ektlari bilan pastki to'ldirish
uchun (int count = 0; count < deck.length; count++)
pastki [hisoblash] =
yangi Karta(yuzlar[son % 13], kostyumlar[son / 13]);

Karta harorati = paluba[birinchi];


pastki[birinchi] = pastki[ikkinchi];
pastki[soniya] = harorat;

joriy karta < deck.length


260 7-bob Massivlar va massivlar ro‘yxati

DeckOfCards konstruktori
Sinf konstruktori pastki massivni (20-qator) NUMBER_OF_CARDS (52) ele-
mentlar. Deck elementlari sukut bo'yicha null bo'ladi, shuning uchun konstruktor for iborasidan foydalanadi
(24–26-qatorlar) kemani kartalar bilan to'ldirish uchun. Loop nazorat o'zgaruvchisi sonini 0 va ga ishga tushiradi
count deck.length dan kichik bo'lsa, tsikllar soni har bir butun son qiymatini oladi.
0 dan 51 gacha (pastki qatorning indekslari). Har bir Karta ikkitadan yaratilgan va ishga tushirilgan
Satrlar - yuzlar massividan biri (bu "Ace" dan "King"gacha bo'lgan satrlarni o'z ichiga oladi)
va kostyumlar massividan biri (bu "Yuraklar", "Olmoslar", "Klublar" torlarini o'z ichiga oladi.
va "Spades"). Hisoblash soni % 13 har doim 0 dan 12 gacha bo'lgan qiymatga olib keladi (13 in-
yuzlar qatorining zarlari 16–17-qatorlarda) va hisoblash soni / 13 har doim bir natijaga olib keladi
0 dan 3 gacha bo'lgan qiymat (18-qatordagi kostyumlar qatorining to'rtta indeksi). Deck massivi qachon
ishga tushirilganda, u har bir kostyum uchun (barchasi
13 "Yuraklar", keyin barcha "Olmoslar", keyin "Klublar", keyin "Spades"). Biz massivlardan foydalanamiz
Ushbu misolda yuzlar va kostyumlarni ifodalash uchun strings. 7.34-mashqda biz sizdan so'raymiz
yuzlar va kostyumlarni ifodalash uchun enum konstantalari massivlaridan foydalanish uchun ushbu misolni o'zgartiring.
DeckOfCards usuli aralashtirish
Aralashtirish usuli (30–46-qatorlar) kemadagi Kartalarni aralashtirib yuboradi. Usul tsikl orqali o'tadi
barcha 52 Kartalar (massiv indekslari 0 dan 51 gacha). Har bir karta uchun 0 dan 51 gacha bo'lgan raqam tanlanadi
boshqa kartani tanlash uchun tasodifiy. Keyinchalik, joriy Card ob'ekti va tasodifiy tanlangan
Karta ob'ekti massivda almashtiriladi. Bu almashish uchta topshiriq orqali amalga oshiriladi
42–44 qatorlarda. Vaqtinchalik qo'shimcha o'zgaruvchi ikkita Card ob'ektidan birini vaqtincha saqlaydi.
almashtirildi. Swap faqat ikkita bayonot bilan amalga oshirilmaydi

Agar paluba[birinchi] "Spades"ning "Ace" bo'lsa va pastki[ikkinchi] "Yuraklar"ning "qirolichasi" bo'lsa,


Birinchi topshiriqdan so'ng, massivning ikkala elementida ham "Yuraklar" ning "Malikasi" va
"Spades" ning "Ace" yo'qoladi - shuning uchun qo'shimcha o'zgaruvchan temp kerak. for tsikli muddatidan keyin
Nates, Karta ob'ektlari tasodifiy tartiblangan. Hammasi bo'lib atigi 52 ta almashtirish amalga oshiriladi
butun massivdan o'tadi va Card ob'ektlari massivi aralashtiriladi!
[Eslatma: Haqiqat uchun xolis aralashtirish algoritmidan foydalanish tavsiya etiladi.
karta o'yinlari. Bunday algoritm barcha mumkin bo'lgan aralashtirilgan kartalar ketma-ketligini teng ravishda ta'minlaydi
yuzaga kelishi ehtimoli bor. 7.35-mashq sizdan mashhur xolis Fisher-Yates shufini tadqiq qilishingizni so'raydi.
Fling algoritmini o'zgartiring va undan DeckOfCards aralashtirish usulini qayta tiklash uchun foydalaning.]
DeckOfCards usuli dealCard
DealCard usuli (49–56-qatorlar) massivdagi bitta kartani tarqatadi. Eslatib o'tamiz, joriy karta -
tarqatilishi kerak bo'lgan keyingi Kartaning indeksini ko'rsatadi (ya'ni, kemaning yuqori qismidagi Karta). Shunday qilib,
52-satr currentCard-ni pastki qator uzunligi bilan taqqoslaydi. Agar paluba bo'sh bo'lmasa
(ya'ni, joriyCard 52 dan kam), 53-qator "yuqori" kartani qaytaradi va kursni oshirib yuboradi.
dealCard-ga keyingi qo'ng'iroqqa tayyorgarlik ko'rish uchun rentCard - aks holda null qaytariladi. Eslab qoling
3-bobdan bu null "hech narsaga havola" ni bildiradi.
Aralash va muomala kartalari
7.11-rasmda DeckOfCards sinfi ko'rsatilgan. 9-qator DeckOfCards nomli obyektni yaratadi
myDeckOfCards. DeckOfCards konstruktori 52 ta karta ob'ekti bilan pastki qavatni yaratadi

pastki[birinchi] = pastki[ikkinchi];


pastki[ikkinchi] = pastki[birinchi];

7.6 Case Study: Kartalarni aralashtirish va muomala simulyatsiyasi 261

kostyum va yuz bo'yicha tartibda. 10-qator qayta tartibga solish uchun myDeckOfCards-ning aralashtirish usulini chaqiradi
Karta ob'ektlari. 13-20-qatorlar barcha 52 ta kartani o'z ichiga oladi va ularni 13 tadan to'rtta ustunga chop etadi
Har bir karta. 16-qator myDeckOfCards-ning dealCard usulini chaqirish orqali bitta Card ob'ektini taqdim etadi.
od, so'ngra 19 belgidan iborat maydonda chapga tekislangan Kartani ko'rsatadi. Karta chiqarilganda
String sifatida Cardning toString usuli (7.9-rasmning 17–20-qatorlari) bilvosita chaqiriladi.
18-19 qatorlar har to'rtta kartadan keyin yangi qatorni boshlaydi.

NullPointerExceptionsning oldini olish


7.10-rasmda biz har bir havolaning har bir elementi bo'lgan 52 ta kartaga havolalar qatorini yaratdik.
new bilan yaratilgan ence tipidagi massiv sukut bo'yicha null ga ishga tushiriladi. Yo'naltiruvchi turdagi o'zgaruvchilar
sinfning maydonlari ham sukut bo'yicha null ga ishga tushiriladi. NullPointerException
null mos yozuvlar bo'yicha usulni chaqirishga harakat qilganingizda paydo bo'ladi. Sanoat kuchi kodeksida, en-
Qo'ng'iroq usullarini ishlatishdan oldin havolalar null bo'lmasligiga ishonch hosil qilish Null-ni oldini oladi.
Pointer istisnolari.

1 // 7.11-rasm: DeckOfCardsTest.java


2 // Kartalarni aralashtirish va muomala qilish.
3
4 ommaviy sinf DeckOfCardsTest
5 {
6 // dasturni bajarish
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 DeckOfCards myDeckOfCards = yangi DeckOfCards();
10 myDeckOfCards.shuffle(); // Kartalarni tasodifiy tartibda joylashtiring
11
12 // barcha 52 ta kartani tarqatish tartibida chop eting
13 uchun (int i = 1; i <= 52; i++)
14 {
15 // Kartani taqsimlang va ko'rsating
16 System.out.printf("%-19s", myDeckOfCards.dealCard());
17
18 agar (i % 4 == 0) // har to'rtinchi kartadan keyin yangi qatorni chiqaring
19 System.out.println();
20 }
21 }
22 } // oxirgi sinf DeckOfCardsTest

Olti belku Sakkiz belku Olti klub To'qqiz yurak


Qalblar malikasi yetti klub to'qqiz belkurak Qalblar shohi
Three of Diamonds Deuce of Clubs Ace of Hearts Ten of Spades
Four of Spades Ace of Clubs Seven of Diamonds Four of Hearts
Klublarning uchtasi Deuce of Hearts Beshtasi Jack of Diamonds
Klublar qiroli Yurak o'ntasi Uch yurak Oltita olmos
Klublar malikasi Sakkiz olmos olmos ikki olmos o'nta olmos
Uch belkurak Olmoslar qiroli To'qqizta klub Oltita yurak
Ace of Spades to'rt olmos etti yurak sakkiz klublari
Deuce of Spades Yuraklar sakkiztasi Beshta yurak malikasi
Jek Hearts Seven of Spades To'rt klub To'qqiz olmos
Olmos Ace of Brilliantlar malikasi Klublar beshligi Qiroli Spades
Olmosdan beshta o'nta klub Jek of Spades Jek Klublar

7.11-rasm | Kartani aralashtirish va muomala qilish.


262 7-bob Massivlar va massivlar ro‘yxati

7.7 Bayonot uchun kengaytirilgan
Kengaytirilgan for bayonoti a dan foydalanmasdan massiv elementlari bo'ylab takrorlanadi
hisoblagich, shu bilan massivdan “tashqariga chiqish” imkoniyatidan qochadi. Biz qanday foydalanishni ko'rsatamiz
Java API-ning oldindan tuzilgan ma'lumotlar tuzilmalari (to'plamlar deb ataladi) bilan kengaytirilgan bayonot
7.16-bandda. Kengaytirilgan for bayonotining sintaksisi:

bu erda parametrning turi va identifikatori (masalan, int raqami) mavjud va arrayName massivdir


takrorlash orqali. Parametrning turi parametr turiga mos kelishi kerak
massivdagi elementlar. Keyingi misolda ko'rsatilgandek, identifikator ketma-ketlikni ifodalaydi
siklning ketma-ket takrorlanishida massivdagi element qiymatlari.
7.12-rasmda butun sonlarni yig'ish uchun kengaytirilgan for bayonoti (12–13-qatorlar) qo'llaniladi.
talabalar baholari to'plami. Kengaytirilgan for parametri int tipiga ega, chunki massiv mos keladi.
int qiymatlarini saqlaydi - tsikl har bir iteratsiya davomida massivdan bitta int qiymatini tanlaydi. The
kengaytirilgan bayonot massivdagi ketma-ket qiymatlar orqali birma-bir takrorlanadi. The
bayonot sarlavhasini “har bir iteratsiya uchun massivning keyingi elementini tayinlang
int o'zgaruvchi raqami, so'ngra quyidagi amalni bajaring." Shunday qilib, har bir iteratsiya uchun identifikatsiya:
tiifier raqami massivdagi int qiymatini ifodalaydi. 12–13 qatorlar quyidagiga teng
massivdagi butun sonlarni jamlash uchun 7.5-rasmning 12-13-qatorlarida ishlatiladigan qarshi boshqariladigan takrorlash,
bundan tashqari, kengaytirilgan for bayonotida hisoblagichga kirish mumkin emas:

Kengaytirilgan for bayonoti faqat massiv elementlarini olish uchun ishlatilishi mumkin - bunday bo'lishi mumkin emas


elementlarni o'zgartirish uchun ishlatiladi. Agar dasturingiz elementlarni o'zgartirishi kerak bo'lsa, an'anaviydan foydalaning
bayonot uchun qarshi nazorat.

uchun (parametr: arrayName)


bayonot

for (int counter = 0; counter < array.length; counter++)


jami += massiv [hisoblagich];

1 // 7.12-rasm: EnhancedForTest.java


2 // Massivdagi jami butun sonlar uchun kengaytirilgan for bayonotidan foydalanish.
3
4 umumiy sinf EnhancedForTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 int[] massiv = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };
9 jami = 0;
10
11
12
13
14
15 System.out.printf("Masiv elementlarining umumiy soni: %d%n", jami);
16 }
17 } // end klassi EnhancedForTest
Massiv elementlarining umumiy soni: 849
7.12-rasm | Massivdagi jami butun sonlar uchun kengaytirilgan for bayonotidan foydalanish.

// har bir element qiymatini jamiga qo'shing


uchun (int raqami: massiv)
jami += son;

7.8 Massivlarni 263-usullarga o‘tkazish

Kengaytirilgan for bayonoti davlat uchun qarshi boshqariladigan o'rniga ishlatilishi mumkin.
Agar massiv orqali kod aylanishi hisoblagichga kirishni talab qilmasa,
joriy massiv elementining indeksini aniqlash. Masalan, massivdagi butun sonlarni jamlash
faqat element qiymatlariga kirishni talab qiladi - har bir elementning indeksi ahamiyatsiz. Qanaqasiga-
har doim, agar dastur oddiygina aylanish uchun emas, balki boshqa sabablarga ko'ra hisoblagichdan foydalanishi kerak bo'lsa
massiv (masalan, imtihondagi kabi har bir massiv elementi qiymati yonidagi indeks raqamini chop etish uchun)
Ushbu bobning oldingi qismidagi ples), bayonot uchun qarshi nazoratdan foydalaning.

Java SE 8


For iborasi va kengaytirilgan for iboralari har birining boshidan ketma-ket takrorlanadi
qiymatni yakuniy qiymatgacha. 17-bobda Java SE 8 Lambdas va Streams haqida bilib olasiz
class Stream va uning forEach usuli. Birgalikda ishlash, ular nafis, ko'proq narsani ta'minlaydi
To'plamlar bo'ylab takrorlash uchun qisqa va kamroq xatoga yo'l qo'yadigan vositalar
ko'p yadroli tizimning yaxshi ishlashiga erishish uchun eratsiyalar boshqalar bilan parallel ravishda sodir bo'lishi mumkin.
7.8 Massivlarni metodlarga o‘tkazish
Ushbu bo'lim massivlarni va alohida massiv elementlarini argument sifatida qanday o'tkazishni ko'rsatadi
usullarga. Massiv argumentini metodga o'tkazish uchun massiv nomini ko'rsatmasdan belgilang
har qanday qavslar. Misol uchun, soatlikTemperatures massivi deb e'lon qilingan bo'lsa

keyin usul chaqiruvi

hourlyTemperatures massiviga havolani modifyArray usuliga uzatadi. Har bir massiv
ob'ekt o'z uzunligini "biladi". Shunday qilib, biz massiv ob'ektining havolasini metodga o'tkazganimizda
od, biz qo'shimcha argument sifatida massiv uzunligini o'tkazishimiz shart emas.
Usul chaqiruvi orqali massiv ma'lumotnomasini olish usuli uchun usul
parametrlar ro'yxati massiv parametrini ko'rsatishi kerak. Masalan, uchun usul sarlavhasi
modifyArray usuli quyidagicha yozilishi mumkin

modifyArray b parametridagi qo'sh massivning havolasini olishini ko'rsatadi. The


usul chaqiruvi hourlyTemperature ma'lumotnomasidan o'tadi, shuning uchun chaqirilgan usul foydalanilganda
massiv o'zgaruvchisi b, u qo'ng'iroq qiluvchidagi soatlik haroratlar bilan bir xil massiv ob'ektiga ishora qiladi.
Usulga argument butun massiv yoki a ning alohida massiv elementi bo'lsa
mos yozuvlar turi, chaqirilgan usul mos yozuvlar nusxasini oladi. Biroq, bahslashganda
metodga ment - ibtidoiy tipdagi alohida massiv elementi, chaqirilgan usul
element qiymatining nusxasini oladi. Bunday ibtidoiy qiymatlar skalyar yoki skalyar deyiladi
miqdorlar. Usulga alohida massiv elementini o'tkazish uchun indekslangan nomidan foydalaning
massiv elementi usul chaqiruvida argument sifatida.

Xatolarning oldini olish bo'yicha maslahat 7.2


Kengaytirilgan for bayonoti massiv orqali takrorlash uchun kodni soddalashtiradi
kodni yanada o'qilishi va noto'g'ri ko'rsatish kabi bir nechta xato imkoniyatlarini yo'q qiladi
boshqaruv o'zgaruvchisining boshlang'ich qiymati, tsiklni davom ettirish testi va o'sish ifodasi.

double[] hourlyTemperatures = new double[24];

modifyArray(hourlytemperatures);

void modifyArray(double[] b)


264 7-bob Massivlar va massivlar ro‘yxati

7.13-rasmda butun massivdan o'tish va o'tish o'rtasidagi farq ko'rsatilgan
metodga primitiv tipdagi massiv elementi. E'tibor bering, main statik usullarni chaqiradi
modifyArray (19-qator) va modifyElement (30-qator) toʻgʻridan-toʻgʻri. 6.4-banddan eslaylik
sinfning statik usuli to'g'ridan-to'g'ri bir xil sinfning boshqa statik usullarini chaqirishi mumkin.
16–17-qatorlardagi kengaytirilgan for bayonoti massiv elementlarini chiqaradi. 19-qator
massivni argument sifatida uzatib modifyArray usulini chaqiradi. Usul (36-40-qatorlar)
massiv ma'lumotnomasining nusxasini oladi va undan massivning har bir elementini 2 ga ko'paytirish uchun foydalanadi.
massiv elementlari o'zgartirilganligini isbotlang, 23-24 qatorlar yana massiv elementlarini chiqaradi. Sifatida
chiqish ko'rsatadi, modifyArray usuli har bir elementning qiymatini ikki barobarga oshirdi. Biz qila olmadik
38–39-qatorlarda kengaytirilgan for bayonotidan foydalaning, chunki biz massiv elementlarini o'zgartirmoqdamiz.

1 // 7.13-rasm: PassArray.java


2 // Massivlar va alohida massiv elementlarini usullarga o'tkazish.
3
4 umumiy sinf PassArray
5 {
6 // main massiv yaratadi va modifyArray va modifyElement ni chaqiradi
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 int[] massivi = { 1, 2, 3, 4, 5};
10
11 System.out.printf(
12 "To'liq massivga havolani o'tkazish effektlari:%n" +
13 "Asl massivning qiymatlari:%n");
14
15 // massivning asl elementlarini chiqarish
16 uchun (int qiymati: massiv)
17 System.out.printf(" %d", qiymat);
18
19
20 System.out.printf("%n%nO'zgartirilgan massivning qiymatlari:%n");
21
22 // o'zgartirilgan massiv elementlarini chiqarish
23 uchun (int qiymati: massiv)
24 System.out.printf(" %d", qiymat);
25
26 System.out.printf(
27 "%n%nMasiv elementi qiymatini oʻtkazish effektlari:%n" +
28 "modifyElementdan oldin massiv[3]: %d%n", massiv[3]);
29
30
31 System.out.printf(
32 "modifyElementdan keyin massiv[3]: %d%n", massiv[3]);
33 }
34
35
36
37
38
39
40

7.13-rasm | Massivlar va alohida massiv elementlarini usullarga o'tkazish. (2-qismning 1-qismi.)

modifyArray(massiv); // massiv havolasini o'tkazish

modifyElement(massiv [3]); // massivni o'zgartirishga urinish[3]

// massivning har bir elementini 2 ga ko'paytiring
umumiy statik void modifyArray(int[] array2)
{
for (int counter = 0; counter < array2.length; counter++)
massiv2[hisoblagich] *= 2;
}

7.9 Qiymati bo‘yicha o‘tish va o‘tish bo‘yicha 265

7.13-rasmda alohida ibtidoiy massivning nusxasi paydo bo'lishi ko'rsatilgan
element usulga uzatiladi, chaqirilgan usulda nusxani o'zgartirish unga ta'sir qilmaydi
chaqiruvchi usul massividagi ushbu elementning asl qiymati. 26–28 qatorlar qiymatni chiqaradi
modifyElement usulini chaqirishdan oldin array[3] ni tanlang. Esda tutingki, ushbu elementning qiymati
ment modifyArray chaqiruvida o'zgartirilgandan keyin endi 8 ga teng. 30-qator qo'ng'iroqlar usuli
ifyElement va massivni [3] argument sifatida uzatadi. Massiv [3] aslida bitta ekanligini unutmang
massivdagi int qiymati (8). Shuning uchun dastur massiv[3] qiymatining nusxasini uzatadi.
ModifyElement usuli (43–48-qatorlar) argument sifatida olingan qiymatni 2 ga ko‘paytiradi,
natijani uning parametr elementida saqlaydi, so‘ngra element (16) qiymatini chiqaradi. beri
mahalliy o'zgaruvchilar kabi usul parametrlari, ular bo'lgan usulda mavjud bo'lishni to'xtatadi
e'lon qilingan bajarishni yakunlaydi, usul parametr elementi usul qachon yo'q qilinadi
modifyElement tugaydi. Dastur boshqaruvni asosiyga qaytarganda, 31–32 qatorlar
massiv[3] ning o'zgartirilmagan qiymatini chiqaring (ya'ni, 8).
7.9 Pass-by-value va boshqalar
Oldingi misol massivlar va ibtidoiy tipdagi massiv elementlari qanday ekanligini ko'rsatdi
usullarga argument sifatida o'tdi. Endi biz umuman argumentlar qanday ekanligini batafsil ko'rib chiqamiz
usullariga o‘tkaziladi. Ko'p dasturlashda usul chaqiruvlarida argumentlarni o'tkazishning ikki yo'li
tillar o'tish-by-value va pass-by-reference (ba'zan call-by-value va deb ataladi)
qo'ng'iroq bo'yicha). Argument qiymat bo'yicha uzatilsa, argument qiymatining nusxasi bo'ladi
chaqirilgan usulga o'tdi. Chaqirilgan usul faqat nusxa bilan ishlaydi. O'zgarishlar
chaqirilgan usulning nusxasiga qo'ng'iroq qiluvchidagi asl o'zgaruvchining qiymatiga ta'sir qilmaydi.
Argument havola orqali uzatilganda, chaqirilgan usul argumentga kirishi mumkin.
to'g'ridan-to'g'ri qo'ng'iroq qiluvchining qiymatini o'zgartiring va agar kerak bo'lsa, ushbu ma'lumotlarni o'zgartiring. Malumot orqali o'tish
katta hajmdagi ma'lumotlarni nusxalash zaruratini bartaraf etish orqali ishlashni yaxshilaydi.

41
42


43
44
45
46
47
48
49 } // oxirgi sinf PassArray
Butun massivga havolani uzatish effektlari:
Asl massivning qiymatlari:
1 2 3 4 5
O'zgartirilgan massivning qiymatlari:
2 4 6 8 10
Massiv elementi qiymatini o'tkazish effektlari:
array[3] modifyElementdan oldin: 8
modifyElement elementining qiymati: 16
array[3] modifyElementdan keyin: 8
7.13-rasm | Massivlar va alohida massiv elementlarini usullarga o'tkazish. (2-qismning 2-qismi.)

// argumentni 2 ga ko'paytiring


umumiy statik void modifyElement (int element)
{
element *= 2;
System.out.printf(
"modifyElementdagi element qiymati: %d%n", element);
}

266 7-bob Massivlar va massivlar ro‘yxati

Ba'zi boshqa tillardan farqli o'laroq, Java sizga o'tish yoki o'tishni tanlashga ruxsat bermaydi.
by-reference - barcha argumentlar qiymat bo'yicha uzatiladi. Usul chaqiruvi ikki turdagi qiymatlarni o'tkazishi mumkin
usulga - ibtidoiy qiymatlarning nusxalari (masalan, int va double tipidagi qiymatlar) va nusxalari
ob'ektlarga havolalar. Ob'ektlarning o'zini usullarga o'tkazib bo'lmaydi. Qachonki usul
ibtidoiy tipdagi parametrni o'zgartiradi, parametrga kiritilgan o'zgartirishlar boshlang'ich parametrga ta'sir qilmaydi.
chaqiruv usulida inal argument qiymati. Misol uchun, 7.13-rasmning asosiy qismidagi 30-qatorda
array[3] ni modifyElement usuliga uzatadi, bu 45-qatordagi iborani ikki barobarga oshiradi
parametr elementining qiymati main dagi massiv [3] qiymatiga ta'sir qilmaydi. Bu ham
mos yozuvlar tipidagi parametrlar uchun rost. Agar siz mos yozuvlar turidagi parametrni shunday o'zgartirsangiz
boshqa ob'ektga ishora qiladi, faqat parametr yangi ob'ektga - saqlangan havolaga ishora qiladi
qo'ng'iroq qiluvchining o'zgaruvchisida hali ham asl ob'ektga ishora qiladi.
Ob'ektning havolasi qiymat bo'yicha uzatilgan bo'lsa-da, usul hali ham bilan o'zaro ta'sir qilishi mumkin
ob'ekt havolasining nusxasi yordamida uning umumiy usullarini chaqirish orqali havola qilingan ob'ekt.
Parametrda saqlangan ma'lumotnoma sifatida uzatilgan havolaning nusxasi bo'lgani uchun
argument, chaqirilayotgan usuldagi parametr va chaqiruvchi usuldagi argument
xotiradagi bir xil ob'ektga murojaat qiling. Masalan, 7.13-rasmda ikkala parametr massivi2 in
modifyArray usuli va maindagi oʻzgaruvchan massiv xotiradagi bir xil massiv obyektiga ishora qiladi.
Massiv2 parametri yordamida qilingan har qanday o'zgarishlar massiv joylashgan ob'ektda amalga oshiriladi
chaqiruv usulida havolalar. 7.13-rasmda modifyArray-da kiritilgan o'zgarishlar
array2 massivda massiv tomonidan havola qilingan massiv ob'ektining mazmuniga ta'sir qiladi. Shunday qilib, a bilan
ob'ektga murojaat qilganda, chaqirilgan usul qo'ng'iroq qiluvchining ob'ektini to'g'ridan-to'g'ri boshqarishi mumkin.

7.10 Case Study: Sinf Baho kitobi uchun massivdan foydalanish


Do'kon baholari
Endi biz GradeBook sinfini ishlab chiqish bo'yicha amaliy tadqiqotimizning birinchi qismini taqdim etamiz:
instruktorlar talabalarning imtihondagi baholarini saqlab qolish va baho hisobotini ko'rsatish uchun foydalanishlari mumkin
baholar, oʻrtacha sinf, eng past baho, eng yuqori baho va baholarni taqsimlash satrini oʻz ichiga oladi
diagramma. Ushbu bo'limda taqdim etilgan GradeBook sinfining versiyasi bitta uchun baholarni saqlaydi
bir o'lchovli massivda imtihon. 7.12-bo'limda biz GradeBook sinfining versiyasini taqdim etamiz
bir nechta imtihonlar uchun talabalar baholarini saqlash uchun ikki o'lchovli massivdan foydalanadi.
Sinf Baho kitobida talabalar baholarini massivda saqlash
Class GradeBook (7.14-rasm) bir nechta o'quvchilarning baholarini sin-da saqlash uchun ints qatoridan foydalanadi.
gle imtihon. Massiv baholari misol o'zgaruvchisi sifatida e'lon qilinadi (7-qator), shuning uchun har bir GradeBook ob'ekti
ject o'zining baholar to'plamini saqlaydi. Konstruktor (10-14-qatorlar) ikkita parametrga ega:
kurs nomi va baholar massivi. Ilova qachon (masalan, sinf GradeBook-
7.15-rasmda test) GradeBook ob'ektini yaratadi, dastur mavjud int massivdan o'tadi
massiv havolasini misol oʻzgaruvchan darajalariga tayinlaydigan konstruktorga (13-qator).
Baholar massivining o'lchami konstruktorning uzunligi misoli o'zgaruvchisi bilan belgilanadi

Ishlash bo'yicha maslahat 7.1


Massiv ob'ektlarining o'rniga massivlarga havolalarni o'tkazish, bajarish uchun mantiqiy bo'ladi.
mantiqiy sabablar. Java-da hamma narsa qiymat bo'yicha uzatilganligi sababli, agar massiv ob'ektlari o'tkazilgan bo'lsa,
har bir elementning nusxasi uzatiladi. Katta massivlar uchun bu vaqtni behuda sarflaydi va
elementlarning nusxalari uchun katta hajmdagi saqlash.

7.10 Case Study: 267 baholarni saqlash uchun massivdan foydalangan holda sinf baho kitobi

massiv parametri. Shunday qilib, GradeBook ob'ekti o'zgaruvchan sonli baholarni qayta ishlashi mumkin. The
Argumentdagi baho qiymatlari foydalanuvchi tomonidan kiritilgan, diskdagi fayldan o'qilgan bo'lishi mumkin
(15-bobda muhokama qilinganidek) yoki boshqa turli manbalardan olingan. Sinfda Baho kitobi -
Sinov, biz sinf qiymatlari bilan massivni ishga tushiramiz (7.15-rasm, 10-qator). Baholar tugagach
GradeBook sinfining o'zgaruvchan baholarida saqlangan, barcha sinf usullari kirishi mumkin
darajalar elementlari.

1 // 7.14-rasm: GradeBook.java


2 // Sinov baholarini saqlash uchun massiv yordamida GradeBook klassi.
3
4 ommaviy sinf Baho kitobi
5 {
6 ta xususiy String kursi nomi; // Albatta, bu Baho kitobining nomi
7
8
9 // konstruktor
10 ta umumiy baho kitobi (String kurs nomi, )
11 {
12 this.courseName = kurs nomi;
13
14 }
15
16 // kurs nomini belgilash usuli
17 umumiy bekor qilingan KursNami(String KursName)
18 {
19 this.courseName = kurs nomi;
20 }
21
22 // kurs nomini olish usuli
23 ommaviy string getCourseName()
24 {
25 qaytish kursi nomi;
26 }
27
28 // ma'lumotlar ustida turli operatsiyalarni bajarish
29 ommaviy bekor qilish jarayoniGrades()
30 {
31 // chiqish baholari massivi
32
33
34 // o'rtacha bahoni hisoblash uchun getAverage usulini chaqiring
35 System.out.printf("%nClass o'rtacha %.2f%n", );
36
37 // getMinimum va getMaximum chaqiruv usullari
38 System.out.printf("Eng past baho - %d%nEng yuqori baho - %d%n%n",
39 , );
40
41 // Baho taqsimoti diagrammasini chop etish uchun outputBarChart-ga qo'ng'iroq qiling
42
43 }
44

7.14-rasm | Sinov baholarini saqlash uchun massivdan foydalanadigan GradeBook klassi. (3-qismning 1-qismi.)

xususiy int[] baholari; // talabalar baholari massivi

int[] baholari

this.grades = baholar;

outputGrades();

getAverage()

getMinimum() getMaximum()

outputBarChart();

268 7-bob Massivlar va massivlar ro‘yxati

45 // minimal bahoni toping
46 umumiy int getMinimum()
47 {
48 int lowGrade = baholar[0]; // baholar[0] eng kichik deb hisoblaymiz
49
50
51
52
53
54
55
56
57
58 past baho;
59 }
60
61 // maksimal bahoni toping
62 umumiy int getMaximum()
63 {
64 int highGrade = baholar[0]; // baholar[0] eng katta deb faraz qilaylik
65
66 // baholar massivida aylanish
67 uchun (integratsiya: baholar)
68 {
69 // agar baho highGrade dan katta bo'lsa, uni highGrade ga tayinlang
70 agar (baho > yuqori baho)
71 yuqori baho = baho; // yangi eng yuqori daraja
72 }
73
74 yuqori baho;
75 }
76
77 // test uchun o'rtacha bahoni aniqlang
78 umumiy juft getAverage()
79 {
80 int jami = 0;
81
82
83
84
85
86 // baholarning o'rtacha qaytishi
87 qaytish (ikki marta) jami / ;
88 }
89
90 // Baho taqsimotini ko'rsatadigan chiqish paneli diagrammasi
91 ommaviy bekor chiqishBarChart()
92 {
93 System.out.println("Baho taqsimoti:");
94
95 // har bir 10 daraja oralig'ida baholar chastotasini saqlaydi
96 int[] chastotasi = yangi int[11];

7.14-rasm | Sinov baholarini saqlash uchun massivdan foydalanadigan GradeBook klassi. (3 qismning 2-qismi.)

// baholar massivida aylanish
uchun (integratsiya: baholar)
{
// agar baho lowGrade dan past bo'lsa, uni lowGrade ga belgilang
agar (baho < past baho)
past baho = daraja; // yangi eng past daraja
}

// bitta talaba uchun baholar yig'indisi


uchun (integratsiya: baholar)
jami += baho;

baholar.uzunlik


7.10 Case Study: 269 baholarni saqlash uchun massivdan foydalanish sinf baho kitobi

Method processGrades (29–43-qatorlar) a chiqaradigan bir qator usul chaqiruvlarini o'z ichiga oladi
baholarni umumlashtiruvchi hisobot. 32-qator tarkibni chop etish uchun outputGrades usulini chaqiradi
massiv darajalari. Chiqish usulidagi 126–128 qatorlar oʻquvchilarning baholarini chiqaradi.
Bu holatda qarshi boshqariladigan bayonotdan foydalanish kerak, chunki 127-128 qatorlar ishlatiladi
ma'lum bir talaba raqami yonida har bir bahoni chiqarish uchun hisoblagich o'zgaruvchan talabaning qiymati
(7.15-rasmdagi chiqishga qarang). Massiv indekslari 0 dan boshlansa-da, odatda professor bo'lishi mumkin
talabalar soni 1 dan boshlanadi. Shunday qilib, 127–128 qatorlar talaba + 1ni talaba sifatida chiqaradi
sinf yorliqlarini ishlab chiqarish uchun raqam "Talaba 1: ", "Talaba 2: "va hokazo.
Method processGrades keyingi qo'ng'iroqlar usuli getAverage (satr 35) o'rtacha olish uchun
massivdagi baholar. getAverage usuli (78–88-qatorlar) holati uchun kengaytirilgandan foydalanadi.
o'rtachani hisoblashdan oldin massiv baholaridagi qiymatlarni jamlash uchun. Parametr ichida
kengaytirilgan for sarlavhasi (masalan, int bahosi) har bir iteratsiya uchun int o'zgarishini bildiradi.
qodir baho massiv baholarida qiymat oladi. 87-qatordagi o'rtacha hisob-kitobdan foydalaniladi
baholar.oʻrtacha baholar sonini aniqlash uchun uzunlik.

97
98


99
100
101
102 // har bir daraja chastotasi uchun diagrammadagi chiziqni chop eting
103 uchun (int count = 0; count 104 {
105 // chiqish paneli yorlig'i ("00-09: ", ..., "90-99: ", "100:")
106 agar (hisoblash == 10)
107 System.out.printf("%5d: ", 100);
yana 108
109 System.out.printf("%02d-%02d: ",
110 hisoblash * 10, hisoblash * 10 + 9);
111
112 // yulduzchalarni chop etish satri
113 uchun (int yulduzlar = 0; yulduzlar < chastota[hisoblash]; yulduzlar++)
114 System.out.print("*");
115
116 System.out.println();
117 }
118 }
119
120 // baholar massivining mazmunini chiqarish
121 ommaviy bekor chiqishGrades()
122 {
123 System.out.printf("Baholar:%n%n");
124
125 // har bir talabaning bahosini chiqarish
126
127
128
129 }
130 } // yakuniy sinf Baho kitobi

7.14-rasm | Sinov baholarini saqlash uchun massivdan foydalanadigan GradeBook klassi. (3 qismning 3-qismi.)

// har bir sinf uchun tegishli chastotani oshiring
uchun (integratsiya: baholar)
++chastota[sinf / 10];

uchun (int student = 0; student < grades.length; student++)


System.out.printf("Talaba %2d: %3d%n",
talaba + 1, baholar[talaba]);

270 7-bob Massivlar va massivlar ro‘yxati



Jarayonning 38–39 qatorlari getMinimum va getMaximum uchun chaqiruv usullarini baholaydi
imtihondagi har qanday talabaning eng past va eng yuqori baholarini mos ravishda aniqlash. Har biri
bu usullar massiv baholari bo'ylab aylanish uchun kengaytirilgan for bayonotidan foydalanadi. 51-qatorlar
Massiv bo'ylab getMinimum sikl usulida 56. 54–55 satrlar har bir sinf bilan taqqoslanadi
past baho; agar baho lowGrade dan past bo'lsa, lowGrade shu bahoga o'rnatiladi. 58-qator exe-
cutes, lowGrade massivdagi eng past bahoni o'z ichiga oladi. getMaximum usuli (62–75-qatorlar)
getMinimum usuliga o'xshash ishlaydi.
Nihoyat, processGrades usulidagi 42-qator baho taqsimotini chop etish uchun outputBarChart-ni chaqiradi.
7.6-rasmdagiga o'xshash texnikadan foydalangan holda bution diagrammasi. Ushbu misolda biz qo'lda hisoblaymiz -
har bir toifadagi baholar sonini (ya'ni, 0–9, 10–19, …, 90–99 va 100) hisoblab chiqdi.
shunchaki baholar to'plamiga qarash. Bu erda 99-100 qatorlar shunga o'xshash texnikadan foydalanadi
Anjir. Har bir toifadagi baholarning chastotasini hisoblash uchun 7.7–7.8. 96-qator e'lon qiladi va kre-
Har bir toifadagi baholar chastotasini saqlash uchun 11 ints massiv chastotasi. Har biriga
massiv darajalarida gradus, 99–100 qatorlar mos chastotali massiv elementini oshiradi. Kimga
qaysi birini oshirish kerakligini aniqlang, 100-satr joriy bahoni butun son yordamida 10 ga bo'ladi
bo'linish - masalan, agar baho 85 bo'lsa, 100-satr sonini yangilash uchun chastotani [8] oshiradi.
80-89 oralig'ida baholar. 103-117 qatorlar shtrixli diagrammani (7.15-rasmda ko'rsatilganidek) chop eting.
massiv chastotasidagi qiymatlar bo'yicha. 7.6-rasmning 23-24-qatorlari, 7.14-rasmning 113-116-qatorlari kabi
Har bir satrda ko'rsatiladigan yulduzchalar sonini aniqlash uchun massiv chastotasi qiymatidan foydalaning.
Sinf baho kitobini ko'rsatadigan sinf baho kitobi testi
7.15-rasm ilovasi int yordamida GradeBook sinfining ob'ektini yaratadi (7.14-rasm).
array gradesArray (10-qatorda e'lon qilingan va ishga tushirilgan). 12-13 qatorlar kurs nomini o'tkazadi va
GradeBook konstruktoriga gradesArray. 14–15-qatorlarda salomlashish xabari ko'rsatiladi:
GradeBook ob'ektida saqlangan kurs nomini o'z ichiga oladi. 16-qator GradeBook ob'ektini chaqiradi
obyektning processGrades usuli. Natija myGradeBook-dagi 10 baholarni umumlashtiradi.
Dasturiy ta'minot muhandisligi kuzatuvi 7.2
Sinov jabduqlari (yoki sinov ilovasi) mavjud sinf ob'ektini yaratish uchun javobgardir
sinovdan o'tkazilib, uni ma'lumotlar bilan ta'minlaydi. Ushbu ma'lumotlar bir nechta manbalardan olinishi mumkin. Sinov
ma'lumotlar to'g'ridan-to'g'ri massiv ishga tushirgichi bilan joylashtirilishi mumkin, u dan kelishi mumkin
foydalanuvchi klaviaturadan, fayldan (15-bobda ko'rganingizdek), ma'lumotlar bazasidan (siz kabi)
24-bobga qarang) yoki tarmoqdan (onlayn 28-bobda ko'rasiz). O'tgandan keyin
ob'ektni yaratish uchun ushbu ma'lumotlarni sinfning konstruktoriga yuboring, sinov jabduqlari qo'ng'iroq qilishi kerak
ob'ekt o'z usullarini sinab ko'rish va ma'lumotlarini manipulyatsiya qilish uchun. Sinov tizimida ma'lumotlarni yig'ish
bu kabi sinfni ko'proq qayta foydalanishga, bir nechta manbalardan ma'lumotlarni boshqarishga imkon beradi.

1 // 7.15-rasm: GradeBookTest.java


2 // GradeBookTest bir qator baholar yordamida GradeBook ob'ektini yaratadi,
3 // keyin ularni tahlil qilish uchun processGrades usulini chaqiradi.
4 ommaviy sinf GradeBookTest
5 {
6 // asosiy usul dasturni bajarishni boshlaydi
7 ta umumiy statik bekor asosiy (String [] args)
8 {

7.15-rasm | GradeBookTest bir qator baholar yordamida GradeBook ob'ektini yaratadi, so'ngra uni chaqiradi


usuli processGrades ularni tahlil qilish. (2-qismning 1-qismi.)

7.10 Case Study: 271 baholarni saqlash uchun massivdan foydalanish sinf baho kitobi

Java SE 8
17-bobda, Java SE 8 Lambdas va Streams, 17.5-rasmdagi misol oqimdan foydalanadi
int massivining elementlarini oqlangan tarzda qayta ishlash uchun min, max, count va o'rtacha usullar
va takroriy gaplarni yozmasdan qisqacha. 23-bobda, parallellik,
23.29-rasmdagi misol bularning barchasini bajarish uchun oqim usuli summaryStatisticsdan foydalanadi
bir usul chaqiruvidagi operatsiyalar.

9
10


11
12 Baho kitobi myGradeBook = yangi Baho kitobi(
13 "CS101 Java dasturlashga kirish", );
14 System.out.printf("%n%s%n%n uchun baholar kitobiga xush kelibsiz",
15 myGradeBook.getCourseName());
16 myGradeBook.processGrades();
17 }
18 } // yakuniy sinf GradeBookTest

uchun baho kitobiga xush kelibsiz


CS101 Java dasturlashga kirish

Baholar quyidagilardir:

1-o‘quvchi: 87
2-o‘quvchi: 68
3-o‘quvchi: 94
4-o‘quvchi: 100
5-o‘quvchi: 83
6-o‘quvchi: 78
7-o‘quvchi: 85
8-o‘quvchi: 91
9-o‘quvchi: 76
10-o‘quvchi: 87

O'rtacha sinf 84,90


Eng past baho - 68
Eng yuqori baho - 100

Baho taqsimoti:


00-09:
10-19:
20-29:
30-39:
40-49:
50-59:
60-69: *
70-79: **
80-89: ****
90-99: **
100: *

7.15-rasm | GradeBookTest bir qator baholar yordamida GradeBook ob'ektini yaratadi, so'ngra uni chaqiradi


usuli processGrades ularni tahlil qilish. (2-qismning 2-qismi.)

// talabalar baholari massivi


int[] gradesArray = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };

gradesArray


272 7-bob Massivlar va massivlar ro‘yxati

7.11 Ko'p o'lchovli massivlar
Ikki o'lchovli ko'p o'lchovli massivlar ko'pincha qiymatlar jadvallarini ko'rsatish uchun ishlatiladi
satrlar va ustunlarga joylashtirilgan ma'lumotlar bilan. Muayyan jadval elementini aniqlash uchun siz belgilaysiz
ikkita indeks. An'anaga ko'ra, birinchi element qatorini, ikkinchisi esa ustunini belgilaydi.
Har bir elementni aniqlash uchun ikkita indeks kerak bo'lgan massivlar ikki o'lchovli massivlar deyiladi.
(Ko'p o'lchovli massivlar ikkidan ortiq o'lchamga ega bo'lishi mumkin.) Java ko'p o'lchovli massivlarni qo'llab-quvvatlamaydi.
to'g'ridan-to'g'ri o'lchovli massivlar, lekin bu sizga bir o'lchovli massivlarni belgilash imkonini beradi.
mentlar ham bir o'lchovli massivlardir, shuning uchun bir xil effektga erishiladi. 7.16-rasmda ko'rsatilgan
uch satr va to'rtta ustunli a nomli ikki o'lchovli massiv (ya'ni, uchdan to'rtta ar-
nur). Umuman olganda, m satr va n ta ustundan iborat massiv m-by-n massiv deyiladi.

a massivdagi har bir element 7.16-rasmda shaklning massivga kirish ifodasi orqali aniqlanadi.


a[satr][ustun]; a - massiv nomi, satr va ustun esa yagona bo'lgan indekslardir
Har bir elementni satr va ustun indeksi bo'yicha aniqlang. 0-qatordagi barcha elementlarning nomlari mavjud
birinchi indeks 0 va 3-ustundagi elementlarning nomlari ikkinchi indeks 3 ga ega.
Bir o'lchovli massivlar massivlari
Bir o'lchovli massivlar singari, ko'p o'lchovli massivlar massivning boshlang'ich belgisi bilan ishga tushirilishi mumkin.
deklaratsiyalarda. Ikki qator va ikkita ustunli ikki o'lchovli massiv b bo'lishi mumkin
quyidagicha e'lon qilingan va o'rnatilgan massiv ishga tushirgichlari bilan ishga tushirilgan:

Boshlang'ich qiymatlar qavs ichida qatorlar bo'yicha guruhlangan. Shunday qilib, 1 va 2 b[0][0] va b[0][1] ni ishga tushiradi,


mos ravishda va 3 va 4 mos ravishda b[1][0] va b[1][1] ni ishga tushiradi. Kompilyator
ichki o'rnatilgan massiv initsializatorlari sonini hisoblaydi (chiqish ichidagi qavslar to'plami bilan ifodalanadi)
er qavslar) b massivdagi qatorlar sonini aniqlash uchun. Kompilyator boshlang'ichni hisoblaydi
qatordagi ustunlar sonini aniqlash uchun ichki qator ishga tushirgichidagi qiymatlar
qator. Bir lahzada ko'rib chiqamiz, bu qatorlar turli uzunliklarga ega bo'lishi mumkinligini anglatadi.
Ko'p o'lchovli massivlar bir o'lchovli massivlar massivlari sifatida saqlanadi. Shuning uchun
Oldingi deklaratsiyadagi b massivi aslida ikkita alohida bir o'lchovlidan iborat
massivlar—birinchi oʻrnatilgan boshlangʻich roʻyxatidagi qiymatlarni oʻz ichiga olgan {1, 2} va bitta kon-
ikkinchi o'rnatilgan initsializatorlar ro'yxatidagi qiymatlarni saqlash {3, 4}. Shunday qilib, b massivning o'zi massivdir
har biri int qiymatlarining bir o'lchovli massividan iborat ikkita elementdan iborat.

7.16-rasm | Uch qator va to'rtta ustunli ikki o'lchovli massiv.

int[][] b = {{1, 2}, {3, 4}};

0-qator


1-qator

2-qator


Ustun indeksi
Qator indeksi
Massiv nomi

a[ 0 ][ 0 ]

a[ 1 ][ 0 ]

a [ 2 ][ 0 ]

a [ 0 ][ 1 ]

a [ 1 ][ 1 ]

a [ 2 ][ 1 ]

a [ 0 ][ 2 ]

a [ 1 ][ 2 ]

a [ 2 ][ 2 ]

a [ 0 ][ 3 ]

0-ustun 1-ustun 2-ustun 3-ustun

a [ 1 ][ 3 ]

a [ 2 ][ 3 ]


7.11 Ko‘p o‘lchovli massivlar 273

Turli uzunlikdagi qatorlar bilan ikki o'lchovli massivlar
Ko'p o'lchovli massivlarni ifodalash usuli ularni ancha moslashuvchan qiladi.
Aslida b massivdagi qatorlar uzunligi bir xil bo'lishi shart emas. Masalan,

ikki elementli b butun sonli massivni yaratadi (ichiga kiritilgan massivlar soni bilan aniqlanadi)


tializers) ikki o'lchovli massivning qatorlarini ifodalaydi. b ning har bir elementi ref-
int o'zgaruvchilarning bir o'lchovli massiviga o'tish. 0-qator uchun int massivi bitta-
ikki elementli (1 va 2) o'lchovli massiv va 1-qator uchun int massivi bir o'lchovli
uchta elementli (3, 4 va 5) massiv.

Massiv yaratish ifodalari bilan ikki o‘lchovli massivlarni yaratish


Har bir satrda bir xil sonli ustunlarga ega bo'lgan ko'p o'lchovli massiv yaratilishi mumkin
massiv yaratish ifodasi bilan. Misol uchun, quyidagi satr b massivini e'lon qiladi va as-
uni uchdan to'rtta massivga havola qilib imzolang:

Bunday holda, biz satrlar sonini va sonini ko'rsatish uchun 3 va 4 harf qiymatlaridan foydalanamiz.


ustunlar, lekin bu shart emas. Dasturlar belgilash uchun o'zgaruvchilardan ham foydalanishi mumkin
massiv o'lchamlari, chunki new massivlarni kompilyatsiya vaqtida emas, balki bajarilish vaqtida yaratadi. el-
massiv obyekti yaratilganda ko‘p o‘lchovli massivning elementlari inisializatsiya qilinadi.
Har bir satrda turli xil sonli ustunlar bo'lgan ko'p o'lchovli massiv mumkin
quyidagicha yaratilsin:

Oldingi iboralar ikki qatorli ikki o'lchovli massivni yaratadi. 0-qator beshdan iborat


ustunlar va 1-qator uchta ustunga ega.

Ikki o'lchovli massiv Misol: Element qiymatlarini ko'rsatish


7.17-rasmda massiv initsializatorlari bilan ikki o'lchovli massivlarni ishga tushirish ko'rsatilgan va
massivlarni aylanib o'tish uchun nested for looplaridan foydalanish (ya'ni, har bir massivning har bir elementini boshqarish).
InitArray klassi asosiy ikkita massivni e'lon qiladi. 1-massiv deklaratsiyasi (9-qator) ichki o'rnatilgandan foydalanadi
birinchi qatorni 1, 2 va 3 qiymatlariga ishga tushirish uchun bir xil uzunlikdagi massiv initsializatorlari va
ikkinchi qatorda 4, 5 va 6 qiymatlari. 2-massiv deklaratsiyasi (10-qator) nested dan foydalanadi
turli uzunlikdagi boshlang'ichlar. Bunday holda, birinchi qator ikkita element bilan ishga tushiriladi
mos ravishda 1 va 2 qiymatlari. Ikkinchi qator qiymatga ega bitta elementga ishga tushiriladi
3. Uchinchi qator mos ravishda 4, 5 va 6 qiymatlari bilan uchta elementga inisializatsiya qilinadi.

int[][] b = {{1, 2}, {3, 4, 5}};

int[][] b = new int[3][4];

int[][] b = new int[2][]; // 2 qator yaratish


b[0] = new int[5]; // 0-qator uchun 5 ta ustun yarating
b[1] = new int[3]; // 1-qator uchun 3 ta ustun yarating

1 // 7.17-rasm: InitArray.java


2 // Ikki o'lchovli massivlarni ishga tushirish.
3
4 ommaviy sinf InitArray
5 {

7.17-rasm | Ikki o'lchovli massivlarni ishga tushirish. (2-qismning 1-qismi.)


274 7-bob Massivlar va massivlar ro‘yxati

13 va 16-qatorlar elementlarini chiqarish uchun outputArray (20–31-qatorlar) usulini chaqiradi.
mos ravishda massiv1 va massiv2. Usul outputArray parametri—int[][] massivi—
usul ikki o'lchovli massivni qabul qilishini ko'rsatadi. Bayonot uchun joylashtirilgan
(23-30 qatorlar) ikki o'lchovli massivning qatorlarini chiqaradi. Davomiy tsiklda
tashqi for bayonotining dition, array.length ifodasi sonini aniqlaydi
massivdagi qatorlar. Ichki for bayonotida array[satr].length deter- ifodasi
massivning joriy qatoridagi ustunlar sonini minalaydi. Bayonot uchun ichki
sharti tsiklga har bir satrdagi ustunlar sonini aniq aniqlash imkonini beradi. Biz
7.18-rasmdagi bayonotlar uchun ichki kengaytirilganlarni ko'rsating.
Ko'p o'lchovli massivlar bilan amalga oshiriladigan umumiy manipulyatsiyalar
Ko'pgina umumiy massiv manipulyatsiyalari bayonotlar uchun ishlatiladi. Misol tariqasida, quyidagi uchun
bayonot 7.16-rasmdagi a massivning 2-qatoridagi barcha elementlarni nolga o'rnatadi:

6 // ikki o'lchovli massivlarni yaratish va chiqarish


7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12 System.out.println("1-qatordagi qiymatlar");
13 outputArray(massiv1); // massiv1 ni qatorlar bo'yicha ko'rsatadi
14
15 System.out.printf("2-qatordagi%nQiymatlar%n");
16 outputArray(massiv2); // massiv2 ni satr bo'yicha ko'rsatadi
17 }
18
19 // ikki o'lchovli massivning satr va ustunlarini chiqarish
20 ta umumiy statik void outputArray( )
21 {
22
23
24
25
26
27
28
29
30
31 }
32 } // InitArray klassi

1-qatordagi qiymatlar


1 2 3
4 5 6

2-qatordagi qiymatlar


1 2
3
4 5 6

7.17-rasm | Ikki o'lchovli massivlarni ishga tushirish. (2-qismning 2-qismi.)

int[][] massiv1 = {{1, 2, 3}, {4, 5, 6}};
int[][] massiv2 = {{1, 2}, {3}, {4, 5, 6}};

int[][] massivi

// massiv qatorlari bo'ylab aylanish
uchun (int row = 0; row < array.length; row++)
{
// joriy satr ustunlari bo'ylab aylanish
uchun (int ustun = 0; ustun < massiv[satr]. uzunlik; ustun++)
System.out.printf("%d ", massiv[satr][ustun]);
System.out.println();
}

7.12 Case Study: Ikki o‘lchovli massivdan foydalangan holda sinf baho kitobi 275

Biz 2-qatorni belgiladik; shuning uchun biz birinchi indeks har doim 2 ekanligini bilamiz (0 birinchi qator,
va 1 - ikkinchi qator). Bu for loop faqat ikkinchi indeksni o'zgartiradi (ya'ni, ustun
dex). Agar a massivning 2-qatori to'rtta elementni o'z ichiga olgan bo'lsa, u holda bayonotning oldingi qismi ekvivalent bo'ladi.
topshiriq bayonotlariga mos keladi

Quyidagi ichki kiritilgan for bayonoti a massividagi barcha elementlarning qiymatlarini jamlaydi:

Ushbu iboralar uchun ichki joylashtirilganlar massiv elementlarini bir vaqtning o'zida bir qatordan jamlaydi. Davlat uchun tashqi -
ment satr indeksini 0 ga o'rnatishdan boshlanadi, shunda birinchi qatorning elementlari jami bo'lishi mumkin
bayonot uchun ichki. Keyin uchun tashqi qatorni 1 ga oshiradi, shunda ikkinchi qator
jamlash mumkin. Keyin, tashqi qatorni 2 ga oshiring, shunda uchinchi qator quyidagi bo'lishi mumkin -
hikoya qilgan. O'zgaruvchan jami tashqi for bayonoti tugaganda ko'rsatilishi mumkin. In
Keyingi misolda biz ikki o'lchovli massivni shunga o'xshash tarzda qanday qayta ishlashni ko'rsatamiz
bayonotlar uchun ichki kengaytirilgan foydalanish.
7.12 Case Study: Sinf baho kitobi ikkitadan foydalangan holda
O'lchovli massiv
7.10-bo'limda biz bir o'lchovli o'lchovdan foydalangan holda sinf GradeBook (7.14-rasm) taqdim etdik.
Talaba baholarini bitta imtihonda saqlash uchun massiv. Aksariyat semestrlarda talabalar bir nechta imtihon topshiradi.
ams. Professorlar butun semestr davomida baholarni tahlil qilishni xohlashlari mumkin
bitta talaba va butun sinf uchun.
Ikki o‘lchovli massivda o‘quvchilar baholarini Sinf Baho kitobida saqlash
7.18-rasmda GradeBook sinfi mavjud bo'lib, u ikki o'lchovli massiv baholarini saqlash uchun foydalanadi.
bir nechta imtihonlarda bir nechta talabalarning baholari. Massivning har bir satri bittani ifodalaydi
talabalarning butun kurs bo'yicha baholari va har bir ustun barcha o'quv kurslarining baholarini ifodalaydi.
ma'lum bir imtihon topshirgan dentlar. Class GradeBookTest (7.19-rasm) massivni an sifatida o'tkazadi
GradeBook konstruktoriga argument. Ushbu misolda biz o'nga o'ndan uchga teng massivdan foydalanamiz
talabalarning uchta imtihondagi baholari. Beshta usul bilan ishlov berish uchun massiv manipulyatsiyasi amalga oshiriladi
baholar. Har bir usul avvalgi bir o'lchovli massivdagi hamkasbiga o'xshaydi.
Baho kitobi (7.14-rasm). getMinimum usuli (46–62-qatorlar) eng pastini aniqlaydi
har qanday talabaning semestrdagi bahosi. getMaximum usuli (65–83-qatorlar) ni aniqlaydi
semestr uchun har qanday talabaning eng yuqori bahosi. GetAverage usuli (86–96-qatorlar)
ma'lum bir talabaning semestrdagi o'rtacha ko'rsatkichlarini aniqlaydi. ChiqishBarChart usuli (99–129-qatorlar)

uchun (int ustun = 0; ustun < a[2]. uzunlik; ustun++)


a[2][ustun] = 0;

a[2][0] = 0;


a[2][1] = 0;
a[2][2] = 0;
a[2][3] = 0;

int jami = 0;


uchun (int row = 0; row < a.length; row++)
{
uchun (int ustun = 0; ustun < a[satr]. uzunlik; ustun++)
jami += a[satr][ustun];
}

276 7-bob Massivlar va massivlar ro‘yxati

butun semestrdagi talabalar baholari uchun baholar shtrix jadvalini qo'yadi. Chiqish usuli baholari (satrlar
132–156) massivni har bir talabaning semestrdagi oʻrtacha koʻrsatkichi bilan birga jadval koʻrinishida chiqaradi.

1 // 7.18-rasm: GradeBook.java


2 // Baholarni saqlash uchun ikki o'lchovli massivdan foydalangan holda GradeBook klassi.
3
4 ommaviy sinf Baho kitobi
5 {
6 ta xususiy String kursi nomi; // Albatta, bu sinf kitobining nomi
7
8
9 // ikki argumentli konstruktor kurs nomi va baholar massivini ishga tushiradi
10 ta umumiy baho kitobi (String kurs nomi, )
11 {
12 this.courseName = kurs nomi;
13
14 }
15
16 // kurs nomini belgilash usuli
17 umumiy bekor qilingan KursNami(String KursName)
18 {
19 this.courseName = kurs nomi;
20 }
21
22 // kurs nomini olish usuli
23 ommaviy string getCourseName()
24 {
25 qaytish kursi nomi;
26 }
27
28 // ma'lumotlar ustida turli operatsiyalarni bajarish
29 ommaviy bekor qilish jarayoniGrades()
30 {
31 // chiqish baholari massivi
32 chiqish bahosi();
33
34 // getMinimum va getMaximum chaqiruv usullari
35 System.out.printf("%n%s %d%n%s %d%n%n",
36 "Baho kitobidagi eng past baho", getMinimum(),
37 "Baholar kitobidagi eng yuqori baho", getMaximum());
38
39 // barcha testlar bo'yicha barcha sinflarning chiqish baholarini taqsimlash jadvali
40 outputBarChart();
41 }
42
43 // minimal bahoni toping
44 umumiy int getMinimum()
45 {
46 // sinflar massivining birinchi elementi eng kichik deb faraz qilaylik
47 int lowGrade = baholar[0][0];
48

7.18-rasm | Baholarni saqlash uchun ikki o'lchovli massivdan foydalanadigan GradeBook klassi. (4-qismning 1-qismi.)

xususiy int[][] baholar; // talabalar baholarining ikki o'lchovli massivi

int[][] baholar

this.grades = baholar;

7.12 Case Study: Ikki o‘lchovli massivdan foydalangan holda sinf baholari kitobi 277

49
50
51
52
53
54
55
56
57
58
59
60
61 qaytish past baho;
62 }
63
64 // maksimal bahoni toping
65 ommaviy int getMaximum()
66 {
67 // sinflar massivining birinchi elementi eng katta deb faraz qilamiz
68 int highGrade = baholar[0][0];
69
70 // baholar qatori boʻylab aylanish
(int[] studentGrades: baholar) uchun 71
72 {
73 // joriy satr ustunlari bo'ylab aylanish
74 uchun (int sinf: studentGrades)
75 {
76 // agar baho highGrade dan katta bo'lsa, uni highGrade ga tayinlang
77 agar (baho > yuqori baho)
78 yuqori baho = baho;
79 }
80 }
81
82 yuqori baho;
83 }
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 // umumiy baho taqsimotini ko'rsatadigan chiqish paneli diagrammasi
99 ommaviy bekor chiqishBarChart()
100 {

7.18-rasm | Baholarni saqlash uchun ikki o'lchovli massivdan foydalanadigan GradeBook klassi. (4 qismning 2-qismi.)

// baholar massivi qatorlari bo'ylab aylanish
uchun (int[] studentGrades: baholar)
{
// joriy satr ustunlari bo'ylab aylanish
uchun (inti sinf: studentGrades)
{
// agar baho lowGrade dan past bo'lsa, uni lowGrade ga tayinlang
agar (baho < past baho)
past baho = daraja;
}
}

// muayyan baholar to'plami uchun o'rtacha bahoni aniqlash


public double getAverage(int[] setOfGrades)
{
int jami = 0;
// bitta talaba uchun baholar yig'indisi
uchun (int sinf: setOfGrades)
jami += baho;
// o'rtacha baholarni qaytarish
qaytish (ikki marta) jami / setOfGrades.length;
}

278 7-bob Massivlar va massivlar ro‘yxati

101 System.out.println("Umumiy baho taqsimoti:");
102
103 // har bir 10 daraja oralig'ida baholar chastotasini saqlaydi
104 int[] chastotasi = yangi int[11];
105
106
107
108
109
110
111
112
113 // har bir daraja chastotasi uchun diagrammadagi chiziqni chop eting
114 uchun (int count = 0; count 115 {
116 // chiqish paneli yorlig'i ("00-09: ", ..., "90-99: ", "100:")
117 agar (hisoblash == 10)
118 System.out.printf("%5d: ", 100);
yana 119
120 System.out.printf("%02d-%02d: ",
121 hisob * 10, hisoblash * 10 + 9);
122
123 // yulduzchalarni chop etish satri
124 uchun (int yulduzlar = 0; yulduzlar < chastota[hisoblash]; yulduzlar++)
125 System.out.print("*");
126
127 System.out.println();
128 }
129 }
130
131 // baholar massivining mazmunini chiqarish
132 ommaviy bekor chiqishGrades()
133 {
134 System.out.printf("Baholar:%n%n");
135 System.out.print(" "); // ustun boshlarini tekislang
136
137 // har bir test uchun ustun sarlavhasini yarating
uchun 138 (int test = 0; test < grades[0].length; test++)
139 System.out.printf("Test %d ", test + 1);
140
141 System.out.println("O'rtacha"); // talabalarning o'rtacha ustun sarlavhasi
142
143 // massiv baholarini ifodalovchi matn satrlarini/ustunlarini yaratish
144 uchun (int student = 0; student < grades.length; student++)
145 {
146 System.out.printf("Student %2d", student + 1);
147
148 for (int test : grades[talaba]) // talabaning baholarini chiqarish
149 System.out.printf("%8d", test);
150
151 // talabaning o'rtacha bahosini hisoblash uchun getAverage usulini chaqirish;
152 // getAverage argumenti sifatida baholar qatorini o'tkazish
153

7.18-rasm | Baholarni saqlash uchun ikki o'lchovli massivdan foydalanadigan GradeBook klassi. (4 qismning 3-qismi.)

// GradeBook-dagi har bir baho uchun tegishli chastotani oshiring
uchun (int[] studentGrades: baholar)
{
uchun (inti sinf: studentGrades)
++chastota[sinf / 10];
}

ikki barobar o'rtacha = getAverage(baholar[talaba]);


7.12 Case Study: Ikki o‘lchovli massivdan foydalangan holda sinf baho kitobi 279



getMinimum va getMaximum usullari
GetMinimum, getMaximum, outputBarChart va outputGrades usullari har bir tsiklni baholaydi
massiv baholari orqali nested for iboralar yordamida, masalan, ichki kiritilgan kengaytirilgan
getMinimum usuli deklaratsiyasidan bayonot uchun (50-59-qatorlar). tashqi en-
ikki o'lchovli massiv baholari bo'yicha takrorlanadi, so'zlarni tayinlaydi.
Ketma-ket takrorlashda studentGrades parametriga sessiv qatorlar. Kvadrat qavslar
parametr nomidan keyin studentGrades bir oʻlchovliga ishora qilishini bildiradi
int massivi - ya'ni bir talabaning baholarini o'z ichiga olgan massiv baholari qatori. ni topish uchun
eng past umumiy baho, ichki for bayonoti joriy birining elementlarini taqqoslaydi-
o'lchovli massiv studentGrade o'zgaruvchiga lowGrade. Masalan, birinchi iteratsiyada
tashqi for, 0-qator ball studentGrades parametriga beriladi. Ichki en-
haced for statement so'ng studentGrades orqali o'tadi va har bir baho qiymatini taqqoslaydi
past baho bilan. Agar baho lowGrade dan past bo'lsa, lowGrade o'sha bahoga o'rnatiladi. sek-
va bayonot uchun tashqi kuchaytirilgan takrorlash, 1-qator baholar stu-
dentGrades va bu qatorning elementlari lowGrade o'zgaruvchisi bilan taqqoslanadi. Bu
sinflarning barcha qatorlari o'tib bo'lgunga qadar takrorlanadi. Ichki holat bajarilganda -
ment tugallangan bo'lsa, lowGrade ikki o'lchovli massivdagi eng past bahoni o'z ichiga oladi.
getMaximum usuli getMinimum usuliga o'xshash ishlaydi.
ChiqishBarChart usuli
7.18-rasmdagi outputBarChart usuli 7.14-rasmdagi bilan deyarli bir xil. Biroq,
butun bir semestr uchun umumiy baho taqsimotini chiqarish uchun bu erdagi usul ich-ichidan foydalanadi
bir o'lchovli massiv chastotasini yaratish uchun bayonotlar uchun kengaytirilgan (107-111 qatorlar)
ikki o'lchovli massivdagi barcha baholar asosida. Qolgan kodlar har birida
diagrammani ko'rsatadigan ikkita outputBarChart usuli bir xil.
Chiqish baholari usuli
ChiqishGrades usuli (132–156-qatorlar) qiymatlarni chiqarish uchun ifodalar uchun nested dan foydalanadi.
massiv baholari va har bir talabaning semestrdagi o'rtacha ko'rsatkichlari. Chiqish (7.19-rasm) natijani ko'rsatadi,
Bu professorning jismoniy baho kitobining jadval formatiga o'xshaydi. 138–139 qatorlar
har bir test uchun ustun sarlavhalarini chop eting. Bu erda biz qarshi nazorat ostidagi bayonotdan foydalanamiz
Shunday qilib, biz har bir testni raqam bilan aniqlay olamiz. Xuddi shunday, 144-satrdagi for bayonoti
155 birinchi navbatda har bir talabani aniqlash uchun hisoblagich o'zgaruvchisi yordamida qator yorlig'ini chiqaradi (146-satr).
Massiv indekslari 0 dan boshlangan bo'lsa-da, 139 va 146 satrlar test + 1 va talaba + 1 ni qayta chiqaradi.
1 dan boshlanadigan test va talaba raqamlarini ishlab chiqarish uchun (7.19-rasmdagi chiqishga qarang).
Ichki for bayonoti (148–149-satrlar) tashqi for bayonotining hisoblagich o'zgaruvchisidan foydalanadi
talaba massiv baholarining ma'lum bir qatorini aylanib o'tadi va har bir talabaning testini chiqaradi
daraja. Kengaytirilgan for bayonoti qarshi boshqariladigan bayonotga joylashtirilishi mumkin,
va aksincha. Nihoyat, 153-satr kursni topshirish orqali har bir talabaning o'rtacha semestrini oladi.
getAverage usuliga baholar qatorini (ya’ni, baholar[talaba]) ijaraga oling.

154 System.out.printf("%9.2f%n", oʻrtacha);


155 }
156 }
157 } // yakuniy sinf Baho kitobi

7.18-rasm | Baholarni saqlash uchun ikki o'lchovli massivdan foydalanadigan GradeBook klassi. (4 qismning 4-qismi.)


280 7-bob Massivlar va massivlar ro‘yxati

GetAverage usuli
getAverage usuli (86-96-qatorlar) bitta argumentni oladi - bir o'lchovli sinov massivi
ma'lum bir talaba uchun natijalar. 153-qator getAverage ni chaqirganda, argument bo'ladi
baholar[talaba], bu ikki o'lchovli massivning ma'lum bir qatori ekanligini bildiradi
baholar getAverage ga topshirilishi kerak. Misol uchun, yaratilgan massiv asosida
7.19-rasm, argument baholari[1] uchta qiymatni ifodalaydi (bir o'lchovli massiv
baholar) ikki oʻlchovli massiv baholarining 1-qatorida saqlanadi. Eslatib o'tamiz, ikki o'lchovli -
al array - elementlari bir o'lchovli massivlardan iborat. GetAverage hisoblash usuli
massiv elementlarining yig'indisi, jami test natijalari soniga bo'linadi va qaytaradi
suzuvchi nuqta qo'sh qiymatga olib keladi (95-qator).

Sinf baho kitobini ko'rsatadigan sinf baho kitobi testi


7.19-rasmda GradeBook sinfining ob'ekti (7.18-rasm) ikki o'lchovli ar-
gradesArray nomli ints nuri (10-19-qatorlarda e'lon qilingan va ishga tushirilgan). 21-22 qatorlar o'tadi
kurs nomi va gradesArray GradeBook konstruktoriga. 23–24 qatorlar ustunni ko'rsatadi
Kurs nomini o'z ichiga olgan xabar keladi, keyin 25-satr myGradeBook jarayonini chaqiradi -
Talabalarning semestrdagi baholarini jamlagan hisobotni ko'rsatish uchun baholar usuli.

1 // 7.19-rasm: GradeBookTest.java


2 // GradeBookTest ikki o'lchovli massiv yordamida GradeBook ob'ektini yaratadi
3 // baholar, keyin ularni tahlil qilish uchun processGrades usulini chaqiradi.
4 ommaviy sinf GradeBookTest
5 {
6 // asosiy usul dasturni bajarishni boshlaydi
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12
13
14
15
16
17
18
19
20
21 Baho kitobi myGradeBook = yangi Baho kitobi(
22 "CS101 Java dasturlashga kirish", );
23 System.out.printf("%n%s%n%n uchun baholar kitobiga xush kelibsiz",
24 myGradeBook.getCourseName());
25 myGradeBook.processGrades();
26 }
27 } // yakuniy sinf GradeBookTest

7.19-rasm | GradeBookTest ikki o‘lchovli baholar massividan foydalangan holda GradeBook obyektini yaratadi,


keyin ularni tahlil qilish uchun processGrades usulini chaqiradi. (2-qismning 1-qismi.)

// talabalar baholarining ikki o'lchovli massivi


int[][] gradesArray = {{87, 96, 70},
{68, 87, 90},
{94, 100, 90},
{100, 81, 82},
{83, 65, 85},
{78, 87, 65},
{85, 75, 83},
{91, 94, 100},
{76, 72, 84},
{87, 93, 73}};

gradesArray


7.13 O‘zgaruvchan uzunlikdagi argumentlar ro‘yxati 281

7.13 O'zgaruvchan uzunlikdagi argumentlar ro'yxati
O'zgaruvchan uzunlikdagi argumentlar ro'yxati bilan siz aniqlanmagan qiymatlarni qabul qiladigan usullarni yaratishingiz mumkin
argumentlar soni. Usul parametrlari roʻyxatidagi ellips (...) bilan birga tur
usul ushbu turdagi argumentlarning o'zgaruvchan sonini olishini ko'rsatadi.
Ellipsisdan bunday foydalanish parametrlar ro'yxatida faqat bir marta va ellipsis bilan birga bo'lishi mumkin
uning turi va parametr nomi bilan parametrlar ro'yxatining oxirida joylashtirilishi kerak.
Ko'p narsaga erishish uchun ortiqcha yuklash va massiv o'tish usullaridan foydalanishingiz mumkin
o'zgaruvchan uzunlikdagi argumentlar ro'yxati bilan, usul parametridagi ellips yordamida bajariladi.
ro'yxati qisqaroq.
7.20-rasmda o'rtacha usul ko'rsatilgan (7-16-qatorlar), bu o'zgaruvchini oladi-
juftlarning uzunlik ketma-ketligi. Java o'zgaruvchan uzunlikdagi argumentlar ro'yxatini massiv sifatida ko'rib chiqadi
elementlarning barchasi bir xil turdagi. Shunday qilib, usul tanasi parametr sonini boshqarishi mumkin -
dublonlar massivi sifatida bers. 12–13-qatorlar orqali o'tish uchun kengaytirilgan for loop ishlatiladi
massivni yarating va massivdagi dubllarning umumiy miqdorini hisoblang. 15-qator raqamlarga kiradi.uzunlik
o'rtacha hisoblashda foydalanish uchun raqamlar massivining o'lchamini olish. 29, 31-qatorlar
va 33 asosiy qo'ng'iroq usulida mos ravishda ikki, uch va to'rtta argument bilan o'rtacha.
O'rtacha usulda o'zgaruvchan uzunlikdagi argumentlar ro'yxati mavjud (7-qator), shuning uchun u o'rtacha ko'p bo'lishi mumkin

uchun baho kitobiga xush kelibsiz


CS101 Java dasturlashga kirish
Baholar quyidagilardir:
Test 1 Test 2 Test 3 O'rtacha
1-o‘quvchi 87 96 70 84,33
2-o‘quvchi 68 87 90 81,67
3-o‘quvchi 94 100 90 94,67
4-o‘quvchi 100 81 82 87,67
5-o‘quvchi 83 65 85 77,67
Talaba 6 78 87 65 76,67
Talaba 7 85 75 83 81.00
Talaba 8 91 94 100 95.00
9-o‘quvchi 76 72 84 77.33
Talaba 10 87 93 73 84,33
Baho kitobidagi eng past baho - 65
Baho kitobidagi eng yuqori baho 100
Umumiy baho taqsimoti:
00-09:
10-19:
20-29:
30-39:
40-49:
50-59:
60-69: ***
70-79: *****
80-89: ***********
90-99: *******
100: ***

7.19-rasm | GradeBookTest ikki o‘lchovli baholar massividan foydalangan holda GradeBook obyektini yaratadi,


keyin ularni tahlil qilish uchun processGrades usulini chaqiradi. (2-qismning 2-qismi.)

282 7-bob Massivlar va massivlar ro‘yxati

qo'ng'iroq qiluvchining o'tishi bilan ikki tomonlama argumentlar. Chiqish shuni ko'rsatadiki, har bir usulga qo'ng'iroq o'rtacha
to'g'ri qiymatni qaytaradi.
Umumiy dasturlash xatosi 7.5
Parametrning o'rtasiga o'zgaruvchan uzunlikdagi argumentlar ro'yxatini ko'rsatadigan ellipsni joylashtirish
ro'yxat sintaktik xatodir. Ellips faqat parametrlar ro'yxatining oxiriga joylashtirilishi mumkin.

1 // 7.20-rasm: VarargsTest.java


2 // O'zgaruvchan uzunlikdagi argumentlar ro'yxatidan foydalanish.
3
4 ommaviy sinf VarargsTest
5 {
6 // o'rtachani hisoblang
7 umumiy statik ikki tomonlama oʻrtacha( )
8 {
9 juft jami = 0,0;
10
11 // kengaytirilgan for bayonotidan foydalanib jami hisoblang
12
13
14
15 jami qaytish / ;
16 }
17
18 ta umumiy statik bekor asosiy(String[] args)
19 {
20 juft d1 = 10,0;
21 juft d2 = 20,0;
22 juft d3 = 30,0;
23 juft d4 = 40,0;
24
25 System.out.printf("d1 = %.1f%nd2 = %.1f%nd3 = %.1f%nd4 = %.1f%n%n",
26 d1, d2, d3, d4);
27
28 System.out.printf("d1 va d2 o'rtachasi %.1f%n",
29);
30 System.out.printf("d1, d2 va d3 oʻrtachasi %.1f%n",
31);
32 System.out.printf("d1, d2, d3 va d4 oʻrtachasi %.1f%n",
33);
34 }
35 } // tugatish sinfi VarargsTest
d1 = 10,0
d2 = 20,0
d3 = 30,0
d4 = 40,0

d1 va d2 ning o'rtacha qiymati 15,0 ni tashkil qiladi


d1, d2 va d3 ning o'rtacha qiymati 20,0 ni tashkil qiladi
d1, d2, d3 va d4 ning o'rtacha qiymati 25,0 ni tashkil qiladi
7.20-rasm | O'zgaruvchan uzunlikdagi argumentlar ro'yxatidan foydalanish.

ikki... raqamlar

uchun (juft d: raqamlar)
jami += d;

raqamlar.uzunlik

oʻrtacha(d1, d2)

oʻrtacha(d1, d2, d3)

oʻrtacha(d1, d2, d3, d4)

7.14 Buyruqlar qatori argumentlaridan foydalanish 283

7.14 Buyruqlar qatori argumentlaridan foydalanish
Argumentlarni buyruq satridan ilovaga main usuli orqali o'tkazish mumkin
String[] parametri, u qatorlar qatorini oladi. An'anaga ko'ra, bu parametr
args deb nomlangan. Ilova java buyrug'i yordamida bajarilganda, Java o'tadi
java buyrug'idagi sinf nomidan keyin paydo bo'ladigan buyruq qatori argumentlari
Argus massividagi strings sifatida ilovaning asosiy usuli. Buyruqlar qatori soni ar-
guments massivning uzunlik atributiga kirish orqali olinadi. Buyruqning umumiy qo'llanilishi -
qator argumentlari ilovalarga variantlar va fayl nomlarini o'tkazishni o'z ichiga oladi.
Bizning keyingi misolimizda massiv hajmini aniqlash uchun buyruq qatori argumentlaridan foydalaniladi
uning birinchi elementining qiymati va massiv qiymatlarini hisoblash uchun ishlatiladigan o'sish
qolgan elementlar. Buyruq

InitArray ilovasiga 5, 0 va 4 ta argumentlarni uzatadi. Buyruqlar qatori argu-


mentlar vergul bilan emas, bo'sh joy bilan ajratiladi. Ushbu buyruq bajarilganda, InitAr-
rayning asosiy usuli uch elementli args massivini oladi (ya'ni, args.uzunligi 3), unda
args[0] “5” qatorini, args[1] “0” qatorini va args[2] qatorini o‘z ichiga oladi.
"4" qatori. Dastur ushbu argumentlardan qanday foydalanishni aniqlaydi - 7.21-rasmda biz
uchta buyruq qatori argumentlarini int qiymatlariga o'zgartiring va ulardan argumentni ishga tushirish uchun foydalaning.
nur. Dastur bajarilganda, agar args.length 3 bo'lmasa, dastur xato xabarini chop etadi.
adaçayı va tugatadi (9-12-qatorlar). Aks holda, 14-32 qatorlar massivni ishga tushiradi va ko'rsatadi
buyruq qatori argumentlarining qiymatlari asosida.
16-qator args[0] – massiv hajmini belgilaydigan satrni oladi va uni bir qatorga aylantiradi.
int qiymati, bu dastur 17-qatorda massiv yaratish uchun foydalanadi. Statik usul
Integer sinfidagi parseInt o'zining String argumentini int ga o'zgartiradi.
20–21 qatorlar args[1] va args[2] buyruq qatori argumentlarini int ga aylantiradi
qiymatlar va ularni mos ravishda initialValue va incrementda saqlang. 24–25 qatorlar hisob-
har bir massiv elementi uchun qiymatni kechiktiring.

java InitArray 5 0 4

1 // 7.21-rasm: InitArray.java
2 // Buyruqlar qatori argumentlari yordamida massivni ishga tushirish.
3
4 ommaviy sinf InitArray
5 {
6 umumiy statik bekor asosiy( )
7 {
8 // buyruq qatori argumentlari sonini tekshiring
9 agar ( )
10 System.out.printf(
11 "Xato: Iltimos, butun buyruqni qayta kiriting, jumladan%n" +
12 "massiv hajmi, boshlang'ich qiymati va o'sish.% n");
yana 13
14 {
15 // birinchi buyruq qatori argumentidan massiv hajmini oling
16
17 int[] massiv = new int[arrayLength];

7.21-rasm | Buyruqlar qatori argumentlari yordamida massivni ishga tushirish. (2-qismning 1-qismi.)

String[] args

args.length != 3

int arrayLength = Integer.parseInt(args[0]);

284 7-bob Massivlar va massivlar ro‘yxati

Birinchi bajarilishining natijasi shuni ko'rsatadiki, dastur etarli emas
buyruq qatori argumentlari soni. Ikkinchi bajarish buyruq qatori argu-
massiv hajmini (5), birinchi elementning qiymatini (0) va belgilash uchun 5, 0 va 4-bandlar
mos ravishda (4) massivdagi har bir qiymatning o'sishi. Tegishli chiqish ko'rsatiladi
Ushbu qiymatlar 0, 4, 8, 12 va 16 butun sonlarini o'z ichiga olgan massivni yaratadi.
uchinchi bajarilishdan ko'rinib turibdiki, buyruq qatori argumentlari 8, 1 va 2 an hosil qiladi
8 ta elementi 1 dan 15 gacha manfiy bo'lmagan toq sonlar bo'lgan massiv.

18
19 // buyruq qatori argumentlaridan boshlang'ich qiymat va o'sishni oling


20
21
22
23
24
25
26
27 System.out.printf("%s%8s%n", "Indeks", "Qiymat");
28
29 // massiv indeksi va qiymatini ko'rsatish
30 uchun (int counter = 0; counter < array.length; counter++)
31 System.out.printf("%5d%8d%n", hisoblagich, massiv[hisoblagich]);
32 }
33 }
34 } // InitArray klassi
java InitArray
Xato: Iltimos, butun buyruqni, shu jumladan, qayta kiriting
massiv hajmi, boshlang'ich qiymati va o'sish.

java InitArray 5 0 4


Indeks qiymati
0 0
1 4
2 8
3 12
4 16

java InitArray 8 1 2


Indeks qiymati
0 1
1 3
2 5
3 7
4 9
5 11
6 13
7 15
7.21-rasm | Buyruqlar qatori argumentlari yordamida massivni ishga tushirish. (2-qismning 2-qismi.)

int initialValue = Integer.parseInt(args[1]);


int increment = Integer.parseInt(args[2]);

// har bir massiv elementi uchun qiymatni hisoblash


for (int counter = 0; counter < array.length; counter++)
array[counter] = initialValue + increment * counter;

7.15 285-sinf massivlari

7.15 Sinf massivlari
Sinf massivlari statik usullarni taqdim etish orqali g'ildirakni qayta ixtiro qilmaslikka yordam beradi
umumiy massiv manipulyatsiyalari. Ushbu usullar qatorni saralash uchun tartiblashni o'z ichiga oladi (ya'ni, ar-
elementlarni ortib boruvchi tartibda ajratish), tartiblangan massivni qidirish uchun binarySearch (ya'ni, de-
massivda ma'lum bir qiymat bor yoki yo'qligini tugatish va agar mavjud bo'lsa, qiymat qaerda joylashganligi),
massivlarni solishtirish uchun teng va qiymatlarni massivga joylashtirish uchun to'ldirish. Bu usullar
ibtidoiy tipdagi massivlar va ob'ektlar massivlari uchun ortiqcha yuklangan. Ushbu bo'limda bizning e'tiborimiz
Java API tomonidan taqdim etilgan o'rnatilgan imkoniyatlardan foydalanish. 19-bob, Qidirish, saralash
va Big O, o'zingizning saralash va qidirish algoritmlarini, mavzuni qanday amalga oshirishni ko'rsatadi
kompyuter fanlari tadqiqotchilari va talabalarida katta qiziqish uyg'otadi.
7.22-rasmda massivlar saralash, binarySearch, tenglashtirish va to'ldirish usullaridan foydalaniladi va ko'rsatadi.
Tizimning statik massiv nusxalash usuli bilan massivlarni qanday nusxalash mumkin. Asosan, 11-qator turlanadi
doubleArray massivining elementlari. Arrays sinfining statik usuli buyurtma beradi
massiv elementlari sukut bo'yicha o'sish tartibida. Biz qanday qilib kamayish tartibida saralashni muhokama qilamiz
keyinroq bobda. Ortiqcha yuklangan turlar ma'lum bir qatorni saralashga imkon beradi.
massiv ichidagi mentlar. 12-15 qatorlar tartiblangan massivni chiqaradi.

1 // 7.22-rasm: ArrayManipulations.java


2 // Massivlar sinf usullari va System.arraycopy.
3 import java.util.Arrays;
4
5 ommaviy sinf ArrayManipulations
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // doubleArray ni o'sish tartibida tartiblang
10 double[] doubleArray = { 8.4, 9.3, 0.2, 7.9, 3.4};
11
12 System.out.printf("%ndoubleArray: ");
13
14 uchun (ikki qiymat: doubleArray)
15 System.out.printf("%.1f ", qiymat);
16
17 // 10 elementli massivni 7 lar bilan to'ldiring
18 int[] filledIntArray = new int[10];
19
20 displayArray(filledIntArray, "filledIntArray");
21
22 // intArray massivini intArrayCopy massiviga nusxalash
23 int[] intArray = { 1, 2, 3, 4, 5, 6 };
24 int[] intArrayCopy = new int[intArray.length];
25
26 displayArray(intArray, "intArray");
27 displayArray(intArrayCopy, "intArrayCopy");
28
29 // tenglik uchun intArray va intArrayCopy ni solishtiring
30
31 System.out.printf("%n%nintArray %s intArrayCopy%n",
32 (b ? "==" : "!="));

7.22-rasm | Massivlar sinfi usullari va System.arraycopy. (2-qismning 1-qismi.)

Arrays.sort(doubleArray);

Arrays.fill(filledIntArray, 7);

System.arraycopy(intArray, 0, intArrayCopy, 0, intArray.length);

mantiqiy b = Arrays.equals(intArray, intArrayCopy);


286 7-bob Massivlar va massivlar ro‘yxati

19-qator barcha 10 elementni to'ldirish uchun massivlar sinfini to'ldirishning statik usulini chaqiradi.
7s bilan to'ldirilganIntArray. To'ldirishning haddan tashqari yuklangan versiyalari ma'lum bir narsani to'ldirishga imkon beradi
bir xil qiymatga ega bo'lgan elementlar diapazoni. 20-qator sinfimizning displayArray usulini chaqiradi
filledIntArray tarkibini chiqarish uchun (59-65-qatorlarda e'lon qilingan).
25-qator intArray elementlarini intArrayCopy ga ko'chiradi. Birinchi dalil
(intArray) Tizim usuli arraycopy ga uzatilgan elementlar qaysi massivdan iborat

33
34 // tenglik uchun intArray va filledIntArray ni solishtiring


35
36 System.out.printf("intArray %s filledIntArray%n",
37 (b ? "==" : "!="));
38
39 // 5 qiymatini intArray orqali qidiring
40
41
42 agar (joylashuv >= 0)
43 System.out.printf(
44 "intArray%n da %d elementida 5 ta topildi", joylashuv);
yana 45
46 System.out.println("intArrayda 5 ta topilmadi");
47
48 // 8763 qiymatini intArray orqali qidiring
49
50
51 agar (joylashuv >= 0)
52 System.out.printf(
53 "intArray%n da %d elementida 8763 topildi", joylashuv);
yana 54
55 System.out.println("8763 intArrayda topilmadi");
56 }
57
58 // har bir massivdagi chiqish qiymatlari
59 umumiy statik void displayArray(int[] massivi, String tavsifi)
60 {
61 System.out.printf("%n%s: ", tavsif);
62
63 uchun (int qiymati: massiv)
64 System.out.printf("%d ", qiymat);
65 }
66 } // oxirgi sinf ArrayManipulations

doubleArray: 0,2 3,4 7,9 8,4 9,3


filledIntArray: 7 7 7 7 7 7 7 7 7 7
intArray: 1 2 3 4 5 6
intArrayCopy: 1 2 3 4 5 6

intArray == intArrayCopy


intArray != filledIntArray
intArray-dagi 4-elementda 5 topildi
8763 intArray-da topilmadi

7.22-rasm | Massivlar sinfi usullari va System.arraycopy. (2-qismning 2-qismi.)

b = Arrays.equals(intArray, filledIntArray);

int joylashuvi = Arrays.binarySearch(intArray, 5);

joy = Arrays.binarySearch(intArray, 8763);

7.16 To'plamlar va sinf ArrayList 287-ga kirish

nusxa ko'chirish. Ikkinchi argument (0) ning boshlang'ich nuqtasini ko'rsatadigan indeksdir
massivdan nusxa ko'chirish uchun elementlar oralig'i. Bu qiymat har qanday yaroqli massiv indeksi bo'lishi mumkin. The
uchinchi argument (intArrayCopy) nusxani saqlaydigan maqsad massivni belgilaydi. The
to'rtinchi argument (0) maqsadli massivdagi indeksni ko'rsatadi, bu erda birinchi nusxa ko'chiriladi.
ment saqlanishi kerak. Oxirgi argument dan nusxa olinadigan elementlar sonini belgilaydi
birinchi argumentdagi massiv. Bunday holda, biz massivdagi barcha elementlarni nusxalaymiz.
30 va 35-qatorlar barcha yoki yo'qligini aniqlash uchun massivlar sinfiga teng statik usulni chaqiradi
ikkita massivning elementlari ekvivalentdir. Agar massivlar ichida bir xil elementlar bo'lsa
bir xil tartib, usul haqiqatni qaytaradi; aks holda, u false qaytaradi.

40 va 49 qatorlar statik usulni chaqiradi binarySearch of class massivlarni bajarish uchun


intArray-da ikkilik qidiruv, ikkinchi argumentdan (mos ravishda 5 va 8763) foydalanib
kalit. Agar qiymat topilsa, binarySearch element indeksini qaytaradi; aks holda, bina-
rySearch salbiy qiymatni qaytaradi. Qaytarilgan salbiy qiymat qidiruv kalitiga asoslanadi
qo'shish nuqtasi - agar biz tanlagan bo'lsak, kalit massivga kiritiladigan indeks.
kiritish operatsiyasini shakllantirish. BinarySearch qo'shish nuqtasini aniqlagandan so'ng, u
Qaytish qiymatini olish uchun uning belgisini manfiyga o'zgartiradi va 1ni ayiradi. Masalan, in
7.22-rasm, 8763 qiymatini kiritish nuqtasi massivdagi 6 indeksli element hisoblanadi.
BinarySearch usuli qo'shish nuqtasini -6 ga o'zgartiradi, undan 1 ni ayiradi va qaytaradi
qiymati -7. Qo'shish nuqtasidan 1ni ayirish binarySearch usulini kafolatlaydi
agar kalit topilsagina ijobiy qiymatlarni qaytaradi (>= 0). Bu qaytish qiymati uchun foydalidir
tartiblangan massivga elementlarni kiritish. 19-bobda ikkilik qidiruv batafsil muhokama qilinadi.

Java SE 8—Class Arrays Method parallelSort


Arrays sinfida endi ko'p yadroli afzalliklardan foydalanadigan bir nechta yangi "parallel" usullar mavjud
apparat. Massivlar usuli parallelSort ko'p massivlarda katta massivlarni samaraliroq saralaydi.
yadro tizimlari. 23.12-bo'limda biz juda katta massiv yaratamiz va uning xususiyatlaridan foydalanamiz
Java SE 8 Date/Time API massivni usullar bilan tartiblash uchun qancha vaqt ketishini solishtirish uchun
tartiblash va parallelSort.
7.16 To'plamlar va Class ArrayList ga kirish
Java API saqlash uchun ishlatiladigan to'plamlar deb ataladigan bir nechta oldindan belgilangan ma'lumotlar tuzilmalarini taqdim etadi
xotiradagi o'zaro bog'liq ob'ektlar guruhlari. Ushbu sinflar samarali usullarni ta'minlaydi,
ma'lumotlarning qanday saqlanishini bilishni talab qilmasdan ma'lumotlaringizni saqlang va oling.
Bu dasturni ishlab chiqish vaqtini qisqartiradi.
Ob'ektlar ketma-ketligini saqlash uchun massivlardan foydalangansiz. Massivlar avtomatik ravishda o'zgarmaydi
qo'shimcha elementlarni joylashtirish uchun ularning bajarilish vaqtidagi o'lchamlari. To'plam sinfi

Xatolarning oldini olish bo'yicha maslahat 7.3


Massiv tarkibini taqqoslashda har doim Arrays.equals(array1, array2) dan foydalaning.
solishtiradigan array1.equals(array2) o'rniga ikkita massivning mazmunini solishtiradi
massiv1 va massiv2 bir xil massiv ob'ektiga ishora qiladimi.

Umumiy dasturlash xatosi 7.6


Saralanmagan massivni binarySearch-ga o'tkazish mantiqiy xatodir - qaytarilgan qiymat o'zgarmaydi.
jarima solingan.

288 7-bob Massivlar va massivlar ro‘yxati

ArrayList (java.util to'plami) bu muammoning qulay yechimini ta'minlaydi
ko'proq elementlarni joylashtirish uchun uning hajmini dinamik ravishda o'zgartirishi mumkin. T (odat bo'yicha) hisoblanadi
to'ldiruvchi - yangi ArrayListni e'lon qilishda uni element turi bilan almashtiring
ArrayList ni ushlab turishini xohlaysiz. Masalan,

ro'yxatni faqat Stringlarni saqlashi mumkin bo'lgan ArrayList to'plami sifatida e'lon qiladi. Bu bilan darslar


har qanday tur bilan ishlatilishi mumkin bo'lgan to'ldiruvchining turiga umumiy sinflar deyiladi. Faqat
primitiv bo'lmagan turlardan o'zgaruvchilarni e'lon qilish va umumiy sinflar ob'ektlarini yaratish uchun foydalanish mumkin. Qanaqasiga-
Java har doim boks deb nomlanuvchi mexanizmni taqdim etadi, bu esa ibtidoiy qiymatlarni bo'lishiga imkon beradi
umumiy sinflar bilan foydalanish uchun ob'ektlar sifatida o'ralgan. Shunday qilib, masalan,

butun sonlarni faqat butun sonlarni saqlashi mumkin bo'lgan ArrayList sifatida e'lon qiladi. Int qo'yganingizda


qiymat ArrayList ga kiritilsa, int qiymati Integer obyekti sifatida qutiga (oʻraladi),
va ArrayList dan Integer obyektini olganingizda, ob'ektni tayinlang
int o'zgaruvchisiga ob'ekt ichidagi int qiymati qutisiz (o'ralgan holda) bo'ladi.
Qo'shimcha umumiy to'plam sinflari va generiklar 16 va 20-boblarda muhokama qilinadi,
mos ravishda. 7.23-rasmda ArrayList sinfining ba'zi umumiy usullari ko'rsatilgan.

ArrayListni namoyish qilish


7.24-rasmda ArrayListning ba'zi umumiy imkoniyatlari ko'rsatilgan. 10-qator yangisini yaratadi
sukut bo'yicha boshlang'ich sig'imi 10 element bo'lgan bo'sh ArrayList Strings. Imkoniyat
ArrayList o'stirmasdan qancha elementlarni saqlashi mumkinligini ko'rsatadi. ArrayList - bu oddiy
parda ortidagi an'anaviy massiv yordamida eslatib o'tilgan. ArrayList o'sganda, u kerak
kattaroq ichki massiv yaratish va har bir elementni yangi massivga nusxalash. Bu vaqt chegarasi
yig'ish operatsiyasi. Har bir elementda ArrayList o'sishi samarasiz bo'ladi
qo'shiladi. Buning o'rniga, u faqat element qo'shilganda va elementlar soni bo'lganda o'sadi
sig'imga teng, ya'ni yangi element uchun joy yo'q.

ArrayList ro'yxati;

ArrayList butun sonlar;

Usul tavsifi

qo'shish ArrayList oxiriga element qo'shadi.
clear ArrayList dan barcha elementlarni olib tashlaydi.
o'z ichiga oladi, agar ArrayList belgilangan elementni o'z ichiga olgan bo'lsa, true qiymatini qaytaradi; aks holda,
false qaytaradi.
get Belgilangan indeksdagi elementni qaytaradi.
indexOf Belgilangan elementning birinchi marta paydo bo'lish indeksini qaytaradi
ArrayList.
Haddan tashqari yuklangan. Belgilangan qiymatning birinchi takrorlanishini yoki elementni olib tashlaydi.
belgilangan indeks bo'yicha ment.
o'lcham ArrayList da saqlangan elementlar sonini qaytaradi.
trimToSize ArrayList hajmini joriy elementlar soniga qisqartiradi.

7.23-rasm | ArrayList sinfining ba'zi usullari va xususiyatlari.


7.16 To'plamlar va sinf ArrayList 289-ga kirish

1 // 7.24-rasm: ArrayListCollection.java
2 // Umumiy ArrayList to'plamining namoyishi.
3 import java.util.ArrayList;
4
5 ommaviy sinf ArrayListCollection
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // boshlang'ich sig'imi 10 bo'lgan yangi qatorlar qatorini yarating
10 ArrayList elementi = new ArrayList();
11
12 element.add("qizil"); // ro'yxatga element qo'shish
13 element.add(0, "sariq"); // 0 indeksiga "sariq" qo'ying
14
15 // sarlavha
16 System.out.print(
17 "Ro'yxat tarkibini qarama-qarshi boshqariladigan pastadir bilan ko'rsatish:");
18
19 // ro'yxatdagi ranglarni ko'rsatish
20 uchun (int i = 0; i < items.size(); i++)
21 System.out.printf(" %s", items.get(i));
22
23 // displey usullarida kengaytirilgan uchun yordamida ranglarni ko'rsatish
24 displey (elementlar,
25 "%nIzoh uchun kengaytirilgan ro'yxat mazmunini ko'rsatish:");
26
27 element.add("yashil"); // ro'yxat oxiriga "yashil" qo'shing
28 ta element.add("sariq"); // ro'yxat oxiriga "sariq" qo'shing
29 displey(elementlar, "Ikkita yangi elementli ro'yxat:");
30
31 ta element.remove("sariq"); // birinchi "sariq" ni olib tashlang
32 displey(elementlar, "Sariq rangning birinchi nusxasini olib tashlang:");
33
34 ta element.remove(1); // 1-indeksdagi elementni olib tashlang
35 displey (elementlar, "Ikkinchi ro'yxat elementini o'chirish (yashil):");
36
37 // Ro'yxatda qiymat mavjudligini tekshiring
38 System.out.printf("\"qizil\" ro'yxatda %sin,%n",
39 ta element.contains("qizil") ? "": "emas");
40
41 // Ro'yxatdagi elementlar sonini ko'rsatish
42 System.out.printf("Hajmi: %s%n", items.size());
43 }
44
45 // konsolda ArrayList elementlarini ko'rsatish
46 ta umumiy statik bekor displey (ArrayList elementlari, String sarlavhasi)
47 {
48 System.out.printf(sarlavha); // sarlavhani ko'rsatish
49
50 // har bir elementni elementlarda ko'rsatish
51 uchun (String elementi: elementlar)
52 System.out.printf(" %s", element);
53

7.24-rasm | Umumiy ArrayList kolleksiyasi namoyishi. (2-qismning 1-qismi.)


290 7-bob Massivlar va massivlar ro‘yxati

Qo'shish usuli ArrayList ga elementlar qo'shadi (12-13 qatorlar). bilan qo'shish usuli
bitta argument o'z argumentini ArrayList oxiriga qo'shadi. Ikki bilan qo'shish usuli
argumentlar belgilangan joyga yangi element kiritadi. Birinchi dalil indeksdir.
Massivlarda bo'lgani kabi, yig'ish indekslari noldan boshlanadi. Ikkinchi argument kiritiladigan qiymatdir
bu indeksda. Barcha keyingi elementlarning indekslari bittaga oshiriladi. kiritish
element odatda ArrayList oxiriga element qo'shishdan ko'ra sekinroq
20–21 qatorlar ArrayListdagi elementlarni aks ettiradi. Metod o'lchami sonini qaytaradi
ArrayList-dagi elementlar. Get usuli (21-satr) belgilangan vaqtda elementni oladi
indeks. 24–25-qatorlar elementlarni displey usulini chaqirish orqali yana aks ettiradi (satrlarda belgilangan
46–55). 27-28 qatorlar ArrayList-ga yana ikkita element qo'shadi, so'ngra 29-satr elementni ko'rsatadi.
Ikki element to'plamning oxiriga qo'shilganligini tasdiqlash uchun yana bir bor.
O'chirish usuli ma'lum bir qiymatga ega bo'lgan elementni olib tashlash uchun ishlatiladi (31-qator). Bu
faqat birinchi bunday elementni olib tashlaydi. Agar ArrayListda bunday element bo'lmasa, o'chiring
hech narsa. Usulning haddan tashqari yuklangan versiyasi ko'rsatilgan indeksdagi elementni olib tashlaydi
(34-qator). Element olib tashlanganda, olib tashlangan elementdan keyingi har qanday elementlarning indekslari
birga kamayadi.
39-qator elementning ArrayList-da mavjudligini tekshirish uchun contain usulidan foydalanadi. kon-
tains usuli, agar element ArrayListda topilsa, true qiymatini qaytaradi, aks holda esa false.
Usul o'z argumentini ArrayList ning har bir elementiga tartibda solishtiradi, shuning uchun foydalanish
katta ArrayList-da mavjud bo'lishi samarasiz bo'lishi mumkin. 42-qator ArrayList o'lchamini ko'rsatadi.
Java SE 7—Diamond (<>) Umumiy sinf ob'ektini yaratish uchun belgi
7.24-rasmning 10-qatorini ko'rib chiqing:

E'tibor bering, ArrayList o'zgaruvchilar deklaratsiyasida va sinf misolida paydo bo'ladi.


yaratilish ifodasi. Java SE 7 bayonotlarni soddalashtirish uchun olmos (<>) belgisini taqdim etdi
shunga o'xshash. Umumiy sinf ob'ekti uchun sinf namunasini yaratish ifodasida <> dan foydalanish
burchak qavslariga nima tegishli ekanligini aniqlash uchun kompilyator. Java SE 7 va undan yuqori versiyalarida
oldingi bayonot quyidagicha yozilishi mumkin:

Kompilyator sinf namunasini yaratish ifodasida olmosga (<>) duch kelganida,


u ArrayList elementi turini aniqlash uchun o'zgaruvchan elementlar deklaratsiyasidan foydalanadi
(String) - bu element turini xulosa qilish sifatida tanilgan.

54 System.out.println();


55 }
56 } // ArrayListCollection klassining yakuni

Ro'yxat tarkibini qarama-qarshi boshqariladigan pastadir bilan ko'rsatish: sariq qizil


Ro'yxat mazmunini ifoda uchun kengaytirilgan ko'rsatish: sariq qizil
Ikkita yangi element bilan ro'yxat: sariq qizil yashil sariq
Sariqning birinchi nusxasini olib tashlang: qizil yashil sariq
Ikkinchi ro'yxat elementini olib tashlang (yashil): qizil sariq
"qizil" ro'yxatda
Hajmi: 2

ArrayList elementlari = new ArrayList();

ArrayList elementlari = new ArrayList<>();

7.24-rasm | Umumiy ArrayList kolleksiyasi namoyishi. (2-qismning 2-qismi.)


7.17 (ixtiyoriy) GUI va grafik misol: Arcs 291 chizish

7.17 (ixtiyoriy) GUI va grafik misollar: chizmachilik
Yoylar
Java-ning grafik xususiyatlaridan foydalanib, biz zerikarliroq bo'ladigan murakkab chizmalarni yaratishimiz mumkin
satr satr kodlash. Shakllarda. 7.25–7.26, biz a chizish uchun massivlar va takroriy iboralardan foydalanamiz
fillArc Grafik usuli yordamida kamalak. Java-da yoylarni chizish chizishga o'xshaydi
ovallar - yoy ovalning oddiy bir qismidir.
7.25-rasmda 10-11 qatorlar ikkita yangi rang konstantasini e'lon qiladi va yaratadi - VIOLET va
INDIGO. Ma'lumki, kamalakning ranglari qizil, to'q sariq, sariq, yashil, ko'k,
indigo va binafsha. Java faqat dastlabki besh rang uchun oldindan belgilangan doimiylarga ega. 15–17 qatorlar
birinchi navbatda eng ichki yoylardan boshlab, kamalak ranglari bilan massivni ishga tushiring. The
massiv ikkita Color.WHITE elementidan boshlanadi, siz tez orada ko'rib turganingizdek, ularni chizish uchun mo'ljallangan.
kamalak markazida bo'sh yoylar. Misol o'zgaruvchilari qachon ishga tushirilishi mumkin
ular 10–17-qatorlarda ko'rsatilganidek e'lon qilinadi. Konstruktor (20–23-qatorlar) bittadan iborat
setBackground (JPanel sinfidan meros bo'lib qolgan) usulini chaqiradigan bayonot
parametr Color.WHITE. SetBackground usuli bitta Color argumentini oladi va
komponentning fonini shu rangga o'rnatadi.

1 // 7.25-rasm: DrawRainbow.java


2 // Kamalakni yoylar va ranglar qatori yordamida chizish.
3 import java.awt.Color;
4 import java.awt.Graphics;
5 import javax.swing.JPanel;
6
7 ochiq sinf DrawRainbow JPanel-ni kengaytiradi
8 {
9 // indigo va binafsha rangni aniqlang
10 ta xususiy yakuniy statik Rang VIOLET = yangi Rang(128, 0, 128);
11 xususiy yakuniy statik Rang INDIGO = yangi Rang(75, 0, 130);
12
13 // kamalakda ishlatiladigan ranglar, eng ichki qismdan boshlab
14 // Ikki oq yozuv natijasida markazda bo'sh yoy paydo bo'ladi
15 ta shaxsiy Rang [] rang =
16 { Rang.OQ, Rangli.OQ, BINAFSHA, INDIGO, Rang.MOK,
17 Rang.YASHIL, Rang.SARIQ, Rang.ORANGE, Rang.QIZIL };
18
19 // konstruktor
20 ommaviy DrawRainbow()
21 {
22 to'plamFafon(Rang.OQ); // fonni oq rangga o'rnating
23 }
24
25 // konsentrik yoylar yordamida kamalak chizadi
26 umumiy bekor bo'yoq Komponenti (Grafika g)
27 {
28 super.paintComponent(g);
29
30 int radius = 20; // yoy radiusi
31

7.25-rasm | Yoylar va ranglar qatori yordamida kamalak chizish. (2-qismning 1-qismi.)


292 7-bob Massivlar va massivlar ro‘yxati

PaintComponent-dagi 30-qator mahalliy o'zgaruvchan radiusni e'lon qiladi, bu esa ni belgilaydi
har bir yoyning radiusi. CentreX va centerY mahalliy o'zgaruvchilari (33–34-qatorlar) joylashuvni aniqlaydi.
kamalak poydevoridagi o'rta nuqta. 37-46-qatorlardagi pastadir boshqaruv parametrlaridan foydalanadi.
birinchi navbatda eng katta yoylarni chizib, massiv oxiridan orqaga qarab sanashga qodir hisoblagich
va har bir keyingi kichik yoyni oldingisining ustiga qo'ying. 40-qator rangni belgilaydi
massivdan joriy yoyni chizish uchun. Buning sababi bizda Color.WHITE yozuvlari
massivning boshlanishi markazda bo'sh yoy yaratishdir. Aks holda, markaz
kamalak shunchaki qattiq binafsha yarim doira bo'lar edi. Siz individual ranglarni o'zgartirishingiz mumkin va
yangi dizaynlarni yaratish uchun massivdagi yozuvlar soni.
43–45 qatorlardagi fillArc usuli chaqiruvi toʻldirilgan yarim doira chizadi. FillArc usuli
oltita parametrni talab qiladi. Birinchi to'rtta yoy joylashgan chegaralovchi to'rtburchakni ifodalaydi
chiziladi. Ulardan birinchi ikkitasi ning yuqori chap burchagi uchun koordinatalarni belgilaydi
chegaralovchi to'rtburchak, keyingi ikkitasi esa uning kengligi va balandligini belgilaydi. Beshinchi parametr
ovaldagi boshlang'ich burchak, oltinchisi esa supurish yoki yoy miqdorini belgilaydi.
qopqoq. Boshlanish burchagi va supurish gradus bilan o'lchanadi, nol daraja ishora qiladi
to'g'ri. Ijobiy supurish yoyni soat miliga teskari yo'nalishda, salbiy surish esa yoyni tortadi
soat yo'nalishi bo'yicha. FillArc-ga o'xshash usul - drawArc - u bilan bir xil parametrlarni talab qiladi
fillArc, lekin uni to'ldirishdan ko'ra yoyning chetini chizadi.
DrawRainbowTest klassi (7.26-rasm) JFrame-ni yaratadi va o'rnatadi.
kamalak. Dastur JFrame-ni ko'rinadigan qilib qo'ygandan so'ng, tizim paintCompo-ni chaqiradi.
ekranda kamalakni chizish uchun DrawRainbow sinfidagi nent usuli.

32 // kamalakni pastki markazga yaqinroq torting


33 int centerX = getWidth() / 2;
34 int centerY = getHeight() - 10;
35
36 // eng chetidan boshlab toʻldirilgan yoylarni chizadi
37 uchun (int counter = color.length; counter > 0; counter--)
38 {
39 // joriy yoy uchun rangni o'rnating
40 g.setColor(ranglar[hisoblagich - 1]);
41
42 // yoyni 0 dan 180 gradusgacha to'ldiring
43 g.fillArc(centerX - hisoblagich * radius,
44 markaz Y - hisoblagich * radius,
45 hisoblagich * radius * 2, hisoblagich * radius * 2, 0, 180);
46 }
47 }
48 } // DrawRainbow sinfini yakunlash

1 // 7.26-rasm: DrawRainbowTest.java


2 // Kamalakni ko'rsatish uchun sinov ilovasi.
3 import javax.swing.JFrame;
4
5 ochiq sinf DrawRainbowTest
6 {

7.26-rasm | Kamalakni ko'rsatish uchun sinov ilovasi. (2-qismning 1-qismi.)

7.25-rasm | Yoylar va ranglar qatori yordamida kamalak chizish. (2-qismning 2-qismi.)

7.17 (ixtiyoriy) GUI va grafik misol: Arcs 293 chizish

GUI va grafik misollarni o'rganish mashqlari
7.1 (Spirallarni chizish) Ushbu mashqda siz drawLine va drawArc usullari bilan spiral chizasiz.
a) Kvadrat shaklidagi spiralni chizing (7.27-rasmdagi chap ekran tasviridagi kabi), markazda joylashgan.
panel, DrawLine usuli yordamida. Texnikalardan biri chiziqni oshiradigan pastadirdan foydalanishdir
har ikkinchi chiziq chizilganidan keyin uzunligi. Keyingi chiziq chizilgan yo'nalish
pastga, chapga, yuqoriga, o'ngga kabi aniq naqshga rioya qilish kerak.
b) usuldan foydalanib, dumaloq spiral chizing (7.27-rasmdagi o'ng ekran tasviridagi kabi)
bir vaqtning o'zida yarim doira chizish uchun drawArc. Har bir keyingi yarim doira kattaroq bo'lishi kerak
radius (chegaraviy to'rtburchakning kengligi bilan belgilangan) va chizishni davom ettirishi kerak
oldingi yarim doira tugagan joyda.

7 ta umumiy statik bekor asosiy (String [] args)


8 {
9 DrawRainbow paneli = yangi DrawRainbow();
10 JFrame ilovasi = yangi JFrame();
11
12 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13 application.add(panel);
14 application.setSize(400, 250);
15 application.setVisible(rost);
16 }
17 } // yakuniy sinf DrawRainbowTest

7.27-rasm | DrawLine (chapda) va drawArc (o'ngda) yordamida spiral chizish.

7.26-rasm | Kamalakni ko'rsatish uchun sinov ilovasi. (2-qismning 2-qismi.)

294 7-bob Massivlar va massivlar ro‘yxati

7.18 Yakunlash
Ushbu bob ma'lumotlar tuzilmalariga kirishni boshladi, saqlash uchun massivlardan foydalanishni o'rgandi
ma'lumotlar ro'yxati va qiymatlar jadvallaridan ma'lumotlarni olish va olish. Bobdagi misollar ko'rsatilgan
massivni qanday e'lon qilish, massivni ishga tushirish va massivning alohida elementlariga murojaat qilish. The
bobda massivlar orqali takrorlash uchun kengaytirilgan for iborasi kiritilgan. Biz bundan foydalanardik -
ArrayIndexOutOfBoundsIstisnolarni sinash uchun dastur bilan ishlash
massiv chegarasidan tashqaridagi massiv elementiga kirishga harakat qiladi. Qanday qilib biz ham tasvirlab berdik
massivlarni usullarga o'tkazish va ko'p o'lchovli massivlarni qanday e'lon qilish va manipulyatsiya qilish. Fi-
Umuman olganda, bob o'zgaruvchan uzunlikdagi argumentlar ro'yxatidan foydalanadigan usullarni qanday yozishni ko'rsatdi va
buyruq satridan dasturga uzatilgan argumentlarni qanday o'qish kerak.
Biz ArrayList umumiy to'plamini taqdim etdik, u barcha funktsiyalarni ta'minlaydi -
massivlarning yaxlitligi va ishlashi, shuningdek, dinamik kabi boshqa foydali imkoniyatlar
hajmini o'zgartirish. ArrayList oxiriga yangi elementlar qo'shish uchun qo'shish usullaridan foydalandik
ArrayList-ga elementlarni qo'shing. O'chirish usuli birinchi hodisani olib tashlash uchun ishlatilgan
belgilangan elementning va oʻchirishning haddan tashqari yuklangan versiyasi aʼdagi elementni olib tashlash uchun ishlatilgan
belgilangan indeks. ArrayListdagi elementlar sonini olish uchun o'lcham usulidan foydalandik.
Biz 16-bob, Umumiy to'plamlarda ma'lumotlar tuzilmalarini yoritishni davom ettiramiz.
16-bob Java Collections Framework-ni taqdim etadi, bu sizga ruxsat berish uchun generiklardan foydalanadi
ma'lum bir ma'lumotlar strukturasi saqlaydigan ob'ektlarning aniq turlarini belgilash. 16-bob
shuningdek, Java-ning boshqa oldindan belgilangan ma'lumotlar tuzilmalari bilan tanishtiradi. 16-bob qo'shimchalarni o'z ichiga oladi
Massivlar sinfining usullari. Siz maqolada muhokama qilingan Massivlar usullaridan foydalanishingiz mumkin
Joriy bobni o'qib chiqqandan so'ng 16-bob, lekin ba'zi Arrays usullarini talab qiladi
keyinroq kitobda keltirilgan tushunchalar haqidagi bilim. 20-bobda generiklar muhokama qilinadi
bir marta e'lon qilinadigan usullar va sinflarning umumiy modellarini yaratish imkonini beradi, lekin
turli xil ma'lumotlar turlari bilan foydalaniladi. 21-bob, Maxsus umumiy ma'lumotlar tuzilmalari, ko'rsatadi
o'sishi mumkin bo'lgan ro'yxatlar, navbatlar, steklar va daraxtlar kabi dinamik ma'lumotlar tuzilmalarini qanday qurish kerak
va dasturlar bajarilayotganda qisqaradi.
Endi biz sinflar, ob'ektlar, boshqaruv bayonotlarining asosiy tushunchalarini kiritdik,
usullar, massivlar va to'plamlar. 8-bobda biz sinflar va ob'ektlarni chuqurroq ko'rib chiqamiz.

Xulosa
7.1-bo'lim Kirish


• Massivlar (244-bet) bir xil turdagi tegishli ma’lumotlar elementlaridan tashkil topgan qat’iy uzunlikdagi ma’lumotlar tuzilmalaridir.
7.2-bo'lim massivlar
• Massiv - bu qiymatlarni o'z ichiga olgan o'zgaruvchilar guruhi (elementlar yoki komponentlar deb ataladi; 245-bet).
hammasi bir xil turga ega. Massivlar ob'ektlardir, shuning uchun ular mos yozuvlar turlari hisoblanadi.
• Dastur deganda massivga kirish ifodasi (245-bet) bo‘lgan massivning har qanday elementi nazarda tutiladi.
massiv nomidan so‘ng kvadrat qavslar ichida alohida element indeksini o‘z ichiga oladi
([]; 245-bet).
• Har bir massivdagi birinchi element indeks nolga ega (245-bet) va ba'zan uni nol element deb ham atashadi.
• Indeks manfiy bo'lmagan butun son bo'lishi kerak. Dastur ifodadan indeks sifatida foydalanishi mumkin.
• Massiv ob'ekti o'z uzunligini biladi va bu ma'lumotni uzunlik namunasi o'zgaruvchisida saqlaydi
(246-bet).

Xulosa 295



7.3-bo'lim Massivlarni e'lon qilish va yaratish
• Massiv obyektini yaratish uchun massiv elementi turini va elementlar sonini bir qismi sifatida belgilang.
new kalit so'zidan foydalanadigan massiv yaratish ifodasi (246-bet).
• Massiv yaratilganda, har bir element birlamchi qiymatni oladi — raqamli ibtidoiy tip uchun nolga teng
elementlar, mantiqiy elementlar uchun false va havolalar uchun null.
• Massiv deklaratsiyasida turi va kvadrat qavslar boshida birlashtirilishi mumkin.
deklaratsiyadagi barcha identifikatorlar massiv o'zgaruvchilari ekanligini ko'rsatadigan deklaratsiya.
• Primitiv tipdagi massivning har bir elementi massiv e'lon qilingan turdagi o'zgaruvchini o'z ichiga oladi. Har bir el-
mos yozuvlar tipidagi massivning e'lon qilingan tipidagi ob'ektga havola.
7.4-bo'lim Massivlardan foydalanishga misollar
• Dastur massivni yaratishi va uning elementlarini massiv initsializer yordamida ishga tushirishi mumkin (248-bet).
• Doimiy o'zgaruvchilar (250-bet) final kalit so'zi bilan e'lon qilinadi, ular boshlanishidan oldin ishga tushirilishi kerak.
ishlatiladi va keyin o'zgartirib bo'lmaydi.
7.5-bo'lim Istisnolarni ko'rib chiqish: noto'g'ri javobni qayta ishlash
• Istisno dastur bajarilayotganda yuzaga keladigan muammoni bildiradi. "istisno" nomi
muammo kamdan-kam hollarda yuzaga kelishini ko'rsatadi - agar "qoida" odatda bayonot bajarilsa
to'g'ri bo'lsa, muammo "qoidadan istisno" ni ifodalaydi.
• Istisnolarni qayta ishlash (256-bet) sizga nosozliklarga chidamli dasturlar yaratish imkonini beradi.
• Java dasturi ishga tushganda, JVM massiv indekslarini tekshiradi, ularning kattaroq ekanligiga ishonch hosil qiladi.
yoki 0 ga teng va massiv uzunligidan kichik. Agar dastur noto'g'ri indeksdan foydalansa, Java yaratadi
dasturda bajarilish vaqtida xatolik yuz berganligini bildiruvchi istisno (256-bet).
• Istisnoni hal qilish uchun istisnoga olib kelishi mumkin bo'lgan har qanday kodni (256-bet) sinab ko'rish holatiga qo'ying.
ment.
• Sinab ko'rish bloki (256-bet) istisnoga olib kelishi mumkin bo'lgan kodni va catch blokini o'z ichiga oladi.
(256-bet) agar biron bir istisno yuzaga kelsa, uni boshqaradigan kodni o'z ichiga oladi.
• Tashilishi mumkin bo'lgan har xil turdagi istisnolarni boshqarish uchun sizda ko'plab tutqich bloklari bo'lishi mumkin
mos keladigan sinash bloki.
• Sinab ko'rish bloki tugagach, sinab ko'rish blokida e'lon qilingan har qanday o'zgaruvchilar doiradan chiqib ketadi.
• catch bloki tur va istisno parametrini e'lon qiladi. Tutqich blokining ichida siz foydalanishingiz mumkin
tutilgan istisno ob'ekti bilan ishlash uchun parametr identifikatori.
• Dastur bajarilganda massiv elementi indekslari haqiqiyligi tekshiriladi—barcha indekslar
0 dan katta yoki teng va massiv uzunligidan kichik. Agar in-dan foydalanishga harakat qilinsa
elementga kirish uchun joriy indeks bo'lsa, ArrayIndexOutOfRangeException (p. 257) istisnosi yuzaga keladi.
• Istisno obyektining toString usuli istisnoning xato xabarini qaytaradi.
7.6-bo'lim Case Study: Kartalarni aralashtirish va muomala simulyatsiyasi
• Ob'ekt String bo'lgan joyda foydalanilganda ob'ektning toString usuli bilvosita chaqiriladi
kutilgan (masalan, printf %s format spetsifikatsiyasi yordamida ob'ektni String sifatida chiqarganda yoki qachon
ob'ekt + operatori yordamida Stringga birlashtiriladi).
7.7-bo'lim bayonot uchun kengaytirilgan
• Kengaytirilgan for bayonoti (262-bet) massiv yoki massiv elementlarini takrorlash imkonini beradi.
hisoblagichdan foydalanmasdan yig'ish. Kengaytirilgan for bayonotining sintaksisi:
uchun (parametr: arrayName)
bayonot

296 7-bob Massivlar va massivlar ro‘yxati



bu erda parametrning turi va identifikatori (masalan, int raqami) mavjud va arrayName massivdir
takrorlash orqali.
• Kengaytirilgan for bayonotidan massiv elementlarini o'zgartirish uchun ishlatib bo'lmaydi. Agar dastur kerak bo'lsa
elementlarni o'zgartirish uchun, bayonot uchun an'anaviy counter-controlled foydalaning.
7.8-bo'lim Massivlarni usullarga o'tkazish
• Argument qiymat bo'yicha uzatilganda, argument qiymatining nusxasi tuziladi va argumentga uzatiladi.
usul deb ataladi. Chaqirilgan usul faqat nusxa bilan ishlaydi.
7.9-bo'lim Qiymati bo'yicha o'tish va o'tish bo'yicha
• Argument mos yozuvlar orqali uzatilganda (265-bet), chaqirilgan usul argumentga kirishi mumkin.
to'g'ridan-to'g'ri qo'ng'iroq qiluvchidagi qiymat va uni o'zgartirishi mumkin.
• Java'dagi barcha argumentlar qiymat bo'yicha uzatiladi. Usul chaqiruvi metodga ikki turdagi qiymatlarni o'tkazishi mumkin.
od - ibtidoiy qiymatlarning nusxalari va ob'ektlarga havolalar nusxalari. Ob'ektga havola bo'lsa-da
qiymat boʻyicha uzatilgan boʻlsa (265-bet), metod havola qilingan obʼyekt bilan oʻzining chaqiruvi orqali oʻzaro taʼsir qilishi mumkin.
ob'ekt ma'lumotnomasining nusxasidan foydalangan holda ommaviy usullar.
• Usulga ob'ekt havolasini o'tkazish uchun usulda chaqiruv nomini ko'rsatish kifoya.
ob'ektga tegishli bo'lgan qobiliyat.
• Massiv yoki mos yozuvlar tipidagi alohida massiv elementini metodga o'tkazganingizda, chaqiriladi
usul massiv yoki element havolasining nusxasini oladi. Alohida elementni o'tkazganingizda
ibtidoiy turdagi, chaqirilgan usul element qiymatining nusxasini oladi.
• Usulga alohida massiv elementini o'tkazish uchun massivning indekslangan nomidan foydalaning.
7.11-bo'lim Ko'p o'lchovli massivlar
• Ikki o'lchovli ko'p o'lchovli massivlar ko'pincha qiymatlar jadvallarini ifodalash uchun ishlatiladi.
satrlar va ustunlar bo'yicha joylashtirilgan ma'lumotlar to'plami.
• m satr va n ta ustundan iborat ikki o‘lchovli massiv (272-bet) m-by-n massiv deyiladi. Bunday a
massiv formaning massiv initsializatori bilan ishga tushirilishi mumkin
arrayType[][] arrayName = {{1-satrni ishga tushirish}, {2-satrni ishga tushirish}, …};
• Ko'p o'lchovli massivlar alohida bir o'lchovli massivlar massivlari sifatida saqlanadi. Natijada,
ikki o'lchovli massivdagi qatorlar uzunligi bir xil bo'lishi shart emas.
• Har bir satrda bir xil sonli ustunlarga ega bo'lgan ko'p o'lchovli massiv a bilan yaratilishi mumkin
shaklning massiv yaratish ifodasi
arrayType[][] arrayName = yangi arrayType[numRows][numColumns];
7.13-bo'lim o'zgaruvchan uzunlikdagi argumentlar ro'yxati
• Usul parametrlari ro‘yxatidagi ellips (...; 281-bet)dan keyin argument turi shuni ko‘rsatadiki
usul ushbu turdagi argumentlarning o'zgaruvchan sonini oladi. Ellips paydo bo'lishi mumkin
usulning parametrlar ro'yxatida faqat bir marta. U parametrlar ro'yxatining oxirida bo'lishi kerak.
• O‘zgaruvchan uzunlikdagi argumentlar ro‘yxati (281-bet) usul tanasi ichida massiv sifatida ko‘rib chiqiladi. soni-
massivdagi argumentlar qatorini massiv uzunligi maydoni yordamida olish mumkin.
7.14-bo'lim Buyruqlar qatori argumentlaridan foydalanish
• Argumentlarni buyruq satridan main (283-bet) ga o‘tkazishga parametrni kiritish orqali erishiladi.
Asosiy parametrlar ro'yxatida String[] turi. Shartnomaga ko'ra, main parametri args deb nomlanadi.
• Java java buyrug'idagi sinf nomidan keyin paydo bo'ladigan buyruq qatori argumentlarini o'tkazadi
Argus massividagi strings sifatida ilovaning asosiy usuli.

O'z-o'zini tekshirish mashqlari 297



7.15-bo'lim Sinf massivlari
• Sinf massivlari (285-bet) umumiy massiv manipulyatsiyasini amalga oshiradigan statik usullarni ta'minlaydi.
massivni saralash uchun sort, tartiblangan massivni qidirish uchun binarySearch, massivlarni solishtirish uchun tengdir
va elementlarni massivga joylashtirish uchun toʻldiring.
• Class System massivni nusxalash usuli (285-bet) bitta massivning elementlarini nusxalash imkonini beradi.
boshqa.
7.16-bo'lim To'plamlar va Class ArrayList-ga kirish
• Java API yig'ish sinflari ma'lumotlarni tartibga solish, saqlash va olishning samarali usullarini taqdim etadi
ma'lumotlar qanday saqlanishini bilishni talab qilmasdan.
• ArrayList (288-bet) massivga o'xshaydi, lekin hajmini dinamik ravishda o'zgartirish mumkin.
• Bitta argumentli qo‘shish usuli (290-bet) elementni ArrayList oxiriga qo‘shadi.
• Ikki argumentli qo'shish usuli ArrayListdagi belgilangan joyga yangi elementni kiritadi.
• Hajmi usuli (290-bet) ArrayListda mavjud elementlar sonini qaytaradi.
• Argument sifatida obyektga havola bilan olib tashlash usuli birinchi elementni olib tashlaydi
argument qiymatiga mos keladi.
• Butun son argumenti bilan olib tashlash usuli belgilangan indeksdagi elementni olib tashlaydi va
ushbu indeksdan yuqoridagi barcha elementlar bittaga pastga siljiydi.
• Agar element ArrayList da topilsa, contain usuli true qiymatini qaytaradi, aks holda esa false.
O'z-o'zini tekshirish mashqlari
7.1 Quyidagi gaplarning har biridagi bo'sh joy(lar)ni to'ldiring:
a) qiymatlar ro'yxati va jadvallari va ichida saqlanishi mumkin.
b) Massiv - bu qiymatlarni o'z ichiga olgan (elementlar yoki komponentlar deb ataladigan) guruh
hammasi bir xil.
c) Massiv elementlarini hisoblagichdan foydalanmasdan takrorlash imkonini beradi.
d) massivning muayyan elementiga murojaat qilish uchun foydalaniladigan raqam elementning soni deb ataladi.
e) Ikkita indeks ishlatadigan massiv a(n) massiv deb ataladi.
f) Ikki massiv raqamlari bo'ylab yurish uchun kengaytirilgan for bayonotidan foydalaning.
g) Buyruqlar qatori argumentlari saqlanadi.
h) Buyruqdagi argumentlarning umumiy sonini olish uchun ifodadan foydalaning
chiziq. Buyruqlar qatori argumentlari String[] argumentlarida saqlangan deb faraz qiling.
i) Java MyClass test buyrug'ini hisobga olgan holda, birinchi buyruq qatori argumenti .
j) Usulning parametrlar ro'yxatidagi A(n) usuli qabul qilish mumkinligini ko'rsatadi
argumentlarning o'zgaruvchan soni.
7.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Massiv turli xil qiymatlarni saqlashi mumkin.
b) Massiv indeksi odatda float tipida bo'lishi kerak.
c) Usulga o'tgan va shu usulda o'zgartirilgan alohida massiv elementi
chaqirilgan usul bajarishni tugatgandan so'ng o'zgartirilgan qiymatni o'z ichiga oladi.
d) Buyruqlar qatori argumentlari vergul bilan ajratiladi.
7.3 Kasrlar deb nomlangan massiv uchun quyidagi vazifalarni bajaring:
a) 10 ga ishga tushirilgan doimiy ARRAY_SIZE ni e'lon qiling.
b) double tipidagi ARRAY_SIZE elementlarga ega massivni e'lon qiling va elementlarni 0 ga boshlang.
c) 4-massiv elementiga murojaat qiling.
d) 9-massiv elementiga 1,667 qiymatini belgilang.
e) 6-massiv elementiga 3.333 qiymatini belgilang.

298 7-bob Massivlar va massivlar ro‘yxati

f) for operatoridan foydalanib massivning barcha elementlarini jamlang. X butun o'zgaruvchisini e'lon qiling
tsikl uchun boshqaruv o'zgaruvchisi sifatida.
7.4 Jadval deb nomlangan massiv uchun quyidagi vazifalarni bajaring:
a) Massivni uchta satr va uchta ustundan iborat butun sonli massiv sifatida e'lon qiling va yarating.
ARRAY_SIZE doimiysi 3 deb e'lon qilingan deb faraz qilaylik.
b) Massiv nechta elementdan iborat?
c) massivning har bir elementini indekslari yig‘indisiga initsiallashtirish uchun for operatoridan foydalaning. As-
x va y butun o'zgaruvchilar nazorat o'zgaruvchilari sifatida e'lon qilingan deb faraz qilaylik.
7.5 Quyidagi dastur segmentlarining har biridagi xatoni toping va tuzating:
a) yakuniy int ARRAY_SIZE = 5;
ARRAY_SIZE = 10;
b) faraz qilaylik int[] b = new int[10];
uchun (int i = 0; i <= b.uzunlik; i++)
b[i] = 1;
c) int[][] a = {{1, 2}, {3, 4}} deb faraz qiling;
a[1, 1] = 5;
O'z-o'zini tekshirish mashqlariga javoblar
7.1 a) massivlar, kolleksiyalar. b) o'zgaruvchilar, turlar. c) bayonot uchun kengaytirilgan. d) indeks (yoki pastki indeks
yoki lavozim raqami). e) ikki o'lchovli. f) uchun (juft d : raqamlar). g) satrlar massivi, deyiladi
konventsiya bo'yicha args. h) args.uzunlik. i) sinov. j) ellips (...).
7.2 a) noto'g'ri. Massiv faqat bir xil turdagi qiymatlarni saqlashi mumkin.
b) yolg'on. Massiv indeksi butun yoki butun son ifodasi bo'lishi kerak.
c) massivning alohida primitiv tipdagi elementlari uchun: False. Chaqirilgan usul va qabul qiladi
bunday element qiymatining nusxasini manipulyatsiya qiladi, shuning uchun o'zgartirishlar ta'sir qilmaydi
asl qiymati. Agar massivning havolasi usulga o'tkazilsa, lekin modifikatsiyalar
chaqirilgan usulda qilingan massiv elementlariga, albatta, asl nusxada aks ettirilgan. Uchun
mos yozuvlar turining alohida elementlari: rost. Chaqirilgan usul nusxasini oladi
bunday elementga havola va havola qilingan ob'ektga o'zgartirishlar aks ettiriladi
massivning asl elementi.
d) yolg'on. Buyruqlar qatori argumentlari bo'sh joy bilan ajratilgan.
7.3 a) yakuniy int ARRAY_SIZE = 10;
b) double[] kasrlar = yangi double[ARRAY_SIZE];
c) kasrlar[4]
d) kasrlar[9] = 1,667;
e) kasrlar[6] = 3,333;
f) ikki barobar umumiy = 0,0;
uchun (int x = 0; x < fractions.length; x++)
jami += kasrlar[x];
7.4 a) int[][] jadval = yangi int[ARRAY_SIZE][ARRAY_SIZE];
b) to'qqiz.
c) uchun (int x = 0; x < table.length; x++)
uchun (int y = 0; y jadval[x][y] = x + y;
7.5 a) Xato: Konstanta ishga tushirilgandan keyin qiymatni belgilash.
Tuzatish: ARRAY_SIZE yakuniy intdagi konstantaga toʻgʻri qiymatni belgilang
deklaratsiya yoki boshqa o'zgaruvchini e'lon qilish.

299-mashqlar



b) Xato: (b[10]) massiv chegarasidan tashqaridagi massiv elementiga murojaat qilish.
Tuzatish: <= operatorini < ga o'zgartiring.
c) Xato: massivni indekslash noto'g'ri bajarilgan.
Tuzatish: bayonotni a[1][1] = 5; ga o'zgartiring.
Mashqlar
7.6 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Bir o'lchovli p massiv to'rtta elementni o'z ichiga oladi. Bu elementlarning nomlari
, , va.
b) massivga nom berish, uning turini ko‘rsatish va massivdagi o‘lchamlar sonini ko‘rsatish.
massiv deyiladi.
c) Ikki o'lchovli massivda birinchi indeks elementni va elementni aniqlaydi.
ikkinchi indeks elementni aniqlaydi.
d) m-by-n massivida qatorlar, ustunlar va elementlar mavjud.
e) d massivning 3-qator va 5-ustunidagi elementning nomi .
7.7 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Massiv ichidagi ma'lum joy yoki elementga murojaat qilish uchun biz uning nomini belgilaymiz
massiv va muayyan elementning qiymati.
b) Massiv deklaratsiyasi massiv uchun joy ajratadi.
c) p butun son massivi uchun 100 ta joy ajratilishi kerakligini ko'rsatish uchun siz dec-ni yozasiz.
laratsiya
p[100];
d) 15 elementli massivning elementlarini nolga tenglashtiradigan dastur quyidagilarni o'z ichiga olishi kerak.
bayonot uchun kamida bitta.
e) Ikki o'lchovli massivning elementlarini jamlovchi ilovada ichki o'rnatilgan bo'lishi kerak
bayonotlar uchun.
7.8 Quyidagi vazifalarning har birini bajarish uchun Java bayonotlarini yozing:
a) f massivning 6-elementi qiymatini ekranga chiqarish.
b) Bir o'lchovli g butun sonli massivning beshta elementining har birini 8 ga boshlang.
c) suzuvchi nuqtali massivning 100 ta elementi c.
d) 11 elementli a massivni b massivning 34 ta elementdan iborat birinchi qismiga nusxalash.
e) 99 elementli suzuvchi-da joylashgan eng kichik va eng katta qiymatlarni aniqlang va ko'rsating.
nuqta massivi w.
7.9 Ikki-uchta butun sonli t massivini ko'rib chiqaylik.
a) t ni bildiruvchi va hosil qiluvchi gap yozing.
b) t nechta qatordan iborat?
c) t nechta ustundan iborat?
d) t nechta elementdan iborat?
e) t ning 1-qatoridagi barcha elementlarga kirish ifodalarini yozing.
f) t ning 2-ustunidagi barcha elementlar uchun kirish ifodalarini yozing.
g) 0-qator va 1-ustundagi t elementini nolga tenglashtiradigan bitta gap yozing.
h) t ning har bir elementini nolga tenglashtirish uchun alohida gaplarni yozing.
i) t ning har bir elementini nolga aylantiruvchi nested for iborasini yozing.
j) t ning elementlari uchun qiymatlarni foydalanuvchidan kirituvchi nested for operatorini yozing.
k) t dagi eng kichik qiymatni aniqlaydigan va ko'rsatadigan bir qator gaplarni yozing.
l) t ning birinchi qatori elementlarini aks ettiruvchi bitta printf operatorini yozing.
m) t ning uchinchi ustuni elementlarini jamlagan gap yozing. Takrorlashdan foydalanmang.
n) t ning mazmunini jadval shaklida aks ettiruvchi bir qator gaplarni yozing. Ro'yxatga kiriting
ustun indekslarini yuqoridagi sarlavhalar sifatida kiriting va har bir satrning chap tomonidagi satr indekslarini sanab o'ting.

300 7-bob Massivlar va massivlar ro‘yxati



7.10 (Sotish komissiyalari) Quyidagi muammoni hal qilish uchun bir o'lchovli massivdan foydalaning:
pany o'z sotuvchilariga komissiya asosida to'laydi. Sotuvchilar haftasiga 200 dollar va 9% oladi
ularning o'sha haftadagi yalpi savdosi. Misol uchun, bir hafta ichida 5000 dollar sotgan sotuvchi
200 dollar va 5000 dollarning 9% yoki jami 650 dollar oladi. Ilova yozing (bir qator hisoblagichlar yordamida)
bu quyidagi diapazonlarning har birida qancha sotuvchining ish haqi olganligini aniqlaydi (deylik
har bir sotuvchining ish haqi butun songa qisqartiriladi):
a) 200-299 dollar
b) 300–399 dollar
c) 400–499 dollar
d) 500-599 dollar
e) 600-699 dollar
f) 700–799 dollar
g) 800-899 dollar
h) 900–999 dollar
i) 1000 dollar va undan yuqori
Natijalarni jadval shaklida umumlashtiring.
7.11 Quyidagi bir o‘lchovli massiv amallarini bajaradigan gaplarni yozing:
a) Butun massiv sonlarining 10 ta elementini nolga qo'ying.
b) Butun massiv bonusining 15 ta elementining har biriga bittadan qo'shing.
c) bestScores butun son massivining beshta qiymatini ustun formatida ko'rsatish.
7.12 (Dublicate Elimination) Quyidagi muammoni hal qilish uchun bir o'lchovli massivdan foydalaning:
Har biri 10 dan 100 gacha bo'lgan beshta raqamni kiritadigan dastur yozing. Har bir raqam kabi
o'qilgan bo'lsa, uni faqat o'qilgan raqamning dublikati bo'lmasa ko'rsating. "Eng yomon vaziyatni" ta'minlang,
unda barcha beshta raqam boshqacha. Ushbu muammoni hal qilish uchun eng kichik massivdan foydalaning. Displey
foydalanuvchi har bir yangi qiymatni kiritgandan so'ng kiritilgan noyob qiymatlarning to'liq to'plami.
7.13 Buyurtmani ko'rsatish uchun uchdan beshga ikki o'lchovli massiv savdosi elementlarini belgilang.
Quyidagi dastur segmenti tomonidan ular nolga o'rnatiladi:
uchun (int row = 0; row < sales.length; row++)
{
uchun (int col = 0; col < sales[satr].length; col++)
{
savdo[satr][kol] = 0;
}
}
7.14 (O'zgaruvchan uzunlikdagi argumentlar ro'yxati) Seriya mahsulotini hisoblaydigan dastur yozing
o'zgaruvchan uzunlikdagi argumentlar ro'yxatidan foydalanib, usul mahsulotiga o'tkaziladigan butun sonlar. Metodingizni sinab ko'ring -
od bir nechta qo'ng'iroqlar bilan, har biri turli xil argumentlarga ega.
7.15 (Buyruqlar qatori argumentlari) 7.2-rasmni massivning o‘lchami ko‘rsatilishi uchun qayta yozing.
birinchi buyruq qatori argumenti. Agar buyruq qatori argumenti berilmagan bo'lsa, standart o'lcham sifatida 10 dan foydalaning
massivdan.
7.16 (Enhanced for Statementdan foydalanish) Davlat uchun kengaytirilgan dasturni yozing.
buyruq qatori argumentlari tomonidan o'tkazilgan ikki tomonlama qiymatlarni yig'ish uchun. [Maslahat: Statikdan foydalaning
Stringni double qiymatga aylantirish uchun Double sinfining parseDouble usuli.]
7.17 (Dice Rolling) Ikki zarni taqlid qilish uchun ariza yozing. Ilova
birinchi matritsani aylantirish uchun bir marta Random sinfidagi ob'ektdan foydalanish kerak va ikkinchi matritsani aylantirish uchun yana bir marta ishlatish kerak. The
keyin ikkita qiymatning yig'indisini hisoblash kerak. Har bir o'lim 1 dan 6 gacha butun son qiymatini ko'rsatishi mumkin, shuning uchun
qiymatlar yig'indisi 2 dan 12 gacha o'zgaradi, 7 eng tez-tez yig'indi, 2 va 12 esa
eng kam tez-tez. 7.28-rasmda ikkita zarning 36 ta mumkin bo'lgan kombinatsiyasi ko'rsatilgan. Sizning arizangiz

301-mashqlar

zarni 36 000 000 marta tashlashi kerak. Ko'p marta hisoblash uchun bir o'lchovli massivdan foydalaning
har bir mumkin bo'lgan summa paydo bo'ladi. Natijalarni jadval shaklida ko'rsatish.

7.18 (Game of Craps) 1.000.000 craps oʻyinini ishga tushiradigan dastur yozing (6.8-rasm) va


quyidagi savollarga javob beradi:
a) Birinchi, ikkinchi, ..., yigirmanchi va undan keyin qancha o'yin yutiladi.
yigirmanchi rol?
b) Birinchi, ikkinchi, ..., yigirmanchi va undan keyin qancha o'yin yo'qoladi.
yigirmanchi rol?
c) crapsda g'alaba qozonish ehtimoli qanday? [Izoh: Siz craps bir ekanligini kashf kerak
eng adolatli kazino o'yinlaridan. Sizningcha, bu nimani anglatadi?]
d) craps o'yin o'rtacha uzunligi nima?
e) G'alaba qozonish imkoniyati o'yin davomiyligi bilan yaxshilanadimi?
7.19 (Aviakompaniyalarni bron qilish tizimi) Kichik aviakompaniya o'zining yangi aktsiyalari uchun kompyuter sotib oldi.
tomatlangan bron qilish tizimi. Sizdan yangi tizimni ishlab chiqish taklif qilindi. Siz ilova yozishingiz kerak -
aviakompaniyaning yagona samolyotining har bir reysida o'rindiqlarni belgilash to'g'risida iltimosnoma (sig'imi: 10 o'rin).
Ilovangiz quyidagi muqobil variantlarni ko'rsatishi kerak: Iltimos, Birinchi sinf uchun 1 ni kiriting va
Iqtisodiyot uchun 2 ni kiriting. Agar foydalanuvchi 1 ni yozsa, ilovangiz birinchi navbatda joy belgilashi kerak.
sinf bo'limi (1-5 o'rinlar). Agar foydalanuvchi 2 ni yozsa, ilovangiz iqtisodiyotda o'rinni belgilashi kerak
bo'lim (6-10 o'rinlar). Keyin arizangizda shaxsni ko'rsatuvchi bortga chiqish talonini ko'rsatishi kerak
o'rindiq raqami va u samolyotning birinchi toifali yoki iqtisodiy bo'limidami.
O'rindiqlar jadvalini ko'rsatish uchun ibtidoiy turdagi mantiqiy bir o'lchovli massivdan foydalaning
samolyot. Barcha oʻrindiqlar boʻshligini koʻrsatish uchun massivning barcha elementlarini “false” ga boshlang. Sifatida
har bir o'rindiq tayinlangan bo'lsa, o'rindiq ekanligini ko'rsatish uchun massivning mos elementini true ga o'rnating
endi mavjud emas.
Sizning arizangiz hech qachon tayinlangan joyni tayinlamasligi kerak. Iqtisodiyot qachon
bo'lim to'lgan bo'lsa, sizning arizangiz birinchi toifaga joylashtirilishi mumkinmi yoki yo'qligini so'rashi kerak
bo'lim (va aksincha). Ha bo'lsa, tegishli o'rindiqni tayinlang. Agar yo'q bo'lsa, xabarni ko'rsating
"Keyingi reys 3 soatdan keyin jo'naydi."
7.20 (Jami savdo) Quyidagi muammoni hal qilish uchun ikki o'lchovli massivdan foydalaning: Kompaniya mavjud
besh xil mahsulotni (1 dan 5 gacha) sotadigan to'rtta sotuvchi (1 dan 4 gacha). Kuniga bir marta, har bir sotuvchi o'tadi
sotilgan mahsulotning har bir turi uchun slipda. Har bir slipda quyidagilar mavjud:
a) sotuvchining raqami
b) mahsulot raqami
c) o'sha kuni sotilgan mahsulotning umumiy dollar qiymati
Shunday qilib, har bir sotuvchi kuniga 0 dan 5 gacha bo'lgan savdo varaqlarini o'tkazadi. Ma'lumot deb taxmin qiling
o'tgan oy uchun barcha slips mavjud. Ushbu ma'lumotlarni o'qib chiqadigan ariza yozing

7.28-rasm | Ikki zarning 36 ta mumkin bo'lgan summasi.

2

1

3


4
5
6

3

2



4
5
6
7

4

3



5
6
7
8

5

4



6
7
8
9

6

5



7
8
9
10

7

6



8
9
10
11

8

7



9
10
11
12

1 2 3 4 5 6


302 7-bob Massivlar va massivlar ro‘yxati

o'tgan oydagi sotuvlar va sotuvchi va mahsulot bo'yicha jami sotishni umumlashtiring. Barcha jami bo'lishi kerak
ikki o'lchovli qator sotishda saqlanadi. O'tgan oy uchun barcha ma'lumotlarni qayta ishlagandan so'ng, o'chiring
natijalarni jadval ko'rinishida o'ynang, har bir ustun sotuvchini va har bir satrni ifodalaydi.
muayyan mahsulotni yuborish. O'tgan oy uchun har bir mahsulotning umumiy sotuvini olish uchun har bir qatorni o'zaro solishtiring.
O'tgan oy uchun sotuvchi tomonidan jami sotishni olish uchun har bir ustunni o'zaro solishtiring. Sizning chiqishingiz kerak
jamlangan satrlarning o'ng tomoniga va jami ustunlarning pastki qismiga ushbu o'zaro jamlamalarni kiriting.
7.21 (Turtle Graphics) Logo tili toshbaqa grafikasi tushunchasini mashhur qildi. Tasavvur qiling
Java ilovasi nazorati ostida xona bo'ylab yuradigan mexanik toshbaqa. Toshbaqa
qalamni yuqoriga yoki pastga ikkita holatdan birida ushlab turadi. Qalam pastga tushganda, toshbaqa shakllarni izlaydi
harakatlanayotganda va qalam ko'tarilganda, toshbaqa hech narsa yozmasdan erkin harakat qiladi. Bunda
Muammo bo'lsa, siz toshbaqaning ishlashini simulyatsiya qilasiz va kompyuterlashtirilgan eskiz paneli yaratasiz.
Nolga tenglashtirilgan 20x20 massiv qavatidan foydalaning. Massivdagi buyruqlarni o'qing:
ularni tortadi. Har doim toshbaqaning hozirgi holatini va qalamning burilmaganligini kuzatib boring.
ijaraga yuqoriga yoki pastga. Tasavvur qiling, toshbaqa har doim ruchkasi bilan polning (0, 0) holatidan boshlanadi
yuqoriga. Ilovangiz qayta ishlanishi kerak bo'lgan toshbaqa buyruqlar to'plami 7.29-rasmda ko'rsatilgan.

Aytaylik, toshbaqa zaminning markaziga yaqin joyda joylashgan. Quyidagi "dastur"


qalamni yuqori holatda qoldirib, 12x12 kvadrat chizadi va ko'rsatadi:
2
5,12
3
5,12
3
5,12
3
5,12
1
6
9
Toshbaqa qalam pastga qarab harakatlanayotganda, massiv qavatining tegishli elementlarini 1s ga o'rnating. Qachon
6 buyrug'i (massivni ko'rsatish) berilgan, massivda 1 bo'lgan joyda yulduzcha yoki boshqasini ko'rsating.
siz tanlagan xarakter. Qaerda 0 bo'lsa, bo'sh joyni ko'rsating.
Bu yerda muhokama qilingan toshbaqa grafik imkoniyatlarini amalga oshirish uchun ariza yozing. Bir nechta yozing
qiziqarli shakllarni chizish uchun toshbaqa grafik dasturlari. Quvvatini oshirish uchun boshqa buyruqlarni qo'shing
toshbaqa grafik tilingiz.

Buyruqning ma'nosi

1 Qalamni ko'taring
2 Qalamni pastga tushiring

3 O'ngga buriling


4 Chapga buriling
5,10 10 ta boʻshliqni oldinga siljiting (boshqa boʻshliqlar uchun 10 tasini almashtiring)
6 20x20 massivni ko'rsating
9 Ma'lumotlarning oxiri (sentinel)

7.29-rasm | Toshbaqa grafik buyruqlari.


303-mashqlar

7.22 (Knight's Tour) Shaxmat ishqibozlari uchun qiziqarli boshqotirma bu Ritsar sayohati muammosi, asli-
Matematik Eyler tomonidan taklif qilingan. Ritsar dona bo'sh shaxmat atrofida aylana oladimi?
taxta va 64 kvadratning har biriga bir marta va faqat bir marta teging? Biz ushbu qiziqarli muammoni o'rganamiz
bu erda chuqurlik.
Ritsar faqat L shaklidagi harakatlarni amalga oshiradi (bir yo'nalishda ikkita bo'shliq va har bir bo'shliqda bitta bo'shliq).
pendikulyar yo'nalish). Shunday qilib, 7.30-rasmda ko'rsatilganidek, bo'shning o'rtasiga yaqin kvadratdan
shaxmat taxtasida, ritsar (yorlig'i K) sakkiz xil harakatni amalga oshirishi mumkin (0 dan 7 gacha raqamlangan).

a) Qog'ozga sakkizga sakkizta shaxmat taxtasini chizing va ritsarning sayohatiga harakat qiling.


qo'l. Boshlang'ich kvadratga 1, ikkinchi kvadratga 2, uchinchi kvadratga 3 va hokazolarni qo'ying.
Ekskursiyani boshlashdan oldin, to'liq esda tutgan holda, qanchalik uzoqqa borishingizni taxmin qiling
ekskursiya 64 ta harakatdan iborat. Qancha masofaga yetdingiz? Bu sizning taxminingizga yaqin edimi?
b) Endi ritsarni shaxmat taxtasi atrofida harakatlantiruvchi dastur ishlab chiqamiz. The
doska sakkizdan sakkizga ikki o'lchovli massiv taxtasi bilan ifodalanadi. Har bir kvadrat
nolga tenglashtirildi. Biz sakkizta mumkin bo'lgan harakatlarning har birini uning ufqlari nuqtai nazaridan tasvirlaymiz.
tal va vertikal komponentlar. Misol uchun, 7.30-rasmda ko'rsatilganidek, 0 turdagi harakat, con-
ikkita kvadratni gorizontal ravishda o'ngga va bitta kvadratni vertikal ravishda yuqoriga ko'chirishdan iborat.
2-turdagi harakat bir kvadratni gorizontal ravishda chapga va ikkita kvadratga siljitishdan iborat
vertikal yuqoriga. Gorizontal chapga, vertikal harakat esa yuqoriga ko'rsatilgan
manfiy raqamlar bilan. Sakkizta harakatni ikkita bir o'lchovli ar-
gorizontal va vertikal nurlar quyidagicha:
gorizontal[0] = 2 vertikal[0] = -1
gorizontal[1] = 1 vertikal[1] = -2
gorizontal[2] = -1 vertikal[2] = -2
gorizontal[3] = -2 vertikal[3] = -1
gorizontal[4] = -2 vertikal[4] = 1
gorizontal[5] = -1 vertikal[5] = 2
gorizontal[6] = 1 vertikal[6] = 2
gorizontal[7] = 2 vertikal[7] = 1
currentRow va currentColumn o'zgaruvchilari qator va ustunni ko'rsatsin,
mos ravishda, ritsarning hozirgi mavqei. moveNumber turidagi harakatni amalga oshirish uchun,
Agar moveNumber 0 dan 7 gacha bo'lsa, ilovangiz bayonotlardan foydalanishi kerak
currentRow += vertikal [moveNumber];
currentColumn += gorizontal [moveNumber];
Ritsarni shaxmat taxtasi atrofida harakatlantirish uchun ariza yozing. Hisoblagichni saqlang
Bu 1 dan 64 gacha o'zgarib turadi. Ritsar harakat qilgan har bir kvadratga oxirgi sonni yozing.

7.30-rasm | Ritsarning sakkizta mumkin bo'lgan harakati.

0 1 2 3 4 5

K

2 1



3

4

0



7

5 6


1
2

0

3


4
5
6
7

6 7

304 7-bob Massivlar va massivlar ro‘yxati

Ritsar bu maydonga allaqachon tashrif buyurganligini bilish uchun har bir potentsial harakatni sinab ko'ring. Har bir sinov


ritsar shaxmat taxtasidan tushmasligini ta'minlash uchun potentsial harakat. ni ishga tushiring
ilova. Ritsar nechta harakat qildi?
c) Knight's Tour dasturini yozish va ishga tushirishga urinib ko'rganingizdan so'ng, siz, ehtimol,
qimmatli fikrlarni bildirdi. Biz bu maʼlumotlardan evristik (yaʼni, kom.
mon-sense qoidasi) ritsarni ko'chirish uchun. Evristika muvaffaqiyatni kafolatlamaydi, lekin a
puxta ishlab chiqilgan evristik muvaffaqiyatga erishish imkoniyatini sezilarli darajada oshiradi. Sizda ob-
tashqi kvadratlar markazga yaqinroq bo'lgan kvadratlarga qaraganda ko'proq muammoli ekanligiga xizmat qildi
kengashning. Darhaqiqat, eng muammoli yoki erishib bo'lmaydigan kvadratchalar to'rtta burchakdir.
Sezgi sizga ritsarni eng ko'p harakatlantirishga harakat qilishingizni taklif qilishi mumkin
birinchi navbatda muammoli kvadratlarni va borish oson bo'lganlarini ochiq qoldiring, shunda qachon
Ekskursiya oxiriga yaqin taxtada tiqilib qolsa, muvaffaqiyatga erishish imkoniyati ko'proq bo'ladi.
cess.
Kvadratlarning har birini tasniflash orqali biz "foydalanishning evristikasini" ishlab chiqishimiz mumkin
qanchalik qulay ekanligiga qarab va har doim ritsarni harakatga keltiradi (ritsarning L- yordamida
shaklli harakatlar) eng kirish qiyin bo'lgan kvadratga. Ikki o'lchovli massivni belgilaymiz
har bir alohida kvadratdan iborat raqamlar bilan foydalanish imkoniyati
kvadratga kirish mumkin. Bo'sh shaxmat taxtasida markazga eng yaqin 16 kvadratning har biri joylashgan
8 deb baholangan, har bir burchak kvadrati 2 ball bilan baholangan va boshqa kvadratlarga kirish imkoniyati mavjud
3, 4 yoki 6 raqamlari quyidagicha:
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2
Maxsus imkoniyatlar evristikasidan foydalanib, Knight's Tourning yangi versiyasini yozing. The
ritsar har doim eng past kirish raqamiga ega maydonga o'tishi kerak. Bo'lgan holatda
galstuk bo'lsa, ritsar bog'langan kvadratlarning istalganiga o'tishi mumkin. Shunday qilib, sayohat boshlanishi mumkin
to'rtta burchakning istalgan qismida. [Izoh: Ritsar shaxmat taxtasi atrofida harakatlanayotganda, sizning
ilova qulaylik raqamlarini kamaytirishi kerak, chunki ko'proq kvadratlar band bo'ladi.
Shu tarzda, ekskursiya davomida istalgan vaqtda har bir mavjud maydonning kirish imkoniyati soni
ber aynan shu kvadrat olishi mumkin bo'lgan kvadratlar soniga teng bo'lib qoladi
erishish mumkin.] Ilovangizning ushbu versiyasini ishga tushiring. To'liq sayohatga chiqdingizmi? ni o'zgartiring
shaxmat taxtasining har bir kvadratidan bittadan boshlanadigan 64 ta turni o'tkazish uchun ariza. Qanaqasiga
ko'plab to'liq sayohatlar oldingizmi?
d) Knight's Tour ilovasining o'zaro bog'liqligiga duch kelgan versiyasini yozing
ikki yoki undan ortiq kvadratlar, bu kvadratlarga oldinga qarab qaysi kvadratni tanlashni hal qiladi
"bog'langan" kvadratlardan erishish mumkin. Sizning arizangiz bog'langan kvadratga o'tishi kerak
Keyingi harakat kirish imkoniyati eng past bo'lgan kvadratga to'g'ri keladi.
7.23 (Ritsarlarning sayohati: shafqatsiz kuch yondashuvlari) 7.22-mashqning (c) qismida biz yechim ishlab chiqdik.
Ritsar sayohati muammosi. Amaldagi yondashuv, "foydalanish evristikasi" deb ataladi
ko'plab echimlar va samarali ishlaydi.
Kompyuterlar kuchini oshirishda davom etar ekan, biz ko'proq muammolarni aniqlik bilan hal qila olamiz
kompyuter quvvati va nisbatan murakkab bo'lmagan algoritmlar. Keling, bu yondashuvni "qo'pol kuch" deb ataylik.
muammoni hal qilish.
a) Ritsarga shaxmat taxtasi atrofida yurish imkoniyatini berish uchun tasodifiy sonlarni yaratishdan foydalaning (in
uning qonuniy L shaklidagi harakatlari) tasodifiy. Sizning arizangiz bitta turni bajarishi kerak va
yakuniy shaxmat taxtasini ko'rsatish. Ritsar qancha masofani bosib o'tdi?

305-mashqlar

b) Katta ehtimol bilan, qisman ilova (a) nisbatan qisqa turni ishlab chiqardi. Endi o'zingizni o'zgartiring
1000 ta sayohatga urinish uchun ariza. Raqamni kuzatib borish uchun bir o'lchovli massivdan foydalaning.
har bir uzunlikdagi turlar. Arizangiz 1000 ta sayohatga urinishni tugatsa, u
ushbu ma'lumotni aniq jadval shaklida ko'rsatishi kerak. Eng yaxshi natija nima edi?
c) Katta ehtimol bilan, ariza qisman (b) sizga ba'zi "hurmatli" turlar berdi, lekin to'liq emas
ekskursiyalar. Endi ilovangiz to'liq ekskursiyani yaratmaguncha ishlashiga ruxsat bering. [Diqqat: Ushbu versiya
Ilova kuchli kompyuterda soatlab ishlashi mumkin edi.] Yana bir bor, ta-
Har bir uzunlikdagi turlar sonini ko'rsating va birinchi to'liq turda ushbu jadvalni ko'rsating
topiladi. Toʻliq ekskursiyani yaratishdan oldin arizangiz nechta turga urindi?
Qancha vaqt ketdi?
d) Knight's Tourning qo'pol kuch versiyasini qulaylik-evristik bilan solishtiring
versiya. Qaysi biri muammoni sinchiklab o'rganishni talab qildi? Qaysi algoritm edi
rivojlantirish qiyinroqmi? Qaysi biri ko'proq kompyuter quvvatini talab qildi? Ishonchli bo'lishimiz mumkinmi?
(oldindan) qulaylik-evristik yondashuv bilan to'liq turni olish kerakmi? Biz qila olardik
shafqatsiz kuch yondashuvi bilan to'liq turni olish uchun (oldindan) ishonch hosil qiling? Munozara qiling
Qo'pol kuch bilan muammolarni hal qilishning ijobiy va salbiy tomonlari.
7.24 (Sakkiz qirolicha) Shaxmat ishqibozlari uchun yana bir boshqotirma “Sakkiz qirolicha” muammosidir.
Quyidagi: Sakkizta malikani bo'sh shaxmat taxtasiga qo'yish mumkinmi, shunda hech bir malika "hujum qilmasin"
boshqa har qanday (ya'ni, ikkita malika bir qatorda, bir ustunda yoki bir xil diagonal bo'ylab yo'q)?
7.22-mashqda ishlab chiqilgan fikrlashdan sakkizta malikani yechish uchun evristik formuladan foydalaning.
muammo. Ilovangizni ishga tushiring. [Maslahat: Shaxmat taxtasining har bir kvadratiga qiymat belgilash mumkin
bo'sh shaxmat taxtasiga malika o'rnatilgan bo'lsa, uning nechta kvadrati "yo'q qilinganini" ko'rsatish uchun
kvadrat. 7.31-rasmda ko'rsatilganidek, burchaklarning har biriga 22 qiymati beriladi. Bir marta
Ushbu "yo'q qilish raqamlari" barcha 64 kvadratga joylashtirilgan, tegishli evristik quyidagicha bo'lishi mumkin:
pastliklar: Keyingi qirolichani eng kichik eliminatsiya raqami bilan kvadratga joylashtiring. Nima uchun bu strategiya
intuitiv jozibadormi?]

7.25 (Sakkiz malika: shafqatsiz kuch yondashuvlari) Ushbu mashqda siz bir nechta shafqatsiz kuchlarni rivojlantirasiz.


7.24-mashqda keltirilgan Sakkiz qirolicha muammosini hal qilish yondashuvlari.
a) Sakkizlikni yechish uchun 7.23-mashqda ishlab chiqilgan tasodifiy qo'pol kuch texnikasidan foydalaning.
Queens muammosi.
b) To'liq texnikadan foydalaning (ya'ni, sakkizta malikaning barcha mumkin bo'lgan kombinatsiyalarini sinab ko'ring
shaxmat taxtasi) sakkiz qirolicha muammosini hal qilish uchun.
c) Nima uchun to'liq qo'pol kuch yondashuvi muammoni hal qilish uchun mos kelmasligi mumkin
Knight's Tour muammosi?
d) Tasodifiy qo'pol kuch va to'liq qo'pol kuch yondashuvlarini solishtiring va taqqoslang.

m

7.31-rasm | Yuqori chap burchakda qirolicha qo'yish orqali 22 kvadrat yo'q qilinadi.



* * * * * *
* *
* *
* *
* *
* *
*
*

*

*



*

*


306 7-bob Massivlar va massivlar ro‘yxati

7.26 (Ritsarning sayohati: yopiq tur sinovi) Ritsar sayohatida (7.22-mashq) toʻliq ekskursiya sodir boʻladi.


ritsar shaxmat taxtasining har bir kvadratiga bir marta va faqat bir marta tegib, 64 ta harakat qilganda. A
yopiq tur 64-harakat ritsar boshlangan maydondan bir qadam uzoqlashganda sodir bo'ladi.
ekskursiya qildi. To'liq tur bo'lsa, yopiq turni sinab ko'rish uchun 7.22-mashqda yozgan ilovangizni o'zgartiring.
yuzaga kelgan.
7.27 (Eratosfen elak) tub son - bu teng bo'linadigan 1 dan katta butun son.
faqat o'z-o'zidan va 1. Eratosfen elaklari tub sonlarni topish usulidir. Sifatida ishlaydi
quyidagicha:
a) Barcha elementlar rostga inisializatsiya qilingan primitiv tipdagi mantiqiy massiv yarating. Massiv ele-
asosiy indekslarga ega bo'lganlar to'g'ri bo'lib qoladi. Massivning boshqa barcha elementlari oxir-oqibat bo'ladi
yolg'onga sozlang.
b) 2-massiv indeksidan boshlab, berilgan elementning rost ekanligini aniqlang. Agar shunday bo'lsa, loop
massivning qolgan qismidan o'ting va indeksi ko'p bo'lgan har bir elementni noto'g'ri deb belgilang.
true qiymatiga ega element indeksining uchi. Keyin bilan jarayonni davom eting
true qiymatiga ega keyingi element. 2-massiv indeksi uchun 2-elementdan tashqari barcha elementlar
2 ga karrali indekslarga ega (4, 6, 8, 10 va boshqalar) qator o'rnatiladi.
yolg'on; 3-massiv indeksi uchun massivdagi 3-elementdan tashqari indekslarga ega bo‘lgan barcha elementlar
3 ga karrali (6, 9, 12, 15 va hokazo indekslar) noto'g'ri bo'ladi; va hokazo.
Ushbu jarayon tugagach, hali ham to'g'ri bo'lgan massiv elementlari indeks a ekanligini ko'rsatadi
tub son. Ushbu indekslarni ko'rsatish mumkin. 1000 ele-massivdan foydalanadigan dastur yozing.
2 dan 999 gacha bo'lgan tub sonlarni aniqlash va ko'rsatish uchun mentlar. 0 massiv elementlariga e'tibor bermaslik
va 1.
7.28 (Simulyatsiya: toshbaqa va quyon) Ushbu muammoda siz klassik poygani qayta yaratasiz.
toshbaqa va quyon. Buning simulyatsiyasini ishlab chiqish uchun tasodifiy sonlarni yaratishdan foydalanasiz
unutilmas voqea.
Bizning da'vogarlarimiz poygani 70 kvadratning 1-kvadratidan boshlashadi. Har bir kvadrat imkonni ifodalaydi
poyga yo'nalishi bo'ylab joylashish. Marra chizig'i 70-kvadratda. Birinchi bo'lgan da'vogar yetib boradi yoki o'tadi
kvadrat 70 bir paqir yangi sabzi va salat bilan taqdirlanadi. Kurs yon tomondan to'qiladi
sirpanchiq tog'da, shuning uchun vaqti-vaqti bilan da'vogarlar o'z o'rnini yo'qotadilar.
Soat soniyada bir marta chalinadi. Soatning har bir belgisi bilan ilovangiz sozlamalarni sozlashi kerak
7.32-rasmdagi qoidalarga muvofiq hayvonlarning holati. Pozitsiyalarni kuzatib borish uchun o'zgaruvchilardan foydalaning
hayvonlarning soni (ya'ni, pozitsiya raqamlari 1-70). Har bir hayvonni 1-pozitsiyadan boshlang (boshlang'ich
Darvoza"). Agar hayvon 1-kvadratdan oldin chapga sirpanib ketsa, uni 1-kvadratga qaytaring.

Hayvonlar harakati turi Vaqtning foizi Haqiqiy harakat

Tortoise Fast plod 50% 3 kvadrat o'ngga
20% 6 kvadratni chapga siljiting
Sekin 30% 1 kvadrat o'ngga
Quyon uxlaydi 20% Hech qanday harakat yo'q
Katta hop 20% 9 kvadrat o'ngga
Katta slip 10% 12 kvadrat chapga
Kichik sakrash 30% 1 kvadrat o'ngga
Kichik slip 20% 2 kvadrat chapga

7.32-rasm | Toshbaqa va quyonning holatini sozlash qoidalari.


307-mashqlar

1 ≤ i ≤ oralig‘ida tasodifiy butun i sonini hosil qilish orqali 7.32-rasmdagi foizlarni hosil qiling.
10. Toshbaqa uchun 1 ≤ i ≤ 5 bo‘lganda “tezkor plod”, 6 ≤ i ≤ 7 bo‘lganda “slip” yoki “sekin” bajaring.
plod” 8 ≤ i ≤10 bo‘lganda. Quyonni siljitish uchun shunga o'xshash texnikadan foydalaning.
Ko'rsatish orqali poygani boshlang
BANG !!!!!
VA ULAR O'CHIRISHDI!!!!!
Keyin soatning har bir belgisi uchun (ya'ni, tsiklning har bir takrorlanishi) 70 pozitsiyali chiziqni ko'rsating.
toshbaqa holatida T harfi va quyon holatida H harfi. Vaqti-vaqti bilan,
da'vogarlar bir xil maydonga tushadilar. Bunday holda, toshbaqa quyonni tishlaydi va sizning qo'lingiz
kation OUCH ko'rsatishi kerak!!! o'sha pozitsiyadan boshlanadi. T dan tashqari barcha chiqish pozitsiyalari, the
H yoki OUCH!!! (agar teng bo'lsa) bo'sh bo'lishi kerak.
Har bir satr ko'rsatilgandan so'ng, hayvonning 70 kvadratiga yetganini yoki o'tishini tekshirib ko'ring. Agar
Shunday qilib, g'olibni ko'rsating va simulyatsiyani to'xtating. Agar toshbaqa g'alaba qozonsa, TOSHBAKA yutsa ko'rsating!!!
VAJJAJ!!! Agar quyon g'alaba qozonsa, quyon g'alaba qozonadi. Yuch. Agar ikkala hayvon ham bitta belgida g'alaba qozonsa
soat, siz toshbaqaga ("qutqaruvchi") yordam berishni xohlashingiz yoki It's galstukni ko'rsatishni xohlashingiz mumkin.
Agar hayvonlarning hech biri g'alaba qozonmasa, soatning keyingi belgisini taqlid qilish uchun tsiklni yana bajaring. Siz bo'lganingizda
arizangizni ishga tushirishga tayyor, poygani tomosha qilish uchun bir guruh muxlislarni to'plang. Qanday qilib hayron qolasiz
tinglovchilaringiz ishtirok etadi!
Keyinchalik kitobda biz Java-ning bir qator imkoniyatlarini taqdim etamiz, masalan, grafikalar, tasvirlar, ani-
mation, tovush va multithreading. Ushbu xususiyatlarni o'rganar ekansiz, o'zingizni yaxshilashdan zavqlanishingiz mumkin
toshbaqa va quyon tanlovi simulyatsiyasi.
7.29 (Fibonachchi seriyasi) Fibonachchi seriyasi
0, 1, 1, 2, 3, 5, 8, 13, 21, …
0 va 1 shartlar bilan boshlanadi va har bir keyingi atama ikkalasining yig'indisi bo'lgan xususiyatga ega
oldingi shartlar.
a) Fibonachchi(n) n-sonini hisoblaydigan usulni yozing. Birlashtirish
bu usul foydalanuvchiga n qiymatini kiritish imkonini beruvchi dasturga kiritiladi.
b) Tizimingizda ko'rsatilishi mumkin bo'lgan eng katta Fibonachchi raqamini aniqlang.
c) Hisoblash uchun int o'rniga double dan foydalanish uchun (a) qismida yozgan dasturni o'zgartiring
va Fibonachchi raqamlarini qaytaring va (b) qismini takrorlash uchun ushbu o'zgartirilgan ilovadan foydalaning.

7.30–7.34 mashqlari juda qiyin. Ularni bajarganingizdan so'ng, qilishingiz kerak


eng mashhur karta o'yinlarini osongina amalga oshirish imkoniyatiga ega bo'lish.
7.30 (Kartalarni aralashtirish va muomala qilish) 7.11-rasmdagi ilovani beshta kartali pokerni o'tkazish uchun o'zgartiring.
qo'l. Keyin 7.10-rasmdagi DeckOfCards sinfini o'zgartiring va a
qo'lni o'z ichiga oladi
a) juftlik
b) ikki juft
c) uchta turdagi (masalan, uchta jak)
d) to'rtta turdagi (masalan, to'rtta eys)
e) flush (ya'ni, bitta kostyumning barcha beshta kartasi)
f) to'g'ridan-to'g'ri (ya'ni, ketma-ket nominal qiymatlarning beshta kartasi)
g) to'liq uy (ya'ni, bitta nominal qiymatdagi ikkita karta va boshqa nominal qiymatdagi uchta karta)
[Maslahat: 7.9-rasmdagi sinf kartasiga getFace va getSuit usullarini qo'shing.]
7.31 (Kartalarni aralashtirish va muomala qilish) Ilova yozish uchun 7.30-mashqda ishlab chiqilgan usullardan foydalaning.
Ikkita besh-kartali poker qo'li bilan shug'ullanadigan plication, har bir qo'lni baholaydi va qaysi biri yaxshiroq ekanligini aniqlaydi.

308 7-bob Massivlar va massivlar ro‘yxati



7.32 (Loyiha: Kartani aralashtirish va muomala qilish) 7.31-mashqda ishlab chiqilgan ilovani o'zgartiring
u dilerni simulyatsiya qilishi uchun. Dilerning beshta kartali qo'li "yuzi pastga qaragan holda" taqsimlanadi, shuning uchun o'yinchi:
ko'rmaydi. Ariza keyin dilerlik qo'lini baholash kerak, va, sifatiga asoslangan
qo'l, dilerlik bir chizish kerak, ikki yoki uch kartalari tegishli soni o'rniga
asl qo'lda keraksiz kartalar. Keyin ariza dilerning qo'lini qayta ko'rib chiqishi kerak.
[Diqqat: Bu qiyin muammo!]
7.33 (Loyiha: Kartani aralashtirish va muomala qilish) 7.32-mashqda ishlab chiqilgan dasturni o'zgartiring
shunday qilib, u avtomatik ravishda dilerlik qo'lini boshqarishi mumkin, lekin o'yinchi qaysi kartalari qaror ruxsat etiladi
almashtirish uchun o'yinchining qo'lidan. Keyin dastur ikkala qo'lni ham baholashi va kimligini aniqlashi kerak
g'alaba qozonadi. Endi ushbu yangi ilovadan kompyuterga qarshi 20 ta oʻyin oʻynash uchun foydalaning. Kim ko'proq o'yinda g'alaba qozonadi
sizmi yoki kompyutermi? Do'stingizdan kompyuterga qarshi 20 ta o'yin o'ynashga ruxsat bering. Kim ko'proq o'yinda g'alaba qozonadi?
Ushbu o'yinlar natijalariga asoslanib, poker o'ynash ilovangizni yaxshilang. (Bu ham qiyin
muammo.) Yana 20 ta o'yin o'ynang. O'zgartirilgan ilovangiz yaxshiroq o'yin o'ynaydimi?
7.34 (Loyiha: Kartalarni aralashtirish va muomala qilish) Shaklning qo'llanilishini o'zgartiring. Yuzdan foydalanish uchun 7.9–7.11
va kartalarning yuzlari va kostyumlarini ifodalash uchun Suit enum turlari. Ushbu enum turlarining har birini shunday deb e'lon qiling
o'zining manba kodi faylidagi umumiy turdagi. Har bir kartada Face va Suit namunasi o'zgaruvchisi bo'lishi kerak.
Ular Card konstruktori tomonidan ishga tushirilishi kerak. DeckOfCards sinfida yuzlar qatorini yarating
Face enum tipidagi konstantalar nomlari va Suits massivi bilan ishga tushirilgan.
Suit enum turidagi konstantalar nomlari bilan ishga tushiriladi. [Izoh: Enum chiqarganingizda
String sifatida doimiy, doimiy nomi ko'rsatiladi.]
7.35 (Fisher-Yates aralashtirish algoritmi) Fisher-Yates aralashtirish algoritmini onlayn tadqiq qiling,
keyin 7.10-rasmdagi aralashish usulini qayta tiklash uchun foydalaning.
Maxsus bo'lim: O'z kompyuteringizni yaratish
Keyingi bir nechta muammolarda biz yuqori darajadagi til dunyosidan vaqtinchalik chetga chiqamiz
kompyuterni "ochish" va uning ichki tuzilishiga qarash uchun dasturlash. Biz mashinani taqdim etamiz -
tilda dasturlash va bir nechta mashina tili dasturlarini yozish. Buni ayniqsa qilish uchun
qimmatli tajribaga ega bo'lgandan so'ng, biz kompyuterni quramiz (dasturiy ta'minotga asoslangan simulyatsiya texnikasi orqali)
tion) yordamida siz o'zingizning mashina tilidagi dasturlarni bajarishingiz mumkin.
7.36 (Mashina tilida dasturlash) Simpletron nomli kompyuterni yaratamiz. Uning sifatida
Nomi shuni anglatadiki, bu oddiy mashina, lekin kuchli. Simpletron da yozilgan dasturlarni ishga tushiradi
faqat u bevosita tushunadigan til: Simpletron Machine Language (SML).
Simpletron akkumulyatorni o'z ichiga oladi - ma'lumot joylashtiriladigan maxsus registr
Simpletron ushbu ma'lumotni hisob-kitoblarda ishlatmasdan yoki uni turli yo'llar bilan tekshirishdan oldin. Hammasi
Simpletrondagi ma'lumotlar so'zlar bilan ishlanadi. So'z ishorali to'rt xonali kasrdir
raqam, masalan, +3364, -1293, +0007 va -0001. Simpletron 100 so'z bilan jihozlangan
xotira va bu so'zlarning joylashuv raqamlari 00, 01, …, 99 bilan ko'rsatilgan.
SML dasturini ishga tushirishdan oldin dasturni xotiraga yuklashimiz yoki joylashtirishimiz kerak. Birinchi
Har bir SML dasturining ko'rsatmasi (yoki bayonoti) har doim 00-joyga joylashtiriladi. Simulyator
shu joylashuvda bajarila boshlaydi.
SML-da yozilgan har bir ko'rsatma Simpletron xotirasining bir so'zini egallaydi (shuning uchun ko'rsatmalar
to'rt xonali o'nlik sonlar imzolanadi). Biz SML buyrug'ining belgisi har doim bo'ladi deb taxmin qilamiz
plyus, lekin ma'lumotlar so'zining belgisi ortiqcha yoki minus bo'lishi mumkin. Simpletron xotirasidagi har bir joy
ory ko'rsatma, dastur tomonidan ishlatiladigan ma'lumotlar qiymati yoki foydalanilmagan (va shuning uchun aniqlanmagan) maydonni o'z ichiga olishi mumkin.
xotiradan. Har bir SML yo'riqnomasining dastlabki ikki raqami operativ kodni ko'rsatadi.
amalga oshirilishi kerak. SML operatsiya kodlari 7.33-rasmda umumlashtirilgan.
SML buyrug'ining oxirgi ikki raqami operand - xotira joylashuvining manzili
operatsiya qo'llaniladigan so'zni o'z ichiga oladi. Keling, bir nechta oddiy SML dasturlarini ko'rib chiqaylik.

Maxsus bo'lim: O'z kompyuteringizni yaratish 309

Birinchi SML dasturi (7.34-rasm) klaviaturadan ikkita raqamni o'qiydi va hisoblaydi va
ularning summasini ko'rsatadi. +1007 ko'rsatmasi klaviaturadan birinchi raqamni o'qiydi va uni joylashtiradi
07 manziliga (u 0 ga ishga tushirilgan). Keyin +1008 ko'rsatmasi keyingi raqamni o'qiydi
joylashuvga 08. Yuk ko'rsatmasi, +2007, birinchi raqamni akkumulyatorga qo'yadi va
ko'rsatma qo'shish, +3008, ikkinchi raqamni akkumulyatordagi raqamga qo'shadi. Barcha SML arif-
Metik ko'rsatmalar o'z natijalarini akkumulyatorda qoldiradi. Do'kon yo'riqnomasi, +2109, natijani joylashtiradi
xotira joyi 09 ga qaytadi, undan yozish buyrug'i +1109 raqamni oladi va o'chiradi.
uni o'ynaydi (imzolangan to'rt xonali o'nlik raqam sifatida). To'xtatish buyrug'i, +4300, bajarishni tugatadi.

Operatsion kodining ma'nosi

Kirish/chiqarish operatsiyalari:
yakuniy int READ = 10; Xotiradagi ma'lum bir joyga klaviaturadan so'zni o'qing.
final int WRITE = 11; Xotiradagi ma'lum bir joydan ekranga so'z yozing.
Yuklash/saqlash operatsiyalari:
yakuniy int LOAD = 20; Xotiradagi ma'lum bir joydan so'zni akkumulyatorga yuklang.
yakuniy int STORE = 21; Akkumulyatordagi so'zni xotiraning ma'lum bir joyiga saqlang.
Arifmetik amallar:
yakuniy int ADD = 30; Xotiradagi ma'lum bir joydan so'zni so'zga qo'shing
akkumulyator (natijani akkumulyatorda qoldiring).
yakuniy int SUBTRACT = 31; Xotiradagi ma'lum bir joydan so'zni in so'zidan ayiring
akkumulyator (natijani akkumulyatorda qoldiring).
yakuniy int DIVIDE = 32; Xotiradagi ma'lum bir joydan so'zni in so'ziga ajrating
akkumulyator (natijani akkumulyatorda qoldiring).
yakuniy int MULTIPLY = 33; Xotiraning ma'lum bir joyidagi so'zni in so'ziga ko'paytiring
akkumulyator (natijani akkumulyatorda qoldiring).
Nazoratni o'tkazish operatsiyalari:
yakuniy int BRANCH = 40; Xotiradagi ma'lum bir joyga filial.
yakuniy int BRANCHNEG = 41; Agar akkumulyator salbiy bo'lsa, xotiradagi ma'lum bir joyga filial.
yakuniy int BRANCHZERO = 42; Agar akkumulyator nolga teng bo'lsa, xotiraning ma'lum bir joyiga filial qiling.
yakuniy int HALT = 43; To'xtang. Dastur o'z vazifasini bajardi.

7.33-rasm | Simpletron mashina tili (SML) operatsion kodlari.

Joylashuv raqami bo'yicha ko'rsatma

00 +1007 (A o'qing)


01 +1008 (B o'qing)
02 +2007 (A yuk)
03 +3008 (B qo'shing)
04 +2109 (C do'koni)

7.34-rasm | Ikkita butun sonni o'qiydigan va ularning yig'indisini hisoblaydigan SML dasturi. (2-qismning 1-qismi.)


310 7-bob Massivlar va massivlar ro‘yxati

Ikkinchi SML dasturi (7.35-rasm) klaviaturadan ikkita raqamni o'qiydi va aniqlaydi
va kattaroq qiymatni ko'rsatadi. +4107 yo'riqnomasining shartli uzatilishi sifatida foydalanishga e'tibor bering.
trol, Java'ning if iborasi bilan deyarli bir xil.

Endi quyidagi vazifalarning har birini bajarish uchun SML dasturlarini yozing:


a) 10 ta ijobiy raqamni o'qish uchun qo'riqchi tomonidan boshqariladigan pastadirdan foydalaning. Hisoblash va ularni ko'rsatish
so'm.
b) Qarshi boshqariladigan halqadan foydalanib, yettita raqamni o'qing, ba'zilari ijobiy va ba'zilari salbiy;
va ularning o'rtachasini hisoblab ko'ring.
c) Bir qator raqamlarni o'qing va eng katta raqamni aniqlang va ko'rsating. Birinchi raqam -
ber read qancha raqamga ishlov berish kerakligini ko'rsatadi.
7.37 (Kompyuter simulyatori) Ushbu muammoda siz o'z kompyuteringizni qurmoqchisiz. Yo'q,
siz komponentlarni bir-biriga lehimlamaysiz. Aksincha, siz dasturiy ta'minotning kuchli texnikasidan foydalanasiz -
Simpletron 7.36-mashqning ob'ektga yo'naltirilgan dasturiy modelini yaratishga asoslangan simulyatsiya. Sizning
Simpletron simulyatori siz foydalanayotgan kompyuterni Simpletronga aylantiradi va siz aslida shunday bo'lasiz.
7.36-mashqda yozgan SML dasturlarini ishga tushirish, sinab ko'rish va disk raskadrovka qilish.
Simpletron simulyatoringizni ishga tushirganingizda, u quyidagini ko'rsatish bilan boshlanishi kerak:
*** Simpletronga xush kelibsiz! ***
*** Iltimos, dasturingizni bitta ko'rsatma kiriting ***
*** (yoki ma'lumotlar so'zi) bir vaqtning o'zida. Men *** ko'rsataman
*** joylashuv raqami va savol belgisi (?). ***
*** Keyin o'sha joy uchun so'zni yozasiz. ***
*** Dasturingizga kirishni to'xtatish uchun -99999 kiriting. ***

05 +1109 (C yozing)


06 +4300 (To‘xtatib turish)
07 +0000 (A o'zgaruvchisi)
08 +0000 (B o'zgaruvchisi)
09 +0000 (Natija C)

Joylashuv raqami bo'yicha ko'rsatma

00 +1009 (A o'qing)
01 +1010 (B o'qing)
02 +2009 (A yuklash)
03 +3110 (B ayirish)
04 +4107 (07 raqamiga filial salbiy)
05 +1109 (A yozing)
06 +4300 (To‘xtatib turish)
07 +1110 (B yozing)
08 +4300 (To'xtatib turish)
09 +0000 (A o'zgaruvchisi)
10 +0000 (B o'zgaruvchisi)

7.35-rasm | Ikkita butun sonni o'qiydi va kattaroqni aniqlaydigan SML dasturi.

Joylashuv raqami bo'yicha ko'rsatma

7.34-rasm | Ikkita butun sonni o'qiydigan va ularning yig'indisini hisoblaydigan SML dasturi. (2-qismning 2-qismi.)


Maxsus bo'lim: O'z kompyuteringizni yaratish 311



Sizning ilovangiz Simpletron xotirasini bir o'lchovli massiv xotirasi bilan taqlid qilishi kerak.
100 ta elementdan iborat. Endi simulyator ishlayapti deb taxmin qiling va dialog oynasini ko'rib chiqaylik
7.35-rasmdagi dasturga kirganimizda (7.36-mashq):
00 ? +1009
01 ? +1010
02 ? +2009
03 ? +3110
04 ? +4107
05 ? +1109
06 ? +4300
07 ? +1110
08 ? +4300
09 ? +0000
10 ? +0000
11 ? -99999
Sizning dasturingiz xotira joyini va undan keyin savol belgisini ko'rsatishi kerak. Har bir qiymat
savol belgisining o'ng tomoni foydalanuvchi tomonidan kiritiladi. Sentinel qiymati -99999 kiritilganda, dastur
quyidagilarni ko'rsatishi kerak:
*** Dasturni yuklash tugallandi ***
*** Dastur ijrosi boshlanadi ***
Endi SML dasturi massiv xotirasiga joylashtirilgan (yoki yuklangan). Endi Simpletron exe-
SML dasturini yaxshi ko'radi. Bajarish 00 manzilidagi ko'rsatma bilan boshlanadi va Java-da bo'lgani kabi, davom etadi.
Agar boshqaruvni o'tkazish orqali dasturning boshqa qismiga yo'naltirilmagan bo'lsa, ketma-ket davom etadi.
Akkumulyator registrini ko'rsatish uchun o'zgaruvchan akkumulyatordan foydalaning. Instruc- o'zgaruvchisidan foydalaning
tionCounter, bajarilayotgan ko'rsatmani o'z ichiga olgan xotiradagi joylashuvni kuzatib borish uchun.
shakllangan. Amaldagi operatsiyani ko'rsatish uchun OperationCode o'zgaruvchisidan foydalaning (ya'ni,
ko'rsatma so'zining chap ikki raqami). Xotira joyini ko'rsatish uchun o'zgaruvchan operanddan foydalaning
joriy ko'rsatma ishlaydigan tion. Shunday qilib, operand ning eng o'ngdagi ikkita raqamidir
hozirda bajarilayotgan ko'rsatma. Ko'rsatmalarni bevosita xotiradan bajarmang. Aksincha,
Keyingi bajariladigan buyruqni xotiradan instructionRegis- deb nomlangan o'zgaruvchiga o'tkazing.
ter. Keyin chap ikkita raqamni ajratib oling va ularni OperationCode-ga joylashtiring va o'ng ikkitasini tanlang
raqamlar va ularni operandga joylashtiring. Simpletron ishlashni boshlaganda, maxsus registrlar bo'ladi
hammasi nolga tenglashtirildi.
Keling, birinchi SML ko'rsatmasining bajarilishini ko'rib chiqaylik, +1009 xotira joyi 00.
Bu protsedura buyruq-bajarish sikli deb ataladi.
InstructionCounter bizga keyingi bajariladigan ko'rsatmaning joylashuvini aytadi. Biz
Java bayonotidan foydalanib, ushbu joyning mazmunini xotiradan oling
instructionRegister = xotira[instructionCounter];
Amaliyot kodi va operand ko'rsatmalar registridan bayonotlar orqali chiqariladi
operatsiya kodi = instructionRegister / 100;
operand = instructionRegister % 100;
Endi Simpletron operatsiya kodi aslida o'qilganligini aniqlashi kerak (yozishga nisbatan, a
yuk va boshqalar). Kalit SML ning 12 ta operatsiyasidan farq qiladi. Kommutator holatida -
ment, turli SML ko'rsatmalarining xatti-harakati 7.36-rasmda ko'rsatilganidek simulyatsiya qilingan. Biz muhokama qilamiz
qisqa vaqt ichida filial ko'rsatmalarini oling va boshqalarni sizga qoldiring.
SML dasturi bajarilishini tugatgandan so'ng, har bir registrning nomi va mazmuni
chunki xotiraning to'liq tarkibi ko'rsatilishi kerak. Bunday chop etish ko'pincha com- deb ataladi.
puter dump (yo'q, kompyuter chiqindisi eski kompyuterlar ketadigan joy emas). Dasturga yordam berish uchun
sizning dump usulingiz uchun namunali dump formati 7.37-rasmda ko'rsatilgan. A bajarilgandan keyin axlatxona
Simpletron dasturi hozirda ko'rsatmalar va ma'lumotlar qiymatlarining haqiqiy qiymatlarini ko'rsatadi
ijro etish tugatildi.

312 7-bob Massivlar va massivlar roʻyxati

Keling, dasturimizning birinchi ko'rsatmasini, ya'ni mahalliy +1009-ni bajarishni davom ettiramiz.
tion 00. Yuqorida aytib o'tganimizdek, switch iborasi foydalanuvchini kiritishni taklif qilish orqali ushbu vazifani simulyatsiya qiladi.
qiymat, qiymatni o'qish va uni xotira joylashuvi xotirasida saqlash[operand]. Qiymati shundan keyin
09-joyga o'qing.
Shu nuqtada, birinchi ko'rsatmani simulyatsiya qilish tugallanadi. Qolgan narsa - tayyorgarlik
Keyingi ko'rsatmani bajarish uchun Simpletron. Chunki hozirgina bajarilgan ko'rsatma a emas edi
Boshqaruvni o'tkazish uchun biz ko'rsatmalar hisoblagich registrini quyidagicha oshirishimiz kerak:
instructionCounter++;
Ushbu harakat birinchi buyruqning simulyatsiya qilingan bajarilishini yakunlaydi. Butun jarayon (ya'ni
ko'rsatma-bajarish sikli) bajarilishi uchun keyingi ko'rsatmani olish bilan yangidan boshlanadi.
Keling, tarmoqlanish ko'rsatmalari - boshqaruvni uzatish qanday simulyatsiya qilinganligini ko'rib chiqaylik.
Biz qilishimiz kerak bo'lgan narsa ko'rsatmalar hisoblagichidagi qiymatni mos ravishda sozlashdir. Shuning uchun,
shartsiz tarmoq instruksiyasi (40) kalit ichida simulyatsiya qilinadi
instructionCounter = operand;
Shartli "akkumulyator nolga teng bo'lsa, filial" ko'rsatmasi simulyatsiya qilingan
agar (akkumulyator == 0)
instructionCounter = operand;

Ko'rsatma tavsifi

o'qing: "Butun sonni kiriting" so'rovini ko'rsating, keyin butun sonni kiriting va uni saqlang
joylashuv xotirasida[operand].
yuk: akkumulyator = xotira[operand];
qo'shish: akkumulyator += xotira[operand];
stop: Ushbu ko'rsatma xabarni ko'rsatadi
*** Simpletron ijrosi tugatildi ***

7.36-rasm | Simpletronda bir nechta SML ko'rsatmalarining harakati.

RO‘YXATDAN O‘TGANLAR:
akkumulyator +0000
InstructionCounter 00
ko'rsatmaRo'yxatdan o'tish +0000
operatsiya kodi 00
operand 00

Xotira:
0 1 2 3 4 5 6 7 8 9


0 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
10 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
20 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
30 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
40 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
50 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
60 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
70 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
80 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000
90 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000 +0000

7.37-rasm | Chiqindixona namunasi.


Maxsus bo'lim: O'z kompyuteringizni yaratish 313



Ushbu nuqtada siz Simpletron simulyatoringizni qo'llashingiz va har bir SMLni ishga tushirishingiz kerak
7.36-mashqda yozgan dasturlaringiz. Agar xohlasangiz, SML-ni qo'shimcha jihozlar bilan bezashingiz mumkin.
va simulyatoringizda ushbu xususiyatlarni taqdim eting.
Simulyatoringiz turli xil xatolarni tekshirishi kerak. Dasturni yuklash bosqichida,
masalan, Simpletron xotirasiga foydalanuvchi kiritadigan har bir raqam -9999 oralig'ida bo'lishi kerak
+9999 gacha. Simulyatoringiz kiritilgan har bir raqam ushbu diapazonda ekanligini tekshirishi va agar bo'lmasa, ushlab turishi kerak
foydalanuvchi to'g'ri raqamni kiritmaguncha raqamni qayta kiritishni so'rash.
Amalga oshirish bosqichida simulyatoringiz turli xil jiddiy xatolarni tekshirishi kerak, masalan
nolga bo'lishga urinishlar, yaroqsiz operatsiya kodlarini bajarishga urinishlar va akkumulyator to'lib ketishi
(ya'ni, +9999 dan katta yoki -9999 dan kichik qiymatlarga olib keladigan arifmetik amallar). Bunday qator-
o'tkir xatolar halokatli xatolar deb ataladi. Agar halokatli xato aniqlansa, simulyatoringiz ko'rsatishi kerak
kabi xato xabari
*** Nolga bo'lishga urinish ***
*** Simpletronning bajarilishi anormal tarzda tugatildi ***
va biz ilgari muhokama qilgan formatda to'liq kompyuter axlatini ko'rsatishi kerak. Bu davolash
foydalanuvchiga dasturdagi xatoni topishga yordam beradi.
7.38 (Simpletron simulyatorining modifikatsiyalari) 7.37-mashqda siz dastur simulyatsiyasini yozdingiz.
Simpletron Machine Language (SML) da yozilgan dasturlarni bajaradigan kompyuter. Ushbu mashqda,
Biz Simpletron Simulyatoriga bir nechta modifikatsiya va yaxshilanishlarni taklif qilamiz. ning mashqlarida
21-bobda biz yuqori darajadagi dasturda yozilgan dasturlarni o'zgartiruvchi kompilyator yaratishni taklif qilamiz.
ming tili (Basic tilining o'zgarishi) Simpletron mashina tiliga. Quyidagi modifikatorlardan ba'zilari
Kompilyator tomonidan ishlab chiqarilgan dasturlarni bajarish uchun tuzatishlar va yaxshilanishlar talab qilinishi mumkin:
a) Simpletron Simulator xotirasini kengaytirish uchun 1000 ta xotira joyini o'z ichiga oladi.
Simpletron kattaroq dasturlarni boshqarishga qodir.
b) Simulyatorga qolgan hisoblarni bajarishga ruxsat bering. Ushbu o'zgartirish talab qiladi
qo'shimcha SML ko'rsatmasi.
c) Simulyatorga ko'rsatkichlarni hisoblash uchun ruxsat bering. Ushbu o'zgartirish talab qiladi
qo'shimcha SML ko'rsatmasi.
d) Simulyatorni SMLni ifodalash uchun butun son emas, balki o'n oltilik qiymatlardan foydalanish uchun o'zgartiring
ko'rsatmalar.
e) Yangi qatorni chiqarishga ruxsat berish uchun simulyatorni o'zgartiring. Ushbu o'zgartirish qo'shimchani talab qiladi
milliy SML yo'riqnomasi.
f) Simulyatorni butun son qiymatlariga qo'shimcha ravishda suzuvchi nuqta qiymatlarini qayta ishlash uchun o'zgartiring.
g) Simulyatorni simli kiritishni boshqarish uchun o'zgartiring. [Maslahat: Har bir Simpletron so'zi ikki xil bo'lishi mumkin.
har biri ikki xonali butun songa ega bo'lgan ikkita guruhga bo'lingan. Har bir ikki xonali butun sonni ifodalaydi
belgining o'nlik ekvivalentini ASCII (B ilovasiga qarang) yuboradi. Mashinani qo'shing -
ma'lum bir satrdan boshlab satr kiritadigan va satrni saqlaydigan til ko'rsatmasi
Simpletron xotira joylashuvi. Bu joydagi so'zning birinchi yarmi hisob bo'ladi
satrdagi belgilar sonining (ya'ni, satr uzunligi). Har biri muvaffaqiyatli
yarim so'z ikkita kasrli raqam bilan ifodalangan bitta ASCII belgisini o'z ichiga oladi. Mashina -
til ko'rsatmasi har bir belgini ASCII ekvivalentiga aylantiradi va unga tayinlaydi
yarim so'z.]
h) (g) qism formatida saqlangan satrlarning chiqishini boshqarish uchun simulyatorni o'zgartiring. [Maslahat:
Ma'lum birdan boshlab satrni ko'rsatadigan mashina tilidagi yo'riqnomani qo'shing
Simpletron xotira joylashuvi. O'sha joydagi so'zning birinchi yarmi sonining soni
satrdagi belgilar soni (ya'ni, satr uzunligi). Har bir keyingi yarmi -
so'z ikkita kasrli raqam bilan ifodalangan bitta ASCII belgisini o'z ichiga oladi. Mashina-lan-
guage ko'rsatmasi uzunlikni tekshiradi va har ikki raqamni tarjima qilish orqali satrni ko'rsatadi
raqamni uning ekvivalent belgisiga aylantiring.]

314 7-bob Massivlar va massivlar ro‘yxati

7.39 (Kengaytirilgan Baho kitobi) 7.18-rasmdagi GradeBook klassini shunday o'zgartiringki, konstruktor
parametr sifatida talabalar soni va imtihonlar sonini qabul qiladi, so'ngra mos ravishda tuzadi
Oldindan ishga tushirilgan ikki o'lchovli massivni qabul qilish o'rniga, o'lchamli ikki o'lchovli massiv
hozir. Hech qanday baho berilmaganligini ko'rsatish uchun yangi ikki o'lchovli massivning har bir elementini -1 ga o'rnating
ushbu element uchun kiritilgan. a bo'yicha ma'lum bir talaba uchun bitta baho qo'yadigan setGrade usulini qo'shing
maxsus imtihon. Talabalar sonini kiritish uchun 7.19-rasmdagi GradeBookTest sinfini o'zgartiring va
Baho kitobi uchun imtihonlar soni va o'qituvchiga bir vaqtning o'zida bitta sinfga kirishga ruxsat berish.
Farq qilish
7.40 (So'rovnoma) Internet va internet ko'proq odamlarga tarmoqqa kirishga, biror sababga qo'shilishga, ovoz berishga imkon beradi
fikrlar va boshqalar. Yaqinda prezidentlikka nomzodlar chiqish uchun internetdan intensiv foydalanishdi
ularning xabarlari va kampaniyalari uchun pul to'plash. Ushbu mashqda siz oddiy so'rovnoma yozasiz
foydalanuvchilarga ijtimoiy ongning beshta muammosini 1 dan 10 gacha baholash imkonini beruvchi dastur
(eng muhim). Siz uchun muhim bo'lgan beshta sababni tanlang (masalan, siyosiy muammolar, global muhit)
ruhiy muammolar). Beshta sababni saqlash uchun bir o'lchovli massiv mavzularidan (String tipidagi) foydalaning. jamlash uchun -
so'rov javoblarini marize qiling, 5 qatorli, 10 ustunli ikki o'lchovli massiv javoblaridan foydalaning (turi bo'yicha).
int), mavzular massividagi elementga mos keladigan har bir satr. Dastur ishga tushganda, shunday bo'lishi kerak
foydalanuvchidan har bir masalani baholashni so'rang. Do'stlaringiz va oilangiz so'rovnomaga javob bering. Keyin ega bo'ling
dastur natijalarning qisqacha mazmunini ko'rsatadi, jumladan:
a) Chap tomonda beshta mavzu va tepada 10 ta reyting ko'rsatilgan jadvalli hisobot,
har bir ustunda har bir mavzu bo'yicha olingan reytinglar sonini ko'rsatish.
b) Har bir qatorning oʻng tomonida shu masala boʻyicha oʻrtacha baholarni koʻrsating.
c) Qaysi masala eng yuqori ball to‘plagan? Muammoni ham, umumiy ballni ham ko'rsating.
d) Qaysi masala eng kam ball oldi? Muammoni ham, umumiy ballni ham ko'rsating.

8

Sinflar va ob'ektlar:


Chuqurroq qarash

Fazilatlarni yashiradigan dunyomi?


- Uilyam Shekspir
Lekin nima, xizmat qilish uchun
shaxsiy maqsadlarimiz,
Aldashni taqiqlaydi
do'stlarimizdanmi?
- Charlz Cherchill
Bu birinchi navbatda: o'zingga
rost bo'l.
- Uilyam Shekspir.

Oh maqsadlar


Ushbu bobda siz:
■ throw iborasidan foydalaning
muammo borligini bildiradi
sodir bo'ldi.
■ this kalit so'zini a ichida ishlating
boshqasini chaqirish uchun konstruktor
Xuddi shu sinfdagi konstruktor.
■ Statik o'zgaruvchilardan foydalaning va
usullari.
■ ning statik a'zolarini import qilish
sinf.
■ Yaratish uchun raqam turidan foydalaning
noyob bo'lgan doimiylar to'plami
identifikatorlar.
■ bilan raqam konstantalarini e'lon qiling
parametrlari.
■ Aniqlik uchun BigDecimal dan foydalaning
pul hisob-kitoblari.

316 8-bob Sinflar va ob'ektlar: chuqurroq qarash

8.1 Kirish
Endi biz sinflarni qurish, sinf a'zolariga kirishni nazorat qilish va
konstruktorlarni yaratish. Muammo borligini ko'rsatish uchun qanday qilib istisno qilishni ko'rsatamiz
sodir bo'lgan (7.5-bo'limda istisnolar haqida gap ketgan). Yoqish uchun this kalit so'zidan foydalanamiz
bitta konstruktor bir xil sinfdagi boshqa konstruktorni qulay tarzda chaqirish uchun. Biz muhokama qilamiz
kompozitsiya - bu sinfga boshqa sinflar ob'ektlariga havola qilish imkonini beradigan qobiliyat
a'zolari. Biz to'plam va olish usullaridan foydalanishni qayta ko'rib chiqamiz. Eslatib o'tamiz, 6.10 bo'limiga kirish
doimiylar to'plamini e'lon qilish uchun asosiy enum turini o'zgartirdi. Ushbu bobda biz qayta-qayta muhokama qilamiz
enum turlari va sinflar o'rtasidagi bog'liqlik, bu sinf kabi enum turini ko'rsatadi,
konstruktorlar, usullar va maydonlar bilan o'z faylida e'lon qilinishi mumkin. Bob shuningdek,
statik sinf a'zolari va yakuniy misol o'zgaruvchilari haqida batafsil ma'lumot beradi. Biz maxsus qayta ko'rsatamiz
bir xil paketdagi sinflar o'rtasidagi aloqa. Va nihoyat, biz sinfdan qanday foydalanishni ko'rsatamiz
Aniq pul hisob-kitoblarini amalga oshirish uchun BigDecimal. Ikki qo'shimcha sinf turi -
o'rnatilgan sinflar va anonim ichki sinflar - 12-bobda muhokama qilinadi.
8.2 Vaqt sinfidagi misollar
Bizning birinchi misolimiz ikkita sinfdan iborat - Time1 (8.1-rasm) va Time1Test (8.2-rasm).
Sinf vaqti1 kun vaqtini bildiradi. Class Time1Testning asosiy usuli bitta ob'ektni yaratadi
sinf Time1 va uning usullarini chaqiradi. Ushbu dasturning chiqishi 8.2-rasmda ko'rsatilgan.
Vaqt 1 sinf deklaratsiyasi
Class Time1ning shaxsiy instance o'zgaruvchilari soat, daqiqa va soniya (6-8 qatorlar)
vaqtni universal vaqt formatida yubordi (soatlar 24 soat formatida
0–23 oralig'ida, daqiqalar va soniyalarning har biri 0–59 oralig'ida). Vaqt1 umumiy o'z ichiga oladi
setTime (12–25-qatorlar), toUniversalString (28–31-qatorlar) va toString (satrlar) usullari
34–39). Ushbu usullar, shuningdek, davlat xizmatlari yoki davlat interfeysi deb ataladi
sinf o'z mijozlariga taqdim etadi.

8.1 Kirish


8.2 Vaqt sinfidagi misollar
8.3 A'zolarga kirishni nazorat qilish
8.4 Joriy ob'ektga murojaat qilish
Ushbu ma'lumotnomaga ega a'zolar
8.5 Vaqt sinfi misoli: haddan tashqari yuklangan
Konstruktorlar
8.6 Standart va argumentsiz
Konstruktorlar
8.7 O'rnatish va olish usullari bo'yicha eslatmalar
8.8 Tarkibi
8.9 raqam turlari
8.10 Axlat yig'ish

8.11 Statik sinf a'zolari


8.12 Statik import
8.13 Yakuniy misol o'zgaruvchilari
8.14 Paketga kirish
8.15 Aniqlik uchun BigDecimal dan foydalanish
Pul hisob-kitoblari
8.16 (ixtiyoriy) GUI va grafik ishi
O'rganish: Ob'ektlarni grafika bilan ishlatish
8.17 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish


8.2 Vaqt sinfi misoli 317

Standart konstruktor
Ushbu misolda Time1 klassi konstruktorni e'lon qilmaydi, shuning uchun kompilyator de-ni beradi.
xato konstruktori. Har bir misol o'zgaruvchisi bilvosita standart int qiymatini oladi. Misol
o'zgaruvchilar sinf tanasida e'lon qilinganida, xuddi shu ini-dan foydalangan holda ishga tushirilishi mumkin.
mahalliy o'zgaruvchidagi kabi tializatsiya sintaksisi.
SetTime usuli va otish istisnolari
SetTime usuli (12–25-qatorlar) uchta int parametrini e'lon qiladigan umumiy usul va
vaqtni belgilash uchun ulardan foydalanadi. 15–16 qatorlar qiymatni aniqlash uchun har bir argumentni tekshiradi
tegishli diapazondan tashqarida. Soat qiymati 0 dan katta yoki unga teng va undan kichik bo'lishi kerak

1 // 8.1-rasm: Time1.java


2 // Time1 sinf deklaratsiyasi vaqtni 24 soatlik formatda saqlaydi.
3
4 ommaviy sinf Vaqt1
5 {
6
7
8
9
10 // universal vaqtdan foydalangan holda yangi vaqt qiymatini o'rnatish; otish a
11 // istisno, agar soat, daqiqa yoki soniya noto'g'ri bo'lsa
12 ommaviy bekor o'rnatilgan vaqt (int soat, int daqiqa, int soniya)
13 {
14 // soat, daqiqa va soniyani tasdiqlang
15 agar (soat < 0 || soat >= 24 || daqiqa < 0 || daqiqa >= 60 ||
16 soniya < 0 || ikkinchi >= 60)
17 {
18
19
20 }
21
22 this.soat = soat;
23 bu.daqiqa = daqiqa;
24 this.second = second;
25 }
26
27 // universal vaqt formatida stringga aylantiring (HH: MM: SS)
28 ommaviy string toUniversalString()
29 {
30
31 }
32
33 // standart vaqt formatida Stringga aylantirish (H:MM:SS AM yoki PM)
34 umumiy string toString()
35 {
36
37
38
39 }
40 } // tugatish sinfi Time1

8.1-rasm | Time1 sinf deklaratsiyasi vaqtni 24 soatlik formatda saqlaydi.

xususiy int soat; // 0 - 23
shaxsiy int daqiqa; // 0 - 59
private int second; // 0 - 59

yangi IllegalArgumentException (


"soat, daqiqa va/yoki soniya diapazondan tashqarida edi");

return String.format("%02d:%02d:%02d", soat, daqiqa, soniya);

return String.format("%d:%02d:%02d %s",
((soat == 0 || soat == 12) ? 12 : soat % 12),
daqiqa, soniya, (soat < 12 ? "AM" : "PM"));

318 8-bob Sinflar va ob'ektlar: chuqurroq qarash

24, chunki universal vaqt formati soatlarni 0 dan 23 gacha butun sonlar sifatida ifodalaydi (masalan, 1 PM
soat 13 va 11: 23 soat; yarim tun 0 soat va peshin 12 soat). Xuddi shunday, ikkalasi ham
daqiqa va soniya qiymatlari 0 dan katta yoki teng va 60 dan kichik bo'lishi kerak. Qiymatlar uchun
bu diapazonlardan tashqarida setTime IllegalArgumentException turidagi istisnoni chiqaradi
(18–19-qatorlar), bu mijoz kodiga noto'g'ri argument uzatilganligi haqida xabar beradi.
usul. 7.5-bo'limda bilib olganingizdek, istisnolarni qo'lga olish uchun try...catch dan va
ularni tiklashga harakat qiling, biz buni 8.2-rasmda qilamiz. Sinf misolini yaratish sobiq
otish bayonotidagi bosish (8.1-rasm; 18-satr) yangi turdagi ob'ektni yaratadi.
ArgumentException. Sinf nomidan keyingi qavslar chaqiruvni bildiradi
IllegalArgumentException konstruktori. Bunday holda biz ruxsat beruvchi konstruktorni chaqiramiz
maxsus xato xabarini belgilash uchun bizga. Istisno obyekti yaratilgandan so'ng, otish holati-
ment setTime usulini darhol tugatadi va istisno chaqiruvga qaytariladi
vaqtni belgilashga harakat qilgan usul. Agar argument qiymatlari to'g'ri bo'lsa, 22-24 qatorlar
ularni soat, daqiqa va ikkinchi misol o'zgaruvchilariga tayinlang.

UniversalString usuli


UniversalString usuli (28–31-qatorlar) hech qanday argumentni qabul qilmaydi va Stringni qaytaradi
universal vaqt formati, har biri soat, daqiqa va soniya uchun ikkita raqamdan iborat - qayta-
ko'rsatish uchun printf formatidagi (masalan, "%02d") 0 bayrog'idan foydalanishingiz mumkin bo'lgan qo'ng'iroq qiling
belgilangan maydondagi barcha belgilar pozitsiyalaridan foydalanmaydigan qiymat uchun bosh nol
kengligi. Misol uchun, agar vaqt 13:30:07 bo'lsa, usul 13:30:07 ni qaytaradi.
30-qatorda quyidagi ma'lumotlarni o'z ichiga olgan stringni qaytarish uchun String sinfining statik usul formatidan foydalaniladi.
soat, daqiqa va soniya qiymatlari, ularning har biri ikkita raqamdan va ehtimol bosh 0 dan iborat
(0 bayrog'i bilan ko'rsatilgan). Usul formati System.out.printf usuliga o'xshaydi.
Bu format win- buyrug'ida ko'rsatish o'rniga formatlangan Stringni qaytaradi.
dow. Formatlangan String toUniversalString usuli bilan qaytariladi.
toString usuli
toString usuli (34–39-qatorlar) argumentlarni qabul qilmaydi va standart vaqtda Stringni qaytaradi
ikki nuqta bilan ajratilgan soat, daqiqa va soniya qiymatlaridan iborat format
AM yoki PM tomonidan (masalan, 11:30:17 yoki 13:27:06). UniversalString usuli kabi, meth-
od toString daqiqa va soniyani ikki sifatida formatlash uchun statik String usuli formatidan foydalanadi.
raqamli qiymatlar, agar kerak bo'lsa, bosh nol bilan. 37-qator shartli operatordan (?:) foydalanadi.
Stringdagi soat qiymatini tugatish - agar soat 0 yoki 12 bo'lsa (AM yoki PM), u paydo bo'ladi
12 sifatida; aks holda, u 1 dan 11 gacha bo'lgan qiymat sifatida ko'rinadi. 30-qatordagi shartli operator
AM yoki PM stringning bir qismi sifatida qaytarilishini aniqlaydi.
Eslatib o'tamiz, Java-dagi barcha ob'ektlarda String tasvirini qaytaradigan toString usuli mavjud
ob'ektning. Biz standart vaqt formatida vaqtni o'z ichiga olgan Stringni qaytarishni tanladik.
Method toString qachonki kodda Time1 ob'ekti paydo bo'lsa, bilvosita chaqiriladi
qo'ng'iroqda %s format spetsifikatsiyasi bilan chiqadigan qiymat kabi qator kerak
System.out.printf. String vakilini olish uchun toString-ga aniq qo'ng'iroq qilishingiz mumkin.
Vaqt ob'ekti.

Dasturiy ta'minot muhandisligi kuzatuvi 8.1


8.1-rasmdagi setTime kabi usul uchun foydalanishdan oldin usulning barcha argumentlarini tasdiqlang.
ob'ekt ma'lumotlari faqat hammasi bo'lsa o'zgartirilishini ta'minlash uchun namuna o'zgaruvchan qiymatlarini o'rnatish uchun ularni
argumentlar asosli.

8.2 Vaqt sinfi misoli 319

Sinf vaqtidan foydalanish1
Class Time1Test (8.2-rasm) Time1 sinfidan foydalanadi. 9-qator Time1 ob'ektini e'lon qiladi va yaratadi
vaqt. Operator new bilvosita Time1 sinfining standart konstruktorini chaqiradi, chunki Time1
hech qanday konstruktorni e'lon qilmaydi. Time1 ob'ekti ishga tushirilganligini tasdiqlash uchun
Erly, 12-qatorda displayTime xususiy usuli chaqiriladi (35–39-qatorlar), bu esa o'z navbatida
Universalda vaqtni chiqarish uchun Time1 ob'ektining toUniversalString va toString usullari.
mos ravishda sal-vaqt formati va standart vaqt formati. E'tibor bering, toString bo'lishi mumkin
Bu erda aniq emas, balki bilvosita chaqirilgan. Keyinchalik, 16-qator setTime usulini chaqiradi
vaqtni o'zgartirish uchun vaqt ob'ekti. Keyin 17-qatorni chiqarish uchun yana displayTime-ni chaqiradi
to'g'ri o'rnatilganligini tasdiqlash uchun ikkala formatda ham vaqt.
Dasturiy ta'minot muhandisligi kuzatuvi 8.2
3-bobdan shaxsiy kirish modifikatori bilan e'lon qilingan usullarni chaqirish mumkinligini eslang
faqat xususiy usullar e'lon qilingan sinfning boshqa usullari bilan. Bunday usul-
ods odatda foydali usullar yoki yordamchi usullar deb ataladi, chunki ular tipik
sinfning boshqa usullarini qo'llab-quvvatlash uchun ishlatiladi.

1 // 8.2-rasm: Time1Test.java


2 // Ilovada ishlatiladigan Time1 obyekti.
3
4 ommaviy sinf Time1Test
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // Time1 obyektini yaratish va ishga tushirish
9
10
11 // vaqtning chiqish satri tasvirlari
12 displayTime("Obyekt yaratilgandan keyin vaqt", vaqt);
13 System.out.println();
14
15 // vaqtni o'zgartirish va yangilangan vaqtni chiqarish
16
17 displayTime("SetTime chaqirgandan keyin", vaqt);
18 System.out.println();
19
20 // vaqtni noto'g'ri qiymatlar bilan belgilashga harakat qiling
21 urinib ko'ring
22 {
23
24 }
25 catch (IllegalArgumentException e)
26 {
27 System.out.printf("Istisno: %s%n%n", e.getMessage());
28 }
29
30 // noto'g'ri qiymatlarni o'rnatishga urinishdan keyin vaqtni ko'rsatish
31 displayTime("SetTime-ni noto'g'ri qiymatlar bilan chaqirgandan keyin", vaqt);
32 }

8.2-rasm | Ilovada ishlatiladigan Time1 obyekti. (2-qismning 1-qismi.)

Vaqt1 vaqt = yangi Vaqt1(); // Time1 konstruktorini chaqiradi

time.setTime(13, 27, 6);

time.setTime(99, 99, 99); // barcha qiymatlar diapazondan tashqarida

320 8-bob Sinflar va ob'ektlar: chuqurroq qarash

Qo'ng'iroq qilish vaqti1 usuli noto'g'ri qiymatlar bilan setTime
Ushbu usulni ko'rsatish uchun setTime o'z argumentlarini tasdiqlaydi, 23-qator setTime usulini chaqiradi.
soat, daqiqa va soniya uchun yaroqsiz 99 argumentlari bilan. Ushbu bayonot joylashtirilgan
setTime IllegalArgumentException ni tashlasa, sinash bloki (21–24-qatorlar)
Bu shunday bo'ladi, chunki argumentlarning barchasi noto'g'ri. Bu sodir bo'lganda, istisno tutiladi
25–28-qatorlar va 27-satr getMessage-ga qo'ng'iroq qilish orqali istisnoning xato xabarini ko'rsatadi.
usul. 31-qator setTime bajarmaganligini tasdiqlash uchun vaqtni ikkala formatda ham chiqaradi
noto'g'ri argumentlar taqdim etilgan vaqtni o'zgartiring.
Time1 sinf deklaratsiyasining dasturiy ta'minot muhandisligi
Vaqt 1 sinfiga nisbatan sinf dizaynining bir nechta masalalarini ko'rib chiqing. Namuna o'zgaruvchilari
soat, daqiqa va soniyalarning har biri shaxsiy deb e'lon qilinadi. Amaldagi haqiqiy ma'lumotlar namoyishi
sinf ichidagi sinf mijozlari uchun hech qanday tashvish tug'dirmaydi. Misol uchun, bu mukammal bo'lar edi
Vaqt1 uchun vaqtni o'rtadan boshlab soniyalar soni sifatida ichki ko'rsatish uchun oqilona
tun yoki yarim tundan keyingi daqiqalar va soniyalar soni. Mijozlar ham xuddi shunday foydalanishlari mumkin
ommaviy usullar va bundan xabardor bo'lmasdan bir xil natijalarga erishing. (8.5-mashq so'raydi
8.5-rasmdagi Time2 sinfidagi vaqtni o'rtadan boshlab soniyalar soni sifatida ko'rsatishingiz kerak.
tun va sinfning mijozlariga hech qanday o'zgarish ko'rinmasligini ko'rsating.)

33
34 // Time1 ob'ektini 24 soatlik va 12 soatlik formatlarda ko'rsatadi


35 shaxsiy statik bo'shliqni ko'rsatishTime (String sarlavhasi, Time1 t)
36 {
37 System.out.printf("%s%nUniversal vaqt: %s%nStandart vaqt: %s%n",
38 sarlavha, , );
39 }
40 } // tugatish sinfi Time1Test

Vaqtdan keyin ob'ekt yaratiladi


Universal vaqt: 00:00:00
Standart vaqt: 12:00:00

setTime ga qo'ng'iroq qilgandan keyin


Umumjahon vaqti: 13:27:06
Standart vaqt: 13:27:06

Istisno: soat, daqiqa va/yoki soniya diapazondan tashqarida edi

setTime-ga noto'g'ri qiymatlar bilan qo'ng'iroq qilgandan so'ng
Umumjahon vaqti: 13:27:06
Standart vaqt: 13:27:06

Dasturiy ta'minot muhandisligi kuzatuvi 8.3


Sinflar dasturlashni soddalashtiradi, chunki mijoz faqat sinfning umumiy usullaridan foydalanishi mumkin.
Bunday usullar odatda amalga oshirishga emas, balki mijozga yo'naltirilgan. Mijozlar
sinfning amalga oshirilishidan na xabardor va na unda ishtirok etmagan. Mijozlar odatda g'amxo'rlik qilishadi
sinf nima qiladi, lekin sinf buni qanday qiladi.

8.2-rasm | Ilovada ishlatiladigan Time1 obyekti. (2-qismning 2-qismi.)

t.toUniversalString() t.toString()

8.3 A'zolarga kirishni nazorat qilish 321

Java SE 8 — Sana/Vaqt API
Ushbu bo'limning misoli va ushbu bobning keyingi bir nechta misollari turli xil narsalarni ko'rsatadi
sana va vaqtni ifodalovchi sinflarda sinfni amalga oshirish tushunchalari. Professionalda
O'zingizning sana va vaqt sinflaringizni yaratish o'rniga Java-ni ishlab chiqish, odatda, qayta-qayta ishlaysiz.
Java API tomonidan taqdim etilganlardan foydalaning. Java-da har doim manipulyatsiya uchun darslar bo'lgan -
sana va vaqtni belgilashda Java SE 8 yangi sana/vaqt API-ni taqdim etadi - bu sinflar tomonidan belgilanadi
java.time paketida — Java SE 8 bilan tuzilgan ilovalar Sana/Vaqtdan foydalanishi kerak
Avvalgi Java versiyalaridagilardan ko'ra API imkoniyatlari. Yangi API turli muammolarni tuzatadi-
eski sinflar bilan sudga murojaat qiladi va manipulyatsiya uchun yanada mustahkam, foydalanish uchun qulay imkoniyatlarni taqdim etadi.
sanalar, vaqtlar, vaqt zonalari, kalendarlar va boshqalarni aniqlash. Biz ba'zi Sana/Vaqt API-dan foydalanamiz
23-bobdagi xususiyatlar. Sana/Vaqt API sinflari haqida koʻproq maʼlumotni quyidagi manzildan olishingiz mumkin:

8.3 A'zolarga kirishni nazorat qilish


Kirish modifikatorlari sinfning o'zgaruvchilari va usullariga umumiy va xususiy boshqaruvga kirish imkonini beradi.
9-bobda biz himoyalangan qo'shimcha kirish modifikatorini taqdim etamiz. Asosiy maqsad -
Ommaviy usullarning maqsadi sinf mijozlariga sinf xizmatlarining ko'rinishini taqdim etishdir
beradi (ya’ni, sinfning umumiy interfeysi). Mijozlar buni qanday qilish haqida tashvishlanishlari shart emas
sinf o'z vazifalarini bajaradi. Shu sababli, sinfning xususiy o'zgaruvchilari va xususiy
usullari (ya'ni, uni amalga oshirish tafsilotlari) mijozlari uchun ochiq emas.
8.3-rasmda xususiy sinf a'zolariga tashqarida kirish mumkin emasligi ko'rsatilgan
sinf. 9-11-qatorlar soat, daqiqa va shaxsiy misol o'zgaruvchilariga kirishga harakat qiladi
Time1 ob'ekt vaqtining ikkinchisi. Ushbu dastur kompilyatsiya qilinganda, kompilyator hosil qiladi
bu shaxsiy a'zolarga kirish imkoni bo'lmagan xato xabarlari. Bu dastur shuni nazarda tutadi
8.1-rasmdagi Time1 klassi ishlatiladi.

Dasturiy ta'minot muhandisligi kuzatuvi 8.4


Interfeyslar ilovalarga qaraganda kamroq tez-tez o'zgaradi. Amalga oshirish o'zgarganda -
es, amalga oshirishga bog'liq kod mos ravishda o'zgarishi kerak. Amalga oshirishni yashirish
dasturning boshqa qismlari sinfning bajarilishiga bog'liq bo'lish ehtimolini kamaytiradi.
eslatma tafsilotlari.

download.java.net/jdk8/docs/api/java/time/package-summary.html

1 // 8.3-rasm: MemberAccessTest.java
2 // Time1 sinfining shaxsiy a'zolariga kirish imkoni yo'q.
3 umumiy sinf MemberAccessTest
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7 Vaqt1 vaqt = yangi Vaqt1(); // Time1 ob'ektini yaratish va ishga tushirish
8
9
10
11
12 }
13 } // so'nggi sinf MemberAccessTest

8.3-rasm | Time1 sinfining shaxsiy a'zolariga kirish imkoni yo'q. (2-qismning 1-qismi.)

vaqt.soat = 7; // xato: soat Time1 da shaxsiy ruxsatga ega
vaqt.daqiqa = 15; // xato: daqiqa Time1 da shaxsiy ruxsatga ega
vaqt.sekund = 30; // xato: ikkinchi Time1 da shaxsiy ruxsatga ega

322 8-bob Sinflar va ob'ektlar: chuqurroq qarash

8.4 Joriy ob'ektning a'zolariga murojaat qilish
ushbu havola
Har bir ob'ekt this (ba'zan this deb ataladi) kalit so'zi bilan o'ziga havolaga kirishi mumkin
ma'lumotnoma). Muayyan ob'ekt uchun misol usuli chaqirilganda, usul tanasi
ob'ektning misol o'zgaruvchilari va boshqa usullarga murojaat qilish uchun this kalit so'zidan bilvosita foydalanadi.
Bu sinf kodiga qaysi ob'ektni boshqarish kerakligini bilish imkonini beradi. Ko'rib turganingizdek
8.4-rasmda siz ushbu kalit so'zni misol usulining tanasida aniq ishlatishingiz mumkin.
8.5-bo'limda bu kalit so'zdan yana bir qiziqarli foydalanish ko'rsatilgan. Buning sababini 8.11-bo'lim tushuntiradi
kalit so'zni statik usulda ishlatib bo'lmaydi.
Endi biz ushbu havolaning aniq va aniq ishlatilishini ko'rsatamiz (8.4-rasm). Bu
Masalan, biz bitta faylda ikkita sinfni e'lon qiladigan birinchisi - ThisTest klassi e'lon qilinadi
4–11 qatorlarda va SimpleTime sinfi 14–47 qatorlarda. Biz buni qachon ekanligini ko'rsatish uchun qilamiz
bir nechta sinfni o'z ichiga olgan .java faylini kompilyatsiya qilsangiz, kompilyator alohida ishlab chiqaradi
har bir kompilyatsiya qilingan sinf uchun .class kengaytmali sinf fayli. Bunday holda, ikkita alohida fayl
ishlab chiqariladi - SimpleTime.class va ThisTest.class. Bitta manba kodi (.java)
fayl bir nechta sinf deklaratsiyasini o'z ichiga oladi, kompilyator ikkala sinf faylini o'sha sinflar uchun joylashtiradi
xuddi shu katalogda. 8.4-rasmda faqat ThisTest klassi ochiq deb e'lon qilinganiga e'tibor bering. A
manba kodi faylida faqat bitta umumiy sinf bo'lishi mumkin - aks holda kompilyatsiya xatosi yuzaga keladi.
Umumiy bo'lmagan sinflardan faqat bitta paketdagi boshqa sinflar foydalanishi mumkin. Demak, bunda
Masalan, SimpleTime sinfidan faqat ThisTest klassi foydalanishi mumkin.

MemberAccessTest.java:9: soat Time1 da shaxsiy ruxsatga ega


vaqt.soat = 7; // xato: soat Time1 da shaxsiy ruxsatga ega
^
MemberAccessTest.java:10: daqiqa Time1 da shaxsiy ruxsatga ega
vaqt.daqiqa = 15; // xato: daqiqa Time1 da shaxsiy ruxsatga ega
^
MemberAccessTest.java:11: soniya Time1 da shaxsiy ruxsatga ega
vaqt.sekund = 30; // xato: ikkinchi Time1 da shaxsiy ruxsatga ega
^
3 ta xato

Umumiy dasturlash xatosi 8.1


Sinf aʼzosi boʻlmagan usul yordamida uning shaxsiy aʼzosiga kirishga urinish
sinf kompilyatsiya xatosini yaratadi.

1 // 8.4-rasm: ThisTest.java


2 // bu ob'ekt a'zolariga murojaat qilish uchun bevosita va aniq ishlatiladi.
3
4 ommaviy sinf BuTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {

8.4-rasm | bu ob'ektning a'zolariga murojaat qilish uchun bevosita va aniq ishlatiladi. (2-qismning 1-qismi.)

8.3-rasm | Time1 sinfining shaxsiy a'zolariga kirish imkoni yo'q. (2-qismning 2-qismi.)

8.4 Ushbu havola bilan joriy ob'ekt a'zolariga murojaat qilish 323

SimpleTime klassi (14-47-qatorlar) uchta xususiy misol o'zgaruvchisini e'lon qiladi - soat,
daqiqa va soniya (16-18-qatorlar). Sinf konstruktori (23–28-qatorlar) uchta int oladi
SimpleTime obyektini ishga tushirish uchun argumentlar. Biz yana bir bor parametr nomlaridan foydalandik
konstruktor (23-qator), sinfning misol oʻzgaruvchilari nomlari bilan bir xil (16–18-qatorlar),
shuning uchun biz ushbu havoladan 25-27-qatorlardagi misol o'zgaruvchilariga murojaat qilish uchun foydalanamiz.

8 SimpleTime vaqti = yangi SimpleTime(15, 30, 19);


9 System.out.println(time.buildString());
10 }
11 } // ThisTest sinfini yakunlash
12
13 // SimpleTime sinfi "bu" havolani namoyish etadi
14-sinf SimpleTime
15 {
16 xususiy int soat; // 0-23
17 shaxsiy int daqiqa; // 0-59
18 xususiy int soniya; // 0-59
19
20 // agar konstruktor bir xil parametr nomlaridan foydalansa
21 // misol o'zgaruvchisi "bu" havolani nomlaydi
22 // nomlarni farqlash uchun zarur
23 ommaviy SimpleTime (int soat, int daqiqa, int soniya)
24 {
25
26
27
28 }
29
30 // UniversalString ga qo'ng'iroq qilish uchun aniq va yashirin "this" dan foydalaning
31 ommaviy string buildString()
32 {
33 return String.format("%24s: %s%n%24s: %s",
34 "this.toUniversalString()", ,
35 "toUniversalString()", );
36 }
37
38 // universal vaqt formatida stringga aylantiring (HH: MM: SS)
39 ommaviy string toUniversalString()
40 {
41 // misol o'zgaruvchilariga kirish uchun bu erda "bu" shart emas,
42 // chunki usulda bir xil mahalliy o'zgaruvchilar mavjud emas
43 // misol o'zgaruvchilari sifatida nomlar
44 qaytish String.format("%02d:%02d:%02d",
45 , , );
46 }
47 } // SimpleTime sinfini tugatish

this.toUniversalString(): 15:30:19


toUniversalString(): 15:30:19

8.4-rasm | bu ob'ektning a'zolariga murojaat qilish uchun bevosita va aniq ishlatiladi. (2-qismning 2-qismi.)

bu.soat = soat; // "bu" ob'ektning soatini belgilang
bu.daqiqa = daqiqa; // "bu" ob'ektning daqiqasini o'rnating
this.second = soniya; // "bu" ob'ektning ikkinchisini o'rnating

this.toUniversalString()


toUniversalString()

bu.soat bu.daqiqa bu.sekund


324 8-bob Sinflar va ob'ektlar: chuqurroq qarash

buildString usuli (31–36-qatorlar) foydalanadigan bayonot tomonidan yaratilgan Stringni qaytaradi.
bu havola aniq va bilvosita. 34-qator uni toUni- usulini chaqirish uchun aniq ishlatadi.
versalString. 35-qator xuddi shu usulni chaqirish uchun uni bilvosita ishlatadi. Ikkala satr ham bajaradi
bir xil vazifa. Siz odatda ushbu dastur ichidagi boshqa usullarga murojaat qilish uchun buni aniq ishlatmaysiz
joriy ob'ekt. Bundan tashqari, toUniversalString usulidagi 45-satr ushbu havolani aniq ishlatadi.
Har bir misol o'zgaruvchisiga kirish uchun. Bu erda kerak emas, chunki usul shunday qiladi
sinfning misol o'zgaruvchilariga soya soladigan mahalliy o'zgaruvchilar mavjud emas.

ThisTest klassining asosiy usuli (6–10-qatorlar) SimpleTime sinfini namoyish etadi. 8-qator


SimpleTime sinfining namunasini yaratadi va uning konstruktorini chaqiradi. 9-qator ni chaqiradi
ob'ektning buildString usuli, keyin natijalarni ko'rsatadi.
8.5 Vaqt sinfi misoli: haddan tashqari yuklangan konstruktorlar
Ma'lumki, sinf ob'ektlari qanday bo'lishini belgilash uchun o'z konstruktoringizni e'lon qilishingiz mumkin
ishga tushiriladi. Keyinchalik, biz bir nechta haddan tashqari yuklangan konstruktorlar bilan sinfni namoyish qilamiz.
ushbu sinfning ob'ektlari turli yo'llar bilan ishga tushirilishi mumkin. Konstruktorlarni ortiqcha yuklash uchun sim-
ply turli imzolar bilan bir nechta konstruktor deklaratsiyasini taqdim etadi.
Haddan tashqari yuklangan konstruktorlar bilan sinf vaqti2
8.1-rasmdagi Time1 sinfining standart konstruktori ishga tushirilgan soat, daqiqa va soniya
ularning standart 0 qiymatlari (ya'ni universal vaqtda yarim tun). Standart konstruktor bunday qilmaydi
sinf mijozlariga vaqtni nolga teng bo'lmagan qiymatlar bilan boshlashga imkon bering. Sinf vaqti2 (8.5-rasm)
ob'ektlarni ishga tushirishning qulay usullarini ta'minlovchi beshta ortiqcha yuklangan konstruktorni o'z ichiga oladi. In
ushbu dasturda to'rtta konstruktor beshdan birini chaqiradi, bu esa o'z navbatida qiymatni ta'minlaydi
soat uchun berilgan 0 dan 23 gacha bo'lgan oraliqda, daqiqa va soniya uchun qiymatlar har biri
0 dan 59 gacha bo'lgan oraliqda. Kompilyator mos keladigan konstruktorni chaqiradi
konstruktor chaqiruvida ko'rsatilgan argumentlar turlarining soni, turlari va tartibi
har bir konstruktsiyada ko'rsatilgan parametrlar turlarining soni, turlari va tartibi bilan
tor deklaratsiyasi. Class Time2, shuningdek, har bir misol o'zgaruvchisi uchun o'rnatish va olish usullarini taqdim etadi.

Xatolarning oldini olish bo'yicha maslahat 8.1


Agar siz x = x deb aytsangiz, aksariyat IDElar ogohlantirish beradi; buning o'rniga.x = x;. Bayonot
x = x; ko'pincha no-op (operatsiya yo'q) deb ataladi.

Ishlash bo'yicha maslahat 8.1


Java har bir sinf uchun har bir usulning faqat bitta nusxasini saqlash orqali saqlashni tejaydi - bu usul
sinfning har bir ob'ekti tomonidan chaqiriladi. Har bir ob'ekt esa o'z nusxasiga ega
sinfning misol o'zgaruvchilari. Sinfning har bir usuli buni aniqlash uchun bilvosita ishlatadi
manipulyatsiya qilish uchun sinfning o'ziga xos ob'ekti.

1 // 8.5-rasm: Time2.java


2 // Haddan tashqari yuklangan konstruktorlar bilan Time2 sinf deklaratsiyasi.
3
4 ommaviy sinf Vaqt2
5 {

8.5-rasm | Haddan tashqari yuklangan konstruktorlar bilan Time2 klassi. (4-qismning 1-qismi.)


8.5 Vaqt sinfi misoli: haddan tashqari yuklangan konstruktorlar 325

6 shaxsiy int soat; // 0 - 23
7 shaxsiy int daqiqa; // 0 - 59
8 xususiy int soniya; // 0 - 59
9
10 // Time2 argumentsiz konstruktor:
11 // har bir misol o'zgaruvchisini nolga aylantiradi
12
13 {
14
15 }
16
17 // Time2 konstruktori: soat taqdim etilgan, daqiqa va soniya sukut bo'yicha 0 ga teng
18
19 {
20
21 }
22
23 // Time2 konstruktori: soat va daqiqa taqdim etilgan, soniya sukut bo'yicha 0 ga teng
24
25 {
26
27 }
28
29 // Time2 konstruktori: soat, daqiqa va soniya berilgan
30
31 {
32 agar (soat < 0 || soat >= 24)
33 throw new IllegalArgumentException("soat 0-23 bo'lishi kerak");
34
35 agar (daqiqa < 0 || daqiqa >= 60)
36 yangi IllegalArgumentException ("daqiqa 0-59 bo'lishi kerak");
37
38 agar (ikkinchi < 0 || soniya >= 60)
39 throw new IllegalArgumentException("ikkinchi 0-59 bo'lishi kerak");
40
41 this.soat = soat;
42 bu.daqiqa = daqiqa;
43 this.second = second;
44 }
45
46 // Time2 konstruktori: boshqa Time2 ob'ekti taqdim etilgan
47
48 {
49
50
51 }
52
53 // Usullarni o'rnatish
54 // universal vaqtdan foydalangan holda yangi vaqt qiymatini o'rnatish;
55 // ma'lumotlarni tasdiqlang
56 ommaviy bekor qilish vaqti (int soat, int daqiqa, int soniya)
57 {

8.5-rasm | Haddan tashqari yuklangan konstruktorlar bilan Time2 klassi. (4 qismning 2-qismi.)

umumiy vaqt2()

bu(0, 0, 0); // konstruktorni uchta argument bilan chaqiring

umumiy vaqt 2 (int soat)

bu (soat, 0, 0); // konstruktorni uchta argument bilan chaqiring

umumiy vaqt 2 (int soat, int daqiqa)

bu (soat, daqiqa, 0); // konstruktorni uchta argument bilan chaqiring

umumiy vaqt2 (int soat, int daqiqa, int soniya)

umumiy vaqt 2 (vaqt 2 vaqt)

// konstruktorni uchta argument bilan chaqiring
this(time.getHour(), time.getMinute(), time.getSecond());

326 8-bob Sinflar va ob'ektlar: chuqurroq qarash

58 agar (soat < 0 || soat >= 24)
59 throw new IllegalArgumentException("soat 0-23 bo'lishi kerak");
60
61 agar (daqiqa < 0 || daqiqa >= 60)
62 throw new IllegalArgumentException("daqiqa 0-59 bo'lishi kerak");
63
64 agar (ikkinchi < 0 || soniya >= 60)
65 throw new IllegalArgumentException("ikkinchi 0-59 bo'lishi kerak");
66
67 this.soat = soat;
68 bu.daqiqa = daqiqa;
69 this.second = second;
70 }
71
72 // tasdiqlang va soatni belgilang
73 ommaviy bekor o'rnatilganSoat(int soat)
74 {
75 agar (soat < 0 || soat >= 24)
76 throw new IllegalArgumentException("soat 0-23 bo'lishi kerak");
77
78 this.soat = soat;
79 }
80
81 // tasdiqlang va daqiqani o'rnating
82 ommaviy bekor to'plamiMinute (int daqiqa)
83 {
84 agar (daqiqa < 0 && daqiqa >= 60)
85 throw new IllegalArgumentException("daqiqa 0-59 bo'lishi kerak");
86
87 bu.daqiqa = daqiqa;
88 }
89
90 // tasdiqlang va ikkinchisini o'rnating
91 ommaviy bekor to'plamSecond(int soniya)
92 {
93 agar (ikkinchi >= 0 && soniya < 60)
94 throw new IllegalArgumentException("ikkinchi 0-59 bo'lishi kerak");
95
96 this.second = second;
97 }
98
99 // Usullarni olish
100 // soat qiymatini oling
101 ommaviy int getHour()
102 {
103 qaytish soati;
104 }
105
106 // daqiqa qiymatini oling
107 ommaviy int getMinute()
108 {
109 qaytish daqiqasi;
110 }

8.5-rasm | Haddan tashqari yuklangan konstruktorlar bilan Time2 klassi. (4 qismning 3-qismi.)


8.5 Vaqt sinfi misoli: haddan tashqari yuklangan konstruktorlar 327

Class Time2 konstruktorlari - bu orqali bir konstruktorni boshqasidan chaqirish
12–15 qatorlar argumentlarsiz chaqiriladigan argumentsiz konstruktorni e'lon qiladi.
Sinfdagi har qanday konstruktorni e'lon qilganingizdan so'ng, kompilyator standart konstruksiyani taqdim etmaydi.
tor. Ushbu argumentsiz konstruktor Time2 sinfining mijozlari Time2 ob'ektlarini yaratishi mumkinligini ta'minlaydi
standart qiymatlar bilan. Bunday konstruktor ob'ektni kontekstda ko'rsatilgandek ishga tushiradi.
instruktor tanasi. Tanada biz buni faqat birinchi holat sifatida ishlatishga ruxsat beramiz -
konstruktor tanasidagi ment. 14-qator buni Time2 ni chaqirish uchun usul-chaqiruv sintaksisida ishlatadi
soat, daqiqa uchun 0 qiymatlari bilan uchta parametrni (30–44-qatorlar) qabul qiluvchi konstruktor
va ikkinchi. Bu erda ko'rsatilganidek foydalanish - taqdim etilgan ishga tushirish kodini qayta ishlatishning mashhur usuli
no-argumentda shunga o'xshash kodni belgilash o'rniga sinfning boshqa konstruktorlari tomonidan
konstruktor tanasi. Sintaksisni yaratish uchun beshta Time2 konstruktoridan to'rttasida ushbu sintaksisdan foydalanamiz
saqlash va o'zgartirish osonroq. Agar biz Time2 sinfi ob'ektlarini ishga tushirish usulini o'zgartirishimiz kerak bo'lsa,
faqat sinfning boshqa konstruktorlari chaqiradigan konstruktorni o'zgartirish kerak bo'ladi.

18–21 qatorlar bitta int parametri bilan Time2 konstruktorini eʼlon qiladi.


soat, 30-44-qatorlardagi konstruktorga daqiqa va soniya uchun 0 bilan uzatiladi.
24-27 qatorlar Time2 konstruktorini e'lon qiladi, u ikkita int parametrini ifodalaydi.
soat va daqiqalar, ular 30-satrdagi konstruktorga soniya uchun 0 bilan uzatiladi.
44. Argumentsiz konstruktor kabi bu konstruktorlarning har biri konstruktorni chaqiradi.
kodning takrorlanishini minimallashtirish uchun 30-44 qatorlarda. 30-44 qatorlar Time2 konstruktorini e'lon qiladi

111
112 // ikkinchi qiymatni oling


113 public int getSecond()
114 {
115 soniya qaytish;
116 }
117
118 // universal vaqt formatida stringga aylantiring (HH: MM: SS)
119 ommaviy string toUniversalString()
120 {
121 qaytish String.format(
122 "%02d:%02d:%02d", getHour(), getMinute(), getSecond());
123 }
124
125 // standart vaqt formatida Stringga aylantirish (H:MM:SS AM yoki PM)
126 umumiy string toString()
127 {
128 return String.format("%d:%02d:%02d %s",
129 ((getHour() == 0 || getHour() == 12) ? 12 : getHour() % 12),
130 getMinute(), getSecond(), (getHour() < 12 ? "AM" : "PM"));
131 }
132 } // tugash sinfi Time2

Umumiy dasturlash xatosi 8.2


Bu konstruktor tanasida boshqasini chaqirish uchun ishlatilsa, bu kompilyatsiya xatosi
sinf konstruktorlari, agar bu qo'ng'iroq konstruktordagi birinchi ibora bo'lmasa. Bu ham
Agar usul konstruktorni to'g'ridan-to'g'ri shu orqali chaqirishga harakat qilganda xato.

8.5-rasm | Haddan tashqari yuklangan konstruktorlar bilan Time2 klassi. (4 qismning 4-qismi.)


328 8-bob Sinflar va ob'ektlar: chuqurroq qarash

soat, daqiqa va soniyani ifodalovchi uchta int parametrini oladi. Bu kon-
struktor misol o'zgaruvchilarini tasdiqlaydi va ishga tushiradi.
47–51 qatorlar boshqa Time2 ga havolani qabul qiluvchi Time2 konstruktorini e'lon qiladi
ob'ekt. Time2 argumentidagi qiymatlar uchta argumentli konstruktorga uzatiladi
soat, daqiqa va soniyani ishga tushirish uchun 30–44 qatorlarda. 50-qator to'g'ridan-to'g'ri bo'lishi mumkin
ifodalar bilan argument vaqtining soat, daqiqa va soniya qiymatlariga kirdi
vaqt.soat, vaqt.daqiqa va vaqt.soniya — soat, daqiqa va soniya boʻlsa ham
Time2 sinfining xususiy o'zgaruvchilari sifatida e'lon qilingan. Bu o'rtasidagi maxsus munosabat bilan bog'liq
bir xil sinf ob'ektlari. Nega get usullaridan foydalanish afzalroq ekanini bir lahzada bilib olamiz.

Class Time2 ning setTime usuli


setTime usuli (56-70-qatorlar) IllegalArgumentExceptionni chiqaradi (59, 62 va qatorlar).
65) agar har qanday usulning argumentlari diapazondan tashqarida bo'lsa. Aks holda, u Time2 ning misol o'zgarishini o'rnatadi.
argument qiymatlariga ega (67–69-qatorlar).
Class Time2 ning to'plamiga oid eslatmalar va usullar va konstruktorlarni oling
Time2 ning get usullari butun sinfda chaqiriladi. Xususan, universal usullar -
String va toString qo'ng'iroq usullari getHour, getMinute va getSecond 122-qatorda va satrlarda
mos ravishda 129–130. Har holda, bu usullar sinfning shaxsiyga kirishi mumkin edi
ma'lumotlar to'g'ridan-to'g'ri get usullarini chaqirmasdan. Biroq, vakillikni o'zgartirishni o'ylab ko'ring
uchta int qiymatidan (12 bayt xotira talab qilinadi) bitta int qiymatini takrorlashgacha bo'lgan vaqt
Yarim tundan beri o'tgan soniyalarning umumiy sonidan norozi bo'lib (faqat to'rtta vaqt talab qilinadi
bayt xotira). Agar biz bunday o'zgarishlarni amalga oshirgan bo'lsak, faqatgina kirish usullarining organlari
shaxsiy ma'lumotlar to'g'ridan-to'g'ri o'zgarishi kerak, xususan, uchta argumentli konstruktor,
setTime usuli va individual to'plam va soat, daqiqa va soniya uchun usullarni oling.
UniversalString yoki toString usullarining tanasini o'zgartirishga hojat qolmaydi
chunki ular to'g'ridan-to'g'ri ma'lumotlarga kira olmaydi. Sinfni shu tarzda loyihalash uni kamaytiradi
sinfni amalga oshirishni o'zgartirishda dasturlash xatolarining ehtimoli.
Xuddi shunday, har bir Time2 konstruktori tegishli bayonotlarning nusxasini o'z ichiga olishi mumkin
uch argumentli konstruktordan. Buni qilish biroz samaraliroq bo'lishi mumkin, chunki
qo'shimcha konstruktor chaqiruvlari o'chiriladi. Biroq, takroriy bayonotlar sinfni o'zgartirishga olib keladi
ichki ma'lumotlarni taqdim etish qiyinroq. Time2 konstruktorlari konfiguratsiyani chaqiradi.
uchta argumentga ega bo'lgan instruktor uchta argumentni amalga oshirishdagi har qanday o'zgarishlarni talab qiladi.
argument konstruktori faqat bir marta amalga oshiriladi. Bundan tashqari, kompilyator dasturlarni optimallashtirishi mumkin
oddiy usullarga qo'ng'iroqlarni olib tashlash va ularni kengaytirilgan kod bilan almashtirish
larations - bu dastur ish faoliyatini yaxshilaydigan kodni kiritish deb nomlanuvchi usul.
Class Time2 ning haddan tashqari yuklangan konstruktorlaridan foydalanish
Class Time2Test (8.6-rasm) haddan tashqari yuklangan Time2 konstruktorlarini (8-12 va 24-qatorlar) chaqiradi.
8-qator Time2 argumentsiz konstruktorini chaqiradi. 9-12 qatorlar o'tishni ko'rsatadi
boshqa Time2 konstruktorlariga. 9-qator bitta argumentli konstruktorni chaqiradi
8.5-rasmning 18-21 satrlarida int oladi. 10-qator ikki argumentli konstruktorni chaqiradi
8.5-rasmning 24-27 qatorlari. 11-qator 30-44-qatorlarda uchta argumentli konstruktorni chaqiradi.

Dasturiy ta'minot muhandisligi kuzatuvi 8.5


Agar sinfning bir ob'ekti xuddi shu sinfning boshqa ob'ektiga havola bo'lsa, birinchi ob'ekt
ikkinchi ob'ektning barcha ma'lumotlari va usullariga (jumladan, shaxsiy ma'lumotlarga) kira oladi.

8.5 Vaqt sinfi misoli: haddan tashqari yuklangan konstruktorlar 329

8.5-rasm. 12-qator 47–51-qatorlarda Time2 ni oladigan yagona argumentli konstruktorni chaqiradi
8.5-rasm. Keyinchalik, ilova har bir Time2 ob'ektining string tasvirlarini ko'rsatadi
to'g'ri ishga tushirilganligiga ishonch hosil qiling (15-19-qatorlar). 24-qator yaratish orqali t6 ni ishga tushirishga harakat qiladi
yangi Time2 ob'ekti va konstruktorga uchta noto'g'ri qiymatlarni o'tkazish. Konstruktor bo'lganda
ob'ekt soatini ishga tushirish uchun noto'g'ri soat qiymatidan foydalanishga urinish, IllegalArgumentEx-
kontseptsiya sodir bo'ladi. Biz ushbu istisnoni 26-qatorda ushlaymiz va uning xato xabarini ko'rsatamiz, bu esa qayta tiklanadi.
chiqishning oxirgi satrida yakunlanadi.

1 // 8.6-rasm: Time2Test.java


2 // Time2 obyektlarini ishga tushirish uchun ishlatiladigan haddan tashqari yuklangan konstruktorlar.
3
4 ommaviy sinf Time2Test
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8
9
10
11
12
13
14 System.out.println("Tuzilgan:");
15 displayTime("t1: barcha standart argumentlar", t1);
16 displayTime("t2: belgilangan soat; standart daqiqa va soniya", t2);
17 displayTime("t3: soat va daqiqa belgilangan; standart soniya", t3);
18 displayTime("t4: soat, daqiqa va soniya ko'rsatilgan", t4);
19 displayTime("t5: Time2 obyekti t4 belgilangan", t5);
20
21 // t6 ni noto'g'ri qiymatlar bilan ishga tushirishga harakat qiling
22 urinib ko'ring
23 {
24
25 }
26 catch (IllegalArgumentException e)
27 {
28 System.out.printf("t6 ishga tushirilayotganda %nException: %s%n",
29 e.getMessage());
30 }
31 }
32
33 // Time2 ob'ektini 24 soatlik va 12 soatlik formatlarda ko'rsatadi
34 shaxsiy statik bo'shliqni ko'rsatishTime (String sarlavhasi, Time2 t)
35 {
36 System.out.printf("%s%n %s%n %s%n",
37 sarlavha, t.toUniversalString(), t.toString());
38 }
39 } // tugatish sinfi Time2Test

Quyidagilar bilan qurilgan:


t1: barcha standart argumentlar
00:00:00
12:00:00

8.6-rasm | Haddan tashqari yuklangan konstruktorlar Time2 obyektlarini ishga tushirish uchun ishlatiladi. (2-qismning 1-qismi.)

Vaqt2 t1 = yangi Vaqt2(); // 00:00:00
Vaqt2 t2 = yangi Vaqt2(2); // 02:00:00
Vaqt2 t3 = yangi Vaqt2(21, 34); // 21:34:00
Vaqt2 t4 = yangi Vaqt2(12, 25, 42); // 12:25:42
Vaqt2 t5 = yangi Vaqt2(t4); // 12:25:42

Vaqt2 t6 = yangi Vaqt2(27, 74, 99); // noto'g'ri qiymatlar


330 8-bob Sinflar va ob'ektlar: chuqurroq qarash

8.6 Standart va argumentsiz konstruktorlar
Har bir sinfda kamida bitta konstruktor bo'lishi kerak. Agar siz sinf deklaratsiyasida hech qanday ma'lumot bermasangiz
ratsion, kompilyator chaqirilganda hech qanday argumentni qabul qilmaydigan standart konstruktor yaratadi.
Odatiy konstruktor misol o'zgaruvchilarini da ko'rsatilgan boshlang'ich qiymatlarga ishga tushiradi
ularning deklaratsiyasi yoki standart qiymatlari (ibtidoiy sonlar uchun nol, false uchun
mantiqiy qiymatlar va havolalar uchun null). 9.4.1 bo'limida siz standart konfiguratsiyani bilib olasiz.
instruktor boshqa vazifani ham bajaradi.
Eslatib o'tamiz, agar sizning sinfingiz konstruktorlarni e'lon qilsa, kompilyator standartni yaratmaydi
konstruktor. Bunday holda, agar standart ishga tushirilgan bo'lsa, argumentsiz konstruktorni e'lon qilishingiz kerak.
tion talab qilinadi. Standart konstruktor kabi argumentsiz konstruktor bilan chaqiriladi
bo'sh qavslar. Time2 no-argument konstruktori (8.5-rasmning 12-15-qatorlari) aniq-
har biri uchun uchta argumentli konstruktor 0 ga o'tish orqali Time2 ob'ektini ishga tushiradi
parametr. 0 int misol o'zgaruvchilari uchun standart qiymat bo'lganligi sababli, argumentsiz konfiguratsiya
Ushbu misoldagi struktor aslida bo'sh tana bilan e'lon qilinishi mumkin. Bunday holda, har bir
no-argument konstruktori bo'lganda misol o'zgaruvchisi standart qiymatini oladi
chaqirdi. Agar biz argumentsiz konstruktorni o'tkazib yuborsak, bu sinfning mijozlari qila olmaydi
new Time2() ifodasi bilan Time2 ob'ektini yarating.

8.7 O'rnatish va olish usullari bo'yicha eslatmalar


Ma'lumki, sinfning shaxsiy maydonlarini faqat uning usullari bilan boshqarish mumkin. Oddiy
manipulyatsiya mijozning bank balansini o'zgartirish bo'lishi mumkin (masalan, shaxsiy

t2: belgilangan soat; standart daqiqa va soniya


02:00:00
02:00:00
t3: belgilangan soat va daqiqa; standart soniya
21:34:00
21:34:00
t4: soat, daqiqa va soniya belgilangan
12:25:42
12:25:42
t5: Vaqt2 obyekti t4 belgilangan
12:25:42
12:25:42
T6 ni ishga tushirishda istisno: soat 0-23 bo'lishi kerak

Xatolarning oldini olish bo'yicha maslahat 8.2


Qaytish turini konstruktor ta'rifiga kiritmasligingizga ishonch hosil qiling. Java boshqalarga ruxsat beradi
konstruktorlaridan tashqari sinfning usullarini sinf bilan bir xil nomga ega bo'lish va belgilash
qaytarish turlari. Bunday usullar konstruktorlar emas va ob'ekt bo'lganda chaqirilmaydi
sinf yaratilgan.

Umumiy dasturlash xatosi 8.3


Agar dastur o'tish orqali sinf ob'ektini ishga tushirishga harakat qilsa, kompilyatsiya xatosi yuzaga keladi
sinf konstruktoriga noto'g'ri son yoki argument turlari.

8.6-rasm | Haddan tashqari yuklangan konstruktorlar Time2 obyektlarini ishga tushirish uchun ishlatiladi. (2-qismning 2-qismi.)


8.7 O'rnatish va olish usullari bo'yicha eslatmalar 331

BankAccount sinfining o'zgaruvchisi) computeInterest usuli bilan. Belgilangan usullar
Odatda mutator usullar deb ham ataladi, chunki ular odatda ob'ekt holatini o'zgartiradilar -
ya'ni misol o'zgaruvchilari qiymatlarini o'zgartirish. Get usullari odatda accessor deb ham ataladi
usullari yoki so'rov usullari.

O'rnatish va olish usullari va umumiy ma'lumotlar


Ko'rinishidan, to'plam va olish imkoniyatlarini taqdim etish, asosan, a qilish bilan bir xil
sinfning misol o'zgaruvchilari public. Bu Java-ni juda kerakli qiladigan nozikliklardan biridir
dasturiy ta'minot muhandisligi uchun. Umumiy misol o'zgaruvchisi har qanday usul bilan o'qilishi yoki yozilishi mumkin
bu o'zgaruvchini o'z ichiga olgan ob'ektga havolaga ega. Agar misol o'zgaruvchisi e'lon qilingan bo'lsa
private, public get usuli, albatta, boshqa usullarga kirishga imkon beradi, lekin get usuli-
od mijozning unga qanday kirishini boshqarishi mumkin. Masalan, get usuli ni boshqarishi mumkin
mijoz kodini haqiqiy ma'lumotlar ko'rinishidan himoya qilib, qaytaradigan ma'lumotlarning formati.
Ommaviy to'plam usuli o'zgaruvchanlikni o'zgartirishga urinishlarni diqqat bilan tekshirishi mumkin va kerak.
ning qiymati va agar kerak bo'lsa, istisno qiling. Masalan, kunni belgilashga urinishlar
oyni 37 ga yoki odamning og'irligi salbiy qiymatga rad etilishi kerak. Shunday qilib, al-
O'rnatish va olish usullari shaxsiy ma'lumotlarga kirishni ta'minlasa ham, kirish cheklangan
usullarini amalga oshirish. Bu yaxshi dasturiy ta'minot muhandisligini rivojlantirishga yordam beradi.

Belgilangan usullarda haqiqiylikni tekshirish


Ma'lumotlar yaxlitligining afzalliklari avtomatik ravishda ta'qib etilmaydi, chunki misollar o'zgaradi.
qobiliyatlar shaxsiy deb e'lon qilinadi - haqiqiyligini tekshirishni taqdim etishingiz kerak. Sinfning to'plami usullari
sinf ob'ektlariga noto'g'ri ma'lumotlarni belgilashga urinishlar qilinganligini aniqlashi mumkin. yozing-
O'rnatilgan usullar bekor qaytish turiga ega va urinishlarni ko'rsatish uchun istisnolardan foydalanish
noto'g'ri ma'lumotlarni tayinlash uchun. Biz 11-bobda istisnolardan foydalanishni batafsil muhokama qilamiz.

Dasturiy ta'minot muhandisligi kuzatuvi 8.6


Sinflar hech qachon umumiy doimiy bo'lmagan ma'lumotlarga ega bo'lmasligi kerak, ammo ma'lumotlarni umumiy statik deb e'lon qiladi
final sizga o'z sinfingiz mijozlari uchun konstantalarni taqdim etish imkonini beradi. Masalan, sinf
Math umumiy statik yakuniy konstantalar Math.E va Math.PI taklif qiladi.

Xatolarning oldini olish bo'yicha maslahat 8.3


Agar doimiy qiymatlar o'zgarishi mumkin bo'lsa, umumiy statik yakuniy konstantalarni bermang
dasturiy ta'minotingizning keyingi versiyalarida.

Dasturiy ta'minot muhandisligi kuzatuvi 8.7


Zarur bo'lganda, shaxsiy qiymatlarni o'zgartirish va olish uchun ommaviy usullarni taqdim eting
misol o'zgaruvchilari. Ushbu arxitektura sinfning amalga oshirilishini uning klientidan yashirishga yordam beradi.
ents, bu dasturni o'zgartirish imkoniyatini yaxshilaydi.

Xatolarning oldini olish bo'yicha maslahat 8.4


Set va get usullaridan foydalanish disk raskadrovka va texnik xizmat ko'rsatish osonroq bo'lgan sinflarni yaratishga yordam beradi.
Agar faqat bitta usul ma'lum bir vazifani bajarsa, masalan, misol o'zgaruvchisini o'rnatish
ob'ekt, disk raskadrovka va sinfni saqlash osonroq. Agar misol o'zgaruvchisi o'rnatilmagan bo'lsa
to'g'ri, misol o'zgaruvchisini haqiqatda o'zgartiradigan kod bitta to'plam usuliga lokalizatsiya qilinadi.
Nosozliklarni tuzatish bo'yicha harakatlaringiz bitta usulga qaratilishi mumkin.

332 8-bob Sinflar va ob'ektlar: chuqurroq qarash

Predikativ usullar
Aksessuar usullaridan yana bir keng tarqalgan foydalanish shartning to'g'ri yoki noto'g'ri ekanligini tekshirish -
bunday usullar ko'pincha predikativ usullar deb ataladi. Misol ArrayList klassi bo'lishi mumkin
isEmpty usuli, agar ArrayList bo'sh bo'lsa, true qiymatini qaytaradi, aks holda noto'g'ri. A
ArrayList dan boshqa elementni o'qishdan oldin dastur isEmpty ni sinab ko'rishi mumkin.
8.8 Tarkibi
Sinf a'zolar sifatida boshqa sinflar ob'ektlariga havolalarga ega bo'lishi mumkin. Bu kompozitsion deb ataladi -
tion va ba'zan ega-a munosabatlari deb ataladi. Masalan, AlarmClock ob-
ob'ekt joriy vaqtni va signal chalishi kerak bo'lgan vaqtni bilishi kerak,
shuning uchun AlarmClock ob'ektidagi Time ob'ektlariga ikkita havolani kiritish maqsadga muvofiqdir. Avtomobil
Rulda, sindirish pedali va gaz pedaliga ega.
Sinf sanasi
Ushbu kompozitsiya misolida Sana (8.7-rasm), Xodim (8.8-rasm) va Em- sinflari mavjud.
ployeeTest (8.9-rasm). Class Date (8.7-rasm) misol o'zgaruvchilari oy, kun va e'lon qiladi
yil (6-8 qatorlar) sanani ifodalash uchun. Konstruktor uchta int parametrini oladi. Chiziqlar
17–19 oyni tasdiqlaydi - agar u chegaradan tashqarida bo'lsa, 18–19 qatorlar istisno qiladi. 22-qatorlar
25 kunni tasdiqlang. Agar kun, xususan, kunlar soniga qarab noto'g'ri bo'lsa
oy (kabisa yillari uchun maxsus testni talab qiladigan 29 fevraldan tashqari), 24–25 qatorlar
istisno qiling. 28-31-qatorlar fevral oyidagi kabisa yili sinovini o'tkazadi. Agar oy
Fevral, kun esa 29 va yil kabisa yili emas, 30–31 qatorlar bundan mustasno.
tion. Agar istisnolar qo'yilmasa, 33-35 qatorlar Sana misol o'zgaruvchilarini ishga tushiradi
va 38–38 qatorlar ushbu havolani String sifatida chiqaradi. Chunki bu havola
joriy Date ob'ekti, ob'ektning toString usuli (42–45-qatorlar) ob'ektiv ravishda ob-
ob'ektning String tasvirini saqlang. Ushbu misolda biz yil uchun qiymat deb hisoblaymiz
to'g'ri - sanoat quvvati sanasi sinfi ham yilni tasdiqlashi kerak.

1 // 8.7-rasm: Sana.java


2 // Sana sinfi deklaratsiyasi.
3
4 ommaviy sinf Sana
5 {
6 xususiy int oy; // 1-12
7 shaxsiy kun; // 1-31 oyga asoslangan
8 xususiy int yil; // har qanday yil
9
10 shaxsiy statik yakuniy int[] kunOyiga =
11 { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
12
13 // konstruktor: yil berilgan oy va kun uchun mos qiymatni tasdiqlang
14 ommaviy sana (int oy, int kun, int yil)
15 {
16 // oy oralig'ida ekanligini tekshiring
17 agar (oy <= 0 || oy > 12)
18 yangi IllegalArgumentException (
19 "oy (" + oy + ") 1-12" bo'lishi kerak);

8.7-rasm | Sana sinf deklaratsiyasi. (2-qismning 1-qismi.)


8.8 Tarkibi 333

Sinf xodimi
Sinf xodimi (8.8-rasm) ism, familiya, tug'ilgan sana va misol o'zgaruvchilariga ega.
ishga qabul qilish sanasi. FirstName va LastName a'zolari String obyektlariga havolalardir. A'zolar
birthDate va hireDate sana obyektlariga havolalardir. Bu sinfning qila olishini ko'rsatadi
misol o'zgaruvchilari sifatida boshqa sinflar ob'ektlariga havolalar mavjud. Xodimlar konstruktori
(12-19-qatorlar) ism, familiya, tug'ilgan sana va ko'rsatuvchi to'rtta parametrni oladi.
ishga qabul qilish sanasi. Parametrlar bo'yicha havola qilingan ob'ektlar "Xodim" ob'ektiga tayinlanadi
misol o'zgaruvchilari. Sinf xodimining toString usuli chaqirilganda, u Stringni qaytaradi
xodimning nomi va ikkita Date ob'ektining string tasvirlarini o'z ichiga oladi.
Ushbu satrlarning har biri Date sinfining toString usuliga yashirin chaqiruv bilan olinadi.

20
21 // oy oralig'ida kun yoki yo'qligini tekshiring


22 agar (kun <= 0 ||
23 (kun > kunlarOyiga[oy] && !(oy == 2 && kun == 29)))
24 yangi IllegalArgumentException ("kun (" + kun +
25 ") belgilangan oy va yil uchun diapazondan tashqarida");
26
27 // agar oy 2 va kun 29 bo'lsa, kabisa yilini tekshiring
28 agar (oy == 2 && kun == 29 && !(yil % 400 == 0 ||
29 (yil % 4 == 0 && yil % 100 != 0)))
30 yangi IllegalArgumentException ("kun (" + kun +
31 ") belgilangan oy va yil uchun diapazondan tashqarida");
32
33 shu.oy = oy;
34 bu.kun = kun;
35 bu.yil = yil;
36
37 System.out.printf(
38 "%s%n sanasi uchun sana ob'ekt konstruktori", bu);
39 }
40
41 // oy/kun/yil shakl satrini qaytaring
42 umumiy string toString()
43 {
44 return String.format("%d/%d/%d", oy, kun, yil);
45 }
46 } // tugash sinfi Sana

1 // 8.8-rasm: Employee.java


2 // Boshqa ob'ektlarga havolalar bilan xodimlar sinfi.
3
4 davlat toifasidagi xodim
5 {
6 xususiy String firstName;
7 shaxsiy String familiyasi;
8
9

8.8-rasm | Boshqa ob'ektlarga havolalar bilan xodimlar sinfi. (2-qismning 1-qismi.)

8.7-rasm | Sana sinf deklaratsiyasi. (2-qismning 2-qismi.)

shaxsiy Tug'ilgan sana;


shaxsiy ish sanasi;

334 8-bob Sinflar va ob'ektlar: chuqurroq qarash

Sinf xodimi testi
Class EmployeeTest (8.9-rasm) Xodimning tug'ilganligini ko'rsatish uchun ikkita Sana ob'ektini yaratadi-
kun va ishga qabul qilish sanasi. 10-qator Xodimni yaratadi va uning namunaviy variantini ishga tushiradi.
konstruktorga ikkita satrni o'tkazish orqali qodir (xodimning birinchi va oxirgisini ifodalovchi)
nomlar) va ikkita Sana ob'ekti (tug'ilgan kun va ishga qabul qilingan sanani bildiradi). 12-qator bilvosita
uning misol o'zgaruvchilari qiymatlarini ko'rsatish uchun xodimning toString usulini chaqiradi va
ob'ekt to'g'ri ishga tushirilganligini ko'rsatish.

10
11 // ism, tug'ilgan sana va ishga qabul qilingan sanani ishga tushirish uchun konstruktor


12 davlat xodimi (String firstName, string familiya, sana tug'ilgan sana,
13 Ishga qabul qilingan sana)
14 {
15 this.firstName = firstName;
16 this.lastName = familiya;
17 this.birthDate = tug'ilgan sana;
18 this.hireDate = hireDate;
19 }
20
21 // Xodimni String formatiga aylantirish
22 umumiy string toString()
23 {
24 return String.format("%s, %s yollangan: %s Tug'ilgan kun: %s",
25 familiyasi, ismi, ishga olingan sanasi, tug'ilgan sanasi);
26 }
27 } // oxirgi sinf xodimi

1 // 8.9-rasm: EmployeeTest.java


2 // Kompozitsiya namoyishi.
3
4 ommaviy sinf Xodimlar testi
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 Tug'ilgan sana = yangi Sana(7, 24, 1949);
9 Ishga qabul qilingan sana = yangi Sana(3, 12, 1988);
10 Xodim xodimi = yangi xodim("Bob", "Ko'k", tug'ilgan, yollangan);
11
12
13 }
14 } // yakuniy sinf EmployeeTest

7/24/1949 sana uchun sana ob'ekt konstruktori


3/12/1988 sana uchun sana ob'ekt konstruktori
Blue, Bob yollangan: 12.03.1988 Tug'ilgan kuni: 24.07.1949

8.9-rasm | Kompozitsiyani namoyish qilish.

8.8-rasm | Boshqa ob'ektlarga havolalar bilan xodimlar sinfi. (2-qismning 2-qismi.)

System.out.println(xodim);


8.9 raqam 335 turlari

8.9 raqam turlari
6.8-rasmda biz ko'rsatilgan doimiylar to'plamini belgilaydigan asosiy enum turini kiritdik.
noyob identifikatorlar sifatida. Ushbu dasturda enum konstantalari o'yin holatini ifodalaydi. In
bu bo'limda enum turlari va sinflar o'rtasidagi munosabatlar muhokama qilinadi. Sinflar kabi, hammasi
enum turlari mos yozuvlar turlaridir. Enum turi enum deklaratsiyasi bilan e'lon qilinadi, ya'ni
raqam konstantalarining vergul bilan ajratilgan ro'yxati - deklaratsiya ixtiyoriy ravishda boshqasini ham o'z ichiga olishi mumkin
konstruktorlar, maydonlar va usullar kabi an'anaviy sinflarning komponentlari (ko'rib turganingizdek
bir lahzada). Har bir enum deklaratsiyasi quyidagi cheklovlar bilan enum sinfini e'lon qiladi:
1. enum konstantalari bevosita yakuniy hisoblanadi.
2. enum konstantalari bevosita statikdir.
3. Enum tipidagi ob'ektni yangi operator bilan yaratishga urinish a
kompilyatsiya xatosi.
Enum konstantalari konstantalar ishlatilishi mumkin bo'lgan har qanday joyda, masalan, ish belgilarida ishlatilishi mumkin
switch bayonotlari va bayonotlar uchun kengaytirilgan boshqarish.
Enum tipidagi misol o'zgaruvchilari, konstruktor va usullarni e'lon qilish
8.10-rasmda misol o'zgaruvchilari, konstruktor va enum tipidagi usullar ko'rsatilgan.
Enum deklaratsiyasi (5-37-qatorlar) ikkita qismdan iborat - enum konstantalari va ikkinchisi
enum tipidagi a'zolar. Birinchi qism (8-13-qatorlar) oltita konstantani e'lon qiladi. Har biri op-
enum konstruktoriga uzatiladigan argumentlardan keyin (20–24-qatorlar). Kabi
Siz sinflarda ko'rgan konstruktorlar, enum konstruktori istalgan sonni belgilashi mumkin.
rameters va ortiqcha yuklanishi mumkin. Ushbu misolda enum konstruktori ikkita Stringni talab qiladi
parametrlari. Har bir enum konstantasini to'g'ri ishga tushirish uchun biz uni qavslar bilan bajaramiz.
ikkita String argumentini olish. Ikkinchi qism (16-36-qatorlar) boshqa a'zolarni e'lon qiladi
enum turi - ikkita misol o'zgaruvchisi (16-17-qatorlar), konstruktor (20-24-qatorlar) va
ikkita usul (27-30 va 33-36 qatorlar).
16–17 qatorlar misol oʻzgaruvchilari sarlavhasi va mualliflik huquqiYearni eʼlon qiladi. Har bir raqam kon-
stant in enum type Book aslida o'z nusxasiga ega bo'lgan enum tipidagi Book ob'ektidir
misol o'zgaruvchilari sarlavhasi va mualliflik huquqiYear. Konstruktor (20-24-qatorlar) ikkitasini oladi
Satr parametrlari, biri kitob nomini, ikkinchisi esa mualliflik huquqini belgilaydi
yil. 22-23 qatorlar ushbu parametrlarni misol o'zgaruvchilariga belgilaydi. 27-36 qatorlar e'lon qiladi
mos ravishda kitob nomi va mualliflik huquqi yilini qaytaradigan usullar.

1 // 8.10-rasm: Book.java


2 // Enum turini konstruktor va aniq misol maydonlari bilan e'lon qilish
3 // va ushbu maydonlar uchun qo'shimchalar
4
5 davlat enum kitobi
6 {
7
8
9
10

8.10-rasm | Enum turini konstruktor va aniq misol maydonlari va qo'shimcha qurilmalar bilan e'lon qilish


bu maydonlar uchun. (2-qismning 1-qismi.)

// enum tipidagi konstantalarni e'lon qilish


JHTP("Java qanday dasturlash", "2015"),
CHTP ("C qanday dasturlash kerak", "2013"),
IW3HTP("Internet va World Wide Web qanday dasturlash kerak", "2012"),

336 8-bob Sinflar va ob'ektlar: chuqurroq qarash

Book enum turidan foydalanish
8.11-rasm kitobning enum turini sinovdan o'tkazadi va bir qator enum orqali qanday takrorlashni ko'rsatadi.
konstantalar. Har bir enum uchun kompilyator statik usul qiymatlarini yaratadi (chaqiriladi
12-satr) e'lon qilingan tartibda enum konstantalari qatorini qaytaradi. Chiziqlar
12–14 raqamlarda e'lon qilingan barcha konstantalarni ko'rsatish uchun kengaytirilgan for bayonotidan foydalaning
Kitob. 14-qator olish uchun enum Bookning getTitle va getCopyrightYear usullarini chaqiradi.
doimiy bilan bog'langan nom va mualliflik huquqi yili. Enum konstantasi o'zgarmas bo'lganda
String (masalan, 13-qatordagi kitob) ga aylantirilganda, doimiy identifikator String sifatida ishlatiladi
vakillik (masalan, birinchi raqam konstantasi uchun JHTP).

11
12


13
14
15 // misol maydonlari
16 shaxsiy final String sarlavhasi; // kitob nomi
17 xususiy final String copyrightYear; // mualliflik huquqi yili
18
19 // enum konstruktori
20 kitob (String nomi, string copyrightYear)
21 {
22 this.title = title;
23 this.copyrightYear = copyrightYear;
24 }
25
26 // maydon sarlavhasi uchun yordamchi
27 ommaviy string getTitle()
28 {
29 qaytariladigan sarlavha;
30 }
31
32 // mualliflik huquqiYear maydoni uchun aksessuar
33 ommaviy string getCopyrightYear()
34 {
35 mualliflik huquqini qaytarish yili;
36 }
37 } // end enum Book

1 // 8.11-rasm: EnumTest.java


2 // Enum turini sinab ko'rish kitobi.
3 import java.util.EnumSet;
4
5 ommaviy sinf EnumTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {

8.11-rasm | Test enum turi kitob. (2-qismning 1-qismi.)

8.10-rasm | Enum turini konstruktor va aniq misol maydonlari va qo'shimcha qurilmalar bilan e'lon qilish
bu maydonlar uchun. (2-qismning 2-qismi.)

CPPHTP("C++ qanday dasturlash kerak", "2014"),


VBHTP("Visual Basic dasturlash usuli", "2014"),
CSHARPHTP("Visual C# qanday dasturlash kerak", "2014");

8.10 Axlat yig'ish 337

19–21-qatorlar EnumSet sinfining statik usul diapazonidan foydalanadi (paketda e'lon qilingan)
java.util) enum Book konstantalarining qatorini ko'rsatish uchun. Usul diapazoni ikkitadan oladi
parametrlar - diapazondagi birinchi va oxirgi raqam konstantalari - va EnumSet ni qaytaradi
bu ikki konstanta orasidagi barcha konstantalarni o'z ichiga oladi, shu jumladan. Masalan,
ifodasi EnumSet.range(Book.JHTP, Book.CPPHTP) o'z ichiga olgan EnumSetni qaytaradi.
Book.JHTP, Book.CHTP, Book.IW3HTP va Book.CPPHTP. Kengaytirilgan bayonot mumkin
massiv bilan bo'lgani kabi EnumSet bilan ham foydalanish mumkin, shuning uchun 12-14 qatorlar undan ko'rsatish uchun foydalanadi.
EnumSet-dagi har bir kitobning nomi va mualliflik huquqi yili. Class EnumSet bir nechta boshqa narsalarni taqdim etadi
bir xil turdagi enum konstantalari to'plamini yaratish uchun statik usullar.

8.10 Axlat yig'ish


Har bir ob'ekt xotira kabi tizim resurslaridan foydalanadi. Bizga berishning intizomli usuli kerak
resurslar kerak bo'lmaganda tizimga qaytariladi; aks holda, "resurs sizib chiqadi"
Resurslarni dasturingiz tomonidan qayta ishlatilishiga to'sqinlik qiladigan yoki ehtimol

9 System.out.println("Barcha kitoblar:");


10
11 // barcha kitoblarni enum Book-da chop eting
( ) uchun 12
13 System.out.printf("%-10s%-45s%s%n", kitob,
14 , );
15
16 System.out.printf("%nBir qator konstantalarni ko'rsatish:%n");
17
18 // birinchi to'rtta kitobni chop etish
19 uchun (Kitob kitobi :)
20 System.out.printf("%-10s%-45s%s%n", kitob,
21 , );
22 }
23 } // end sinfi EnumTest

Barcha kitoblar:


JHTP Java qanday dasturlash 2015
CHTP C qanday dasturlash 2013
IW3HTP Internet va World Wide Web 2012 qanday dasturlash kerak
CPPHTP C++ 2014 qanday dasturlash kerak
VBHTP Visual Basic dasturi 2014
CSHARPHTP Visual C# qanday dasturlash 2014

Bir qator konstantalarni ko'rsatish:


JHTP Java qanday dasturlash 2015
CHTP C qanday dasturlash 2013
IW3HTP Internet va World Wide Web 2012 qanday dasturlash kerak
CPPHTP C++ 2014 qanday dasturlash kerak

Umumiy dasturlash xatosi 8.4


Enum deklaratsiyasida enum turidan keyin enum konstantalarini e'lon qilish sintaktik xatodir.
konstruktorlar, sohalar va usullar.

8.11-rasm | Test enum turi kitob. (2-qismning 2-qismi.)

Kitob kitobi: Book.values()

book.getTitle() book.getCopyrightYear()

EnumSet.range(Book.JHTP, Book.CPPHTP)

book.getTitle() book.getCopyrightYear()


338 8-bob Sinflar va ob'ektlar: chuqurroq qarash

boshqa dasturlar orqali. JVM xotirani qayta tiklash uchun axlatni avtomatik yig'ishni amalga oshiradi.
endi foydalanilmayotgan ob'ektlar egallagan. Qachon hech qanday havolalar bir
ob'ekt, ob'ekt to'planishi mumkin. Yig'ish odatda JVM sobiq
o'zining axlat yig'uvchisini ishga tushiradi, bu bir muncha vaqt yoki hatto pro-fayldan oldin sodir bo'lmasligi mumkin.
gramm tugaydi. Shunday qilib, C va C++ kabi boshqa tillarda keng tarqalgan xotira oqishlari
(chunki xotira bu tillarda avtomatik ravishda tiklanmaydi) Java-da kamroq,
lekin ba'zilari hali ham nozik yo'llar bilan sodir bo'lishi mumkin. Xotiraning oqishidan tashqari resurs oqishlari ham mumkin
yuzaga keladi. Misol uchun, dastur diskdagi faylni uning mazmunini o'zgartirish uchun ochishi mumkin - agar ilova qilsa
faylni yopmang, boshqa ilovalar fayldan foydalanishidan oldin u tugatilishi kerak.
Sinf ob'ektini yakunlash usuli haqida eslatma
Java tilidagi har bir sinfda Object (java.lang paketi) klassining usullari mavjud bo'lib, ulardan biri
yakuniy usul. (Siz 9-bobda ob'ekt sinfi haqida ko'proq bilib olasiz.) Siz hech qachon
foydalanish usulini yakunlash, chunki u ko'p muammolarni keltirib chiqarishi mumkin va noaniqlik mavjud
dastur tugashidan oldin u chaqiriladimi yoki yo'qmi.
Yakuniy yakunlashning asl maqsadi axlat yig'uvchiga muddatni bajarishga ruxsat berish edi.
ob'ekt xotirasini tiklashdan oldin ob'ektda milliy uy ishlari. Endi, shunday
Diskdagi fayllar kabi tizim resurslaridan foydalanadigan har qanday sinf uchun eng yaxshi amaliyot hisoblanadi.
dasturchilar resurslar yo'q bo'lganda ularni chiqarish uchun qo'ng'iroq qilishlari mumkin bo'lgan usulni taqdim etish
dasturda zarur. AutoClosable ob'ektlari qachon resurs oqib chiqish ehtimolini kamaytiradi
siz ularni manbalarni sinab ko'rish bayonoti bilan ishlatasiz. Nomidan ko'rinib turibdiki, AutoClos-
"Resurslarni sinab ko'rish" iborasi foydalanishni tugatgandan so'ng, qobiliyatli ob'ekt avtomatik ravishda yopiladi
ob'ekt. Buni 11.12-bo'limda batafsilroq muhokama qilamiz.

8.11 Statik sinf a'zolari


Har bir ob'ekt sinfning barcha misol o'zgaruvchilarining o'z nusxasiga ega. Ba'zi hollarda, faqat
ma'lum bir o'zgaruvchining bitta nusxasi sinfning barcha ob'ektlari tomonidan taqsimlanishi kerak. Statik maydon -
sinf o'zgaruvchisi deb ataladi - bunday hollarda ishlatiladi. Statik o'zgaruvchi butun sinf ma'lumotlarini ifodalaydi.
mation - sinfning barcha ob'ektlari bir xil ma'lumotlarni taqsimlaydi. Statik deklaratsiya
o'zgaruvchi static kalit so'zi bilan boshlanadi.
Rag'batlantiruvchi statik
Keling, statik ma'lumotlarni misol bilan rag'batlantiraylik. Aytaylik, bizda Mar bilan video o'yin bor -
tianlar va boshqa kosmik mavjudotlar. Har bir marslik jasur va boshqalarga hujum qilishga tayyor
Marslik kamida to'rtta boshqa marslik borligini bilsa, kosmik mavjudotlar. Agar
beshdan kam marslik bor, ularning har biri qo'rqoq bo'lib qoladi. Shunday qilib, har bir marslik
mars hisobini bilish kerak. Biz marslik sinfini martianCount sifatida berishimiz mumkin
misol o'zgaruvchisi. Agar biz buni qilsak, har bir marslik alohida nusxaga ega bo'ladi.
pozitsiya o'zgaruvchisi va har safar yangi marslik yaratganimizda, biz misolni yangilashimiz kerak bo'ladi
o'zgaruvchan martianCount har bir Mars ob'ektida. Bu ortiqcha politsiya bilan bo'sh joyni yo'qotadi.
Bu alohida nusxalarni yangilash uchun vaqtni behuda sarflaydi va xatoga yo'l qo'yadi. Buning o'rniga, biz mar-

Dasturiy ta'minot muhandisligi kuzatuvi 8.8


Ko'pgina Java API sinflari (masalan, Skaner sinfi va fayllarni o'qiydigan yoki fayllarni yozadigan sinflar
disk) dasturchilar resurslarni chiqarish uchun qo'ng'iroq qilishlari mumkin bo'lgan yopish yoki yo'q qilish usullarini taqdim eting
ular endi dasturda kerak bo'lmaganda.

8.11 Statik sinf a'zolari 339

tianCount statik boʻlib, martianCount klassi boʻyicha maʼlumot beradi. Har bir marslik buni ko'ra oladi
martianCount, go'yo u Mars sinfining o'zgaruvchisi, lekin faqat bitta nusxasi
statik martianCount saqlanadi. Bu joyni tejaydi. Biz Mar-
tian konstruktori statik martianCountni oshiradi - faqat bitta nusxa bor, shuning uchun biz qilamiz
har bir mars ob'ekti uchun alohida nusxalarni oshirish shart emas.

Sinf doirasi


Statik o'zgaruvchilar sinf doirasiga ega - ular sinfning barcha usullarida ishlatilishi mumkin. Biz qila olamiz -
sinfning har qanday ob'ektiga havola orqali yoki tomonidan sinfning umumiy statik a'zolarini o'chirish
Math.random() da bo'lgani kabi a'zo nomini sinf nomi va nuqta (.) bilan kvalifikatsiya qilish. A
sinfning shaxsiy statik sinf a'zolariga mijoz kodi orqali faqat usullar orqali kirish mumkin
sinfdan. Darhaqiqat, statik sinf a'zolari sinfning hech qanday ob'ekti mavjud bo'lmaganda ham mavjud -
ular sinf bajarilish vaqtida xotiraga yuklanishi bilanoq mavjud bo'ladi. Kirish uchun a
umumiy statik a'zo, agar sinf ob'ektlari mavjud bo'lmasa (va ular mavjud bo'lsa ham), prefiks
sinf nomi va statik a'zoga nuqta (.), Math.PI da bo'lgani kabi. Shaxsiy kirish uchun
statik a'zo, agar sinfning hech qanday ob'ekti mavjud bo'lmasa, umumiy statik usulni taqdim eting va
uning nomini sinf nomi va nuqta bilan sifatlash orqali chaqiring.

statik usullar misol o'zgaruvchilari va misol usullariga to'g'ridan-to'g'ri kira olmaydi


Statik usul sinfning misol o'zgaruvchilari va misol usullariga kira olmaydi, chunki
statik usulni sinfning hech bir ob'ekti yaratilmagan bo'lsa ham chaqirish mumkin.
Xuddi shu sababga ko'ra, ushbu havolani statik usulda ishlatib bo'lmaydi. Bu ref-
erence sinfning ma'lum bir ob'ektiga murojaat qilishi kerak va statik usul chaqirilganda, u erda
xotirada o'z sinfining ob'ektlari bo'lmasligi mumkin.

Yaratilgan xodimlar ob'ektlari sonini kuzatish


Bizning keyingi dasturimiz ikkita sinfni e'lon qiladi - Employee (8.12-rasm) va EmployeeTest
(8.13-rasm). Class Employee xususiy statik o'zgaruvchilar sonini e'lon qiladi (8.12-rasm, 7-qator) va
umumiy statik usul getCount (36–39-qatorlar). Statik o'zgaruvchilar soni a ni saqlaydi
Xodimlar sinfining hozirgacha yaratilgan ob'ektlari sonini hisoblash. Bu sinf

Dasturiy ta'minot muhandisligi kuzatuvi 8.9


Agar sinfning barcha ob'ektlari o'zgaruvchining bir xil nusxasini ishlatishi kerak bo'lsa, statik o'zgaruvchidan foydalaning.

Dasturiy ta'minot muhandisligi kuzatuvi 8.10


Statik sinf o'zgaruvchilari va usullari mavjud va ulardan foydalanish mumkin, hatto ushbu sinf ob'ektlari bo'lmasa ham
joriy qilingan.

Umumiy dasturlash xatosi 8.5


Agar statik usul bir xil sinfdagi misol usulini chaqirsa, kompilyatsiya xatosi yuzaga keladi
faqat usul nomidan foydalangan holda. Xuddi shunday, agar statik usul bo'lsa, kompilyatsiya xatosi paydo bo'ladi
faqat o'zgaruvchi nomidan foydalanib, bir xil sinfdagi misol o'zgaruvchisiga kirishga harakat qiladi.

Umumiy dasturlash xatosi 8.6


Bunga statik usulda murojaat qilish kompilyatsiya xatosidir.

340 8-bob Sinflar va ob'ektlar: chuqurroq qarash

o'zgaruvchi 7-qatorda nolga inisializatsiya qilinadi. Agar statik o'zgaruvchi ishga tushirilmagan bo'lsa, kompilyator
unga standart qiymatni belgilaydi - bu holda 0, int turi uchun standart qiymat.

Xodimlar ob'ektlari mavjud bo'lganda, o'zgaruvchini hisoblash har qanday usulda ishlatilishi mumkin


Xodimlar ob'ekti - bu misol konstruktorda o'sishlar hisoblanadi (18-qator). Jamoatchilik
getCount statik usuli (36-39-qatorlar) mavjud bo'lgan Xodimlar ob'ektlari sonini qaytaradi.
hozirgacha yaratilgan. Agar Employee sinfining ob'ektlari mavjud bo'lmasa, mijoz kodi o'zgaruvchiga kira oladi
Employee.getCount() da bo'lgani kabi sinf nomi orqali getCount usulini chaqirish orqali hisoblash. Qachon
ob'ektlar mavjud bo'lsa, getCount usuli Employee ob'ektiga har qanday havola orqali ham chaqirilishi mumkin.

1 // 8.12-rasm: Employee.java


2 // sonini hisoblash uchun foydalaniladigan statik o'zgaruvchi
3 // Xotiradagi xodimlar ob'ektlari.
4
5 davlat toifasidagi xodim
6 {
7
8 xususiy String firstName;
9 shaxsiy String familiyasi;
10
11 // Xodimni ishga tushiring, statik hisobga 1 qo'shing va
12 // konstruktor chaqirilganligini bildiruvchi chiqish satri
13 ta davlat xodimi (String firstName, String familiyasi)
14 {
15 this.firstName = firstName;
16 this.lastName = familiya;
17
18
19 System.out.printf("Xodimlar konstruktori: %s %s; count = %d%n",
20 ismi, familiyasi, soni);
21 }
22
23 // ismni oling
24 ommaviy string getFirstName()
25 {
26 nomini qaytarish;
27 }
28
29 // familiyani oling
30 ommaviy string getLastName()
31 {
32 familiyasini qaytarish;
33 }
34
35
36
37
38
39
40 } // oxirgi sinf xodimi

8.12-rasm | statik o'zgaruvchi, xodimlarning ob'ektlari sonini hisoblash uchun ishlatiladi


xotira.

xususiy statik int soni = 0; // yaratilgan xodimlar soni

++hisoblash; // xodimlarning statik sonini oshirish

// statik hisoblash qiymatini olish uchun statik usul


umumiy statik int getCount()
{
qaytish soni;
}

8.11 Statik sinf a'zolari 341

Sinf xodimi testi
EmployeeTest usuli asosiy (8.13-rasm) ikkita Employee ob'ektini (13-14-qatorlar) misol qiladi.
Har bir Employee ob'ektining konstruktori chaqirilganda, 8.12-rasmning 15-16 qatorlari
Ishchining ismi va familiyasi o'zgaruvchilarning misoli firstName va LastName. Bular
ikkita bayonot asl String argumentlarining nusxalarini yaratmaydi. Aslida, String ob-
Java'dagi ob'ektlar o'zgarmasdir - ularni yaratilgandan keyin o'zgartirib bo'lmaydi. Shuning uchun, u
bitta String ob'ektiga ko'p havolalarga ega bo'lish xavfsiz. Odatda ob'ektlar uchun bunday bo'lmaydi
Java-dagi boshqa ko'plab sinflar. Agar String ob'ektlari o'zgarmas bo'lsa, nima uchun deb hayron bo'lishingiz mumkin
String obyektlarini birlashtirish uchun + va += operatorlaridan foydalanishimiz mumkin. Satrni birlashtirish
aslida birlashtirilgan qiymatlarni o'z ichiga olgan yangi String ob'ektiga olib keladi. Asl
String ob'ektlari o'zgartirilmaydi.

Yaxshi dasturlash amaliyoti 8.1


Buni ta'kidlash uchun sinf nomi va nuqta (.) yordamida har bir statik usulni chaqiring
chaqirilayotgan usul statik usuldir.

1 // 8.13-rasm: EmployeeTest.java


2 // statik a'zolar namoyishi.
3
4 ommaviy sinf Xodimlar testi
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // Xodimlarni yaratishdan oldin hisobning 0 ekanligini ko'rsating
9 System.out.printf("Tashkil etishdan oldingi xodimlar: %d%n",
10);
11
12 // ikkita xodim yaratish; soni 2 bo'lishi kerak
13
14
15
16 // ikkita Xodimni yaratgandan so'ng, son 2 ekanligini ko'rsating
17 System.out.printf("%nO'rnatishdan keyingi xodimlar:%n");
18 System.out.printf("e1.getCount( orqali): %d%n", );
19 System.out.printf("e2.getCount( orqali): %d%n", );
20 System.out.printf("Employee.getCount( orqali): %d%n",
21);
22
23 // Xodimlarning ismlarini oling
24 System.out.printf("%nEmployee 1: %s %s%nEmployee 2: %s %s%n",
25 e1.getFirstName(), e1.getLastName(),
26 e2.getFirstName(), e2.getLastName());
27 }
28 } // oxirgi sinf EmployeeTest

Ishga kirishishdan oldingi xodimlar: 0


Xodimlar konstruktori: Syuzan Beyker; hisoblash = 1
Xodimlar konstruktori: Bob Blue; hisoblash = 2

8.13-rasm | statik a'zolar namoyishi. (2-qismning 1-qismi.)

Employee.getCount()

Xodim e1 = yangi xodim("Syuzan", "Beyker");


Xodim e2 = yangi xodim ("Bob", "Ko'k");

e1.getCount()


e2.getCount()

Employee.getCount()


342 8-bob Sinflar va ob'ektlar: chuqurroq qarash

Asosiy tugagach, mahalliy o'zgaruvchilar e1 va e2 o'chiriladi - mahalliy ekanligini unutmang
o'zgaruvchi faqat u e'lon qilingan blok bajarilishini tugatmaguncha mavjud bo'ladi. Chunki e1
va e2 13-14-qatorlarda yaratilgan Xodimlar ob'ektlariga yagona havolalar edi (8.13-rasm),
bu ob'ektlar "axlat yig'ish uchun yaroqli" bo'lib, asosiy tugatadi.
Odatdagi ilovada axlat yig'uvchi har qanday dastur uchun xotirani qayta tiklashi mumkin
yig'ish uchun mos bo'lgan ob'ektlar. Agar biron bir ob'ekt dasturdan oldin qayta tiklanmasa
tugatsa, operatsion tizim dastur tomonidan ishlatiladigan xotirani qaytarib oladi. JVM
axlat yig'uvchining qachon va hattoki bajarilishiga kafolat bermaydi. Qachon
bo'lsa, hech qanday ob'ekt yoki faqat mos ob'ektlarning bir qismi yig'ilmasligi mumkin.
8.12 Statik import
6.3-bo'limda siz matematika sinfining statik maydonlari va usullari haqida bilib oldingiz. Biz kiramiz
class Math-ning statik maydonlari va usullarini har birining oldiga Math va a sinf nomini qo'yib yozing
nuqta (.). Statik import deklaratsiyasi sinfning statik a'zolarini import qilish imkonini beradi
yoki interfeys orqali ularga sinfingizdagi nomaqbul nomlari orqali kirishingiz mumkin, ya'ni
import qilingan statik a'zodan foydalanganda sinf nomi va nuqta (.) shart emas.
Statik import shakllari
Statik import deklaratsiyasi ikkita shaklga ega - biri ma'lum bir statik xotirani import qiladi.
ber (yagona statik import sifatida tanilgan) va barcha statik a'zolarni import qiluvchi
sinf (talab bo'yicha statik import sifatida tanilgan). Quyidagi sintaksis ma'lum bir narsani import qiladi
statik a'zo:

bu yerda packageName - bu sinf paketi (masalan, java.lang), ClassName - nomi


sinf (masalan, Matematik) va staticMemberName statik maydon yoki usulning nomidir
(masalan, PI yoki abs). Quyidagi sintaksis sinfning barcha statik a'zolarini import qiladi:

Yulduzcha (*) belgilangan sinfning barcha statik a'zolari mavjud bo'lishi kerakligini bildiradi


faylda foydalanish uchun. statik import deklaratsiyasi faqat statik sinf a'zolarini import qiladi. Muntazam
import bayonotlari dasturda ishlatiladigan sinflarni belgilash uchun ishlatilishi kerak.
Statik importni namoyish qilish
8.14-rasmda statik import ko'rsatilgan. 3-qator statik import deklaratsiyasi bo'lib, u
java.lang paketidan Math sinfining barcha statik maydonlari va usullarini import qiladi. 9–12 qatorlar
Matematik sinfining E (11-qator) va PI (12-qator) statik maydonlariga va statik usullarga kirish

Ishga kirishishdan keyin xodimlar:


e1.getCount( orqali): 2
e2.getCount( orqali): 2
Employee.getCount() orqali: 2

1-xodim: Syuzan Beyker


2-xodim: Bob Blue

import statik packageName.ClassName.staticMemberName;

import statik packageName.ClassName.*;

8.13-rasm | statik a'zolar namoyishi. (2-qismning 2-qismi.)


8.13 Yakuniy misol o'zgaruvchilari 343

sqrt (9-qator) va peel (10-qator) maydon nomlari yoki usul nomlari oldidan kiritilmagan.
sinf nomi Matematika va nuqta.

8.13 Yakuniy misol o'zgaruvchilari


Eng kam imtiyoz printsipi yaxshi dasturiy ta'minot muhandisligi uchun asosdir. kon-
ilova kodining matnida kod faqat imtiyoz miqdori berilishi kerakligini bildiradi
va belgilangan vazifani bajarishi kerak bo'lgan kirish huquqi, lekin bundan ortiq emas. Bu sizniki qiladi
kodni tasodifiy (yoki zararli) o'zgartirishning oldini olish orqali dasturlar yanada mustahkamlanadi
o'zgaruvchan qiymatlar va kirish mumkin bo'lmagan qo'ng'iroq usullari.
Keling, ushbu printsip misol o'zgaruvchilari uchun qanday qo'llanilishini ko'rib chiqaylik. Ulardan ba'zilari bo'lishi kerak
o'zgartirish mumkin, ba'zilari esa yo'q. O'zgaruvchi ekanligini aniqlash uchun final kalit so'zidan foydalanishingiz mumkin
o'zgartirish mumkin emas (ya'ni, bu doimiy) va uni o'zgartirishga urinish xatodir. Uchun
misol,

int tipidagi INCREMENT yakuniy (doimiy) misol o'zgaruvchisini e'lon qiladi. Bunday o'zgaruvchilar bo'lishi mumkin


e'lon qilinganda ishga tushiriladi. Agar ular bo'lmasa, ular har bir konstruktsiyada ishga tushirilishi kerak -
sinf tor. Konstruktorlarda konstantalarni ishga tushirish sinfning har bir ob'ektiga ega bo'lish imkonini beradi
doimiy uchun boshqa qiymat. Agar yakuniy o'zgaruvchi o'z deklaratsiyasida ishga tushirilmagan bo'lsa yoki
har bir konstruktorda kompilyatsiya xatosi yuzaga keladi.

Umumiy dasturlash xatosi 8.7


Agar dastur ikki yoki undan ortiq sinflarning statiklarini import qilishga urinsa, kompilyatsiya xatosi yuzaga keladi
bir xil imzoga ega usullar yoki bir xil nomga ega statik maydonlar.

1 // 8.14-rasm: StaticImportTest.java


2 // Matematik sinf usullarining statik importi.
3
4
5 umumiy sinf StaticImportTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 System.out.printf("sqrt(900.0) = %.1f%n", );
10 System.out.printf("cheil(-9.8) = %.1f%n", );
11 System.out.printf("E = %f%n", E);
12 System.out.printf("PI = %f%n", PI);
13 }
14 } // oxirgi sinf StaticImportTest
sqrt(900,0) = 30,0
shift (-9,8) = -9,0
E = 2,718282
PI = 3,141593
8.14-rasm | Matematik sinf usullarining statik importi.

private final int INCREMENT;

import statik java.lang.Math.*;

sqrt(900,0)


yuqori (-9,8)

344 8-bob Sinflar va ob'ektlar: chuqurroq qarash

8.14 Paketga kirish
Agar kirish modifikatori bo'lmasa (ommaviy, himoyalangan yoki shaxsiy - biz himoyalangan holda muhokama qilamiz
9-bob) metod yoki o'zgaruvchi uchun, u sinfda, usulda e'lon qilinganida ko'rsatilgan
yoki o'zgaruvchi paketga kirish huquqiga ega deb hisoblanadi. Bitta sinfdan iborat dasturda
deklaratsiya, bu o'ziga xos ta'sir ko'rsatmaydi. Biroq, agar dastur bir nechta sinflardan foydalansa
bir xil paket (ya'ni, tegishli sinflar guruhi), bu sinflar bir-birining paketiga kirishlari mumkin -
a'zolarga to'g'ridan-to'g'ri tegishli sinflar ob'ektlariga havolalar orqali yoki
sinf nomi orqali statik a'zolarning holati. Paketga kirish juda kam qo'llaniladi.
8.15-rasmda paketga kirish ko'rsatilgan. Ilova bitta manbada ikkita sinfni o'z ichiga oladi -
kod fayli - asosiy (5–21-qatorlar) va PackageData-ni o'z ichiga olgan PackageDataTest klassi
sinf (24-41-qatorlar). Xuddi shu manba faylidagi sinflar bir xil paketning bir qismidir. Konse-
Ko'pincha PackageDataTest sinfiga Package-ning paketga kirish ma'lumotlarini o'zgartirishga ruxsat beriladi.
Ma'lumotlar ob'ektlari. Ushbu dasturni kompilyatsiya qilganingizda, kompilyator ikkita alohida .class ishlab chiqaradi
fayllar - PackageDataTest.class va PackageData.class. Kompilyator ikkalasini joylashtiradi
bir xil katalogdagi .class fayllari. Shuningdek, PackageData sinfini (24–41-qatorlar) joylashtirishingiz mumkin
alohida manba kodi fayli.
PackageData sinf deklaratsiyasida 26-27 qatorlar misol o'zgaruvchilarini e'lon qiladi
kirish modifikatorlari bo'lmagan raqam va string - shuning uchun bular paketga kirish misolidir
o'zgaruvchilar. Class PackageDataTestning asosiy usuli PackageData nusxasini yaratadi
PackageData misol o'zgaruvchilarini o'zgartirish qobiliyatini namoyish qilish uchun sinf (9-qator)
to'g'ridan-to'g'ri (15-16-qatorlarda ko'rsatilganidek). O'zgartirish natijalarini ko'rish mumkin
chiqish oynasi.

Dasturiy ta'minot muhandisligi kuzatuvi 8.11


Namuna o'zgaruvchisini yakuniy deb e'lon qilish eng kam imtiyoz tamoyilini amalga oshirishga yordam beradi. Agar a
misol o'zgaruvchisi o'zgartirilmasligi kerak, o'zgartirishning oldini olish uchun uni yakuniy deb e'lon qiling.
Masalan, 8.8-rasmda misol o'zgaruvchilari firstName, LastName, birthDate va
hireDate ishga tushirilgandan keyin hech qachon o'zgartirilmaydi, shuning uchun ular yakuniy deb e'lon qilinishi kerak.
Kelgusida barcha dasturlarda bu amaliyotni qo‘llaymiz. ning qo'shimcha afzalliklarini ko'rasiz
23-bobdagi yakuniy, Parametrlilik.

Umumiy dasturlash xatosi 8.8


Yakuniy misol o'zgaruvchisini ishga tushirgandan so'ng o'zgartirishga urinish kompilyatsiya xatosidir.

Xatolarning oldini olish bo'yicha maslahat 8.5


Yakuniy misol o'zgaruvchisini o'zgartirishga urinishlar emas, balki kompilyatsiya vaqtida ushlanadi
bajarilish vaqtidagi xatolarga olib keladi. Kompilyatsiya vaqtida xatolarni yo'q qilish har doim afzaldir,
iloji bo'lsa, ularni bajarish vaqtiga o'tishga ruxsat berishdan ko'ra (tajriba mavjud bo'lganda
ta'mirlash ko'pincha bir necha baravar qimmat ekanligini aniqladi).

Dasturiy ta'minot muhandisligi kuzatuvi 8.12


Yakuniy maydon, agar u o'z deklaratsiyasida qiymat sifatida ishga tushirilgan bo'lsa, statik deb e'lon qilinishi kerak.
bu sinfning barcha ob'ektlari uchun bir xil. Ushbu ishga tushirilgandan so'ng, uning qiymati hech qachon mumkin emas
o'zgartirish. Shuning uchun biz sinfning har bir ob'ekti uchun maydonning alohida nusxasiga muhtoj emasmiz.
Maydonni statik qilish sinfning barcha ob'ektlariga yakuniy maydonni almashish imkonini beradi.

8.15 Aniq pul hisob-kitoblari uchun BigDecimal dan foydalanish 345

8.15 Aniq pul hisoblari uchun BigDecimaldan foydalanish
Avvalgi boblarda biz double turidagi qiymatlardan foydalangan holda pul hisob-kitoblarini ko'rsatdik. In
5-bobda biz ba'zi bir juft qiymatlar taxminan ifodalanganligini muhokama qildik.

1 // 8.15-rasm: PackageDataTest.java


2 // Sinfning paketga kirish a'zolariga boshqa sinflar kirishlari mumkin
3 // bir xil paketda.
4
5 ommaviy sinf PackageDataTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11 // chiqish packageData ning string ko'rinishi
12 System.out.printf("Instantiatsiyadan keyin:%n%s%n", packageData);
13
14
15
16
17
18 // chiqish.packageData ning string tasviri
19 System.out.printf("%nQiymatlarni o'zgartirgandan keyin:%n%s%n", packageData);
20 }
21 } // oxirgi sinf PackageDataTest
22
23 // paketga kirish namunasi o'zgaruvchilari bilan sinf
24-sinf PackageData
25 {
26
27
28
29 // konstruktor
30 ta umumiy PackageData()
31 {
32 raqami = 0;
33 string = "Salom";
34 }
35
36 // PackageData obyekti String tasvirini qaytarish
37 ommaviy string toString()
38 {
39 return String.format("raqam: %d; string: %s", raqam, satr);
40 }
41 } // oxirgi sinf PackageData

Taqdim etilgandan keyin:


raqam: 0; string: Salom

Qiymatlarni o'zgartirgandan so'ng:


raqam: 77; string: xayr

8.15-rasm | Sinfning paketga kirish a'zolariga bir xil paketdagi boshqa sinflar kirishlari mumkin.

PackageData packageData = new PackageData();

// packageData obyektidagi paketga kirish ma'lumotlarini o'zgartirish


packageData.number = 77;
packageData.string = "Xayr";

int raqami; // paketga kirish misoli o'zgaruvchisi


String string; // paketga kirish misoli o'zgaruvchisi

346 8-bob Sinflar va ob'ektlar: chuqurroq qarash

Aniq suzuvchi nuqta hisoblarini talab qiladigan har qanday dastur, masalan, moliyaviy
ilovalar - o'rniga BigDecimal sinfidan foydalanish kerak (java.math paketidan).
BigDecimal yordamida foizlarni hisoblash
8.16-rasmda sinf ob'ektlari yordamida 5.6-rasmdagi foizlarni hisoblash misoli takrorlangan.
Hisob-kitoblarni amalga oshirish uchun BigDecimal. Shuningdek, biz NumberFormat sinfini (paket
java.text) raqamli qiymatlarni mahalliy tilga xos satrlar sifatida formatlash uchun, masalan,
AQSh tili, qiymati 1234,56 "1,234,56" sifatida formatlanadi, ko'pgina Yevropa Ittifoqida
ropean tillari "1.234,56" sifatida formatlanadi.

1 // Interest.java


2 // BigDecimal bilan murakkab foizlarni hisoblash.
3 import java.math.BigDecimal;
4 import java.text.NumberFormat;
5
6 ommaviy sinf Qiziqish
7 {
8 ta umumiy statik bekor asosiy(String args[])
9 {
10
11
12
13
14 // sarlavhalarni ko'rsatish
15 System.out.printf("%s%20s%n", "Yil", "Depozitdagi summa");
16
17 // har o'n yil uchun depozit miqdorini hisoblang
18 uchun (int yil = 1; yil <= 10; yil++)
19 {
20
21
22
23
24 // yil va miqdorni ko'rsatish
25 System.out.printf("%4d%20s%n", yil,
26);
27 }
28 }
29 } // end sinf Qiziqish

Yil Omonatdagi summa


1 $1,050,00
2 1102,50 dollar
3 1157,62 dollar
4 1215,51 dollar
5 1276,28 dollar
6 1340,10 dollar
7 1407,10 dollar
8 1477,46 dollar
9 1551,33 dollar
10 1628,89 dollar

8.16-rasm | BigDecimal bilan murakkab foizlarni hisoblash.

// foizlardan oldingi asosiy qarz miqdori
BigDecimal asosiy = BigDecimal.valueOf(1000.0);
BigDecimal tezligi = BigDecimal.valueOf(0,05); // stavka foizi

// belgilangan yil uchun yangi miqdorni hisoblang


BigDecimal miqdori =
asosiy.ko'paytirish(stavka.qo'shish(BigDecimal.ONE).pow(yil));

NumberFormat.getCurrencyInstance().format(summa)


8.15 Aniq pul hisob-kitoblari uchun BigDecimal dan foydalanish 347

BigDecimal obyektlarini yaratish
11-12 qatorlar BigDecimal o'zgaruvchilarni asosiy va tezligini e'lon qiladi va ishga tushiradi
BigDecimal statik usuli valueOf ikki argumentni oladi va Big-ni qaytaradi
Belgilangan aniq qiymatni ifodalovchi o'nlik ob'ekt.
BigDecimal yordamida foizlarni hisoblashni amalga oshirish
21–22 qatorlar BigDecimal koʻpaytirish, qoʻshish usullaridan foydalangan holda foizlarni hisoblashni amalga oshiradi
va kuch. 22-qatordagi ifoda quyidagicha baholanadi:
1. Birinchidan, rate.add(BigDecimal.ONE) ifodasi ishlab chiqarish tezligiga 1 qo'shadi.
1,05 ni o'z ichiga olgan BigDecimal - bu 19-qatordagi 1,0 + stavkaga teng
5.6-rasm. BigDecimal doimiysi ONE 1 qiymatni ifodalaydi. BigDecimal sinfi
shuningdek, tez-tez ishlatiladigan ZERO (0) va TEN (10) konstantalarini taqdim etadi.
2. Keyinchalik, BigDecimal usuli pow 1,05 ga oshirish uchun oldingi natijaga chaqiriladi.
quvvat yili - bu 1,0 + stavka va yildan usulga o'tishga teng
5.6-rasmning 19-qatoridagi Math.pow.
3. Va nihoyat, BigDecimal usulini asosiy ob'ektga ko'paytirish, o'tish deb ataymiz
argument sifatida oldingi natija. Bu ni ifodalovchi BigDecimalni qaytaradi
belgilangan yil oxirida depozit bo'yicha summa.
Chunki rate.add(BigDecimal.ONE) ifodasi har bir itera-da bir xil qiymat hosil qiladi.
biz 12-qatorda stavkani 1,05 ga boshlashimiz mumkin edi; ammo biz tanladik
5.6-rasmning 19-qatorida biz qo'llagan aniq hisob-kitoblarni taqlid qilish uchun.
Valyuta qiymatlarini NumberFormat yordamida formatlash
Loopning har bir iteratsiyasi davomida 26-qator

quyidagicha baholaydi:


1. Birinchidan, ifoda NumberFormatning getCurrencyInstance statik usulidan foydalanadi
raqamli qiymatlarni mahalliy til sifatida formatlash uchun oldindan tuzilgan NumberFormatni olish uchun
maxsus valyuta Strings - masalan, AQSh tilida, raqamli qiymat
1628.89 1628.89 dollar sifatida formatlangan. Mahalliy formatlash muhim ahamiyatga ega
xalqarolashtirishning bir qismi - ilovalaringizni moslashtirish jarayoni
foydalanuvchilarning turli tillari va so'zlashuv tillari.
2. Keyin ifoda NumberFormat usuli formatini chaqiradi (ob-
ject getCurrencyInstance tomonidan qaytarilgan) summani formatlashni amalga oshirish uchun
qiymat. Keyin usul formati mahalliy tilga xos String ko'rinishini qaytaradi,
kasrning o'ng tomonida ikki raqamga yaxlitlanadi.
BigDecimal qiymatlarni yaxlitlash
Aniq hisob-kitoblarga qo'shimcha ravishda, BigDecimal sizga qiymatlar qandayligini ham nazorat qiladi
yaxlitlangan - sukut bo'yicha barcha hisoblar aniq va yaxlitlash sodir bo'lmaydi. Agar aniqlamasangiz
BigDecimal qiymatlarini qanday yaxlitlash mumkin va berilgan qiymatni aniq ko'rsatib bo'lmaydi, masalan
1 ning 3 ga bo'linishi natijasi 0,3333333 ... - arifmetik istisno sodir bo'ladi.
Garchi biz bu misolda buni qilmasak ham, siz Big- uchun yaxlitlash rejimini belgilashingiz mumkin.
BigDecimal sinfiga MathContext ob'ektini (java.math to'plami) etkazib berish orqali o'nli raqam

NumberFormat.getCurrencyInstance().format(summa)


348 8-bob Sinflar va ob'ektlar: chuqurroq qarash

BigDecimal yaratganingizda konstruktor. Bundan tashqari, o'zgartirish uchun MathContext taqdim etishingiz mumkin.
hisob-kitoblarni amalga oshiradigan BigDecimal usullari. MathContext sinfida bir nechta mavjud
haqida bilib olishingiz mumkin bo'lgan oldindan tuzilgan MathContext ob'ektlari

Odatiy bo'lib, har bir oldindan sozlangan MathContext "bankirlarning yaxlitlashi" dan foydalanadi.


RoundingMode konstantasi HALF_EVEN uchun tekislangan:

BigDecimal qiymatlarni masshtablash


BigDecimal shkalasi o'nli kasrning o'ng tomonidagi raqamlar soni. Agar kerak bo'lsa
BigDecimal ma'lum bir raqamga yaxlitlangan bo'lsa, BigDecimal usulini setScale deb atashingiz mumkin. Uchun
Misol uchun, quyidagi ibora o'ng tomonidagi ikkita raqam bilan BigDecimalni qaytaradi
kasr nuqtasi va bankirlarni yaxlitlashdan foydalanish:

8.16 (ixtiyoriy) GUI va grafik misollar: foydalanish


Grafikaga ega ob'ektlar
Siz ko'rgan grafiklarning aksariyati dasturning har bir bajarilishi bilan farq qilmadi.
6.13-bo'limdagi 6.2-mashq sizdan shakllar va rang hosil qiluvchi dastur yaratishingizni so'radi.
yoki tasodifiy. Ushbu mashqda chizma har safar bo'yoq deb nomlangan tizim o'zgargan.
Komponent. Har safar bir xil bo'lib qoladigan yanada izchil chizma yaratish uchun
chizilgan, ko'rsatilgan shakllar haqidagi ma'lumotlarni qayta ishlab chiqarishimiz uchun saqlashimiz kerak
ularni har safar tizim paintComponent chaqirganda. Buning uchun biz shakllar to'plamini yaratamiz
har bir shakl haqidagi ma'lumotlarni saqlaydigan sinflar. Biz ruxsat berish orqali bu sinflarni “aqlli” qilamiz.
Graphics ob'ekti yordamida o'zlarini chizish uchun ushbu sinflarning ob'ektlarini yaratish.

MyLine sinfi


8.17-rasmda ushbu barcha imkoniyatlarga ega MyLine sinfi e'lon qilingan. MyLine sinfining importi
Rang va Grafika sinflari (3-4 qatorlar). 8–11-qatorlar birgalikdagi oʻzgaruvchilar uchun misol oʻzgaruvchilarini eʼlon qiladi.
chiziq chizish uchun zarur bo'lgan oxirgi nuqtalarning ordinatalari va 12-satr misol o'zgaruvchisini e'lon qiladi
bu chiziq rangini saqlaydi. 15-22 qatorlardagi konstruktor beshta parametrni oladi, bitta
u ishga tushiradigan har bir misol o'zgaruvchisi uchun. 25–29-qatorlarda chizish usuli grafikni talab qiladi
ics ob'ekti va undan kerakli rangda va oxirgi nuqtalar orasiga chiziq chizish uchun foydalanadi.

http://docs.oracle.com/javase/7/docs/api/java/math/MathContext.html

http://docs.oracle.com/javase/7/docs/api/java/math/
RoundingMode.html#HALF_EVEN

summa.setScale(2, RoundingMode.HALF_EVEN)

1 // 8.17-rasm: MyLine.java
2 // MyLine klassi chiziqni ifodalaydi.
3 import java.awt.Color;
4 import java.awt.Graphics;
5
6 ommaviy sinf MyLine
7 {

8.17-rasm | MyLine klassi chiziqni ifodalaydi. (2-qismning 1-qismi.)


8.16 (ixtiyoriy) GUI va grafik misollar: Grafika bilan ob'ektlardan foydalanish 349

DrawPanel sinfi
8.18-rasmda biz DrawPanel sinfini e'lon qilamiz, u sinfning tasodifiy ob'ektlarini yaratadi.
MyLine. 12-qator chiziladigan chiziqlarni saqlash uchun MyLine massiv chiziqlarini e'lon qiladi. Ichida -
struktor (15–37-qatorlar), 17-qator fon rangini Color.WHITE ga o'rnatadi. 19-qator hosil qiladi
tasodifiy uzunligi 5 dan 9 gacha bo'lgan massiv. 22–36 qatorlardagi halqa yangisini yaratadi
Massivdagi har bir element uchun MyLine. 25–28 qatorlar har biri uchun tasodifiy koordinatalarni hosil qiladi
chiziqning so'nggi nuqtalari va 31–32 qatorlar chiziq uchun tasodifiy rang hosil qiladi. 35-qator a hosil qiladi
tasodifiy yaratilgan qiymatlar bilan yangi MyLine ob'ekti va uni massivda saqlaydi. Usul
paintComponent kengaytirilgan for yordamida massiv satrlaridagi MyLine obyektlari orqali takrorlanadi
bayonot (45–46-qatorlar). Har bir iteratsiya joriy MyLine obyektining chizish usulini chaqiradi
va unga panelda chizish uchun Graphics obyektini uzatadi.

8 xususiy int x1; // x-birinchi oxirgi nuqtaning koordinatasi


9 xususiy int y1; // y-birinchi oxirgi nuqtaning koordinatasi
10 xususiy int x2; // x-ikkinchi oxirgi nuqtaning koordinatasi
11 xususiy int y2; // y-ikkinchi oxirgi nuqtaning koordinatasi
12 shaxsiy rang rangi; // ushbu qatorning rangi
13
14 // kirish qiymatlari bilan konstruktor
15 ta umumiy MyLine (int x1, int y1, int x2, int y2, Rang rangi)
16 {
17 this.x1 = x1;
18 this.y1 = y1;
19 this.x2 = x2;
20 this.y2 = y2;
21 this.color = rang;
22 }
23
24 // Belgilangan rangda chiziq chizish
25 ommaviy bekor o'yin (G grafik)
26 {
27 g.setColor(rang);
28 g.drawLine(x1, y1, x2, y2);
29 }
30 } // yakuniy sinf MyLine

1 // 8.18-rasm: DrawPanel.java


2 // MyLine sinfidan foydalanadigan dastur
3 // tasodifiy chiziqlar chizish uchun.
4 import java.awt.Color;
5 import java.awt.Graphics;
6 import java.security.SecureRandom;
7 import javax.swing.JPanel;
8
9 ochiq sinf DrawPanel JPanel-ni kengaytiradi
10 {
11 shaxsiy SecureRandom randomNumbers = yangi SecureRandom();
12 ta shaxsiy MyLine[] liniyasi; // qatorlar massivi

8.18-rasm | Tasodifiy chiziqlar chizish uchun MyLine sinfidan foydalanadigan dastur. (2-qismning 1-qismi.)

8.17-rasm | MyLine klassi chiziqni ifodalaydi. (2-qismning 2-qismi.)

350 8-bob Sinflar va ob'ektlar: chuqurroq qarash

TestDraw sinfi
8.19-rasmdagi TestDraw sinfi chizmamizni ko'rsatish uchun yangi oynani o'rnatadi. Biz tayyor bo'lganimizdan beri -
Chiziqlar uchun koordinatalarni konstruktorda faqat bir marta belgilab qo'ygan bo'lsa, chizma bunday qilmaydi
ekrandagi chizmani yangilash uchun paintComponent chaqirilsa o'zgartirish.

13
14 // konstruktor, tasodifiy shakllar bilan panel yaratadi


15 ommaviy DrawPanel()
16 {
17 to'plamFafon(Rang.OQ);
18
19 qator = yangi MyLine[5 + randomNumbers.nextInt(5)];
20
21 // chiziqlar yaratish
22 uchun (int count = 0; count < lines.length; count++)
23 {
24 // tasodifiy koordinatalarni yaratish
25 int x1 = randomNumbers.nextInt(300);
26 int y1 = randomNumbers.nextInt(300);
27 int x2 = randomNumbers.nextInt(300);
28 int y2 = randomNumbers.nextInt(300);
29
30 // tasodifiy rang hosil qiladi
31 Rang rangi = yangi rang(randomNumbers.nextInt(256),
32 randomNumbers.nextInt(256), randomNumbers.nextInt(256));
33
34 // ko'rsatiladigan qatorlar ro'yxatiga qator qo'shing
35 satr[hisoblash] = yangi MyLine(x1, y1, x2, y2, rang);
36 }
37 }
38
39 // har bir shakl massivi uchun alohida shakllarni chizing
40 umumiy bekor bo'yoq Komponenti (Grafika g)
41 {
42 super.paintComponent(g);
43
44 // chiziqlarni chizish
45 uchun (MyLine liniyasi: chiziqlar)
46 line.draw(g);
47 }
48 } // DrawPanel klassining oxiri

1 // 8.19-rasm: TestDraw.java


2 // DrawPanel-ni ko'rsatish uchun JFrame yaratish.
3 import javax.swing.JFrame;
4
5 umumiy sinf TestDraw
6 {

8.19-rasm | DrawPanelni ko'rsatish uchun JFrame yaratish. (2-qismning 1-qismi.)

8.18-rasm | Tasodifiy chiziqlar chizish uchun MyLine sinfidan foydalanadigan dastur. (2-qismning 2-qismi.)

8.16 (ixtiyoriy) GUI va grafik misol: Grafika bilan ob'ektlardan foydalanish 351

GUI va grafik misollarni o'rganish mashqlari
8.1-rasmdagi dasturni kengaytiring. To'rtburchaklar va ovallarni tasodifiy chizish uchun 8.17-8.19. Sinflar yarating
MyRectangle va MyOval. Ushbu sinflarning ikkalasi ham x1, y1, x2, y2 koordinatalarini, rang va ani o'z ichiga olishi kerak.
shakl to'ldirilganligini aniqlash uchun mantiqiy bayroq. Argu- bilan har bir sinfda konstruktorni e'lon qiling.
barcha misol o'zgaruvchilarni ishga tushirish uchun ments. To'rtburchaklar va tasvirlar chizishga yordam berish uchun har bir sinf kerak
Yuqori qiymatlarni hisoblaydigan getUpperLeftX, getUpperLeftY, getWidth va getHeight usullarini taqdim eting.
mos ravishda chap x-koordinata, yuqori chap y-koordinata, kenglik va balandlik. Yuqoridagi chap x koordinatasi
ikkita x-koordinata qiymatidan kichikroq, chap yuqoridagi y-koordinata ikkita y-dan kichikroqdir.
koordinata qiymatlari, kenglik ikki x-koordinatali qiymatlar orasidagi farqning mutlaq qiymatidir.
ues, balandlik esa ikki y-koordinata qiymati orasidagi farqning mutlaq qiymatidir.
JPanel-ni kengaytiruvchi va shakllarni yaratish bilan shug'ullanadigan DrawPanel klassi e'lon qilishi kerak
uchta massiv, har bir shakl turi uchun bittadan. Har bir massivning uzunligi tasodifiy son bo'lishi kerak
1 va 5 orasida. DrawPanel sinfining konstruktori har bir massivni tasodifiy shakllar bilan to'ldiradi.
joylashuv, o'lcham, rang va to'ldirish.
Bundan tashqari, barcha uchta shakl sinfini quyidagilarni o'z ichiga olgan holda o'zgartiring:
a) Shaklning koordinatalarini 0 ga o'rnatadigan argumentsiz konstruktor.
shaklni Color.BLACK ga, to‘ldirilgan xossani esa yolg‘onga aylantiradi (faqat MyRectangle va MyOval).
b) Har bir sinfdagi misol o'zgaruvchilari uchun usullarni o'rnating. Koordinatani o'rnatuvchi usullar
qiymatni belgilashdan oldin argument noldan katta yoki teng ekanligini tekshirishi kerak
koordinata - agar u bo'lmasa, ular koordinatani nolga o'rnatishlari kerak. Konstruktor shunday qilishi kerak
mahalliy o'zgaruvchilarni to'g'ridan-to'g'ri ishga tushirishdan ko'ra, o'rnatilgan usullarni chaqiring.
c) Har bir sinfdagi misol o'zgaruvchilari uchun usullarni oling. Chizma usuliga murojaat qilish kerak
to'g'ridan-to'g'ri kirishdan ko'ra get usullari bilan muvofiqlashtiradi.

7 ta umumiy statik bekor asosiy (String [] args)


8 {
9 DrawPanel paneli = yangi DrawPanel();
10 JFrame ilovasi = yangi JFrame();
11
12 app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13 app.add(panel);
14 app.setSize(300, 300);
15 app.setVisible(rost);
16 }
17 } // oxirgi sinf TestDraw

8.19-rasm | DrawPanelni ko'rsatish uchun JFrame yaratish. (2-qismning 2-qismi.)


352 8-bob Sinflar va ob'ektlar: chuqurroq qarash

8.17 Yakunlash
Ushbu bobda biz qo'shimcha sinf tushunchalarini taqdim etdik. Vaqt sinfidagi amaliy tadqiqotlar ko'rsatdi
shaxsiy ma'lumotlardan, ortiqcha yuklangan davlat konstruktorlaridan iborat to'liq sinf deklaratsiyasi
ishga tushirish moslashuvchanligi uchun sinf ma'lumotlarini manipulyatsiya qilish usullarini o'rnating va oling va
Ikki xil formatda Time ob'ektining string tasvirlarini qaytaradigan usullar.
Bundan tashqari, har bir sinf String rep-ni qaytaradigan toString usulini e'lon qilishi mumkinligini bilib oldingiz.
sinf ob'ektining noroziligi va toString usulini bilvosita chaqirish mumkin
String kutilayotgan kodda sinf ob'ekti paydo bo'lganda. ko'rsatdik
muammo yuzaga kelganligini ko'rsatish uchun istisnoni qanday tashlash kerak.
Siz ushbu havola sinfning misol usullarida bilvosita ishlatilishini bilib oldingiz
sinfning misol o'zgaruvchilari va boshqa misol usullariga kirish. Siz aniq foydalanishni ham ko'rdingiz
sinf a'zolariga (shu jumladan soyali maydonlarga) kirish uchun ushbu havoladan va qanday qilib
sinfning boshqa konstruktorini chaqirish uchun konstruktorda this kalit so'zidan foydalanish.
Biz kompilyator tomonidan taqdim etilgan standart konstruktorlar orasidagi farqlarni muhokama qildik
va dasturchi tomonidan taqdim etilgan argumentsiz konstruktorlar. Siz sinf bo'lishi mumkinligini bilib oldingiz
a'zolar sifatida boshqa sinflar ob'ektlariga havolalarga ega - kompozitsiya deb nomlanuvchi tushuncha.
Enum turlari va ulardan konstantalar to'plamini yaratishda qanday foydalanish mumkinligi haqida ko'proq bilib oldingiz
dasturda foydalanish uchun. Siz Java-ning axlat yig'ish qobiliyati va uni qanday qilish haqida bilib oldingiz
(to'xtovsiz) endi foydalanilmayotgan ob'ektlar xotirasini tiklaydi. bob
sinfdagi statik maydonlar uchun motivatsiyani tushuntirib berdi va qanday e'lon qilishni ko'rsatdi va
o'z darslarida statik maydonlar va usullardan foydalaning. Siz qanday qilib e'lon qilishni ham o'rgandingiz va
yakuniy o'zgaruvchilarni ishga tushirish.
Kirish modifikatorisiz e'lon qilingan maydonlarga paketga kirish huquqi berilishini bilib oldingiz
avvalboshdan. Siz har biriga ruxsat beruvchi bir xil paketdagi sinflar o'rtasidagi munosabatni ko'rdingiz
paketdagi boshqa sinflarning paketga kirish a'zolariga kirish uchun paketdagi sinf.
Va nihoyat, biz aniq pul hisob-kitoblarini amalga oshirish uchun BigDecimal sinfidan qanday foydalanishni ko'rsatdik.
munosabatlar.
Keyingi bobda siz ob'ektga yo'naltirilgan ishning muhim jihati haqida bilib olasiz.
Java-da grammatika - meros. Java-dagi barcha sinflar meros orqali bog'langanligini ko'rasiz,
to'g'ridan-to'g'ri yoki bilvosita, Ob'ekt deb nomlangan sinfga. Bundan tashqari, qanday qilib buni tushunishni boshlaysiz
sinflar orasidagi aloqalar sizga yanada kuchliroq ilovalar yaratish imkonini beradi.

Xulosa
8.2-bo'lim Vaqt sinfidagi Case Study


• Sinfning umumiy usullari sinfning umumiy xizmatlari yoki umumiy interfeysi sifatida ham tanilgan
(316-bet). Ular sinf mijozlariga sinf taqdim etadigan xizmatlarning ko'rinishini taqdim etadilar.
• Sinfning shaxsiy a'zolari uning mijozlari uchun ochiq emas.
• String sinfining statik usul formati (318-bet) System.out.printf usuliga o'xshaydi, bundan tashqari
format buyruqlar oynasida ko'rsatish o'rniga formatlangan Stringni qaytaradi.
• Java’dagi barcha obyektlarda ob’ektning String tasvirini qaytaruvchi toString usuli mavjud.
Method toString ob'ekt kodda String kerak bo'lganda paydo bo'lganda bilvosita chaqiriladi.
8.3-bo'lim A'zolarga kirishni nazorat qilish
• Kirish modifikatorlari sinf o'zgaruvchilari va usullariga umumiy va xususiy boshqaruvga kirish imkonini beradi.

Xulosa 353



• Ommaviy usullarning asosiy maqsadi sinf mijozlariga xizmatlar ko'rinishini taqdim etishdir
sinf beradi. Mijozlar sinf o'z vazifalarini qanday bajarayotgani bilan qiziqmasligi kerak.
• Sinfning shaxsiy o'zgaruvchilari va xususiy usullari (ya'ni, uni amalga oshirish tafsilotlari) kirish huquqiga ega emas.
o'z mijozlariga do'stona.
8.4-bo'lim Ushbu havola bilan joriy ob'ektning a'zolariga murojaat qilish
• Ob'ektning misol usuli ob'ektga murojaat qilish uchun this (322-bet) kalit so'zidan bevosita foydalanadi.
misol o'zgaruvchilari va boshqa usullar. Bu kalit so'z ham aniq ishlatilishi mumkin.
• Kompilyator har bir kompilyatsiya qilingan sinf uchun .class kengaytmali alohida fayl ishlab chiqaradi.
• Agar mahalliy o'zgaruvchi sinf maydoni bilan bir xil nomga ega bo'lsa, mahalliy o'zgaruvchi maydonni soya qiladi. Siz
ushbu havoladan soyali maydonga aniq murojaat qilish uchun usulda foydalanishi mumkin.
8.5-bo'lim Vaqt sinfi misoli: haddan tashqari yuklangan konstruktorlar
• Haddan tashqari yuklangan konstruktorlar sinf ob'ektlarini turli usullar bilan ishga tushirishga imkon beradi. Kompilyator
haddan tashqari yuklangan konstruktorlarni (324-bet) imzolari bilan farqlaydi.
• Bir sinfning bir konstruktorini boshqa bir sinfdan chaqirish uchun this kalit so'zidan foydalanishingiz mumkin
keyin konstruktor argumentlarini o'z ichiga olgan qavslar. Agar foydalanilsa, bunday konstruktor chaqiruvi
konstruktor tanasida birinchi gap sifatida paydo bo'lishi kerak.
8.6-bo'lim Standart va argumentsiz konstruktorlar
• Agar sinfda konstruktorlar taqdim etilmasa, kompilyator standart konstruktor yaratadi.
• Agar sinf konstruktorlarni e'lon qilsa, kompilyator standart konstruktor yaratmaydi. Bunday holda, siz
standart ishga tushirish zarur bo'lsa, argumentsiz konstruktorni e'lon qilishi kerak (327-bet).
8.7-bo'lim O'rnatish va olish usullari bo'yicha eslatmalar
• To'plam usullari odatda mutator usullar deb ataladi (331-bet), chunki ular odatda qiymatni o'zgartiradi.
u. Get usullari odatda aksessuar usullari (331-bet) yoki so'rov usullari deb ataladi. Predikat
usuli (332-bet) shartning to‘g‘ri yoki noto‘g‘riligini tekshiradi.
8.8-bo'lim Tarkibi
• Sinf a'zolar sifatida boshqa sinflar ob'ektlariga havolalarga ega bo'lishi mumkin. Bunga kompozitsiya deyiladi
(332-bet) va ba’zan ega-a munosabatlari deb ham yuritiladi.
8.9-bo'limning turlari
• Barcha raqam turlari (335-bet) mos yozuvlar turlaridir. Enum turi enum deklaratsiyasi bilan e'lon qilinadi,
enum konstantalarining vergul bilan ajratilgan ro'yxati. Deklaratsiya ixtiyoriy ravishda boshqasini ham o'z ichiga olishi mumkin
konstruktorlar, maydonlar va usullar kabi an'anaviy sinflarning tarkibiy qismlari.
• enum konstantalari bevosita yakuniy hisoblanadi, chunki ular o'zgartirilmasligi kerak bo'lgan doimiylarni e'lon qiladi.
• enum konstantalari bevosita statikdir.
• Enum tipidagi ob'ektni yangi operator bilan yaratishga urinish kompilyatsiya xatosiga olib keladi.
• enum konstantalari konstantalar ishlatilishi mumkin bo'lgan har qanday joyda ishlatilishi mumkin, masalan, kalitning ish belgilarida
bayonotlar va bayonotlar uchun kengaytirilgan nazorat qilish.
• Enum deklaratsiyasidagi har bir enum konstantasidan keyin ixtiyoriy ravishda uzatiladigan argumentlar keladi
enum konstruktoriga.
• Har bir raqam uchun kompilyator qiymatlar (336-bet) deb ataladigan statik usulni ishlab chiqaradi va bu qiymatni qaytaradi.
enum konstantalarining e'lon qilingan tartibda massivi.
• EnumSet statik usul diapazoni (337-bet) diapazondagi birinchi va oxirgi raqam konstantalarini oladi va
Bu ikki doimiylar orasidagi barcha konstantalarni o'z ichiga olgan EnumSet ni qaytaradi, shu jumladan.

354 8-bob Sinflar va ob'ektlar: chuqurroq qarash



8.10-bo'lim Axlat yig'ish
• Java virtual mashinasi (JVM) axlatni qayta tiklash uchun avtomatik ravishda axlat yig'ishni (338-bet) amalga oshiradi.
foydalanilmayotgan ob'ektlar egallagan xotira. Qachon hech qanday havolalar bir
ob'ekt, ob'ekt axlat yig'ish uchun mos. Bunday ob'ekt uchun xotira qayta bo'lishi mumkin.
JVM axlat yig'uvchini ishga tushirganda da'vo qilingan.
8.11-bo'lim statik sinf a'zolari
• Statik o'zgaruvchi (338-bet) sinf ob'ektlari o'rtasida almashiladigan sinf ma'lumotlarini ifodalaydi.
• statik o'zgaruvchilar sinf doirasiga ega. Sinfning umumiy statik a'zolariga murojaat qilish orqali kirish mumkin.
sinfning istalgan ob'ektiga kirish yoki ularga a'zo nomini kvalifikatsiya qilish orqali kirish mumkin
sinf nomi va nuqta (.). Mijoz kodi faqat sinfning shaxsiy statik sinf a'zolariga kirishi mumkin
sinf usullari orqali.
• statik sinf a'zolari sinf xotiraga yuklanishi bilanoq mavjud bo'ladi.
• Statik deb e'lon qilingan usul sinfning misol o'zgaruvchilari va misol usullariga kira olmaydi, chunki
chunki sinfning hech bir ob'ekti yaratilmagan bo'lsa ham, statik usul chaqirilishi mumkin.
• Ushbu havolani statik usulda ishlatib bo'lmaydi.
8.12-bo'lim Statik import
• Statik import deklaratsiyasi (342-bet) import qilingan statik a'zolarga murojaat qilish imkonini beradi.
sinf nomi va nuqta (.). Yagona statik import deklaratsiyasi bitta statik a'zoni import qiladi,
va talab bo'yicha statik import sinfning barcha statik a'zolarini import qiladi.
8.13-bo'lim yakuniy misol o'zgaruvchilari
• Ilova kodi kontekstida eng kam imtiyozlar printsipi (343-bet) kod bo'lishi kerakligini bildiradi.
faqat belgilangan vazifani bajarish uchun zarur bo'lgan imtiyoz va kirish huquqini beradi.
• Final kalit so'zi o'zgaruvchini o'zgartirish mumkin emasligini bildiradi. Bunday o'zgaruvchilar qachon ishga tushirilishi kerak
ular yoki sinfning har bir konstruktori tomonidan e'lon qilinadi.
8.14-bo'lim Paketga kirish
• Agar sinfda e'lon qilingan usul yoki o'zgaruvchiga kirish modifikatori belgilanmagan bo'lsa, usul
yoki o'zgaruvchi paketga kirish huquqiga ega deb hisoblanadi (344-bet).
8.15-bo'lim Aniq pul hisob-kitoblari uchun BigDecimaldan foydalanish
• Yaxlitlash xatolarisiz aniq suzuvchi nuqta hisoblarini talab qiladigan har qanday dastur, masalan
moliyaviy dasturlarda bo'lganlar - o'rniga BigDecimal sinfidan foydalanishlari kerak (java.math to'plami; 346-bet).
• Ikki argumentli BigDecimal statik usuli valueOf (347-bet) BigDecimal qiymatini qaytaradi
aniq belgilangan qiymatni ifodalaydi.
• BigDecimal usuli add (347-bet) BigDecimal argumentini BigDecimal argumentiga qo'shadi.
usul chaqiriladi va natijani qaytaradi.
• BigDecimal ONE (1), ZERO (0) va TEN (10) konstantalarini beradi.
• BigDecimal usuli pow (347-bet) birinchi argumentini ikkinchi argumentda ko'rsatilgan quvvatga oshiradi.
gument.
• BigDecimal ko'paytirish usuli (347-bet) BigDecimal argumentini BigDecimal bilan ko'paytiradi
unda usul chaqiriladi va natijani qaytaradi.
• Class NumberFormat (java.text to‘plami; 347-bet) raqamli ma’lumotlarni formatlash imkoniyatlarini beradi.
qiymatlar mahalliy tilga xos Strings sifatida. Sinfning statik getCurrencyInstance usuli oldingi qiymatni qaytaradi.
mahalliy valyuta qiymatlari uchun sozlangan NumberFormat. NumberFormat usuli formati -
formatlashni tashkil qiladi.

O‘z-o‘zini tekshirish 355-mashq



• Mahalliy xususiyatga ega formatlash xalqarolashtirishning muhim qismidir — maxsus formatlash jarayoni.
ilovalaringizni foydalanuvchilarning turli tillari va og'zaki tillari uchun yaratish.
• BigDecimal sizga qiymatlarning yaxlitlanishini boshqarish imkonini beradi — sukut bo'yicha barcha hisoblar aniq
va yaxlitlash sodir bo'lmaydi. BigDecimal qiymatlari va berilgan qiymatni qanday yaxlitlashni belgilamasangiz
aniq ifodalab bo'lmaydi ArithmeticException sodir bo'ladi.
• BigDecimal uchun yaxlitlash rejimini MathContext obyektini (paket) taqdim etish orqali belgilashingiz mumkin.
java.math) BigDecimal ni yaratganingizda BigDecimal konstruktorini sinfiga o'tkazing. Siz ham pro-
hisob-kitoblarni amalga oshiradigan turli BigDecimal usullariga MathContext-ni ko'rsating. Odatiy bo'lib, har biri
Oldindan sozlangan MathContext "bankirlarning yaxlitlashi" deb nomlanadi.
• BigDecimal shkalasi o'nli kasrning o'ng tomonidagi raqamlar soni. Agar sizga katta kerak bo'lsa -
O'nlik ma'lum bir raqamga yaxlitlanadi, siz BigDecimal usulini setScale deb atashingiz mumkin.
O'z-o'zini tekshirish mashqlari
8.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) A(n) sinfning barcha statik a'zolarini import qiladi.
b) String sinfining statik usuli System.out.printf usuliga o'xshaydi, lekin qayta
buyruq oynasida Stringni ko'rsatish o'rniga formatlangan Stringni aylantiradi.
c) Agar metod o'z sinfining maydonlaridan biri bilan bir xil nomga ega mahalliy o'zgaruvchini o'z ichiga olgan bo'lsa,
mahalliy o'zgaruvchi bu usul doirasidagi maydon.
d) sinfning umumiy usullari sinfning yoki deb ham ataladi.
e) A(n) deklaratsiyasi import qilinadigan bitta sinfni belgilaydi.
f) Agar sinf konstruktorlarni e'lon qilsa, kompilyator a(n) ni yaratmaydi.
g) Qayerda kodda ob'ekt paydo bo'lsa, ob'ekt usuli bilvosita chaqiriladi
String kerak.
h) Get usullari odatda yoki deyiladi.
i) A(n) usuli shartning to'g'ri yoki noto'g'ri ekanligini tekshiradi.
j) Har bir enum uchun kompilyator an qaytaradigan statik usulni yaratadi
enum konstantalarining e'lon qilingan tartibda massivi.
k) Tarkibi ba'zan (n) munosabati deb ataladi.
l) A(n) deklaratsiyasida vergul bilan ajratilgan konstantalar ro‘yxati mavjud.
m) A(n) o'zgaruvchisi barcha ob'ektlar tomonidan baham ko'rilgan sinf ma'lumotlarini ifodalaydi
sinfdan.
n) A(n) deklaratsiyasi bitta statik a'zoni import qiladi.
o) Kodga faqat imtiyoz va ruxsat miqdori berilishi kerakligi ta'kidlangan
belgilangan vazifani bajarishi kerak.
p) Kalit so'z o'zgaruvchini dec-da ishga tushirilgandan keyin o'zgartirib bo'lmasligini bildiradi.
laratsiya yoki konstruktor.
q) A(n) deklaratsiyasi faqat dasturning bir qismidan foydalanadigan sinflarni import qiladi.
ular to'plami.
r) To'plam usullari odatda deyiladi, chunki ular odatda qiymatni o'zgartiradilar.
s) Aniq pul hisob-kitoblarini amalga oshirish uchun sinfdan foydalaning.
t) Muammo yuzaga kelganligini bildirish uchun bayonotdan foydalaning.
O'z-o'zini tekshirish mashqlariga javoblar
8.1 a) talab bo'yicha statik import. b) format. c) soyalar. d) davlat xizmatlari, umumiy interfeys.
e) yagona turdagi import. f) standart konstruktor. g) toString. h) aksessuar usullari, so'rov usullari.
i) predikat. j) qiymatlar. k) ega-a. l) sanab. m) statik. n) yagona statik import. o) eng kichik printsipi
imtiyoz. p) yakuniy. q) so‘rov bo‘yicha import turi. r) mutatorlik usullari. s) BigDecimal. t) otish.

356 8-bob Sinflar va ob'ektlar: chuqurroq qarash



Mashqlar
8.2 (8.14-bo'lim asosida) Java-da paketga kirish tushunchasini tushuntiring. Salbiyni tushuntiring
paketga kirish aspektlari.
8.3 Konstruktor uchun qaytish turi, hatto bekor bo'lsa ham nima bo'ladi?
8.4 (To'rtburchaklar klassi) Uzunlik va kenglik atributlari bilan to'rtburchaklar sinfini yarating, ularning har biri.
sukut bo'yicha 1. To'rtburchakning perimetri va maydonini hisoblaydigan usullarni keltiring. O'rnatdi va oldi
ham uzunlik, ham kenglik uchun usullar. Belgilangan usullar uzunlik va kenglikning har biri ekanligini tekshirishi kerak
0,0 dan katta va 20,0 dan kichik suzuvchi nuqtali raqamlar. Rectangle sinfini sinash dasturini yozing.
8.5 (Sinfning ichki ma'lumotlarini ko'rsatishni o'zgartirish) Bu juda oqilona bo'lar edi
8.5-rasmdagi Time2 sinfi uchun vaqtni o'rtadan boshlab soniyalar soni sifatida ichki ko'rsatish uchun
tun, soat, daqiqa va soniyaning uchta tamsayı qiymatidan ko'ra. Mijozlar bir xil pubdan foydalanishlari mumkin edi.
lic usullari va bir xil natijalarga erishing. Vaqtni sifatida amalga oshirish uchun 8.5-rasmdagi Time2 sinfini o'zgartiring
yarim tundan keyingi soniyalar soni va sinf mijozlariga hech qanday o'zgarish ko'rinmasligini ko'rsatadi.
8.6 (Omonat hisobi klassi) SavingsAccount sinfini yarating. Yillik statik o'zgaruvchidan foydalaning.
Barcha hisob egalari uchun yillik foiz stavkasini saqlash uchun estRate. Sinfning har bir ob'ektida a mavjud
xususiy instansiya o'zgaruvchan jamg'arma balansi jamg'armaning hozirda depozitda bo'lgan miqdorini ko'rsatadi.
Oylik foizlarni ko'paytirish orqali hisoblash uchun MonthlyInterest usulini taqdim eting
jamg'arma balansi yillik foiz stavkasi bo'yicha 12 ga bo'lingan - bu foizlar jamg'armaga qo'shilishi kerak -
Balans. YillikInterestRate ni yangisiga o'rnatadigan modifyInterestRate statik usulini taqdim eting
qiymat. SavingsAccount sinfini sinab ko'rish uchun dastur yozing. Ikkita savingsAccount obyektini jonlantirish,
tejamkor1 va tejamkor2, mos ravishda $2000.00 va $3000.00 balanslari bilan. Yillik foiz stavkasini belgilang
4% gacha, keyin har 12 oy uchun oylik foizlarni hisoblab chiqing va yangi qoldiqlarni chop eting
ikkala tejamkor. Keyin yillik foiz stavkasini 5% qilib belgilang, keyingi oyning foizlarini hisoblang va chop eting
ikkala tejamkor uchun yangi balanslar.
8.7 (2-sinf vaqtini kengaytirish) 8.5-rasmdagi 2-sinf vaqtini o'zgartiring, buning uchun belgi qo'ying.
Time2 ob'ektida saqlangan vaqtni bir soniyaga qisqartiradi. IncrementMinute usulini kiriting-
daqiqani bir marta oshiring va soatni bir marta oshirish uchun incrementHour usulini kiriting. a yozing
belgi usulini, incrementMinute usulini va incrementHour usulini sinab ko'radigan dastur
ularning to'g'ri ishlashini ta'minlash. Quyidagi holatlarni tekshirishga ishonch hosil qiling:
a) keyingi daqiqaga oshirish,
b) keyingi soatga oshirish va
c) keyingi kunga (ya'ni, 23:59:59 dan 12:00:00 gacha) o'sish.
8.8 (Klass sanasini kengaytirish) 8.7-rasmdagi sinf sanasini o'zgartiring, bu esa boshlang'ichda xatolarni tekshirishni amalga oshiradi.
oy, kun va yil o'zgaruvchilari uchun tializer qiymatlari (hozirda u faqat oyni tasdiqlaydi va
kun). Kunni bir marta oshirish uchun keyingi kun usulini taqdim eting. Usulni sinab ko'radigan dastur yozing
Keyingi kun tsiklda har bir iteratsiya davomida sanani chop etadi, bu usul mos ishlayotganini ko'rsatadi.
to'g'ridan-to'g'ri. Quyidagi holatlarni sinab ko'ring:
a) keyingi oyga va
b) keyingi yilga ko'paytirish.
8.9 Har bir statik element uchun alohida import deklaratsiyasidan foydalanish uchun 8.14-rasmdagi kodni qayta yozing.
misolda ishlatiladigan matematika sinfi.
8.10 Konstantalari (QIZIL, YASIL, SARI) bitta parametrni qabul qiladigan TrafficLight turini yozing.
ter - yorug'lik davomiyligi. TrafficLight raqamini ko'rsatadigan tarzda sinab ko'rish uchun dastur yozing
enum konstantalari va ularning davomiyligi.
8.11 (Murakkab raqamlar) Kompleks bilan arifmetikani bajarish uchun Kompleks deb nomlangan sinf yarating.
raqamlar. Kompleks sonlar shaklga ega
realPart + imaginaryPart * i

357-mashqlar

men qayerdaman

Sinfingizni sinab ko'rish uchun dastur yozing. Shaxsiy ma'lumotlarni ko'rsatish uchun suzuvchi nuqtali o'zgaruvchilardan foydalaning


sinf. Ushbu sinf ob'ekti e'lon qilinganda uni ishga tushirishga imkon beruvchi konstruktorni taqdim eting.
Initsializatorlar taqdim etilmagan taqdirda, argumentsiz konstruktorni standart qiymatlar bilan ta'minlang. Ta'minlash
quyidagi operatsiyalarni bajaradigan ommaviy usullar:
a) Ikkita Murakkab son qo‘shing: Haqiqiy qismlar birgalikda qo‘shiladi va xayoliy qismlar
birga qo'shiladi.
b) Ikki Murakkab sonni ayirish: o'ng operandning haqiqiy qismi ayiriladi
chap operandning haqiqiy qismi va o'ng operandning xayoliy qismi sub-
chap operandning xayoliy qismidan olingan.
c) Kompleks sonlarni shaklda chop eting (realPart, imaginaryPart).
8.12 (Sana va vaqt sinfi) O'zgartirilgan Time2 sinfini birlashtirgan DateAndTime sinfini yarating.
8.7-mashq va 8.8-mashqning oʻzgartirilgan Sana sinfi. Qo'ng'iroq qilish uchun incrementHour usulini o'zgartiring
Agar vaqt keyingi kunga oshirilsa, nextDay usuli. Usullarni String va toUni-ga o'zgartiring
vaqtdan tashqari sanani chiqarish uchun versalString. Yangi sinfni sinab ko'rish dasturini yozing.
teAndTime. Xususan, vaqtni keyingi kunga oshirishni sinovdan o'tkazing.
8.13 (Bitsarlar to'plami) IntegerSet sinfini yarating. Har bir IntegerSet obyekti ichida butun sonlarni saqlashi mumkin
diapazon 0–100. To'plam mantiqiy qatorlar bilan ifodalanadi. Massiv elementi a[i], agar i butun soni rost bo'lsa
to'plamda. a[j] massiv elementi to‘plamda j butun soni bo‘lmasa, noto‘g‘ri bo‘ladi. Argumentsiz konstruktor
massivni "bo'sh to'plam" ga (ya'ni, barcha noto'g'ri qiymatlar) ishga tushiradi.
Quyidagi usullarni taqdim eting: Statik usul birlashmasi nazariy to'plamni yaratadi
ikkita mavjud to'plamning birlashishi (ya'ni, yangi to'plamning bir elementi, agar bu element rost bo'lsa, true ga o'rnatiladi.
mavjud to'plamlarning birida yoki ikkalasida - aks holda, yangi to'plam elementi noto'g'ri o'rnatiladi). Statik
usul kesishmasi ikkita mavjud to‘plamning nazariy-nazariy kesishmasi bo‘lgan to‘plamni yaratadi (ya’ni,
yangi to'plamning massivining elementi noto'g'ri bo'ladi, agar bu element bitta yoki ikkalasida noto'g'ri bo'lsa.
mavjud to'plamlar - aks holda, yangi to'plamning elementi true ga o'rnatiladi). insertElement usuli yangisini qo'shadi
k butun sonni to‘plamga (a[k] ni rost deb belgilash orqali). DeleteElement usuli m butun sonini o'chiradi (sozlash orqali
a[m] dan noto'g'ri). ToString usuli ajratilgan raqamlar ro'yxati sifatida to'plamni o'z ichiga olgan Stringni qaytaradi
bo'shliqlar bo'yicha. Faqat to'plamda mavjud bo'lgan elementlarni qo'shing. Bo'sh joyni ifodalash uchun --- dan foydalaning
o'rnatish. IsEqualTo usuli ikkita to'plam teng yoki yo'qligini aniqlaydi. Inte-klassni sinab ko'rish uchun dastur yozing.
gerSet. Bir nechta IntegerSet ob'ektlarini yaratish. Barcha usullaringiz to'g'ri ishlashini tekshiring.
8.14 (Sana sinfi) Quyidagi imkoniyatlarga ega sana sinfini yarating:
a) Sanani bir nechta formatda chiqaring, masalan
AA/KK/YYYY
1992 yil 14 iyun
DDD YYYY
b) Formatlarning sanalari bilan ishga tushirilgan Sana ob'ektlarini yaratish uchun haddan tashqari yuklangan konstruktorlardan foydalaning
qism (a). Birinchi holda, konstruktor uchta butun qiymatni olishi kerak. In
ikkinchi holatda u String va ikkita butun qiymatni olishi kerak. Uchinchi holatda, shunday bo'lishi kerak
ikkita butun qiymatni oling, birinchisi yildagi kun sonini bildiradi.
[Maslahat: Oyning string tasvirini raqamli qiymatga aylantirish uchun solishtiring
Tenglar usuli yordamida satrlar. Misol uchun, agar s1 va s2 Strings bo'lsa, usul
call s1.equals(s2) agar satrlar bir xil bo'lsa, rostni qaytaradi va aks holda qaytaradi
yolg'on.]
8.15 (Ratsional sonlar) Kasrlar bilan arifmetikani bajarish uchun Rational nomli sinf yarating.
Sinfingizni sinab ko'rish uchun dastur yozing. Shaxsiy misol o'zgaruvchilarini ko'rsatish uchun butun son o'zgaruvchilardan foydalaning
sinfning - sanoqchi va maxraj. Ob'ektga ruxsat beruvchi konstruktorni taqdim eting

– 1

358 8-bob Sinflar va ob'ektlar: chuqurroq qarash

bu sinf e'lon qilinganda ishga tushirilishi kerak. Konstruktor fraktsiyani qisqartirilgan holda saqlashi kerak


shakl. Kasr
2/4
1/2 ga ekvivalent bo'lib, ob'ektda hisobda 1 va denominalda 2 sifatida saqlanadi.
tor. Initsializatorlar taqdim etilmagan taqdirda, argumentsiz konstruktorni standart qiymatlar bilan ta'minlang. Pro-
Quyidagi operatsiyalarning har birini bajaradigan umumiy usullarni ko'rsating:
a) Ikkita ratsional son qo'shing: qo'shish natijasi qisqartirilganda saqlanishi kerak
shakl. Buni statik usul sifatida amalga oshiring.
b) ikkita ratsional sonni ayirish: ayirish natijasi qayta saqlanishi kerak.
siqilgan shakl. Buni statik usul sifatida amalga oshiring.
c) Ikkita ratsional sonni ko'paytirish: ko'paytirish natijasini saqlash kerak
qisqartirilgan shakl. Buni statik usul sifatida amalga oshiring.
d) ikkita ratsional sonni ajrating: bo'linish natijasi qisqartirilgan holda saqlanishi kerak
shakl. Buni statik usul sifatida amalga oshiring.
e) a/b ko'rinishidagi Ratsional sonning satrli ko'rinishini qaytaring, bu erda a - bu
sanoqchi va b - maxraj.
f) suzuvchi nuqtali formatdagi ratsional sonning satrli tasvirini qaytaring. (Con-
Sider sinf foydalanuvchisiga ni belgilashga imkon beruvchi formatlash imkoniyatlarini taqdim etadi
kasrning o'ng tomonidagi aniqlik raqamlari soni.)
8.16 (Huge Integer Class) HugeInteger sinfini yarating, u 40 elementli raqamlar majmuasidan foydalanadi.
har biri 40 ta raqamgacha bo'lgan butun sonlarni saqlang. Tahlil qilish, toString, qo'shish va ayirish usullarini taqdim eting. Metod-
od parse satrni olishi kerak, charAt usuli yordamida har bir raqamni ajratib oling va butun sonni joylashtiring
har bir raqamning butun son massiviga ekvivalenti. HugeInteger obyektlarini solishtirish uchun quyidagilarni taqdim eting:
tushirish usullari: isEqualTo, isNotEqualTo, isGreaterThan, isLessThan, isGreaterThanOrEqualTo
va LessThanOrEqualTo. Ularning har biri predikat usuli bo'lib, agar munosabat bo'lsa, rost qaytaradi
ikkita HugeInteger ob'ekti o'rtasida ushlab turadi va agar munosabatlar o'zgarmasa, false qiymatini qaytaradi. Pro-
isNero predikat usulini ko'rsating. Agar siz o'zingizni shuhratparast his qilsangiz, ko'paytirish, bo'lish va usullarni ham taqdim eting
qolgan. [Izoh: ibtidoiy mantiqiy qiymatlar “toʻgʻri” soʻzi yoki “notoʻgʻri” soʻzi sifatida chiqarilishi mumkin.
format spetsifikatsiyasi %b.]
8.17 (Tic-Tac-Toe) Tic-ni o'ynash uchun dastur yozish imkonini beruvchi TicTacToe sinfini yarating.
Tac-toe. Sinfda xususiy 3 ga 3 ikki o'lchovli massiv mavjud. Ko'rsatish uchun enum turidan foydalaning
massivning har bir katagidagi qiymat. Enum konstantalari X, O va EMPTY deb nomlanishi kerak (po-
X yoki O ni o'z ichiga olmaydi). Konstruktor taxta elementlarini ishga tushirishi kerak
BOS. Ikkita inson o'yinchiga ruxsat bering. Birinchi o'yinchi qaerga harakat qilsa, belgilangan kvadratga X belgisini qo'ying,
va ikkinchi o'yinchi harakatlanadigan joyga O belgisini qo'ying. Har bir harakat bo'sh kvadratga bo'lishi kerak. Keyin
Har bir harakatda, o'yin g'alaba qozonilganligini va durang ekanligini aniqlang. Agar o'zingizni noaniq his qilsangiz -
Kompyuter o'yinchilardan birining harakatini amalga oshirishi uchun dasturingizni o'zgartiring. Bundan tashqari, ruxsat bering
o'yinchi birinchi yoki ikkinchi borishni xohlaydimi yoki yo'qligini aniqlaydi. Agar o'zingizni g'ayrioddiy his qilsangiz
4-x4-dan 4-gachasi doskada uch oʻlchamli Tic-Tac-Toe oʻynaydigan dastur ishlab chiqing.
[Izoh: Bu juda qiyin loyiha!].
8.18 (BigDecimal balansi bilan hisob klassi) Saqlash uchun 3.5-bo'limning Hisob sinfini qayta yozing
Balansni BigDecimal obyekti sifatida va BigDecimals yordamida barcha hisob-kitoblarni bajarish uchun.
Farq qilish
8.19 (Loyiha: Favqulodda vaziyatlarga javob berish klassi) Shimoliy Amerika favqulodda vaziyatlarga javob berish xizmati, 9-1-1,
qo'ng'iroq qiluvchilarni mahalliy Davlat xizmatiga javob berish nuqtasiga (PSAP) ulaydi. An'anaga ko'ra, PSAP so'raydi
qo'ng'iroq qiluvchining identifikatsiya ma'lumotlari, shu jumladan qo'ng'iroq qiluvchining manzili, telefon raqami va tabiati
Favqulodda vaziyatni aniqlang, keyin tegishli favqulodda yordam xodimlarini (masalan, politsiya, ambulatoriya) yuboring.

Farq qilish 359

nayza yoki o't o'chirish bo'limi). Kengaytirilgan 9-1-1 (yoki E9-1-1) aniqlash uchun kompyuterlar va ma'lumotlar bazalaridan foydalanadi
qo'ng'iroq qiluvchining jismoniy manzili, qo'ng'iroqni eng yaqin PSAPga yo'naltiradi va qo'ng'iroq qiluvchining telefon raqamini ko'rsatadi.
ber va qo'ng'iroqni qabul qiluvchining manzili. Wireless Enhanced 9-1-1 qo'ng'iroq qiluvchilarga identifikatsiya ma'lumotlarini taqdim etadi.
simsiz qo'ng'iroqlar uchun shakllantirish. Ikki bosqichda ishlab chiqarilgan, birinchi bosqich tashuvchilarni ta'minlashni talab qildi
simsiz telefon raqami va qo'ng'iroqni uzatuvchi uyali tarmoq yoki tayanch stantsiyaning joylashuvi. sek-
ikkinchi bosqichda tashuvchilar qo'ng'iroq qiluvchining joylashuvini (GPS kabi texnologiyalardan foydalangan holda) ta'minlashni talab qildi. Kimga
9-1-1 haqida ko'proq bilib oling, http://www.fcc.gov/pshs/services/911-services/Welcome.html saytiga tashrif buyuring va
http://people.howstuffworks.com/9-1-1.htm.
Sinf yaratishning muhim qismi bu sinfning atributlarini (misol o'zgaruvchilari) aniqlashdir.
Ushbu sinf dizayni uchun Internetda 9-1-1 xizmatlarini o'rganing. Keyin, deb nomlangan sinfni loyihalashtiring
Ob'ektga yo'naltirilgan 9-1-1 favqulodda vaziyatlarda javob berish tizimida ishlatilishi mumkin bo'lgan favqulodda vaziyat. Ro'yxatga kiriting
bu sinf ob'ekti favqulodda vaziyatni ko'rsatish uchun foydalanishi mumkin bo'lgan atributlar. Masalan, sinf
Favqulodda vaziyat haqida kim xabar berganligi haqidagi ma'lumotlarni (shu jumladan ularning telefon raqamini) o'z ichiga olishi mumkin
favqulodda vaziyatning joylashuvi, xabar berish vaqti, favqulodda vaziyatning tabiati, javob turi
va javob holati. Sinf atributlari uning tabiatini to'liq tavsiflashi kerak
muammo va bu muammoni hal qilish uchun nima sodir bo'ladi.

9

Ob'ektga yo'naltirilgan


Dasturlash: Meros

Boshqasini bilmayman de


butunlay,
ajratmaguningizcha
u bilan meros.
- Iogann Kasper Lavater
Bu usul sifatida belgilash kerak
sinfning soni hamma sinf
berilgan sinfga o'xshash sinflar.
- Bertran Rassell
Oh maqsadlar
Ushbu bobda siz:
■ Merosni tushunish va
yangisini ishlab chiqish uchun qanday foydalanish kerak
mavjud asosidagi sinflar
sinflar.
■ tushunchalarini o'rganing
yuqori sinflar va kichik sinflar
va orasidagi munosabat
ular.
■ Kengaytirilgan kalit so'zdan foydalaning
meros qilib oladigan sinf yarating
dan sifatlar va xatti-harakatlar
boshqa sinf.
■ Kirish modifikatoridan foydalaning
super klassda himoyalangan
kichik sinf usullarini berish
ushbu superklassga kirish
a'zolari.
■ Superklass a'zolariga kirish
kichik sinfdan super bilan.
■ Konstruktorlar qanday ekanligini bilib oling
merosda qo'llaniladi
ierarxiyalar.
■ usullari haqida bilib oling
sinf Ob'ekti, to'g'ridan-to'g'ri yoki
hammasining bilvosita super klassi
sinflar.

9.1 Kirish 361

9.1 Kirish
Ushbu bobda ob'ektga yo'naltirilgan dasturlash (OOP) haqida suhbatimiz davom etadi.
meros qilib olish, bunda yangi sinf mavjud sinfning xotirasini olish orqali yaratiladi.
va, ehtimol, ularni yangi yoki o'zgartirilgan imkoniyatlar bilan bezash. Meros bilan,
mavjud isbotlangan yangi sinflarga asoslanib, dasturni ishlab chiqishda vaqtni tejashingiz mumkin
va yuqori sifatli dasturiy ta'minotni tuzatdi. Bu, shuningdek, tizimning bo'lish ehtimolini oshiradi
samarali amalga oshirilishi va saqlanishi kerak.
Sinf yaratishda siz butunlay yangi a'zolarni e'lon qilish o'rniga,
yangi sinf mavjud sinf a'zolarini meros qilib olishi kerakligini aniqlang. Mavjud sinf
yuqori sinf, yangi sinf esa kichik sinf deb ataladi. (C++ dasturlash tili
asosiy sinf sifatida yuqori sinfga va olingan sinf sifatida kichik sinfga ishora qiladi.) Kichik sinf
kelajakdagi kichik sinflar uchun supersinfga aylanishi mumkin.
Subklass o'z maydonlari va usullarini qo'shishi mumkin. Shuning uchun kichik sinf aniqroqdir
o'zining yuqori sinfiga qaraganda va ob'ektlarning ko'proq ixtisoslashgan guruhini ifodalaydi. Subklass ko'rgazmalari
o'zining yuqori sinfining xatti-harakatlari va bu xatti-harakatlarni mos ravishda ishlashi uchun o'zgartirishi mumkin.
birinchi navbatda pastki sinf uchun. Shuning uchun merosxo'rlik ba'zan mutaxassislik deb ataladi.
To'g'ridan-to'g'ri supersinf - bu pastki sinf aniq meros qilib olinadigan yuqori sinf. An
bilvosita supersinf - bu sinf ierarxiyasidagi to'g'ridan-to'g'ri yuqori sinfdan yuqori bo'lgan har qanday sinf
sinflar orasidagi meros munosabatlarini belgilaydi - 9.2-bo'lim, diagrammalarda ko'rishingiz mumkin
bu munosabatlarni tushunishga yordam beradi. Java-da sinf ierarxiyasi sinfdan boshlanadi
Java-dagi har bir sinf to'g'ridan-to'g'ri yoki bilvosita kengaytiriladigan ob'ekt (java.lang paketida).
"meros oladi"). 9.6-bo'limda barchaga meros bo'lib qolgan Ob'ekt sinfining usullari keltirilgan
boshqa Java sinflari. Java faqat bitta merosni qo'llab-quvvatlaydi, unda har bir sinf olinadi
aynan bitta to'g'ridan-to'g'ri superklassdan. C++ dan farqli o'laroq, Java bir nechta merosni qo'llab-quvvatlamaydi
(bu sinf bir nechta to'g'ridan-to'g'ri superklassdan olinganida sodir bo'ladi). 10-bob,
Ob'ektga yo'naltirilgan dasturlash: Polimorfizm va interfeyslar, Java-dan qanday foydalanishni tushuntiradi
bog'lanishdan qochib, bir nechta merosning ko'pgina afzalliklarini amalga oshirish uchun interfeyslar.
berilgan muammolar.

9.1 Kirish


9.2 Yuqori sinflar va kichik sinflar
9.3 Himoyalangan a'zolar
9.4 Superklasslar va o'rtasidagi munosabatlar
Kichik sinflar
9.4.1 Yaratish va foydalanish a
Komissiya xodimlari sinfi
9.4.2 Yaratish va foydalanish a
BasePlusCommissionEmployee Class
9.4.3 Komissiya xodimini yaratish –
BasePlusCommission xodimi
Meros ierarxiyasi
9.4.4 Komissiya xodimi –
BasePlusCommission xodimi
Himoyalangan holda meros ierarxiyasi
Namuna o'zgaruvchilari

9.4.5 Komissiya xodimi –


BasePlusCommission xodimi
Meros ierarxiyasidan foydalanish
xususiy misol o'zgaruvchilari
9.5 Kichik sinflardagi konstruktorlar
9.6 Sinf ob'ekti
9.7 (ixtiyoriy) GUI va Grafika
Case Study: Matnni ko'rsatish va
Yorliqlar yordamida tasvirlar
9.8 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar


362 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

Biz o'zaro bog'liqlik va mavjud munosabatlarni ajratamiz. - bu vakili
meros yuboradi. Is-a munosabatlarida kichik sinf ob'ekti ham ob'ekt sifatida ko'rib chiqilishi mumkin
o'zining yuqori sinfiga kiradi - masalan, avtomobil - bu transport vositasi. Aksincha, has-a kompozitsiyani ifodalaydi (qarang
8-bob). Ha-a munosabatlarida ob'ekt a'zolar sifatida boshqa ob'ektlarga havolalarni o'z ichiga oladi -
masalan, mashinada rul bor (va avtomobil ob'ektida rul g'ildiragi ob'ektiga ishora mavjud).
Yangi sinflar sinf kutubxonalaridagi sinflardan meros bo'lishi mumkin. Tashkilotlar o'zlarini rivojlantiradilar
o'z sinf kutubxonalariga ega va butun dunyo bo'ylab mavjud bo'lgan boshqalardan foydalanishi mumkin. Bir kun, ko'pchilik
yangi dasturiy ta'minot, ehtimol standartlashtirilgan qayta foydalanish mumkin bo'lgan komponentlardan qurilgan bo'lishi mumkin
avtomobillar va ko'pgina kompyuter texnikasi bugungi kunda qurilgan. Bu ishni osonlashtiradi
yanada kuchli, mo'l va tejamkor dasturiy ta'minotning jadal rivojlanishi.
9.2 Yuqori sinflar va kichik sinflar
Ko'pincha bir sinfning ob'ekti boshqa sinfning ob'ekti bo'ladi. Masalan, avtomobil krediti
Uy-joyni yaxshilash kreditlari va ipoteka kreditlari kabi kreditdir. Shunday qilib, Java-da CarLoan klassi
sinf Kreditidan meros deb aytish mumkin. Shu nuqtai nazardan, sinf krediti yuqori sinf va sinfdir
CarLoan - bu kichik sinf. Avtomobil krediti - bu kreditning o'ziga xos turi, ammo buni da'vo qilish noto'g'ri
har bir kredit - bu avtomobil krediti - bu kredit har qanday turdagi kredit bo'lishi mumkin. 9.1-rasmda bir nechta oddiy ro'yxatlar keltirilgan
Yuqori sinflar va kichik sinflarga misollar - yuqori sinflar odatda "umumiyroq" va kichikroq bo'ladi.
sinflar "aniqroq".

Chunki har bir kichik sinf ob'ekti o'zining yuqori sinfining ob'ekti bo'lib, bitta supersinf bo'lishi mumkin


ko'p kichik sinflar, superklass bilan ifodalangan ob'ektlar to'plami ko'pincha to'plamdan kattaroqdir
uning har qanday kichik sinflari bilan ifodalangan ob'ektlar. Masalan, super klass Vehicle taqdim etadi.
avtomobillar, yuk mashinalari, qayiqlar, velosipedlar va boshqalarni o'z ichiga olgan barcha transport vositalarini yuboradi. Aksincha, pastki sinf Avtomobil
avtomobillarning kichikroq, aniqroq to'plamini ifodalaydi.
Universitet hamjamiyati a'zosi ierarxiyasi
Meros munosabatlari daraxtsimon ierarxik tuzilmalarni hosil qiladi. Yuqori sinf ierarxiyada mavjud.
uning kichik sinflari bilan archik munosabatlar. Keling, namunaviy sinf ierarxiyasini ishlab chiqaylik (9.2-rasm),
meros ierarxiyasi deb ham ataladi. Universitet hamjamiyati minglab a'zolarga ega,
shu jumladan xodimlar, talabalar va bitiruvchilar. Xodimlar o'qituvchilar yoki xodimlardir.
Fakultet professor-o‘qituvchilari ma’murlar (masalan, dekanlar va kafedra mudirlari) yoki
o'qituvchilar. Ierarxiya boshqa ko'plab sinflarni o'z ichiga olishi mumkin. Masalan, talabalar bo'lishi mumkin
magistratura yoki bakalavriat talabalari. Bakalavr talabalari birinchi, ikkinchi kurs talabalari bo'lishi mumkin.
odatlar, yoshlar yoki qariyalar.

Superklass pastki sinflari

Talaba magistratura talabasi, bakalavr talabasi
Shakl doira, uchburchak, to'rtburchak, shar, kub
Kredit avtomobil krediti, uyni obodonlashtirish krediti, ipoteka krediti
Xodimlar fakulteti, Xodimlar
Bank hisobini tekshirishHisob, omonat hisobi

9.1-rasm | Merosga misollar.


9.2 Yuqori sinflar va kichik sinflar 363

Ierarxiyadagi har bir strelka is-a munosabatlarini ifodalaydi. Biz o'qlarni kuzatib borganimizda
Bu sinf ierarxiyasida yuqoriga qarab, masalan, “Xodim - bu a
Jamiyat aʼzosi” va “Oʻqituvchi fakultet aʼzosi”. Communitymember to'g'ridan-to'g'ri
Xodim, talaba va bitiruvchining yuqori sinfi va boshqa barcha sinflarning bilvosita yuqori sinfidir.
diagrammadagi sinflar. Pastki qismdan boshlab, siz o'qlarni kuzatib, amal qilishingiz mumkin
- eng yuqori darajadagi yuqori darajadagi munosabatlar. Masalan, Administrator - bu fakt.
asosiy a'zo, Xodim, Jamiyat a'zosi va, albatta, Ob'ekt.
Shakl ierarxiyasi
Endi 9.3-rasmdagi Shakl merosi ierarxiyasini ko'rib chiqing. Bu ierarxiya su-
TwoDimensionalShape va ThreeDim- pastki sinflari tomonidan kengaytirilgan perclass Shape
ensionalShape - Shakllar ikki o'lchovli yoki uch o'lchovli shakllardir.
Ushbu ierarxiyaning uchinchi darajasi TwoDimensionalShapes va maxsus turlarini o'z ichiga oladi
Uch o'lchovli shakllar. 9.2-rasmda bo'lgani kabi, biz pastki qismidagi o'qlarni kuzatishimiz mumkin
bir nechta munosabatlarni aniqlash uchun ushbu sinf ierarxiyasidagi eng yuqori darajadagi yuqori sinf diagrammasi.
kemalar. Misol uchun, uchburchak ikki o'lchovli shakl bo'lib, shakl, shar esa
uch o'lchovli shakl va shakldir. Ushbu ierarxiya boshqa ko'p narsalarni o'z ichiga olishi mumkin
sinflar. Masalan, ellips va trapetsiya ham ikki o'lchovli shakldir.

9.2-rasm | Universitet CommunityMembers uchun meros ierarxiyasi UML sinf diagrammasi.

9.3-rasm | Shakllar uchun meros ierarxiyasi UML sinf diagrammasi.

Talaba


Jamiyat a'zosi

Administrator

Xodim bitiruvchisi

Fakultet hodimlari

O'qituvchi

Uch o'lchovli shakl

Doira Kvadrat Uchburchak Sfera Kub Tetraedr

Shakl


Ikki o'lchovli shakl

364 9-bob Obyektga yo‘naltirilgan dasturlash: Meros



Har bir sinf munosabatlari meros munosabatlari emas. 8-bobda biz muhokama qildik
has-a munosabati, bunda sinflar boshqa ob'ektlarga havola bo'lgan a'zolarga ega
sinflar. Bunday munosabatlar mavjud sinflar tarkibiga ko'ra sinflarni yaratadi. Masalan,
Xodim, Tug'ilgan sana va TelefonNumber sinflarini hisobga olgan holda,
Xodim tug'ilgan sana yoki xodim telefon raqami. Biroq, an
Xodimning tug'ilgan sanasi va xodimning telefon raqami bor.
Yuqori sinf ob'ektlari va pastki sinf ob'ektlari bilan xuddi shunday munosabatda bo'lish mumkin - ularning umumiy -
o'ziga xoslik yuqori sinf a'zolarida ifodalanadi. Kengaytirilgan barcha sinflarning ob'ektlari a
umumiy supersinfni ushbu supersinf ob'ektlari sifatida ko'rish mumkin - bunday ob'ektlarda is-a mavjud
supersinf bilan aloqasi. Keyinchalik ushbu bobda va 10-bobda biz ko'rib chiqamiz
is-a munosabatlaridan foydalanadigan ko'plab misollar.
Subklass o'zining yuqori sinfidan meros bo'lgan usullarni sozlashi mumkin. Buning uchun,
pastki sinf superklass usulini tegishli amalga oshirish bilan bekor qiladi (qayta belgilaydi),
biz bobning kod misollarida ko'rib chiqamiz.
9.3 Himoyalangan a'zolar
8-bobda umumiy va xususiy kirish modifikatorlari muhokama qilingan. Bir sinfning umumiy a'zolari
Dasturda shu sinf ob'ektiga yoki uning quyi ob'ektlaridan biriga havola bo'lgan hamma joyda foydalanish mumkin.
sinflar. Sinfning shaxsiy a'zolariga faqat sinfning o'zida kirish mumkin. Ushbu bo'limda,
biz himoyalangan kirish modifikatorini kiritamiz. Himoyalangan kirishdan foydalanish vositachini taklif qiladi.
davlat va xususiy o'rtasidagi kirish darajasini yedi. Superklassning himoyalangan a'zolari bo'lishi mumkin
ushbu yuqori sinf a'zolari, uning kichik sinflari a'zolari va a'zolari tomonidan foydalaniladi
xuddi shu paketdagi boshqa sinflar - himoyalangan a'zolar ham paketga kirish huquqiga ega.
Barcha ochiq va himoyalangan superklass a'zolari o'zlarining original kirish modifikatorlarini saqlab qolishadi
ular kichik sinf a'zolariga aylanganda - yuqori sinfning jamoat a'zolariga aylanadi
kichik sinfning jamoat a'zolari va yuqori sinfning himoyalangan a'zolari pro-klassga aylanadi.
kichik sinfning tanlangan a'zolari. Superklassning shaxsiy a'zolariga tashqarida kirish mumkin emas
sinfning o'zi. Aksincha, ular uning pastki sinflaridan yashiringan va ularga faqat orqali kirish mumkin
yuqori sinfdan meros bo'lib qolgan ommaviy yoki himoyalangan usullar.
Subklass usullari dan meros qolgan umumiy va himoyalangan a'zolarga murojaat qilishi mumkin
oddiygina a'zo nomlaridan foydalangan holda superklass. Subklass usuli merosni bekor qilganda
Yuqori sinf usuli bo'lsa, usulning yuqori sinf versiyasiga quyi qismdan kirish mumkin.
super kalit so'zi va nuqta (.) bilan superclass usuli nomidan oldin sinf.
ajratuvchi. Biz 9.4-bo'limda yuqori sinfning bekor qilingan a'zolariga kirishni muhokama qilamiz.
Dasturiy ta'minot muhandisligi kuzatuvi 9.1
Subklassning usullari o'zlarining yuqori sinflarining shaxsiy a'zolariga bevosita kira olmaydi. A
pastki sinf xususiy supersinf namunasi o'zgaruvchilari holatini faqat bo'lmaganlar orqali o'zgartirishi mumkin.
yuqori sinfda taqdim etilgan va kichik sinf tomonidan meros qilib olingan xususiy usullar.

Dasturiy ta'minot muhandisligi kuzatuvi 9.2


Shaxsiy misol o'zgaruvchilarini e'lon qilish tizimlarni sinab ko'rish, disk raskadrovka qilish va to'g'ri o'zgartirishga yordam beradi.
Agar pastki sinf o'zining yuqori sinfining shaxsiy misol o'zgaruvchilariga kira olsa, meros qilib olgan sinflar
ushbu kichik sinfdan misol o'zgaruvchilariga ham kirishi mumkin. Bu kirishni targ'ib qiladi
xususiy misol o'zgaruvchilari nima bo'lishi kerakligi va ma'lumotlarni yashirishning afzalliklari
yo'qolgan bo'lardi.

9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 365



9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat
Endi biz kompaniyaning ish haqi fondidagi xodimlar turlarini o'z ichiga olgan meros ierarxiyasidan foydalanamiz
yuqori sinf va uning pastki sinf o'rtasidagi munosabatni muhokama qilish uchun ilova. Bu jamoada
pany, komissiya xodimlari (ular yuqori sinf ob'ektlari sifatida taqdim etiladi) maosh oladi a
ularning sotuvi foizi, asosiy ish haqi bo'lgan komissiya xodimlari (ular vakillik qiladilar
kichik sinf ob'ektlari sifatida) asosiy ish haqini va ularning sotuvining foizini oladi.
Biz ushbu sinflar o'rtasidagi munosabatlarni muhokama qilishni beshta misolga ajratamiz.
Birinchisi, Object sinfidan to'g'ridan-to'g'ri merosxo'r bo'lgan CommissionEmployee sinfini e'lon qiladi
va shaxsiy misol o'zgaruvchilari sifatida ism, familiya, ijtimoiy xavfsizlik raqamini e'lon qiladi,
komissiya stavkasi va yalpi (ya'ni, jami) savdo summasi.
Ikkinchi misol BasePlusCommissionEmployee sinfini e'lon qiladi, bu ham bevosita
Ob'ekt sinfidan meros bo'lib, shaxsiy misol o'zgaruvchilari nomini, familiyasini e'lon qiladi
nomi, ijtimoiy sug'urta raqami, komissiya stavkasi, yalpi savdo miqdori va asosiy ish haqi. Biz
sinf talab qiladigan har bir kod satrini yozish orqali ushbu sinfni yarating - tez orada bu juda ko'p ekanligini ko'ramiz
KomissiyaEmployee sinfidan meros qilib, uni yaratish samaraliroq.
Uchinchi misol kengaytirilgan yangi BasePlusCommissionEmployee sinfini e'lon qiladi
ClassCommissionEmployee (ya'ni, BasePlusCommissionEmployee - bu komissiya xodimi-
asosiy maoshga ega bo'lgan xodim). Ushbu dasturni qayta ishlatish bizga kamroq kod yozish imkonini beradi
yangi kichik sinfni ishlab chiqish. Ushbu misolda BasePlusCommissionEmployee sinfi
Komissiya xodimining shaxsiy a'zolariga kirishga urinish - bu kompilyatsiyaga olib keladi.
latsion xatolar, chunki pastki sinf supersinfning shaxsiy misol o'zgaruvchilariga kira olmaydi.
To'rtinchi misol shuni ko'rsatadiki, komissiya xodimining misol o'zgaruvchilari bo'lsa
himoyalangan deb e'lon qilingan BasePlusCommissionEmployee kichik klassi ushbu ma'lumotlarga kirishi mumkin
bevosita. Ikkala BasePlusCommissionEmployee sinfi ham bir xil funksionallikni o'z ichiga oladi, lekin
biz meros qilib olingan versiyani yaratish va boshqarish qanchalik oson ekanligini ko'rsatamiz.
Himoyalangan namuna o'zgaruvchilardan foydalanish qulayligini muhokama qilganimizdan so'ng, biz yaratamiz
Beshinchi misol, KomissiyaEmployee namunasi o'zgaruvchilarni xususiyga qaytaradi
yaxshi dasturiy ta'minot muhandisligini ta'minlash. Keyin biz BasePlusCommissionEm-
ishchi kichik klassi manipulyatsiya qilish uchun komissiya xodimining umumiy usullaridan foydalanishi mumkin (birlashmada).
trolled tarzda) komissiya xodimidan meros qilib olingan shaxsiy misol o'zgaruvchilari.
9.4.1 Komissiya xodimlari sinfini yaratish va undan foydalanish
Biz ClassEmployee sinfini e'lon qilishdan boshlaymiz (9.4-rasm). 4-qator darsni pasaytiradi
laration va CommissionEmployee sinfi Ob- sinfini kengaytirishini (ya'ni, meros qilib olishini) bildiradi.
ject (java.lang paketidan). Bu KomissiyaEmployee sinfining sinfni meros qilib olishiga olib keladi
Ob'ekt usullari - sinf Ob'ektida hech qanday maydon yo'q. Agar aniq belgilamasangiz
yangi sinf qaysi sinfni kengaytirsa, sinf Ob'ektni bilvosita kengaytiradi. Shu sababli, siz
odatda sizning kodingizga "kengaytiruvchi ob'ekt" ni kiritmaydi - biz buni bitta misolda qilamiz
faqat namoyish qilish uchun.
Sinf komissiyasi xodimlarining usullari va misol o'zgaruvchilari haqida umumiy ma'lumot
Sinf komissiyasi Xodimning davlat xizmatlariga konstruktor (13-34-qatorlar) va
usullari daromad (satr 87-90) va toString (satr 93-101). 37-52-qatorlar e'lon qilinadi
sinfning yakuniy namunasi o'zgaruvchilari uchun lic get usullari (6-8 qatorlarda e'lon qilingan) firstName,
familiya va ijtimoiy xavfsizlik raqami. Ushbu uchta misol o'zgaruvchilari yakuniy deb e'lon qilinadi
chunki ular ishga tushirilgandan keyin o'zgartirilishi shart emas - shuning uchun biz ham shunday qilamiz

366 9-bob Ob'ektga yo'naltirilgan dasturlash: Meros

mos keladigan usullarni taqdim etmaydi. 55-84 qatorlar ommaviy to'plam va olish usullarini e'lon qiladi
sinfning yalpi sotuvlari va komissiyasi oʻzgaruvchilari uchun (9–10-qatorlarda eʼlon qilingan).
Sinf o'zining misol o'zgaruvchilarini shaxsiy deb e'lon qiladi, shuning uchun boshqa sinflar ob'ektlari o'zgartira olmaydi.
ushbu o'zgaruvchilarga to'g'ridan-to'g'ri kirish.

1 // 9.4-rasm: CommissionEmployee.java


2 // Komissiya Xodimlar sinfi to'langan xodimni ifodalaydi a
3 // yalpi savdo ulushi.
4
5 {
6 shaxsiy yakuniy String firstName;
7 shaxsiy yakuniy String familiyasi;
8 xususiy yakuniy String socialSecurityNumber;
9 ta xususiy er-xotin yalpi savdo; // yalpi haftalik savdo
10 shaxsiy ikki martalik komissiya stavkasi; // komissiya foizi
11
12 // besh argumentli konstruktor
13 jamoat komissiyasi xodimi(String firstName, String familiyasi,
14 String SocialSecurityNumber, ikki barobar yalpi savdo,
15 ikki barobar komissiya stavkasi)
16 {
17 // Ob'ektning standart konstruktoriga yashirin chaqiruv bu erda sodir bo'ladi
18
19 // agar grossSales yaroqsiz bo'lsa, istisno qiling
20 agar (yalpi savdo <0,0)
21 yangi IllegalArgumentException (
22 "Yalpi savdo >= 0,0 bo'lishi kerak");
23
24 // agar komissiyaRate yaroqsiz bo'lsa, istisno qilish
25 bo'lsa (komissiya darajasi <= 0,0 || komissiya darajasi >= 1,0)
26 yangi IllegalArgumentException (
27 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
28
29 this.firstName = firstName;
30 this.lastName = familiya;
31 this.socialSecurityNumber = socialSecurityNumber;
32 this.grossSales = yalpi savdo;
33 this.commissionRate = komissiya stavkasi;
34 } // yakunlovchi konstruktor
35
36 // ismni qaytaring
37 ommaviy string getFirstName()
38 {
39 nomini qaytarish;
40 }
41
42 // familiyani qaytarish
43 ommaviy string getLastName()
44 {
45 familiyasini qaytarish;
46 }
9.4-rasm | Komissiya Xodimlar toifasi yalpi savdoning bir foizini to'lagan xodimni ifodalaydi.
(3-qismning 1-qismi.)

umumiy sinf komissiyasi xodimi Ob'ektni kengaytiradi


9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 367

47
48 // ijtimoiy xavfsizlik raqamini qaytaring
49 ommaviy string getSocialSecurityNumber()
50 {
51 ijtimoiy xavfsizlik raqamini qaytarish;
52 }
53
54 // yalpi savdo miqdorini belgilang
55 ommaviy bekor to'plamGrossSales(ikki marta yalpi savdo)
56 {
57 agar (yalpi savdo <0,0)
58 yangi IllegalArgumentException (
59 "Yalpi savdo >= 0,0 bo'lishi kerak");
60
61 this.grossSales = yalpi savdo;
62 }
63
64 // yalpi savdo summasini qaytaring
65 ommaviy ikkilik getGrossSales()
66 {
67 daromadli yalpi savdo;
68 }
69
70 // komissiya stavkasini belgilang
71 ommaviy bekor to'plamiKomissiyaRate(ikki martalik komissionRate)
72 {
73 agar (komissiya darajasi <= 0,0 || komissiya darajasi >= 1,0)
74 yangi IllegalArgumentException (
75 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
76
77 this.commissionRate = komissiya darajasi;
78 }
79
80 // qaytarish komissiyasi stavkasi
81 umumiy ikki marta getCommissionRate()
82 {
83 qaytish komissiyasi stavkasi;
84 }
85
86
87
88
89
90
91
92
93
94
95
96
97
98
9.4-rasm | Komissiya Xodimlar toifasi yalpi savdoning bir foizini to'lagan xodimni ifodalaydi.
(3 qismning 2-qismi.)

// daromadni hisoblash


davlat ikki baravar daromad ()
{
qaytarish komissiyasiRate * yalpi savdo;
}

// CommissionEmployee ob'ektining string tasvirini qaytarish


@Override // bu usul superklass usulini bekor qilishini bildiradi
umumiy string toString()
{
return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f",
"komissiya xodimi", ismi, familiyasi,
"ijtimoiy xavfsizlik raqami", ijtimoiy xavfsizlik raqami,

368 9-bob Obyektga yo‘naltirilgan dasturlash: Meros



Sinf komissiyasi Xodimlarning konstruktori
Konstruktorlar meros qilib olinmaydi, shuning uchun ClassEmployee sinfi sinfni meros qilib olmaydi
Ob'ekt konstruktori. Biroq, superklass konstruktorlari hali ham chaqirilishi mumkin
kichik sinflar. Aslida, Java har qanday kichik sinf konstruktorining birinchi vazifasi uni to'g'ridan-to'g'ri chaqirish bo'lishini talab qiladi
superclass konstruktorini aniq yoki bilvosita (agar konstruktor chaqiruvi ko'rsatilmagan bo'lsa)
supersinfdan meros qilib olingan misol o'zgaruvchilari to'g'ri ishga tushirilganligiga ishonch hosil qiling. The
yuqori sinf konstruktorini chaqirish sintaksisi 9.4.3-bo'limda aniq ko'rib chiqiladi. Bunda
Misol uchun, ClassCommissionEmployee ning konstruktori sinf Ob'ektining konstruktorini implic-
aniq. Agar kod superklass konstruktoriga aniq qo'ng'iroqni o'z ichiga olmasa, Java implic-
u superklassning standart yoki argumentsiz konstruktorini chaqiradi. 17-qatordagi sharh
9.4-rasmda yuqori sinf Ob'ektining standart konstruktoriga yashirin chaqiruv qayerda ekanligi ko'rsatilgan.
qilingan (siz bu qo'ng'iroq uchun kodni yozmaysiz). Ob'ektning standart konstruktori hech narsa qilmaydi.
Agar sinfda konstruktorlar bo'lmasa ham, kompilyatorning standart konstruktori
sinf uchun qat'iy ravishda e'lon qiladi, superklassning standart yoki argumentsiz konstruktorini chaqiradi.
Ob'ekt konstruktoriga yashirin chaqiruvdan so'ng, 20-22 va 25-27 qatorlar
yalpi savdo va komissiya darajasi argumentlari. Agar ular to'g'ri bo'lsa (ya'ni, konstruktor
IllegalArgumentException ni tashlamaydi), 29-33 qatorlar konstruktorni tayinlaydi
sinfning misol o'zgaruvchilari uchun argumentlar.
Biz firstName, Familiya va socialSecu- argumentlarining qiymatlarini tasdiqlamadik.
rityNumber ni tegishli misol o'zgaruvchilariga tayinlashdan oldin. Biz baholay olamiz -
ism va familiyalarni sanab bering - ehtimol ular o'rtacha uzunlikda ekanligiga ishonch hosil qilish uchun.
Xuddi shunday, ijtimoiy xavfsizlik raqami oddiy iboralar yordamida tasdiqlanishi mumkin
(14.7-bo'lim) tire yoki chiziqsiz to'qqiz raqamdan iborat bo'lishini ta'minlash uchun (masalan, 123-45-
6789 yoki 123456789).
Sinf komissiyasi Xodimlarning daromadlari usuli
Usul daromadlari (87–90-qatorlar) komissiya xodimining daromadini hisoblab chiqadi. 89-qator
komissiya stavkasini yalpi savdoga ko'paytiradi va natijani qaytaradi.
Sinf komissiyasi xodimining toString usuli va @Override izohi
Method toString (93–101-qatorlar) maxsus - bu har bir sinfga tegishli usullardan biri.
to'g'ridan-to'g'ri yoki bilvosita ob'ekt sinfidan (9.6-bo'limda umumlashtirilgan). toString usuli
ob'ektni ifodalovchi Stringni qaytaradi. Ob'ekt bo'lishi kerak bo'lganda, u bilvosita chaqiriladi
String tasviriga aylantiriladi, masalan, ob'ekt printf orqali chiqarilganda yoki out-
%s format spetsifikatsiyasi orqali String usuli formatiga qo'ying. Sinf ob'ektining toString usuli -
od ob'ekt sinfining nomini o'z ichiga olgan Stringni qaytaradi. Bu birinchi navbatda to'ldiruvchi
ning tegishli String ko'rinishini belgilash uchun pastki sinf tomonidan bekor qilinishi mumkin
subklass ob'ektidagi ma'lumotlar. Komissiya sinfining satrining usuli Xodimlarni bekor qiladi (qayta -
jarimalar) sinfi Ob'ektning toString usuli. Chaqirilsa, komissiya xodimining toString

99
100


101
102 } // yakuniy sinf komissiyasi xodimi
9.4-rasm | Komissiya Xodimlar toifasi yalpi savdoning bir foizini to'lagan xodimni ifodalaydi.
(3 qismning 3-qismi.)

"yalpi savdo", yalpi savdo,


"komissiya stavkasi", komissiya stavkasi);
}

9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 369

usuli haqida ma'lumotni o'z ichiga olgan Stringni qaytarish uchun String usuli formatidan foydalanadi
Komissiya xodimi. Superklass usulini bekor qilish uchun pastki sinf usulni e'lon qilishi kerak
bir xil imzo bilan (usul nomi, parametrlar soni, parametr turlari va tartibi
parametr turlari) superklass usuli sifatida - Ob'ektning toString usuli hech qanday vaqt talab qilmaydi.
rameters, shuning uchun CommissionEmployee hech qanday parametrsiz toString e'lon qiladi.
93-qator quyidagini ko'rsatish uchun ixtiyoriy @Override izohidan foydalanadi
usul deklaratsiyasi (ya'ni, toString) mavjud superklass usulini bekor qilishi kerak. Bu
Annotatsiya kompilyatorga bir nechta keng tarqalgan xatolarni aniqlashga yordam beradi. Misol uchun, bu holda, siz
kichik “t” harfi bilan yozilgan toString superklass usulini bekor qilmoqchi va
bosh harf "S." Agar siz beixtiyor kichik “s” dan foydalansangiz, kompilyator buni a sifatida belgilaydi
xato, chunki supersinfda toString nomli usul mavjud emas. Agar foydalanmagan bo'lsangiz
@Override izohi, toString butunlay boshqacha usul bo'ladi
Agar String kerak bo'lganda komissiya xodimi ishlatilsa, chaqirilmaydi.
Yana bir keng tarqalgan xato - bu noto'g'ri raqam yoki parametr turlarini e'lon qilish.
eters parametrlar ro'yxatida. Bu superklass usulining tasodifiy ortiqcha yuklanishini keltirib chiqaradi,
mavjud usulni bekor qilish o'rniga. Agar siz usulni chaqirishga harakat qilsangiz (bilan
parametrlarning to'g'ri soni va turlari) pastki sinf ob'ektida, supersinf versiyasida
chaqiriladi - bu nozik mantiqiy xatolarga olib kelishi mumkin. Kompilyator a bilan uchrashganda
@Override bilan e'lon qilingan usul, u usulning imzosini superklass bilan solishtiradi
usul imzolari. Agar aniq moslik bo'lmasa, kompilyator xato xabari chiqaradi, masalan
chunki "usul supertipdagi usulni bekor qilmaydi yoki amalga oshirmaydi." O'shanda qilasan
usulingiz imzosini superklassdagi biriga mos kelishi uchun tuzating.

Sinf komissiyasi Employee Test


9.5-rasm Komissiya xodimi sinfini sinovdan o'tkazadi. 9-10 qatorlar komissiya xodimini ko'rsatadi
ob'ektni kiriting va ishga tushirish uchun CommissionEmployee's konstruktorini chaqiring (9.4-rasmning 13-34-qatorlari).
ism sifatida "Sue", familiya sifatida "Jons", ijtimoiy himoya sifatida "222-22-2222".
rity raqami, yalpi savdo summasi sifatida 10 000 ($10 000) va komissiya stavkasi sifatida .06 (ya'ni,
6%). 15–24-qatorlar obyektning namunasini olish uchun komissiya xodimining olish usullaridan foydalanadi -
chiqish uchun o'zgaruvchan qiymatlar. 26-27 qatorlar ob'ektning setGrossSales va setCommis-ni chaqiradi.
Yalpi savdo va komissiya misol o'zgaruvchilari qiymatlarini o'zgartirish uchun sionRate usullari

Xatolarning oldini olish bo'yicha maslahat 9.1


@Override izohi ixtiyoriy bo'lsa ham, u bilan bekor qilingan usullarni e'lon qiling.
kompilyatsiya vaqtida ularning imzolarini to'g'ri belgilaganingizga ishonch hosil qiling. Har doim qilish yaxshidir
xatolarni ishlash vaqtida emas, balki kompilyatsiya vaqtida toping. Shu sababli, toString usullari
7.9-rasmda va 8-bobdagi misollar @Override bilan e'lon qilinishi kerak edi.

Umumiy dasturlash xatosi 9.1


Cheklangan kirish modifikatori bilan usulni bekor qilish kompilyatsiya xatosi — a
ommaviy superklass usuli himoyalangan yoki xususiy subklass usuliga aylana olmaydi; tarafdori
Tekshirilgan yuqori sinf usuli xususiy subklass usuliga aylana olmaydi. Shunday qilish kerak edi
is-a munosabatlarini buzing, bu esa barcha kichik sinf ob'ektlari javob bera olishini talab qiladi
superklassda e'lon qilingan ommaviy usullarga qilingan usul chaqiruvlari. Agar ommaviy usul bo'lsa, mumkin
himoyalangan yoki xususiy usul sifatida bekor qilinsa, pastki sinf ob'ektlari qila olmaydi
superklass ob'ektlari bilan bir xil usul chaqiruvlariga javob berish. Usul ochiq deb e'lon qilingandan keyin
supersinfda usul ushbu sinfning barcha to'g'ridan-to'g'ri va bilvosita kichik sinflari uchun ochiq bo'lib qoladi.

370 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

Baho. 29–30 qatorlar yangilangan komissiya xodimining String ko'rinishini chiqaradi.
Ob'ekt %s format spetsifikatsiyasi yordamida chiqarilganda, ob'ektning toString usuli -
ob'ektning String tasvirini olish uchun bilvosita ovoz berdi. [Izoh: Ushbu bobda biz shunday qilamiz
har bir sinfda daromad usulini ishlatmang, lekin u 10-bobda keng qo'llaniladi.]

1 // 9.5-rasm: CommissionEmployeeTest.java


2 // Komissiya xodimlari sinfini sinovdan o'tkazish dasturi.
3
4 ochiq sinf komissiyasi EmployeeTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // CommissionEmployee obyektini yaratish
9
10
11
12 // komissiya xodimlarining ma'lumotlarini olish
13 System.out.println(
14 "Get usullari bilan olingan xodimlar ma'lumotlari:");
15 System.out.printf("%n%s %s%n", "Ismi",
16);
17 System.out.printf("%s %s%n", "Familiya",
18);
19 System.out.printf("%s %s%n", "Ijtimoiy himoya raqami",
20);
21 System.out.printf("%s %.2f%n", "Yalpi savdo",
22);
23 System.out.printf("%s %.2f%n", "Komissiya stavkasi",
24);
25
26
27
28
29 System.out.printf("%n%s:%n%n%n",
30 "toString tomonidan olingan yangilangan xodimlar ma'lumotlari", );
31 } // asosiyni tugatish
32 } // yakuniy klass KomissiyaEmployeeTest

Xodimlar to'g'risidagi ma'lumotlar get usullari bilan olinadi:

Ismingiz Sue
Familiyasi Jones
Ijtimoiy xavfsizlik raqami - 222-22-2222
Yalpi savdo - 10000,00
Komissiya stavkasi 0,06

ToString tomonidan olingan yangilangan xodimlar ma'lumotlari:

komissiya xodimi: Sue Jons
ijtimoiy xavfsizlik raqami: 222-22-2222
yalpi savdo: 5000.00
komissiya stavkasi: 0,10

9.5-rasm | Komissiya xodimlari sinfi test dasturi.

Komissiya xodimi = yangi komissiya xodimi(
"Sue", "Jons", "222-22-2222", 10000, .06);

staff.getFirstName()

staff.getLastName()

staff.getSocialSecurityNumber()

staff.getGrossSales()

staff.getCommissionRate()

staff.setGrossSales(5000);
staff.setCommissionRate(.1);

%s

xodim


9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 371

9.4.2 BasePlusCommissionEmployee sinfini yaratish va undan foydalanish
Endi biz merosga kirishimizning ikkinchi qismini e'lon qilish va sinovdan o'tkazish orqali muhokama qilamiz
(mutlaqo yangi va mustaqil) sinf BasePlusCommissionEmployee (9.6-rasm),
unda ism, familiya, ijtimoiy sug'urta raqami, yalpi savdo summasi, com-
missiya darajasi va asosiy ish haqi. Class BasePlusCommission Xodimlarning davlat xizmatlari
BasePlusCommissionEmployee konstruktorini (15–42-qatorlar) va daromad usullarini qo'shing
(111-114-qatorlar) va toString (117-126-qatorlar). 45-108 qatorlar ommaviy olish va o'rnatishni e'lon qiladi
sinfning shaxsiy misol o'zgaruvchilari uchun usullar (7-12 qatorlarda e'lon qilingan) firstName,
familiya, ijtimoiy xavfsizlik raqami, yalpi savdo, komissiya stavkasi va asosiy ish haqi.
Ushbu o'zgaruvchilar va usullar bazaviy ish haqining barcha zarur xususiyatlarini qamrab oladi.
missiya xodimi. Ushbu sinf va komissiya xodimi sinfi o'rtasidagi o'xshashlikka e'tibor bering
(9.4-rasm) — bu misolda biz bu o'xshashlikdan hali foydalanmaymiz.

1 // 9.6-rasm: BasePlusCommissionEmployee.java


2 // BasePlusCommissionEmployee sinfi qabul qiluvchi xodimni ifodalaydi
3 // komissiyaga qo'shimcha ravishda asosiy ish haqi.
4
5 ommaviy sinf BasePlusCommissionEmployee
6 {
7 shaxsiy yakuniy String firstName;
8 shaxsiy yakuniy String familiyasi;
9 xususiy yakuniy String socialSecurityNumber;
10 ta xususiy er-xotin yalpi savdo; // yalpi haftalik savdo
11 shaxsiy ikki tomonlama komissiyaRate; // komissiya foizi
12
13
14 // olti argumentli konstruktor
15 ommaviy BasePlusCommissionEmployee(String firstName, String Familiya,
16 String SocialSecurityNumber, ikki barobar yalpi savdo,
17 ikki baravar komissiya stavkasi, )
18 {
19 // Ob'ektning standart konstruktoriga yashirin chaqiruv bu erda sodir bo'ladi
20
21 // agar grossSales yaroqsiz bo'lsa, istisno qiling
22 agar (yalpi savdo <0,0)
23 yangi IllegalArgumentException (
24 "Yalpi savdo >= 0,0 bo'lishi kerak");
25
26 // agar komissiyaRate yaroqsiz bo'lsa, istisno qilish
27 bo'lsa (komissiya darajasi <= 0,0 || komissiya darajasi >= 1,0)
28 yangi IllegalArgumentException (
29 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
30
31
32
33
34
35
9.6-rasm | BasePlusCommissionEmployee klassi bazani olgan xodimni ifodalaydi
komissiyaga qo'shimcha ish haqi. (3-qismning 1-qismi.)

xususiy ikki barobar ish haqi; // haftalik asosiy ish haqi

ikki baravar ish haqi

// agar baseSalary yaroqsiz bo'lsa, istisno qiling


agar (asosiy ish haqi < 0,0)
yangi IllegalArgumentException (
"Asosiy ish haqi >= 0,0 bo'lishi kerak");

372 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

36 this.firstName = firstName;
37 this.lastName = familiya;
38 this.socialSecurityNumber = socialSecurityNumber;
39 this.grossSales = yalpi savdo;
40 this.commissionRate = komissiya darajasi;
41
42 } // yakunlovchi konstruktor
43
44 // ismni qaytaring
45 ommaviy string getFirstName()
46 {
47 nomini qaytarish;
48 }
49
50 // familiyani qaytaring
51 ommaviy string getLastName()
52 {
53 familiyasini qaytarish;
54 }
55
56 // ijtimoiy xavfsizlik raqamini qaytarish
57 ommaviy string getSocialSecurityNumber()
58 {
59 ijtimoiy xavfsizlik raqamini qaytarish;
60 }
61
62 // yalpi savdo miqdorini belgilang
63 ommaviy bekor to'plamGrossSales(ikki marta yalpi savdo)
64 {
65 agar (yalpi savdo <0,0)
66 yangi IllegalArgumentException (
67 "Yalpi savdo >= 0,0 bo'lishi kerak");
68
69 this.grossSales = yalpi savdo;
70 }
71
72 // yalpi savdo summasini qaytaring
73 umumiy juftlik getGrossSales()
74 {
75 daromadli yalpi savdo;
76 }
77
78 // komissiya stavkasini belgilang
79 ommaviy bekor to'plamiKomissiyaRate(ikki martalik komissionRate)
80 {
81 agar (komissiya darajasi <= 0,0 || komissiya darajasi >= 1,0)
82 yangi IllegalArgumentException (
83 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
84
85 this.commissionRate = komissiya stavkasi;
86 }
87
9.6-rasm | BasePlusCommissionEmployee klassi bazani olgan xodimni ifodalaydi
komissiyaga qo'shimcha ish haqi. (3 qismning 2-qismi.)

this.baseMaosh = asosiyMaosh;


9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 373

Class BasePlusCommissionEmployee 5-qatorda "Obyektni kengaytiradi" ni belgilamaydi, shuning uchun
sinf ob'ektni bilvosita kengaytiradi. Bundan tashqari, sinf komissiyasi xodimining konstruktori kabi
(9.4-rasmning 13–34-qatorlari), sinf BasePlusCommissionEmployee ning konstruktori sinfni chaqiradi
19-qatordagi izohda ta'kidlanganidek, ob'ektning standart konstruktori bevosita.
Class BasePlusCommissionEmployeening daromad usuli (111–114-qatorlar)
mahsulotiga BasePlusCommissionIshchining asosiy ish haqini qo'shish natijasi
komissiya stavkasi va xodimning yalpi savdosi.
Class BasePlusCommissionEmployee a qaytarish uchun toString ob'ekt usulini bekor qiladi
BasePlusCommissionEmployee ma'lumotlarini o'z ichiga olgan qator. Yana bir bor foydalanamiz

88 // qaytarish komissiyasi stavkasi


89 umumiy ikki marta getCommissionRate()
90 {
91 qaytarish komissiyasi stavkasi;
92 }
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 // daromadni hisoblash
111 davlat ikki barobar daromad ()
112 {
113
114 }
115
116 // BasePlusCommissionEmployee-ning string ko'rinishini qaytarish
117 @Bekor qilish
118 umumiy string toString()
119 {
120 qaytish String.format(
121 "%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f%n%s: %.2f",
122 , ism, familiya,
123 "ijtimoiy xavfsizlik raqami", ijtimoiy xavfsizlik raqami,
124 "yalpi savdo", yalpi savdo, "komissiya stavkasi", komissiya stavkasi,
125);
126 }
127 } // yakuniy sinf BasePlusCommissionEmployee
9.6-rasm | BasePlusCommissionEmployee klassi bazani olgan xodimni ifodalaydi
komissiyaga qo'shimcha ish haqi. (3 qismning 3-qismi.)

// asosiy ish haqini belgilash


davlat bekor to'plamiBaseMaosh(ikki martalik ish haqi)
{
agar (asosiy ish haqi < 0,0)
yangi IllegalArgumentException (
"Asosiy ish haqi >= 0,0 bo'lishi kerak");
this.baseMaosh = asosiyMaosh;
}

// asosiy ish haqini qaytarish


public double getBaseSalary()
{
asosiy ish haqini qaytarish;
}

Qaytish bazasiIsh haqi + (komissiyaRate * yalpi savdo);

"asosiy ish haqi bo'yicha komissiya xodimi"

"asosiy ish haqi", asosiy ish haqi


374 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

yalpi savdo, komissiya stavkasi va asosiy ish haqini ikkita bilan formatlash uchun %.2f format spetsifikatsiyasi
o'nli kasrning o'ng tomonidagi aniqlik raqamlari (121-satr).

Sinov sinfi BasePlusCommissionEmployee


9.7-rasm BasePlusCommissionEmployee sinfini sinovdan o'tkazadi. 9–11 qatorlar BasePlusCom-ni yaratadi
missionEmployee ob'ekti va "Bob", "Lyuis", "333-33-3333", 5000, .04 va 300 ni o'tkazing
ism, familiya, ijtimoiy sug'urta raqami, yalpi savdo, komissiya sifatida konstruktor
mos ravishda stavka va bazaviy ish haqi. 16–27 qatorlar BasePlusCommissionEmployee'sdan foydalanadi
chiqish uchun ob'ekt namunasi o'zgaruvchilari qiymatlarini olish usullarini olish. 29-qator
asosiy ish haqini o'zgartirish uchun ob'ektning setBaseSalary usulini chaqiradi. SetBaseSal usuli -
ary (9.6-rasm, 95–102-qatorlar) misol oʻzgaruvchisi baseMaosh tayinlanmaganligini taʼminlaydi.
salbiy qiymat. 9.7-rasmdagi 33-qator ob'ektni olish uchun toString usulini aniq chaqiradi.
String tasviri.

1 // 9.7-rasm: BasePlusCommissionEmployeeTest.java


2 // BasePlusCommissionEmployee test dasturi.
3
4 ommaviy sinf BasePlusCommissionEmployeeTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // BasePlusCommissionEmployee obyektini yaratish
9
10
11
12
13 // bazaviy ish haqi komissiyasi xodimi ma'lumotlarini olish
14 System.out.println(
15 "Get usullari bilan olingan xodimlar haqida ma'lumot:% n");
16 System.out.printf("%s %s%n", "Ismi",
17);
18 System.out.printf("%s %s%n", "Familiya",
19);
20 System.out.printf("%s %s%n", "Ijtimoiy himoya raqami",
21);
22 System.out.printf("%s %.2f%n", "Yalpi savdo",
23);
24 System.out.printf("%s %.2f%n", "Komissiya stavkasi",
25);
26 System.out.printf("%s %.2f%n", "Asosiy ish haqi",
27);
28
29
30
31 System.out.printf("%n%s:%n%n%s%n",
32 "toString tomonidan olingan yangilangan xodimlar ma'lumotlari",
33);
34 } // asosiyni tugatish
35 } // yakuniy sinf BasePlusCommissionEmployeeTest
9.7-rasm | BasePlusCommissionEmployee test dasturi. (2-qismning 1-qismi.)

BasePlusCommissionEmployee xodimi =


yangi BasePlusCommissionEmployee(
"Bob", "Lyuis", "333-33-3333", 5000, .04, 300);

staff.getFirstName()

staff.getLastName()

staff.getSocialSecurityNumber()

staff.getGrossSales()

staff.getCommissionRate()

staff.getBaseSalary()

staff.setBaseSlary(1000);

staff.toString()

9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 375

Class BasePlusCommissionEmployee haqida eslatmalar
BasePlusCommissionEmployee sinfining ko'p qismi (9.6-rasm) shunga o'xshash yoki bir xil.
sinf komissiyasining xodimi (9.4-rasm). Masalan, xususiy misol o'zgaruvchilari
firstName va familiya va usullari setFirstName, getFirstName, setLastName va
getLastName Komissiya xodimi sinfi bilan bir xil. Sinflar ham ikkalasi
shaxsiy misol o'zgaruvchilari sotsialSecurityNumber, komissiya darajasi va gross-
Sotish va tegishli olish va sozlash usullari. Bundan tashqari, BasePlusCommissionEm-
ployee konstruktori komissiya xodimi klassi bilan deyarli bir xil, bundan tashqari
BasePlusCommissionEmployee konstruktori shuningdek, baseSalary ni o'rnatadi. Boshqa qo'shimcha -
BasePlusCommissionEmployee klassi xususiy misol o'zgaruvchisi baseMaoshdir
va setBaseSalary va getBaseSalary usullari. Class BasePlusCommissionEmployee's
toString usuli KomissiyaEmployee klassi bilan deyarli bir xil, bundan tashqari
o'ng tomonida aniqlikdagi ikki raqam bilan baseSalary misol o'zgaruvchisini ham chiqaradi
kasr nuqtasi.
Biz Komissiya xodimi sinfidan kodni tom ma'noda ko'chirdik va uni Base- sinfiga joylashtirdik.
PlusCommissionEmployee, keyin BasePlusCommissionEmployee sinfini kiritish uchun o'zgartirildi
asosiy ish haqi va asosiy ish haqini manipulyatsiya qilish usullari. Ushbu "nusxa ko'chirish va joylashtirish" usuli
ko'pincha xato va vaqt talab qiladi. Bundan ham yomoni, u bir xil kodning nusxalarini tarqatadi
butun tizimda kodni saqlash bilan bog'liq muammolarni keltirib chiqaradi - kodga o'zgartirishlar kiritiladi
bir necha sinflarda qilish kerak. Misol o'zgaruvchilarni "sotib olish" uchun usul bormi va
bir sinfning usullarini takrorlanmasdan boshqa sinflarning bir qismiga aylantiradigan tarzda
kod? Keyin biz bu savolga javob beramiz va sinflarni yaratishda yanada oqlangan yondashuvdan foydalanamiz
merosning afzalliklarini ta'kidlaydi.

Xodimlar to'g'risidagi ma'lumotlar get usullari bilan olinadi:

Birinchi ismi Bob
Familiyasi Lyuis
Ijtimoiy xavfsizlik raqami - 333-33-3333
Yalpi savdo - 5000,00
Komissiya stavkasi 0,04
Asosiy ish haqi 300.00

ToString tomonidan olingan yangilangan xodimlar ma'lumotlari:

bazaviy ish haqi komissiyasi xodimi: Bob Lyuis
ijtimoiy xavfsizlik raqami: 333-33-3333
yalpi savdo: 5000.00
komissiya stavkasi: 0,04
asosiy ish haqi: 1000.00

Dasturiy ta'minot muhandisligi kuzatuvi 9.3


Meros bilan, barcha sinflar uchun bir xil bo'lgan misol o'zgaruvchilari va usullari
ierarxiyadagilar yuqori sinfda e'lon qilinadi. Ushbu umumiy xususiyatlarga kiritilgan o'zgarishlar
supersinf pastki sinf tomonidan meros qilib olinadi. Merossiz, o'zgarishlar kerak bo'ladi
ko'rib chiqilayotgan kodning nusxasini o'z ichiga olgan barcha manba kodi fayllariga kiritilishi mumkin.

9.7-rasm | BasePlusCommissionEmployee test dasturi. (2-qismning 2-qismi.)


376 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

9.4.3 Komissiya xodimini yaratish –
BasePlusCommission Xodimlar merosi ierarxiyasi
Endi biz sinfni kengaytirish uchun BasePlusCommissionEmployee sinfini e'lon qilamiz (9.8-rasm).
sionEmployee (9.4-rasm). BasePlusCommissionEmployee obyekti komissiya em-
ployee, chunki meros sinf komissiyasi xodimlarining imkoniyatlariga o'tadi. Sinf
BasePlusCommissionEmployee shuningdek, baseSalary misol o'zgaruvchisiga ega (9.8-rasm, 6-qator).
kengaytirilgan kalit so'z (4-qator) merosni bildiradi. BasePlusCommissionEmployee meros oladi
CommissionEmployee's instance o'zgaruvchilari va usullari.

Faqat komissiya xodimining ochiq va himoyalangan a'zolariga bevosita kirish mumkin


kichik sinfda. CommissionEmployee konstruktori meros qilib olinmaydi. Shunday qilib, jamoatchilik
BasePlusCommissionEmployee xizmatlari uning konstruktorini (9–23-qatorlar), ommaviy
CommissionEmployee tomonidan meros qilib olingan usullar va setBaseSalary usullari (26-qatorlar)
33), getBaseSalary (36-39-qatorlar), daromadlar (42-47-qatorlar) va toString (50-60-qatorlar).
Daromad va toString usullari sinfdagi tegishli usullarni bekor qiladi.
sionEmployee, chunki ularning superklass versiyalari BasePlusCom-ni to'g'ri hisoblamaydi.
missionEmployee daromadi yoki mos ravishda tegishli String vakilini qaytaradi.

Dasturiy ta'minot muhandisligi kuzatuvi 9.4


Ob'ektga yo'naltirilgan tizimda dizayn bosqichida siz ko'pincha ma'lum sinflar ekanligini topasiz
chambarchas bog'liq. Umumiy misol o'zgaruvchilari va usullari va joylashuvini "alohida ajratib ko'rsatish" kerak
ularni super sinfda. Keyin kichik sinflarni ishlab chiqish, ularni ixtisoslashtirish uchun merosdan foydalaning
yuqori sinfdan meros bo'lib qolgan qobiliyatlardan tashqari.
Dasturiy ta'minot muhandisligi kuzatuvi 9.5
Subklassni e'lon qilish uning yuqori sinfining manba kodiga ta'sir qilmaydi. Meros saqlaydi
supersinfning yaxlitligi.

1 // 9.8-rasm: BasePlusCommissionEmployee.java


2 // subklassdagi xususiy supersinf a'zolariga kirish mumkin emas.
3
4
5 {
6 ta xususiy ikki kishilik ish haqi; // haftalik asosiy ish haqi
7
8 // olti argumentli konstruktor
9 umumiy BasePlusCommissionEmployee(String firstName, String Familiya,
10 qatorli ijtimoiy xavfsizlik raqami, ikki barobar yalpi savdo,
11 ikki baravar komissiya stavkasi, ikki baravar ish haqi)
12 {
13
14
15
16
17 // agar baseSalary noto'g'ri bo'lsa, istisno qiling
18 bo'lsa (asosiy ish haqi < 0,0)
19 yangi IllegalArgumentException (
20 "Asosiy ish haqi >= 0,0 bo'lishi kerak");
21
9.8-rasm | xususiy superklass a'zolariga kichik sinfda kirish mumkin emas. (3-qismning 1-qismi.)

jamoat sinfi BasePlusCommissionEmployee komissiyasi xodimini kengaytiradi

// Komissiya xodimi konstruktori yuqori sinfiga aniq chaqiruv
super(ism, familiya, socialSecurityNumber,
yalpi savdo, komissiya stavkasi);

9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 377

22 this.baseMaosh = asosiy ish haqi;
23 }
24
25 // asosiy ish haqini belgilash
26 davlat bekor to'plamiBaseMaosh(ikki martalik ish haqi)
27 {
28 agar (asosiy ish haqi < 0,0)
29 yangi IllegalArgumentException (
30 "Asosiy ish haqi >= 0,0 bo'lishi kerak");
31
32 this.baseMaosh = asosiy ish haqi;
33 }
34
35 // asosiy ish haqini qaytarish
36 umumiy ikki marta getBaseSalary()
37 {
38 qaytariladigan asosiy ish haqi;
39 }
40
41 // daromadlarni hisoblash
42
43 davlat ikki barobar daromad ()
44 {
45
46
47 }
48
49 // BasePlusCommissionEmployee-ning string ko'rinishini qaytarish
50
51 umumiy string toString()
52 {
53
54
55
56
57
58
59
60 }
61 } // yakuniy sinf BasePlusCommissionEmployee

BasePlusCommissionEmployee.java:46: xato: komissiyaRate shaxsiy kirish huquqiga ega


komissiya xodimida
Qaytish bazasiIsh haqi + (komissiyaRate * yalpi savdo);
^
BasePlusCommissionEmployee.java: 46: xato: grossSales-da shaxsiy ruxsat bor
Komissiya xodimi
Qaytish bazasiIsh haqi + (komissiyaRate * yalpi savdo);
^
BasePlusCommissionEmployee.java:56: xato: firstName shaxsiy kirish huquqiga ega
Komissiya xodimi
"asosiy ish haqi komissiyasi xodimi", ismi, familiyasi,
^

9.8-rasm | xususiy superklass a'zolariga kichik sinfda kirish mumkin emas. (3 qismning 2-qismi.)

@Override

// ruxsat berilmagan: komissiya darajasi va grossSales superklassdagi shaxsiy


Qaytish bazasiIsh haqi + (komissiyaRate * yalpi savdo);

@Override

// ruxsat berilmagan: shaxsiy superklass a'zolariga kirishga urinishlar
String.formatni qaytaring(
"%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f%n%s: %.2f",
"asosiy ish haqi komissiyasi xodimi", ismi, familiyasi,
"ijtimoiy xavfsizlik raqami", ijtimoiy xavfsizlik raqami,
"yalpi savdo", yalpi savdo, "komissiya stavkasi", komissiya stavkasi,
"asosiy ish haqi", asosiy ish haqi);

378 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

Subsinf konstruktori o'zining supersinf konstruktorini chaqirishi kerak
Har bir kichik sinf konstruktori o'zining yuqori sinf konstruktsiyalaridan birini bilvosita yoki aniq chaqirishi kerak.
supersinfdan meros bo'lib qolgan misol o'zgaruvchilarni ishga tushirish uchun torlar. Bazadagi 14–15-qatorlar
PlusCommissionEmployee ning oltita argumentli konstruktori (9–23-qatorlar) sinfni aniq chaqiradi
Komissiya xodimining besh argumentli konstruktori (9.4-rasmning 13-34-qatorlarida e'lon qilingan)
BasePlusCommissionEmployee ob'ektining yuqori sinf qismini ishga tushiring (ya'ni, o'zgaruvchilar
ism, familiya, ijtimoiy xavfsizlik raqami, yalpi savdo va komissiya darajasi). Biz
Buni super klass konstruktori chaqiruv sintaksisi - super kalit so'zidan, keyin esa to'plamdan foydalanib bajaring
Boshlash uchun ishlatiladigan yuqori sinf konstruktor argumentlarini o'z ichiga olgan qavslar
firstName, LastName, socialSecurityNumber, superklass namunasi o'zgaruvchilarini o'zgartiring,
mos ravishda yalpi savdo va komissiya darajasi. Agar BasePlusCommission Xodimning roziligi
struktor yuqori sinf konstruktorini aniq chaqirmagan bo'lsa, kompilyator harakat qiladi
supersinfning standart yoki argumentsiz konstruktoriga qo'ng'iroqni kiritish uchun. Sinf komissiyasi -
Xodimda bunday konstruktor yo'q, shuning uchun kompilyator xato qiladi. sobiq -
9.8-rasmdagi 14-15-qatorlardagi plicit superclass konstruktor chaqiruvi birinchi bayonot bo'lishi kerak.
konstruktor tanasi. Superklassda argumentsiz konstruktor mavjud bo'lsa, mumkin
konstruktorni aniq chaqirish uchun super() dan foydalaning, lekin bu kamdan-kam hollarda amalga oshiriladi.

BasePlusCommissionEmployee Methods Dearnings and toString


Kompilyator 46-qator uchun xatolar hosil qiladi (9.8-rasm), chunki komissiya xodimi-
pozitsiya o'zgaruvchilari komissiyasi va yalpi sotuvlar xususiydir - BasePlusCom- kichik sinfi
missionEmployee usullariga komissiya xodimlarining superklassiga kirishga ruxsat berilmagan
xususiy misol o'zgaruvchilari. Biz xato kodni ko'rsatish uchun 9.8-rasmdagi qizil matndan foydalandik. The
kompilyator BasePlusCommissionEmployee-ning 56-58-qatorlarida qo'shimcha xatolar chiqaradi.
Xuddi shu sababga ko'ra string usuli. BasePlusCommissionEmployee-dagi xatolar bo'lishi mumkin
CommissionEmployee sinfidan meros bo'lib qolgan get usullari yordamida oldini olish mumkin.

BasePlusCommissionEmployee.java:56: xato: lastName shaxsiy kirish huquqiga ega


Komissiya xodimi
"asosiy ish haqi komissiyasi xodimi", ismi, familiyasi,
^
BasePlusCommissionEmployee.java:57: xato: socialSecurityNumber shaxsiy bor
komissiya xodimiga kirish
"ijtimoiy xavfsizlik raqami", ijtimoiy xavfsizlik raqami,
^
BasePlusCommissionEmployee.java:58: xato: grossSales-da shaxsiy ruxsat bor
Komissiya xodimi
"yalpi savdo", yalpi savdo, "komissiya stavkasi", komissiya stavkasi,
^
BasePlusCommissionEmployee.java:58: xato: komissiyaRate shaxsiy kirish huquqiga ega
InCommission Employee
"yalpi savdo", yalpi savdo, "komissiya stavkasi", komissiya stavkasi,
^

Dasturiy ta'minot muhandisligi kuzatuvi 9.6


Oldindan siz sinfning misol usullarini undan chaqirmaslik kerakligini bilib oldingiz
konstruktorlar va buning sababini 10-bobda aytamiz. Superklass konstruktorini chaqirish
subklass konstruktori bu maslahatga zid kelmaydi.

9.8-rasm | xususiy superklass a'zolariga kichik sinfda kirish mumkin emas. (3 qismning 3-qismi.)


9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 379

Masalan, 46-qator kirish uchun getCommissionRate va getGrossSales deb nomlanishi mumkin edi
CommissionEmployee's shaxsiy instance o'zgaruvchilar komissiyasi va yalpi sotish, qayta-
spektakl. 56-58 qatorlar qiymatlarni olish uchun tegishli olish usullaridan ham foydalanishi mumkin edi
supersinf misol o'zgaruvchilari.
9.4.4 Komissiya xodimi – BasePlusKomissiya xodimi
Himoyalangan misol o'zgaruvchilari yordamida meros ierarxiyasi
BasePlusCommissionEmployee sinfiga to'g'ridan-to'g'ri superklass misoliga kirishni yoqish uchun
ism, familiya, ijtimoiy xavfsizlik raqami, yalpi savdo va komissiya darajasi,
biz ushbu a'zolarni superklassda himoyalangan deb e'lon qilishimiz mumkin. Biz muhokama qilganimizdek
9.3 bo'limiga ko'ra, yuqori sinfning himoyalangan a'zolariga ushbu kichik sinfning barcha kichik sinflari kirishlari mumkin.
sinf. "CommissionEmployee" ning yangi sinfida biz 9.4-rasmning faqat 6-10-qatorlarini o'zgartirdik.
himoyalangan kirish modifikatori bilan misol o'zgaruvchilarini quyidagicha e'lon qilish uchun:

Sinf deklaratsiyasining qolgan qismi (bu erda ko'rsatilmagan) 9.4-rasmdagi bilan bir xil.


Sub-ni yoqish uchun komissiya xodimining misol o'zgaruvchilarini ochiq deb e'lon qilishimiz mumkin edi.
sinf BasePlusCommissionEmployee ularga kirish uchun. Biroq, ommaviy instansiyani e'lon qilish
o'zgaruvchilar dasturiy ta'minotning yomon muhandisligi, chunki u ushbu o'zgaruvchilarga cheksiz kirish imkonini beradi.
har qanday sinfdan qobiliyatlar, xatolar ehtimolini sezilarli darajada oshiradi. Himoyalangan misol bilan
qodir bo'lsa, quyi sinf misol o'zgaruvchilariga kirish huquqiga ega, lekin pastki sinf bo'lmagan sinflar va
bir xil paketda bo'lmagan sinflar bu o'zgaruvchilarga to'g'ridan-to'g'ri kira olmaydi - esda tuting
himoyalangan sinf a'zolari bir xil paketdagi boshqa sinflarga ham ko'rinadi.
Class BasePlusCommissionEmployee
Class BasePlusCommissionEmployee (9.9-rasm) Commis- sinfining yangi versiyasini kengaytiradi.
Himoyalangan misol o'zgaruvchilari bilan sionEmployee. BasePlusCommissionEmployee ob'ektlari
Komissiya xodimining himoyalangan namunasi o'zgaruvchilari firstName, LastName, shuning uchun-
cialSecurityNumber, yalpi savdo va komissiya stavkasi - bu o'zgaruvchilarning barchasi endi pro-
BasePlusCommissionEmployee a'zolarini aniqladilar. Natijada, kompilyator buni qilmaydi
Usul daromadlarining 45-qatorini va usulning 54-56-qatorlarini tuzishda xatolar hosil qilish
toString. Agar boshqa sinf BasePlusCommissionEmployee sinfining ushbu versiyasini kengaytirsa,
yangi kichik sinf ham himoyalangan a'zolarga kirishi mumkin.

himoyalangan final String firstName;


himoyalangan oxirgi String familiyasi;
himoyalangan yakuniy String socialSecurityNumber;
himoyalangan ikki barobar yalpi savdo; // yalpi haftalik savdo
himoyalangan ikki tomonlama komissiya stavkasi; // komissiya foizi

1 // 9.9-rasm: BasePlusCommissionEmployee.java


2 // BasePlusCommissionEmployee himoyalangan misolni meros qilib oladi
3 // CommissionEmployee dan o'zgaruvchilar.
4
5
6 {
7 ta xususiy ikki kishilik ish haqi; // haftalik asosiy ish haqi
9.9-rasm | BasePlusCommissionEmployee himoyalangan misol o'zgaruvchilarini meros qilib oladi
Komissiya xodimi. (2-qismning 1-qismi.)

jamoat sinfi BasePlusCommissionEmployee komissiyasi xodimini kengaytiradi


380 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

8
9 // olti argumentli konstruktor
10 umumiy BasePlusCommissionEmployee(String firstName, String Familiya,
11 String SocialSecurityNumber, ikki barobar yalpi savdo,
12 ikki baravar komissiya stavkasi, ikki baravar ish haqi)
13 {
14
15
16
17 // agar baseSalary noto'g'ri bo'lsa, istisno qiling
18 bo'lsa (asosiy ish haqi < 0,0)
19 yangi IllegalArgumentException (
20 "Asosiy ish haqi >= 0,0 bo'lishi kerak");
21
22 this.baseMaosh = asosiy ish haqi;
23 }
24
25 // asosiy ish haqini belgilash
26 davlat bekor to'plamiBaseMaosh(ikki martalik ish haqi)
27 {
28 agar (asosiy ish haqi < 0,0)
29 yangi IllegalArgumentException (
30 "Asosiy ish haqi >= 0,0 bo'lishi kerak");
31
32 this.baseMaosh = asosiy ish haqi;
33 }
34
35 // asosiy ish haqini qaytarish
36 umumiy ikki marta getBaseSalary()
37 {
38 qaytariladigan asosiy ish haqi;
39 }
40
41 // daromadlarni hisoblash
42 @Override // bu usul superklass usulini bekor qilishini bildiradi
43 davlat ikki barobar daromad ()
44 {
45
46 }
47
48 // BasePlusCommissionEmployee-ning string ko'rinishini qaytarish
49 @Bekor qilish
50 umumiy string toString()
51 {
52
53
54
55
56
57
58 }
59 } // yakuniy sinf BasePlusCommissionEmployee
9.9-rasm | BasePlusCommissionEmployee himoyalangan misol o'zgaruvchilarini meros qilib oladi
Komissiya xodimi. (2-qismning 2-qismi.)

super(ism, familiya, socialSecurityNumber,


yalpi savdo, komissiya stavkasi);

Qaytish bazasiIsh haqi + (komissiyaRate * yalpi savdo);

String.formatni qaytaring(
"%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f%n%s: %.2f",
"asosiy ish haqi komissiyasi xodimi", ismi, familiyasi,
"ijtimoiy xavfsizlik raqami", ijtimoiy xavfsizlik raqami,
"yalpi savdo", yalpi savdo, "komissiya stavkasi", komissiya stavkasi,
"asosiy ish haqi", asosiy ish haqi);

9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 381

Subsinf ob'ekti o'zining barcha yuqori sinflarining misol o'zgaruvchilarini o'z ichiga oladi
BasePlusCommissionEmployee ob'ektini yaratganingizda, u barcha misol o'zgaruvchilarini o'z ichiga oladi
sinf ierarxiyasida shu nuqtaga qadar e'lon qilingan - ya'ni Ob'ekt sinflaridan (qaysi)
misol o'zgaruvchilari yo'q), CommissionEmployee va BasePlusCommissionEmploy-
ee. Class BasePlusCommissionEmployee komissiyasi xodimining besh-ar- merosxo'rini olmaydi.
gument konstruktori, lekin misol o'zgaruvchilarini ishga tushirish uchun uni aniq chaqiradi (14-15-qatorlar).
BasePlusCommissionEmployee komissiya xodimidan meros bo'lib qolgan. Xuddi shunday, Com-
missionEmployee konstruktori ob'ekt konstruktorini bilvosita chaqiradi. BasePlusCom-
missionEmployee konstruktori komissiya xodimining konstruktorini aniq chaqirishi kerak
Chunki komissiya xodimida argumentsiz konstruktor mavjud emas.
bilvosita chaqirgan.

Sinov sinfi BasePlusCommissionEmployee


Ushbu misol uchun BasePlusCommissionEmployeeTest klassi sinfi bilan bir xil
9.7-rasm va bir xil mahsulotni ishlab chiqaradi, shuning uchun biz uni bu erda ko'rsatmaymiz. ning versiyasi bo'lsa-da
9.6-rasmdagi BasePlusCommissionEmployee sinfi meros va versiyadan foydalanmaydi.
9.9-rasmda ikkala sinf ham bir xil funksionallikni ta'minlaydi. 9.9-rasmdagi manba kodi (59
chiziqlar) 9.6-rasmdagidan (127 qator) ancha qisqaroq, chunki sinfning aksariyat qismi
Funksionallik endi komissiya xodimidan meros bo‘lib qolgan — endi faqat bitta nusxasi bor
komissiya xodimlarining funksionalligi. Bu kodni saqlash, o'zgartirishni osonlashtiradi
va disk raskadrovka, chunki komissiya xodimiga tegishli kod faqat shu sinfda mavjud.

Himoyalangan misol o'zgaruvchilaridan foydalanish bo'yicha eslatmalar


Ushbu misolda biz superklass namunasi o'zgaruvchilarni himoyalangan deb e'lon qildik, shuning uchun pastki sinflar
ularga kirish mumkin edi. Himoyalangan namuna o'zgaruvchilarni meros qilib olish to'g'ridan-to'g'ri kirish imkonini beradi
pastki sinflar bo'yicha o'zgaruvchilar. Biroq, ko'p hollarda, shaxsiy misol o'zgaruvchilaridan foydalanish yaxshiroqdir
to'g'ri dasturiy ta'minot muhandisligini rag'batlantirish. Sizning kodingizni saqlash, o'zgartirish osonroq bo'ladi
va disk raskadrovka.
Himoyalangan misol o'zgaruvchilaridan foydalanish bir nechta potentsial muammolarni keltirib chiqaradi. Birinchidan, sub-
sinf ob'ekti meros qilib olingan o'zgaruvchining qiymatini to'g'ridan-to'g'ri to'siq usulidan foydalanmasdan o'rnatishi mumkin. U yerda-
avvalo, subklass ob'ekti o'zgaruvchiga noto'g'ri qiymat belgilashi mumkin, bu ob'ektni tark etishi mumkin
mos kelmaydigan holatda. Misol uchun, agar biz komissiya xodimining misolini e'lon qiladigan bo'lsak
o'zgaruvchan grossSales himoyalangan, pastki sinf ob'ekti (masalan, BasePlusCommissionEmployee)
keyin grossSales uchun salbiy qiymat belgilashi mumkin. Himoyalangan foydalanish bilan bog'liq yana bir muammo
misol o'zgaruvchilari pastki sinf usullari bog'liq bo'lishi uchun yozilish ehtimoli ko'proq
supersinf ma'lumotlarini amalga oshirish bo'yicha. Amalda, kichik sinflar faqat bog'liq bo'lishi kerak
Superklass xizmatlari (ya'ni, xususiy bo'lmagan usullar) va yuqori sinf ma'lumotlarini amalga oshirishda emas.
ta'lim. Superklassdagi himoyalangan misol o'zgaruvchilari bilan biz hamma narsani o'zgartirishimiz kerak bo'lishi mumkin
agar supersinfni amalga oshirish o'zgartirilsa, yuqori sinfning pastki sinflari. Masalan, agar uchun
negadir biz firstName va LastName misol o'zgaruvchilari nomlarini o'zgartirishimiz kerak edi
birinchi va oxirgi, keyin biz kichik sinf bo'lgan barcha hodisalar uchun buni qilishimiz kerak edi
to'g'ridan-to'g'ri superklass misol o'zgaruvchilari firstName va LastName havola qiladi. Bunday sinf
mo'rt yoki mo'rt deb aytilgan, chunki supersinfdagi kichik o'zgarish kichik sinfni "buzishi" mumkin
amalga oshirish. Siz hali ham superklassni amalga oshirishni o'zgartirishingiz kerak
kichik sinflarga bir xil xizmatlarni taqdim etish. Albatta, agar superklass xizmatlari o'zgarsa,
biz pastki sinflarimizni qayta tiklashimiz kerak. Uchinchi muammo - sinfning himoyalangan a'zolari

382 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

himoyalangan xotirani o'z ichiga olgan sinf bilan bir xil paketdagi barcha sinflarga ko'rinadi.
bers - bu har doim ham istalmagan.

9.4.5 Komissiya xodimi – BasePlusKomissiya xodimi


Shaxsiy misol o'zgaruvchilari yordamida meros ierarxiyasi
Keling, ierarxiyamizni yana bir bor ko'rib chiqaylik, bu safar yaxshi dasturiy ta'minot muhandisligi amaliyotidan foydalangan holda.
teglar.
Sinf komissiyasi xodimi
Class CommissionEmployee (9.10-rasm) misol o'zgaruvchilari firstName, LastName,
SocialSecurityNumber, yalpi savdo va komissiya stavkasi shaxsiy (6–10-qatorlar) va
getFirstName, getLastName, getSocialSecurityNumber, set- umumiy usullarini taqdim etadi.
GrossSales, getGrossSales, setCommissionRate, getCommissionRate, daromadlar va
Ushbu qiymatlarni boshqarish uchun toString. Daromad usullari (87–90-qatorlar) va toString
(93–101-qatorlar) o'z misol o'zgaruvchilari qiymatlarini olish uchun sinfning get usullaridan foydalaning. Agar
biz misol o'zgaruvchilari nomlarini, daromadlarni va toString dec-ni o'zgartirishga qaror qildik.
laratsiyalar o'zgartirishni talab qilmaydi - faqat olish va o'rnatish usullarining organlari.
misol o'zgaruvchilarini to'g'ridan-to'g'ri manipulyatsiya qilish o'zgarishi kerak bo'ladi. Bu o'zgarishlar faqat sodir bo'ladi
supersinf ichida - kichik sinfga hech qanday o'zgartirish kiritish shart emas. O'zgarishlarning ta'sirini mahalliylashtirish
Bu yaxshi dasturiy ta'minot muhandisligi amaliyotidir.

Dasturiy ta'minot muhandisligi kuzatuvi 9.7


Superklass faqat o'ziga xos usulni taqdim etishi kerak bo'lganda himoyalangan kirish modifikatoridan foydalaning
pastki sinflar va bir xil paketdagi boshqa sinflar, lekin boshqa mijozlarga emas.

Dasturiy ta'minot muhandisligi kuzatuvi 9.8


Superklass namunasi o'zgaruvchilarni xususiy deb e'lon qilish (himoyalangandan farqli o'laroq) imkonini beradi
subklassga ta'sir qilmasdan o'zgartirish uchun ushbu misol o'zgaruvchilarining superklassini amalga oshirish
amalga oshirishlar.

Xatolarning oldini olish bo'yicha maslahat 9.2


Iloji bo'lsa, himoyalangan misol o'zgaruvchilarini supersinfga kiritmang. Buning o'rniga, -
xususiy misol o'zgaruvchilariga kirish uchun xususiy bo'lmagan usullarni o'z ichiga oladi. Bu ta'minlashga yordam beradi
sinf ob'ektlari izchil holatlarni saqlab turishi.

1 // 9.10-rasm: CommissionEmployee.java


2 // CommissionEmployee klassi uni boshqarish uchun usullardan foydalanadi
3 // xususiy misol o'zgaruvchilari.
4 jamoat sinf komissiyasi xodimi
5 {
6
7
8
9
10
9.10-rasm | CommissionEmployee klassi shaxsiy nusxasini boshqarish uchun usullardan foydalanadi
o'zgaruvchilar. (3-qismning 1-qismi.)

xususiy final String firstName;


xususiy final String familiyasi;
xususiy yakuniy String socialSecurityNumber;
xususiy ikki tomonlama yalpi savdo; // yalpi haftalik savdo
xususiy ikki martalik komissiya stavkasi; // komissiya foizi

9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 383

11
12 // besh argumentli konstruktor
13 jamoat komissiyasi xodimi(String firstName, String familiyasi,
14 String SocialSecurityNumber, ikki barobar yalpi savdo,
15 ikki barobar komissiya stavkasi)
16 {
17 // Ob'ekt konstruktoriga yashirin chaqiruv bu erda sodir bo'ladi
18
19 // agar grossSales yaroqsiz bo'lsa, istisno qiling
20 agar (yalpi savdo <0,0)
21 yangi IllegalArgumentException (
22 "Yalpi savdo >= 0,0 bo'lishi kerak");
23
24 // agar komissiyaRate yaroqsiz bo'lsa, istisno qilish
25 bo'lsa (komissiya darajasi <= 0,0 || komissiya darajasi >= 1,0)
26 yangi IllegalArgumentException (
27 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
28
29 this.firstName = firstName;
30 this.lastName = familiya;
31 this.socialSecurityNumber = socialSecurityNumber;
32 this.grossSales = yalpi savdo;
33 this.commissionRate = komissiya stavkasi;
34 } // yakunlovchi konstruktor
35
36 // ismni qaytaring
37 ommaviy string getFirstName()
38 {
39 nomini qaytarish;
40 }
41
42 // familiyani qaytarish
43 ommaviy string getLastName()
44 {
45 familiyasini qaytarish;
46 }
47
48 // ijtimoiy xavfsizlik raqamini qaytaring
49 ommaviy string getSocialSecurityNumber()
50 {
51 ijtimoiy xavfsizlik raqamini qaytarish;
52 }
53
54 // yalpi savdo miqdorini belgilang
55 ommaviy bekor to'plamGrossSales(ikki marta yalpi savdo)
56 {
57 agar (yalpi savdo <0,0)
58 yangi IllegalArgumentException (
59 "Yalpi savdo >= 0,0 bo'lishi kerak");
60
61 this.grossSales = yalpi savdo;
62 }
9.10-rasm | CommissionEmployee klassi shaxsiy nusxasini boshqarish uchun usullardan foydalanadi
o'zgaruvchilar. (3 qismning 2-qismi.)

384 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

Class BasePlusCommissionEmployee
Subclass BasePlusCommissionEmployee (9.11-rasm) komissiya xodimining bo'lmagan qismini meros qilib oladi.
xususiy usullar va xususiy superklass a'zolariga (nazorat qilinadigan tarzda) orqali kirishi mumkin
bu usullar. Class BasePlusCommissionEmployee farqlovchi bir nechta o'zgarishlarga ega
9.9-rasmdan. Daromadlar (43–47-qatorlar) va toString (50–55-qatorlar) har biri qoʻllaniladi
getBaseSalary usuli baseSalary-ga kirishdan ko'ra, asosiy ish haqi qiymatini olish uchun
bevosita. Agar biz misol o'zgaruvchisini baseSalary nomini o'zgartirishga qaror qilsak, faqat usul tanasi
setBaseSalary va getBaseSalary o'zgarishi kerak.

63
64 // yalpi savdo summasini qaytaring


65 ommaviy ikkilik getGrossSales()
66 {
67 daromadli yalpi savdo;
68 }
69
70 // komissiya stavkasini belgilang
71 ommaviy bekor to'plamiKomissiyaRate(ikki martalik komissionRate)
72 {
73 agar (komissiya darajasi <= 0,0 || komissiya darajasi >= 1,0)
74 yangi IllegalArgumentException (
75 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
76
77 this.commissionRate = komissiya darajasi;
78 }
79
80 // qaytarish komissiyasi stavkasi
81 umumiy ikki marta getCommissionRate()
82 {
83 qaytish komissiyasi stavkasi;
84 }
85
86 // daromadlarni hisoblash
87 davlat ikki barobar daromad ()
88 {
89 qaytish *;
90 }
91
92 // komissiya xodimi ob'ektining string ko'rinishini qaytarish
93 @Bekor qilish
94 umumiy string toString()
95 {
96 return String.format("%s: %s %s%n%s: %s%n%s: %.2f%n%s: %.2f",
97 "komissiya xodimi", , ,
98 "ijtimoiy himoya raqami", ,
99 "yalpi savdo", ,
100 "komissiya stavkasi", );
101 }
102 } // yakuniy sinf komissiyasi xodimi
9.10-rasm | CommissionEmployee klassi shaxsiy nusxasini boshqarish uchun usullardan foydalanadi
o'zgaruvchilar. (3 qismning 3-qismi.)

getCommissionRate() getGrossSales()

getFirstName() getLastName()
getSocialSecurityNumber()
getGrossSales()
getCommissionRate()

9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabatlar 385

1 // 9.11-rasm: BasePlusCommissionEmployee.java
2 // BasePlusCommissionEmployee klassi CommissionEmployee-dan meros oladi
3 // va meros orqali supersinfning shaxsiy ma'lumotlariga kiradi
4 // ommaviy usullar.
5
6 ommaviy sinf BasePlusCommissionEmployee CommissionEmployee kengaytiradi
7 {
8 ta xususiy ikki kishilik ish haqi; // haftalik asosiy ish haqi
9
10 // olti argumentli konstruktor
11 ommaviy BasePlusCommissionEmployee(String firstName, String Familiya,
12 String SocialSecurityNumber, ikki barobar yalpi savdo,
13 ikki baravar komissiya stavkasi, ikki baravar ish haqi)
14 {
15 super(ism, familiya, ijtimoiy xavfsizlik raqami,
16 yalpi savdo, komissiya stavkasi);
17
18 // agar baseSalary noto'g'ri bo'lsa, istisno qiling
19 agar (asosiy ish haqi < 0,0)
20 yangi IllegalArgumentException (
21 "Asosiy ish haqi >= 0,0 bo'lishi kerak");
22
23 this.baseMaosh = asosiy ish haqi;
24 }
25
26 // asosiy ish haqini belgilash
27 davlat bekor to'plamiBaseMaosh(ikki martalik ish haqi)
28 {
29 agar (asosiy ish haqi < 0,0)
30 yangi IllegalArgumentException (
31 "Asosiy ish haqi >= 0,0 bo'lishi kerak");
32
33 this.baseMaosh = asosiy ish haqi;
34 }
35
36 // asosiy ish haqini qaytarish
37 umumiy ikki marta getBaseSalary()
38 {
39 qaytariladigan asosiy ish haqi;
40 }
41
42 // daromadlarni hisoblash
43 @Bekor qilish
44 davlat ikki barobar daromad ()
45 {
46
47 }
48
49 // BasePlusCommissionEmployee-ning string ko'rinishini qaytarish
50 @Bekor qilish
51 umumiy string toString()
52 {
9.11-rasm | BasePlusCommissionEmployee klassi CommissionEmployee vadan meros oladi
meros qilib olingan umumiy usullar orqali supersinfning shaxsiy ma'lumotlariga kiradi. (2-qismning 1-qismi.)

getBaseSalary() + super.earnings();


386 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

Class BasePlusCommission Xodimning daromadi usuli
Usul daromadlari (43–47-qatorlar) komissiyasi xodimining daromadi usulini bekor qiladi
(9.10-rasm, 87-90-qatorlar) bazaviy ish haqi komissiyasi xodimining ish haqini hisoblash uchun. The
Yangi versiya daromadning bir qismini faqat komissiyaga asoslangan holda Com-ga qo'ng'iroq qilish orqali oladi.
super.earnings() bilan missionEmployeening daromad usuli (46-satr), keyin qo'shadi
umumiy daromadni hisoblash uchun ushbu qiymatga asosiy ish haqi. ni chaqirish uchun ishlatiladigan sintaksisga e'tibor bering
pastki sinfdan bekor qilingan superklass usuli - super kalit so'zini va nuqta (.) sep-
superklass usuli nomidan oldin arator. Ushbu usulni chaqirish yaxshi dasturiy ta'minotdir.
ishlab chiqarish amaliyoti - agar usul boshqasi uchun zarur bo'lgan barcha yoki ba'zi harakatlarni bajarsa
usuli, kodini takrorlashdan ko'ra, ushbu usulni chaqiring. BasePlusCommission-ga ega bo'lish orqali
Xodimning daromadi usuli komissiyani hisoblash uchun Xodimning daromadi usulini qo'llaydi.
BasePlusCommissionEmployee ob'ekti daromadining kech qismi, biz takrorlashdan qochamiz.
kodlash va kodni saqlash muammolarini kamaytirish.

Class BasePlusCommissionEmployee's toString usuli


Xuddi shunday, BasePlusCommissionEmployee's toString usuli (9.11-rasm, 50–55-qatorlar)
qaytarish uchun CommissionEmployee's toString usulini bekor qiladi (9.10-rasm, 93–101-qatorlar).
Asosiy maoshli komissiya xodimi uchun mos bo'lgan string vakili. Yangi
versiya BasePlusCommissionEmployee ob'ektining String tasvirining bir qismini yaratadi (ya'ni,
"komissiya xodimi" qatori va Komissiya xodimining shaxsiy sinfi qiymatlari
misol o'zgaruvchilari) ifodasi bilan CommissionEmployee's toString usulini chaqirish orqali
super.toString() (9.11-rasm, 54-qator). BasePlusCommissionEmployee's toString usuli-
od keyin BasePlusCommissionEmployee ob'ektining String rep-ning qolgan qismini yakunlaydi.
norozilik (ya'ni, BasePlusCommissionEmployee sinfining asosiy ish haqining qiymati).
Sinov sinfi BasePlusCommissionEmployee
Class BasePlusCommissionEmployeeTest Base-da bir xil manipulyatsiyalarni bajaradi.
PlusCommissionEmployee ob'ekti 9.7-rasmdagi kabi va bir xil mahsulotni ishlab chiqaradi, shuning uchun biz shunday qilamiz
bu yerda ko'rsatma. Garchi siz ko'rgan har bir BasePlusCommissionEmployee sinfi o'zini tutadi
xuddi shunday, 9.11-rasmdagi versiya eng yaxshi ishlab chiqilgan. Merosdan foydalanish va qo'ng'iroq orqali -
Ma'lumotlarni yashiradigan va izchillikni ta'minlaydigan usullardan biz samarali va samarali foydalanamiz
yaxshi muhandislik sinfini qurdi.

53
54


55 }
56 } // yakuniy sinf BasePlusCommissionEmployee

Umumiy dasturlash xatosi 9.2


Agar pastki sinfda superklass usuli bekor qilingan bo'lsa, pastki sinf versiyasi ko'pincha uni chaqiradi
ishning bir qismini bajarish uchun superklass versiyasi. Yuqori sinf usuli nomiga prefiks kiritilmagan
super kalit so'zi va superklass usulini chaqirganda nuqta (.) ajratuvchi bilan
pastki sinf usulining o'zini chaqirishiga sabab bo'ladi, bu esa cheksiz takrorlanish deb ataladigan xatoni keltirib chiqaradi.
sion, natijada usul chaqiruvi stekining to'lib ketishiga olib keladi - halokatli ish vaqti
xato. To'g'ri ishlatilgan rekursiya 18-bobda muhokama qilingan kuchli qobiliyatdir.

9.11-rasm | BasePlusCommissionEmployee klassi CommissionEmployee vadan meros oladi


meros qilib olingan umumiy usullar orqali supersinfning shaxsiy ma'lumotlariga kiradi. (2-qismning 2-qismi.)

return String.format("%s %s%n%s: %.2f", "asosiy ish haqi",


super.toString(), "asosiy ish haqi", getBaseSalary());

9.5 387-kichik sinflardagi konstruktorlar

9.5 Kichik sinflardagi konstruktorlar
Biz tushuntirganimizdek, pastki sinf ob'ektini yaratish konstruktor chaqiruvlari zanjirini boshlaydi
subklass konstruktori o'z vazifalarini bajarishdan oldin ulardan birini chaqirish uchun super dan aniq foydalanadi
konstruktorlar o'zining to'g'ridan-to'g'ri superklassidagi yoki bilvosita superklassning standart yoki no-argu-ni chaqiradi.
ment konstruktori. Xuddi shunday, agar superklass boshqa sinfdan olingan bo'lsa - har bir sinfdan to'g'ri
Ob'ektdan tashqari sinf - superklass konstruktori keyingi sinf konstruktorini chaqiradi
ierarxiya va boshqalar. Zanjirda chaqirilgan oxirgi konstruktor har doim Ob'ektning konstruksiyasidir.
tor. Asl pastki sinf konstruktorining tanasi oxirgi marta bajarilishini tugatadi. Har bir supersinfning xususiyatlari
struktor subklass ob'ekti meros qilib olgan supersinf namunasi o'zgaruvchilarini boshqaradi. Uchun
Misol uchun, Komissiya xodimi – BasePlusCommissionEmployee ierariyasini yana ko'rib chiqing.
Anjirdan chy. 9.10–9.11. Ilova BasePlusCommissionEmployee obyektini yaratganda, uning
konstruktor deyiladi. Ushbu konstruktor komissiya xodimining konstruktorini chaqiradi, u ichida
Ob'ekt konstruktorini chaqiradi. Class Object konstruktori bo'sh tanaga ega, shuning uchun u darhol
ately boshqaruvni CommissionEmployee konstruktoriga qaytaradi, so'ngra uni ishga tushiradi
BasePlusCommissionEmployee tarkibiga kiruvchi CommissionEmployee misol oʻzgaruvchilari
ob'ekt. CommissionEmployee konstruktori bajarishni tugatgandan so'ng, u boshqaruvni qaytaradi
BasePlusCommissionEmployee konstruktori, u baseSalary ni ishga tushiradi.

9.6 Sinf ob'ekti


Ushbu bobda avvalroq muhokama qilganimizdek, Java-dagi barcha sinflar to'g'ridan-to'g'ri yoki bilvosita meros qilib oladi
class Object (java.lang to'plami), shuning uchun uning 11 usuli (ba'zilari haddan tashqari yuklangan) meros qilib olingan
boshqa barcha sinflar tomonidan. 9.12-rasmda Ob'ektning usullari jamlangan. Biz bir nechta ob'ektlarni muhokama qilamiz
Ushbu kitob davomida usullar (9.12-rasmda ko'rsatilganidek).

Dasturiy ta'minot muhandisligi kuzatuvi 9.9


Java konstruktor misol o'zgaruvchisiga qiymat bermasa ham, buni ta'minlaydi
o'zgaruvchi hali ham standart qiymatiga ishga tushirilgan (masalan, ibtidoiy sonlar uchun 0, noto'g'ri
boolean uchun, havolalar uchun null).

Usul tavsifi

teng Bu usul ikki ob'ektni tenglik uchun solishtiradi va agar ular teng bo'lsa, true qiymatini qaytaradi
va aks holda yolg'on. Usul har qanday Ob'ektni argument sifatida oladi. Ob'ektlar qachon
Tenglik uchun ma'lum bir sinfni solishtirish kerak, sinfni bekor qilish kerak
usul ikki ob'ektning mazmunini solishtirishga teng. ning talablari uchun
ushbu usulni amalga oshirish (shuningdek, hashCode usulini bekor qilishni o'z ichiga oladi), qarang
docs.oracle.com/javase/7/docs/api/java/ manzilidagi usul hujjatlariga
lang/Object.html#equals(java.lang.Object). Standart amalga oshirishga teng
tion ikkita havola bir xil ob'ektga tegishli ekanligini aniqlash uchun == operatoridan foydalanadi
xotira. 14.3.3-bo'limda String sinfining tenglar usuli va differentsiatsiyasi ko'rsatilgan.
String obyektlarini == va tenglar bilan taqqoslash o'rtasida.
hashCode Hashkodlar yuqori tezlikda ma'lumotlarni saqlash va olish uchun ishlatiladigan int qiymatlari
xesh-jadval sifatida tanilgan ma'lumotlar tuzilmasida saqlanadi (16.11-bo'limga qarang). Bu
usuli, shuningdek, Ob'ektning standart toString usulini amalga oshirishning bir qismi deb ataladi.
9.12-rasm | Ob'ekt usullari. (2-qismning 1-qismi.)

388 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

9.7 (ixtiyoriy) GUI va grafik misollar:
Yorliqlar yordamida matn va tasvirlarni ko'rsatish
Dasturlar ko'pincha ma'lumot yoki ko'rsatmalarni ko'rsatish uchun teglardan foydalanadi
foydalanuvchi grafik foydalanuvchi interfeysida. Yorliqlar GUI kompozitsiyasini aniqlashning qulay usulidir.
ekranda entts va foydalanuvchini dasturning hozirgi holati haqida xabardor qilib turish.
Java-da JLabel sinfining ob'ekti (javax.swing paketidan) matnni, tasvirni ko'rsatishi mumkin
yoki ikkalasi ham. 9.13-rasmdagi misol JLabelning bir qancha funksiyalarini, jumladan, tekislikni ko'rsatadi
matn yorlig'i, rasm yorlig'i va matn va rasmga ega yorliq.

toString Ushbu usul (9.4.1-bo'limda kiritilgan) string tasvirini qaytaradi.


ob'ekt. Ushbu usulning standart amalga oshirilishi paket nomini qaytaradi va
ob'ekt sinfining sinf nomidan keyin odatda ning o'n oltilik ko'rinishi
ob'ektning hashCode usuli bilan qaytarilgan qiymat.
kuting, xabar bering,
hammaga xabar bering

Bildirish, notifyAll usullari va kutishning haddan tashqari yuklangan uchta versiyasi bilan bog'liq


23-bobda muhokama qilingan multithreading.
getClass Java-dagi har bir ob'ekt bajarilish vaqtida o'z turini biladi. getClass usuli (ishlatilgan
10.5 va 12.5-bo'limlarda) Class sinfining ob'ektini qaytaradi (java.lang paketi)
Bu ob'ekt turiga oid ma'lumotlarni o'z ichiga oladi, masalan, uning sinf nomi (qaytarilgan
getName sinf usuli bo'yicha).
finalize Ushbu himoyalangan usul tugatishni amalga oshirish uchun axlat yig'uvchi tomonidan chaqiriladi
axlat yig'uvchi ob'ektni qaytarib olishdan oldin ob'ektda uy ishlarini olib borish
xotira. 8.10-bo'limni eslaylik, buning qachon yoki qachon yakunlanishi noma'lum
chaqirilsin. Shu sababli, ko'pchilik dasturchilar usulni yakunlashdan qochishlari kerak.
klonlash Ushbu himoyalangan usul, hech qanday argument talab qilmaydi va Ob'ektga havolani qaytaradi.
ence, u chaqirilgan ob'ektning nusxasini yaratadi. Standart amalga oshirish
sayoz nusxa deb atalmish amalni bajaradi - bir ob'ektdagi misol o'zgaruvchan qiymatlari kop-
bir xil turdagi boshqa ob'ektga ied. Malumot turlari uchun faqat havolalar mavjud
nusxalangan. Odatiy bekor qilingan klon usulini amalga oshirish a
har bir mos yozuvlar tipidagi misol o'zgaruvchisi uchun yangi ob'ekt yaratadigan chuqur nusxa. Amalga oshirish -
klonni to'g'ri aytish qiyin. Shuning uchun uni ishlatish tavsiya etilmaydi. Ba'zi sanoat-
Mutaxassislar buning o'rniga ob'ektni ketma-ketlashtirishdan foydalanishni taklif qilishadi. Biz muhokama qilamiz
15-bobda ob'ektni ketma-ketlashtirish. 7-bobdan massivlar ob'ektlar ekanligini eslang. Sifatida
natijada, boshqa barcha ob'ektlar singari, massivlar Object sinfining a'zolarini meros qilib oladi. Har
massivda massivdan nusxa ko'chiradigan bekor qilingan klonlash usuli mavjud. Biroq, agar qator
ob'ektlarga havolalarni saqlaydi, ob'ektlar ko'chirilmaydi - sayoz nusxasi
shakllangan.

1 // 9.13-rasm: LabelDemo.java


2 // teglardan foydalanishni ko'rsatadi.
3 import java.awt.BorderLayout;
4 import javax.swing.ImageIcon;

9.13-rasm | Matn va tasvirlar bilan JLabel. (2-qismning 1-qismi.)

Usul tavsifi

9.12-rasm | Ob'ekt usullari. (2-qismning 2-qismi.)


9.7 Yorliqlar yordamida matn va tasvirlarni ko‘rsatish 389

3-6 qatorlar JLabelsni ko'rsatishimiz kerak bo'lgan sinflarni import qiladi. Paketdan BorderLayout
java.awt faylida GUI komponentlarini qaerga joylashtirishimiz mumkinligini ko'rsatuvchi konstantalar mavjud

5 import javax.swing.JLabel;


6 import javax.swing.JFrame;
7
8 ommaviy sinf LabelDemo
9 {
10 ta umumiy statik bekor asosiy (String [] args)
11 {
12 // Oddiy matn bilan yorliq yarating
13 JLabel northLabel = yangi JLabel("Shimol");
14
15 // JLabel-ga joylashtirishimiz uchun rasmdan belgi yarating
16 ImageIcon labelIcon = new ImageIcon("GUItip.gif");
17
18 // matn o'rniga Belgisi bilan yorliq yarating
19 JLabel centerLabel = yangi JLabel(labelIcon);
20
21 // Belgisi bilan boshqa yorliq yarating
22 JLabel southLabel = yangi JLabel(labelIcon);
23
24 // matnni ko'rsatish uchun yorliqni o'rnating (shuningdek, belgi)
25 southLabel.setText("Janubiy");
26
27 // teglarni ushlab turish uchun ramka yarating
28 JFrame ilovasi = yangi JFrame();
29
30 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
31
32 // yorliqlarni ramkaga qo'shish; ikkinchi argument aniqlaydi
33 // yorliqni qo'shish uchun ramkaning qayeriga
34 application.add(northLabel, BorderLayout.NORTH);
35 application.add(centerLabel, BorderLayout.CENTER);
36 application.add(southLabel, BorderLayout.SOUTH);
37
38 application.setSize(300, 300);
39 application.setVisible(rost);
40 } // asosiyni tugatish
41 } // oxirgi sinf LabelDemo

9.13-rasm | Matn va tasvirlar bilan JLabel. (2-qismning 2-qismi.)


390 9-bob Obyektga yo‘naltirilgan dasturlash: Meros

JFrame. Class ImageIcon JLabel va sinfda ko'rsatilishi mumkin bo'lgan tasvirni ifodalaydi
JFrame barcha teglarni o'z ichiga olgan oynani ifodalaydi.
13-qator konstruktor argumentini ko'rsatadigan JLabel ni yaratadi - "Shimoliy" qatori.
16-qator labelIcon mahalliy o'zgaruvchisini e'lon qiladi va unga yangi ImageIcon tayinlaydi. Konstruktor
uchun ImageIcon rasmga yo'lni belgilaydigan Stringni oladi. Chunki biz faqat belgilaymiz
fayl nomi, Java uni LabelDemo sinfi bilan bir xil katalogda deb hisoblaydi. ImageIcon mumkin
rasmlarni GIF, JPEG va PNG formatlarida yuklash. 19-qator mahalliyni e'lon qiladi va ishga tushiradi
labelIcon ko'rsatuvchi JLabel bilan centerLabel o'zgaruvchisi. 22-qator e'lon qiladi va in-
JanubiyLabel mahalliy o‘zgaruvchisini 19-qatordagiga o‘xshash JLabel bilan bog‘laydi. Biroq,
25-satr yorliq ko'rsatadigan matnni o'zgartirish uchun setText usulini chaqiradi. SetText usuli mumkin
matnni o'zgartirish uchun har qanday JLabelga qo'ng'iroq qiling. Ushbu JLabel ham belgini, ham matnni ko'rsatadi.
28-qator JLabels-ni aks ettiruvchi JFrame-ni yaratadi va 30-qator pro-
JFrame yopilganda gramm tugashi kerak. Biz teglarni JFrame-ga biriktiramiz
34–36 qatorlarni ikkita parametrga ega bo'lgan qo'shish usulining haddan tashqari yuklangan versiyasini chaqirish orqali. The
birinchi parametr biz biriktirmoqchi bo'lgan komponent, ikkinchisi esa qaysi hudud
joylashtirilishi kerak. Har bir JFrame JFrame o'rnini aniqlashga yordam beradigan bog'langan tartibga ega
unga biriktirilgan GUI komponentlari. JFrame uchun standart tartib a sifatida tanilgan
BorderLayout va beshta hududga ega: SHIMOLI (yuqorida), JANUBI (pastki), SARQ (o'ng tomonda), G'arbiy
(chap tomonda) va CENTER. Ularning har biri BorderLayout sinfida doimiy deb e'lon qilinadi. Qachon
chaqiruv usulini bitta argument bilan qo'shish, JFrame komponentni CENTERga joylashtiradi
avtomatik ravishda. Agar pozitsiyada allaqachon komponent mavjud bo'lsa, yangi komponent oladi
uning o'rni. 38 va 39-qatorlar JFrame hajmini o'rnatadi va uni ekranda ko'rinadigan qiladi.
GUI va grafik misollarni o'rganish mashqlari
9.1 JLabelni holat satri sifatida qo‘shish uchun GUI va Grafik misollarni o‘rganish 8.1 mashqini o‘zgartiring.
ko'rsatilgan har bir shaklning sonini ifodalovchi hisoblarni ko'rsatadi. DrawPanel sinfi a ni e'lon qilishi kerak
holat matnini o'z ichiga olgan Stringni qaytaradigan usul. Asosiysi, avval DrawPanel-ni yarating, keyin
JLabel konstruktoriga argument sifatida holat matni bilan JLabel yarating. JLabelni biriktiring
9.14-rasmda ko'rsatilganidek, JFrame ning JANUBI mintaqasiga.

9.14-rasm | JLabel shakl statistikasini ko'rsatadi.


9.8 Yakunlash 391

9.8 Yakunlash
Ushbu bob merosni - mavjud bo'lgan sinflarni olish orqali sinflarni yaratish qobiliyatini taqdim etdi
sinf a'zolari (kodni nusxalash va joylashtirishsiz) va bezash qobiliyatiga ega
ularni yangi imkoniyatlarga ega. Siz supersinflar va kichik sinflar tushunchalarini o'rgandingiz va
ishlatiladigan kalit so'z yuqori sinf a'zolarini meros qilib oladigan kichik sinf yaratish uchun kengaytiriladi. Biz
Individuallar tomonidan kutilmagan ortiqcha yuklanishning oldini olish uchun @Override izohidan qanday foydalanishni ko'rsatdi.
usul superklass usulini bekor qiladi. Biz kirish modifikatorini taqdim etdik
himoyalangan; subklass usullari himoyalangan superklass a'zolariga bevosita kirishi mumkin. Siz
bekor qilingan superklass a'zolariga kirish uchun superdan qanday foydalanishni o'rgandim. Siz ham ko'rdingiz
instruktorlar meros ierarxiyasida qo'llaniladi. Nihoyat, usullari haqida bilib oldingiz
class Object, barcha Java sinflarining bevosita yoki bilvosita supersinfi.
Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar 10-bobida biz
ob'ektga yo'naltirilgan polimorfizmni joriy etish orqali meros haqidagi muhokamamizga asoslang
Bizga qulayroq ishlov beradigan dasturlarni umumiyroq va umumiy tarzda yozish imkonini beruvchi kontseptsiya
qulay tarzda, meros orqali bog'liq bo'lgan turli xil sinflarning ob'ektlari. Keyin
10-bobni o'rganib, siz sinflar, ob'ektlar, inkapsulyatsiya, meros bilan tanishasiz
va polimorfizm - ob'ektga yo'naltirilgan dasturlashning asosiy texnologiyalari.

Xulosa
9.1-bo'lim Kirish


• Meros (361-bet) dasturni ishlab chiqish vaqtini qisqartiradi.
• To‘g‘ridan-to‘g‘ri kichik sinf (361-bet) pastki sinf meros qilib olgan sinfdir. Bilvosita
kichik sinfning yuqori sinfi (361-bet) bu kichik sinfdan sinf ierarxiyasidan ikki yoki undan ortiq daraja yuqoriroqdir.
• Yagona merosda (361-bet) sinf bitta yuqori sinfdan olinadi. Ko'p merosxo'rlikda, a
sinf bir nechta to'g'ridan-to'g'ri superklassdan olingan. Java bir nechta merosni qo'llab-quvvatlamaydi.
• Subsinf o'zining yuqori sinfiga qaraganda aniqroq bo'lib, kichikroq ob'ektlar guruhini ifodalaydi (361-bet).
• Subklassning har bir ob'ekti ham shu sinfning yuqori sinfining ob'ekti hisoblanadi. Biroq, yuqori sinf ob'ekti
o'z sinfining pastki sinflari ob'ekti emas.
• Is-a munosabati (362-bet) merosni ifodalaydi. Is-a munosabatlarida kichik sinfning ob'ekti
o'zining yuqori sinfining ob'ekti sifatida ham ko'rib chiqilishi mumkin.
• Ha-a munosabati (362-bet) kompozitsiyani ifodalaydi. Ha-a munosabatlarida sinf obyekti bir-biriga mos keladi.
boshqa sinflar ob'ektlariga havolalarni oladi.
9.2-bo'lim Yuqori sinflar va kichik sinflar
• Yagona meros munosabatlari daraxtsimon ierarxik tuzilmalarni hosil qiladi — yuqori sinfda yuqori sinf mavjud.
uning kichik sinflari bilan erarxik munosabatlar.
9.3-bo'lim himoyalangan a'zolar
• Supersinfning umumiy a'zolariga dasturda ob'ektga havola bo'lgan joyda kirish mumkin
o'sha yuqori sinf yoki uning kichik sinflaridan biri.
• Supersinfning shaxsiy a'zolariga to'g'ridan-to'g'ri faqat supersinf deklaratsiyasida kirish mumkin.
• Yuqori sinfning himoyalangan a'zolari (364-bet) o'rtasida o'rta darajadagi himoyaga ega
umumiy va xususiy kirish. Ularga supersinf a'zolari, a'zolari kirishlari mumkin
uning pastki sinflari va bir xil paketdagi boshqa sinflar a'zolari tomonidan.

392 9-bob Obyektga yo‘naltirilgan dasturlash: Meros



• Superklassning shaxsiy a'zolari uning pastki sinflarida yashiringan va ularga faqat orqali kirish mumkin
yuqori sinfdan meros bo'lib qolgan ommaviy yoki himoyalangan usullar.
• Agar superklass usuli nomi bo'lsa, bekor qilingan superklass usuliga quyi sinfdan kirish mumkin
oldidan super (364-bet) va nuqta (.) ajratgich qo‘yilgan.
9.4-bo'lim Superklasslar va kichik sinflar o'rtasidagi munosabatlar
• Subklass o'zining yuqori sinfining shaxsiy a'zolariga kira olmaydi, lekin u xususiy bo'lmaganlarga kira oladi
a'zolari.
• Pastki sinf o‘zining super klassi konstruktorini super kalit so‘zidan foydalanib chaqirishi mumkin.
yuqori sinf konstruktor argumentlarini o'z ichiga olgan qavslar to'plami. Bu birinchi bo'lib ko'rinishi kerak
subklass konstruktor tanasidagi bayonot.
• Tegishli amalga oshirishni e'lon qilish uchun pastki sinfda superklass usuli bekor qilinishi mumkin
pastki sinf uchun.
• @Override izohi (369-bet) usul yuqori sinf usulini bekor qilishi kerakligini bildiradi.
Kompilyator @Override bilan e'lon qilingan usulga duch kelganida, u usulning belgilarini taqqoslaydi.
supersinf usuli imzolari bilan tabiat. Agar aniq moslik bo'lmasa, kompilyator muammolarga duch keladi
xato xabari, masalan, "usul supertipdagi usulni bekor qilmaydi yoki amalga oshirmaydi".
• toString usuli argumentlarni qabul qilmaydi va Stringni qaytaradi. Ob'ekt sinfining toString usuli
odatda kichik sinf tomonidan bekor qilinadi.
• Ob'ekt %s format spetsifikatsiyasi yordamida chiqarilganda ob'ektning toString usuli chaqiriladi
bilvosita uning String tasvirini olish uchun.
9.5-bo'lim kichik sinflardagi konstruktorlar
• Subsinf konstruktorining birinchi vazifasi uning to'g'ridan-to'g'ri yuqori sinf konstruktorini (378-bet) en-
supersinfdan meros qilib olingan misol o'zgaruvchilari ishga tushirilganligiga ishonch hosil qiling.
9.6-bo'lim Sinf ob'ekti
• 9.12-rasmdagi Ob'ekt usullari sinfining jadvaliga qarang.
O'z-o'zini tekshirish mashqlari
9.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) dasturiy ta'minotni qayta ishlatish shakli bo'lib, unda yangi sinflar a'zolarni oladi
mavjud sinflar va bu sinflarni yangi imkoniyatlar bilan bezash.
b) Superklass a'zolariga supersinf deklaratsiyasida va ichida kirish mumkin
pastki sinf deklaratsiyasi.
c) a(n) munosabatida kichik sinf ob'ekti ob'ekt sifatida ham ko'rib chiqilishi mumkin
uning super klassi.
d) a(n) munosabatida sinf ob'ekti boshqa sinf ob'ektlariga havolalarga ega
a'zolari.
e) Yagona merosda sinf o'zining kichik sinflari bilan (n) munosabatda bo'ladi.
f) Supersinf a'zolariga dastur tegishli bo'lgan har qanday joyda kirish mumkin.
ushbu yuqori sinf ob'ektiga yoki uning kichik sinflaridan biriga tegishli.
g) kichik sinf ob'ekti instantsiyalanganda, yuqori sinf bevosita yoki deyiladi
aniq.
h) Subklass konstruktorlari kalit so'z orqali superklass konstruktorlarini chaqirishi mumkin.
9.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar bayonot noto'g'ri bo'lsa, sababini tushuntiring.
a) Superklass konstruktorlari kichik sinflar tomonidan meros qilib olinmaydi.
b) Ha-a munosabatlari meros orqali amalga oshiriladi.

O'z-o'zini tekshirish mashqlariga javoblar 393



c) Avtomobil sinfi Rulda va Tormoz sinflari bilan is-aloqador.
d) Agar pastki sinf bir xil imzodan foydalangan holda yuqori sinf usulini qayta aniqlasa, pastki sinf
bu superklass usulini ortiqcha yuklashi aytiladi.
O'z-o'zini tekshirish mashqlariga javoblar
9.1 a) Meros. b) ommaviy va himoyalangan. c) -a yoki meros. d) ega-a yoki kompozitsiya.
e) ierarxik. f) ommaviy. g) konstruktor. h) super.
9.2 a) To'g'ri. b) yolg'on. Ha-a munosabatlari kompozitsiya orqali amalga oshiriladi. Bu - munosabatlar
meros orqali amalga oshiriladi. c) yolg'on. Bu bor-a munosabatlariga misol. Class Car bor
- bu sinf Avtomobil bilan munosabatlar. d) yolg'on. Bu ortiqcha yuklash emas, balki bekor qilish deb nomlanadi
haddan tashqari yuklangan usul bir xil nomga ega, ammo boshqa imzo.
Mashqlar
9.3 (merosdan ko'ra kompozitsiyadan foydalanish) Meros bilan yozilgan ko'plab dasturlar
o'rniga kompozitsiya bilan yozilishi mumkin va aksincha. BasePlusCommissionEm- sinfini qayta yozish
foydalanish uchun komissiya xodimi (9.11-rasm)Employee–BasePlusCommissionEmployee ierarxiyasi
meros emas, balki tarkib.
9.4 (Dasturiy ta'minotni qayta ishlatish) Merosning dasturiy ta'minotdan qayta foydalanishga yordam berish, vaqtni tejash usullarini muhokama qiling
dasturni ishlab chiqish jarayonida va xatolarning oldini olishga yordam beradi.
9.5 (Talaba merosi ierarxiyasi) Universitet talabalari uchun meros ierarxiyasini chizish
9.2-rasmda ko'rsatilgan ierarxiyaga o'xshash. Student ni ierarxiyaning yuqori sinfi sifatida foydalaning, keyin esa sobiq
tendentsiya Bakalavriat talabalari va magistratura talabalari bilan. Salomni kengaytirishda davom eting
imkon qadar chuqur (ya'ni, ko'p darajalar) tartibsizlik. Masalan, birinchi kurs, ikkinchi kurs, Junior va
Katta kurs Bakalavriat talabalari, doktorantlar va magistrlar talabalari bo'lishi mumkin
GraduateStudentning quyi sinflari. Ierarxiyani chizgandan so'ng, mavjud munosabatlarni muhokama qiling.
sinflar o'rtasida. [Izoh: Ushbu mashq uchun hech qanday kod yozishingiz shart emas.]
9.6 (Shakl merosi ierarxiyasi) Shakllar dunyosi kiritilgan shakllarga qaraganda ancha boy
9.3-rasmdagi meros ierarxiyasida. O'zingiz o'ylagan barcha shakllarni yozing - ikkalasi ham ikkita
o'lchovli va uch o'lchovli - va ularni as bilan to'liqroq Shakl ierarxiyasiga aylantiring
iloji boricha ko'p darajalar. Sizning ierarxiyangiz yuqori qismida sinf shakliga ega bo'lishi kerak. TwoDimension sinflari -
alShape va ThreeDimensionalShape Shapeni kengaytirishi kerak. Quad- kabi qo'shimcha kichik sinflarni qo'shing
Rilateral va Sfera, kerak bo'lganda, ierarxiyadagi to'g'ri joylarida.
9.7 (himoyalangan va xususiy) Ba'zi dasturchilar himoyalangan kirishdan foydalanmaslikni afzal ko'rishadi, chunki
ular bu supersinfning inkapsulyatsiyasini buzadi deb ishonishadi. Pro-dan foydalanishning nisbiy afzalliklarini muhokama qiling
tekshirilgan kirish va superklasslarda shaxsiy kirishdan foydalanish.
9.8 (To'rt tomonlama meros ierarxiyasi) To'rtburchak sinflar uchun meros ierarxiyasini yozing.
lateral, trapezoid, paralelogramma, to'rtburchak va kvadrat. Superklass sifatida to'rtburchakdan foydalaning
ierarxiyadan. Har bir shakldagi nuqtalarni ifodalash uchun Point sinfini yarating va foydalaning. Ierni yarating -
iloji boricha chuqurroq (ya'ni, ko'p darajalar). Har biri uchun misol o'zgaruvchilari va usullarini belgilang
sinf. To'rtburchakning shaxsiy misol o'zgaruvchilari uchun xy koordinata juftlari bo'lishi kerak
to'rtburchakning to'rtta so'nggi nuqtasi. Sinflaringiz ob'ektlarini yaratuvchi dastur yozing va
har bir ob'ektning maydonini chiqaradi (to'rtburchakdan tashqari).
9.9 (Har bir kod parchasi nima qiladi?)
a) Quyidagi usul chaqiruvi bekor qilingan daromad usulida joylashgan deb faraz qiling
kichik sinf:
super.earnings()

394 9-bob Obyektga yo‘naltirilgan dasturlash: Meros



b) Kodning quyidagi qatori usul deklaratsiyasidan oldin paydo bo'ladi deb faraz qiling:
@Override
c) Quyidagi kod qatori konstruktorning birinchi bayonoti sifatida paydo bo'ladi deb faraz qilaylik
tanasi:
super(birinchi argument, ikkinchi argument);
9.10 (Kod qatorini yozing) Quyidagi vazifalarning har birini bajaradigan kod qatorini yozing:
a) PieceWorker sinfi Employee sinfidan meros bo‘lishini belgilang.
b) PieceWorker toString kichik sinfidan Superclass Employee's toString usulini chaqirish
usul.
c) PieceWorker pastki sinfidan yuqori sinf xodimining konstruktorini chaqiring — as-
deylik, superklass konstruktori birinchi ismni ifodalovchi uchta satr oladi,
familiyasi va ijtimoiy sug'urta raqami.
9.11 (Konstruktor tanasida superdan foydalanish) Nima uchun birinchi holatda superdan foydalanishni tushuntiring -
kichik sinf konstruktor tanasining menti.
9.12 (Masalan usuli tanasida superdan foydalanish) Nima uchun tanada superdan foydalanishni tushuntiring
kichik sinfning misol usuli.
9.13 (Sinf tanasida olish usullarini chaqirish) 2-rasmda. 9.10–9.11 usullari daromad va to-
Har bir qo'ng'iroqni bir xil sinfdagi turli xil olish usullarini qatorga qo'ying. Bularni get deb atashning afzalliklarini tushuntiring
sinflar ichidagi usullar.
9.14 (Xodimlar ierarxiyasi) Ushbu bobda siz qaysi sinfdagi meros ierarxiyasini o'rgandingiz
BasePlusCommissionEmployee komissiya xodimi sinfidan meros qilib olingan. Biroq, barcha turlari emas
xodimlar komissiya xodimlaridir. Ushbu mashqda siz umumiyroq Xodimlar super klassini yaratasiz
Komissiya xodimi sinfidagi barcha xodimlar uchun umumiy bo'lgan atributlar va xatti-harakatlarni belgilaydi.
ishchilar. Barcha Xodimlar uchun umumiy atributlar va xatti-harakatlar: ism, familiya, ijtimoiySe-
curityNumber, getFirstName, getLastName, getSocialSecurityNumber va usulning bir qismi
toString. Ushbu misol o'zgaruvchilari va usullarini o'z ichiga olgan yangi yuqori sinf Xodimini yarating va a
konstruktor. Keyin, 9.4.5-bo'limdagi CommissionEmployee sinfini Xodimning kichik sinfi sifatida qayta yozing.
Class CommissionEmployee faqat o'zgaruvchilar va usullarni o'z ichiga olishi kerak, ular o'z ichiga olmaydi.
yuqori sinf xodimida aniqlandi. Class CommissionEmployee konstruktori sinf xodimini chaqirishi kerak
konstruktor va CommissionEmployee's toString usuli Employee's toString usulini chaqirishi kerak.
Ushbu o'zgartirishlarni bajarganingizdan so'ng, CommissionEmployeeTest va BasePlusCommis-ni ishga tushiring.
sionEmployeeTest ilovalari ushbu yangi sinflardan foydalanib, ilovalar hali ham bir xil natijalarni ko'rsatishini ta'minlash uchun
mos ravishda CommissionEmployee obyekti va BasePlusCommissionEmployee obyekti.
9.15 (Xodimlarning yangi kichik toifasini yaratish) Boshqa turdagi xodimlarga maoshli xodimlar kirishi mumkin.
Belgilangan haftalik maosh oladigan xodimlar, dona soni bo'yicha ish haqi oladigan PieceWorkers
ular ishlab chiqaradi yoki bir yarim soatlik ish haqi oladigan soatlik ishchilar - 1,5 baravar.
soatlik ish haqi - 40 soatdan ortiq ishlagan soatlar uchun.
HourlyEmployee sinfini yarating, u Employee sinfidan (9.14-mashq) meros bo‘lib o‘tadi.
ishlagan soatlarni ifodalovchi misol o'zgaruvchan soatlar (ikki barobar), misol o'zgaruvchan ish haqi (ikki marta)
ble) soatiga ish haqini ifodalovchi, argument sifatida ism, familiyani oladigan konstruktor
ism, ijtimoiy sug'urta raqami, soatlik ish haqi va ishlagan soatlar soni, belgilash va olish
Ish soatlari va ish haqini manipulyatsiya qilish koeffitsientlari, soatlik ishchilarni hisoblash uchun daromad usuli
ishlagan soatlar asosidagi daromad va HourlyEmployee'ni qaytaradigan toString usuli
String tasviri. SetWage usuli ish haqining manfiy bo'lmasligini ta'minlashi va soatlarni belgilashi kerak
soatlar qiymati 0 dan 168 gacha bo'lishini ta'minlashi kerak (haftadagi umumiy soatlar soni).
9.5-rasmdagiga o'xshash test dasturida HourlyEmployee sinfidan foydalaning.

10

Ob'ektga yo'naltirilgan


Dasturlash:
Polimorfizm va interfeyslar

Umumiy takliflar bunday emas


aniq ishlarni hal qilish.
- Oliver Vendell Xolms
Tajribali faylasuf
qaddi-qomati o'ylamaydi
vakuum. Hatto uning eng mavhum
g'oyalar, ma'lum darajada,
nima bor yoki nima emasligi bilan shartlangan
u davrida ma'lum
yashaydi.
- Alfred Shimoliy Uaytxed

Oh maqsadlar


Ushbu bobda siz:
■ tushunchasini o'rganing
polimorfizm.
■ Buning uchun bekor qilingan usullardan foydalaning
ta'sirli polimorfizm.
■ Abstraktni farqlash
va aniq sinflar.
■ mavhum usullarni e'lon qiling
mavhum sinflarni yaratish.
■ Polimorfizm qanday ekanligini bilib oling
tizimlarni kengaytiriladigan qiladi
va saqlanishi mumkin.
■ Ob'ekt turini aniqlang
bajarilish vaqti.
■ E'lon qiling va amalga oshiring
interfeyslar va bo'ling
Java SE 8 bilan tanish
interfeysni yaxshilash.

396 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.1 Kirish
Ob'ektga yo'naltirilgan dasturlashni o'rganishni tushuntirish va ko'rsatish orqali davom ettiramiz
meros ierarxiyasi bilan polimorfizm. Polimorfizm sizga "dasturlash" imkonini beradi
"Xususiy dastur" emas, balki "umumiy". Xususan, polimorfizm sizga imkon beradi
to'g'ridan-to'g'ri yoki ichkarida bir xil yuqori sinfga ega ob'ektlarni qayta ishlaydigan dasturlarni yozish uchun
to'g'ridan-to'g'ri, go'yo ularning barchasi supersinf ob'ektlari; bu dasturlashni soddalashtirishi mumkin.
Quyidagi polimorfizm misolini ko'rib chiqing. Aytaylik, biz shunday dastur yaratdik
biologik tadqiqot uchun bir necha turdagi hayvonlarning harakatini simulyatsiya qiladi. Baliq sinflari,
Qurbaqa va qush tekshirilayotgan hayvonlar turlarini ifodalaydi. Tasavvur qiling-a, har bir sinf
Harakat qilish usulini o'z ichiga olgan va hayvonning kursini saqlab turuvchi hayvon superklassini kengaytiradi.
xy koordinatalari sifatida joyni ijaraga oling. Har bir kichik sinf harakatni amalga oshiradi. Bizning dasturimiz
turli hayvonlar sub-mavzulari ob'ektlariga havolalarni o'z ichiga olgan Hayvonlar qatorini saqlaydi.
sinflar. Hayvonlarning harakatlarini taqlid qilish uchun dastur har bir ob'ektga bir xil xabar yuboradi.
sekundiga bir marta adaçayı - ya'ni harakat. Har bir o'ziga xos hayvon turi harakatga javob beradi
xabar o'ziga xos tarzda - baliq uch fut suzishi mumkin, qurbaqa besh fut sakrashi va a
Qush o'n fut uchishi mumkin. Har bir ob'ekt xy koordinatalarini mos ravishda qanday o'zgartirishni biladi
o'ziga xos harakat turi uchun. Har bir ob'ektga tayanib, qanday qilib "to'g'ri qilishni bilish
narsa” (ya’ni, ushbu turdagi ob’ektga mos keladigan narsani bajaring) xuddi shu usulga javoban
chaqiruv polimorfizmning asosiy tushunchasidir. Xuddi shu xabar (bu holda, ko'chirish) a ga yuborilgan
ob'ektlarning xilma-xilligi turli xil natijalarga ega - shuning uchun polimorfizm atamasi.

10.1 Kirish


10.2 Polimorfizmga misollar
10.3 Polimorf xatti-harakatni ko'rsatish
10.4 Referat sinflari va usullari
10.5 Misol: Ish haqi tizimidan foydalanish
Polimorfizm
10.5.1 Abstrakt supersinf xodimi
10.5.2 Betonning kichik sinfi
Maoshli xodim
10.5.3 Beton kichik sinfi soatlik xodim
10.5.4 Betonning kichik sinfi
Komissiya xodimi
10.5.5 Bilvosita betonning kichik sinfi
BasePlusCommission xodimi
10.5.6 Polimorfik ishlov berish, Operator
instanceof va Downcasting
10.6 O'rtasida ruxsat etilgan topshiriqlar
Superklass va pastki sinf o'zgaruvchilari
10.7 Yakuniy usullar va darslar
10.8 Muammolarni chuqurroq tushuntirish
Konstruktorlardan qo'ng'iroq qilish usullari

10.9 Interfeyslarni yaratish va ulardan foydalanish


10.9.1 To'lov ierarxiyasini ishlab chiqish
10.9.2 Interfeys to'lanadi
10.9.3 Sinf hisob-fakturasi
10.9.4 Sinf xodimini o'zgartirish
Interfeys to'lanishini amalga oshirish
10.9.5 Sinfni o'zgartirish
Foydalanish uchun SalariedEmployee
To'lov ierarxiyasi
10.9.6 Qayta ishlash uchun to'lanadigan interfeysdan foydalanish
Hisob-fakturalar va xodimlar
Polimorfik
10.9.7 Java ning ba'zi umumiy interfeyslari
API
10.10 Java SE 8 interfeysini yaxshilash
10.10.1 Standart interfeys usullari
10.10.2 Statik interfeys usullari
10.10.3 Funktsional interfeyslar
10.11 (ixtiyoriy) GUI va grafik ishi
O'rganish: Polimorfizm bilan chizish
10.12 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar |


Mashqlar | Farq qilish

10.1 Kirish 397

Kengaytirish uchun amalga oshirish
Polimorfizm yordamida biz osongina kengaytiriladigan tizimlarni loyihalashimiz va amalga oshirishimiz mumkin - yangi
sinflar dasturning umumiy qismlariga ozgina yoki umuman o'zgartirishlarsiz qo'shilishi mumkin;
yangi sinflar dastur ishlov beradigan meros ierarxiyasining bir qismi ekan
umumiy. Yangi sinflar shunchaki "ulang". Majburiy dasturning yagona qismlari
Biz ierarxiyaga qo'shadigan yangi sinflarni to'g'ridan-to'g'ri bilishni talab qiladiganlar o'zgartirilishi mumkin.
arxi. Misol uchun, agar biz Kaplumbağa sinfini yaratish uchun Animal sinfini kengaytirsak (bu yana bir xil bo'lishi mumkin).
bir dyuym emaklab harakat xabariga spond), biz faqat Tortoise sinfini yozishimiz kerak
va simulyatsiyaning Tortoise ob'ektini yaratuvchi qismi. Simlarning qismlari -
Har bir Hayvonga umumiy harakat qilishni buyuradigan qoidalar o'zgarishsiz qolishi mumkin.

Bobga umumiy nuqtai


Birinchidan, biz polimorfizmning umumiy misollarini muhokama qilamiz. Keyin oddiy misol keltiramiz
polimorfik xatti-harakatni ko'rsatish. Biz ikkala yuqori sinfni manipulyatsiya qilish uchun yuqori sinf havolalaridan foydalanamiz.
perclass ob'ektlari va pastki sinf ob'ektlari polimorf.
Keyin biz 9.4.5-bo'limning xodimlar ierarxiyasini qayta ko'rib chiqadigan amaliy tadqiqotni taqdim etamiz. Biz
haftalik ish haqini polimorf tarzda hisoblaydigan oddiy ish haqi ilovasini ishlab chiqing.
har bir xodimning daromad olish usulidan foydalangan holda har xil turdagi xodimlar. Garchi
har bir turdagi xodimlarning daromadlari o'ziga xos tarzda hisoblab chiqiladi, polimorfizm bizga imkon beradi
xodimlarni "umumiy ravishda" qayta ishlash. Misollarni o'rganishda biz ierarxiyani kengaytiramiz
ikkita yangi sinfni o'z ichiga oladi - SalariedEmployee (haftalik maoshi belgilangan odamlar uchun) va
HourlyEmployee (odamlar uchun soatlik ish haqi va qo'shimcha ish uchun "vaqt-yarim").
Biz yangilangan ierarxiyadagi barcha sinflar uchun umumiy funktsiyalar to'plamini e'lon qilamiz
“abstrakt” sinf, Xodim, qaysi “aniq” sinflar MaoshliXodim, Soatlik Ishchi-
xodim va komissiya xodimi to'g'ridan-to'g'ri meros qilib olinadi va "beton" sinf BasePlusCommis-
sionEmployee bilvosita meros oladi. Tez orada ko'rasiz, biz har bir xodimni chaqirganimizda
yuqori sinf bo'yicha daromad usuli Xodimlar ma'lumotnomasi (xodimning turidan qat'i nazar), kor-
to'g'ridan-to'g'ri daromad subklassini hisoblash Java-ning polimorfik imkoniyatlari tufayli amalga oshiriladi.

Spesifikda dasturlash


Vaqti-vaqti bilan, polimorf ishlov berishda, biz "xususan" dasturlashimiz kerak.
cific." Bizning Xodimlarimizning amaliy tadqiqotlari dasturning turini aniqlashi mumkinligini ko'rsatadi
bajarilish vaqtida ob'ekt va shunga mos ravishda ushbu ob'ektda harakat qiling. Vaziyatni o'rganishda biz qaror qildik
BasePlusCommission Xodimlari o'zlarining asosiy maoshlariga 10% oshirishlari kerak. Shunday qilib,
Biz ushbu imkoniyatlardan ma'lum bir xodim ob'ekti baza ekanligini aniqlash uchun foydalanamiz.
PlusKomissiya xodimi. Agar shunday bo'lsa, biz o'sha xodimning asosiy ish haqini 10% ga oshiramiz.

Interfeyslar


Bob Java interfeyslariga kirish bilan davom etadi, ular ayniqsa foydalidir
bir-biriga bog'liq bo'lmagan sinflarga umumiy funksiyalarni belgilash uchun. Bu ob'ektlarga imkon beradi
bu sinflar polimorf tarzda qayta ishlanishi kerak - xuddi shu narsani amalga oshiradigan sinflar ob'ektlari
interfeys barcha interfeys usuli chaqiruvlariga javob berishi mumkin. Yaratishni ko'rsatish va biz-
Interfeyslar yordamida biz umumiy kreditorlik qarzini yaratish uchun ish haqi to'lash dasturini o'zgartiramiz
kompaniya xodimlari uchun to'lanadigan to'lovlarni va hisob-faktura summalarini hisoblab chiqishi mumkin bo'lgan ilova
sotib olingan tovarlar uchun hisob-kitob qilish.

398 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.2 Polimorfizmga misollar
Polimorfizmning bir nechta qo'shimcha misollarini ko'rib chiqaylik.

To'rtburchaklar


Agar Rectangle klassi Quadrilateral sinfidan olingan bo'lsa, Rectangle ob'ekti ko'proq bo'ladi
to'rtburchakning o'ziga xos versiyasi. Har qanday operatsiya (masalan, perimetrni hisoblash yoki
To'rtburchakda bajarilishi mumkin bo'lgan maydon) to'rtburchakda ham bajarilishi mumkin.
Bu amallar boshqa to'rtburchaklarda ham bajarilishi mumkin, masalan, Kvadratlar, Par-
allelogrammalar va trapezoidlar. Polimorfizm dastur metotni chaqirganda yuzaga keladi.
od superklass orqali to'rtburchak o'zgaruvchi - bajarilish vaqtida, to'g'ri kichik sinf
Usulning versiyasi superklassda saqlangan murojaat turiga qarab chaqiriladi
o'zgaruvchan. Siz 10.3-bo'limda ushbu jarayonni ko'rsatadigan oddiy kod misolini ko'rasiz.

Video o'yindagi kosmik ob'ektlar


Aytaylik, biz Mars, Venera, Plu- sinfidagi ob'ektlarni manipulyatsiya qiladigan video o'yinni loyihalashtiramiz.
tonian, SpaceShip va LaserBeam. Tasavvur qiling-a, har bir sinf yuqori sinfdan meros bo'lib o'tadi
Chizish usulini o'z ichiga olgan SpaceObject. Har bir kichik sinf bu usulni amalga oshiradi. A
ekran menejeri ob'ektlarga havolalar to'plamini (masalan, SpaceObject massivi) saqlaydi
turli sinflar. Ekranni yangilash uchun ekran menejeri vaqti-vaqti bilan har bir ob'ektni yuboradi
bir xil xabar - ya'ni chizish. Biroq, har bir ob'ekt o'ziga xos tarzda javob beradi
sinf. Masalan, Mars ob'ekti yashil ko'zlari bilan qizil rangda chizishi mumkin.
antennalarning aniq soni. SpaceShip ob'ekti o'zini yorqin kumush rangli uchuvchi sau sifatida chizishi mumkin.
cer. LaserBeam ob'ekti o'zini ekran bo'ylab yorqin qizil nur sifatida chizishi mumkin. Yana,
Turli xil ob'ektlarga yuborilgan bir xil xabar (bu holda, chizish) natijalarning "ko'p shakllariga" ega.
Ekran menejeri tizimga yangi sinflar qo'shishni osonlashtirish uchun polimorfizmdan foydalanishi mumkin
tizim kodiga minimal o'zgartirishlar bilan. Aytaylik, biz Merkuriyni qo'shmoqchimiz
bizning video o'yinimiz uchun ob'ektlar. Buning uchun biz SpaceOb-ni kengaytiradigan Mercurian sinfini quramiz.
ject va o'zining chizish usulini amalga oshirishni ta'minlaydi. Merkuriy ob'ektlari paydo bo'lganda
SpaceObject to'plamida ekran menejeri kodi xuddi u kabi chizish usulini chaqiradi
turidan qat'iy nazar, to'plamdagi har bir boshqa ob'ekt uchun qiladi. Shunday qilib, yangi Merkuriy ob'ektlari
Ekran menejeri kodini o'zgartirmasdan oddiygina "to'g'ridan-to'g'ri ulang"
grammatika. Shunday qilib, tizimni o'zgartirmasdan (yangi sinflarni qurishdan tashqari va
yangi ob'ektlarni yaratadigan kodni o'zgartiring), siz polimorfizmdan qulay tarzda foydalanishingiz mumkin
tizim yaratilganda ham hisobga olinmagan qo'shimcha turlarni o'z ichiga oladi.

Dasturiy ta'minot muhandisligi kuzatuvi 10.1


Polimorfizm sizga umumiylik bilan shug'ullanish va bajarilish vaqti muhitiga ruxsat berish imkonini beradi
xususiyatlari bilan shug'ullaning. Siz ob'ektlarga ushbu ob'ektlarga mos keladigan tarzda harakat qilishni aytishingiz mumkin,
ularning o'ziga xos turlarini bilmasdan, agar ular bir xil meros ierarxiyasiga tegishli bo'lsa.

Dasturiy ta'minot muhandisligi kuzatuvi 10.2


Polimorfizm kengayishni ta'minlaydi: polimorf xatti-harakatni chaqiruvchi dasturiy ta'minot
xabarlar yuboriladigan ob'ekt turlaridan mustaqil. Javob beradigan yangi ob'ekt turlari
mavjud usulga qo'ng'iroqlar asosiy tizimni o'zgartirmasdan tizimga kiritilishi mumkin.
Faqat yangi ob'ektlarni yaratuvchi mijoz kodi yangi turlarga moslashish uchun o'zgartirilishi kerak.

10.3 Polimorf xulq-atvorni namoyish qilish 399



10.3 Polimorf xatti-harakatni ko'rsatish
9.4-bo'lim sinf ierarxiyasini yaratdi, unda BasePlusCommissionEmployee sinfi o'z ichiga oladi.
Komissiya xodimidan olingan. Ushbu bo'limdagi misollar manipulyatsiya qilingan Komissiya-
Employee va BasePlusCommissionEmployee ob'ektlari ularga havolalar yordamida
ularning usullarini ishga tushiring - biz supersinf o'zgaruvchilarini yuqori sinf ob'ektlari va kichik sinflarga qaratdik
subsinf ob'ektlaridagi o'zgaruvchilar. Bu topshiriqlar tabiiy va sodda - super-
sinf o'zgaruvchilari yuqori sinf ob'ektlariga murojaat qilish uchun mo'ljallangan va pastki sinf o'zgaruvchilari
pastki sinf ob'ektlariga murojaat qilish. Biroq, tez orada ko'rib turganingizdek, boshqa topshiriqlar ham mumkin.
Keyingi misolda biz pastki sinf ob'ektiga superklass havolasini maqsad qilib qo'yamiz. Keyin ko'rsatamiz
Qanday qilib pastki sinf ob'ektida superklass mos yozuvlar orqali usulni chaqirish pastki sinfni chaqiradi
funksionallik - o'zgaruvchining turini emas, balki havola qilingan ob'ektning turini aniqlaydi
qaysi usul deyiladi. Ushbu misol kichik sinf ob'ektini davolash mumkinligini ko'rsatadi
turli qiziqarli manipulyatsiyalarni amalga oshirishga imkon beruvchi o'zining yuqori sinfining ob'ekti sifatida. Dastur yaratishi mumkin
ko'plab kichik sinf turlarining ob'ektlariga tegishli superklass o'zgaruvchilari massivi. Bunga ruxsat berilgan
chunki har bir kichik sinf ob'ekti o'zining yuqori sinfining ob'ektidir. Masalan, biz belgilashimiz mumkin
BasePlusCommissionEmployee ob'ektining yuqori sinf komissiyasi xodimiga havolasi
o'zgaruvchi, chunki BasePlusCommissionEmployee komissiya xodimi - shuning uchun biz buni qila olamiz
BasePlusCommissionEmployeega komissiya xodimi sifatida munosabatda bo'ling.
Keyinchalik bobda bilib olganingizdek, siz supersinf ob'ektini pastki sinf sifatida ko'rib chiqa olmaysiz
ob'ekt, chunki supersinf ob'ekti uning pastki sinflarining ob'ekti emas. Masalan, biz
BasePlusCom- kichik sinfiga komissiya xodimi ob'ektining havolasini tayinlay olmaydi
missionEmployee o'zgaruvchisi, chunki komissiya xodimi BasePlusCommission- emas
Xodim - komissiya xodimi asosiy Maosh misoli o'zgaruvchisiga ega emas va shunday qiladi
setBaseSalary va getBaseSalary usullari mavjud emas. Is-a munosabatlari faqat amal qiladi
ierarxiyani pastki sinfdan uning to'g'ridan-to'g'ri (va bilvosita) yuqori sinflariga ko'taring va aksincha emas
(ya'ni, ierarxiya bo'yicha yuqori sinfdan uning pastki sinflariga yoki bilvosita kichik sinflarga emas).
Java kompilyatori pastki sinfga superklass havolasini tayinlashga imkon beradi
o'zgaruvchi, agar biz pastki sinf turiga yuqori sinf havolasini aniq yuborsak. Nega biz
Hech qachon bunday topshiriqni bajarishni xohlaysizmi? Yuqori sinf havolasi faqat chaqirish uchun ishlatilishi mumkin
superklassda e'lon qilingan usullar - faqat pastki sinf usullarini chaqirishga urinish
superklass ma'lumotnomasi orqali kompilyatsiya xatolariga olib keladi. Agar dastur bajarilishi kerak bo'lsa
yuqori sinf o'zgaruvchisi tomonidan havola qilingan kichik sinf ob'ektidagi kichik sinfga xos operatsiya,
dastur birinchi navbatda yuqori sinf havolasini texnika orqali quyi sinf ma'lumotnomasiga yuborishi kerak
pastga tushirish deb nomlanadi. Bu dasturga subklass bo'lmagan usullarni chaqirish imkonini beradi
supersinfda. Biz 10.5-bo'limda pastga tushirish mexanikasini ko'rsatamiz.

10.1-rasmdagi misolda yuqori sinf va kichik sinf o'zgaruvchanligidan foydalanishning uchta usuli ko'rsatilgan.


yuqori va pastki sinf ob'ektlariga havolalarni saqlashga qodir. Birinchi ikkitasi aniq -
palata - 9.4-bo'limda bo'lgani kabi, biz yuqori sinf o'zgaruvchisiga yuqori sinf havolasini tayinlaymiz va
pastki sinf o'zgaruvchisiga quyi sinf havolasi. Keyin o'rtasidagi munosabatni ko'rsatamiz
subsinflar va yuqori sinflar (ya'ni, is-a munosabatlari) subsinfga havolani belgilash orqali
superklass o'zgaruvchisi. Ushbu dastur CommissionEmployee va BasePlusCommis- sinflaridan foydalanadi.
sionEmployee mos ravishda 9.10-rasm va 9.11-rasm.

Dasturiy ta'minot muhandisligi kuzatuvi 10.3


Ruxsat berilgan bo'lsa-da, siz odatda pastga tushirishdan qochishingiz kerak.

400 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

1 // 10.1-rasm: PolymorphismTest.java
2 // Superklass va pastki sinfga havolalarni o'ta sinfga belgilash va
3 // pastki sinf o'zgaruvchilari.
4
5 ommaviy sinf Polimorfizm testi
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12
13
14
15
16
17
18 // super klass o'zgaruvchisi yordamida superklass ob'ektida toString ni chaqiring
19 System.out.printf("%s %s:%n%n%s%n%n",
20 "Komissiya xodimiga Superklass ma'lumotnomasi bilan qo'ng'iroq qiling",
21 "supersinf ob'ektiga", );
22
23 // pastki sinf o'zgaruvchisi yordamida pastki sinf ob'ektida toString ni chaqiring
24 System.out.printf("%s %s:%n%n%s%n%n",
25 "Subklass bilan BasePlusCommission xodimiga qo'ng'iroq qiling",
26 "kichik sinf ob'ektiga havola",
27);
28
29 // superklass o'zgaruvchisi yordamida pastki sinf ob'ektida toString ni chaqiring
30
31
32 System.out.printf("%s %s:%n%n%s%n",
33 "Superclass bilan BasePlusCommission xodimiga qo'ng'iroq qiling",
34 "kichik sinf ob'ektiga havola", );
35 } // asosiyni tugatish
36 } // yakuniy sinf PolymorphismTest

Superclass havolasi bilan komissiya xodimining toString xizmatiga qo'ng'iroq qiling


ob'ekt:
komissiya xodimi: Sue Jons
ijtimoiy xavfsizlik raqami: 222-22-2222
yalpi savdo: 10000.00
komissiya stavkasi: 0,06
BasePlusCommissionEmployee's toString-ga quyi sinfga havola bilan qo'ng'iroq qiling
pastki sinf ob'ekti:
bazaviy ish haqi komissiyasi xodimi: Bob Lyuis
ijtimoiy xavfsizlik raqami: 333-33-3333
yalpi savdo: 5000.00
komissiya stavkasi: 0,04
asosiy ish haqi: 300.00

10.1-rasm | Yuqori sinf va pastki sinf o'zgaruvchilariga yuqori sinf va pastki sinf havolalarini belgilash.


(2-qismning 1-qismi.)

// yuqori sinf o'zgaruvchisiga yuqori sinf havolasini tayinlash


Komissiya xodimlari komissiyasi xodimi = yangi komissiya xodimi(
"Sue", "Jons", "222-22-2222", 10000, .06);

// pastki sinf o'zgaruvchisiga pastki sinf havolasini tayinlash


BasePlusCommissionEmployee basePlusCommissionEmployee =
yangi BasePlusCommissionEmployee(
"Bob", "Lyuis", "333-33-3333", 5000, .04, 300);

komissiyaEmployee.toString()

basePlusCommissionEmployee.toString()

Komissiya Xodimlar komissiyasi Xodim2 =


basePlusCommissionEmployee;

CommissionEmployee2.toString()


10.4 Referat sinflari va usullari 401



10.1-rasmda 10–11 qatorlar Komissiya xodimi obyektini yaratadi va unga havolani tayinlaydi.
komissiya xodimi o'zgaruvchisiga. 14–16 qatorlar BasePlusCommissionEmployee-ni yaratadi
ob'ektni tanlang va uning havolasini BasePlusCommissionEmployee o'zgaruvchisiga belgilang. Bu tayinlash-
mentlar tabiiydir - masalan, komissiya xodimi o'zgaruvchisining asosiy maqsadi
komissiya xodimi ob'ektiga havolani ushlab turing. 19-21-qatorlarda komissiya xodimi ishlatiladi
toString ni aniq chaqirish uchun. Chunki komissiya xodimi komissiya xodimiga ishora qiladi.
ployee ob'ekti, toString ning komissiyasi superklassi Employee versiyasi chaqiriladi. Xuddi shunday,
24–27 qatorlar Base-da toString-ni aniq chaqirish uchun basePlusCommissionEmployee-dan foydalanadi.
PlusCommissionEmployee obyekti. Bu BasePlusCommissionEmployee pastki sinfini chaqiradi
toString versiyasi.
30-31-qatorlar, keyin subclass ob'ektiga havolani tayinlang basePlusCommissionEm-
32–34-qatorlar chaqirish uchun foydalanadigan superklass komissiyasi o'zgaruvchisiga o'tadi
toString usuli. Superklass o'zgaruvchisi pastki sinf ob'ektiga havolani o'z ichiga olganida va
bu havola usulni chaqirish uchun ishlatiladi, metodning pastki sinf versiyasi chaqiriladi. Demak,
34-qatordagi komissiyaEmployee2.toString() aslida BasePlusCommissionEm- sinfini chaqiradi.
ployening toString usuli. Java kompilyatori ushbu "krossover" ga ruxsat beradi, chunki ob'ekt
kichik sinf uning yuqori sinfining ob'ekti (lekin aksincha emas). Kompilyator duch kelganda -
o'zgaruvchi orqali amalga oshirilgan usul chaqiruvini tersa, kompilyator usul bo'lishi mumkinligini aniqlaydi
o'zgaruvchining sinf turini tekshirish orqali chaqiriladi. Agar bu sinfda deklaratsiyaning tegishli usuli mavjud bo'lsa
ratsion (yoki meros qilib oladi), qo'ng'iroq tuziladi. Amalga oshirish vaqtida ob'ekt turi
o'zgaruvchiga tegishli bo'lgan haqiqiy foydalanish usulini belgilaydi. Bu jarayon dinamik deb ataladi
majburiy, 10.5-bo'limda batafsil muhokama qilinadi.
10.4 Referat sinflari va usullari
Biz sinf haqida o'ylaganimizda, dasturlar shu turdagi ob'ektlarni yaratadi deb taxmin qilamiz. Biroz-
Mavhum sinflar deb ataladigan sinflarni e'lon qilish foydali bo'ladi, ular uchun siz hech qachon xohlamaysiz.
ob'ektlarni yaratish. Ular meros ierarxiyasida faqat yuqori sinflar sifatida foydalanilgani uchun biz havola qilamiz
ularga mavhum supersinflar sifatida. Ushbu sinflarni ob'ektlarni yaratish uchun ishlatib bo'lmaydi, chunki
sababi, biz tez orada ko'ramiz, mavhum sinflar to'liq emas. Kichik sinflar "yo'qolgan" deb e'lon qilishlari kerak
bo'laklar" "beton" sinflarga aylanadi, ulardan siz ob'ektlarni yaratishingiz mumkin. Aks holda,
bu kichik sinflar ham mavhum bo'ladi. Biz 10.5-bo'limda mavhum sinflarni ko'rsatamiz.
Abstrakt darslarning maqsadi
Abstrakt sinfning maqsadi boshqa sinflardan mos keladigan yuqori sinfni taqdim etishdir
meros qilib olishi va shu bilan umumiy dizaynni baham ko'rishi mumkin. 9.3-rasmdagi Shakl ierarxiyasida imtihon uchun-

BasePlusCommissionEmployee's toString-ga superklass havolasi bilan qo'ng'iroq qiling


pastki sinf ob'ekti:
bazaviy ish haqi komissiyasi xodimi: Bob Lyuis
ijtimoiy xavfsizlik raqami: 333-33-3333
yalpi savdo: 5000.00
komissiya stavkasi: 0,04
asosiy ish haqi: 300.00

10.1-rasm | Yuqori sinf va pastki sinf o'zgaruvchilariga yuqori sinf va pastki sinf havolalarini belgilash.


(2-qismning 2-qismi.)

402 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

ple, kichik sinflar Shakl bo'lish nimani anglatishi haqidagi tushunchani meros qilib oladi - ehtimol, umumiy xususiyat.
joylashuv, rang va chegara Qalinligi va chizish, ko'chirish kabi xatti-harakatlar,
hajmini o'zgartiring va rangni o'zgartiring. Ob'ektlarni misol qilish uchun ishlatilishi mumkin bo'lgan sinflar beton deb ataladi
sinflar. Bunday sinflar o'zlari e'lon qilgan har bir usulni amalga oshirishni ta'minlaydi (ba'zilari
ilovalar meros qilib olinishi mumkin). Masalan, biz Circle aniq sinflarini olishimiz mumkin,
TwoDimensionalShape mavhum superklassidan kvadrat va uchburchak. Xuddi shunday, biz ham qila olardik
ThreeDi- mavhum superklassidan Sphere, Cube va Tetraedron konkret sinflarini oling.
mensional Shape. Mavhum supersinflar haqiqiy ob'ektlarni yaratish uchun juda umumiy - ular aniqlaydi
faqat kichik sinflar orasida keng tarqalgan narsa. Yaratishdan oldin aniqroq bo'lishimiz kerak
ob'ektlar. Misol uchun, agar siz TwoDimensionalShape abstrakt sinfiga chizish xabarini yuborsangiz,
sinf ikki o'lchovli shakllar chizilgan bo'lishi kerakligini biladi, lekin u bilmaydi
qanday aniq shaklni chizish kerak, shuning uchun u haqiqiy chizish usulini amalga oshira olmaydi. Beton sinflar
ob'ektlarni yaratishni oqilona qiladigan xususiyatlarni taqdim eting.
Hamma ierarxiyalarda mavhum sinflar mavjud emas. Biroq, siz tez-tez mijoz kodini yozasiz
mijoz kodining diapazonga bog'liqligini kamaytirish uchun faqat mavhum superklass turlaridan foydalanadi
pastki sinf turlaridan. Masalan, abstrakt parametri bilan metod yozishingiz mumkin
superklass turi. Chaqirilsa, bunday usul har qanday konkret sinf ob'ektini qabul qilishi mumkin
to'g'ridan-to'g'ri yoki bilvosita parametr turi sifatida ko'rsatilgan yuqori sinfni kengaytiradi.
Mavhum sinflar ba'zan ierarxiyaning bir necha darajalarini tashkil qiladi. Masalan,
9.3-rasmdagi shakllar ierarxiyasi Shape mavhum sinfidan boshlanadi. Ierning keyingi darajasida -
archy - TwoDimensionalShape va ThreeDimensionalShape mavhum sinflari. Keyingi
ierarxiya darajasi TwoDimensionalShapes (doira, kvadrat) uchun aniq sinflarni e'lon qiladi.
va Uchburchak) va Uch o'lchovli shakllar uchun (Sfera, kub va tetraedr).
Abstrakt sinf va mavhum usullarni e'lon qilish
Abstrakt kalit so'zi bilan e'lon qilib, sinf abstraktini yaratasiz. Abstrakt sinf ham -
mally bir yoki bir nechta mavhum usullarni o'z ichiga oladi. Mavhum usul - bu misol usuli
kabi deklaratsiyasida abstract kalit so'zi bilan

Mavhum usullar amalga oshirishni ta'minlamaydi. Har qanday abstraktni o'z ichiga olgan sinf


metodlar aniq mavhum deb e'lon qilinishi kerak, hatto bu sinfda ba'zi konkret bo'lsa ham
(abstrakt bo'lmagan) usullar. Mavhum supersinfning har bir aniq kichik sinfi ham ta'minlashi kerak
supersinfning har bir mavhum usullarining aniq amalga oshirilishi. Konstruktorlar va
statik usullarni mavhum deb e'lon qilib bo'lmaydi. Konstruktorlar meros qilib olinmaydi, shuning uchun an
mavhum konstruktor hech qachon amalga oshirilmaydi. Shaxsiy bo'lmagan statik bo'lsa-da
usullar meros bo'lib, ularni bekor qilib bo'lmaydi. Chunki mavhum usullar mo'ljallangan
ob'ektlarni turlari bo'yicha qayta ishlashlari uchun bekor qilinishi mumkin, bu qilmaydi
statik usulni mavhum deb e'lon qilish ma'nosi.

ommaviy mavhum bekor chizish(); // mavhum usul

Dasturiy ta'minot muhandisligi kuzatuvi 10.4
Mavhum sinf umumiy atributlar va xatti-harakatlarni e'lon qiladi (ham mavhum, ham konkret)
sinf ierarxiyasidagi turli sinflar. Mavhum sinf odatda bir yoki bir nechtasini o'z ichiga oladi
mavhum usullar, agar ular aniq bo'lsa, quyi sinflar bekor qilinishi kerak. Misol
mavhum sinfning o'zgaruvchilari va aniq usullari odatdagi qoidalariga bo'ysunadi
meros olish.

10.4 Referat darslari va usullari 403

O'zgaruvchilarni e'lon qilish uchun abstrakt sinflardan foydalanish
Garchi biz mavhum supersinflar ob'ektlarini yarata olmasak ham, tez orada buni ko'rasiz
har qanday ob'ektga havolalarni o'z ichiga oladigan o'zgaruvchilarni e'lon qilish uchun mavhum yuqori sinflardan foydalaning.
krit klassi o'sha mavhum supersinflardan olingan. Biz manipulyatsiya qilish uchun bunday o'zgaruvchilardan foydalanamiz
pastki sinf ob'ektlari polimorf. Siz chaqirish uchun mavhum superklass nomlaridan ham foydalanishingiz mumkin
bu mavhum supersinflarda e'lon qilingan statik usullar.
Polimorfizmning boshqa qo'llanilishini ko'rib chiqing. Chizish dasturi ko'rsatilishi kerak
ko'p shakllar, jumladan, yozganingizdan keyin tizimga qo'shadigan yangi shakllar turlari
chizish dasturi. Chizish dasturida doiralar kabi shakllarni ko'rsatish kerak bo'lishi mumkin.
Shaklning mavhum sinfidan olingan uchburchaklar, to'rtburchaklar yoki boshqalar. Rasm chizish pro-
gram ko'rsatiladigan ob'ektlarni boshqarish uchun Shakl o'zgaruvchilaridan foydalanadi. Har qanday ob'ektni chizish uchun
bu meros ierarxiyasida chizma dasturi superklass Shape o'zgaruvchisidan foydalanadi.
ob'ektni chizish usulini chaqirish uchun pastki sinf ob'ektiga havola qilish. Bu usul
Shakl superklassida mavhum deb e'lon qilinadi, shuning uchun har bir aniq kichik sinf amalga oshirilishi kerak
usuli ushbu shaklga xos tarzda chizish - Shakl merosidagi har bir ob'ekt
ierarxiya o'zini qanday chizishni biladi. Chizish dasturi haqida tashvishlanishga hojat yo'q
har bir ob'ektning turi yoki dastur shu turdagi ob'ektlarga duch kelganmi yoki yo'qmi.

Qatlamli dasturiy ta'minot tizimlari


Polimorfizm, ayniqsa, qatlamli dasturiy ta'minot tizimlarini amalga oshirish uchun samarali.
Operatsion tizimlarda, masalan, jismoniy qurilmalarning har bir turi bir-biridan farq qilishi mumkin.
boshqalardan butunlay. Shunga qaramay, qurilmalardan va qurilmalarga ma'lumotlarni o'qish yoki yozish buyruqlari bo'lishi mumkin
muayyan bir xillikka ega. Har bir qurilma uchun operatsion tizim dasturiy ta'minotdan foydalanadi
tizim va qurilma o'rtasidagi barcha aloqalarni boshqarish uchun qurilma drayverini chaqirdi. The
qurilma drayveri ob'ektiga yuborilgan yozish xabari kontekstda maxsus talqin qilinishi kerak.
ushbu drayverning matni va u muayyan turdagi qurilmalarni qanday boshqarishi. Biroq, yozish
qo'ng'iroqning o'zi haqiqatan ham tizimdagi boshqa qurilmalarga yozishdan farq qilmaydi - bir oz joylashtiring
xotiradan ushbu qurilmaga o'tkaziladigan baytlar soni. Ob'ektga yo'naltirilgan operatsion tizim
barcha qurilma drayverlari uchun mos “interfeys”ni ta'minlash uchun mavhum superklassdan foydalanishi mumkin.
Keyin, mavhum yuqori sinfdan meros bo'lib, barcha kichik sinflar hosil bo'ladi.
xuddi shunday ega. Qurilma-drayv usullari abstraktda mavhum usullar sifatida e'lon qilinadi
supersinf. Ushbu mavhum usullarni amalga oshirish konkretda ko'rsatilgan
qurilma drayverlarining o'ziga xos turlariga mos keladigan kichik sinflar. Yangi qurilmalar har doim
ko'pincha operatsion tizim chiqarilgandan keyin ancha keyin ishlab chiqilmoqda. Sotib olganingizda
yangi qurilma, u qurilma sotuvchisi tomonidan taqdim etilgan qurilma drayveri bilan birga keladi. Qurilma
uni kompyuteringizga ulab, drayverni o'rnatganingizdan so'ng darhol ishlaydi. Bu
polimorfizm tizimlarni kengaytirilishiga yana bir ajoyib misoldir.

Umumiy dasturlash xatosi 10.1


Abstrakt sinf ob'ektini yaratishga urinish kompilyatsiya xatosidir.

Umumiy dasturlash xatosi 10.2


Subklassda supersinfning mavhum usullarini amalga oshirmaslik kompilyatsiya xatosidir
pastki sinf ham mavhum deb e'lon qilinmasa.

404 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.5 Case Study: Polimorfizmdan foydalangan holda ish haqi tizimi
Ushbu bo'lim CommissionEmployee-BasePlusCommissionEmployee ierariyasini qayta ko'rib chiqadi.
Biz 9.4-bo'lim davomida o'rganib chiqdik. Endi biz mavhum usuldan foydalanamiz va poli-
morfizm kengaytirilgan xodim merosiga asoslangan ish haqi hisob-kitoblarini amalga oshirish
quyidagi talablarga javob beradigan ierarxiya:
Kompaniya o'z xodimlariga haftalik maosh to'laydi. Xodimlar to'rt xil: maoshli
xodimlarga ishlagan soatlari sonidan qat'i nazar, haftalik qat'iy belgilangan ish haqi, soatiga to'lanadi
Xodimlar soatiga to'lanadi va qo'shimcha ish haqi oladi (ya'ni, soatlik ish haqining 1,5 barobari).
40 soatdan ortiq ishlagan barcha soatlar uchun komissiya xodimlariga har bir ish haqi to'lanadi.
ularning sotilishining ulushi va bazaviy ish haqi bo'yicha komissiya xodimlari asosiy ish haqini oladilar
ularning sotish foizi. Joriy ish haqi davri uchun kompaniya mukofotlashga qaror qildi
komissiya xodimlarining asosiy ish haqiga 10% qo'shish orqali. Shirkat
sizdan ish haqi hisob-kitoblarini polimorfik tarzda amalga oshiradigan ariza yozishingizni xohlaydi.
Xodimning umumiy tushunchasini ifodalash uchun biz mavhum sinf Xodimidan foydalanamiz. The
Xodimlarni kengaytiradigan sinflar - Maoshli xodim, komissiya xodimi va soatlik.
Xodim. Class BasePlusCommissionEmployee—komissiya xodimini kengaytiradi—
oxirgi xodim turini ifodalaydi. 10.2-rasmdagi UML sinf diagrammasi merosxo'rlikni ko'rsatadi.
Bizning polimorfik xodimlarga ish haqi to'lash ilovamiz uchun ierarxiya. Abstrakt sinf nomi
Xodim kursiv bilan yozilgan - UML konventsiyasi.

Mavhum supersinf Xodim ierarxiyaga "interfeys" ni, ya'ni to'plamni e'lon qiladi.


dastur barcha Xodimlar ob'ektlarida chaqirishi mumkin bo'lgan usullar. Biz "interfeys" atamasidan foydalanamiz
bu erda umumiy ma'noda dasturlarning ob'ektlar bilan bog'lanishining turli usullarini nazarda tutadi
Xodimlarning har qanday kichik toifasi. "Interfeys" haqidagi umumiy tushunchani chalkashtirmaslik uchun ehtiyot bo'ling.
Java interfeysining rasmiy tushunchasi bilan, 10.9-bo'lim mavzusi. Har bir xodim,
uning daromadlari qanday hisoblanganidan qat'i nazar, ismi, familiyasi va a
ijtimoiy xavfsizlik raqami, shuning uchun shaxsiy misol o'zgaruvchilari firstName, LastName va social-
SecurityNumber mavhum supersinfda ko'rinadi.
10.3-rasmdagi diagrammada chap tomonda joylashgan ierarxiyadagi beshta sinfning har biri ko'rsatilgan.
tomoni va usullari daromad va yuqori bo'ylab toString. Har bir sinf uchun diagramma
har bir usulning kerakli natijalarini ko'rsatadi. Biz yuqori sinf xodimlarining olish usullarini sanab o'tmaymiz
chunki ular kichik sinflarning hech birida bekor qilinmagan - bu usullarning har biri meros qilib olingan
va har bir kichik sinf tomonidan "xuddi shunday" ishlatiladi.

10.2-rasm | Xodimlar ierarxiyasi UML sinf diagrammasi.

Xodim

Maoshli Xodimlar komissiyasi Xodim soatlik xodim



BasePlusCommission xodimi

10.5 Tadqiq: Polimorfizm 405 dan foydalangan holda ish haqi tizimi

Quyidagi bo'limlar 10.2-rasmdagi Xodimlar sinfi ierarxiyasini amalga oshiradi. Birinchi
bo'lim mavhum superklass Xodimni amalga oshiradi. Keyingi to'rt qismning har biri amalga oshiriladi
konkret sinflardan biri. Oxirgi bo'lim ob'ektlarni quradigan test dasturini amalga oshiradi
barcha bu sinflardan va ushbu ob'ektlarni polimorf tarzda qayta ishlaydi.
10.5.1 Abstrakt supersinf xodimi
Class xodimi (Fig. 10.4) usullari daromad beradi va toString, tashqari
Xodimning misol o'zgaruvchilari qiymatlarini qaytaradigan usullarni oling. Daromad usuli
Bu, albatta, barcha xodimlarga nisbatan qo'llaniladi. Ammo har bir daromadni hisoblash unga bog'liq
xodimning alohida toifasi. Shunday qilib, biz xodimlarning super klassida daromadlarni mavhum deb e'lon qilamiz
chunki ma'lum bir standart dastur bu usul uchun mantiqiy emas - yo'q
qancha daromad qaytarish kerakligini aniqlash uchun etarli ma'lumot.
Har bir kichik sinf tegishli amalga oshirish bilan daromadni bekor qiladi. Hisoblash uchun
xodimlarning daromadlari, dastur yuqori sinfga Xodimlar o'zgaruvchisiga havola beradi.
xodimning ob'ekti, keyin ushbu o'zgaruvchi bo'yicha daromad usulini chaqiradi. Biz saqlaymiz
Har birida Xodimlar ob'ektiga havola bo'lgan xodimlar o'zgaruvchilari massivi. Siz foydalana olmaysiz
Xodimlar ob'ektlarini yaratish uchun to'g'ridan-to'g'ri sinf Xodim, chunki Xodim mavhum sinfdir. Muddati
meros uchun, ammo barcha Xodimlar kichik sinflarining barcha ob'ektlari Xodim sifatida ko'rib chiqilishi mumkin

10.3-rasm | Xodimlar ierarxiyasi sinflari uchun polimorfik interfeys.

haftalik ish haqi

mavhum


Komissiya-
Xodim

BasePlus-


Komissiya-
Xodim

Soatiga -


Xodim

Maoshli -


Xodim

Xodim


daromadlar toString

agar (soat <= 40)


ish haqi * soat
Aks holda (soat > 40)
{
40 * ish haqi +
(soat - 40) *
ish haqi * 1,5
}

komissiya stavkasi *


yalpi savdo

(komissiya stavkasi *


yalpi savdo) +
asosiy ish haqi

maoshli xodim: ismi familiyasi


ijtimoiy xavfsizlik raqami: SSN
haftalik ish haqi: haftalik ish haqi

soatlik xodim: ismi familiyasi


ijtimoiy xavfsizlik raqami: SSN
soatlik ish haqi: ish haqi; ishlagan soatlar: soat

komissiya xodimi: ismi familiyasi


ijtimoiy xavfsizlik raqami: SSN
yalpi savdo: yalpi savdo;
komissiya stavkasi: komissiya stavkasi

asosiy ish haqi komissiyasi xodimi:


ism familiya
ijtimoiy xavfsizlik raqami: SSN
yalpi savdo: yalpi savdo;
komissiya stavkasi: komissiya stavkasi;
asosiy ish haqi: asosiy ish haqi

ism familiya


ijtimoiy xavfsizlik raqami: SSN

406 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

ob'ektlar. Dastur har biri uchun massiv va qo'ng'iroq usulidagi daromadlarni takrorlaydi
Xodimlar ob'ekti. Java bu usul chaqiruvlarini polimorf tarzda qayta ishlaydi. Daromadni e'lon qilish
Xodimlardagi mavhum usul xodimlarning o'zgaruvchilari orqali daromad olishga qo'ng'iroq qilish imkonini beradi
to'plash va xodimlarning har bir to'g'ridan-to'g'ri aniq kichik sinfini daromadlarni bekor qilishga majburlash.
Sinfdagi toString usuli Xodim ism va familiyani o'z ichiga olgan Stringni qaytaradi
xodimning ismi va ijtimoiy sug'urta raqami. Ko'rib turganimizdek, Xodimlarning har bir kichik toifasi
o'sha sinf ob'ektining String tasvirini yaratish uchun toString usulini bekor qiladi
xodimning turini (masalan, "maoshli xodim:") va qolgan qismini o'z ichiga oladi
xodim ma'lumotlari.
Keling, sinf Xodimning deklaratsiyasini ko'rib chiqaylik (10.4-rasm). Sinf tarkibiga quyidagilar kiradi:
ismi, familiyasi va ijtimoiy sug'urta raqamini olgan instruktor (11-17-qatorlar);
ism, familiya va ijtimoiy sug'urta raqamini qaytaradigan usullarni oling (20-23 qatorlar,
mos ravishda 26-29 va 32-35); toString usuli (38–43-qatorlar), bu ni qaytaradi
Xodimning string tasviri; va mavhum usul daromadlari (46-satr), qaysi
aniq kichik sinflarning har biri tomonidan amalga oshiriladi. Employee konstruktori buni qilmaydi
ushbu misolda uning parametrlarini tasdiqlang; odatda, bunday tekshirish taqdim etilishi kerak.

1 // 10.4-rasm: Employee.java


2 // Xodimlarning mavhum superklassi.
3
4
5 {
6 shaxsiy yakuniy String firstName;
7 shaxsiy yakuniy String familiyasi;
8 xususiy yakuniy String socialSecurityNumber;
9
10 // konstruktor
11 davlat xodimi (String firstName, String familiyasi,
12 qatorli ijtimoiy xavfsizlik raqami)
13 {
14 this.firstName = firstName;
15 this.lastName = familiya;
16 this.socialSecurityNumber = socialSecurityNumber;
17 }
18
19 // ismni qaytaring
20 ommaviy string getFirstName()
21 {
22 nomini qaytarish;
23 }
24
25 // familiyani qaytaring
26 ommaviy satr getLastName()
27 {
28 familiyasini qaytarish;
29 }
30
31 // ijtimoiy xavfsizlik raqamini qaytaring
32 ommaviy satr getSocialSecurityNumber()
33 {

10.4-rasm | Xodimlar uchun mavhum supersinf. (2-qismning 1-qismi.)

ommaviy mavhum sinf Xodim

10.5 Case Study: Polimorfizmdan foydalangan holda ish haqi tizimi 407

Nega biz daromadlarni mavhum usul sifatida e'lon qilishga qaror qildik? Bu shunchaki emas
Sinfda ushbu usulning aniq amalga oshirilishini ta'minlash mantiqiy. Biz
Umumiy Xodim uchun daromadni hisoblab bo'lmaydi - biz birinchi navbatda o'ziga xos turni bilishimiz kerak
Xodimning tegishli daromad hisobini aniqlash uchun. Ushbu usulni e'lon qilish orqali
Xulosa, biz har bir aniq kichik sinf tegishli daromadni ta'minlashi kerakligini ko'rsatamiz
amalga oshirish va dastur superclass Employee o'zgaruvchilardan foydalanishi mumkin
har qanday turdagi Xodimlar uchun polimorfik usuldagi daromadlarni chaqirish.
10.5.2 Beton kichik sinfi Maoshli xodim
Class SalariedEmployee (10.5-rasm) xodim sinfini kengaytiradi (4-qator) va abstraktni bekor qiladi
usul daromadlari (38–42-qatorlar), bu SalariedEmployee-ni aniq sinfga aylantiradi. Sinf
ism, familiya, ijtimoiy ta'minotni oladigan konstruktorni (9-19-qatorlarni) o'z ichiga oladi.
raqam va haftalik ish haqi; misol o'zgarishiga yangi manfiy bo'lmagan qiymat tayinlash uchun belgilangan usul
haftalik ish haqi (22-29-qatorlar); haftalik ish haqi qiymatini qaytarish uchun get usuli (32-qatorlar)
35); SalariedEmployee daromadini hisoblash usuli (38–42-qatorlar); va a
toString usuli (45–50-qatorlar), bu Stringni qaytaradi, shu jumladan "maoshli xodim:"
keyin xodimlarga xos ma'lumotlar, xodimlar toString superklassi tomonidan ishlab chiqariladi
usuli va Maoshli-Xodimning getWeeklySalary usuli. Maoshli xodimlar sinfi
konstruktor ism, familiya va ijtimoiy sug'urta raqamini Xodimga topshiradi.
supersinfning shaxsiy misol o'zgaruvchilarini ishga tushirish uchun struktura (12-qator). Yana bir bor,
Biz konstruktor va setWeekly-dagi haftalik ish haqini tekshirish kodini takrorladik.
Ish haqi usuli. Eslatib o'tamiz, yanada murakkab tekshirish statik sinf usuliga joylashtirilishi mumkin -
konstruktor va to'siq usulidan chaqirilgan od.

Usulli daromad xodimlarning mavhum usuldagi daromadlarini bekor qiladi.


SalariedEmployee-ning haftalik maoshini qaytaradigan crete ilovasi. Agar qilmasak

34 ijtimoiy xavfsizlik raqamini qaytarish;


35 }
36
37 // Qaytish Xodimlar ob'ektining string ko'rinishi
38 @Bekor qilish
39 umumiy string toString()
40 {
41 return String.format("%s %s%nijtimoiy xavfsizlik raqami: %s",
42 getFirstName(), getLastName(), getSocialSecurityNumber());
43 }
44
45
46
47 } // end abstrakt sinf Xodim

Xatolarning oldini olish bo'yicha maslahat 10.1


Biz sinfning misol usullarini uning konstruktorlaridan chaqirmaslik kerakligini aytdik - siz
statik sinf usullariga qo'ng'iroq qilishi va kerakli qo'ng'iroqni yuqori sinfning konfiguratsiyalaridan biriga amalga oshirishi mumkin.
instruktorlar. Agar siz ushbu maslahatga amal qilsangiz, sinfni bekor qilish muammosidan qochasiz.
mumkin bo'lgan usullar to'g'ridan-to'g'ri yoki bilvosita, bu ish vaqti xatolariga olib kelishi mumkin.

10.4-rasm | Xodimlar uchun mavhum supersinf. (2-qismning 2-qismi.)

// mavhum usul aniq quyi sinflar tomonidan bekor qilinishi kerak
ommaviy mavhum ikki barobar daromad (); // bu erda amalga oshirish yo'q

408 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

1 // 10.5-rasm: SalariedEmployee.java
2 // SalariedEmployee aniq klassi mavhum sinf Xodimni kengaytiradi.
3
4
5 {
6 ta xususiy ikki haftalik ish haqi;
7
8 // konstruktor
9 ta umumiy maoshli xodim(String firstName, String familiyasi,
10 String SocialSecurityNumber, ikki haftalik ish haqi)
11 {
12 super(ism, familiya, socialSecurityNumber);
13
14 bo'lsa (haftalik ish haqi < 0,0)
15 yangi IllegalArgumentException (
16 "Haftalik ish haqi >= 0,0 bo'lishi kerak");
17
18 this.weeklyMaosh = haftalikMaosh;
19 }
20
21 // ish haqini belgilash
22 davlat bekor to'plamiHaftalik Maosh(ikki marta haftalik ish haqi)
23 {
24 agar (haftalik ish haqi < 0,0)
25 yangi IllegalArgumentException (
26 "Haftalik ish haqi >= 0,0 bo'lishi kerak");
27
28 this.weeklyMaosh = haftalikMaosh;
29 }
30
31 // ish haqini qaytarish
32 umumiy ikki martalik getWeeklySalary()
33 {
34 haftalik ish haqi;
35 }
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 } // oxirgi sinf SalariedEmployee

10.5-rasm | SalariedEmployee aniq klassi mavhum sinf Xodimni kengaytiradi.

jamoat sinfi SalariedEmployee xodimni kengaytiradi

// daromadni hisoblash; Xodimda mavhum usuldagi daromadlarni bekor qilish


@Override
davlat ikki baravar daromad ()
{
getWeeklySalary();
}

// SalariedEmployee ob'ektining string tasvirini qaytarish


@Override
umumiy string toString()
{
return String.format("maoshli xodim: %s%n%s: $%,.2f",
super.toString(), "haftalik ish haqi", getWeeklySalary());
}

10.5 Case Study: Polimorfizm 409 yordamida ish haqi tizimi

daromadlarni amalga oshirish, SalariedEmployee sinfi abstrakt deb e'lon qilinishi kerak - aks holda,
sinf SalariedEmployee kompilyatsiya qilmaydi. Albatta, biz SalariedEmployee bo'lishini istaymiz
Ushbu misolda aniq sinf.
toString usuli (45–50-qatorlar) toString xodim usulini bekor qiladi. Agar sinf Sala-
riedEmployee toStringni bekor qilmagan, SalariedEmployee meros qilib olgan bo‘lardi.
toStringning ishchi versiyasi. Bunday holda, SalariedEmployee ning toString usuli bo'ladi
shunchaki xodimning to'liq ismini va ijtimoiy sug'urta raqamini qaytaring.
SalariedEmployeeni munosib tarzda ifodalaydi. a ning to'liq String tasvirini ishlab chiqarish uchun
SalariedEmployee, quyi sinfning toString usuli "maoshli xodim" ni qaytaradi:
Yuqori toifadagi xodimlarga xos ma'lumotlar (ya'ni, ism, familiya va ijtimoiy
xavfsizlik raqami) superklassning toString usulini chaqirish orqali olingan (49-qator) - bu
kodni qayta ishlatishning yaxshi namunasi. SalariedEmployee ning string ko'rinishi ham o'z ichiga oladi
sinfning getWeeklySalary usulini qo'llash orqali olingan xodimning haftalik maoshi.
10.5.3 Beton kichik sinfi soatlik xodim
Class HourlyEmployee (10.6-rasm) ham Xodimni kengaytiradi (4-qator). Sinf tarkibiga quyidagilar kiradi:
ism, familiya, ijtimoiy sug'urta raqami,
soatlik ish haqi va ishlagan soatlar soni. 28-35 va 44-51 qatorlar to'plam usullarini e'lon qiladi
mos ravishda ish haqi va soat o'zgaruvchilari uchun yangi qiymatlarni belgilaydi. Ish haqini belgilash usuli
(28-35-qatorlar) ish haqining manfiy emasligini ta'minlaydi va setHours usuli (44-51-qatorlar)
soatlar qiymati 0 dan 168 gacha (bir haftadagi umumiy soatlar soni) shu jumladan.
HourlyEmployee sinfi, shuningdek, qiymatni qaytarish uchun olish usullarini (38-41 va 54-57 qatorlar) o'z ichiga oladi.
mos ravishda ish haqi va ish soatlari; Soatni hisoblash uchun daromad usuli (60-67-qatorlar)
lyXodimning daromadi; va Stringni qaytaradigan toString usuli (70–76 qatorlar).
xodimning turini ("soatlik xodim:") va xodimga xos ma'lumotlarni o'z ichiga oladi.
tion. HourlyEmployee konstruktori, xuddi SalariedEmployee konstruktori kabi,
ism, familiya va ijtimoiy sug'urta raqami superklass Xodim konstruktoriga
(13-satr) xususiy misol o'zgaruvchilarini ishga tushirish uchun. Bundan tashqari, toString usuli su-
Xodimga xos ma'lumotlarni olish uchun toString perclass usuli (74-satr) (ya'ni, birinchi
ism, familiya va ijtimoiy xavfsizlik raqami) - bu kodni qayta ishlatishning yana bir yaxshi namunasidir.

1 // 10.6-rasm: HourlyEmployee.java


2 // HourlyEmployee klassi Employeeni kengaytiradi.
3
4
5 {
6 xususiy ikki barobar ish haqi; // soatiga ish haqi
7 ta shaxsiy ikkilik soat; // hafta davomida ishlagan soat
8
9 // konstruktor
10 ta ommaviy soatlik xodim (String firstName, String familiyasi,
11 String SocialSecurityNumber, ikki baravar ish haqi, ikki martalik soat)
12 {
13 super(ism, familiya, socialSecurityNumber);
14

10.6-rasm | HourlyEmployee sinfi Xodimni kengaytiradi. (3-qismning 1-qismi.)

jamoat sinfi HourlyEmployee xodimni kengaytiradi

410 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

15 agar (ish haqi < 0,0) // ish haqini tasdiqlang
16 yangi IllegalArgumentException (
17 "Soatlik ish haqi >= 0,0 bo'lishi kerak");
18
19 agar ((soat < 0,0) || (soat > 168,0)) // soatni tekshirish
20 yangi IllegalArgumentException (
21 "Ishlagan soatlar >= 0,0 va <= 168,0 bo'lishi kerak");
22
23 bu.ish haqi = ish haqi;
24 this.hours = soat;
25 }
26
27 // ish haqini belgilash
28 davlat bekor ish haqi (ikki martalik ish haqi)
29 {
30 agar (ish haqi < 0,0) // ish haqini tasdiqlang
31 yangi IllegalArgumentException (
32 "Soatlik ish haqi >= 0,0 bo'lishi kerak");
33
34 bu.ish haqi = ish haqi;
35 }
36
37 // ish haqini qaytarish
38 ommaviy double getWage()
39 {
40 qaytarilgan ish haqi;
41 }
42
43 // belgilangan ish soatlari
44 ommaviy bekor to'plamiHours(ikki soat)
45 {
46 agar ((soat < 0,0) || (soat > 168,0)) // soatni tekshirish
47 yangi IllegalArgumentException (
48 "Ishlangan soatlar >= 0,0 va <= 168,0 bo'lishi kerak");
49
50 this.hours = soat;
51 }
52
53 // ishlagan qaytish soatlari
54 umumiy ikki martalik getHours()
55 {
56 qaytish soati;
57 }
58
59
60
61
62
63
64
65
66
67

10.6-rasm | HourlyEmployee sinfi Xodimni kengaytiradi. (3 qismning 2-qismi.)

// daromadni hisoblash; Xodimda mavhum usuldagi daromadlarni bekor qilish
@Override
davlat ikki baravar daromad ()
{
agar (getHours() <= 40) // qo'shimcha ish vaqti yo'q
getWage() * getHours();
boshqa
qaytish 40 * getWage() + (getHours() - 40) * getWage() * 1,5;
}

10.5 Tadqiq: Polimorfizmdan foydalangan holda ish haqi tizimi 411

10.5.4 Beton kichik sinf komissiyasi xodimi
Class CommissionEmployee (10.7-rasm) sinf xodimini kengaytiradi (4-qator). Sinf tarkibiga a
ism, familiya, ijtimoiy sug'urta raqami, savdo raqamini olgan konstruktor (10–25-qatorlar).
miqdori va komissiya stavkasi; joriy yangi qiymatlarni belgilash uchun usullarni o'rnating (28-34 va 43-50 qatorlar)
mos ravishda komissionRate va brossSales o'zgaruvchilari misolida; usullarni olish (chiziqlar
37–40 va 53–56) bu misol oʻzgaruvchilari qiymatlarini oladi; usuldagi daromad
(59–63-qatorlar) komissiya xodimining ish haqini hisoblash uchun; va toString usuli (liniyalar
66-73), bu xodimning turini qaytaradi, ya'ni "komissiya xodimi:" va ish-
ee-ga xos ma'lumotlar. Konstruktor shuningdek, ism, familiya va ijtimoiy se-
Xodimning shaxsiy sinfini ishga tushirish uchun yuqori sinf uchun kurs raqami Xodimning konstruktori (14-qator)
misol o'zgaruvchilari. toString usulini olish uchun toString (70-satr) superklass usulini chaqiradi
Xodimga tegishli ma'lumotlar (ya'ni, ism, familiya va ijtimoiy sug'urta raqami).

68
69


70
71
72
73
74
75
76
77 } // oxirgi sinf HourlyEmployee

1 // 10.7-rasm: CommissionEmployee.java


2 // CommissionEmployee klassi Xodimni kengaytiradi.
3
4
5 {
6 ta xususiy er-xotin yalpi savdo; // yalpi haftalik savdo
7 shaxsiy ikki martalik komissiya Rate; // komissiya foizi
8
9 // konstruktor
10 jamoat komissiyasi xodimi (String firstName, String familiyasi,
11 String SocialSecurityNumber, ikki barobar yalpi savdo,
12 ikki barobar komissiya stavkasi)
13 {
14 super(ism, familiya, socialSecurityNumber);
15
16 agar (commissionRate <= 0.0 || komissiya darajasi >= 1.0) // tasdiqlash
17 yangi IllegalArgumentException (
18 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
19
20 agar (yalpi savdo < 0,0) // tasdiqlang
21 throw new IllegalArgumentException("Yalpi savdo hajmi >= 0,0 bo'lishi kerak");
22

10.7-rasm | CommissionEmployee sinfi Xodimni kengaytiradi. (2-qismning 1-qismi.)

10.6-rasm | HourlyEmployee sinfi Xodimni kengaytiradi. (3 qismning 3-qismi.)

// HourlyEmployee obyektining string tasvirini qaytarish


@Override
umumiy string toString()
{
return String.format("soatlik xodim: %s%n%s: $%,.2f; %s: %,.2f",
super.toString(), "soatlik ish haqi", getWage(),
"ishlagan soat", getHours());
}

public class CommissionEmployee Employee uzaytiradi


412 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

23 this.grossSales = yalpi savdo;
24 this.commissionRate = komissiya stavkasi;
25 }
26
27 // yalpi savdo miqdorini belgilang
28 ommaviy bekor to'plamGrossSales(ikki marta yalpi savdo)
29 {
30 agar (yalpi savdo < 0,0) // tasdiqlang
31 throw new IllegalArgumentException("Yalpi savdo hajmi >= 0,0 bo'lishi kerak");
32
33 this.grossSales = yalpi savdo;
34 }
35
36 // yalpi savdo summasini qaytarish
37 ommaviy ikkilik getGrossSales()
38 {
39 daromadli yalpi savdo;
40 }
41
42 // komissiya stavkasini belgilang
43 ommaviy bekor to'siqKomissiyaRate(ikki martalik komissionRate)
44 {
45 agar (commissionRate <= 0.0 || komissiya darajasi >= 1.0) // tasdiqlang
46 yangi IllegalArgumentException (
47 "Komissiya stavkasi > 0,0 va < 1,0 bo'lishi kerak");
48
49 this.commissionRate = komissiya stavkasi;
50 }
51
52 // qaytarish komissiyasi stavkasi
53 umumiy ikki marta getCommissionRate()
54 {
55 qaytarish komissiyasi stavkasi;
56 }
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 } // yakuniy sinf komissiyasi xodimi

10.7-rasm | CommissionEmployee sinfi Xodimni kengaytiradi. (2-qismning 2-qismi.)

// daromadni hisoblash; Xodimda mavhum usuldagi daromadlarni bekor qilish
@Override
davlat ikki baravar daromad ()
{
getCommissionRate() * getGrossSales();
}

// CommissionEmployee ob'ektining string tasvirini qaytarish


@Override
umumiy string toString()
{
return String.format("%s: %s%n%s: $%,.2f; %s: %.2f",
"komissiya xodimi", super.toString(),
"yalpi savdo", getGrossSales(),
"komissiya stavkasi", getCommissionRate());
}

10.5 Tadqiq: Polimorfizmdan foydalangan holda ish haqi tizimi 413

10.5.5 Bilvosita beton quyi sinfi BasePlusCommissionEmployee
Class BasePlusCommissionEmployee (Fig. 10.8) sinfni kengaytiradi CommissionEmployee (satr).
4) va shuning uchun Xodimlar sinfining bilvosita kichik sinfidir. Class BasePlusCommission-
Xodimda ism, familiya, ijtimoiy ma'lumotni oladigan konstruktor (9-20-qatorlar) mavjud.
valyuta raqami, savdo summasi, komissiya stavkasi va asosiy ish haqi. Keyin hammasi o'tib ketadi
bular komissiya xodimiga (13-14-qatorlar) asosiy ish haqi bundan mustasno.
supersinf namunasi o'zgaruvchilarini bog'lash. BasePlusCommissionEmployee ham to'plamni o'z ichiga oladi
usuli (23–29-qatorlar) misol oʻzgaruvchisi baseSalaryga yangi qiymat belgilash va get
usul (32–35-qatorlar) asosiy ish haqi qiymatini qaytarish uchun. Usul daromadlari (38-42-qatorlar) kal-
BasePlusCommissionEmployeening daromadini hisoblab chiqadi. Usul daromadlarining 41-qatori su-
komissiya asosida hisoblash uchun komissiyasi xodimning daromad usuli perclass
xodimning daromadining bir qismi - bu kodni qayta ishlatishning yana bir yaxshi namunasidir. Baza -
PlusCommissionEmployee-ning toString usuli (45–51-qatorlar) String vakilini yaratadi.
BasePlusCommissionEmployee tion, unda "asosiy maoshli", keyin esa
Komissiya xodimining toString usulini (line
49), keyin asosiy ish haqi. Natijada "asosiy maoshli komissiya" bilan boshlanadigan qator paydo bo'ladi.
sion xodimi" keyin BasePlusCommissionEmployee-ning qolgan ma'lumotlari.
Eslatib o'tamiz, CommissionEmployee's toString xodimning ismini, familiyasini oladi.
va ijtimoiy xavfsizlik raqami o'zining yuqori sinfining toString usulini qo'llash orqali (ya'ni, Employ-
ee) - kodni qayta ishlatishning yana bir misoli. BasePlusCommission Xodimning toString tashabbusi-
Xodimlar ierarxiyasining barcha uch darajasini qamrab oluvchi usul chaqiruvlari zanjiri.

1 // 10.8-rasm: BasePlusCommissionEmployee.java


2 // BasePlusCommissionEmployee klassi komissiya xodimini kengaytiradi.
3
4
5 {
6 ta xususiy ikki kishilik ish haqi; // haftalik asosiy ish haqi
7
8 // konstruktor
9 umumiy BasePlusCommissionEmployee(String firstName, String Familiya,
10 qatorli ijtimoiy xavfsizlik raqami, ikki barobar yalpi savdo,
11 ikki baravar komissiya stavkasi, ikki baravar ish haqi)
12 {
13 super(ism, familiya, socialSecurityNumber,
14 yalpi savdo, komissiya stavkasi);
15
16 agar (asosiy ish haqi < 0,0) // asosiy ish haqini tasdiqlang
17 throw new IllegalArgumentException("Asosiy ish haqi >= 0,0 bo'lishi kerak");
18
19 this.baseMaosh = asosiy ish haqi;
20 }
21
22 // asosiy ish haqini belgilash
23 davlat bekor to'plamiBaseMaosh(ikki martalik ish haqi)
24 {
25 agar (asosiy Maosh < 0,0) // asosiy ish haqini tasdiqlang
26 throw new IllegalArgumentException("Asosiy ish haqi >= 0,0 bo'lishi kerak");

10.8-rasm | BasePlusCommissionEmployee klassi komissiya xodimini kengaytiradi. (2-qismning 1-qismi.)

jamoat sinfi BasePlusCommissionEmployee komissiyasi xodimini kengaytiradi

414 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.5.6 Polimorfik ishlov berish, Operator instanceof va
Pastga tushirish
Bizning Xodimlar ierarxiyasini sinab ko'rish uchun 10.9-rasmdagi dastur har birining ob'ektini yaratadi.
to'rtta aniq sinflar: Maoshli xodim, soatlik xodim, komissiya xodimi va tayanch-
PlusKomissiya xodimi. Dastur ushbu ob'ektlarni polimorf bo'lmagan tarzda manipulyatsiya qiladi
Har bir ob'ektning o'z turidagi o'zgaruvchilar, so'ngra Xodimlar o'zgaruvchilari massividan foydalangan holda polimorf
qodir. Ob'ektlarni polimorf tarzda qayta ishlashda dastur asosiy ish haqini oshiradi
har bir BasePlusCommissionEmployee-ning 10% - bu ob'ekt turini aniqlashni talab qiladi
ijro vaqtida. Nihoyat, dastur polimorf tarzda turini aniqlaydi va chiqaradi
Xodimlar massividagi har bir ob'ekt. 9-18 qatorlar to'rtta betonning har birining ob'ektlarini yaratadi
Xodimlarning kichik toifalari. 22–30 qatorlar har birining String tasviri va daromadini chiqaradi
Ushbu ob'ektlarning nopolimorfligi. Har bir ob'ektning toString usuli bilvosita tomonidan chaqiriladi
ob'ekt %s format spetsifikatsiyasi bilan String sifatida chiqarilganda printf.

27
28 this.baseMaosh = asosiy ish haqi;


29 }
30
31 // asosiy ish haqini qaytarish
32 umumiy ikki marta getBaseSalary()
33 {
34 qaytish bazasi Ish haqi;
35 }
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 } // yakuniy sinf BasePlusCommissionEmployee

1 // 10.9-rasm: PayrollSystemTest.java


2 // Xodimlar ierarxiyasi test dasturi.
3
4 ommaviy sinf PayrollSystemTest
5 {

10.9-rasm | Xodimlar ierarxiyasi test dasturi. (4-qismning 1-qismi.)

10.8-rasm | BasePlusCommissionEmployee klassi komissiya xodimini kengaytiradi. (2-qismning 2-qismi.)

// daromadni hisoblash; CommissionEmployee-dagi daromadlarni bekor qilish


@Override
davlat ikki baravar daromad ()
{
getBaseSalary() + super.earnings();
}

// BasePlusCommissionEmployee ob'ektining string tasvirini qaytarish


@Override
umumiy string toString()
{
return String.format("%s %s; %s: $%,.2f",
"asosiy maoshli", super.toString(),
"asosiy ish haqi", getBaseSalary());
}

10.5 Case Study: Polimorfizmdan foydalangan holda ish haqi tizimi 415

6 ta umumiy statik bekor asosiy(String[] args)
7 {
8
9
10
11
12
13
14
15
16
17
18
19
20 System.out.println("Xodimlar individual ravishda qayta ishlanadi:");
21
22 System.out.printf("%n%s%n%s: $%,.2f%n%n",
23 maoshliXodim, "ishlab olgan", maoshliXodim.earnings());
24 System.out.printf("%s%n%s: $%,.2f%n%n",
25 hourlyEmployee, "organed", hourlyEmployee.earnings());
26 System.out.printf("%s%n%s: $%,.2f%n%n",
27 komissiya Xodim, "ishlab olgan", komissiyaXodimlari.earnings());
28 System.out.printf("%s%n%s: $%,.2f%n%n",
29 basePlusCommission xodimi,
30 "organ", basePlusCommissionEmployee.earnings());
31
32 // to'rt elementli Xodimlar massivini yarating
33
34
35
36
37
38
39
40
41 System.out.printf("Polimorfik ishlov berilgan xodimlar:%n%n");
42
43 // massiv xodimlarining har bir elementini umumiy qayta ishlash
44 uchun (xodimning hozirgi xodimi: xodimlar)
45 {
46 System.out.println( ); // toString ni chaqiradi
47
48 // element BasePlusCommissionEmployee ekanligini aniqlang
49 agar ()
50 {
51 // pastga tushadigan xodimga havola
52 // BasePlusCommissionEmployee ma'lumotnomasi
53 BasePlusCommissionEmployee xodimi =
54;
55
56 staff.setBaseSalary(1.10 * working.getBaseSalary());
57

10.9-rasm | Xodimlar ierarxiyasi test dasturi. (4 qismning 2-qismi.)

// pastki sinf ob'ektlarini yaratish
MaoshliXodim maoshliXodim =
new SalariedEmployee("Jon", "Smit", "111-11-1111", 800.00);
HourlyEmployee hourlyEmployee =
new HourlyEmployee("Karen", "Narx", "222-22-2222", 16.75, 40);
Komissiya Xodimlar komissiyasi Xodim =
yangi komissiya xodimi (
"Sue", "Jons", "333-33-3333", 10000, .06);
BasePlusCommissionEmployee basePlusCommissionEmployee =
yangi BasePlusCommissionEmployee(
"Bob", "Lyuis", "444-44-4444", 5000, .04, 300);

Xodim[] xodimlar = yangi xodim[4];

// massivni xodimlar bilan ishga tushirish
xodimlar[0] = maoshliXodim;
xodimlar[1] = soatlikXodim;
xodimlar[2] = komissiya Xodim;
xodimlar[3] = basePlusCommissionEmployee;

hozirgi xodim

BasePlusCommissionEmployeening joriy xodim namunasi

(BasePlusCommissionEmployee) joriy xodim


416 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

58 System.out.printf(
59 "10%% o'sish bilan yangi asosiy ish haqi: $%,.2f%n",
60 staff.getBaseSalary());
61 } // agar tugaydi
62
63 System.out.printf(
64 "organ $%,.2f%n%n", );
65 } // uchun tugatish
66
67
68
69
70
71 } // asosiyni tugating
72 } // oxirgi sinf PayrollSystemTest

Xodimlar individual ravishda qayta ishlanadi:

maoshli xodim: Jon Smit
ijtimoiy xavfsizlik raqami: 111-11-1111
haftalik ish haqi: $800.00
daromad: $800.00

soatlik xodim: Karen Price


ijtimoiy xavfsizlik raqami: 222-22-2222
soatlik ish haqi: $16,75; ish vaqti: 40.00
daromad: $670.00

komissiya xodimi: Sue Jons


ijtimoiy xavfsizlik raqami: 333-33-3333
yalpi savdo: $10 000,00; komissiya stavkasi: 0,06
daromad: $600.00

bazaviy ish haqi komissiyasi xodimi: Bob Lyuis


ijtimoiy xavfsizlik raqami: 444-44-4444
yalpi savdo: $5 000,00; komissiya stavkasi: 0,04; asosiy ish haqi: $300.00

Polimorfik ishlov berilgan xodimlar:

maoshli xodim: Jon Smit
ijtimoiy xavfsizlik raqami: 111-11-1111
haftalik ish haqi: $800.00
800,00 dollar ishlab oldi

soatlik xodim: Karen Price


ijtimoiy xavfsizlik raqami: 222-22-2222
soatlik ish haqi: $16,75; ish vaqti: 40.00
670,00 dollar ishlab oldi

komissiya xodimi: Sue Jons


ijtimoiy xavfsizlik raqami: 333-33-3333
yalpi savdo: $10 000,00; komissiya stavkasi: 0,06
600,00 dollar ishlab oldi

10.9-rasm | Xodimlar ierarxiyasi test dasturi. (4 qismning 3-qismi.)

currentEmployee.earnings()

// xodimlar massividagi har bir ob'ekt turi nomini olish


uchun (int j = 0; j < xodimlar. uzunlik; j++)
System.out.printf("Xodim %d - %s%n", j,
xodimlar[j].getClass().getName());

daromad: $500.00


10.5 Tadqiq: Polimorfizmdan foydalangan holda ish haqi tizimi 417

Xodimlar qatorini yaratish
33-qator xodimlarni e'lon qiladi va unga to'rtta Xodim o'zgaruvchilari qatorini tayinlaydi. 36-qator -
xodimlarga[0] SalariedEmployee ob'ektiga havolani imzolaydi. 37-qator tayinlanadi
xodimlar[1] HourlyEmployee obyektiga havola. 38-qator xodimlarga tayinlanadi[2]
komissiya xodimi ob'ektiga havola. 39-qatorda xodimga[3] ma'lumotnoma beriladi
BasePlusCommissionEmployee obyektiga. Ushbu topshiriqlarga ruxsat beriladi, chunki Sal-
ariedEmployee - bu xodim, soatlik xodim - bu xodim, komissiya xodimi-
ee - Xodim va BasePlusCommissionEmployee - Xodim. Shuning uchun, biz mumkin
SalariedEmployee, HourlyEmployee, komissiya xodimi va ma'lumotnomalarini tayinlash
BasePlusCommissionEmployee Employee o'zgaruvchilari superklassiga mos keladi, garchi Em-
ployee - mavhum sinf.
Polimorfik ishlov beruvchi xodimlar
44-65 qatorlar massiv xodimlari orqali takrorlanadi va String va daromad olish usullarini chaqiradi
Ishchi o'zgaruvchisi joriyEmployee bilan ishlaydi, bu farqga havola beriladi.
ent Har bir iteratsiyada massivdagi xodim. Chiqish o'ziga xosligini ko'rsatadi
Har bir sinf uchun usullar haqiqatdan ham chaqiriladi. toString usuliga barcha qo'ng'iroqlar va daromadlar
amaldagi Xodim qayta oladigan ob'ekt turiga qarab, bajarilish vaqtida hal qilinadi.
fers. Bu jarayon dinamik ulanish yoki kechikish deb nomlanadi. Masalan, 46-qator im-
joriyEmployee murojaat qiladigan ob'ektning toString usulini ochiqchasiga chaqiradi. Kabi
dinamik ulanish natijasida Java qaysi sinfning toString usulini bajarishda chaqirishni hal qiladi
kompilyatsiya vaqtida emas, balki vaqt. Faqat Xodimlar sinfining usullarini an orqali chaqirish mumkin
Xodim o'zgaruvchisi (va Xodim, albatta, Ob'ekt sinfining usullarini o'z ichiga oladi). a su-
perclass ma'lumotnomasi faqat yuqori sinf usullarini chaqirish uchun ishlatilishi mumkin - subklassning meth-
od ilovalari polimorf tarzda chaqiriladi.
BasePlusCommissionEmployees-da turga xos operatsiyalarni bajarish
Biz BasePlusCommissionEmployee ob'ektlarida maxsus ishlov berishni amalga oshiramiz - biz ko'rganimizdek -
Ushbu ob'ektlarni amalga oshirish vaqtida biz ularning asosiy ish haqini 10% ga oshiramiz. Qayta ishlashda
ob'ektlar polimorfik bo'lganligi sababli, biz odatda o'ziga xos xususiyatlar haqida tashvishlanishimiz shart emas, balki sozlash uchun
asosiy ish haqi, biz ijro etilayotganda Xodimlar ob'ektining o'ziga xos turini aniqlashimiz kerak
vaqt. 49-qator ma'lum bir Xodimni aniqlash uchun instanceof operatoridan foydalanadi
ob'ekt turi - BasePlusCommissionEmployee. 49-qatordagi shart, agar ob-
currentEmployee tomonidan havola qilingan obyekt BasePlusCommissionEmployee hisoblanadi. Bu ham bo'lardi
bog'liqligi sababli BasePlusCommissionEmployee kichik sinfining har qanday ob'ekti uchun haqiqiy bo'lishi kerak.

bazaviy ish haqi komissiyasi xodimi: Bob Lyuis


ijtimoiy xavfsizlik raqami: 444-44-4444
yalpi savdo: $5 000,00; komissiya stavkasi: 0,04;

Xodim 0 - maoshli xodim


1-xodim - soatlik xodim
2-xodim komissiya xodimi
3-xodim BasePlusCommissionEmployee hisoblanadi

10.9-rasm | Xodimlar ierarxiyasi test dasturi. (4 qismning 4-qismi.)

asosiy ish haqi: $300.00

10% o'sish bilan yangi asosiy ish haqi: $330.00


530,00 dollar ishlab oldi

418 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

pastki sinf o'zining yuqori sinfiga ega. 53–54-qatorlar pastga tushirilgan joriy Xodim
BasePlusCommissionEmployee yozish uchun Employee so'zini yozing - bu translatsiyaga faqat ob'ektiv ravishda ruxsat beriladi.
ject BasePlusCommissionEmployee bilan is-a munosabatlariga ega. 49-qatordagi holat
shunday bo'lishini ta'minlaydi. Agar biz BasePlusCom-ning pastki sinfini chaqirmoqchi bo'lsak, bu cast talab qilinadi.
missiya Xodimlar usullari getBaseSalary va setBaseSalary joriy xodimga
ob'ekt - bir lahzada ko'rib turganingizdek, to'g'ridan-to'g'ri faqat pastki sinf usulini chaqirishga urinish.
superklassga havola - kompilyatsiya xatosi.

Agar 49-satrdagi ifoda misoli to'g'ri bo'lsa, 53-60 qatorlar maxsus pro-


BasePlusCommissionEmployee ob'ekti uchun to'xtatish talab qilinadi. BasePlusCommis-dan foydalanish
sionEmployee o'zgaruvchisi xodimi, 56-qator faqat pastki sinf uchun getBaseSalary usullarini chaqiradi
va setBaseSalary 10% oshirish bilan xodimning asosiy ish haqini olish va yangilash uchun.
Daromadlarni polimorf tarzda chaqirish
63–64 qatorlar polimorf tarzda chaqiriladigan joriyEmployee bo'yicha usul daromadlarini chaqiradi
tegishli subsinf ob'ektining daromad usuli. Salom daromadini olish
riedEmployee, HourlyEmployee va CommissionEmployee polimorf tarzda 63-qatorlarda
64 ushbu xodimlarning daromadlarini qatorlar bo'yicha individual ravishda olish bilan bir xil natijalarni beradi
22–27. BasePlusCommissionEmployee uchun 63-qatorda olingan daromad miqdori
64 28-30-qatorlarda olinganidan yuqori, bu uning asosiy ish haqining 10% ga oshgani sababli.
Har bir xodimning sinf nomini olish
68-70 qatorlar har bir xodimning turini String sifatida ko'rsatadi. Har bir ob'ekt o'z sinfini biladi va
bu ma'lumotlarga barcha sinflar meros bo'ladigan getClass usuli orqali kirishi mumkin
sinf ob'ekti. getClass usuli Class tipidagi ob'ektni qaytaradi (ja- paketidan)
va.lang), bu ob'ekt turi, shu jumladan uning sinf nomi haqidagi ma'lumotlarni o'z ichiga oladi.
70-qator o'z sinfini olish uchun joriy ob'ektda getClass-ni chaqiradi. getClass natijasi
call ob'ektning sinf nomini olish uchun getName ni chaqirish uchun ishlatiladi.
Downcasting bilan kompilyatsiya xatolarining oldini olish
Oldingi misolda biz bir nechta kompilyatsiya xatolaridan qochdik.
ee o'zgaruvchisi 53-54 qatorlardagi BasePlusCommissionEmployee o'zgaruvchisiga. Agar siz olib tashlasangiz
54-qatordan cast operatori (BasePlusCommissionEmployee) va Em-ni tayinlashga harakat qiling.
ishchi o'zgaruvchan joriyEmployee to'g'ridan-to'g'ri BasePlusCommissionEmployee o'zgaruvchan em-
ployee, siz "mos kelmaydigan turlar" kompilyatsiya xatosini olasiz. Bu xato ko'rsatadi
joriyEmployee superklass ob'ektiga havolani pastki sinfga belgilashga urinish
o'zgaruvchan xodimga ruxsat berilmaydi. Kompilyator bu topshiriqni oldini oladi, chunki Com-
missionEmployee BasePlusCommissionEmployee emas — is-a munosabatlari faqat amal qiladi
pastki sinf va uning yuqori sinflari o'rtasida, aksincha emas.

Umumiy dasturlash xatosi 10.3


Yuqori sinf o'zgaruvchisini pastki sinf o'zgaruvchisiga belgilash kompilyatsiya xatosidir.

Umumiy dasturlash xatosi 10.4


Malumotni pastga tushirishda ClassCastException paydo bo'ladi, agar havola qilingan ob'ekt avvalgi
exeution time cast operatorida ko'rsatilgan tur bilan is-aloqasiga ega emas.

10.6 Superklass va quyi sinf oʻzgaruvchilari oʻrtasida ruxsat etilgan topshiriqlar 419

Xuddi shunday, agar 56 va 60-satrlar sub-sinflarni chaqirish uchun joriyEmployee superklass o'zgaruvchisidan foydalangan bo'lsa.
faqat sinf uchun getBaseSalary va setBaseSalary usullari, biz qabul qilaman “topib bo'lmaydi
bu satrlarda belgi” kompilyatsiya xatolari. orqali faqat pastki sinf usullarini chaqirishga urinish
superklass o'zgaruvchisiga ruxsat berilmaydi - 56 va 60-qatorlar faqat agar bajarilsa ham
49-satrdagi instanceof to'g'ri qiymatini qaytaradi, bu joriyEmployee havolasiga ega ekanligini ko'rsatadi
BasePlusCommissionEmployee obyekti. Superclass Employee o'zgaruvchisidan foydalanib, biz buni qila olamiz
faqat Employee sinfida topilgan usullarni chaqirish - daromadlar, toString va Employee's olish
va usullarni belgilang.

10.6 Superklass va o'rtasidagi ruxsat etilgan topshiriqlar


Subklass o'zgaruvchilari
Endi siz turli xil pastki sinf ob'ektlarini qayta ishlaydigan to'liq dasturni ko'rdingiz - polimor-
fizik jihatdan biz supersinf va pastki sinf ob'ektlari bilan nima qilish mumkin va nima qila olmasligingizni umumlashtiramiz
va o'zgaruvchilar. Pastki sinf ob'ekti ham yuqori sinf ob'ekti bo'lsa-da, ikkita sinf o'zgarmasdir.
shunga qaramay boshqacha. Yuqorida aytib o'tilganidek, kichik sinf ob'ektlari ularning ob'ektlari sifatida ko'rib chiqilishi mumkin
supersinf. Lekin subklassda faqat qo'shimcha kichik sinf a'zolari bo'lishi mumkinligi sababli, tayinlash
pastki sinf o'zgaruvchisiga superklassga havola qilish aniq castsiz ruxsat etilmaydi - bunday
topshiriq pastki sinf a'zolarini supersinf ob'ekti uchun aniqlanmagan holda qoldiradi.
Biz o'zgaruvchan sinflarga yuqori sinf va pastki sinf havolalarini belgilashning uchta to'g'ri usulini muhokama qildik.
supersinf va kichik sinf turlarining qobiliyatlari:
1. Yuqori sinf o'zgaruvchisiga yuqori sinf havolasini belgilash juda oddiy.
2. Kichik sinf o'zgaruvchisiga kichik sinfga havola berish juda oddiy.
3. Yuqori sinf o'zgaruvchisiga quyi sinfga murojaat qilish xavfsiz, chunki pastki sinf
ob'ekt uning yuqori sinfining ob'ektidir. Biroq, superklass o'zgaruvchisidan foydalanish mumkin
faqat yuqori sinf a'zolariga murojaat qilish. Agar bu kod faqat pastki sinf a'zolariga tegishli bo'lsa
superklass o'zgaruvchisi orqali kompilyator xatolar haqida xabar beradi.
10.7 Yakuniy usullar va darslar
Biz 6.3 va 6.10 bo'limlarda o'zgaruvchilarni yakuniy deb e'lon qilish mumkinligini ko'rdik.
ishga tushirilgandan so'ng ularni o'zgartirib bo'lmaydi - bunday o'zgaruvchilar doimiy qiymatlarni ifodalaydi. Bu
Yakuniy modifikator bilan usullar, usul parametrlari va sinflarini e'lon qilish ham mumkin.
Yakuniy usullarni bekor qilib bo'lmaydi
Yuqori sinfdagi yakuniy usulni pastki sinfda bekor qilib bo'lmaydi - bu buni kafolatlaydi
Yakuniy usulni amalga oshirish barcha to'g'ridan-to'g'ri va bilvosita kichik sinflar tomonidan qo'llaniladi
ierarxiya. Shaxsiy deb e'lon qilingan usullar aniq yakuniy hisoblanadi, chunki bu mumkin emas.
ularni kichik sinfda bekor qilish mumkin. Statik deb e'lon qilingan usullar ham bilvosita fi-
nal. Yakuniy usul deklaratsiyasi hech qachon o'zgarmaydi, shuning uchun barcha kichik sinflar bir xil usuldan foydalanadi

Dasturiy ta'minot muhandisligi kuzatuvi 10.5


Haqiqiy chaqiriladigan usul ob'ektning ishlash vaqti turiga bog'liq bo'lsa-da
o'zgaruvchiga tegishli bo'lgan o'zgaruvchidan faqat o'sha usullarni chaqirish uchun foydalanish mumkin
kompilyator tekshiradigan o'zgaruvchining tipidagi a'zolar.

420 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

amalga oshirish va yakuniy usullarga qo'ng'iroqlar kompilyatsiya vaqtida hal qilinadi - bu ma'lum
statik bog'lash sifatida.
Yakuniy sinflar Superklass bo'lishi mumkin emas
Yakuniy sinf pastki sinf yaratish uchun kengaytirilmaydi. Yakuniy sinfdagi barcha usullar im-
aniq yakuniy. Class String yakuniy sinfga misoldir. Agar sizga yaratishga ruxsat berilgan bo'lsa
String kichik sinfida ushbu kichik sinf ob'ektlari Stringlar kutilgan joyda ishlatilishi mumkin.
String sinfini kengaytirib bo'lmagani uchun Stringlardan foydalanadigan dasturlar funktsiyaga tayanishi mumkin -
Java API-da ko'rsatilganidek, String ob'ektlarining o'ziga xosligi. Sinfni yakuniy qilish ham oldindan
dasturchilarni xavfsizlik cheklovlarini chetlab o'tishi mumkin bo'lgan kichik sinflarni yaratishdan himoya qiladi.
Endi biz o'zgaruvchilar, usullar va sinflarni yakuniy deb e'lon qilishni muhokama qildik va biz buni qildik
Agar biror narsa yakuniy bo'lishi mumkin bo'lsa, u yakuniy bo'lishi kerakligini ta'kidladi. Kompilyatorlar o'zgarishlarni amalga oshirishi mumkin
Agar biror narsa yakuniy ekanligini bilsalar, optimallashtirish. Biz parallellikni o'rganganimizda
23-bobda siz yakuniy o'zgaruvchilar o'z ishingizni parallellashtirishni osonlashtirayotganini ko'rasiz.
bugungi kunning ko'p yadroli protsessorlarida foydalanish uchun gramm. Finaldan foydalanish haqida ko'proq ma'lumot olish uchun tashrif buyuring

10.8 Qo'ng'iroq bilan bog'liq muammolarni chuqurroq tushuntirish


Konstruktorlardan usullar
Konstruktorlardan bekor qilinadigan usullarni chaqirmang. Subklass ob'ektini yaratishda, bu
pastki sinf ob'ekti to'liq ishga tushirilgunga qadar bekor qilingan usul chaqirilishiga olib kelishi mumkin.
Esda tutingki, siz subsinf ob'ektini qurishda uning konstruktori birinchi navbatda ulardan birini chaqiradi
to'g'ridan-to'g'ri superklass konstruktorlari. Agar superklass konstruktori bekor qilinadigan usulni chaqirsa,
Ushbu usulning pastki sinf versiyasi superklass konstruktori tomonidan quyi sinfdan oldin chaqiriladi.
sinf konstruktorining tanasi bajarish imkoniyatiga ega. Bu nozik, qiyin bo'lishiga olib kelishi mumkin
Agar chaqirilgan pastki sinf usuli ishga tushirilmagan ishga tushirishga bog'liq bo'lsa, xatolarni aniqlang
hali subklass konstruktor tanasida bajarilgan.
Konstruktordan statik usulni chaqirish mumkin. Masalan, konstruktor
va belgilangan usul ko'pincha ma'lum bir misol o'zgaruvchisi uchun bir xil tekshirishni amalga oshiradi. Agar
tasdiqlash kodi qisqa, uni konstruktorda va belgilangan usulda takrorlash mumkin.
Agar uzoqroq tekshirish talab etilsa, statik tekshirish usulini belgilang (odatda xususiy
yordamchi usuli) keyin uni konstruktor va to'siq usulidan chaqiring. Bu ham qabul qilinadi
konstruktor yakuniy misol usulini chaqirishi uchun, agar usul bo'lmasa
to'g'ridan-to'g'ri yoki bilvosita bekor qilinadigan misol usulini chaqiring.

http://docs.oracle.com/javase/tutorial/java/IandI/final.html

Umumiy dasturlash xatosi 10.5
Yakuniy sinfning pastki sinfini e'lon qilishga urinish kompilyatsiya xatosidir.

Dasturiy ta'minot muhandisligi kuzatuvi 10.6


Java API-da sinflarning katta qismi yakuniy deb e'lon qilinmaydi. Bu imkon beradi
meros va polimorfizm. Biroq, ba'zi hollarda, sinflarni e'lon qilish muhimdir
yakuniy - odatda xavfsizlik sababli. Bundan tashqari, agar siz kengaytma uchun sinfni diqqat bilan tuzmasangiz,
(ko'pincha nozik) xatolardan qochish uchun sinfni yakuniy deb e'lon qilishingiz kerak.

10.9 Interfeyslarni yaratish va ulardan foydalanish 421



10.9 Interfeyslarni yaratish va ulardan foydalanish
[Izoh: Yozilganidek, ushbu bo'lim va uning kod misoli Java SE 7 orqali qo'llaniladi. Java SE 8 interfeysi
Yaxshilashlar 10.10-bo'limda kiritilgan va 17-bobda batafsilroq muhokama qilingan.]
Bizning keyingi misolimiz (10.11-10.15-rasmlar) 10.5-bo'limning ish haqi tizimini qayta ko'rib chiqadi.
Aytaylik, jalb qilingan kompaniya bir nechta buxgalteriya operatsiyalarini bajarishni xohlaydi
yagona kreditorlik qarzi bo'yicha ariza - bo'lishi kerak bo'lgan daromadlarni hisoblashdan tashqari
Har bir xodimga to'lanadigan to'lovni amalga oshirish uchun kompaniya, shuningdek, har bir ish uchun to'lovni hisoblashi kerak.
eral schyot-fakturalar (ya'ni, sotib olingan tovarlar uchun hisob-kitoblar). Garchi bog'liq bo'lmagan narsalarga nisbatan qo'llaniladi (ya'ni, em-
xodimlar va schyot-fakturalar), ikkala operatsiya ham qandaydir to'lovni olish bilan bog'liq
miqdori. Xodim uchun to'lov xodimning daromadiga ishora qiladi. Hisob-faktura uchun,
to'lov hisob-fakturada ko'rsatilgan tovarlarning umumiy qiymatini bildiradi. Hisoblay olamizmi
xodimlar uchun to'lanadigan to'lovlar va bitta arizada hisob-fakturalar kabi turli xil narsalar
polimorfik? Java bir-biriga bog'liq bo'lmagan sinflar a.ni amalga oshirishni talab qiladigan qobiliyatni taklif qiladimi
umumiy usullar to'plami (masalan, to'lov miqdorini hisoblaydigan usul)? Java interfeyslari
aynan shu imkoniyatni taqdim eting.
O'zaro ta'sirlarni standartlashtirish
Interfeyslar odamlar va tizimlar kabi narsalarni aniqlaydi va standartlashtiradi
bir-biri bilan o'zaro munosabatda bo'ling. Masalan, radiodagi boshqaruv elementlari o'rtasida interfeys bo'lib xizmat qiladi
radio foydalanuvchilari va radioning ichki qismlari. Boshqaruv elementlari foydalanuvchilarga faqat a
cheklangan operatsiyalar to'plami (masalan, stantsiyani o'zgartirish, ovoz balandligini sozlash, AM
va FM) va turli radiolar boshqaruvni turli yo'llar bilan amalga oshirishi mumkin (masalan, foydalanish
tugmalar, terishlar, ovozli buyruqlar). Interfeys radio qanday operatsiyalarni bajarishi kerakligini belgilaydi
foydalanuvchilarga bajarishga ruxsat beradi, lekin operatsiyalar qanday bajarilishini aniqlamaydi.
Dasturiy ta'minot ob'ektlari interfeyslar orqali bog'lanadi
Dasturiy ta'minot ob'ektlari interfeyslar orqali ham aloqa qiladi. Java interfeysi bir qator usullarni tavsiflaydi -
ob'ektni aytish uchun, masalan, biron bir vazifani bajarish yoki qaytish uchun chaqirilishi mumkin bo'lgan ods
ba'zi ma'lumotlar. Keyingi misolda Payable nomli interfeys taqdim etiladi
"to'lovga qodir" bo'lishi kerak bo'lgan va shuning uchun kerak bo'lgan har qanday ob'ektning funksionalligini tavsiflang
to'g'ri keladigan to'lov miqdorini aniqlash usulini taklif qiling. Interfeys deklaratsiyasi
kalit so'z interfeysi bilan boshlanadi va faqat konstantalar va mavhum usullarni o'z ichiga oladi.
Sinflardan farqli o'laroq, barcha interfeys a'zolari ochiq bo'lishi kerak va interfeyslar hech qanday im-ni belgilamasligi mumkin.
aniq usul deklaratsiyasi va misol o'zgaruvchilari kabi qo'shimcha tafsilotlar. Hammasi
interfeysda e'lon qilingan usullar bevosita ochiq mavhum usullar va barcha maydonlardir
bilvosita ommaviy, statik va yakuniydir.

Interfeysdan foydalanish


Interfeysdan foydalanish uchun konkret sinf interfeysni amalga oshirishini ko'rsatishi va kerak
interfeys deklaratsiyasida ko'rsatilgan imzo bilan interfeysdagi har bir usulni e'lon qilish -
tion. Sinf interfeysni amalga oshirishini ko'rsatish uchun implements kalit so'zini va ni qo'shing

Yaxshi dasturlash amaliyoti 10.1


Java tili spetsifikatsiyasiga ko'ra, interfeysni e'lon qilish to'g'ri uslubdir
ommaviy va mavhum kalit so'zsiz mavhum usullar, chunki ular ortiqcha
interfeys usuli deklaratsiyasida. Xuddi shunday, interfeys konstantalari e'lon qilinishi kerak
umumiy, statik va yakuniy kalit so'zlarsiz, chunki ular ham ortiqcha.

422 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

sinf deklaratsiyasining birinchi qatorining oxirigacha bo'lgan interfeys nomi. Yo'q sinf
interfeysning barcha usullarini amalga oshirish mavhum sinf bo'lib, e'lon qilinishi kerak
mavhum. Interfeysni amalga oshirish kompilyator bilan shartnoma imzolashga o'xshaydi:
"Men interfeys tomonidan ko'rsatilgan barcha usullarni e'lon qilaman yoki sinfimning mavhumligini e'lon qilaman."

Turli xil turlarni bog'lash


Interfeys ko'pincha bir-biriga bog'liq bo'lmagan sinflar, ya'ni sinf bilan bog'liq bo'lmagan sinflar uchun ishlatiladi
ierarxiya - umumiy usullar va konstantalarni almashish zarurati. Bu bir-biriga bog'liq bo'lmagan ob'ektlarga imkon beradi
polimorf tarzda qayta ishlanadigan sinflar - bir xil narsalarni amalga oshiradigan sinflar ob'ektlari.
interfeys bir xil usul chaqiruvlariga javob berishi mumkin. ni tavsiflovchi interfeys yaratishingiz mumkin
Istalgan funksionallikka ega bo'ling, so'ngra ushbu interfeysni ushbu funktsiyani talab qiladigan har qanday sinfda qo'llang.
milliylik. Misol uchun, ushbu bo'limda ishlab chiqilgan kreditorlik qarzlari ilovasida biz
to'lov miqdorini hisoblash imkoniyatiga ega bo'lishi kerak bo'lgan har qanday sinfda to'lanadigan interfeysni amalga oshirish
(masalan, xodim, hisob-faktura).
Interfeyslar va mavhum sinflar
Interfeys ko'pincha mavhum sinf o'rniga standart dastur bo'lmasa ishlatiladi
inherit - ya'ni maydonlar va standart usullarni amalga oshirish yo'q. Ommaviy abstrakt kabi
sinflar, interfeyslar odatda ommaviy tiplardir. Ommaviy sinf kabi, umumiy interfeys ham bo'lishi kerak
interfeysi va .java fayl nomi kengaytmasi bilan bir xil nomdagi faylda e'lon qilingan.

Teglash interfeyslari


Biz 15-bobda fayllar, oqimlar va ob'ektlarni ketma-ketlashtirishda teglash tushunchasini ko'rib chiqamiz.
terfeyslar (marker interfeyslari deb ham ataladi) - usullari yoki doimiysi bo'lmagan bo'sh interfeyslar
qiymatlar. Ular sinflarga is-a munosabatlarini qo'shish uchun ishlatiladi. Masalan, 15-bobda biz
Ob'ektlarni bayt ifodasiga o'zgartira oladigan ob'ektni ketma-ketlashtirish mexanizmini muhokama qiling.
tations va bu bayt tasvirlarini ob'ektlarga qayta o'zgartirishi mumkin. Ushbu mexanizmni yoqish uchun
ob'ektlaringiz bilan ishlash uchun siz ularni qo'shish orqali Serializable deb belgilashingiz kerak
Serializable ni sinf deklaratsiyasining birinchi qatori oxirigacha amalga oshiradi. Keyin, hammasi
sinfingiz ob'ektlari Serializable bilan is-a munosabatlariga ega.
10.9.1 To'lov ierarxiyasini ishlab chiqish
Xodimlar va hisob-fakturalar uchun to'lovlarni aniqlay oladigan dastur yaratish uchun biz
avval a qaytaradigan getPaymentAmount usulini o'z ichiga olgan Payable interfeysini yarating
interfeysni amalga oshiradigan har qanday sinf ob'ekti uchun to'lanishi kerak bo'lgan ikki baravar miqdor.
GetPaymentAmount usuli - bu usul daromadlarining umumiy maqsadli versiyasi
Xodimlar ierarxiyasi - daromad usuli maxsus to'lov miqdorini hisoblab chiqadi
Xodim, getPaymentAmount esa, ehtimol, bog'liq bo'lmagan keng doirada qo'llanilishi mumkin.
ob'ektlar. To'lanadigan interfeysni e'lon qilgandan so'ng, biz amalga oshiradigan Invoice sinfini kiritamiz

Umumiy dasturlash xatosi 10.6


In-ni amalga oshiradigan aniq sinfda interfeysning biron bir usulini amalga oshira olmaslik
Terface sinfni mavhum deb e'lon qilish kerakligini ko'rsatadigan kompilyatsiya xatosiga olib keladi.

Dasturiy ta'minot muhandisligi kuzatuvi 10.7


Ko'pgina ishlab chiquvchilar interfeyslarni modellashtirish texnologiyasidan ko'ra muhimroq deb hisoblashadi
sinflar, ayniqsa Java SE 8 interfeysidagi yangi yaxshilanishlar (10.10-bo'limga qarang).

10.9 Interfeyslarni yaratish va ulardan foydalanish 423

To'lanadigan interfeys. Keyin biz Employee sinfini shunday o'zgartiramizki, u interfeysni ham amalga oshiradi
To'lanadigan. Nihoyat, biz Ishchilar kichik toifasi SalariedEmployee-ni to'lovga "moslash" uchun yangilaymiz.
SalariedEmployee usuli daromadlarini getPaymentAmount sifatida qayta nomlash orqali mumkin bo'lgan ierarxiya.

Hisob-faktura va Xodimlar sinflari kompaniya bo'lishi kerak bo'lgan narsalarni ifodalaydi


to'lov miqdorini hisoblash imkoniyati. Ikkala sinf ham To'lanadigan interfeysni amalga oshiradi, shuning uchun a
dastur Invoice ob'ektlari va Xodimlar ob'ektlarida getPaymentAmount usulini chaqirishi mumkin
o'xshash. Tez orada ko‘rib chiqamizki, bu fakturalar va xodimlarni polimorfik qayta ishlash imkonini beradi.
kompaniyaning kreditorlik qarzi bo'yicha arizasi uchun talab qilinadi.
10.10-rasmdagi UML sinf diagrammasida ishlatiladigan interfeys va sinf ierarxiyasi ko'rsatilgan
bizning kreditorlik qarzimiz bo'yicha arizamiz. Ierarxiya to'lanadigan interfeys bilan boshlanadi. UML
"interfeys" so'zini guillemets ichiga joylashtirish orqali interfeysni boshqa sinflardan ajratib turadi.
(«va») interfeys nomining tepasida. UML sinf o'rtasidagi munosabatni ifodalaydi
va realizatsiya deb nomlanuvchi munosabatlar orqali interfeys. A sinf anglab aytiladi, yoki
amalga oshirish, interfeys usullari. Sinf diagrammasi amalga oshirishni chiziqcha sifatida modellashtiradi
amalga oshiruvchi sinfdan interfeysga ishora qiluvchi ichi bo'sh o'q bilan o'q. The
10.10-rasmdagi diagramma shuni ko'rsatadiki, Invoice va Employee sinflari har bir interfeysni amalga oshiradilar.
To'lanadigan. 10.2-rasmdagi sinf diagrammasida bo'lgani kabi, sinf xodimi kursiv bilan ko'rsatilgan,
bu mavhum sinf ekanligini. Beton sinf SalariedEmployee uning merosxo'r, uzaytiradi
to'lanadigan interfeys bilan superklassning realizatsiya aloqasi.

10.9.2 Interfeys to'lanadi


Interfeys to'lanadigan qarz deklaratsiyasi 10.11-rasmda 4-satrda boshlanadi.
getPaymentAmount ommaviy mavhum usulidan foydalanadi. Interfeys usullari har doim ochiqdir
va mavhum, shuning uchun ularni shunday deb e'lon qilish shart emas. Interface Payable faqat bitta
usuli, lekin interfeyslar har qanday sonli usullarga ega bo'lishi mumkin. Bundan tashqari, olish usuli -
PaymentAmount hech qanday parametrga ega emas, lekin interfeys usullari parametrlarga ega bo'lishi mumkin. Interfeyslar
yakuniy statik konstantalarni ham o'z ichiga olishi mumkin.

Yaxshi dasturlash amaliyoti 10.2


Interfeysda usulni e'lon qilishda metodni tavsiflovchi usul nomini tanlang.
odning maqsadi umumiy tarzda, chunki usul ko'pchilik tomonidan amalga oshirilishi mumkin.
tegishli sinflar.

10.10-rasm | To'lanadigan ierarxiya UML sinf diagrammasi.

Hisob-faktura xodimi

Maoshli xodim

"interfeys"
To'lanadigan

424 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.9.3 Sinf hisob-fakturasi
Endi biz hisob-fakturani o'z ichiga olgan oddiy hisob-fakturani ko'rsatish uchun Invoice sinfini yaratamiz (10.12-rasm).
faqat bir turdagi qism uchun ma'lumot olish. Sinf xususiy misol o'zgaruvchilarini e'lon qiladi
qism raqami, qism tavsifi, miqdori va narxi (6–9-qatorlarda)
qism raqami, qismning tavsifi, buyurtma qilingan qismning miqdori va narxi
har bir element uchun. Class Invoice shuningdek, konstruktorni (12–26-qatorlar), olish va sozlash usullarini o'z ichiga oladi
(29–69-qatorlar) sinfning misol o'zgaruvchilari va toString usuli (satrlar) bilan ishlaydi
72–78) bu Invoice ob'ektining String ko'rinishini qaytaradi. Usullar to'plami Miqdori
(41–47-qatorlar) va setPricePerItem (56–63-qatorlar) miqdor va narxni taʼminlaydi.
Element faqat manfiy bo'lmagan qiymatlarni oladi.

1 // 10.11-rasm: To'lanadigan.java


2 // To'lanadigan interfeys deklaratsiyasi.
3
4
5
6
7

10.11-rasm | To'lanadigan interfeys deklaratsiyasi.

1 // 10.12-rasm: Invoice.java
2 // Payableni amalga oshiradigan invoys klassi.
3
4
5 {
6 xususiy yakuniy String qismi raqami;
7 xususiy yakuniy String qismiDescription;
8 shaxsiy to'lov miqdori;
9 ta xususiy ikkilik narxPerItem;
10
11 // konstruktor
12 umumiy hisob-faktura (String qismi raqami, satr qismi tavsifi, int miqdori,
13 ikki baravar narx)
14 {
15 agar (miqdori < 0) // miqdorni tasdiqlang
16 throw new IllegalArgumentException("Miqdor >= 0 bo'lishi kerak");
17
18 agar (pricePerItem < 0.0) // pricePerItemni tasdiqlang
19 yangi IllegalArgumentException (
20 "Bir buyumning narxi >= 0 bo'lishi kerak");
21
22 bu.miqdori = miqdor;
23 this.partNumber = partNumber;
24 this.partDescription = partDescription;
25 this.pricePerItem = pricePerItem;
26 } // yakunlovchi konstruktor
27

10.12-rasm | To'lanadigan to'lovni amalga oshiradigan invoys klassi. (3-qismning 1-qismi.)

umumiy interfeysi to'lanadi
{
ikki marta getPaymentAmount(); // to'lovni hisoblash; amalga oshirish yo'q
}

umumiy sinf Invoice to'lanadigan to'lovlarni amalga oshiradi


10.9 Interfeyslarni yaratish va ulardan foydalanish 425

28 // qism raqamini oling
29 ommaviy string getPartNumber()
30 {
31 qaytish qismi raqami; // tasdiqlash kerak
32 }
33
34 // tavsifni oling
35 ommaviy string getPartDescription()
36 {
37 qaytish qismi Tavsif;
38 }
39
40 // miqdorni belgilang
41 ommaviy bekor to'plamiQuantity(int miqdori)
42 {
43 agar (miqdori < 0) // miqdorni tasdiqlang
44 throw new IllegalArgumentException("Miqdor >= 0 bo'lishi kerak");
45
46 bu.miqdori = miqdor;
47 }
48
49 // miqdorni oling
50 ommaviy int getQuantity()
51 {
52 qaytariladigan miqdor;
53 }
54
55 // har bir element uchun narxni belgilang
56 ommaviy bekor setPricePerItem(ikkita narxPerItem)
57 {
58 agar (pricePerItem < 0.0) // pricePerItemni tasdiqlang
59 yangi IllegalArgumentException (
60 "Bir buyumning narxi >= 0 bo'lishi kerak");
61
62 this.pricePerItem = pricePerItem;
63 }
64
65 // har bir mahsulot narxini oling
66 umumiy juftlik getPricePerItem()
67 {
68 har bir elementning narxini qaytarish;
69 }
70
71 // Invoice ob'ektining string ko'rinishini qaytarish
72 @Bekor qilish
73 umumiy string toString()
74 {
75 return String.format("%s: %n%s: %s (%s) %n%s: %d %n%s: $%,.2f",
76 "invoys", "part raqami", getPartNumber(), getPartDescription(),
77 "miqdor", getQuantity(), "buyum uchun narx", getPricePerItem());
78 }
79

10.12-rasm | To'lanadigan to'lovni amalga oshiradigan invoys klassi. (3 qismning 2-qismi.)


426 10-bob Obyektga yo‘naltirilgan dasturlash: Polimorfizm va interfeyslar

Sinf faqat bitta boshqa sinfni kengaytirishi mumkin, lekin ko'plab interfeyslarni amalga oshirishi mumkin
4-qator Invoice klassi Payable interfeysini amalga oshirishini bildiradi. Barcha sinflar singari, In-
ovoz ham Ob'ektni bilvosita kengaytiradi. Java pastki sinflarga boshqa sinflardan meros bo'lishga ruxsat bermaydi
bitta supersinfdan ko'ra, lekin u sinfga bitta supersinfdan meros olish va uni amalga oshirish imkonini beradi
kerakli darajada ko'p interfeyslar. Bir nechta interfeyslarni amalga oshirish uchun vergul bilan ajratilgan holda foydalaning
sinf deklaratsiyasida kalit so'zlarni amalga oshirgandan keyin interfeys nomlari ro'yxati:

Class Invoice to'lanadigan interfeysda bitta mavhum usulni qo'llaydi - usul


getPaymentAmount 81-85-qatorlarda e'lon qilinadi. Usul umumiy to'lovni hisoblab chiqadi
hisob-fakturani to'lash talab qilinadi. Usul miqdor va narx qiymatlarini ko'paytiradi.
Element (tegishli olish usullari orqali olingan) va natijani qaytaradi. Bu usul
Toʻlanadigan interfeysda ushbu usulni qoʻllash talablarini qondiradi – biz toʻla-
kompilyator bilan interfeys shartnomasini to'ldirdi.
10.9.4 Interfeys to'lovini amalga oshirish uchun sinf xodimini o'zgartirish
Endi biz "Xodim" sinfini shunday o'zgartiramizki, u "To'lanadigan to'lov" interfeysini qo'llaydi. 10.13-rasm
o'zgartirilgan sinfni o'z ichiga oladi, bu ikki istisnosiz 10.4-rasmdagi bilan bir xil.
Birinchidan, 10.13-rasmning 4-qatori endilikda "Xodim" klassi "To'lanadigan to'lov" interfeysini qo'llashini ko'rsatadi.
Bu misol uchun, biz usulda daromad nomini getPaymentAmount deb o‘zgartirdik
Xodimlar ierarxiyasi. Xodimlar sinfining versiyasidagi usul daromadlari kabi
10.4-rasmda getPaymentAmount usulini qo'llash mantiqiy emas
sinf xodimi, chunki biz umumiy ishchiga to'lanadigan daromad to'lovini hisoblay olmaymiz.
xodim - biz birinchi navbatda Xodimning o'ziga xos turini bilishimiz kerak. 10.4-rasmda biz meth-
Shu sababli daromadlar mavhum, shuning uchun sinf xodimi mavhum deb e'lon qilinishi kerak edi.
Bu har bir Xodimning aniq kichik sinfini amalga oshirish bilan daromadlarni bekor qilishga majbur qildi.

80
81


82
83
84
85
86 } // yakuniy sinf Invoys

umumiy sinf ClassName SuperclassNameni kengaytiradi First Interface,


Ikkinchi interfeys,…
Dasturiy ta'minot muhandisligi kuzatuvi 10.8
Bir nechta interfeyslarni amalga oshiradigan sinfning barcha ob'ektlari is-a bilan munosabatga ega
har bir amalga oshirilgan interfeys turi.

1 // 10.13-rasm: Employee.java


2 // To'lovni amalga oshiradigan xodimlarning mavhum superklassi.
3

10.13-rasm | To'lovni amalga oshiradigan xodimlarning mavhum super klassi. (2-qismning 1-qismi.)

10.12-rasm | To'lanadigan to'lovni amalga oshiradigan invoys klassi. (3 qismning 3-qismi.)

// To'lanadigan interfeys bilan shartnomani bajarish uchun zarur bo'lgan usul


@Override
umumiy ikki marta getPaymentAmount()
{
getQuantity() * getPricePerItem(); // umumiy xarajatlarni hisoblash
}

10.9 Interfeyslarni yaratish va ulardan foydalanish 427

10.13-rasmda biz bu vaziyatni boshqacha ko'rib chiqamiz. Sinf amalga oshirilganda buni eslang
interfeys, u kompilyator bilan yoki sinf amalga oshirishi haqida shartnoma tuzadi
interfeys yoki sinfdagi har bir usul mavhum deb e'lon qilinadi. Chunki sinf xodimi
getPaymentAmount usulini taqdim etmaydi, sinf mavhum deb e'lon qilinishi kerak. Har qanday
mavhum sinfning aniq kichik sinfi bajarish uchun interfeys usullarini amalga oshirishi kerak
kompilyator bilan superklass shartnomasi. Agar pastki sinf buni qilmasa, u ham e'lon qilinishi kerak

4
5 {


6 shaxsiy yakuniy String firstName;
7 shaxsiy yakuniy String familiyasi;
8 xususiy yakuniy String socialSecurityNumber;
9
10 // konstruktor
11 davlat xodimi (String firstName, String familiyasi,
12 qatorli ijtimoiy xavfsizlik raqami)
13 {
14 this.firstName = firstName;
15 this.lastName = familiya;
16 this.socialSecurityNumber = socialSecurityNumber;
17 }
18
19 // ismni qaytaring
20 ommaviy string getFirstName()
21 {
22 nomini qaytarish;
23 }
24
25 // familiyani qaytaring
26 ommaviy satr getLastName()
27 {
28 familiyasini qaytarish;
29 }
30
31 // ijtimoiy xavfsizlik raqamini qaytaring
32 ommaviy satr getSocialSecurityNumber()
33 {
34 ijtimoiy xavfsizlik raqamini qaytarish;
35 }
36
37 // Qaytish Xodimlar ob'ektining string ko'rinishi
38 @Bekor qilish
39 umumiy string toString()
40 {
41 return String.format("%s %s%nijtimoiy xavfsizlik raqami: %s",
42 getFirstName(), getLastName(), getSocialSecurityNumber());
43 }
44
45
46
47 } // end abstrakt sinf Xodim

10.13-rasm | To'lovni amalga oshiradigan xodimlarning mavhum super klassi. (2-qismning 2-qismi.)

ommaviy mavhum sinf Xodim amalga oshiradi To'lanadigan

// Eslatma: Biz bu yerda getPaymentAmount Payable usulini qo'llamaymiz


// kompilyatsiya xatosiga yo'l qo'ymaslik uchun bu sinf mavhum deb e'lon qilinishi kerak.

428 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

mavhum. 45-46-qatorlardagi izohlarda ko'rsatilganidek, 10.13-rasmdagi sinf xodimi shunday qiladi.
getPaymentAmount usulini qo'llamang, shuning uchun sinf mavhum deb e'lon qilinadi. Har bir to'g'ridan-to'g'ri
Xodimlar kichik sinfi getPaymentAmount usulini amalga oshirish uchun supersinf shartnomasini meros qilib oladi.
va shuning uchun ob'ektlar bo'lishi mumkin bo'lgan aniq sinfga aylanish uchun ushbu usulni amalga oshirish kerak
yaratilgan. Xodimning aniq kichik sinflaridan birini kengaytiradigan sinf imple-ni meros qilib oladi.
getPaymentAmount haqida eslatib o'tish va shuning uchun ham aniq sinf bo'ladi.
10.9.5 To'lanadigan qarzda foydalanish uchun maoshli xodim sinfini o'zgartirish
Ierarxiya
10.14-rasmda o'zgartirilgan SalariedEmployee klassi mavjud bo'lib, u Xodim va to'liq-
GetPaymentAmount to'lanadigan to'lov usulini amalga oshirish uchun superklassni to'ldiradi.
SalariedEmployee ning ushbu versiyasi 10.5-rasmdagi bilan bir xil, ammo u usul o'rnini bosadi.
getPaymentAmount usuli bilan daromadlar (39–43-qatorlar). Eslatib o'tamiz, to'lanadigan versiya
Usulning bir-biridan farq qiladigan sinflar uchun qo'llanilishi mumkin bo'lgan umumiy nomi bor. (Agar biz
10.5-bo'limdagi qolgan Xodimlar kichik sinflarini o'z ichiga oladi - Soatlik Xodim, Kom-
missionEmployee va BasePlusCommissionEmployee—bu misolda ularning daromadlari
usullar ham getPaymentAmount deb o'zgartirilishi kerak. Biz ushbu o'zgartirishlarni qoldiramiz
10.15-mashq va bu yerda test dasturimizda faqat SalariedEmployee-dan foydalaning. 10.16-mashq
barcha Xodimlar sinfi ierarxiyasida Payable interfeysini qo'llashingizni so'raydi
Anjir. 10.4–10.9 Xodimlar kichik sinflarini o'zgartirmasdan.)

1 // 10.14-rasm: SalariedEmployee.java


2 // Payable interfeysini qo'llaydigan SalariedEmployee klassi.
3 // getPaymentAmount usuli.
4 ommaviy sinf SalariedEmployee uzaytiradi Xodim
5 {
6 ta xususiy ikki haftalik ish haqi;
7
8 // konstruktor
9 ta umumiy maoshli xodim(String firstName, String familiyasi,
10 String SocialSecurityNumber, ikki haftalik ish haqi)
11 {
12 super(ism, familiya, socialSecurityNumber);
13
14 bo'lsa (haftalik ish haqi < 0,0)
15 yangi IllegalArgumentException (
16 "Haftalik ish haqi >= 0,0 bo'lishi kerak");
17
18 this.weeklyMaosh = haftalikMaosh;
19 }
20
21 // ish haqini belgilash
22 davlat bekor to'plamiHaftalik Maosh(ikki marta haftalik ish haqi)
23 {
24 agar (haftalik ish haqi < 0,0)
25 yangi IllegalArgumentException (
26 "Haftalik ish haqi >= 0,0 bo'lishi kerak");

10.14-rasm | Interfeys To'lov usulini qo'llaydigan SalariedEmployee klassi


getPaymentAmount. (2-qismning 1-qismi.)

10.9 Interfeyslarni yaratish va ulardan foydalanish 429

Sinf interfeysni amalga oshirganda, xuddi shu munosabatlar meros orqali ta'minlanadi.
tansi amal qiladi. Sinf xodimi To'lanadigan qarzni amalga oshiradi, shuning uchun biz Xodimni a deb aytishimiz mumkin
To'lanadigan. Haqiqatan ham, Xodimni kengaytiradigan har qanday sinf ob'ektlari ham To'lanadigan ob'ektlardir. Sal-
ariedEmployee ob'ektlari, masalan, To'lanadigan ob'ektlardir. ning har qanday kichik sinflari ob'ektlari
interfeysni amalga oshiradigan sinfni interfeys tipidagi ob'ektlar sifatida ham ko'rish mumkin.
Shunday qilib, biz SalariedEmployee ob'ektiga havolani yuqori sinfga belgilashimiz mumkin
Xodimlar o'zgaruvchisi, biz SalariedEmployee ob'ektiga havolani inter-
yuz to'lanadigan o'zgaruvchan. Invoys to'lanadigan to'lovni amalga oshiradi, shuning uchun Invoice ob'ekti ham to'lov hisoblanadi.
qodir ob'ekt va biz Invoice ob'ektiga havolani To'lanadigan o'zgaruvchiga belgilashimiz mumkin.

27
28 this.weeklyMaosh = haftalikMaosh;


29 }
30
31 // ish haqini qaytarish
32 umumiy ikki martalik getWeeklySalary()
33 {
34 haftalik ish haqi;
35 }
36
37
38
39
40
41
42
43
44
45 // SalariedEmployee ob'ektining string ko'rinishini qaytarish
46 @Bekor qilish
47 umumiy string toString()
48 {
49 return String.format("maoshli xodim: %s%n%s: $%,.2f",
50 super.toString(), "haftalik ish haqi", getWeeklySalary());
51 }
52 } // oxirgi sinf SalariedEmployee

Dasturiy ta'minot muhandisligi kuzatuvi 10.9


Usul parametri superklass yoki interfeys turi bilan e'lon qilinganda, usul
argument sifatida berilgan obyektni polimorf tarzda qayta ishlaydi.

Dasturiy ta'minot muhandisligi kuzatuvi 10.10


Yuqori sinf ma'lumotnomasidan foydalanib, biz e'lon qilingan har qanday usulni polimorf tarzda chaqirishimiz mumkin
supersinf va uning yuqori sinflari (masalan, Ob'ekt sinfi). Interfeys ma'lumotnomasidan foydalanib, biz qila olamiz
interfeysda e'lon qilingan har qanday usulni, uning superinterfeyslarini (bir
interfeys boshqasini kengaytirishi mumkin) va Object sinfida - interfeys tipidagi o'zgaruvchi bo'lishi kerak
usullarni chaqirish uchun ob'ektga murojaat qiling va barcha ob'ektlar Object sinfining usullariga ega.

10.14-rasm | Interfeys To'lov usulini qo'llaydigan SalariedEmployee klassi


getPaymentAmount. (2-qismning 2-qismi.)

// daromadni hisoblash; edi interfeysi To'lanadigan usulini amalga oshirish


// Xodim superklassidagi referat
@Override
umumiy ikki marta getPaymentAmount()
{
getWeeklySalary();
}

430 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.9.6 Hisob-fakturalar va xodimlarni qayta ishlash uchun to'lanadigan interfeysdan foydalanish
Polimorfik
PayableInterfaceTest (10.15-rasm) Payable interfeysidan foydalanish uchun foydalanish mumkinligini ko'rsatadi.
Hisob-fakturalar va xodimlar to'plamini bitta ilovada polimorf tarzda o'tkazing. 9-qator e'lon qiladi
payableObjects va unga to'rtta To'lanadigan o'zgaruvchilar qatorini tayinlaydi. 12-13-qatorlar tayinlanadi
PayableObjects ning dastlabki ikkita elementiga Invoice ob'ektlarining havolalari. 14–17 qatorlar
keyin qolgan ikkita elementga SalariedEmployee obyektlarining havolalarini tayinlang
to'lanadigan ob'ektlar. Ushbu topshiriqlarga ruxsat beriladi, chunki schyot-faktura to'lanadigan qarz, sotuvchidir.
ariedEmployee - bu Xodim va Xodim - to'lanadigan qarz. 23–29 qatorlarda en-
PayableObjects-dagi har bir To'lanadigan ob'ektni polimorf tarzda qayta ishlash uchun bayonot uchun talab qilingan,
ob'ektni to'lov miqdori bilan birga String sifatida chop etish. 27-qator chaqiradi
toString usuli e'lon qilinmagan bo'lsa ham, Payable interfeysi ma'lumotnomasi orqali
Interfeysda To'lanadigan - barcha havolalar (shu jumladan interfeys turlariga tegishli) ob'ektlarga ishora qiladi.
tendent Object va shuning uchun toString usuliga ega. (ToString usuli ham chaqirilishi mumkin
bilvosita bu erda.) 28-satr to'lovni olish uchun getPaymentAmount to'lov usulini chaqiradi.
ob'ektning haqiqiy turidan qat'i nazar, payableObjects-dagi har bir ob'ekt uchun ment miqdori.
Chiqarish shuni ko'rsatadiki, 27-28-qatorlardagi qo'ng'iroqlarning har biri mos keladiganini chaqiradi
sinfning toString va getPaymentAmount usullarini amalga oshirish. Masalan, qachon
currentPayable for tsiklining birinchi iteratsiyasidagi Invoys sinfiga ishora qiladi.
ovozli toString va getPaymentAmount bajariladi.

1 // 10.15-rasm: PayableInterfaceTest.java


2 // To'lanadigan interfeys test dasturini qayta ishlash Hisob-fakturalar va
3 // Xodimlar polimorfik.
4 umumiy sinf PayableInterfaceTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // to'rt elementli To'lanadigan massivni yarating
9
10
11 // massivni Payableni amalga oshiradigan ob'ektlar bilan to'ldiring
12 payableObjects[0] = new Invoice("01234", "o'rindiq", 2, 375,00);
13 payableObjects[1] = new Invoice("56789", "shina", 4, 79,95);
14 to'lanadigan ob'ektlar[2] =
15 ta yangi maoshli xodim("Jon", "Smit", "111-11-1111", 800.00);
16 to'lanadigan ob'ektlar[3] =
17 yangi maoshli xodim("Lisa", "Barnes", "888-88-8888", 1200.00);
18
19 System.out.println(
20 "Hisob-fakturalar va polimorf tarzda qayta ishlangan xodimlar:");
21
22 // payableObjects massividagi har bir elementni umumiy qayta ishlash
23 uchun (To'lanadigan joriyTo'lov: payableObjects)
24 {

10.15-rasm | Hisob-fakturalar va xodimlarni qayta ishlash uchun to'lanadigan interfeys sinov dasturi


polimorfik. (2-qismning 1-qismi.)

To'lanadigan qarz[] payableObjects = yangi to'lanadigan qarz[4];


10.9 Interfeyslarni yaratish va ulardan foydalanish 431

10.9.7 Java API ning ba'zi umumiy interfeyslari
Java dasturlarini ishlab chiqishda interfeyslardan keng foydalanasiz. Java API o'z ichiga oladi
ko'plab interfeyslar va Java API usullarining ko'pchiligi interfeys argumentlarini oladi va qayta ishlaydi.
interfeys qiymatlarini aylantiring. 10.16-rasmda bir nechta mashhur interfeyslar ko'rib chiqilgan
Keyingi boblarda foydalanadigan Java API.

25 // chiqarish joriyPayable va uning tegishli to'lov miqdori


26 System.out.printf("%n%s %n%s: $%,.2f%n",
27 , // bilvosita chaqirishi mumkin
28 "to'lov muddati", );
29 }
30 } // asosiyni tugatish
31 } // oxirgi sinf PayableInterfaceTest

Polimorf tarzda qayta ishlangan hisob-fakturalar va xodimlar:

faktura:
Qism raqami: 01234 (o'rindiq)
miqdori: 2
har bir mahsulot narxi: $375.00
to'lov muddati: $750.00

faktura:
Qism raqami: 56789 (shinalar)


miqdori: 4
har bir mahsulot narxi: $79,95
to'lov muddati: $319,80

maoshli xodim: Jon Smit


ijtimoiy xavfsizlik raqami: 111-11-1111
haftalik ish haqi: $800.00
to'lov muddati: $800.00

maoshli xodim: Liza Barns


ijtimoiy xavfsizlik raqami: 888-88-8888
haftalik ish haqi: $1,200.00
to'lov muddati: $1,200.00

Interfeys tavsifi

Taqqoslanadigan Java bir nechta taqqoslash operatorlarini (masalan, <, <=, >, >=, ==, !=) o'z ichiga oladi.
ibtidoiy qiymatlarni solishtirish. Biroq, bu operatorlarni taqqoslash uchun ishlatib bo'lmaydi
ob'ektlar. Interface Comparable ni amalga oshiradigan sinf ob'ektlariga ruxsat berish uchun ishlatiladi
bir-biri bilan solishtirish uchun interfeys. Interface Comparable odatda ishlatiladi
massiv kabi to'plamdagi ob'ektlarni buyurtma qilish uchun. Biz Comparable-dan foydalanamiz
16-bob, Umumiy to'plamlar va 20-bob, Umumiy sinflar va usullar.

10.16-rasm | Java API ning umumiy interfeyslari. (2-qismning 1-qismi.)

10.15-rasm | Hisob-fakturalar va xodimlarni qayta ishlash uchun to'lanadigan interfeys sinov dasturi
polimorfik. (2-qismning 2-qismi.)

currentPayable.toString()


currentPayable.getPaymentAmount()

432 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.10 Java SE 8 interfeysini yaxshilash
Ushbu bo'lim Java SE 8 ning yangi interfeys xususiyatlari bilan tanishtiradi. Biz bularni batafsilroq muhokama qilamiz
keyingi boblarda.
10.10.1 Standart interfeys usullari
Java SE 8 dan oldin interfeys usullari faqat ommaviy mavhum usullar bo'lishi mumkin edi. Bu degani edi
interfeys amalga oshiruvchi sinf qanday operatsiyalarni bajarishi kerakligini ko'rsatadi, lekin amalga oshirmaydi
sinf ularni qanday bajarishi kerak.
Java SE 8 da interfeyslar beton bilan umumiy standart usullarni ham o'z ichiga olishi mumkin
bajarilganda operatsiyalar qanday bajarilishini belgilaydigan standart ilovalar.
zikr sinfi usullarni bekor qilmaydi. Agar sinf bunday interfeysni amalga oshirsa,
sinf interfeysning standart ilovalarini ham oladi (agar mavjud bo'lsa). Standartni e'lon qilish uchun
usuli uchun standart kalit so'zni usulning qaytish turidan oldin qo'ying va konfiguratsiyani taqdim eting.
Krit usulini amalga oshirish.
Mavjud interfeyslarga usullarni qo'shish
Java SE 8 dan oldin interfeysga usullarni qo'shish har qanday amalga oshirish sinflarini buzadi
yangi usullarni amalga oshirmagan. Eslatib o'tamiz, agar siz har birini amalga oshirmagan bo'lsangiz
interfeysi usullaridan foydalanganda siz o'z sinfingizni abstrakt deb e'lon qilishingiz kerak edi.
Asl interfeysni amalga oshiradigan har qanday sinf sukut bo'lganda buzilmaydi
usul qo'shiladi - sinf oddiygina yangi standart usulni oladi. Sinf amalga oshirganda -

Serializable Ob'ektlari yozilishi mumkin bo'lgan sinflarni aniqlash uchun foydalaniladigan interfeys (ya'ni seriyali)


yoki ba'zi bir saqlash turlaridan (masalan, diskdagi fayl, ma'lumotlar bazasi) o'qing (ya'ni, seriyasiz).
maydon) yoki tarmoq orqali uzatiladi. Biz 15-bob, Fayllar, Serializable-dan foydalanamiz.
Oqimlar va ob'ektlarni ketma-ketlashtirish va 28-bob, Tarmoq.
Runnable Bajariladigan vazifani ifodalovchi har qanday sinf tomonidan amalga oshiriladi. Sinf kabi ob'ektlar
ko'pincha parallel ravishda multithreading deb nomlangan texnika yordamida amalga oshiriladi (bu erda muhokama qilingan
23-bob, bir vaqtdalik). Interfeys bitta usulni o'z ichiga oladi: ishga tushirish
bajarilganda ob'ektning xatti-harakatlarini belgilaydi.
GUI hodisasi -
tinglovchi
interfeyslar

Siz har kuni grafik foydalanuvchi interfeyslari (GUI) bilan ishlaysiz. Veb-brauzeringizda,


tashrif buyuradigan veb-sayt manzilini yozishingiz yoki tugmani bosishingiz mumkin
oldingi saytga qaytish. Brauzer sizning munosabatingizga javob beradi va bajaradi
kerakli vazifa. Sizning o'zaro ta'siringiz hodisa va kod sifatida tanilgan
Hodisaga javob berish uchun foydalanadigan brauzer voqea ishlov beruvchisi sifatida tanilgan. 12-bobda,
GUI komponentlari: 1-qism va 22-bob, GUI komponentlari: 2-qism, siz bilib olasiz
foydalanuvchilarning o'zaro ta'siriga javob beradigan GUI va voqea ishlov beruvchilarini qanday yaratish kerak. Tadbir
ishlov beruvchilar tegishli hodisa-tinglovchilararoni amalga oshiradigan sinflarda e'lon qilinadi.
yuz. Har bir hodisa tinglovchi interfeysi bo'lishi kerak bo'lgan bir yoki bir nechta usullarni belgilaydi
foydalanuvchilarning o'zaro ta'siriga javob berish uchun amalga oshiriladi.
AutoCloseable Resurslarni sinab ko'rish bayonoti bilan ishlatilishi mumkin bo'lgan sinflar tomonidan amalga oshiriladi
(11-bob, istisnolardan foydalanish: chuqurroq qarash) resurslarning sizib chiqishini oldini olishga yordam beradi.

Interfeys tavsifi

10.16-rasm | Java API ning umumiy interfeyslari. (2-qismning 2-qismi.)

10.11 (ixtiyoriy) GUI va grafik misol: Polimorfizm bilan chizish 433

Java SE 8 interfeysi bilan sinf kompilyator bilan “shartnoma imzolaydi” va unda “men qilaman”
interfeys tomonidan belgilangan barcha mavhum usullarni e'lon qiling yoki men o'z sinfimni e'lon qilaman
abstrakt” - amalga oshiruvchi sinf interfeysning standart qiymatini bekor qilish uchun talab qilinmaydi
usullar, lekin agar kerak bo'lsa.

Interfeyslar va mavhum sinflar


Java SE 8 dan oldin odatda interfeys (mavhum sinf o'rniga) qachon ishlatilgan
meros qilib olinadigan amalga oshirish tafsilotlari yo'q edi - maydonlar va amalga oshirish usullari yo'q
lar. Standart usullar bilan siz o'rniga umumiy usullarni qo'llashni e'lon qilishingiz mumkin
interfeyslarda, bu sizning sinflaringizni loyihalashda ko'proq moslashuvchanlikni beradi.
10.10.2 Statik interfeys usullari
Java SE 8 dan oldin, statikni o'z ichiga olgan sinfni interfeys bilan bog'lash odatiy hol edi
interfeysni amalga oshirgan ob'ektlar bilan ishlash uchun yordamchi usullar. 16-bobda,
uchun ko'plab statik yordamchi usullarni o'z ichiga olgan to'plamlar sinfi haqida bilib olasiz
Collection, List, Set va boshqalar interfeyslarni amalga oshiradigan ob'ektlar bilan ishlash. sobiq uchun -
keng, Collections usuli saralash interfeysni amalga oshiradigan har qanday sinf ob'ektlarini saralashi mumkin
Roʻyxat. Statik interfeys usullari bilan bunday yordamchi usullar endi to'g'ridan-to'g'ri e'lon qilinishi mumkin
alohida sinflarda emas, balki interfeyslarda.
10.10.3 Funktsional interfeyslar
Java SE 8 dan boshlab faqat bitta mavhum usulni o'z ichiga olgan har qanday interfeys funktsiya deb nomlanadi.
milliy interfeys. Java SE 7 API-larida bunday interfeyslar juda ko'p va ularning ko'plari mavjud
Java SE 8 da yangilari. Ushbu kitobda foydalanadigan ba'zi funktsional interfeyslarga quyidagilar kiradi:
• ActionListener (12-bob) — a belgilash uchun ushbu interfeysni qo'llaysiz
foydalanuvchi tugmani bosganida chaqiriladigan usul.
• Comparator (16-bob)—Usulni aniqlash uchun ushbu interfeysni amalga oshirasiz
birinchi ob'ekt yoki yo'qligini aniqlash uchun berilgan turdagi ikkita ob'ektni solishtirish mumkin
ikkinchisidan kichik, teng yoki kattaroqdir.
• Ishga tushirish mumkin (23-bob) — Siz vazifani belgilash uchun ushbu interfeysni qo'llaysiz
dasturingizning boshqa qismlari bilan parallel ravishda ishga tushirilishi mumkin.
Funktsional interfeyslar Java SE 8 ning yangi lambda imkoniyatlari bilan keng qo'llaniladi.
17-bobda tanishtiring. 12-bobda siz ko'pincha yaratish orqali interfeysni amalga oshirasiz
interfeysning metod(lar)ini amalga oshiruvchi anonim ichki sinf deb ataladi. Java SE da
8-rasmda, lambdalar kompilyator tomonidan anonim usullarni yaratish uchun qisqartma yozuvni taqdim etadi
avtomatik ravishda siz uchun anonim ichki sinflarga tarjima qiladi.
10.11 (ixtiyoriy) GUI va grafik misollar: chizmachilik
Polimorfizm bilan
Siz GUI va Graphics Case Study-da yaratilgan chizmachilik dasturida payqagan bo'lishingiz mumkin
8.1-mashq (va GUI va Graphics Case Study Exercise 9.1 da o'zgartirilgan)

Dasturiy ta'minot muhandisligi kuzatuvi 10.11


Java SE 8 standart usullari yangilarini qo'shish orqali mavjud interfeyslarni rivojlantirishga imkon beradi
Ulardan foydalanadigan kodni buzmasdan ushbu interfeyslarga usullar.

434 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

sinflar juda ko'p o'xshashliklarga ega. Merosdan foydalanib, biz umumiy xususiyatlarni "chiqarishimiz" mumkin
barcha uchta sinfdan va ularni bitta shakldagi superklassga joylashtiring. Keyin, o'zgaruvchilar yordamida
supersinf turi, biz shaklli ob'ektlarni polimorf tarzda boshqarishimiz mumkin. Qayta olib tashlash
keraksiz kod kichikroq, yanada moslashuvchan dasturga olib keladi, uni saqlash osonroq.

GUI va grafik misollarni o'rganish mashqlari


10.1 MyLine, MyOval va MyRectangle sinflarini GUI va Graphics Case Study ni o'zgartirish
10.17-rasmdagi sinf ierarxiyasini yaratish uchun 8.1-mashq va 9.1-mashq. MyShape yuqori sinflari
erarxiya o'zini qanday chizishni biladigan "aqlli" shakl sinflari bo'lishi kerak (agar a
Qaerga chizish kerakligini aytadigan grafik ob'ekt). Dastur ushbu satrdan ob'ektni yaratgandan so'ng -
archy, u butun umri davomida uni MyShape sifatida polimorf tarzda boshqarishi mumkin.

Sizning yechimingizda 10.17-rasmdagi MyShape klassi mavhum bo'lishi kerak. Chunki MyShape har qanday narsani ifodalaydi


umuman shakl, uning qaysi shaklini aniq bilmasdan chizish usulini amalga oshira olmaysiz
hisoblanadi. Ierarxiyadagi shakllarning koordinatalari va rangini ifodalovchi ma'lumotlar bo'lishi kerak
MyShape sinfining shaxsiy a'zolari sifatida e'lon qilingan. Umumiy ma'lumotlarga qo'shimcha ravishda, MyShape klassi
quyidagi usullarni e'lon qilishi kerak:
a) Argumentsiz konstruktor, shaklning barcha koordinatalarini 0 ga, rangni esa
Rang.QORA.
b) Argumentlar qiymatlariga koordinata va rangni inisializatsiya qiluvchi konstruktor
ta'minlangan.
c) Dasturchiga o'rnatishga imkon beradigan individual koordinatalar va ranglar uchun usullarni o'rnatish
ierarxiyadagi shakl uchun mustaqil ravishda har qanday ma'lumotlar.
d) Dasturchiga qayta ishlashga imkon beradigan individual koordinatalar va ranglar uchun usullarni oling.
ierarxiyadagi shakl uchun har qanday ma'lumotni mustaqil ravishda sinab ko'ring.
e) mavhum usul
ommaviy abstrakt bekor chizish (Grafika g);
ekranda shakl chizish uchun dasturning paintComponent usuli chaqiradi.
To'g'ri inkapsulyatsiyani ta'minlash uchun MyShape sinfidagi barcha ma'lumotlar shaxsiy bo'lishi kerak. Bu talab qiladi
to'g'ri to'plamni e'lon qilish va ma'lumotlarni manipulyatsiya qilish usullarini olish. MyLine klassi no-ni ta'minlashi kerak
argument konstruktori va koordinatalar va rang uchun argumentli konstruktor. Sinflar
MyOval va MyRectangle argumentsiz konstruktorni va argumentli konstruktorni taqdim etishi kerak.

10.17-rasm | MyShape ierarxiyasi.

java.lang.Object

MyShape


MyLine MyOval MyRectangle

10.11 (ixtiyoriy) GUI va grafik misol: Polimorfizm bilan chizish 435



koordinatalar, rang va shaklning to'ldirilganligini aniqlash. Bahssiz
konstruktor standart qiymatlarni o'rnatishdan tashqari, shaklni to'ldirilmagan shaklga o'rnatishi kerak.
Kosmosdagi ikkita nuqtani bilsangiz, siz chiziqlar, to'rtburchaklar va tasvirlar chizishingiz mumkin. Chiziqlar uchun x1, y1,
x2 va y2 koordinatalari. Graphics sinfining drawLine usuli ikki nuqtani bog'laydi
liniya bilan ta'minlangan. Agar ovallar uchun bir xil to'rtta koordinata qiymati (x1, y1, x2 va y2) bo'lsa va
to'rtburchaklar, siz ularni chizish uchun zarur bo'lgan to'rtta argumentni hisoblashingiz mumkin. Ularning har biri yuqori chap tomonni talab qiladi
x-koordinata qiymati (ikki x-koordinata qiymatidan kichigi), yuqori chapdagi y-koordinata qiymati
(ikki y-koordinata qiymatidan kichikroq), kenglik (o'rtasidagi farqning mutlaq qiymati
ikkita x-koordinata qiymati) va balandlik (ikki y- orasidagi farqning mutlaq qiymati)
koordinata qiymatlari). To'rtburchaklar va tasvirlar ham to'ldirilgan bayroqqa ega bo'lishi kerak, bu esa to'ldirishni belgilaydi
shaklni to'ldirilgan shakl sifatida chizish.
Dasturda MyLine, MyOval yoki MyRectangle o'zgaruvchilari bo'lmasligi kerak - faqat MyShape
MyLine, MyOval va MyRectangle ob'ektlariga havolalarni o'z ichiga olgan o'zgaruvchilar. Dastur kerak
tasodifiy shakllarni yarating va ularni MyShape tipidagi massivda saqlang. PaintComponent usuli
MyShape massividan o'tishi va har bir shaklini polimorf tarzda chaqirish orqali chizish kerak
shakl chizish usuli.
Foydalanuvchiga yaratish uchun shakllar sonini (kirish dialogi orqali) belgilashga ruxsat bering. Dastur
keyin shakllarni yaratadi va foydalanuvchiga qancha ekanligini bildiruvchi holat paneli bilan birga ko'rsatadi
har bir shakl yaratilgan.
10.2 (Chizma ilovasini o'zgartirish) Oldingi mashqda siz MyShape ierarini yaratdingiz.
MyLine, MyOval va MyRectangle sinflari MyShape-ni to'g'ridan-to'g'ri kengaytiradi. Agar sizning ierarxiyangiz bo'lsa
to'g'ri ishlab chiqilgan bo'lsa, siz MyOval va MyRectangle sinflari o'rtasidagi o'xshashlikni ko'rishingiz kerak -
es. MyOval va MyRectangle sinflari uchun kodni qayta loyihalash va qaytadan joriy qilish.
10.18-rasmdagi ierarxiyani yaratish uchun MyBoundedShape mavhum sinfiga umumiy xususiyatlar.
MyBoundedShape klassi faqat MyShape sinfiga taqlid qiluvchi ikkita konstruktorni e'lon qilishi kerak.
shakl to'ldirilganligini aniqlash uchun qo'shilgan parametr bilan. MyBoundedShape klassi ham bo'lishi kerak
to'ldirilgan bayroqni manipulyatsiya qilish usullarini olish va sozlash usullarini va yuqori qiymatlarni hisoblash usullarini e'lon qiling.
chap x-koordinata, yuqori chap y-koordinata, kenglik va balandlik. Esda tuting, chizish uchun kerakli qiymatlar
oval yoki to'rtburchakni ikkita (x, y) koordinatadan hisoblash mumkin. To'g'ri ishlab chiqilgan bo'lsa, yangi
MyOval va MyRectangle sinflarining har birida ikkita konstruktor va chizish usuli bo'lishi kerak.

10.18-rasm | MyBoundedShape bilan MyShape ierarxiyasi.

java.lang.Object

MyShape


MyLine MyBoundedShape

MyOval MyRectangle


436 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar

10.12 Yakunlash
Ushbu bobda polimorfizm - bir xil bo'lgan ob'ektlarni qayta ishlash qobiliyati kiritilgan
sinf ierarxiyasidagi supersinf, go'yo ularning hammasi supersinf ob'ektlari. Biz qanday qilib muhokama qildik
polimorfizm tizimlarni kengaytiriladigan va qo'llab-quvvatlanadigan qiladi, keyin qanday foydalanishni ko'rsatdi
polimorfik xatti-harakatlarga ta'sir qilish uchun bekor qilingan usullar. Biz mavhum sinflarni joriy qildik,
bu sizga boshqa sinflar meros olishi mumkin bo'lgan tegishli superklassni taqdim etish imkonini beradi.
Siz mavhum sinf mavhum usullarni e'lon qilishi mumkinligini bilib oldingiz, ularni har bir kichik sinf o'z ichiga oladi.
aniq sinfga aylanish va dastur mavhum sinf o'zgaruvchilaridan foydalanishi mumkin
pastki sinflarning mavhum usullarni amalga oshirishlarini polimorf tarzda chaqirish. Sen ham
bajarilish vaqtida ob'ekt turini aniqlashni o'rgandi. tushunchalarini tushuntirdik
yakuniy usullar va sinflar. Nihoyat, bobda e'lon qilish va amalga oshirish muhokama qilindi
interfeysi, ehtimol, turli xil sinflar uchun umumiy funktsiyalarni amalga oshirish uchun bir usul sifatida,
ushbu sinflarning ob'ektlarini polimorf tarzda qayta ishlashga imkon beradi.
Endi siz sinflar, ob'ektlar, inkapsulyatsiya, meros, inter-
yuzlar va polimorfizm - ob'ektga yo'naltirilgan dasturlashning eng muhim jihatlari.
Keyingi bobda siz a paytida xatolarni qayta ishlash uchun foydali bo'lgan istisnolar haqida bilib olasiz
dasturning bajarilishi. Istisnolarni qayta ishlash yanada mustahkam dasturlarni ta'minlaydi.

Xulosa
10.1-bo'lim Kirish


• Polimorfizm (396-bet) bizga bir xil so'zlarni taqsimlovchi ob'ektlarni qayta ishlaydigan dasturlarni yozish imkonini beradi.
perclass go'yo ularning hammasi supersinf ob'ektlari; bu dasturlashni soddalashtirishi mumkin.
• Polimorfizm yordamida biz osongina kengaytiriladigan tizimlarni loyihalashimiz va amalga oshirishimiz mumkin. Faqat
dasturning yangi sinflarga moslashish uchun o'zgartirilishi kerak bo'lgan qismlari to'g'ridan-to'g'ri talab qilinadigan qismlardir
ierarxiyaga qo'shadigan yangi sinflar haqida bilim.
10.3-bo'lim Polimorf xatti-harakatni ko'rsatish
• Kompilyator o'zgaruvchi orqali amalga oshirilgan usul chaqiruviga duch kelganda, u usul yoki yo'qligini aniqlaydi.
od o'zgaruvchining sinf turini tekshirish orqali chaqirilishi mumkin. Agar bu sinfda tegishli usul mavjud bo'lsa
deklaratsiya (yoki meros qilib oladi), qo'ng'iroq tuziladi. Amalga oshirish vaqtida ob'ekt turi
o'zgaruvchiga tegishli bo'lgan haqiqiy foydalanish usulini belgilaydi.
10.4-bo'lim Abstrakt sinflar va usullar
• Abstrakt sinflardan (401-bet) ob'ektlarni timsol qilish uchun ishlatib bo'lmaydi, chunki ular to'liq emas.
• Abstrakt sinfning asosiy maqsadi boshqa sinfdan mos keladigan yuqori sinfni taqdim etishdir
sinflar meros qilib olishlari va shu bilan umumiy dizaynni baham ko'rishlari mumkin.
• Ob'ektlarni ibratlash uchun ishlatilishi mumkin bo'lgan sinflar aniq sinflar deb ataladi (402-bet). Ular ta'minlaydi
ular e'lon qilgan har bir usulning amalga oshirilishi (ba'zi ilovalar meros bo'lishi mumkin).
• Dasturchilar ko'pincha mijozni kamaytirish uchun faqat mavhum superklasslardan (402-bet) foydalanadigan mijoz kodini yozadilar.
kodning ma'lum kichik sinf turlariga bog'liqligi.
• Abstrakt sinflar ba'zan ierarxiyaning bir necha darajalarini tashkil qiladi.
• Abstrakt sinf odatda bir yoki bir nechta mavhum usullarni o'z ichiga oladi (402-bet).
• Abstrakt usullar amalga oshirishni ta'minlamaydi.
• Har qanday mavhum usullarni o'z ichiga olgan sinf mavhum sinf sifatida e'lon qilinishi kerak (402-bet). Har biri
aniq kichik sinf supersinfning har bir mavhum usullarini amalga oshirishni ta'minlashi kerak.

Xulosa 437



• Konstruktorlar va statik usullarni mavhum deb e'lon qilib bo'lmaydi.
• Mavhum superklass o'zgaruvchilari dan olingan har qanday aniq sinf ob'ektlariga havolalarni o'z ichiga olishi mumkin
supersinf. Dasturlar odatda bunday o'zgaruvchilardan pastki sinf ob'ektlarini polimorf tarzda manipulyatsiya qilish uchun foydalanadilar.
• Polimorfizm qatlamli dasturiy ta'minot tizimlarini amalga oshirishda ayniqsa samarali.
10.5-bo'lim Case Study: Polimorfizmdan foydalangan holda ish haqi tizimi
• Ierarxiya konstruktori har bir aniq kichik sinfdan tegishli usulni taqdim etishni talab qilishi mumkin.
mavhum usulni supersinfga kiritish orqali to'ldirish.
• Ko'pgina usul chaqiruvlari bajarilayotgan ob'ekt turiga qarab, bajarilish vaqtida hal qilinadi.
qilingan. Bu jarayon dinamik bog'lanish (417-bet) yoki kechikish deb nomlanadi.
• Superklass o'zgaruvchisidan faqat yuqori sinfda e'lon qilingan usullarni chaqirish uchun foydalanish mumkin.
• Operator instanceof (417-bet) ob'ektning ma'lum bir tur bilan is-aloqasi mavjudligini aniqlaydi.
• Java’dagi har bir obyekt o‘z sinfini biladi va unga getClass Object usuli orqali kira oladi
(418-bet), bu Class tipidagi ob'ektni qaytaradi (java.lang paketi).
• is-a munosabati faqat kichik sinf va uning yuqori sinflari o'rtasida amal qiladi, aksincha emas.
10.7-bo'lim yakuniy usullar va sinflar
• Yuqori sinfda yakuniy (419-bet) deb e’lon qilingan usulni quyi sinfda bekor qilib bo‘lmaydi.
• Maxfiy deb e'lon qilingan usullar aniq yakuniy hisoblanadi, chunki ularni quyi sinfda bekor qilib bo'lmaydi.
• Statik deb e'lon qilingan usullar aniq yakuniy hisoblanadi.
• Yakuniy usul deklaratsiyasi hech qachon o'zgarmaydi, shuning uchun barcha kichik sinflar bir xil amalga oshirishdan foydalanadi va
yakuniy usullarga qo'ng'iroqlar kompilyatsiya vaqtida hal qilinadi - bu statik bog'lanish deb nomlanadi (420-bet).
• Kompilyator so'nggi usullarga qo'ng'iroqlarni olib tashlash va ularning oldingi qatorlarini kiritish orqali dasturlarni optimallashtirishi mumkin.
har bir usul-chaqiruv joyida panded kod.
• Yakuniy deb eʼlon qilingan sinfni uzaytirib boʻlmaydi (420-bet).
• Yakuniy sinfdagi barcha usullar aniq yakuniy hisoblanadi.
10.9-bo'lim Interfeyslarni yaratish va ulardan foydalanish
• Interfeys (421-bet) qanday operatsiyalarga ruxsat berilishini belgilaydi, lekin ular qanday bajarilishini emas.
• Java interfeysi ob'ektda chaqirilishi mumkin bo'lgan usullar to'plamini tavsiflaydi.
• Interfeys deklaratsiyasi interfeys kalit so'zidan boshlanadi (421-bet).
• Barcha interfeys a'zolari ochiq bo'lishi kerak va interfeyslar hech qanday amalga oshirish talablarini belgilamasligi mumkin.
aniq usul deklaratsiyasi va misol o'zgaruvchilari kabi quyruqlar.
• Interfeysda e'lon qilingan barcha usullar bevosita ochiq mavhum usullar va barcha maydonlar
bilvosita ommaviy, statik va yakuniy.
• Interfeysdan foydalanish uchun konkret sinf u interfeysni amalga oshirishini (421-bet) va
interfeys deklaratsiyasida ko'rsatilgan imzo bilan har bir interfeys usulini e'lon qilishi kerak. A
interfeysning barcha usullarini amalga oshirmaydigan sinf mavhum deb e'lon qilinishi kerak.
• Interfeysni amalga oshirish kompilyator bilan shartnoma imzolashga o‘xshaydi, unda “Men e’lon qilaman.
interfeys tomonidan belgilangan barcha usullar yoki men sinfimni abstrakt deb e'lon qilaman.
• Interfeys odatda bir-biriga bog'liq bo'lmagan (ya'ni, bir-biriga bog'liq bo'lmagan) sinflar umumiy usullarni baham ko'rishi kerak bo'lganda qo'llaniladi.
nisbatlar va konstantalar. Bu bir-biriga bog'liq bo'lmagan sinflar ob'ektlarini polimorf tarzda qayta ishlashga imkon beradi - ob-
bir xil interfeysni amalga oshiradigan sinflar bir xil usul chaqiruvlariga javob berishi mumkin.
• Istalgan funksiyani tavsiflovchi interfeys yaratishingiz, keyin interfeysni amalga oshirishingiz mumkin
bu funksiyani talab qiladigan har qanday sinflarda.

438 10-bob Ob'ektga yo'naltirilgan dasturlash: Polimorfizm va interfeyslar



• Interfeys odatda hech qanday standart amalga oshirilmaganda mavhum sinf o'rniga ishlatiladi
meros qilib olish - ya'ni hech qanday misol o'zgaruvchilari va standart usullarni amalga oshirish yo'q.
• Ommaviy abstrakt sinflar singari, interfeyslar ham odatda ommaviy tiplardir, shuning uchun ular odatda e'lon qilinadi
interfeysi va .java fayl nomi kengaytmasi bilan bir xil nomdagi fayllarda.
• Java quyi sinflarga bir nechta supersinflarni meros qilib olishga ruxsat bermaydi, lekin u sinfga ruxsat beradi
superklassdan meros olish va bir nechta interfeyslarni amalga oshirish.
• Bir nechta interfeyslarni amalga oshiradigan sinfning barcha ob'ektlari har bir im bilan is-aloqa-
to'ldirilgan interfeys turi.
• Interfeys doimiylarni e'lon qilishi mumkin. Konstantalar ochiq, statik va yakuniydir.
10.10-bo'lim Java SE 8 interfeysini yaxshilash
• Java SE 8 da interfeys standart usullarni e'lon qilishi mumkin, ya'ni beton bilan umumiy usullar
operatsiya qanday bajarilishi kerakligini ko'rsatadigan ilovalar.
• Sinf interfeysni amalga oshirganda, sinf interfeysning standart aniq imple-
agar u ularni bekor qilmasa, eslatib o'tadi.
• Interfeysda standart usulni e'lon qilish uchun siz shunchaki default kalit so'zini dan oldin qo'yishingiz kerak
usulning qaytish turi va to'liq usul tanasini taqdim eting.
• Mavjud interfeysni standart usullar bilan yaxshilaganingizda - amalga oshiradigan har qanday sinflar-
ed asl interfeys buzilmaydi - u oddiy usulni qo'llashni oladi.
• Standart usullar bilan siz interfeyslarda umumiy usullarni amalga oshirishni e'lon qilishingiz mumkin (to'g'rirog'i
mavhum sinflarga qaraganda), bu sizning darslaringizni loyihalashda ko'proq moslashuvchanlikni beradi.
• Java SE 8 dan boshlab interfeyslar endi umumiy statik usullarni o'z ichiga olishi mumkin.
• Java SE 8 dan boshlab faqat bitta usulni o'z ichiga olgan har qanday interfeys funksional interfeys sifatida tanilgan.
Java API-larida bunday interfeyslar juda ko'p.
• Funktsional interfeyslar Java SE 8 ning yangi lambda imkoniyatlari bilan keng qo'llaniladi. Ko'rib turganingizdek,
lambdalar anonim usullarni yaratish uchun qisqartma yozuvni taqdim etadi.
O'z-o'zini tekshirish mashqlari
10.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Agar sinfda kamida bitta mavhum usul bo'lsa, u (n) sinfdir.
b) Ob'ektlarni yaratish mumkin bo'lgan sinflar sinflar deyiladi.
c) yuqori sinf o'zgaruvchisidan foydalanishni o'z ichiga oladi.
sinf ob'ektlari, bu sizga "umumiy dasturlash" imkonini beradi.
d) interfeys usullari bo'lmagan va amalga oshirishni ta'minlamaydigan usullar kerak
kalit so'z yordamida e'lon qilinadi.
e) Superklass o'zgaruvchisida saqlangan murojaatni pastki sinf turiga o'tkazish deyiladi.
10.2 Quyidagi gaplarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Abstrakt sinfdagi barcha usullar mavhum usullar sifatida e'lon qilinishi kerak.
b) subklass o'zgaruvchisi orqali faqat kichik sinf usulini chaqirishga yo'l qo'yilmaydi.
c) Agar yuqori sinf mavhum usulni e'lon qilsa, pastki sinf bu usulni amalga oshirishi kerak.
d) Interfeysni amalga oshiradigan sinf ob'ekti uning ob'ekti sifatida qaralishi mumkin
interfeys turi.
10.3 (Java SE 8 interfeyslari) Quyidagi bayonotlarning har biridagi bo'sh joylarni to'ldiring:
a) Java SE 8 da interfeys e'lon qilishi mumkin, ya'ni beton bilan umumiy usullar
operatsiya qanday bajarilishi kerakligini ko'rsatadigan ilovalar.
b) Java SE 8 dan boshlab interfeyslar endi yordamchi usullarni o'z ichiga olishi mumkin.
c) Java SE 8 dan boshlab faqat bitta usulni o'z ichiga olgan har qanday interfeys a(n) deb nomlanadi.

O'z-o'zini tekshirish mashqlariga javoblar 439



O'z-o'zini tekshirish mashqlariga javoblar
10.1 a) referat. b) beton. c) polimorfizm. d) abstrakt. e) pastga tushirish.
10.2 a) noto'g'ri. Mavhum sinf o'z ichiga amalga oshirish usullari va mavhum metodlarni o'z ichiga olishi mumkin.
ehtimol. b) yolg'on. Yuqori sinf o'zgaruvchisi bilan faqat pastki sinf usulini chaqirishga urinish mumkin emas.
c) yolg'on. Usulni faqat aniq kichik sinf amalga oshirishi kerak. d) To'g'ri.
10.3 a) standart usullar. b) statik. v) funksional interfeys.
Mashqlar
10.4 Qanday qilib polimorfizm sizga “umumiy” emas, balki “umumiy” dasturlash imkonini beradi.
sifik”? “Umumiy” dasturlashning asosiy afzalliklarini muhokama qiling.
10.5 Abstrakt usullar nima? Mavhum usul qanday sharoitlarda bo'lishini tasvirlab bering
mos bo'lsin.
10.6 Polimorfizm kengayishni qanday ta'minlaydi?
10.7 Variantlarga yuqori sinf va pastki sinf havolalarini belgilashning uchta to'g'ri usulini muhokama qiling.
supersinf va kichik sinf turlarining qobiliyatlari.
10.8 Abstrakt sinflar va interfeyslarni solishtiring va taqqoslang. Nima uchun mavhum sinfdan foydalanasiz?
Nima uchun interfeysdan foydalanasiz?
10.9 (Java SE 8 interfeyslari) Standart usullar sizga yangi usullarni qo'shishga qanday imkon berishini tushuntiring.
asl interfeysni amalga oshirgan sinflarni buzmasdan mavjud interfeys.
10.10 (Java SE 8 Interfaces) Funktsional interfeys nima?
10.11 (Java SE 8 interfeyslari) Nima uchun interfeyslarga statik usullarni qo'shish foydali?
10.12 (Ish haqi tizimini o'zgartirish) Shaklning ish haqi tizimini o'zgartirish. 10.4–10.9 pri-
vate instance o'zgaruvchan tug'ilgan sana sinfda Xodim. 8.7-rasmdagi sana sinfidan foydalaning.
xodimning tug'ilgan kuni. Sana sinfiga olish usullarini qo'shing. Ish haqi oyiga bir marta qayta ishlanadi deb hisoblang.
Turli xodimlar ob'ektlariga havolalarni saqlash uchun Xodimlar o'zgaruvchilari qatorini yarating. Bir halqa ichida,
Har bir Xodim uchun ish haqini hisoblang (polimorf) va shaxsning ish haqiga $100,00 bonus qo'shing.
agar joriy oy Xodimning tug'ilgan kuni sodir bo'lgan oy bo'lsa, ish haqi miqdori.
10.13 (Loyiha: Shakl ierarxiyasi) 9.3-rasmda ko'rsatilgan Shakl ierarxiyasini amalga oshiring. Har ikki -
DimensionalShape ikki o'lchovli maydonni hisoblash uchun getArea usulini o'z ichiga olishi kerak
shakli. Har bir TheDimensionalShape ni hisoblash uchun getArea va getVolume usullariga ega bo'lishi kerak
uch o'lchamli shaklning mos ravishda sirt maydoni va hajmi. foydalanadigan dastur yarating
ierarxiyadagi har bir aniq sinf ob'ektlariga Shakl havolalari massivi. Dastur kerak
har bir massiv elementi murojaat qiladigan obyektning matn tavsifini chop eting. Bundan tashqari, bu pro-
massivdagi barcha shakllarni o'chirib qo'yadi, har bir shakl TwoDimensionalShape yoki
Uch o'lchovli shakl. Agar bu TwoDimensionalShape bo'lsa, uning maydonini ko'rsating. Agar bu ThreeDimension bo'lsa -
alShape, uning maydoni va hajmini ko'rsating.
10.14 (Ish haqi tizimini o'zgartirish) Shaklning ish haqi tizimini o'zgartirish. 10.4–10.9 oʻz ichiga oladi
Qo'shimcha Xodimlar kichik sinfi PieceWorker, bu ish haqi miqdoriga asoslangan xodimni ifodalaydi.
ishlab chiqarilgan mahsulotlar soni. Class PieceWorker shaxsiy misolni o'z ichiga olishi kerak
o'zgaruvchan ish haqi (xodimning ish haqini bir dona uchun saqlash uchun) va dona (donlar sonini saqlash uchun)
ishlab chiqarilgan). PieceWorker sinfida daromad olish usullarini aniq amalga oshirishni ta'minlang.
ishlab chiqarilgan dona sonini ish haqiga ko'paytirish orqali xodimning daromadini hisoblab chiqadi
parcha. Har bir aniq sinf ob'ektlariga havolalarni saqlash uchun xodimlarning o'zgaruvchilari qatorini yarating
yangi xodimlar ierarxiyasi. Har bir Xodim uchun uning String vakili va daromadlarini ko'rsating.

440 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar



10.15 (To'lanadigan hisoblar tizimini o'zgartirish) Ushbu mashqda biz kreditorlik qarzlarini o'zgartiramiz.
shakllarni qo'llash. 10.11–10.15 ish haqi to'lash dasturining to'liq funksiyalarini o'z ichiga oladi
Anjir. 10,4–10,9. Ilova hali ham ikkita Invoice ob'ektini qayta ishlashi kerak, ammo hozir ishlov berishi kerak
to'rtta Xodimlarning har bir kichik sinfining bitta ob'ekti. Agar hozirda qayta ishlanayotgan ob'ekt Base-
PlusCommissionEmployee, ilova BasePlusCommissionEmployee bazasini oshirishi kerak
ish haqi 10% ga. Nihoyat, dastur har bir ob'ekt uchun to'lov miqdorini chiqarishi kerak. Kom-
Yangi dastur yaratish uchun quyidagi amallarni bajaring:
a) Joylashtirish uchun HourlyEmployee (10.6-rasm) va CommissionEmployee (10.7-rasm) sinflarini o'zgartiring.
ularni To'lov ierarxiyasida Xodim versiyasining pastki sinflari sifatida (10.13-rasm)
To'lovni amalga oshiradi. [Maslahat: GetPaymentAmount usulidagi daromad nomini o'zgartiring
Har bir kichik sinfda sinf to'lanadigan interfeys bilan meros qilib olingan shartnomani qondirishi uchun.]
b) BasePlusCommissionEmployee sinfini (10.8-rasm) versiyani kengaytiradigan tarzda o'zgartiring.
sinf komissiyasining xodimi (a) qismida yaratilgan.
c) PayableInterfaceTest-ni (10.15-rasm) ikkita Invoysni polimorf tarzda qayta ishlash uchun o'zgartiring,
bitta maoshli xodim, bitta soatlik xodim, bitta komissiya xodimi va bitta tayanch-
PlusKomissiya xodimi. Avval har bir To'lanadigan ob'ektning String tasvirini chiqaring.
Keyinchalik, agar ob'ekt BasePlusCommissionEmployee bo'lsa, uning asosiy ish haqini 10% ga oshiring. Fi-
har bir To'lanadigan ob'ekt uchun to'lov miqdorini chiqaring.
10.16 (To'lov tizimidagi o'zgarishlar) To'lov funksiyasini kiritish mumkin.
roll ilovasi (10.4-10.9-rasmlar) kreditorlik qarzlari ilovasida o'zgartirmasdan Xodim
kichik sinflar: SalariedEmployee, HourlyEmployee, CommissionEmployee yoki BasePlusCommission-
Xodim. Buni amalga oshirish uchun siz "Xodim" sinfini (10.4-rasm) "To'lanadigan to'lov" interfeysini amalga oshirish uchun o'zgartirishingiz mumkin va
usul daromadlarini chaqirish uchun getPaymentAmount usulini e'lon qiling. GetPaymentAmount usuli
keyin Xodimlar ierarxiyasidagi kichik sinflar tomonidan meros qilib olinadi. getPaymentAmount so'ralganda
ma'lum bir kichik sinf ob'ekti, buning uchun tegishli daromad usulini polimorf tarzda chaqiradi
kichik sinf. 10.15-mashqni ish haqi to'lash ilovasidan asl Xodimlar ierarxiyasidan foydalanib qayta bajaring.
Shakllarning kationi. 10,4–10,9. Ushbu mashqda tavsiflanganidek Xodim sinfini o'zgartiring va hech birini o'zgartirmang
sinf Xodimning kichik sinflari.
Farq qilish
10.17 (CarbonFootprint Interface: Polimorfizm) Ushbu bobda bilib olganingizdek, interfeyslardan foydalanish
ter, siz turli xil sinflar uchun o'xshash xatti-harakatlarni belgilashingiz mumkin. Hukumatlar va kompaniyalar
butun dunyoda uglerod izlari (uglerodning yillik ajralishi) bilan tobora ko'proq tashvishlanmoqda
atmosferaga dioksid) issiqlik uchun har xil turdagi yoqilg'ilarni yoqadigan binolardan, yonayotgan transport vositalaridan
energiya uchun yoqilg'i va boshqalar. Ko'pgina olimlar bu hodisa uchun issiqxona gazlarini ayblashadi
global isish deb ataladi. Meros bilan bog'liq bo'lmagan uchta kichik sinfni yarating - Bino, Avtomobil sinflari
va velosiped. Har bir sinfga unda mavjud bo'lmagan noyob atributlar va xatti-harakatlarni bering
boshqa sinflar bilan umumiy. getCarbonFootprint bilan CarbonFootprint interfeysini yozing
usul. Har bir sinfingiz o'sha interfeysni amalga oshirsin, shunda uning getCarbonFootprint usuli mavjud
ushbu sinf uchun tegishli uglerod izini hisoblab chiqadi (qanday qilib tushuntirilgan bir nechta veb-saytlarni ko'rib chiqing
uglerod izlarini hisoblash uchun). Uchta sinfning har bir ob'ektini yaratadigan dastur yozing,
ArrayList-ga ushbu ob'ektlarga havolalarni joylashtiradi, so'ngra Array-da takrorlanadi.
Har bir ob'ektning getCarbonFootprint usulini polimorf tarzda chaqiruvchi ro'yxat. Har bir ob'ekt uchun chop eting
ba'zi aniqlovchi ma'lumotlar va ob'ektning uglerod izi.

11

Istisno bilan ishlash:


Chuqurroq qarash

A qabul qilish sog'lom fikrdir


usul va sinab ko'ring. Muvaffaqiyatsiz bo'lsa,
ochiqchasiga tan oling va harakat qilib ko'ring
boshqa. Lekin, eng muhimi, harakat qilib ko'ring
nimadur.
- Franklin Delano Ruzvelt
O! tashlang
uning yomon qismi,
Va tozaroq yashang
ikkinchi yarmi bilan.
- Uilyam Shekspir
Agar ular yugurishsa-yu, yo'q
qaerga ketayotganiga qarang
dan chiqishim kerak
bir joyda va ularni ushlang.
- Jerom Devid Salinger

Oh maqsadlar


Ushbu bobda siz:
■ Qanday istisnolar ekanligini bilib oling
va ular qanday muomala qilinadi.
■ Istisnodan qachon foydalanishni bilib oling
ishlov berish.
■ Chegaralash uchun sinash bloklaridan foydalaning
kod qaysi istisnolardan iborat
yuzaga kelishi mumkin.
■ a ko'rsatish uchun throw dan foydalaning
muammo.
■ Belgilash uchun ushlash bloklaridan foydalaning
istisno ishlov beruvchilar.
■ Buning uchun finally blokidan foydalaning
resurslarni chiqarish.
■ Istisnoni tushuning
sinf ierarxiyasi.
■ Foydalanuvchi tomonidan belgilangan yaratish
istisnolar.

442 11-bob Istisnolardan foydalanish: chuqurroq qarash

11.1 Kirish
7-bobdan ma'lumki, istisno bu jarayon davomida yuzaga keladigan muammoning belgisidir
dasturning bajarilishi. Istisnolarni qayta ishlash sizga qayta ishlaydigan ilovalarni yaratishga imkon beradi.
istisnolarni hal qilish (yoki ishlov berish). Ko'pgina hollarda, istisno bilan ishlash dasturga imkon beradi
hech qanday muammoga duch kelmagandek bajarishda davom eting. Unda keltirilgan xususiyatlar
bo'lim sizga muammolarni hal qila oladigan mustahkam va xatolarga chidamli dasturlarni yozishga yordam beradi
bajarishni davom ettiring yoki chiroyli tarzda tugatish. Java istisnolaridan foydalanish qisman ga asoslanadi
Endryu Koenig va Bjarne Stroustrupning ishi.1
Birinchidan, biz istisno bilan ishlash orqali asosiy istisno usullarini ko'rsatamiz
Bu usul butun sonni nolga bo'lishga harakat qilganda sodir bo'ladi. Keyin biz sev-
Java-ning istisnoli ishlov berish sinflari ierarxiyasining yuqori qismidagi eral sinflar. Ko'rib turganingizdek, faqat darslar
Throwable (java.lang paketi) to'g'ridan-to'g'ri yoki bilvosita foydalanish mumkin, bundan mustasno
tion ishlov berish. Keyin biz zanjirli istisnolardan qanday foydalanishni ko'rsatamiz - siz usulni chaqirganingizda
bu istisnoni bildirsa, siz boshqa istisnoni tashlab, asl nusxasini zanjirlashingiz mumkin
yangisiga. Bu asl nusxaga ilovaga xos ma'lumotlarni qo'shish imkonini beradi
istisno. Keyinchalik, biz old shartlar va keyingi shartlarni kiritamiz, ular qachon to'g'ri bo'lishi kerak
Sizning usullaringiz mos ravishda chaqiriladi va ular qaytib kelganda. Keyin biz da'volarni taqdim etamiz,
kodingizni disk raskadrovka qilishga yordam berish uchun ishlab chiqish vaqtida foydalanishingiz mumkin. Biz ikkitasini ham muhokama qilamiz
Java SE 7 da joriy qilingan istisnolarni qayta ishlash xususiyatlari - bir nechta istisnolarni ushlaydi
Bitta catch ishlov beruvchisi va yangi resurslarni sinab ko'rish bayonoti avtomatik ravishda
resurs sinab ko'rish blokida ishlatilganidan keyin chiqaradi.
Ushbu bobda istisnolar bilan ishlash tushunchalariga e'tibor qaratilgan va bir nechtasini taqdim etadi
turli xususiyatlarni ko'rsatadigan mexanik misollar. Keyingi boblarda ko'rganingizdek,
Ko'pgina Java API usullari bizning kodimizda ishlatadigan istisnolarni keltirib chiqaradi. 11.1-rasmda ko'rsatilgan
siz allaqachon ko'rgan istisno turlarining ba'zilari va boshqalar haqida bilib olasiz.

11.1 Kirish


11.2 Misol: nolga bo'lmasdan
Istisno bilan ishlash
11.3 Misol: Ishlov berish
Arifmetik istisnolar va
InputMismatchExceptions
11.4 Istisnolardan foydalanish qachon
11.5 Java istisno ierarxiyasi
11.6 Nihoyat Bloklash
11.7 Stackni ochish va olish
Istisno ob'ektdan ma'lumot

11.8 Zanjirlangan istisnolar


11.9 Yangi istisno turlarini e'lon qilish
11.10 Old shartlar va keyingi shartlar
11.11 Tasdiqlashlar
11.12 Resurslar bilan sinab ko'rish: Avtomatik
Resurslarni taqsimlash
11.13 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar

1. A. Koenig va B. Stroustrup, “C++ uchun istisnolardan foydalanish (qayta ko'rib chiqilgan),” Usenix C++ materiallari.
Konferentsiya, 149–176-betlar, San-Fransisko, 1990 yil aprel.

11.2 Misol: Nolga bo'lish istisnosiz ishlov berish 443

11.2 Misol: Istisnosiz nolga bo'linadi
Ishlov berish
Avval biz foydalanmayotgan dasturda xatolik yuzaga kelganda nima bo'lishini ko'rsatamiz
istisno bilan ishlash. 11.2-rasm foydalanuvchidan ikkita butun sonni taklif qiladi va ularni uzatadi
butun sonni hisoblab chiqadigan va int natijasini beradigan usul bo'limi. Bunda
Misol uchun, siz istisnolar bir usul bilan tashlanganligini (ya'ni, istisno sodir bo'lishini) ko'rasiz
u muammoni aniqlaganda va uni hal qila olmaganda.

Foydalanilgan istisnolar namunasi

7-bob ArrayIndexOutOfBoundsException
8–10-boblar IllegalArgumentException
11-bob Arifmetik istisno, InputMismatchException
15-bob SecurityException, FileNotFoundException, IOException,
ClassNotFoundException, IllegalStateException,
FormatterClosedException, NoSuchElementException
16-bob ClassCastException, UnsupportedOperationException,
NullPointerException, maxsus istisno turlari
20-bob ClassCastException, maxsus istisno turlari
21-bob IllegalArgumentException, maxsus istisno turlari
23-bob InterruptedException, IllegalMonitorStateException,
ExecutionException, CancellationException
28-bob Noto'g'ri shakllanganURLException, EOFException, SocketException,
InterruptedException, UnknownHostException
24-bob SQLException, IllegalStateException, PatternSyntaxException
31-bob SQLException

11.1-rasm | Ushbu kitob davomida ko'rishingiz mumkin bo'lgan har xil istisno turlari

1 // 11.2-rasm: DivideByZeroNoExceptionHandling.java
2 // Butun sonlarni istisnosiz bo'lish.
3 import java.util.Scanner;
4
5 ommaviy sinf DivideByZeroNoExceptionHandling
6 {
7 // nolga bo'linish sodir bo'lganda istisno qilishni ko'rsatadi
8 umumiy statik int bo'limi (int hisoblagich, int maxraji)
9 {
10
11 }
12
13 ta umumiy statik bekor asosiy(String[] args)
14 {
15 Skaner skaneri = yangi Skaner(System.in);

11.2-rasm | Butun sonlarni istisnosiz bo'lish. (2-qismning 1-qismi.)

hisoblagich / maxrajni qaytarish; // nolga bo'lish mumkin

444 11-bob Istisnolardan foydalanish: chuqurroq qarash

Stack Trace
11.2-rasmdagi birinchi namunaviy ijro muvaffaqiyatli bo'linishni ko'rsatadi. Ikkinchi ijroda -
tion, foydalanuvchi maxraj sifatida 0 qiymatini kiritadi. Bir nechta ma'lumotlar yo'q
bu noto'g'ri kiritishga javob sifatida o'ynadi. Ushbu ma'lumot stek izi sifatida tanilgan, qaysi
tavsiflovchida istisno nomini (java.lang.ArithmeticException) o'z ichiga oladi
yuzaga kelgan muammoni va usul-chaqiriqlar to'plamini ko'rsatadigan xabar (ya'ni, qo'ng'iroq
zanjir) sodir bo'lgan paytda. Stack izi olib kelgan ijro yo'lini o'z ichiga oladi
usul bo'yicha istisno usuli. Bu dasturni disk raskadrovka qilishga yordam beradi.
ArithmeticException uchun Stack Trace
Birinchi qator ArithmeticException sodir bo'lganligini bildiradi. Ismdan keyin matn
Istisnoning ("/ nolga") bu istisno quyidagi sabablar natijasida yuzaga kelganligini bildiradi.
nolga bo'lish vasvasasi. Java butun son arifmetikasida nolga bo'linishga ruxsat bermaydi. Qachon
Bu sodir bo'lganda, Java ArithmeticException ni chiqaradi. Arifmetik istisnolar quyidagilardan kelib chiqishi mumkin

16
17 System.out.print("Iltimos, butun sonni kiriting: ");


18 int hisoblagichi = scanner.nextInt();
19 System.out.print("Iltimos, butun sonni kiriting: ");
20
21
22 int natija = qism(hisob, maxraj);
23 System.out.printf(
24 "% nNatija: %d / %d = %d%n", sanoqchi, maxraj, natija);
25 }
26 } // tugatish sinfi DivideByZeroNoExceptionHandling

Iltimos, butun sonni kiriting: 100


Butun sonni kiriting: 7
Natija: 100/7 = 14

Iltimos, butun sonni kiriting: 100


Iltimos, butun sonni kiriting: 0
"Asosiy" java.lang.ArithmeticException mavzuidagi istisno: / nolga
DivideByZeroNoExceptionHandling.quotient(
DivideByZeroNoExceptionHandling.java:10)
DivideByZeroNoExceptionHandling.main(
DivideByZeroNoExceptionHandling.java:22)

Iltimos, butun sonni kiriting: 100


Iltimos, butun sonni kiriting: salom
"Asosiy" java.util.InputMismatchException mavzusidagi istisno
java.util.Scanner.throwFor (Noma'lum manba) manzilida
java.util.Scanner.next (Noma'lum manba)
java.util.Scanner.nextInt manzilida (noma'lum manba)
java.util.Scanner.nextInt manzilida (noma'lum manba)
DivideByZeroNoExceptionHandling.main(
DivideByZeroNoExceptionHandling.java:20)

11.2-rasm | Butun sonlarni istisnosiz bo'lish. (2-qismning 2-qismi.)

int maxraji = scanner.nextInt();

11.3 Arifmetik istisnolar va InputMismatchExceptions 445



bir qator turli xil muammolar, shuning uchun qo'shimcha ma'lumotlar ("/ nolga") aniqroq ma'lumotlarni beradi.
shakllanishi. Java suzuvchi nuqta qiymatlari bilan nolga bo'linishga ruxsat beradi. Bunday hisoblash
natijada musbat yoki manfiy cheksiz qiymat paydo bo'ladi, bu Java-da suzuvchi sifatida ifodalanadi.
nuqta qiymati (lekin Infinity yoki -Infinity qatori sifatida ko'rsatiladi). Agar 0,0 0,0 ga bo'lingan bo'lsa,
natija NaN (raqam emas), u Java-da suzuvchi nuqta qiymati sifatida ham ifodalanadi
(lekin NaN sifatida ko'rsatiladi). Agar suzuvchi nuqta qiymatini NaN bilan solishtirish kerak bo'lsa, usuldan foydalaning
isNaN Float (float qiymatlari uchun) yoki Double sinfi (ikkilamchi qiymatlar uchun). Sinflar
Float va Double java.lang paketida joylashgan.
Stack izining oxirgi qatoridan boshlab biz istisno aniqlanganligini ko'ramiz
Asosiy usulning 22-qatori. Stack trasening har bir satrida sinf nomi va usuli mavjud
(masalan, DivideByZeroNoExceptionHandling.main) keyin fayl nomi va qatori
raqam (masalan, DivideByZeroNoExceptionHandling.java:22). Yig'ilgan izni yuqoriga ko'chirish,
istisno 10-satrda, usul bo'limida sodir bo'lishini ko'ramiz. Qo'ng'iroqning yuqori qatori
zanjir otish nuqtasini - istisno sodir bo'lgan dastlabki nuqtani ko'rsatadi. The
Ushbu istisnoning otish nuqtasi usul bo'limining 10-qatorida.
InputMismatchException uchun stack Trace
Uchinchi bajarilishda foydalanuvchi maxraj sifatida “salom” qatorini kiritadi. Yana e'tibor bering
stek izi ko'rsatiladi. Bu bizga InputMismatchException-da ok-
curred (java.util paketi). Raqamli qiymatlarni kiritadigan oldingi misollarimiz buni taxmin qilgan
foydalanuvchi to'g'ri tamsayı qiymatini kiritadi. Biroq, foydalanuvchilar ba'zan xato va
to'liq bo'lmagan qiymatlarni kiriting. Skaner usulida InputMismatchException paydo bo'ladi
nextInt to'g'ri butun sonni bildirmaydigan qatorni oladi. ning oxiridan boshlab
stek izi, biz istisno asosiy usulning 20-qatorida aniqlanganligini ko'ramiz. Harakat
stek izini yuqoriga qarab, istisno keyingiInt usulida sodir bo'lganligini ko'ramiz. Bunga e'tibor bering
fayl nomining o'rni va qator raqami, bizga Noma'lum manba matni taqdim etiladi. Bu
fayl nomi va satr raqamini ta'minlaydigan disk raskadrovka belgilarini anglatadi.
JVM uchun ushbu uslub sinfi uchun shakllanish mavjud emas edi - bu odatda shunday
Java API sinflari uchun. Ko'pgina IDElar Java API manba kodiga kirish huquqiga ega
fayl nomlari va satr raqamlarini stek izlarida ko'rsatish.
Dasturni tugatish
11.2-rasmdagi namunaviy bajarilishlarda istisnolar yuzaga kelganda va stek izlari ko'rsatilganda,
dastur ham chiqadi. Bu Java-da har doim ham sodir bo'lmaydi. Ba'zida dastur quyidagilarga ta'sir qilishi mumkin:
istisno sodir bo'lgan va stek izi chop etilgan bo'lsa ham tinue. Bunday holda
hollarda, ilova kutilmagan natijalarga olib kelishi mumkin. Masalan, grafik foydalanuvchi -
Terfas (GUI) ilovasi ko'pincha ishlashni davom ettiradi. 11.2-rasmda har ikkala turdagi istisno-
asosiy usulda aniqlangan. Keyingi misolda biz ularni qanday hal qilishni ko'rib chiqamiz
dasturning normal tugallanishini yoqishingiz uchun istisnolar.
11.3 Misol: Arifmetik istisnolar bilan ishlash va
InputMismatchExceptions
11.2-rasmga asoslangan 11.3-rasmdagi ilova pro-
paydo bo'ladigan har qanday ArithmeticExceptions va InputMistmatchExceptions. Ilova -
tion hali ham foydalanuvchidan ikkita butun sonni so'raydi va ularni usul bo'limiga o'tkazadi, bu esa
qismni hisoblaydi va int natijasini qaytaradi. Ilovaning ushbu versiyasida sobiq

446 11-bob Istisnolardan foydalanish: chuqurroq qarash

Agar foydalanuvchi xato qilsa, dastur ushlaydi va boshqaradi (ya'ni,
bilan shug'ullanadi) istisno - bu holda foydalanuvchiga kirishni qayta kiritish imkonini beradi.

1 // 11.3-rasm: DivideByZeroWithExceptionHandling.java


2 // ArithmeticExceptions va InputMismatchExceptions bilan ishlash.
3
4 import java.util.Scanner;
5
6 ommaviy sinf DivideByZeroWithExceptionHandling
7 {
8 // nolga bo'linish sodir bo'lganda istisno qilishni ko'rsatadi
9 umumiy statik int bo'limi (int hisoblagich, int maxraji)
10
11 {
12 qaytaruvchi pay / maxraj; // nolga bo'lish mumkin
13 }
14
15 ta umumiy statik bekor asosiy (String [] args)
16 {
17 Skaner skaneri = yangi Skaner(System.in);
18 mantiqiy davomLoop = rost; // ko'proq kiritish kerakligini aniqlaydi
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 }
50 } // tugatish sinfi DivideByZeroWithExceptionHandling
11.3-rasm | ArithmeticExceptions va InputMismatchExceptions bilan ishlash. (2-qismning 1-qismi.)

import java.util.InputMismatchException;

ArithmeticException-ni tashlaydi

qil
{


harakat qilib ko'ring // ikkita raqamni o'qing va qismni hisoblang
{
System.out.print("Iltimos, butun sonni kiriting: ");
int hisoblagichi = scanner.nextInt();
System.out.print("Iltimos, butun sonni kiriting: ");
int maxraji = scanner.nextInt();
int natija = bo'lim (hisoblagich, maxraj);
System.out.printf("%nNatija: %d / %d = %d%n", numerator,
maxraj, natija);
continueLoop = noto'g'ri; // kiritildi; aylanishni tugatish
}
catch (InputMismatchException inputMismatchException)
{
System.err.printf("%nException: %s%n",
inputMismatchException);
scanner.nextLine(); // foydalanuvchi qayta urinib ko'rishi uchun kiritilgan ma'lumotlarni bekor qiling
System.out.printf(
"Siz butun sonlarni kiritishingiz kerak. Qayta urinib ko'ring.%n%n");
}
catch (ArithmeticException arithmeticException)
{
System.err.printf("%nException: %s%n", arifmetikException);
System.out.printf(
"Nol yaroqsiz maxraj. Iltimos, qayta urinib ko'ring.%n%n");
}
} while (continueLoop);

11.3 Arifmetik istisnolar va InputMismatchExceptions 447

11.3-rasmdagi birinchi namunaviy ijro hech qanday muammoga duch kelmaydi. In
ikkinchi bajarilishda foydalanuvchi nol maxrajni kiritadi va ArithmeticException-dan tashqari-
tion yuzaga keladi. Uchinchi bajarilishda foydalanuvchi maxraj sifatida "salom" qatorini kiritadi,
va InputMismatchException paydo bo'ladi. Har bir istisno uchun foydalanuvchiga xabar beriladi
xato va qayta urinib ko'rish so'raladi, keyin ikkita yangi tamsayı kiritish so'raladi. Har bir namunadagi exe-
Agar dastur tugagunga qadar muvaffaqiyatli ishlaydi.
Class InputMismatchException 3 qatorga import qilingan. Class ArithmeticException
import qilish shart emas, chunki u java.lang paketida. 18-qator hosil qiladi
mantiqiy o'zgaruvchi davomLoop, agar foydalanuvchi hali to'g'ri kiritishni kiritmagan bo'lsa, bu to'g'ri bo'ladi.
20-48 qatorlar to'g'ri kiritilmaguncha foydalanuvchilardan qayta-qayta kiritishni so'raydi.
Kodni sinash blokiga qo'shish
22-33 qatorlar istisnoga olib kelishi mumkin bo'lgan kodni o'z ichiga olgan sinash blokini o'z ichiga oladi
va agar istisno sodir bo'lsa, bajarilmasligi kerak bo'lgan kod (ya'ni, istisno sodir bo'lsa,
sinash blokidagi qolgan kod o'tkazib yuboriladi). Sinab ko'rish bloki kalit so'zdan iborat
keyin jingalak qavslar ichiga olingan kod blokini ko'ring. [Izoh: "sinab ko'rish bloki" atamasi
ba'zan faqat try kalit so'zidan keyin keladigan kod blokiga ishora qiladi (shu jumladan
kalit so'zning o'zini sinab ko'ring). Oddiylik uchun biz blokga murojaat qilish uchun "blokni sinab ko'rish" atamasidan foydalanamiz

Iltimos, butun sonni kiriting: 100


Butun sonni kiriting: 7

Natija: 100/7 = 14

Iltimos, butun sonni kiriting: 100
Iltimos, butun sonni kiriting: 0

Istisno: java.lang.ArithmeticException: / nolga


Nol yaroqsiz maxrajdir. Iltimos, yana bir bor urinib ko'ring.

Iltimos, butun sonni kiriting: 100


Butun sonni kiriting: 7

Natija: 100/7 = 14

Iltimos, butun sonni kiriting: 100
Iltimos, butun sonni kiriting: salom

Istisno: java.util.InputMismatchException


Butun sonlarni kiritishingiz kerak. Iltimos, yana bir bor urinib ko'ring.

Iltimos, butun sonni kiriting: 100


Butun sonni kiriting: 7

Natija: 100/7 = 14

11.3-rasm | ArithmeticExceptions va InputMismatchExceptions bilan ishlash. (2-qismning 2-qismi.)

448 11-bob Istisnolardan foydalanish: chuqurroq qarash

try kalit so'zidan, shuningdek try kalit so'zidan keyin keladigan kod.] O'qiladigan iboralar
klaviaturadagi butun sonlar (25 va 27-qatorlar) har biri intni o'qish uchun nextInt usulidan foydalanadi.
qiymat. KeyingiInt usuli, agar o'qilgan qiymat a bo'lmasa, InputMismatchException ni chiqaradi
butun son.
ArithmeticExceptionga olib kelishi mumkin bo'lgan bo'linish urinishda bajarilmaydi
blok. Aksincha, usul koeffitsientiga qo'ng'iroq (29-satr) ga harakat qiladigan kodni chaqiradi
bo'linma (12-qator); JVM ma'nosi bo'lganda ArithmeticException ob'ektini tashlaydi.
nator nolga teng.

Istisnolarni ushlash


Ushbu misoldagi try blokidan keyin ikkita tutqich bloki mavjud - biri In-
putMismatchException (34–41-qatorlar) va ArithmeticException bilan ishlaydigan biri
(42–47 qatorlar). Catch bloki (shuningdek, catch bandi yoki istisno ishlovchisi deb ataladi) ushlaydi (ya'ni,
qabul qiladi) va istisnoni boshqaradi. Catch bloki catch kalit so'zidan boshlanadi
Qavslar ichidagi parametr (istisno parametri deb ataladi, qisqacha muhokama qilinadi) va a
jingalak qavslar ichiga olingan kod bloki. [Izoh: Ba'zida "catch clause" atamasi ishlatiladi
catch kalit so'zidan keyin kod blokiga murojaat qilish uchun, "catch block" atamasi esa
catch kalit so'zidan keyingi kod blokiga ishora qiladi, lekin uni o'z ichiga olmaydi. Uchun
soddaligi, biz tutib olishdan keyingi kod blokiga murojaat qilish uchun "tutish bloki" atamasidan foydalanamiz
kalit so'z, shuningdek kalit so'zning o'zi.]
Kamida bitta tutqich bloki yoki yakuniy blok (11.6-bo'limda muhokama qilingan) zudlik bilan bajarilishi kerak.
sinash blokiga darhol amal qiling. Har bir catch bloki qavslar ichida istisnoni belgilaydi
ishlov beruvchi qayta ishlay oladigan istisno turini aniqlaydigan parametr. Istisno bo'lganda
try blokida sodir bo'lsa, bajariladigan catch bloki turiga mos keladigan birinchi blokdir
yuzaga kelgan istisno turi (ya'ni catch blokidagi tur tashlanganga mos keladi
istisno turi aynan yoki uning bevosita yoki bilvosita yuqori sinfidir). Istisno parametrlari
name catch blokiga ushlangan istisno ob'ekti bilan o'zaro ta'sir qilish imkonini beradi, masalan,
ushlangan istisnoning toString usulini chaqiring (37 va 44-satrlarda bo'lgani kabi), u ko'rsatadi
istisno haqida asosiy ma'lumotlar. E'tibor bering, biz System.err (standart xato
oqim) xato xabarlarini chiqarish uchun ob'ekt. Odatiy bo'lib, System.err ning chop etish usullari, masalan
System.out-dagilar, buyruq satriga ma'lumotlarni ko'rsatish.
Birinchi catch blokining 38-qatori Skaner usulini keyingi qatorga chaqiradi. Chunki kirish -
MismatchException sodir bo'ldi, nextInt usuliga qo'ng'iroq hech qachon muvaffaqiyatli o'qilmadi
foydalanuvchi ma'lumotlari - shuning uchun biz keyingi qatorga qo'ng'iroq qilish orqali ushbu kiritishni o'qiymiz. Biz hech narsa qilmaymiz
bu nuqtada kiritish bilan, chunki biz uning yaroqsiz ekanligini bilamiz. Har bir ushlash bloki ko'rsatiladi
xato xabari va foydalanuvchidan qayta urinib ko'rishni so'raydi. Har bir catch bloki tugagandan so'ng,
foydalanuvchidan kiritish so'raladi. Tez orada biz ushbu nazorat oqimi qanday ishlashini chuqurroq ko'rib chiqamiz
istisno bilan ishlashda.

Dasturiy ta'minot muhandisligi kuzatuvi 11.1


Istisnolar sinash blokida aniq ko'rsatilgan kod orqali, chuqur orqali yuzaga kelishi mumkin
sinash blokidagi kod yoki Java Virtual Mashina sifatida boshlangan ichki usul chaqiruvlari
u Java bayt kodlarini bajaradi.

Umumiy dasturlash xatosi 11.1


Kodni sintaktik blok va unga mos keladigan bloklar o'rtasida joylashtirish sintaksik xatodir.

11.3 Arifmetik istisnolar va InputMismatchExceptions 449

Ko'p ushlash
Sinov blokidan keyin bir nechta tutqich bloklari bilan ishlash nisbatan keng tarqalgan
har xil turdagi istisnolar. Agar bir nechta tutqich bloklarining tanasi bir xil bo'lsa, siz foydalanishingiz mumkin
ko'p ushlash xususiyati (Java SE 7 da kiritilgan) ushbu istisno turlarini bir vaqtning o'zida ushlash uchun
catch handler va xuddi shu vazifani bajaring. Multi-catch uchun sintaksis:

Har bir istisno turi keyingisidan vertikal chiziq (|) bilan ajratiladi. Oldingi qator


of code har qanday turdagi (yoki ularning pastki sinflari) istisno holatida qo'lga olinishi mumkinligini ko'rsatadi
ishlov beruvchi. Ko'p qo'lga olishda har qanday miqdordagi Throwable turlari ko'rsatilishi mumkin.
Tugallanmagan istisnolar
Qo'lga kiritilmagan istisno - bu mos keladigan tutqich bloklari mavjud emas. Siz ko'rdingiz -
11.2-rasmning ikkinchi va uchinchi chiqishlarida istisnolar ushlandi. Eslatib o'tamiz, bundan mustasno -
Ushbu misolda bunday holatlar yuzaga kelgan bo'lsa, dastur erta tugatildi (ko'rsatilgandan keyin
istisno stek izi). Bu har doim ham qo'lga olinmagan istisnolar natijasida yuzaga kelmaydi. Java
dasturni bajarishning "ko'p oqimli" modelidan foydalanadi - har bir ip bir vaqtning o'zida faoliyatdir.
Bitta dasturda ko'plab mavzular bo'lishi mumkin. Agar dasturda faqat bitta mavzu bo'lsa, ushlanmagan sobiq
qabul qilish dasturning tugatilishiga olib keladi. Agar dasturda bir nechta mavzu bo'lsa, un-
tutilgan istisno faqat istisno sodir bo'lgan mavzuni tugatadi. Bunday holda
dasturlar, ammo, ba'zi bir ish zarrachalari boshqalarga tayanishi mumkin, va agar bir mavzu tugatilgan bo'lsa
qo'lga kiritilmagan istisno uchun, dasturning qolgan qismiga salbiy ta'sir ko'rsatishi mumkin.
23-bob, Muvofiqlik bu masalalarni chuqur muhokama qiladi.
Istisnolarni qayta ishlashni tugatish modeli
Agar sinab ko'rish blokida istisno yuzaga kelsa (masalan, InputMismatchException yuborilmoqda
11.3-rasmning 25-qatoridagi kod natijasida try bloki darhol tugaydi va
dastur boshqaruvi istisno mavjud bo'lgan quyidagi tutib olish bloklarining birinchisiga o'tadi
parametr turi tashlangan istisno turiga mos keladi. 11.3-rasmda birinchi tutqich bloki
InputMismatchExceptions ni ushlaydi (bu noto'g'ri kiritilgan bo'lsa) va sek-
ond catch bloki ArithmeticExceptions ni ushlaydi (agar o'zgartirishga urinilganda sodir bo'ladi).
nolga teng). Istisno ko'rib chiqilgandan so'ng, dastur boshqaruvi otish holatiga qaytmaydi
nuqtasi, chunki try blokining muddati tugagan (va uning mahalliy o'zgaruvchilari yo'qolgan). Aksincha, kon-
trol oxirgi catch blokidan keyin davom etadi. Bu istisnoning tugatish modeli sifatida tanilgan.
tion ishlov berish. Ba'zi tillar istisnolardan foydalanishni qayta tiklash modelidan foydalanadi
Istisno ko'rib chiqilgandan so'ng, nazorat otish nuqtasidan so'ng tiklanadi.
E'tibor bering, biz istisno parametrlarimizni nomlaymiz (inputMismatchException va
arifmeticException) ularning turiga qarab. Java dasturchilari ko'pincha oddiygina harfdan foydalanadilar
e ularning istisno parametrlarining nomi sifatida.
Tutib olish blokini bajargandan so'ng, ushbu dasturning boshqaruv oqimi birinchisiga o'tadi
oxirgi catch blokidan keyingi bayonot (bu holda 48-satr). Ishdagi holat…hozirda
bayonot true (continueLoop o'zgaruvchisi o'zining dastlabki true qiymatini o'z ichiga oladi), shuning uchun nazorat qiling
sikl boshiga qaytadi va foydalanuvchidan yana kiritish so'raladi. Bu nazorat
to'g'ri kiritilgan ma'lumotlar kiritilgunga qadar bayonot tsikli davom etadi. Shu nuqtada dastur boshqaruvi chiziqqa yetib boradi
32, bu continueLoop o'zgaruvchisiga false qiymatini belgilaydi. Keyin urinish bloki tugaydi. Agar yo'q bo'lsa
istisnolar try blokiga tashlanadi, catch bloklari o'tkazib yuboriladi va nazorat davom etadi
catch bloklaridan keyingi birinchi bayonot bilan (biz qachon boshqa imkoniyat haqida bilib olamiz

tutish (1-tur | 2-tur | 3-tur e)


450 11-bob Istisnolardan foydalanish: chuqurroq qarash

biz 11.6-bo'limda yakuniy blokni muhokama qilamiz). Endi do…while davri uchun shart
noto'g'ri va usul asosiy tugaydi.
Sinab ko'rish bloki va unga mos keladigan tutqich va/yoki bloklar sinash holatini hosil qiladi -
ment. "Urinish bloki" va "sinab ko'ring bayonot" atamalarini chalkashtirmang - ikkinchisi
blokni, shuningdek, quyidagi catch bloklarini sinab ko'ring va/yoki nihoyat blokirovka qiling.
Boshqa har qanday kod blokida bo'lgani kabi, sinash bloki tugagach, mahalliy o'zgaruvchilar e'lon qilinadi
blokda doiradan chiqib ketish va endi kirish imkoni yo'q; shunday qilib, bir urinib mahalliy o'zgaruvchilar
mos keladigan tutqich bloklarida blokdan foydalanish mumkin emas. Qachon ushlash bloki tugaydi
nates, catch blokida e'lon qilingan mahalliy o'zgaruvchilar (shu jumladan istisno parametri
o'sha catch blok) ham ko'lamidan chiqib ketadi va yo'q qilinadi. Qolgan tutqichlar ichkariga kiradi
try iborasi e'tiborga olinmaydi va bajarish kodning birinchi qatoridan keyin davom etadi
urinib ko'ring... tutib olish ketma-ketligi - agar mavjud bo'lsa, bu yakuniy blok bo'ladi.
Throws bandidan foydalanish
Usul bo'limida (11.3-rasm, 9-13-qatorlar) 10-qator otish bandi sifatida tanilgan. Bu spetsifikatsiya -
agar muammolar yuzaga kelsa, usul qo'yishi mumkin bo'lgan istisnolar mavjud. Bu shart
Usul parametrlari roʻyxatidan keyin va tanadan oldin paydo boʻladi, vergul bilan ajratilgan
istisno turlari ro'yxati. Bunday istisnolar usuldagi iboralar orqali chiqarilishi mumkin
tanasi yoki u yerdan chaqirilgan usullar bilan. Biz ushbu ilovaga otish bandini qo'shdik
bu usul ArithmeticExceptionni tashlashi mumkinligini ko'rsatish uchun. Usul koeffitsienti
Shunday qilib, qo'ng'iroq qiluvchilarga bu usul ArithmeticExceptionni tashlashi mumkinligi haqida xabar beriladi. Biroz
ArithmeticException kabi istisno turlarini tashlashlar roʻyxatiga kiritish talab qilinmaydi
bandi. Bo'lganlar uchun usul is-a munosabatlariga ega bo'lgan istisnolarni tashlashi mumkin
otish bandida keltirilgan sinflar bilan. Bu haqda 11.5-bo'limda ko'proq bilib olasiz.

12-satr bajarilganda, agar maxraj nolga teng bo'lsa, JVM arifmetik-


Istisno obyekti. Ushbu ob'ekt 42-47-qatorlardagi tutqich bloki tomonidan ushlanadi, bu
istisnolarni bilvosita chaqirish orqali istisno haqidagi asosiy ma'lumotlarni o'ynaydi
toString usuli, keyin foydalanuvchidan qayta urinib ko'rishni so'raydi.
Agar maxraj nolga teng bo'lmasa, usul bo'limi bo'linishni amalga oshiradi va qaytaradi
natijani try blokidagi usul koeffitsientini chaqirish nuqtasiga (29-satr). Chiziqlar
30–31 hisob-kitob natijasini ko'rsatadi va 32-qator davom etadiLoopni noto'g'ri deb belgilaydi. Bunda
Bunday holda, sinash bloki muvaffaqiyatli yakunlanadi, shuning uchun dastur catch bloklarini o'tkazib yuboradi va muvaffaqiyatsiz bo'ladi
48-qatordagi shart va main usuli normal bajarilishni yakunlaydi.
Bo'lim ArithmeticExceptionni tashlaganda, bo'lim tugaydi va tugamaydi
qiymatni qaytaradi va quotientning mahalliy o'zgaruvchilari doiradan tashqariga chiqadi (va yo'q qilinadi). Agar kvo-
Tient ob'ektlarga havola bo'lgan mahalliy o'zgaruvchilarni o'z ichiga olgan va boshqa hech qanday ko'rsatma mavjud emas edi.
Ushbu ob'ektlarga murojaat qilganda, ob'ektlar axlat yig'ish uchun belgilanadi. Bundan tashqari, qachon an
istisno sodir bo'lganda, qism chaqirilgan try bloki satrlardan oldin tugaydi
30-32 bajara oladi. Bu erda ham, agar mahalliy o'zgaruvchilar try blokidan oldin yaratilgan bo'lsa
istisno qilingan bo'lsa, bu o'zgaruvchilar doiradan chiqib ketadi.

Xatolarning oldini olish bo'yicha maslahat 11.1


Usulni dasturda ishlatishdan oldin onlayn API hujjatlarini o'qing. hujjat-
mentation usul tomonidan tashlangan istisnolarni (agar mavjud bo'lsa) belgilaydi va sabablarini ko'rsatadi
bunday istisnolar yuzaga kelishi mumkin. Keyin, belgilangan istisnolar uchun onlayn API hujjatlarini o'qing.
tsion sinflari. Istisno klassi uchun hujjatlar odatda potentsial sabablarni o'z ichiga oladi
bunday istisnolar sodir bo'ladi. Nihoyat, dasturingizda ushbu istisnolarni ko'rib chiqing.

11.4 Istisnolardan foydalanish qachon 451

Agar InputMismatchException 25 yoki 27-qatorlar tomonidan yaratilgan bo'lsa, try bloki termini
nates va ijro 34–41-qatorlardagi catch bloki bilan davom etadi. Bunday holda, usul
ko'rsatkich chaqirilmaydi. Keyin asosiy usul oxirgi catch blokidan keyin davom etadi (48-qator).

11.4 Istisnolardan foydalanish qachon


Istisnolarni ko'rib chiqish sinxron xatolarni qayta ishlash uchun mo'ljallangan bo'lib, ular holati buzilganda yuzaga keladi.
ment amalga oshiradi. Kitob davomida biz ko'radigan umumiy misollar qatordan tashqarida joylashgan.
zarlar, arifmetik to'ldirish (ya'ni, qiymatlarning ifodalanadigan diapazonidan tashqaridagi qiymat), bo'linish
nol, noto'g'ri usul parametrlari va ipning uzilishi (biz 23-bobda ko'rib chiqamiz). Istisno -
Asenkron hodisalar bilan bog'liq muammolarni qayta ishlash uchun mo'ljallanmagan
(masalan, diskdagi kiritish-chiqarish yakunlari, tarmoq xabarlari kelishi, sichqonchani bosish va tugmalar bosish)
dasturni boshqarish oqimiga parallel ravishda va undan mustaqil ravishda sodir bo'ladi.

11.5 Java istisno ierarxiyasi


Barcha Java istisno sinflari Exception sinfidan bevosita yoki bilvosita meros qilib olinadi
meros ierarxiyasi. Ushbu ierarxiyani o'zingizning istisno sinflaringiz bilan kengaytirishingiz mumkin.
11.4-rasmda Throwable sinfi uchun meros ierarxiyasining kichik bir qismi ko'rsatilgan (a
Ob'ektning pastki sinfi), bu Exception sinfining yuqori sinfidir. Faqat tashlanadigan ob'ektlar
istisno bilan ishlash mexanizmi bilan foydalanish mumkin. Class Throwable ikkita to'g'ridan-to'g'ri pastki qismga ega.
sinflar: istisno va xato. Class Exception va uning quyi sinflari, masalan, Runtime-
Istisno (java.lang paketi) va IOException (java.io paketi) — ifodalaydi
Java dasturida yuzaga kelishi mumkin bo'lgan va uni qo'lga olishi mumkin bo'lgan istisno holatlar
ilova. Sinf xatosi va uning quyi sinflari sodir bo'ladigan g'ayritabiiy vaziyatlarni ifodalaydi
JVM. Aksariyat xatolar kamdan-kam hollarda ro'y beradi va ilovalar tomonidan ushlanmasligi kerak - bu
Odatda ilovalar uchun Xatolarni tiklash mumkin emas.
Java istisno ierarxiyasi yuzlab sinflarni o'z ichiga oladi. Java haqida ma'lumot
istisno sinflarini Java API-da topish mumkin. Siz Throwable hujjatini ko'rishingiz mumkin.
docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html manzilida eslatib o'ting. Kimdan
u erda Java-ning Excep- haqida ko'proq ma'lumot olish uchun ushbu sinfning pastki sinflarini ko'rishingiz mumkin.
Xatolar va xatolar.

Dasturiy ta'minot muhandisligi kuzatuvi 11.2


Istisnolarni qayta ishlash va xatolarni tiklash strategiyangizni tizimingizga kiriting
dizayn jarayonining boshlanishi, shu jumladan tizim joriy etilgandan keyin
qiyin bo'lsin.

Dasturiy ta'minot muhandisligi kuzatuvi 11.3


Istisnolardan foydalanish hujjatlashtirish, aniqlash va aniqlash uchun yagona, yagona texnikani ta'minlaydi
xatolardan tiklanish. Bu yirik loyihalar ustida ishlayotgan dasturchilarga har birini tushunishga yordam beradi
boshqa xatoliklarni qayta ishlash kodi.

Dasturiy ta'minot muhandisligi kuzatuvi 11.4


Istisnolarni keltirib chiqaradigan juda ko'p turli xil vaziyatlar mavjud - ba'zi istisnolar osonroq
boshqalardan ko'ra tiklanish uchun.

452 11-bob Istisnolardan foydalanish: chuqurroq qarash

Belgilangan va tekshirilmagan istisnolar
Java tekshirilgan istisnolar va belgilanmagan istisnolarni ajratib turadi. Bu farq
muhim, chunki Java kompilyatori tekshirilgan istisnolar uchun maxsus talablarni qo'yadi
(bir lahzada muhokama qilinadi). Istisno turi uning belgilangan yoki belgilanmaganligini aniqlaydi.
RuntimeExceptions - bu belgilanmagan istisnolar
RuntimeException ning to'g'ridan-to'g'ri yoki bilvosita pastki sinflari bo'lgan barcha istisno turlari (paket
java.lang) belgilanmagan istisnolardir. Bular, odatda, sizning ishingizda nuqsonlar tufayli yuzaga keladi.
gramm kodi. Tekshirilmagan istisnolarga misollar:
• ArrayIndexOutOfBoundsExceptions (7-bobda muhokama qilingan) — qochishingiz mumkin
bu sizning massiv indekslaringiz har doim 0 va dan katta yoki teng bo'lishini ta'minlash orqali
massiv uzunligidan kamroq.
• Arifmetik istisnolar (11.3-rasmda ko'rsatilgan) - Arifmetik-
Maxrajni belgilash orqali nolga bo'linganda yuzaga keladigan istisno
Hisoblashdan oldin uning 0 ekanligini aniqlang.
Xato sinfidan to'g'ridan-to'g'ri yoki bilvosita meros bo'lib qolgan sinflar (11.4-rasm) belgilanmagan.
sabab Xatolar shu qadar jiddiy muammolarki, sizning dasturingiz hal qilishga urinmasligi ham kerak
ular bilan.
Belgilangan istisnolar
Istisno sinfidan meros bo'lgan barcha sinflar, lekin to'g'ridan-to'g'ri yoki bilvosita Run sinfidan emas.
timeException tekshirilgan istisnolar deb hisoblanadi. Bunday istisnolar odatda
dastur nazorati ostida bo'lmagan holatlar tufayli yuzaga keladi - masalan, faylda
qayta ishlanayotganda, agar u mavjud bo'lmasa, dastur faylni ocholmaydi.

11.4-rasm | Throwable-ning meros ierarxiyasi sinfining bir qismi.

AWTError ThreadDeath VirtualMachineError

Istisno xatosi

RuntimeException IOException

Otish mumkin

ClassCastException NullPointerException ArithmeticException

NoSuchElementException

ArrayIndexOutOfBoundsException

IndexOutOfBoundsException

InputMismatchException

11.5 Java istisno ierarxiyasi 453

Kompilyator va tekshirilgan istisnolar
Kompilyator har bir usul chaqiruvi va usul deklaratsiyasini tekshiradi
usul tekshirilgan istisnoni chiqaradi. Agar shunday bo'lsa, kompilyator tekshirilgan istisno ekanligini tekshiradi
ushlangan yoki otish bandida e'lon qilingan - bu catch-or-declare talabi sifatida tanilgan.
ment. Biz keyingi bir nechta misollarda tekshirilgan istisnolarni qanday tutish yoki e'lon qilishni ko'rsatamiz.
11.3-bo'limdan eslatib o'tamizki, throws bandi usul tashlaydigan istisnolarni belgilaydi.
Bunday istisnolar usul tanasida ushlanmaydi. Qo'lga olish qismini qondirish uchun -
yoki-e'lon qilish talabi bo'lsa, istisnoni yaratuvchi kod sinashga o'ralgan bo'lishi kerak
bloklanadi va tekshirilgan istisno turi (yoki uning qo'shimchalaridan biri) uchun catch ishlov beruvchisini ta'minlashi kerak.
sinflar). Qo'lga olish yoki e'lon qilish talabining deklaratsiya qismini qondirish uchun usul
istisno hosil qiluvchi kodni o'z ichiga olgan otish bandini o'z ichiga olishi kerak
Belgilangan istisno turi parametrlar ro'yxatidan keyin va usul tanasidan oldin. Agar
catch-or-declare talabi bajarilmasa, kompilyator xato xabarini chiqaradi. Bu
tashlagan usulda yuzaga kelishi mumkin bo'lgan muammolar haqida o'ylashga majbur qiladi
tekshirilgan istisnolar deyiladi.

Kompilyator va tekshirilmagan istisnolar


Belgilangan istisnolardan farqli o'laroq, Java kompilyatori aniqlash uchun kodni tekshirmaydi
tekshirilmagan istisno ushlanganmi yoki e'lon qilinganmi. Odatda belgilanmagan istisnolar
to'g'ri kodlash orqali oldini olish mumkin. Masalan, belgilanmagan ArithmeticException
11.3-rasmdagi usul koeffitsienti (9-13-qatorlar) bo'yicha tashlangan, agar usul en-
bo'lishdan oldin maxraj nolga teng emasligiga ishonch hosil qiladi. Belgilanmagan istisno -
metodlarni tashlash bandida ro'yxatga kiritilishi shart emas - ular bo'lsa ham, bunday emas
bunday istisnolar ilova orqali ushlanishini talab qildi.

Xatolarning oldini olish bo'yicha maslahat 11.2


Siz tekshirilgan istisnolar bilan shug'ullanishingiz kerak. Bu bo'lishidan ko'ra mustahkamroq kodga olib keladi
Agar ularni shunchaki e'tiborsiz qoldira olsangiz yaratilgan.

Umumiy dasturlash xatosi 11.2


Agar pastki sinf usuli yuqori sinf usulini bekor qilsa, bu pastki sinf usuli uchun xatodir
uning otish bandida superclass usulidan ko'ra ko'proq istisnolarni sanab o'ting. Biroq, sub-
class's throws gapi superklassning throws bandining kichik to'plamini o'z ichiga olishi mumkin.

Dasturiy ta'minot muhandisligi kuzatuvi 11.5


Agar sizning usulingiz tekshirilgan istisnolarni tashlaydigan boshqa usullarni chaqirsa, bu istisnolar kerak
qo'lga olinishi yoki e'lon qilinishi. Agar istisno usulida mazmunli ishlov berish mumkin bo'lsa,
usul e'lon qilishdan ko'ra istisnoni ushlab turishi kerak.

Dasturiy ta'minot muhandisligi kuzatuvi 11.6


Garchi kompilyator belgilanmaganlar uchun catch-or-declare talabini qo'llamasa ham
istisnolar, agar bunday istisnolar ma'lum bo'lsa, tegishli istisnolar bilan ishlash kodini taqdim eting.
lar yuzaga kelishi mumkin. Masalan, dastur NumberFormatException-ni qayta ishlashi kerak
NumberFormatException bilvosita bo'lsa ham parseInt integer usulidan
RuntimeException pastki klassi (va shuning uchun tekshirilmagan istisno). Bu sizning pro-
gramm mustahkamroq.

454 11-bob Istisnolardan foydalanish: chuqurroq qarash

Pastki sinf istisnolarini ushlash
Agar catch ishlov beruvchisi superklass istisno ob'ektlarini ushlash uchun yozilgan bo'lsa, u barcha ob'ektlarni ham ushlay oladi
bu sinfning kichik sinflaridan. Bu catch-ga tegishli istisnolarni polimorfik tarzda boshqarish imkonini beradi.
Agar bu istisnolar boshqa ishlov berishni talab qilsa, har bir kichik sinfni alohida-alohida ushlashingiz mumkin.
Faqat birinchi mos keladigan tutqich bajariladi
Agar bir nechta tutqich bloklari ma'lum bir istisno turiga mos kelsa, faqat birinchi mos keladigan tutqich
blok ushbu turdagi istisno sodir bo'lganda bajariladi. ni qo'lga kiritish uchun kompilyatsiya xatosi
ma'lum bir sinash bloki bilan bog'liq bo'lgan ikki xil catch bloklarida aynan bir xil turdagi. Qanaqasiga-
har doim istisnoga mos keladigan bir nechta catch bloklari bo'lishi mumkin, ya'ni bir nechta catch bloklari
ularning turlari istisno turi yoki shu turdagi supersinf bilan bir xil. Masalan; misol uchun,
biz ArithmeticException turi uchun catch blokiga tur uchun catch blokiga amal qilishimiz mumkin
Istisno - ikkalasi ham ArithmeticExceptions bilan mos keladi, lekin faqat birinchi mos keladi
catch bloki bajariladi.

11.6 Nihoyat Bloklash


Muayyan resurslarni oladigan dasturlar ularni tizimga qaytarishi kerak
resurslarning oqishi. C va C++ kabi dasturlash tillarida eng keng tarqalgan manba
oqish - xotiraning oqishidir. Java endi ishlatilmaydigan xotirani avtomatik yig'ishni amalga oshiradi
dasturlar orqali, shu tariqa xotiraning ko'p oqishini oldini oladi. Biroq, boshqa turdagi manbalar oqib chiqishi mumkin
yuzaga keladi. Masalan, fayllar, ma'lumotlar bazasi ulanishlari va yopiq bo'lmagan tarmoq ulanishlari
to'g'ri, ular endi kerak bo'lmagandan keyin boshqa dasturlarda foydalanish uchun mavjud bo'lmasligi mumkin.

finally bloki (u finally kalit so'zidan, keyin esa koddan iborat


jingalak qavslar ichiga olingan), ba'zan final bandi deb ataladi, ixtiyoriy. Agar shunday bo'lsa

Umumiy dasturlash xatosi 11.3


Yuqori sinf istisno turi uchun catch blokini tutadigan boshqa tutib olish bloklaridan oldin joylashtirish
subclass istisno turlari bu catch bloklari bajarilishini oldini oladi, shuning uchun kompilyatsiya
xatolik yuzaga keladi.

Xatolarning oldini olish bo'yicha maslahat 11.3


Agar bir yoki bir nechtasini sinab ko'rishni unutib qo'ysangiz, kichik sinf turlarini alohida-alohida ushlash xatolikka yo'l qo'yadi
pastki sinf turlaridan aniq; supersinfni qo'lga olish barcha sub-sinf ob'ektlarini kafolatlaydi.
sinflar qo'lga olinadi. Boshqa barcha sub-sinflardan keyin yuqori sinf turi uchun tutqich blokini joylashtirish
class catch bloklari barcha pastki sinf istisnolari oxir-oqibat ushlanishini ta'minlaydi.

Dasturiy ta'minot muhandisligi kuzatuvi 11.7


Sanoatda otish yoki ushlash turida istisnolardan foydalanish tavsiya etilmaydi - biz bu erda oddiygina foydalanamiz
istisnolardan foydalanish mexanikasini ko'rsatish. Keyingi boblarda biz odatda tashlaymiz
va aniqroq istisno turlarini ushlang.

Xatolarning oldini olish bo'yicha maslahat 11.4


Nozik muammo shundaki, Java xotira oqishini to'liq bartaraf etmaydi. Java axlat qilmaydi -
ob'ektni unga havolalar qolmaguncha to'plang. Shunday qilib, agar siz noto'g'ri saqlasangiz
keraksiz ob'ektlarga havolalar, xotira oqishlari paydo bo'lishi mumkin.

11.6, nihoyat, 455-blok

hozirgi, u oxirgi catch blokidan keyin joylashtiriladi. Agar ushlash bloklari bo'lmasa, nihoyat
blok, agar mavjud bo'lsa, darhol try blokini kuzatib boradi.

Nihoyat Blok bajarilganda


Finally bloki tegishli blokda istisno qilingan yoki yo'qligini bajaradi
blokirovka qilishga harakat qiling. Agar try bloki qaytish orqali chiqsa, finally bloki ham bajariladi,
break yoki davom iborasini yoki oddiygina o'ng qavsni yopish orqali. Bitta holat
Agar dastur sinash blokidan erta chiqsa finally bloki bajarilmaydi
System.exit usulini chaqirish orqali. Biz 15-bobda ko'rsatgan bu usul, im-
arizani vositachilik bilan tugatadi.
Agar sinab ko'rish blokida yuzaga kelgan istisnoni ushbu sinash bloklaridan biri ushlab qolmasa
catch ishlov beruvchilari bilan dastur sinab ko'rish blokining qolgan qismini o'tkazib yuboradi va boshqaruv blokiga o'tadi
nihoyat blokirovka. Keyin dastur istisnoni keyingi tashqi sinash blokiga o'tkazadi - na-
mally qo'ng'iroq usulida - bu erda bog'langan catch bloki uni ushlashi mumkin. Bu jarayon
ko'p darajadagi sinash bloklari orqali sodir bo'lishi mumkin. Bundan tashqari, istisno qo'lga olinmasligi mumkin (biz kabi
11.3-bo'limda muhokama qilingan.
Agar catch bloki istisno qilsa, finally blok hali ham bajariladi. Keyin
istisno keyingi tashqi sinash blokiga o'tkaziladi - yana, odatda chaqiruv usulida.

Resurslarni nihoyat blokda chiqarish


Nihoyat blok har doim bajarilganligi sababli, u odatda resurs-reliz kodini o'z ichiga oladi. Faraz qilaylik
resurs sinash blokida ajratilgan. Hech qanday istisno bo'lmasa, catch bloklari o'tkazib yuboriladi va
boshqaruv yakuniy blokga o'tadi, bu esa resursni bo'shatadi. Keyin nazorat davom etadi
finally blokidan keyingi birinchi bayonot. Agar try blokida istisno ro'y bersa, urinib ko'ring
blok tugaydi. Agar dastur mos keladigan tutqichlardan birida istisnoni ushlasa
bloklar, u istisnoni qayta ishlaydi, keyin yakuniy blok resurs va boshqaruvni chiqaradi
finally blokdan keyingi birinchi bayonotga o'tadi. Agar dastur avvalgisini ushlamasa
qabul qilinganda, finally blok hali ham resursni chiqaradi va sobiq blokni ushlashga harakat qilinadi.
chaqiruv usulida qabul qilish.

Nihoyat Blokni namoyish qilish


11.5-rasmda istisno bo'lmasa ham final bloki bajarilishini ko'rsatadi
mos keladigan sinash blokiga tashlanadi. Dasturda asosiy statik usullar mavjud
(6–18-qatorlar), throwException (21–44-qatorlar) va doesNotThrowException (47–64-qatorlar).
throwException va doesNotThrowException usullari statik deb e'lon qilinadi, shuning uchun main mumkin
UseExceptions ob'ektini yaratmasdan ularni to'g'ridan-to'g'ri chaqiring.

Xatolarning oldini olish bo'yicha maslahat 11.5


Nihoyat blok - bu sinash blokida olingan resurslarni chiqarish uchun ideal joy (masalan
ochilgan fayllar), bu resurslarning sizib chiqishini bartaraf etishga yordam beradi.

Ishlash bo'yicha maslahat 11.1


Resursni har doim aniq va imkon qadar tezroq chiqaring.
ger kerak. Bu resurslarni iloji boricha tezroq qayta foydalanishga imkon beradi va shu bilan yaxshilanadi
resurslardan foydalanish va dasturning ishlashi.

456 11-bob Istisnolardan foydalanish: chuqurroq qarash

1 // 11.5-rasm: UseExceptions.java
2 // try...catch...nihoyat, istisnolarni qayta ishlash mexanizmi.
3
4 umumiy sinf UseExceptions
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 urinib ko'ring
9 {
10 throwException();
11 }
12 catch (istisno istisno) // throwException tomonidan chiqarilgan istisno
13 {
14 System.err.println("Asosiy holatda ko'rib chiqiladigan istisno");
15 }
16
17 doesNotThrowException();
18 }
19
20 // sinab ko'rish... tutib olish... nihoyat
21 umumiy statik void throwException() ni tashlaydi Istisno
22 {
23 urinib ko'ring // istisno qo'ying va darhol uni ushlang
24 {
25 System.out.println("Metod throwException");
26
27 }
28 catch (Istisnodan istisno) // urinib ko'rishda ushlangan istisno
29 {
30 System.err.println(
31 "Istisno throwException usulida ishlanadi");
32
33
34 // bu erda kodga etib bo'lmaydi; kompilyatsiya xatolariga olib keladi
35
36 }
37
38
39
40
41
42 // bu erda kodga etib bo'lmaydi; kompilyatsiya xatolariga olib keladi
43
44 }
45
46 // hech qanday istisno sodir bo'lmaganda nihoyat ko'rsatish
47 ta umumiy statik void doesNotThrowException()
48 {
49 try // try bloki istisno qilmaydi
50 {
51 System.out.println("Usul doesNotThrowException");
52 }

11.5-rasm | harakat qilib ko'ring ... qo'lga oling ... nihoyat istisnolarni boshqarish mexanizmi. (2-qismning 1-qismi.)

yangi Exception(); // istisno yaratish

istisno qilish; // keyingi ishlov berish uchun qayta o'rnatish

finally // try...catch da nima sodir bo'lishidan qat'iy nazar bajaradi
{
System.err.println("Nihoyat throwExceptionda bajarildi");
}

11.6, nihoyat, 457-blok

System.out va System.err - bu oqimlar - baytlar ketma-ketligi. System.out paytida
(standart chiqish oqimi sifatida tanilgan) dasturning chiqishini ko'rsatadi, System.err (ma'lum
standart xato oqimi sifatida) dastur xatolarini ko'rsatadi. Ushbu oqimlardan chiqish mumkin
qayta yo'naltirilishi mumkin (ya'ni, buyruq satridan boshqa joyga, masalan, faylga yuboriladi).
Ikki xil oqimdan foydalanish xato xabarlarini boshqalardan osongina ajratish imkonini beradi
chiqish. Masalan, System.err dan ma'lumotlar chiqishi jurnal fayliga yuborilishi mumkin, ma'lumotlar esa
System.out dan olingan ma'lumotlar ekranda ko'rsatilishi mumkin. Oddiylik uchun ushbu bo'lim bo'ladi
System.err dan chiqishni qayta yo'naltirmaydi, lekin bunday xabarlarni buyruqqa ko'rsatadi
taklif. 15-bobda oqimlar haqida ko‘proq bilib olasiz.

Istisnolarni tashlash throw bayonotidan foydalanish


Asosiy usul (11.5-rasm) bajarishni boshlaydi, uning sinash blokiga kiradi va darhol qo'ng'iroq qiladi.
throwException usuli (10-qator). throwException usuli Exceptionni chiqaradi. The
26-satrdagi bayonot otish bayonoti sifatida tanilgan - bu sobiq so'zni ko'rsatish uchun bajariladi.
kontseptsiya sodir bo'ldi. Hozirgacha siz faqat chaqirilgan usullar bilan chiqarilgan istisnolarni ushladingiz.
Throw iborasidan foydalanib, istisnolarni o'zingiz qilishingiz mumkin. Xuddi istisnolarda bo'lgani kabi
Java API usullari tomonidan tashlangan, bu mijoz ilovalariga xatolik borligini bildiradi
sodir bo'ldi. Throw iborasi tashlanadigan ob'ektni belgilaydi. Otish mumkin operandi
Throwable sinfidan olingan har qanday sinfdan bo'lish.

53 catch (istisno istisno) // bajarilmaydi


54 {
55 System.err.println(istisno);
56 }
57
58
59
60
61
62
63 System.out.println("Usulning oxiri doesNotThrowException");
64 }
65 } // Exceptions foydalanish sinfini tugatish

throwException usuli


Istisno throwException usulida ishlanadi
Nihoyat throwException da bajarildi
Istisno asosiy holatda ko'rib chiqiladi
Metod doesNotThrowException
Nihoyat, doesNotThrowException da bajarildi
Usulning oxiri doesNotThrowException

Dasturiy ta'minot muhandisligi kuzatuvi 11.8


ToString har qanday Throwable ob'ektida chaqirilganda, uning hosil bo'lgan String tarkibiga kiradi
konstruktorga berilgan tavsiflovchi satr yoki yo'q bo'lsa oddiygina sinf nomi
arqon yetkazib berildi.

11.5-rasm | harakat qilib ko'ring ... qo'lga oling ... nihoyat istisnolarni boshqarish mexanizmi. (2-qismning 2-qismi.)

finally // try...catch da nima sodir bo'lishidan qat'iy nazar bajaradi
{
System.err.println(
"Nihoyat, doesNotThrowException da bajarildi");
}

458 11-bob Istisnolardan foydalanish: chuqurroq qarash

Istisnolarni qayta tiklash
11.5-rasmning 32-qatori istisnoni qaytadan o'zgartiradi. Qo'lga olish bloki bo'lganda istisnolar qayta o'rnatiladi,
istisnoni olgandan so'ng, u ushbu istisnoni qayta ishlay olmaydi yoki buni amalga oshirishga qaror qiladi
faqat qisman ishlov berishi mumkin. Istisnoni qayta tiklash istisnolarni qayta ishlashni kechiktiradi (yoki
ehtimol uning bir qismi) tashqi try iborasi bilan bog'langan boshqa catch blokiga. An
istisno throw kalit so'zi yordamida qayta o'rnatiladi, keyin esa istisnoga havola qilinadi.
Hozirgina qo'lga olingan tion ob'ekti. Istisnolarni finally blokidan qayta olib bo'lmaydi
catch blokidagi istisno parametri (mahalliy o'zgaruvchi) endi mavjud emas.
Qayta otish sodir bo'lganda, keyingi o'rab olingan sinash bloki qayta tashlangan istisnoni aniqlaydi,
va bu try blokining catch bloklari uni boshqarishga harakat qiladi. Bunday holda, keyingi qo'shimchani sinab ko'ring
blok asosiy usulda 8-11 qatorlarda joylashgan. Qayta tiklangan istisno ko'rib chiqilishidan oldin,
ammo, finally bloki (37-40-qatorlar) bajariladi. Keyin asosiy usul ni aniqlaydi
urinib ko'rish blokida istisno qayta ochiladi va uni catch blokida boshqaradi (12-15-qatorlar).
Keyinchalik, asosiy qo'ng'iroqlar usuli doesNotThrowException (17-qator). Hech qanday istisno yo'q
doesNotThrowException ning sinash blokida (49–52-qatorlar), shuning uchun dastur ushlashni o'tkazib yuboradi
blok (53-56-qatorlar), lekin oxirgi blok (57-61-qatorlar) shunga qaramay bajariladi. Boshqaruv
finally blokdan keyin bayonotga o'tadi (63-qator). Keyin boshqaruv asosiyga qaytadi
va dastur tugaydi.

Dasturiy ta'minot muhandisligi kuzatuvi 11.9


Istisno muammo haqida ma'lumotni o'z ichiga olmagan holda tashlanishi mumkin
sodir bo'ldi. Bunday holda, ma'lum bir turdagi istisno sodir bo'lganligini bilish oddiygina bo'lishi mumkin
ishlov beruvchiga muammoni to'g'ri qayta ishlash uchun etarli ma'lumotni taqdim eting.

Dasturiy ta'minot muhandisligi kuzatuvi 11.10


Konstruktor parametrlari mavjud emasligini ko'rsatish uchun konstruktorlardan istisnolarni tashlang
valid - bu ob'ektni noto'g'ri holatda yaratishni oldini oladi.

Umumiy dasturlash xatosi 11.4


Nazorat finally blokiga va finally blokiga kirganda istisno ushlanmagan bo'lsa
blok finally blokida ushlanmagan istisnoni tashlaydi, birinchi istisno bo'ladi
yo'qoladi va finally blokidagi istisno chaqiruv usuliga qaytariladi.
Xatolarning oldini olish bo'yicha maslahat 11.6
Istisno keltirishi mumkin bo'lgan finally blok kodini joylashtirishdan saqlaning. Agar bunday kod qayta bo'lsa
so'ralganda, kodni sinab ko'ring... finally blokida tuting.
Umumiy dasturlash xatosi 11.5
Agar catch blokidan chiqarilgan istisno ushbu catch bloki tomonidan qayta ishlanadi deb faraz qiling
yoki xuddi shu try iborasi bilan bog'langan boshqa har qanday catch bloki mantiqiy xatolarga olib kelishi mumkin.
Yaxshi dasturlash amaliyoti 11.1
Istisnolarni qayta ishlash dastur kodining asosiy qatoridan xatoliklarni qayta ishlash kodini olib tashlaydi
dastur ravshanligini oshirish. Har bir bayonot atrofida urinmang… tuting…
istisno qilishi mumkin. Bu o'qish qobiliyatini pasaytiradi. To'g'rirog'i, a atrofida bitta urinib ko'rish blokini joylashtiring
kodingizning muhim qismini, har bir mumkin bo'lgan tutqich bloklari bilan sinab ko'ring
istisno va catch bloklarini bitta finally bloki bilan kuzatib boring (agar kerak bo'lsa).

11.7 Stackni ochish va istisno ob'ektdan ma'lumot olish 459

11.7 Stackni ochish va undan ma'lumot olish
Istisno ob'ekt
Istisno tashlansa, lekin ma'lum bir doirada ushlanmagan bo'lsa, usul chaqiruvi stekidir
“ochiladi” va keyingi tashqi urinish blokida istisnoni ushlashga harakat qilinadi.
Bu jarayon stekni ochish deb ataladi. Usul chaqiruv stekini yechish shuni anglatadiki
Istisno ushlanmagan usul tugaydi, bu usuldagi barcha mahalliy o'zgaruvchilar
od doiradan chiqib ketadi va boshqaruv dastlab ushbu usulni chaqirgan bayonotga qaytadi.
Agar try bloki ushbu bayonotni qamrab olsa, istisnoni qo'lga kiritishga harakat qilinadi. Agar urinib ko'rsangiz
blok bu bayonotni o'z ichiga olmaydi yoki istisno ushlanmasa, stekni yechish
yana yuzaga keladi. 11.6-rasmda stekni yechish va istisno ishlov beruvchisi ko'rsatilgan
main istisno ob'ektidagi ma'lumotlarga qanday kirishni ko'rsatadi.

Stack yechish


Asosan, try bloki (8-11-qatorlar) metod1 ni chaqiradi (35-38-qatorlarda e'lon qilingan), bu esa o'z navbatida
Metod2 ni chaqiradi (41-44-qatorlarda e'lon qilingan), bu esa o'z navbatida usul 3-ni chaqiradi (47-satrlarda e'lon qilingan)
50). Metod3 ning 49-qatori Exception ob'ektini tashlaydi - bu tashlash nuqtasi. Chunki
49-satrdagi throw bayonoti sinash blokiga kiritilmagan, stekni ochish sodir bo'ladi—
Metod3 49-satrda tugaydi, so'ngra boshqaruvni 2-metoddagi iboraga qaytaradi.
chaqirilgan usul3 (ya'ni, 43-qator). Hech qanday try bloki 43-qatorni o'z ichiga olmagani uchun, stekni ochish ok-
yana curs — 2-usul 43-satrda tugaydi va boshqaruvni 1-usuldagi bayonotga qaytaradi
u chaqirilgan usul2 (ya'ni, 37-satr). Hech qanday try bloki 37-qatorni qamrab olmagani uchun stekni yechish
yana bir marta sodir bo'ladi - 1-usul 37-satrda tugaydi va boshqaruvni bayonotga qaytaradi
1-usulni chaqirgan main ichida (ya'ni, 10-qator). 8–11-qatorlardagi try bloki ushbu holatni qamrab oladi-
ment. Istisno ko'rib chiqilmadi, shuning uchun sinash bloki tugaydi va birinchi
mos keladigan catch bloki (12–31-qatorlar) istisnoni ushlaydi va qayta ishlaydi. Agar yo'q bo'lsa
taalukli catch bloklari, va istisno uni uradi har bir usuli e'lon emas, a
kompilyatsiya xatosi yuzaga keladi. Esda tutingki, bu har doim ham shunday emas - belgilanmaganlar uchun
istisnolar, ilova kompilyatsiya qilinadi, lekin u kutilmagan natijalar bilan ishlaydi.

1 // 11.6-rasm: UseExceptions.java


2 // Stackni ochish va istisno ob'ektidan ma'lumotlarni olish.
3
4 umumiy sinf UseExceptions
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 urinib ko'ring
9 {
10
11 }
12 catch (Istisno istisno) // catch istisno usuli 1 da tashlangan
13 {
14 System.err.printf("%s%n%n", );
15
16

11.6-rasm | Stackni ochish va istisno ob'ektidan ma'lumotlarni olish. (2-qismning 1-qismi.)

usul1();

exception.getMessage()

exception.printStackTrace();

460 11-bob Istisnolardan foydalanish: chuqurroq qarash

17 // stack-trace ma'lumotlarini oling
18
19
20 System.out.printf("getStackTrace dan %nStack izi:%n");
21 System.out.println("Class\t\tFile\t\t\tLine\tMethod");
22
23 // istisno tavsifini olish uchun traceElements orqali aylantiring
24 uchun (StackTraceElement elementi: traceElements)
25 {
26 System.out.printf("%s\t", );
27 System.out.printf("%s\t", );
28 System.out.printf("%s\t", );
29 System.out.printf("%s%n", );
30 }
31 }
32 } // asosiyni tugatish
33
34 // chaqiruv usuli2; istisnolarni asosiyga qaytaring
35 umumiy statik bekor usuli1()
36 {
37
38 }
39
40 // chaqiruv usuli3; 1-usulga istisnolarni qaytaring
41 umumiy statik bekor usuli2()
42 {
43
44 }
45
46 // Istisnoni 2-metodga qaytaring
47 umumiy statik bekor usuli3()
48 {
49
50 }
51 } // Exceptions foydalanish sinfini tugatish

3-usulda berilgan istisno

java.lang.Exception: 3-usulda berilgan istisno
UseExceptions.method3 da (UsingExceptions.java:49)
UseExceptions.method2 da (UsingExceptions.java:43)
UseExceptions.method1 da (UsingExceptions.java:37)
UseExceptions.main da (UsingExceptions.java:10)

getStackTrace-dan stek izi:


Class File Line usuli
Istisnolardan foydalanishExceptions.java 49 usuli3
Istisnolardan foydalanishExceptions.java 43 usuli2
Istisnolardan foydalanishExceptions.java 37 usuli1
UseExceptions UseExceptions.java 10 asosiy

11.6-rasm | Stackni ochish va istisno ob'ektidan ma'lumotlarni olish. (2-qismning 2-qismi.)

StackTraceElement[] traceElements = exception.getStackTrace();

element.getClassName()


element.getFileName()
element.getLineNumber()
element.getMethodName()

Exception ni chiqaradi

usul 2();

Exception ni chiqaradi

usul3();

Exception ni chiqaradi

throw new Exception("3-metodda tashlangan istisno");

11.8 Zanjirlangan istisnolar 461

Istisno ob'ektdan ma'lumotlarni olish
Barcha istisnolar printStackTrace usuliga ega bo'lgan Throwable sinfidan kelib chiqadi
stek izini standart xato oqimiga chiqaradi (11.2-bo'limda muhokama qilingan). Ko'pincha bu
sinov va disk raskadrovkada yordam beradi. Class Throwable, shuningdek, getStackTrace usulini taqdim etadi -
printStackTrace tomonidan chop etilishi mumkin bo'lgan stack-trace ma'lumotlarini oladigan od.
Class Throwable-ning getMessage usuli istisnoda saqlangan tavsiflovchi qatorni qaytaradi.

11.6-rasmdagi (12–31-qatorlar) tutib olish ishlov beruvchisi getMessage, print-


StackTrace va getStackTrace. Agar biz stack-trace ma'lumotlarini chiqarmoqchi bo'lsak
standart xato oqimidan boshqa oqimlar uchun biz qaytarilgan ma'lumotlardan foydalanishimiz mumkin
getStackTrace va uni boshqa oqimga chiqaring yoki haddan tashqari yuklangan versiyalaridan birini ishlating
printStackTrace usuli. Ma'lumotlarni boshqa oqimlarga yuborish 15-bobda muhokama qilinadi.
14-qator istisno tavsifini olish uchun istisnoning getMessage usulini chaqiradi.
15-qator stek izini chiqarish uchun istisnoning printStackTrace usulini chaqiradi.
istisno qaerda sodir bo'lganligini ko'rsatadi. 18-qator istisnoning getStackTrace-ni chaqiradi
Stack-trace ma'lumotlarini StackTraceElement ob'ektlari massivi sifatida olish usuli.
24-30 qatorlar massivdagi har bir StackTraceElementni oladi va uning getClass- usullarini chaqiradi.
Name, getFileName, getLineNumber va getMethodName sinf nomini, fayl nomini,
ushbu StackTraceElement uchun mos ravishda satr raqami va usul nomi. Har bir stack-
TraceElement metod chaqiruvi stekidagi bir usul chaqiruvini ifodalaydi.
Dasturning chiqishi shuni ko'rsatadiki, printStackTrace chiqishi quyidagi naqshga amal qiladi: class-
Name.methodName(fileName:lineNumber), bu yerda sinf nomi, usul nomi va fayl nomi
istisno sodir bo'lgan sinf, usul va fayl nomlarini ko'rsating.
tively va lineNumber faylning qayerda istisno sodir bo'lganligini ko'rsatadi. Siz buni ko'rdingiz
11.2-rasm uchun chiqishda. GetStackTrace usuli istisnolarni maxsus qayta ishlashga imkon beradi.
haqida ma'lumot. PrintStackTrace chiqishini yaratilgan natija bilan solishtiring
StackTraceElements ikkalasida ham bir xil stack-trace ma'lumotlari mavjudligini ko'rish uchun.

11.8 Zanjirlangan istisnolar


Ba'zan usul istisnoga boshqa istisno turini tashlash orqali javob beradi
bu joriy ilovaga xos. Agar catch bloki yangi istisno qilsa, asl-

Xatolarning oldini olish bo'yicha maslahat 11.7


Ilovada ushlanmagan istisno Java-ning standart istisno ishlovchisiga sabab bo'ladi
yugur. Bu istisno nomini, muammoni ko'rsatadigan tavsiflovchi xabarni ko'rsatadi
sodir bo'lgan va to'liq bajarilish stekining izi. Bitta ipli dasturda
bajarilgandan so'ng, ariza tugatiladi. Bir nechta ipli dasturda ip
istisnoning tugashiga sabab bo'lgan. Biz 23-bobda ko'p ish zarralarini muhokama qilamiz.
Xatolarning oldini olish bo'yicha maslahat 11.8
Throwable usuli toString (barcha Throwable pastki sinflar tomonidan meros qilib olingan) Stringni qaytaradi
istisno sinfining nomi va tavsiflovchi xabarni o'z ichiga oladi.

Dasturiy ta'minot muhandisligi kuzatuvi 11.11


Vaqti-vaqti bilan catch ishlov beruvchisini yozish orqali istisnoga e'tibor bermaslikni xohlashingiz mumkin
bo'sh tana. Buni qilishdan oldin, istisno shartni ko'rsatmasligiga ishonch hosil qiling
stek yuqoriroq kod haqida bilishni yoki undan tiklanishni xohlashi mumkin.

462 11-bob Istisnolardan foydalanish: chuqurroq qarash

inal istisno ma'lumotlari va stek izi yo'qoladi. Avvalgi Java versiyalarida №
original istisno ma'lumotlarini yangi istisno ma'lumotlari bilan o'rash mexanizmi
Asl muammo qayerda sodir bo'lganligini ko'rsatadigan to'liq stek izini taqdim etish. Bu
bunday muammolarni tuzatishni ayniqsa qiyinlashtirdi. Zanjirlangan istisnolar sobiq
ception ob'ekti asl nusxadan to'liq stack-trace ma'lumotlarini saqlab qolish uchun.
tion. 11.7-rasmda zanjirli istisnolar ko'rsatilgan.

1 // 11.7-rasm: UseChainedExceptions.java


2 // Zanjirlangan istisnolar.
3
4 umumiy sinf UseChainedExceptions
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 urinib ko'ring
9 {
10
11 }
12
13 {
14 exception.printStackTrace();
15 }
16 }
17
18 // chaqiruv usuli2; istisnolarni asosiyga qaytaring
19 umumiy statik bekor usuli1()
20 {
21 urinib ko'ring
22 {
23
24 } // urinishni tugatish
25
26 {
27
28 }
29 }
30
31 // chaqiruv usuli3; 1-usulga istisnolarni qaytaring
32 umumiy statik bekor usuli2()
33 {
34 urinib ko'ring
35 {
36
37 }
38
39 {
40
41 }
42 }
43

11.7-rasm | Zanjirlangan istisnolar. (2-qismning 1-qismi.)

usul1();

catch (Istisno istisno) // 1-metoddan chiqarilgan istisnolar

Exception ni chiqaradi

usul 2();

catch (Istisno istisno) // 2-metoddan istisno

throw new Exception("1-usulda tashlangan istisno", istisno);

Exception ni chiqaradi

usul3();


catch (Istisno istisno) // 3-usuldan istisno

throw new Exception("Metod 2 da tashlangan istisno", istisno);


11.8 Zanjirlangan istisnolar 463

Dasturni boshqarish oqimi
Dastur to'rtta usuldan iborat - asosiy (6-16-qatorlar), usul 1 (19-29-qatorlar),
usul2 (32-42-qatorlar) va usul3 (45-48-qatorlar). Asosiy usulning try blokidagi 10-qator
chaqiruv usuli 1. Metod1 ning try blokirovkasi chaqiruvlari usuli 2 dagi 23-qator. Metod2ning urinishidagi 36-qator
Qo'ng'iroqlarni bloklash usuli 3. 3-usulda 47-satr yangi Istisnoni chiqaradi. Chunki bu bayonot
sinash blokida emas, usul3 tugaydi va istisno chaqiruvga qaytariladi
usul (metod2) 36-satrda. Bu bayonot try blokida; shuning uchun try bloki
tugatiladi va istisno 38-41 qatorlarda tutiladi. Tutish blokidagi 40-qator uradi
yangi istisno. Bu holda ikkita argumentli Exception konstruktori chaqiriladi. The
ikkinchi argument muammoning asl sababi bo'lgan istisnoni ifodalaydi. In
bu dastur, o'sha istisno 47-satrda sodir bo'lgan. Chunki istisno dan tashlanadi
catch bloki, usul2 tugatadi va chaqiruv usuliga yangi istisnoni qaytaradi
(metod1) 23-qatorda. Yana bir bor ta'kidlaymizki, bu bayonot try blokida, shuning uchun try bloki termini-
nates va istisno 25-28 qatorlarda tutilgan. Tutish blokidagi 27-qator yangisini tashlaydi
istisno va Istisnoning ikkinchi argumenti sifatida tutilgan istisnodan foydalanadi
konstruktor. Catch blokidan istisno chiqarilganligi sababli 1-metod tugaydi
va 10-qatordagi chaqiruv usuliga (asosiy) yangi istisnoni qaytaradi. Sinab ko'rish bloki
asosiy tugaydi va istisno 12-15 qatorlarda tutiladi. 14-qator stek izini chop etadi.

Dastur chiqishi


Dasturning chiqishida birinchi uchta qatorda eng so'nggi istisno ko'rsatilganiga e'tibor bering
tashlandi (ya'ni, 27-qatordagi 1-usuldan). Keyingi to'rt qator istisnolarni ko'rsatadi -
40-satrda 2-usuldan tashlangan tion. Nihoyat, oxirgi to'rtta qator eski
47-satrda method3 dan tashlangan ception. Shuningdek, chiqishni o'qiyotganingizda, bunga e'tibor bering
teskari, yana qancha zanjirli istisnolar qolganligini ko'rsatadi.

44 // Istisnoni 2-metodga qaytaring


45 umumiy statik void method3() Istisnoni tashlaydi
46 {
47
48 }
49 } // so'nggi sinf UseChainedExceptions

java.lang.Exception: 1-usulda berilgan istisno


UseChainedExceptions.method1 da (UsingChainedExceptions.java:27)
UseChainedExceptions.main da (UsingChainedExceptions.java:10)
Sababi: java.lang.Exception: 2-usulda berilgan istisno
UseChainedExceptions.method2 da (UsingChainedExceptions.java:40)
UseChainedExceptions.method1 da (UsingChainedExceptions.java:23)
... yana 1 ta
Sababi: java.lang.Exception: 3-usulda berilgan istisno
UseChainedExceptions.method3 da (UsingChainedExceptions.java:47)
UseChainedExceptions.method2 da (UsingChainedExceptions.java:36)
... yana 2 ta

11.7-rasm | Zanjirlangan istisnolar. (2-qismning 2-qismi.)

throw new Exception("3-metodda tashlangan istisno");

464 11-bob Istisnolardan foydalanish: chuqurroq qarash

11.9 Yangi istisno turlarini e'lon qilish
Ko'pgina Java dasturchilari Java API, uchinchi tomon ishlab chiqaruvchilari va mavjud sinflaridan foydalanadilar
Java dasturlarini yaratish uchun bepul mavjud sinf kutubxonalari (odatda Internetdan yuklab olinadi)
kationlar. Ushbu sinflarning usullari odatda tegishli istisnolarni tashlash uchun e'lon qilinadi -
muammolar yuzaga kelganda. Siz ushbu mavjud istisnolarni qayta ishlaydigan kodni yozasiz
dasturlaringizni yanada mustahkam qiling.
Agar siz boshqa dasturchilar foydalanadigan sinflarni yaratsangiz, buni e'lon qilish ko'pincha o'rinli bo'ladi
boshqa qachon yuzaga kelishi mumkin bo'lgan muammolarga xos bo'lgan o'zingizning istisno sinflaringiz
dasturchi sizning qayta foydalanish mumkin bo'lgan sinflaringizdan foydalanadi.
Yangi istisno turi mavjudni kengaytirishi kerak
Yangi istisno sinf mavjud bo'lgan istisno sinfini kengaytirishi kerak
istisnolar bilan ishlash mexanizmi bilan foydalanish mumkin. Istisno sinf har qanday boshqa sinfga o'xshaydi;
biroq, odatiy yangi istisno sinfi faqat to'rtta konstruktorni o'z ichiga oladi:
• argumentlarni qabul qilmaydigan va standart xato xabari Stringni su-
perclass konstruktori
• moslashtirilgan xato xabarini String sifatida qabul qiladigan va uni su-
perclass konstruktori
• moslashtirilgan xato xabarini String va Throwable (uchun
zanjirli istisnolar) va ikkalasini ham superklass konstruktoriga o'tkazadi
• Otish mumkin bo'lgan (zanjirli istisnolar uchun) va uni super-ga uzatuvchi
sinf konstruktori.

Maxsus istisno sinfiga misol


21-bobda, Shaxsiy umumiy ma'lumotlar tuzilmalarida biz maxsus eski ma'lumotlarga misol keltiramiz.
qabul qilish klassi. Biz qayta foydalanish mumkin bo'lgan Ro'yxat deb nomlangan sinfni e'lon qilamiz, u qayta ro'yxatlar ro'yxatini saqlashga qodir.
ob'ektlarga taalluqli. Odatda Ro'yxatda bajariladigan ba'zi operatsiyalarga ruxsat berilmaydi
Roʻyxat boʻsh, masalan, roʻyxatning old yoki orqa qismidan biror narsani olib tashlash. Shu sababli,
ba'zi Ro'yxat usullari EmptyListException istisno sinfining istisnolarini chiqaradi.

Yaxshi dasturlash amaliyoti 11.2


Har bir turdagi jiddiy bajarilish vaqtidagi nosozlikni tegishli nom bilan bog'lash
Istisno klassi dastur ravshanligini yaxshilaydi.

Dasturiy ta'minot muhandisligi kuzatuvi 11.12


O'zingizning istisno turini belgilashda Java-dagi mavjud istisno sinflarini o'rganing
API va tegishli istisno sinfini kengaytirishga harakat qiling. Masalan, agar siz yangi sinf yaratayotgan bo'lsangiz
Agar usul nolga bo'linishga harakat qilganda, sinfni kengaytirishingiz mumkin
ArithmeticException, chunki arifmetika paytida nolga bo'linish sodir bo'ladi. Agar mavjud bo'lsa
sinflar sizning yangi istisno sinfingiz uchun mos yuqori sinflar emas, o'zingizga qaror qiling
yangi sinf tekshirilgan yoki belgilanmagan istisno sinfi bo'lishi kerak. Agar mijozlar talab qilinishi kerak bo'lsa
istisnoni hal qilish uchun yangi istisno klassi tekshirilgan istisno bo'lishi kerak (ya'ni, kengaytirish
Istisno, lekin RuntimeException emas). Mijoz ilovasi qila olishi kerak
bunday istisnodan oqilona tiklanadi. Agar mijoz kodi buni e'tiborsiz qoldirishi kerak bo'lsa
istisno (ya'ni, istisno belgilanmagan), yangi istisno sinfi kengayishi kerak
RuntimeException.

11.10 Old shartlar va keyingi shartlar 465



11.10 Old shartlar va keyingi shartlar
Dasturchilar kodni saqlash va tuzatish uchun ko'p vaqt sarflashadi. Fa-
Ushbu vazifalarni hal qilish va umumiy dizaynni yaxshilash uchun siz kutilgan holatlarni belgilashingiz mumkin
usulning bajarilishidan oldin va keyin. Bu holatlar oldingi shartlar va keyingi shartlar deb ataladi.
navbati bilan.
Old shartlar
Usul chaqirilganda old shart to'g'ri bo'lishi kerak. Old shartlar cheklovlarni tavsiflaydi
usul parametrlari va joriy holatga oid boshqa taxminlar
dasturning bajarilishi boshlanishidan oldin. Agar old shartlar bajarilmasa, usul
odning xatti-harakati aniqlanmagan - u istisno qilishi, noqonuniy qiymatga ega bo'lishi yoki
xatodan xalos bo'lishga vasvasaga soling. Agar doimiy xatti-harakatni kutmasligingiz kerak
old shartlar qondirilmaydi.
Keyingi shartlar
Usul muvaffaqiyatli qaytgandan so'ng, keyingi shart haqiqiy hisoblanadi. Keyingi shartlar shartlarni tavsiflaydi
Qaytish qiymatidagi cheklovlar va usulning boshqa nojo'ya ta'sirlari. Aniqlashda
Boshqalar nima kutishlarini bilishlari uchun barcha keyingi shartlarni hujjatlashtirishingiz kerak
ular sizning usulingizni chaqirganda, va sizning usulingiz uning barchasini hurmat qilishiga ishonch hosil qilishingiz kerak
agar uning old shartlari haqiqatan ham bajarilgan bo'lsa, keyingi shartlar.
Old shartlar yoki keyingi shartlar bajarilmaganda istisnolarni tashlash
Agar ularning oldingi shartlari yoki keyingi shartlari bajarilmasa, usullar odatda istisno qiladi:
lar. Misol sifatida, bitta int parametriga ega bo'lgan charAt String usulini ko'rib chiqing
Stringdagi indeks. Old shart uchun charAt usuli indeksni kattaroq deb hisoblaydi
dan yoki nolga teng va String uzunligidan kichik. Agar old shart bajarilsa,
postcondition, usul belgini Stringdagi pozitsiyaga qaytarishini bildiradi
parametr indeksi bilan belgilanadi. Aks holda, usul IndexOutOfBounds-ni chiqaradi.
Istisno. Ishonamizki, charAt usuli uning keyingi shartlarini qondiradi, agar biz
old shartni bajarish. Usulning qanday ishlashi haqida tafsilotlar bilan tashvishlanishimiz shart emas.
indeksdagi belgini to'liq qaytarib oladi.
Odatda, usulning oldingi va keyingi shartlari uning bir qismi sifatida tavsiflanadi
spetsifikatsiya. O'z uslublaringizni loyihalashda siz old shartlarni va
usul deklaratsiyasidan oldin izohdagi postshartlar.
11.11 Tasdiqlashlar
Sinfni amalga oshirish va disk raskadrovka qilishda ba'zan shartlarni aytish foydali bo'ladi
usulning ma'lum bir nuqtasida to'g'ri bo'lishi kerak. Ta'kidlar deb ataladigan bu shartlar yordam beradi
potentsial xatolarni aniqlash va mumkin bo'lgan mantiqiy xatolarni aniqlash orqali dasturning haqiqiyligini ta'minlash
rivojlanish davrida. Old shartlar va keyingi shartlar ikki xil tasdiqdir. Oldindan
shartlar - bu usul chaqirilganda dasturning holati to'g'risidagi da'volar va keyin
Ditions - bu usul tugagandan so'ng uning holati to'g'risidagi da'volar.

Yaxshi dasturlash amaliyoti 11.3


An'anaga ko'ra, barcha istisno klass nomlari Exception so'zi bilan tugashi kerak.

466 11-bob Istisnolardan foydalanish: chuqurroq qarash

Da'volar dasturni ishlab chiqishda sizga yo'l-yo'riq ko'rsatadigan izoh sifatida ifodalanishi mumkin -
ment, Java tasdiqlash dasturini tasdiqlash uchun assert bayonotining ikkita versiyasini o'z ichiga oladi.
ma'noda. Assert bayonoti mantiqiy ifodani baholaydi va agar noto'g'ri bo'lsa, an ni chiqaradi
AssertionError (xatoning kichik klassi). Assert bayonotining birinchi shakli

ifoda noto'g'ri bo'lsa, AssertionError ni chiqaradi. Ikkinchi shakl

u ifoda1 ni baholaydi va xato sifatida ifoda2 bilan AssertionError ni chiqaradi
agar ifoda1 noto'g'ri bo'lsa, xabar.
Old shartlar va keyingi shartlar dasturini amalga oshirish uchun tasdiqlashlardan foydalanishingiz mumkin.
qo'ng'iroq qilish yoki kodingiz mavjudligini ta'minlashga yordam beradigan boshqa oraliq holatlarni tekshirish uchun
to'g'ri ishlash. 11.8-rasmda assert bayonoti ko'rsatilgan. 11-qator so'raydi
foydalanuvchi 0 dan 10 gacha raqamni kiritadi, keyin 12-qator raqamni o'qiydi. 15-qator to'xtatadi -
foydalanuvchi raqamni joriy diapazonga kiritganligini tekshiradi. Agar raqam tashqarida bo'lsa
diapazon, assert bayonoti xato haqida xabar beradi; aks holda dastur odatdagidek davom etadi.

Siz da'volardan birinchi navbatda dasturdagi mantiqiy xatolarni tuzatish va aniqlash uchun foydalanasiz.


tion. Dasturni bajarishda tasdiqlarni aniq yoqishingiz kerak, chunki ular kamaytiradi

ifodani tasdiqlash;

ifodani tasdiqlang1 : ifoda2;

1 // 11.8-rasm: AssertTest.java


2 // Qiymat diapazonda ekanligini tasdiqlash bilan tekshirish
3 import java.util.Scanner;
4
5 ommaviy sinf AssertTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 Skaner kiritish = yangi Skaner(System.in);
10
11 System.out.print("0 dan 10 gacha raqamni kiriting: ");
12 int raqami = input.nextInt();
13
14 // qiymat >= 0 va <= 10 ekanligini tasdiqlang
15 assert (raqam >= 0 && raqam <= 10) : "yomon raqam: " + raqam;
16
17 System.out.printf("Siz %d%n kiritdingiz", raqam);
18 }
19 } // yakuniy sinf AssertTest

0 dan 10 gacha bo'lgan raqamni kiriting: 5


Siz 5 ni kiritdingiz

0 dan 10 gacha bo'lgan raqamni kiriting: 50


"Main" java.lang.AssertionError mavzusidagi istisno: noto'g'ri raqam: 50
AssertTest.main da (AssertTest.java:15)

11.8-rasm | Qiymat diapazon ichida ekanligini tasdiqlash bilan tekshirish.


11.12 Resurslar bilan sinash: Resurslarni avtomatik taqsimlash 467

unumdorligi va dastur foydalanuvchisi uchun keraksiz. Buning uchun java com-dan foydalaning.
mandning -ea buyruq qatori opsiyasi, kabi

11.12 Resurslar bilan sinab ko'ring: Avtomatik manba


Ajratish
Odatda resursni chiqarish kodi resurs mavjudligini ta'minlash uchun final blokiga joylashtirilishi kerak
resursda foydalanilganda istisnolar mavjudmi yoki yo'qligidan qat'i nazar, chiqariladi
mos keladigan sinash bloki. Muqobil belgi - manbalarni sinab ko'rish bayonoti (in-
Java SE 7 da taqdim etilgan) - bir yoki bir nechta resurs olishingiz mumkin bo'lgan kod yozishni soddalashtiradi.
es, ularni sinab ko'rish blokida foydalaning va ularni tegishli final blokida qoldiring. Uchun
Masalan, fayllarni qayta ishlash dasturi manbalar bilan harakat qilish holatiga ega faylni qayta ishlashi mumkin.
Fayl kerak bo'lmaganda to'g'ri yopilishini ta'minlash uchun - biz ko'rsatamiz
Bu 15-bobda.
Yopiladigan interfeys va shuning uchun yaqin usulni ta'minlaydi. Urinishning umumiy shakli
resurslar bayonoti

Bu erda ClassName - bu AutoCloseable interfeysini amalga oshiradigan sinf. Bu kod yaratadi


ClassName tipidagi ob'ekt va uni try blokida ishlatadi, so'ngra o'zining yaqin usulini chaqiradi
ob'ekt tomonidan ishlatiladigan har qanday resurslarni ozod qilish. Resurslarni sinab ko'rish bayonoti bilvosita chaqiradi
try blokining oxiridagi theObject ning yopish usuli. Siz bir nechta qayta ajratishingiz mumkin
Qavslar ichidagi manbalarni nuqta-vergul (;) bilan ajratib ko'ring. Siz
15 va 24-boblardagi manbalarni sinab ko'rish bayonoti misollariga qarang.
11.13 Yakunlash
Ushbu bobda siz xatolarni bartaraf etish uchun istisnolardan qanday foydalanishni o'rgandingiz. Siz o'rgandingiz
ushbu istisnolardan foydalanish xatoliklarni qayta ishlash kodini "asosiy satr" dan olib tashlash imkonini beradi.
dasturning bajarilishi haqida. Kodni kiritish uchun try bloklaridan qanday foydalanishni ko'rsatdik
istisno tashlash va yuzaga kelishi mumkin bo'lgan istisnolarni hal qilish uchun catch bloklaridan qanday foydalanish.
Siz istisnolardan foydalanishni tugatish modeli haqida bilib oldingiz, bu buni talab qiladi
istisno ko'rib chiqilgandan so'ng, dastur boshqaruvi otish nuqtasiga qaytmaydi. Biz yo'q qilamiz -

java -ea AssertTest


Dasturiy ta'minot muhandisligi kuzatuvi 11.13
Foydalanuvchilar AssertionErrorsga duch kelmasliklari kerak - ulardan faqat dastur davomida foydalanish kerak
rivojlanish. Shu sababli, siz AssertionErrors ni ushlamasligingiz kerak. Buning o'rniga ruxsat bering
dasturni o'chirib qo'ying, shunda siz xato xabarini ko'rishingiz, so'ngra manbani topib, tuzatishingiz mumkin
muammo. Ishlab chiqarish kodidagi ish vaqti muammolarini ko'rsatish uchun assert dan foydalanmasligingiz kerak (biz
ko'rsatish maqsadida 11.8-rasmda qilgan) - bu maqsadda istisno mexanizmidan foydalaning.

harakat qilib ko'ring (ClassName theObject = new ClassName())


{
// bu yerda theObject dan foydalaning
}
tutish (e istisno)
{
// resursdan foydalanishda yuzaga keladigan istisnolarni ushlang
}

468 11-bob Istisnolardan foydalanish: chuqurroq qarash

cussed checked va tekshirilmagan istisnolar va throws bandi bilan qanday belgilash kerak
usul tashlashi mumkin bo'lgan istisnolar.
Siz resurslarni bo'shatish uchun finally blokidan qanday foydalanishni o'rgandingiz
istisno sodir bo'ladi. Siz istisnolarni qanday tashlash va qayta o'rnatishni ham o'rgandingiz. Biz qanday qilib ko'rsatdik
printStackTrace, getStack- usullaridan foydalangan holda istisno haqida ma'lumot olish uchun
Trace va getMessage. Keyinchalik, biz zanjirli istisnolarni taqdim etdik, bu sizga o'rash imkonini beradi
yangi istisno ma'lumotlari bilan original istisno ma'lumotlari. Keyin qanday qilishni ko'rsatdik
o'zingizning istisno sinflaringizni yarating.
Biz dasturchilarga sizdan foydalanishga yordam berish uchun old shartlar va keyingi shartlarni kiritdik
Metodlar usul chaqirilganda va qachon to'g'ri bo'lishi kerak bo'lgan shartlarni tushunadi
mos ravishda qaytaradi. Agar old shartlar va keyingi shartlar bajarilmasa, usullar
istisnolarni chaqirish. Biz assert bayonotini va undan qanday yordam berishni muhokama qildik
dasturlaringizni disk raskadrovka qilasiz. Xususan, assert oldindan shartlarni ta'minlash uchun ishlatilishi mumkin
va keyingi shartlar bajariladi.
Shuningdek, biz bir xil turdagi istisnolarni qayta ishlash uchun multi-catchni joriy qildik
catch ishlov beruvchisi va resurs bilan urinib ko'ring bayonoti avtomatik ravishda ajratish a
resurs sinash blokida ishlatilgandan keyin. Keyingi bobda biz grafikni chuqurroq ko'rib chiqamiz -
foydalanuvchi interfeyslari (GUI).

Xulosa
11.1-bo'lim Kirish


• Istisno - bu dasturning bajarilishi jarayonida yuzaga keladigan muammoning belgisi.
• Istisnolarni qayta ishlash dasturchilarga istisnolarni hal qila oladigan ilovalar yaratish imkonini beradi.
11.2-bo'lim Misol: Nolga bo'lish istisnosiz ishlov berish
• Istisnolar (443-bet) usul muammoni aniqlab, uni bartaraf eta olmaganida chiqariladi.
• Istisno stek izi (444-bet) xabardagi istisno nomini o‘z ichiga oladi.
yuzaga kelgan muammo va istisno sodir bo'lgan paytdagi to'liq usul-chaqiriqlar to'plami.
• Dasturdagi istisno sodir bo'ladigan nuqtaga otish nuqtasi deyiladi (445-bet).
11.3-bo'lim Misol: Arifmetik istisnolardan foydalanish va InputMismatchEx-
tushunchalar
• Sinab ko'rish bloki (447-bet) istisnoga olib kelishi mumkin bo'lgan kodni va istisno qilmasligi kerak bo'lgan kodni o'z ichiga oladi.
bu istisno sodir bo'lsa ecute.
• Istisnolar sinash blokida aniq ko'rsatilgan kod orqali, boshqalarga qo'ng'iroqlar orqali paydo bo'lishi mumkin
usullar yoki hatto try blokidagi kod tomonidan boshlangan chuqur o'rnatilgan usul chaqiruvlari orqali.
• Catch bloki (448-bet) catch kalit so‘zi va istisno parametridan so‘ng blokdan boshlanadi.
istisnoni boshqaradigan kod. Bu kod try bloki istisnoni aniqlaganida bajariladi.
• Kamida bitta catch bloki yoki finally bloki (448-bet) sinash blokiga darhol amal qilishi kerak.
• Catch bloki qavslar ichida istisno turini aniqlaydigan istisno parametrini belgilaydi
tutqich. Parametr nomi catch blokiga ushlangan istisno ob'ekti bilan o'zaro ta'sir qilish imkonini beradi.
• Qo‘lga kiritilmagan istisno (449-bet) – mos keluvchi istisno bo‘lgan istisno.
bloklarni ushlash. Qo'lga kiritilmagan istisno, agar bu dasturga tegishli bo'lsa, dasturning erta tugatilishiga olib keladi.
faqat bitta ipni oladi. Aks holda, faqat istisno sodir bo'lgan mavzu tugaydi.
Dasturning qolgan qismi ishlaydi, lekin salbiy natijalarga olib kelishi mumkin.

Xulosa 469



• Multi-catch (449-bet) sizga bir nechta istisno turlarini bitta tutqich ishlovchisida va
har bir istisno turi uchun bir xil vazifani bajaring. Multi-catch uchun sintaksis:
tutish (1-tur | 2-tur | 3-tur e)
• Har bir istisno turi keyingisidan vertikal chiziq (|) bilan ajratiladi.
• Agar sinash blokida istisno yuzaga kelsa, sinash bloki darhol tugaydi va dasturni boshqarish
tashlanadigan istisno turiga mos keladigan parametr turi bilan birinchi catch blokiga o'tkazadi.
• Istisno ko'rib chiqilgandan so'ng, dastur boshqaruvi tashlash nuqtasiga qaytmaydi, chunki
try blokining muddati tugadi. Bu istisnolardan foydalanishni tugatish modeli sifatida tanilgan (449-bet).
• Agar istisno sodir bo'lganda bir nechta mos keladigan catch bloklari mavjud bo'lsa, faqat birinchisi bajariladi.
• Otish bandi (450-bet) usul mumkin bo'lgan istisnolar ro'yxatini vergul bilan ajratadi.
throw va usul parametrlari roʻyxatidan keyin va usul tanasidan oldin paydo boʻladi.
11.4-bo'lim Istisnolardan foydalanish qachon
• Istisnolarni qayta ishlash operator bajarilayotganda yuzaga keladigan sinxron xatolarni (451-bet) qayta ishlaydi.
• Istisnolarni qayta ishlash asinxron hodisalar bilan bog'liq muammolarni qayta ishlash uchun mo'ljallanmagan
(451-bet), ular dasturni boshqarish oqimi bilan parallel va undan mustaqil ravishda yuzaga keladi.
11.5-bo'lim Java istisno ierarxiyasi
• Barcha Java istisno sinflari Exception sinfidan bevosita yoki bilvosita meros qilib olinadi.
• Dasturchilar Java istisno ierarxiyasini o'zlarining istisno sinflari bilan kengaytirishlari mumkin.
• Class Throwable Exception sinfining yuqori sinfidir va shuning uchun ham barcha sobiq sinflarning yuqori sinfidir.
tushunchalar. Istisnolarni boshqarish mexanizmi bilan faqat tashlanadigan ob'ektlardan foydalanish mumkin.
• Class Throwable (451-bet) ikkita kichik sinfga ega: Istisno va Xato.
• Class Exception va uning quyi sinflari Java dasturida yuzaga kelishi mumkin bo'lgan muammolarni ifodalaydi
ilova tomonidan ushlangan.
• Sinf xatosi va uning quyi sinflari Java ish vaqti tizimida yuzaga kelishi mumkin bo'lgan muammolarni ifodalaydi.
Xatolar kamdan-kam uchraydi va odatda dastur tomonidan ushlanmasligi kerak.
• Java ikkita istisno toifasini ajratadi (452-bet): belgilangan va belgilanmagan.
• Java kompilyatori belgilanmagan istisno ushlangan yoki e'lon qilinganligini aniqlash uchun tekshirmaydi.
Tekshirilmagan istisnolarni odatda to'g'ri kodlash orqali oldini olish mumkin.
• RuntimeException quyi sinflari tekshirilmagan istisnolarni ifodalaydi. Meros olgan barcha istisno turlari
Exception sinfidan, lekin RuntimeException dan emas (452-bet) tekshiriladi.
• Agar catch bloki supersinf tipidagi istisno ob'ektlarini ushlash uchun yozilgan bo'lsa, u barcha ob'ektlarni ushlay oladi.
bu sinfning kichik sinflari ob'ektlari. Bu tegishli istisnolarni polimorfik qayta ishlash imkonini beradi.
11.6-bo'lim nihoyat Bloklash
• Resurslarning ma'lum turlarini oladigan dasturlar shunday deb atalmaslik uchun ularni tizimga qaytarishi kerak
resurslarning sizib chiqishi (454-bet). Resursni chiqarish kodi odatda finally blokiga joylashtiriladi (454-bet).
• Finally bloki ixtiyoriy. Agar u mavjud bo'lsa, u oxirgi ushlash blokidan keyin joylashtiriladi.
• Finally bloki mos keladigan urinishda istisno qilingan yoki yo'qligini bajaradi
blok yoki unga mos keladigan har qanday tutqich bloklari.
• Agar istisno o'sha sinash blokining bog'langan tutib olish ishlov beruvchilaridan biri tomonidan ushlana olmasa, boshqaring
final blokiga o'tadi. Keyin istisno keyingi tashqi sinash blokiga o'tkaziladi.
• Agar catch bloki istisno qilsa, finally bloki baribir bajariladi. Keyin istisno
keyingi tashqi sinash blokiga o'tdi.

470 11-bob Istisnolardan foydalanish: chuqurroq qarash



• Otish bayonoti (457-bet) har qanday Otish mumkin bo'lgan ob'ektni tashlashi mumkin.
• Istisnolar qayta ko'rib chiqiladi (458-bet).
u bu istisnoni qayta ishlay olmaydi yoki uni faqat qisman qayta ishlay oladi. Qayta otish a
istisno istisnolar bilan ishlashni (yoki uning bir qismini) boshqa catch blokiga kechiktiradi.
• Qayta otish sodir bo'lganda, keyingi qo'shilgan sinash bloki qayta tashlangan istisnoni aniqlaydi va bu
try block's catch bloklari uni boshqarishga harakat qiling.
11.7-bo'lim Stackni ochish va istisno ob'ektdan ma'lumot olish
• Istisno tashlansa, lekin ma'lum bir doirada ushlanmagan bo'lsa, usul chaqiruvi stegi un-
yaralanadi va keyingi tashqi try bayonotida istisnoni ushlashga harakat qilinadi.
• Class Throwable usuli chaqiruv stekini chop etuvchi printStackTrace usulini taklif etadi. Ko'pincha, bu
sinov va disk raskadrovkada yordam beradi.
• Class Throwable, shuningdek, bir xil stek-iz ma'lumotlarini oladigan getStackTrace usulini taqdim etadi.
printStackTrace tomonidan chop etilgan nashr (461-bet).
• Class Throwable-ning getMessage usuli (461-bet) istisnoda saqlangan tavsiflovchi satrni qaytaradi.
tion.
• getStackTrace usuli (461-bet) StackTrace massivi sifatida stek-trace ma'lumotlarini oladi.
Element ob'ektlari. Har bir StackTraceElement metod-chaqiruv stekidagi bitta usul chaqiruvini ifodalaydi.
• StackTraceElement usullari (461-bet) getClassName, getFileName, getLineNumber va get-
MethodName sinf nomini, fayl nomini, satr raqamini va usul nomini oladi.
11.8-bo'lim Zanjirlangan istisnolar
• Zanjirlangan istisnolar (462-bet) istisno ob'ektiga to'liq stek-izni saqlashga imkon beradi.
shakllantirish, shu jumladan joriy istisnoga sabab bo'lgan oldingi istisnolar to'g'risidagi ma'lumotlar.
11.9-bo'lim Yangi istisno turlarini e'lon qilish
• Yangi istisno sinfi mavjud istisnolar sinfini kengaytirishi kerak, bu sinfdan foydalanish mumkin bo'ladi
istisno bilan ishlash mexanizmi bilan.
11.10-bo'lim Old shartlar va keyingi shartlar
• Usul chaqirilganda usulning oldingi sharti (465-bet) to'g'ri bo'lishi kerak.
• Usulning keyingi sharti (465-bet) usul muvaffaqiyatli qaytgandan so‘ng rost bo‘ladi.
• O'z uslublaringizni loyihalashda a dagi old shartlar va keyingi shartlarni ko'rsatishingiz kerak
usul deklaratsiyasidan oldin izoh bering.
11.11-bo'lim Tasdiqlar
• Tasdiqlar (465-bet) potentsial xatolarni aniqlashga va mumkin bo'lgan mantiqiy xatolarni aniqlashga yordam beradi.
• Assert bayonoti (466-bet) tasdiqlarni dasturiy jihatdan tasdiqlash imkonini beradi.
• Ishlash vaqtida tasdiqlarni yoqish uchun java buyrug'ini ishga tushirganda -ea kalitidan foydalaning.
11.12-bo'lim Resurslarni sinab ko'rish: Resurslarni avtomatik taqsimlash
• Resurslarni sinab ko'rish bayonoti (467-bet) resurs oladigan kodni yozishni soddalashtiradi,
uni sinab ko'rish blokida foydalaning va resursni mos keladigan final blokida qoldiring. Buning o'rniga siz ajratasiz
try kalit so'zidan keyin qavs ichidagi manba va try blokidagi manbadan foydalaning;
keyin bayonot sinchkovlik bilan try blokining oxirida resursni yopish usulini chaqiradi.
• Har bir resurs AutoCloseable interfeysini amalga oshiradigan sinf ob'ekti bo'lishi kerak
(467-bet)—bunday sinf yaqin metodga ega.

O'z-o'zini tekshirish mashqlari 471



• Qavslar ichida bir nechta resurslarni ajratish mumkin, ularni a bilan ajratib ko'ring
nuqta-vergul (;).
O'z-o'zini tekshirish mashqlari
11.1 Istisnolarning beshta umumiy misolini keltiring.
11.2 Nima uchun istisnolar usullar bilan yuzaga kelgan xatolarni hal qilish uchun ayniqsa mos keladi?
Java API-dagi sinflar?
11.3 "Resurs oqib chiqishi" nima?
11.4 Agar sinab ko'rish blokida istisnolar qo'yilmasa, urinish paytida boshqaruv qayerga o'tadi
blok bajarilishini tugatadimi?
11.5 catch (Exception exceptionName) dan foydalanishning asosiy afzalliklarini bering.
11.6 An'anaviy dastur Xato obyektlarini ushlashi kerakmi? Tushuntirish.
11.7 Agar biror ushlagich otilgan ob'ekt turiga mos kelmasa nima bo'ladi?
11.8 Agar bir nechta tutqich bloklari tashlangan ob'ekt turiga mos kelsa nima bo'ladi?
11.9 Nima uchun dasturchi superklass turini catch blokidagi tur sifatida belgilaydi?
11.10 Finally bloklaridan foydalanishning asosiy sababi nima?
11.11 catch bloki Istisnoni tashlasa nima bo'ladi?
11.12 throw exceptionReference bayonoti catch blokida nima qiladi?
11.13 Sinov blokidagi mahalliy havola bilan nima sodir bo'ladi, agar bu blok Istisnoni tashlasa?
O'z-o'zini tekshirish mashqlariga javoblar
11.1 Xotiraning tugashi, massiv indeksi chegaradan tashqarida, arifmetik to'lib-toshish, nolga bo'linish, in-
Yaroqli usul parametrlari.
11.2 Java API-dagi sinflar usullari xatolarni qayta ishlashni amalga oshirishi dargumon
barcha foydalanuvchilarning noyob ehtiyojlarini qondiradi.
11.3 "Resursning oqishi" bajarilayotgan dastur resursni to'g'ri chiqarmasa sodir bo'ladi.
endi kerak bo'lmaganda.
11.4 Ushbu try bayonoti uchun catch bloklari o'tkazib yuboriladi va dastur ishlashni davom ettiradi.
oxirgi ushlash blokidan keyin. Agar finally bloki bo'lsa, u birinchi bo'lib bajariladi; keyin dastur davom etadi
finally blokdan keyin bajarilishi.
11.5 catch (Exception exceptionName) shakli sinashda berilgan har qanday turdagi istisnolarni ushlaydi.
blok. Afzallik shundaki, hech qanday tashlangan Istisno qo'lga tushmasdan o'tib keta olmaydi. Siz hal qila olasiz
istisno yoki uni qaytadan tashlang.
11.6 Xatolar odatda Java tizimidagi jiddiy muammolardir; ko'pchilik dasturlar bo'ladi
Xatolarni qo'lga olishni istamaydi, chunki ular ulardan tiklana olmaydi.
11.7 Bu o'yinni qidirishni keyingi qo'shimcha try bayonotida davom ettirishga olib keladi. Agar bor bo'lsa
finally bloki bo'lsa, u istisno keyingi biriktiruvchi try iborasiga o'tishdan oldin bajariladi.
Agar mos keladigan catch bloklari va istisnolar mavjud bo'lgan qo'shimcha try iboralari bo'lmasa
e'lon qilinadi (yoki belgilanmagan), stek izi chop etiladi va joriy oqim erta tugaydi. Agar
istisnolar tekshiriladi, lekin tutilmaydi yoki e'lon qilinmaydi, kompilyatsiya xatolari yuzaga keladi.
11.8 Sinov bloki bajarilgandan keyin birinchi mos keladigan catch bloki.

472 11-bob Istisnolardan foydalanish: chuqurroq qarash



11.9 Bu dasturga tegishli turdagi istisnolarni ushlash va ularni bir xilda qayta ishlash imkonini beradi
usul. Biroq, aniqroq istisnolar uchun kichik sinf turlarini alohida-alohida qayta ishlash foydali bo'ladi.
tion ishlov berish.
11.10 Nihoyat blok - bu resurslarning sizib chiqishini oldini olish uchun resurslarni chiqarish uchun afzal qilingan vosita.
11.11 Birinchidan, agar mavjud bo'lsa, boshqaruv finally blokiga o'tadi. Keyin istisno pro-
yopilgan try bloki (agar mavjud bo'lsa) bilan bog'langan catch bloki (agar mavjud bo'lsa) tomonidan o'chirilgan.
11.12 U sinash holatini qo'shuvchi istisno ishlovchisi tomonidan qayta ishlash uchun istisnoni qayta tiklaydi.
ment, joriy try operatorining finally blokidan keyin bajariladi.
11.13 Ma'lumot ko'rsatish doirasidan chiqib ketadi. Agar havola qilingan ob'ektga kirish imkoni bo'lmasa, ob'ekt
axlat yig'ish mumkin.
Mashqlar
11.14 (Istisno shartlar) Pro-da sodir bo'lgan turli istisno holatlarni sanab o'ting.
Ushbu matn davomida hozirgacha gramm. Iloji boricha ko'proq qo'shimcha istisno shartlarni sanab o'ting. Uchun
bularning har biri, dastur odatda istisnolardan foydalangan holda qanday ishlashini qisqacha tasvirlab bering.
Ushbu bobda ko'rib chiqilgan qabul qilish usullari. Odatdagi istisnolar nolga bo'linishni o'z ichiga oladi
va massiv indeksi chegaradan tashqarida.
11.15 (Istisnolar va konstruktor xatosi) Ushbu bobga qadar biz xatolar bilan shug'ullanganmiz
konstruktorlar tomonidan biroz noqulay deb topildi. Nima uchun istisnolardan foydalanish samarali vosita ekanligini tushuntiring
konstruktor xatosi bilan shug'ullanish uchun.
11.16 (Supersinflar bilan istisnolarni ushlash) Istisno superklass yaratish uchun merosdan foydalaning
(ExceptionA deb ataladi) va ExceptionB va ExceptionC istisno quyi sinflari, bu erda ExceptionB o'z ichiga oladi.
uning ExceptionA dan va ExceptionC ExceptionB dan meros oladi. Ko'rsatish uchun dastur yozing
ExceptionA turi uchun catch bloki ExceptionB va ExceptionC turlarining istisnolarini ushlaydi.
11.17 (Sinf istisnolaridan foydalangan holda istisnolarni qo'lga olish) qanday o'zgarishini ko'rsatadigan dastur yozing.
istisnolar bilan qo'lga olinadi
catch (istisno istisno)
Bu safar ExceptionA (Exception sinfidan meros) va ExceptionB (qaysi) sinflarini aniqlang.
ExceptionA sinfidan meros oladi). Dasturingizda turlardan istisnolarni tashlaydigan sinash bloklarini yarating
ExceptionA, ExceptionB, NullPointerException va IOException. Barcha istisnolar bo'lishi kerak
Exception turini ko'rsatuvchi catch bloklari bilan tutilgan.
11.18 (Qo'lga olish bloklari tartibi) Tutish bloklari tartibi quyidagicha ekanligini ko'rsatadigan dastur yozing.
muhim. Agar siz pastki sinf turidan oldin superklass istisno turini ushlashga harakat qilsangiz, kompilyator kerak
xatolar hosil qiladi.
11.19 (Konstruktor xatosi) Konstruktor haqida ma’lumot uzatayotganini ko‘rsatadigan dastur yozing.
konstruktorning istisno ishlovchisiga ishlamay qolishi. Istisnoni keltirib chiqaradigan SomeClass sinfini aniqlang
konstruktor. Sizning dasturingiz SomeClass tipidagi ob'ektni yaratishga harakat qilishi va oldingisini qo'lga kiritishi kerak.
konstruktordan chiqarilgan tushuncha.
11.20 (Istisnolarni qayta o'chirish) Istisnoni qayta o'chirishni ko'rsatadigan dastur yozing. Aniqlash
someMethod va someMethod2 usullari. SomeMethod2 usuli dastlab istisnoni qo'yishi kerak.
SomeMethod usuli someMethod2 ni chaqirishi, istisnoni ushlashi va uni qayta ishga tushirishi kerak. SomeMethod-ga qo'ng'iroq qiling
main usulidan va qayta o'rnatilgan istisnoni ushlang. Ushbu istisnoning stek izini chop eting.
11.21 (Tashqi doiralar yordamida istisnolarni ushlash) Usul o'z bilan ekanligini ko'rsatadigan dastur yozing.
o'z sinab ko'rish bloki sinashda yuzaga kelishi mumkin bo'lgan har qanday xatoni qo'lga kiritishi shart emas. Ba'zi istisnolar
boshqa sohalarga o'tishi va boshqa sohalarda ishlashi mumkin.

GUI komponentlari: 1-qism 12


Sizningcha, men kun bo'yi tinglay olamanmi?
bunday narsalarga?
- Lyuis Kerroll
Hatto hayotidagi kichik bir voqea
bola - bu bolaning hodisasi
dunyo va shuning uchun dunyo hodisasi.
- Gaston Bachelard
Siz pulingizni to'laysiz va siz
sizning tanlovingizni oladi.
— Musht

Oh maqsadlar


Ushbu bobda siz:
■ Nimbusdan qanday foydalanishni bilib oling
qarash va his qilish.
■ GUI yaratish va hodisalarni boshqarish
foydalanuvchi tomonidan yaratilgan
GUI bilan o'zaro aloqalar.
■ Paketlarni tushuning
GUI komponentlarini o'z ichiga olgan,
voqealarni boshqarish darslari va
interfeyslar.
■ Yarating va boshqaring
tugmalar, teglar, ro'yxatlar, matn
maydonlar va panellar.
■ Sichqoncha hodisalarini boshqarish va
klaviatura hodisalari.
■ uchun maket menejerlaridan foydalaning
GUI komponentlarini tartibga solish.

474 12-bob GUI komponentlari: 1-qism

12.1 Kirish
Grafik foydalanuvchi interfeysi (GUI) foydalanuvchi bilan muloqot qilish uchun qulay mexanizmni taqdim etadi
ilova. GUI ("GOO-ee" deb talaffuz qilinadi) ilovaga o'ziga xos "ko'rinish" beradi.
va - his qilish." GUI-lar GUI komponentlaridan qurilgan. Bu ba'zan boshqarish yoki deyiladi
vidjetlar — oyna gadjetlarining qisqartmasi. GUI komponenti - bu foydalanuvchi foydalanadigan ob'ekt
sichqoncha, klaviatura yoki boshqa kiritish shakli, masalan, ovozni aniqlash orqali o'zaro ta'sir qiladi.
Ushbu bobda va 22-bobda, GUI komponentlari: 2-qismda siz ko'p narsalar haqida bilib olasiz.
Java-ning javax.swing paketidan Swing GUI deb ataladigan komponentlari. Biz boshqalarni yopamiz
GUI komponentlari kitob davomida kerak bo'lganidek. 25 va ikkinchi bobda onlayn
boblarida JavaFX - Java-ning GUI, grafik va multimedia uchun eng so'nggi API-lari haqida bilib olasiz.

GUI dizayni uchun IDE-ni qo'llab-quvvatlash


Ko'pgina IDE-lar GUI dizayn vositalarini taqdim etadi, ular yordamida siz komponent o'lchamini belgilashingiz mumkin.
kation va boshqa atributlarni sichqoncha, klaviatura va tortish orqali vizual tarzda
va - tushirish. IDElar siz uchun GUI kodini yaratadi. Bu GUI yaratishni sezilarli darajada osonlashtiradi,
lekin har bir IDE bu kodni boshqacha ishlab chiqaradi. Shuning uchun biz GUI kodini yozdik
Ushbu bobdagi misollar uchun manba kodi fayllarida ko'rganingizdek. Biz sizni rag'batlantiramiz
o'zingiz yoqtirgan IDE(lar) yordamida har bir GUIni vizual tarzda yaratish.

12.1 Kirish


12.2 Java-ning Nimbus Look-and-Feel
12.3 Oddiy GUI-ga asoslangan kirish/chiqish bilan
JOptionPane
12.4 Swing komponentlarining umumiy ko'rinishi
12.5 a.da matn va tasvirlarni ko'rsatish
Oyna
12.6 Matn maydonlari va kirish
Hodisalarni ichki o'rnatilgan sinflar bilan boshqarish
12.7 Umumiy GUI hodisa turlari va
Tinglovchi interfeyslari
12.8 Hodisalarni boshqarish qanday ishlaydi
12.9 J tugmasi
12.10 Holatni saqlaydigan tugmalar
12.10.1 JCheckBox
12.10.2 JRadioButton

12.11 JComboBox; Anonimdan foydalanish


Voqealarni boshqarish uchun ichki sinf
12.12 JList
12.13 Ko'p tanlovli ro'yxatlar
12.14 Sichqoncha hodisalarini boshqarish
12.15 Adapterlar sinflari
12.16 JPanel bilan chizish uchun pastki sinf
Sichqoncha
12.17 Asosiy voqealarni boshqarish
12.18 Layout menejerlariga kirish
12.18.1 FlowLayout
12.18.2 BorderLayout
12.18.3 GridLayout
12.19 Ko'proq boshqarish uchun panellardan foydalanish
Kompleks maketlar
12.20 JTextArea
12.21 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish

Ko'rish va his qilish kuzatuvi 12.1
Turli ilovalarni izchil, intuitiv foydalanuvchi interfeysi komponentlari bilan ta'minlash imkonini beradi
foydalanuvchilar uni tezroq o'rganishlari uchun yangi dastur bilan tanishish hissini beradi
va undan unumliroq foydalaning.

12.2 Java-ning Nimbus Look-and-Feel 475

GUI namunasi: SwingSet3 demo ilovasi
GUIga misol sifatida SwingSet3 demo ilovasini ko'rsatadigan 12.1-rasmni ko'rib chiqing.
JDK demolari va namunalarini http://www.oracle.com/technetwork/ manzilidan yuklab oling.
java/javase/downloads/index.html. Ushbu ilova ko'rib chiqishning yaxshi usulidir
Java-ning Swing GUI API-lari tomonidan taqdim etilgan turli GUI komponentlari orqali. Shunchaki a tugmasini bosing
komponent nomi (masalan, JFrame, JTabbedPane va boshqalar) chap tomondagi GUI komponentlari maydonida
Win-ning o'ng tomonida GUI komponentining namoyishini ko'rish uchun oynaning
dow. Har bir demo uchun manba kodi g'olibning pastki qismidagi matn maydonida ko'rsatilgan.
dow. Biz ilovadagi GUI komponentlarining bir nechtasini belgilab oldik. Yuqori qismida
oyna - oynaning sarlavhasini o'z ichiga olgan sarlavha satri. Uning ostida menyu paneli mavjud
menyular (Fayl va Ko'rish). Oynaning yuqori o'ng qismida tugmalar to'plami mavjud - tip-
foydalanuvchilar vazifalarni bajarish uchun tugmalarni bosadilar. Oynaning GUI komponentlari sohasida a
kombinatsiyalangan quti; foydalanuvchi adan tanlash uchun qutining o'ng tomonidagi pastga o'qni bosishi mumkin
elementlar ro'yxati. Menyular, tugmalar va kombinatsiya oynasi ilovaning GUI qismidir. Ular
ilova bilan ishlashga imkon beradi.

12.2 Java-ning Nimbus Look-and-Feel


GUI ko'rinishi ranglar va shriftlar kabi vizual jihatlaridan va hissiyotlaridan iborat.
tugmalar va menyular kabi grafik interfeys bilan ishlashda foydalanadigan komponentlar. Birga

12.1-rasm | SwingSet3 ilovasi Java-ning ko'plab Swing GUI komponentlarini namoyish etadi.

menyu sarlavha satri menyu satri birlashgan maydon matn maydoni tugmasi aylantirish paneli

476 12-bob GUI komponentlari: 1-qism

Bu GUI ko'rinishi va hissi sifatida tanilgan. Swing o'zaro platformali ko'rinishga ega
Nimbus nomi bilan tanilgan. 12.1-rasm kabi GUI ekran tasvirlari uchun biz tizimlarimizni sozladik
Nimbusdan standart ko'rinish va his sifatida foydalanish. Nimbusdan foydalanishning uchta usuli mavjud:
1. Uni kompyuteringizda ishlaydigan barcha Java ilovalari uchun standart sifatida o'rnating.
2. Uni ilovani ishga tushirish vaqtidagi ko'rinish sifatida belgilang
java buyrug'iga buyruq qatori argumenti.
3. Ilovangizda uni dasturiy jihatdan ko'rinish va hissiyot sifatida o'rnating (22.6-bo'limga qarang).
Nimbusni barcha Java ilovalari uchun sukut bo'yicha o'rnatish uchun siz matn faylini yaratishingiz kerak
JDK o'rnatish papkangiz va sizning lib jildida swing.properties deb nomlangan
JRE o'rnatish papkasi. Faylga quyidagi kod qatorini joylashtiring:

Mustaqil JREga qo'shimcha ravishda JDK o'rnatish papkasida JRE o'rnatilgan.


Agar siz JDK ga bog'liq bo'lgan IDE dan foydalanayotgan bo'lsangiz, uni ham joylashtirishingiz kerak bo'lishi mumkin
swing.properties faylini jre jildining lib jildiga joylashtiring.
Agar siz Nimbus-ni har bir ilova asosida tanlashni istasangiz, quyidagini joylashtiring:
java buyrug'idan keyin va ilovadan oldin buyruq qatori argumentini tushirish
ilovani ishga tushirganingizda nomi:

12.3 JOptionPane bilan oddiy GUI-ga asoslangan kirish/chiqish


2–10-boblardagi ilovalar buyruqlar oynasida matnni ko'rsatadi va kirishni oladi
buyruq oynasidan. Kundalik foydalanadigan ko'pgina ilovalar Windows yoki
foydalanuvchi bilan muloqot qilish uchun dialog oynalari (dialoglar deb ham ataladi). Masalan, elektron pochta dasturi
dastur taqdim etgan oynada xabarlarni yozish va o'qish imkonini beradi. Muloqot oynalari
dasturlar foydalanuvchiga muhim xabarlarni ko'rsatadigan yoki ma'lumot oladigan oynalar
foydalanuvchidan. Java ning JOptionPane klassi (javax.swing paketi) oldindan tuzilgan dialog oynasini taqdim etadi
kirish va chiqish uchun qutilar. Ular statik JOptionPane-ni chaqirish orqali ko'rsatiladi
usullari. 12.2-rasmda ikkita kiritish dialogidan foydalanadigan oddiy qo'shish ilovasi keltirilgan
foydalanuvchidan butun sonlarni olish va butun sonlar yig'indisini ko'rsatish uchun xabar dialogi
foydalanuvchi kiradi.

swing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel

-Dswing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel

1 // 12.2-rasm: Addition.java


2 // Kirish va chiqish uchun JOptionPane dan foydalanadigan qo'shimcha dastur.
3 import javax.swing.JOptionPane;
4
5 umumiy sinf qo'shimchasi
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11

12.2-rasm | Kirish va chiqish uchun JOptionPane-dan foydalanadigan qo'shimcha dastur. (2-qismning 1-qismi.)

// JOptionPane kiritish dialog oynalaridan foydalanuvchi ma'lumotlarini olish
Birinchi qator =
JOptionPane.showInputDialog("Birinchi butun sonni kiriting");

12.3 JOptionPane 477 bilan oddiy GUI-ga asoslangan kirish/chiqish

Kirish dialoglari
3-qator JOptionPane sinfini import qiladi. 10-11 qatorlar birinchi navbatda mahalliy String o'zgaruvchisini e'lon qiladi -
Raqam bering va uni JOptionPane statik usuli showInputDia-ga qo'ng'iroq natijasini belgilang.
jurnal. Bu usul kiritish dialogini ko'rsatadi (12.2(a)-rasmdagi ekran tasviriga qarang), yordamida
usulning String argumenti ("Birinchi butun sonni kiriting") taklif sifatida.

Foydalanuvchi matn maydoniga belgilar kiritadi, keyin OK tugmasini bosadi yoki Enter tugmasini bosadi


Stringni dasturga yuboring. OK tugmasini bosish ham dialogni o'chiradi (yashiradi). [Eslatma:
Agar siz matn maydoniga yozsangiz va hech narsa ko'rinmasa, uni bosish orqali matn maydonini faollashtiring
sichqoncha.] Skanerdan bir necha turdagi qiymatlarni kiritish uchun ishlatilishi mumkin bo'lgan farqli o'laroq
klaviaturadagi foydalanuvchi, kiritish dialogi faqat Stringlarni kiritishi mumkin. Bu ko'pchilik GUI uchun xosdir

12
13


14
15 // hisoblashda foydalanish uchun satrli kirishlarni int qiymatlariga aylantiring
16 int raqam1 = Integer.parseInt(birinchi raqam);
17 int raqam2 = Integer.parseInt(ikkinchi raqam);
18
19 int sum = raqam1 + raqam2;
20
21
22
23
24 }
25 } // oxirgi sinf Qo'shimchasi

Ko'rish va his qilish kuzatuvi 12.2


Kirish muloqot oynasidagi taklif odatda jumla uslubidagi bosh harflardan foydalanadi - bu uslub
matndagi birinchi so‘zning faqat birinchi harfini bosh harf bilan yozadi, agar so‘z o‘ziga xos ot bo‘lmasa
(masalan, Jons).

12.2-rasm | Kirish va chiqish uchun JOptionPane-dan foydalanadigan qo'shimcha dastur. (2-qismning 2-qismi.)

string secondNumber =
JOptionPane.showInputDialog("Ikkinchi butun sonni kiriting");

// natijani JOptionPane xabar dialog oynasida ko'rsatish


JOptionPane.showMessageDialog(null, "Yig'indi" + yig'indisi,
"Ikki butun sonlar yig'indisi", JOptionPane.PLAIN_MESSAGE);

(a) 10-11-qatorlarda ko'rsatilgan kiritish dialogi

(b) 12-13-qatorlarda ko'rsatilgan kiritish dialogi

Foydalanuvchi OK tugmasini bosganida,


showInputDialog qaytariladi
dasturga 100 terdi
foydalanuvchi tomonidan String sifatida; the
dasturni aylantirishi kerak
Int uchun satr

Matn maydoni bo'lgan


foydalanuvchi qiymat kiritadi

Foydalanuvchiga taklif

(c) 22-23-qatorlar orqali ko'rsatiladigan xabar dialogi - foydalanuvchi chertganda
OK, xabar dialogi o'chirildi (ekrandan o'chirildi)

478 12-bob GUI komponentlari: 1-qism

komponentlar. Foydalanuvchi kiritish dialogining matn maydoniga istalgan belgilarni kiritishi mumkin. Bizning dasturimiz
foydalanuvchi to'g'ri butun sonni kiritadi deb taxmin qiladi. Agar foydalanuvchi Bekor qilish tugmasini bosgan bo'lsa, ShowInputDialog
null qaytaradi. Agar foydalanuvchi butun son bo'lmagan qiymatni yozsa yoki "Bekor qilish" tugmasini bossa
kiritish dialogida istisno paydo bo'ladi va dastur to'g'ri ishlamaydi. 12-qatorlar
13 foydalanuvchini ikkinchi butun sonni kiritishni taklif qiladigan boshqa kiritish dialogini ko'rsatadi. Har biri
Siz ko'rsatadigan JOptionPane dialogi dialog oynasi yoqilgan paytda modal dialog deb ataladi
ekranda foydalanuvchi dasturning qolgan qismi bilan o'zaro aloqa qila olmaydi.

Satrlarni int qiymatlariga aylantirish


Hisoblashni amalga oshirish uchun foydalanuvchi kiritgan Stringlarni int qiymatlariga aylantiramiz.
Eslatib o'tamiz, Integer sinfining statik usuli parseInt o'zining String argumentini o'zgartiradi.
int qiymati va NumberFormatExceptionni tashlashi mumkin. 16-17 qatorlar konvertatsiyani tayinlaydi
ed qiymatlari mahalliy o'zgaruvchilar soni1 va number2 va 19-satr bu qiymatlarni jamlaydi.

Xabar dialoglari


22–23 qatorlar xabarni ko'rsatish uchun JOptionPane statik showMessageDialog usulidan foydalanadi.
yig'indini o'z ichiga olgan alog (12.2-rasmning oxirgi ekrani). Birinchi argument Java ilovasiga yordam beradi.
plication dialog oynasini qayerga joylashtirishni aniqlaydi. Muloqot oynasi odatda a dan ko'rsatiladi
O'z oynasiga ega GUI ilovasi. Birinchi argument ushbu oynaga ishora qiladi (deb nomlanadi
ota-ona oynasi) va dialogning ota-ona ustida markazlashgan holda paydo bo'lishiga olib keladi (biz shunday qilamiz).
12.9-bo'lim). Agar birinchi argument null bo'lsa, dialog oynasi sizning o'rtangizda ko'rsatiladi
ekran. Ikkinchi argument ko'rsatilishi kerak bo'lgan xabardir - bu holda birlashma natijasi.
“The sum is” qatorini va sum qiymatini. Uchinchi dalil - "Ikkining yig'indisi -
tegers" - dialog oynasining yuqori qismidagi sarlavha satrida paydo bo'lishi kerak bo'lgan satr. To'rtinchisi
argument—JOptionPane.PLAIN_MESSAGE—koʻrsatiladigan xabar dialogining turi. A
PLAIN_MESSAGE dialog oynasida xabarning chap tomonidagi belgi ko‘rsatilmaydi. JOptionPane sinfi
showInputDialog va showMessageDialog usullarining bir nechta haddan tashqari yuklangan versiyalarini taqdim etadi,
shuningdek, boshqa dialog turlarini aks ettiruvchi usullar. To'liq ma'lumot uchun http:// saytiga tashrif buyuring
docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html.

JOptionPane xabar dialog oynasi doimiylari


Xabarlar dialogi turlarini ifodalovchi konstantalar 12.3-rasmda ko'rsatilgan. Barcha xabar
PLAIN_MESSAGE dan tashqari dialog turlari xabarning chap tomonida belgini ko'rsatadi. Bu piktogrammalar
foydalanuvchi uchun xabarning ahamiyatini vizual tarzda ko'rsatish. QUESTION_MESSAGE
icon kiritish dialog oynasi uchun standart belgidir (12.2-rasmga qarang).

Ko'rish va his qilish kuzatuvi 12.3


Modali dialoglardan ortiqcha foydalanmang, chunki ular ilovalaringizdan foydalanish imkoniyatini kamaytirishi mumkin. a foydalaning
modal dialog faqat foydalanuvchilarning qolgan qismi bilan muloqot qilishiga yo'l qo'ymaslik kerak bo'lganda
ular dialogni o'chirmaguncha ilova qiling.

Ko'rish va his qilish kuzatuvi 12.4


Oynaning sarlavha satrida odatda kitob sarlavhasi bosh harflardan foydalaniladi.
matndagi har bir muhim so'zning birinchi harfini ajratadi va hech qanday tinish belgisi bilan tugamaydi.
ation (masalan, kitob nomidagi bosh harflar).

12.4 Swing komponentlarini ko'rib chiqish 479

12.4 Swing komponentlarining umumiy ko'rinishi
JOptionPane dialog oynalari yordamida kiritish va chiqarishni amalga oshirish mumkin bo'lsa-da, ko'pchilik
GUI ilovalari yanada murakkab foydalanuvchi interfeyslarini talab qiladi. Ushbu bobning qolgan qismi
dastur ishlab chiquvchilarga mustahkam yaratish imkonini beruvchi ko'plab GUI komponentlarini muhokama qiladi
GUI'lar. 12.4-rasmda biz muhokama qiladigan bir nechta asosiy Swing GUI komponentlari keltirilgan.

Swing va AWT


Aslida Java GUI komponentlarining ikkita to'plami mavjud. Java-ning dastlabki kunlarida GUI-lar qurilgan
java.awt paketidagi Abstract Window Toolkit (AWT) komponentlari bilan.
Bular platformaning mahalliy GUI komponentlariga o'xshaydi, unda Java dasturi mavjud.
ijro etadi. Masalan, Microsoft-da ishlaydigan Java dasturida ko'rsatilgan Button ob'ekti
Windows boshqa Windows ilovalaridagi kabi ko'rinadi. Apple Mac OS X da, lekin-
ton boshqa Mac ilovalaridagilarga o'xshaydi. Ba'zan, hatto a
foydalanuvchi AWT komponenti bilan o'zaro aloqada bo'lishi mumkin platformalar orasida farq qiladi. Komponentning ilovasi
pearance va foydalanuvchining u bilan o'zaro munosabati uning ko'rinishi va hissi sifatida tanilgan.

Xabarning dialog oynasi turi Belgi tavsifi

ERROR_MESSAGE Xatoni bildiradi.

INFORMATION_MESSAGE Axborot xabarini bildiradi.

WARNING_MESSAGE Potentsial muammo haqida ogohlantiradi.

QUESTION_MESSAGE Savol beradi. Ushbu dialog odatda a talab qiladi


javob, masalan, Ha yoki Yo'q tugmasini bosish.
PLAIN_MESSAGE raqami
belgisi

Xabarni o'z ichiga olgan, lekin piktogramma bo'lmagan muloqot oynasi.

12.3-rasm | Xabar dialoglari uchun JOptionPane statik konstantalari.

Komponent tavsifi

JLabel Tahrirlanmaydigan matn va/yoki piktogrammalarni ko'rsatadi.
JTextField Odatda foydalanuvchi ma'lumotlarini oladi.
JButton Sichqoncha bilan bosilganda hodisani ishga tushiradi.
JCheckBox Tanlanishi yoki tanlanmagan variantni belgilaydi.
JComboBox Foydalanuvchi tanlashi mumkin bo'lgan elementlarning ochiladigan ro'yxati.
JList Foydalanuvchi istalgan birini bosish orqali tanlashi mumkin bo'lgan elementlar ro'yxati
ulardan. Bir nechta elementlarni tanlash mumkin.
JPanel Komponentlarni joylashtirish va tartibga solish mumkin bo'lgan maydon.

12.4-rasm | Ba'zi asosiy Swing GUI komponentlari.


480 12-bob GUI komponentlari: 1-qism

Engil va og'ir vaznli grafik interfeys komponentlari
Aksariyat Swing komponentlari engil komponentlardir - ular yozilgan, boshqariladigan va
to'liq Java-da ko'rsatiladi. AWT komponentlari og'ir vaznli komponentlardir, chunki
ular o'zlarining funksionalligini aniqlash uchun mahalliy platformaning oyna tizimiga tayanadilar va
ularning ko'rinishi va hissiyotlari. Bir nechta Swing komponentlari og'ir vaznli komponentlardir.
Swing-ning engil grafik interfeysi komponentlarining yuqori sinflari
12.5-rasmdagi UML sinf diagrammasi sinflarning meros ierarxiyasini ko'rsatadi.
engil Swing komponentlari o'zlarining umumiy atributlari va xatti-harakatlarini meros qilib oladi.

Sinf komponenti (java.awt paketi) umumiy xususiyatlarni e'lon qiluvchi supersinfdir


java.awt va javax.swing paketlaridagi GUI komponentlari. Con- bo'lgan har qanday ob'ekt
tainer (java.awt to'plami) Komponentlarni biriktirish orqali tashkil qilish uchun ishlatilishi mumkin.
Konteynerga tushadi. GUIni tashkil qilish uchun konteynerlar boshqa konteynerlarga joylashtirilishi mumkin.
JComponent klassi (javax.swing paketi) Konteynerning quyi sinfidir. JComponent bu
barcha engil Swing komponentlarining yuqori sinfi va ularning umumiy atributlarini e'lon qiladi
va xatti-harakatlar. JComponent konteynerning kichik klassi bo'lganligi sababli, barcha engil Swing moslamalari
ponentlar ham konteynerlardir. JComponent tomonidan qo'llab-quvvatlanadigan ba'zi umumiy xususiyatlar:
1. Komponentlarning tashqi ko'rinishini sozlash uchun ulash mumkin bo'lgan ko'rinish va hissiyot (masalan,
muayyan platformalarda foydalanish uchun). Buning misolini 22.6-bo'limda ko'rasiz.
2. GUI komponentlariga bevosita kirish uchun qisqa klavishlar (mnemonika deb ataladi).
klaviatura. Buning misolini 22.4-bo'limda ko'rasiz.
3. GUI komponentining maqsadining qisqacha tavsifi (asbob maslahatlari deb ataladi)
sichqoncha kursori komponent ustida qisqa vaqt davomida joylashtirilganda oʻynaladi.
Buning misolini keyingi bo'limda ko'rasiz.
4. Ko‘zi ojizlar uchun brayl ekranli o‘quvchilari kabi foydalanish imkoniyatini qo‘llab-quvvatlash.
5. Foydalanuvchi interfeysi lokalizatsiyasini qo'llab-quvvatlash, ya'ni foydalanuvchi interfeysini moslashtirish
turli tillarda namoyish eting va mahalliy madaniy konventsiyalardan foydalaning.

Ko'rish va his qilish kuzatuvi 12.5


Swing GUI komponentlari ilovangiz uchun yagona ko'rinish va hissiyotni belgilash imkonini beradi
barcha platformalarda yoki har bir platformaning shaxsiy koʻrinishidan foydalanish uchun. Ilova mumkin
foydalanuvchilarga o'zlarining oldindan tanlash imkoniyatini berish uchun bajarish paytida tashqi ko'rinishni o'zgartiring.
ferred ko'rinish va tuyg'u.

12.5-rasm | Engil Swing komponentlarining umumiy superklasslari.

Ob'ekt

Komponent



Idish

JComponent


12.5 Matn va tasvirlarni oynada aks ettirish 481

12.5 Matn va rasmlarni oynada ko'rsatish
Bizning keyingi misolimiz GUI ilovalarini yaratish uchun asosni taqdim etadi. Bir nechta tushunchalar
bu doirada ko'pgina GUI ilovalarimizda paydo bo'ladi. Bu bizning birinchi misolimiz
unda ilova o'z oynasida paydo bo'ladi. Siz yaratadigan oynalarning aksariyati bu mumkin
Swing GUI komponentlarini o'z ichiga olgan JFrame sinfining misollari yoki JFrame ning kichik sinfi.
JFrame - java.awt.Window sinfining bilvosita kichik klassi boʻlib, asosiy atributlarni taqdim etadi.
va oynaning xatti-harakatlari — tepadagi sarlavha satri va kichraytirish, kattalashtirish va tugmalari
derazani yop. Ilovaning GUI odatda ilovaga xos bo'lgani uchun, ko'pchilik
Bizning misollarimiz ikkita sinfdan iborat bo'ladi - ko'rsatishga yordam beradigan JFrame ning kichik klassi
yangi GUI tushunchalari va asosiy dastur yaratadigan va ko'rsatadigan dastur sinfi
kationning asosiy oynasi.
GUI komponentlarini etiketlash
Oddiy GUI ko'plab komponentlardan iborat. GUI dizaynerlari ko'pincha matnni taqdim etadilar
har birining maqsadi. Bunday matn yorliq sifatida tanilgan va JLabel ning kichik sinfi bilan yaratilgan
JComponent. JLabel faqat o'qish uchun mo'ljallangan matnni, rasmni yoki matn va rasmni ko'rsatadi. App-
yorliq yaratilgandan keyin uning tarkibini kamdan-kam hollarda o'zgartiradi.

Shakllarning qo'llanilishi. 12.6–12.7 bir nechta JLabel xususiyatlari va taqdimotlarini namoyish etadi


GUI misollarimizning aksariyatida biz foydalanadigan ramka. Biz bu kodni ta'kidlamadik
Masalan, chunki ularning aksariyati yangi. [Izoh: Har bir grafik interfeysi uchun yana bir qancha xususiyatlar mavjud.
Biz misollarimizda yoritib bera oladigan darajada. Har bir GUI-ning to'liq tafsilotlarini o'rganish uchun
komponent, onlayn hujjatlardagi sahifasiga tashrif buyuring. JLabel sinfi uchun tashrif buyuring
docs.oracle.com/javase/7/docs/api/javax/swing/JLabel.html.]

Ko'rish va his qilish kuzatuvi 12.6


JLabel-dagi matn odatda jumla uslubidagi bosh harflardan foydalanadi.

1 // 12.6-rasm: LabelFrame.java


2 // JLabels matn va piktogramma bilan.
3 import java.awt.FlowLayout; // komponentlar qanday joylashishini bildiradi
4 import javax.swing.JFrame; // asosiy oyna xususiyatlarini taqdim etadi
5 import javax.swing.JLabel; // matn va rasmlarni ko'rsatadi
6 import javax.swing.SwingConstants; // Swing bilan ishlatiladigan umumiy konstantalar
7 import javax.swing.Icon; // tasvirlarni manipulyatsiya qilish uchun ishlatiladigan interfeys
8 import javax.swing.ImageIcon; // tasvirlarni yuklaydi
9
10 ochiq sinf LabelFrame JFrame-ni kengaytiradi
11 {
12 xususiy yakuniy JLabel label1; // JLabel faqat matn bilan
13 xususiy yakuniy JLabel label2; // JLabel matn va belgi bilan tuzilgan
14 xususiy yakuniy JLabel label3; // JLabel qo'shilgan matn va belgi bilan
15
16 // LabelFrame konstruktori JFrame-ga JLabels qo'shadi
17 ommaviy LabelFrame()
18 {

12.6-rasm | Matn va piktogramma bilan JLabels. (2-qismning 1-qismi.)


482 12-bob GUI komponentlari: 1-qism

19 super("JLabel testi");
20 setLayout(yangi FlowLayout()); // ramka tartibini o'rnatish
21
22
23
24
25 qo'shish (yorliq1); // JFrame-ga label1 qo'shing
26
27
28
29
30
31
32 qo'shish (yorlig'i2); // JFrame-ga label2 qo'shing
33
34
35
36
37
38
39
40 qo'shish (yorliq3); // JFrame-ga label3 qo'shing
41 }
42 } // oxirgi sinf LabelFrame

1 // 12.7-rasm: LabelTest.java


2 // LabelFrame sinovi.
3 import javax.swing.JFrame;
4
5 ommaviy sinf LabelTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 LabelFrame labelFrame = yangi LabelFrame();
10 labelFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 labelFrame.setSize(260, 180);
12 labelFrame.setVisible(rost);
13 }
14 } // oxirgi sinf LabelTest

12.7-rasm | LabelFrame sinovi.

12.6-rasm | Matn va piktogramma bilan JLabels. (2-qismning 2-qismi.)

// JLabel konstruktori qator argumenti bilan


label1 = new JLabel("Matnli yorliq");
label1.setToolTipText("Bu label1");

// JLabel konstruktori string, Icon va hizalanish argumentlari bilan


Belgi xato = yangi ImageIcon(getClass().getResource("bug1.png"));
label2 = new JLabel("Matn va belgili yorliq", xato,
SwingConstants.LEFT);
label2.setToolTipText("Bu label2");

label3 = yangi JLabel(); // JLabel konstruktorida argumentlar yo'q


label3.setText("Payida belgisi va matni bo'lgan yorliq");
label3.setIcon(xato); // JLabel-ga belgi qo'shing
label3.setHorizontalTextPosition(SwingConstants.CENTER);
label3.setVerticalTextPosition(SwingConstants.BOTTOM);
label3.setToolTipText("Bu label3");

12.5 Matn va tasvirlarni oynada aks ettirish 483



Class LabelFrame (12.6-rasm) JFrame-ni oynaning xususiyatlarini meros qilib olish uchun kengaytiradi.
Biz uchta JLabelni o'z ichiga olgan oynani ko'rsatish uchun LabelFrame sinfining namunasidan foydalanamiz.
12-14 qatorlar Label-da yaratilgan uchta JLabel misol o'zgaruvchilarini e'lon qiladi.
Ramka konstruktori (17-41-qatorlar). Odatda, JFrame kichik sinfining konstruktori
Ilova bajarilganda oynada ko'rsatiladigan GUI. 19-qator super-ni chaqiradi
JFrame sinfining konstruktori "JLabelni sinab ko'rish" argumenti bilan. JFrame konstruktori
bu Stringni oynaning sarlavha satridagi matn sifatida ishlatadi.
Tartibni belgilash
GUI yaratishda har bir GUI komponentini konteynerga biriktirishingiz kerak, masalan
JFrame yordamida yaratilgan oyna. Bundan tashqari, odatda har bir GUIni qayerga joylashtirishni hal qilishingiz kerak
komponent - tartibni belgilash sifatida tanilgan. Java bir nechta tartib menejerlarini taqdim etadi
Ushbu bobda va 22-bobda keyinroq bilib olishingiz mumkin bo'lgan komponentlarni joylashtirishga yordam beradi.
Ko'pgina IDElar GUI dizayn vositalarini taqdim etadi, ularda siz komponentlarni aniq belgilashingiz mumkin
sichqoncha yordamida vizual tarzda o'lchamlar va joylar; keyin IDE ni yaratadi
Siz uchun GUI kodi. Bunday IDElar GUI yaratishni ancha soddalashtirishi mumkin.
GUI-larimiz har qanday IDE bilan ishlatilishini ta'minlash uchun biz yaratish uchun IDE-dan foydalanmadik
GUI kodi. Komponentlarni o'lcham va joylashtirish uchun biz Java-ning maket menejerlaridan foydalanamiz. Bilan
FlowLayout layout menejeri, komponentlar konteynerda chapdan o'ngga joylashtiriladi
ular qo'shilgan tartibda. Joriy chiziqqa boshqa komponentlar sig'masa, ular
keyingi satrda chapdan o'ngga ko'rsatishni davom eting. Agar konteyner hajmi o'zgartirilsa, FlowLayout
komponentlarni, ehtimol, yangi konteyner asosida kamroq yoki ko'proq qatorlar bilan qayta oqimlaydi
kengligi. Har bir konteynerning standart tartibi bor, biz uni LabelFrame uchun a ga o‘zgartiramiz
FlowLayout (20-qator). setLayout usuli bilvosita LabelFrame sinfiga meros qilib olinadi
sinfdan konteyner. Usulning argumenti sinfning ob'ekti bo'lishi kerak, bu quyidagilarni amalga oshiradi:
LayoutManager interfeysidan foydalanadi (masalan, FlowLayout). 20-qator yangi FlowLayout-ni yaratadi
ob'ektni o'zgartiradi va uning mos yozuvini setLayout argumenti sifatida uzatadi.
Yorliq yaratish va biriktirish1
Endi biz oyna tartibini belgilab qo'yganimizdan so'ng, biz GUI yaratish va biriktirishni boshlashimiz mumkin
oynaga komponentlar. 23-qator JLabel ob'ektini yaratadi va "Matn bilan yorliq" dan o'tadi
konstruktorga. JLabel bu matnni ekranda aks ettiradi. 24-qator usul to'plamidan foydalanadi -
ToolTipText (JComponent'dan JLabel tomonidan meros qilib olingan) asboblar maslahatini belgilash uchun.
foydalanuvchi sichqoncha kursorini GUI-dagi JLabel ustiga qo'yganda ijro etiladi. Ko'rishingiz mumkin
12.7-rasmdagi ikkinchi ekran tasviridagi namunali asbob maslahati. Ushbu ilovani amalga oshirganingizda
Har bir JLabelning asbob uchini ko'rish uchun sichqoncha ko'rsatgichini olib keling. 25-qator (12.6-rasm)
label1 ni qo'shish usuliga o'tkazish orqali label1 ni LabelFrame-ga biriktiradi, bu
bilvosita Konteyner sinfidan olingan.
Umumiy dasturlash xatosi 12.1
Agar siz GUI komponentini konteynerga aniq qo'shmasangiz, GUI komponenti qo'shiladi
konteyner ekranda paydo bo'lganda ko'rsatilmaydi.

Ko'rish va his qilish kuzatuvi 12.7


GUI komponentlaringizga tavsiflovchi matn qo‘shish uchun vosita maslahatlaridan foydalaning. Ushbu matn foydalanuvchiga
foydalanuvchi interfeysida GUI komponentining maqsadini tugatish.

484 12-bob GUI komponentlari: 1-qism



Belgilar interfeysi va ImageIcon sinfi
Belgilar ilovaning ko'rinishini yaxshilashning mashhur usuli bo'lib, ular bilan bir qatorda
funktsiyani ko'rsatish uchun mo'ljallangan. Misol uchun, xuddi shu belgi ko'pchilikni o'ynash uchun ishlatiladi
DVD pleerlar va MP3 pleerlar kabi qurilmalardagi bugungi ommaviy axborot vositalari. Bir nechta Swing komponentlari
tasvirlarni ko'rsatishi mumkin. Belgi odatda Icon (javax.swing paketi) bilan belgilanadi.
konstruktorga yoki komponentning setIcon usuliga o'ting. Class ImageIcon yordami-
portlar bir nechta tasvir formatlari, jumladan Grafik almashish formati (GIF), Portativ
Tarmoq grafikasi (PNG) va qo'shma fotosuratlar bo'yicha ekspertlar guruhi (JPEG).
28-qator ImageIconni e'lon qiladi. bug1.png faylida yuklash va saqlash uchun tasvir mavjud
ImageIcon obyektida. Ushbu rasm ushbu misol uchun katalogga kiritilgan. The
ImageIcon obyekti Icon havola xatosiga tayinlangan.
Rasm resursi yuklanmoqda
28-qatorda getClass().getResource("bug1.png") ifodasi get- usulini chaqiradi.
Sinf ob'ektiga havolani olish uchun sinf (ob'ekt sinfidan bilvosita meros qilib olingan).
Bu LabelFrame sinf deklaratsiyasini ifodalaydi. Keyin bu havola chaqirish uchun ishlatiladi
Tasvirning manzilini URL sifatida qaytaradigan getResource sinf usuli. Im-
ageIcon konstruktori tasvirni topish uchun URL manzilidan foydalanadi, keyin uni xotiraga yuklaydi. Biz kabi
1-bobda muhokama qilingan JVM sinf yuklagichidan foydalanib, sinf deklaratsiyasini xotiraga yuklaydi.
Sinf yuklovchisi u yuklagan har bir sinf diskda qayerda joylashganligini biladi. GetResource usuli
rasm kabi resursning joylashuvini aniqlash uchun Class obyektining sinf yuklagichidan foydalanadi
fayl. Bu misolda tasvir fayli LabelFrame.class bilan bir joyda saqlanadi
fayl. Bu yerda tasvirlangan usullar ilovaga tasvir fayllarini joylashuvdan yuklash imkonini beradi
sinf faylining joylashuviga nisbatan.
Yorliq yaratish va biriktirish2
29–30 qatorlar “La-” matnini aks ettiruvchi JLabel yaratish uchun boshqa JLabel konstruktoridan foydalanadi.
matn va belgi bilan bel" va 28-qatorda yaratilgan Icon xatosi. Oxirgi konstruktor argu-
ment yorliq mazmuni chap tekislangan yoki chapga tekislanganligini bildiradi (ya'ni, belgi va
matn ekrandagi yorliq maydonining chap tomonida joylashgan). SwingConstants interfeysi (paket
javax.swing) umumiy butun sonlar to'plamini e'lon qiladi (masalan, SwingConstants.LEFT,
SwingConstants.CENTER va SwingConstants.RIGHT) ko'p Swing bilan ishlatiladi
komponentlar. Odatiy bo'lib, yorliq mavjud bo'lsa, matn tasvirning o'ng tomonida ko'rinadi
ham matn, ham rasm. JLabel ning gorizontal va vertikal tekislashlari bilan o'rnatilishi mumkin
mos ravishda setHorizontalAlignment va setVerticalAlignment usullari. 31-qator
label2 uchun asboblar maslahati matnini belgilaydi va 32-satr JFrame-ga label2 qo'shadi.
Yorliq yaratish va biriktirish3
JLabel klassi JLabel yaratilgandan so'ng uning ko'rinishini o'zgartirish usullarini taqdim etadi.
34-qator argumentsiz konstruktor bilan bo'sh JLabel yaratadi. 35-qator JLabeldan foydalanadi
yorliqda ko'rsatilgan matnni o'rnatish uchun setText usuli. getText usulidan foydalanish mumkin
JLabelning joriy matnini oling. 36-qator Iconni belgilash uchun JLabel setIcon usulidan foydalanadi
ko'rsatish uchun. GetIcon usuli yorliqda ko'rsatilgan joriy Belgini olish uchun ishlatilishi mumkin.
37–38 qatorlar JLabel setHorizontalTextPosition va setVerticalTextPo- usullaridan foydalanadi.
yorliqdagi matn o'rnini belgilash uchun joy. Bunday holda, matn gorizont markazida bo'ladi-
tally va yorliqning pastki qismida paydo bo'ladi. Shunday qilib, Icon matn ustida paydo bo'ladi. The
SwingConstants da gorizontal joylashuv konstantalari LEFT, CENTER va RIGHT (12.8-rasm).

12.6 Matn maydonlari va ichki o'rnatilgan sinflar bilan hodisalarni boshqarishga kirish 485

SwingConstants da vertikal joylashuv konstantalari TOP, CENTER va BOTTOM (12.8-rasm).
39-qator (12.6-rasm) label3 uchun asbob-uskunalar matnini o'rnatadi. 40-qator JFrame-ga label3 qo'shadi.

LabelFrame oynasini yaratish va ko'rsatish


Class LabelTest (12.7-rasm) LabelFrame sinfining ob'ektini yaratadi (9-qator), so'ng aniqlaydi
oyna uchun standart yopish operatsiyasi. Odatiy bo'lib, oynani yopish shunchaki yashiradi
oyna. Biroq, foydalanuvchi LabelFrame oynasini yopganda, biz ilovani xohlaymiz.
tugatish uchun iltimos. 10-qator LabelFrame-ning setDefaultCloseOperation usulini chaqiradi -
od (JFrame sinfidan meros boʻlib qolgan) argument sifatida JFrame.EXIT_ON_CLOSE doimiysi bilan
oyna foydalanuvchi tomonidan yopilganda dastur tugashi kerakligini bildirish uchun. Bu
qator muhim ahamiyatga ega. Busiz, foydalanuvchi yopilganda dastur tugamaydi
oyna. Keyinchalik, 11-qator LabelFrame-ning setSize usulini kenglik va kenglikni belgilash uchun chaqiradi.
oynaning piksellardagi balandligi. Nihoyat, 12-qator LabelFrame ning setVisible usulini chaqiradi
oynani ekranda ko'rsatish uchun true argumenti bilan. Oyna o'lchamini o'zgartirib ko'ring
Oyna kengligi o'zgarganda FlowLayout JLabel pozitsiyalarini qanday o'zgartirishini ko'ring.
12.6 Matn maydonlari va hodisalarni boshqarishga kirish
Nested Classes bilan
Odatda, foydalanuvchi qo'llaniladigan vazifalarni ko'rsatish uchun ilovaning GUI bilan o'zaro ishlaydi.
kation bajarishi kerak. Masalan, elektron pochta ilovasida elektron xat yozganingizda,
"Yuborish" tugmasini bosish ilovaga ko'rsatilgan elektron pochta e'loniga elektron pochta xabarini yuborishni aytadi.
liboslar. GUI'lar voqealarga asoslangan. Foydalanuvchi GUI komponenti bilan o'zaro aloqada bo'lganda, in-
hodisa sifatida tanilgan teraksiya dasturni vazifani bajarishga undaydi. Ba'zi oddiy foydalanuvchi
Ilovaning vazifani bajarishiga sabab bo'ladigan o'zaro ta'sirlarga tugmani bosish, kiritish kiradi
matn maydoni, menyudan biror narsani tanlash, oynani yopish va sichqonchani harakatlantirish. The
Hodisaga javoban vazifani bajaradigan kod hodisa ishlov beruvchisi va jarayon deb ataladi
hodisalarga javob berish hodisani boshqarish deb nomlanadi.
Keling, hodisalarni yaratishi mumkin bo'lgan yana ikkita GUI komponentini ko'rib chiqaylik - JTextFields
va JPasswordFields (javax.swing paketi). JTextField klassi JTextCom- sinfini kengaytiradi
ponent (javax.swing.text to'plami), bu Swing's uchun umumiy bo'lgan ko'plab xususiyatlarni taqdim etadi
matnga asoslangan komponentlar. JPasswordField klassi JTextField-ni kengaytiradi va usullarni qo'shadi
parollarni qayta ishlash uchun xosdir. Ushbu komponentlarning har biri bir qatorli maydondir
foydalanuvchi klaviatura orqali matn kiritishi mumkin. Ilovalar matnni a formatida ham ko'rsatishi mumkin
JTextField (12.10-rasmning chiqishiga qarang). JPasswordField belgilar ekanligini ko'rsatadi
foydalanuvchi ularni kiritayotganda yoziladi, lekin aks-sado belgisi bilan haqiqiy belgilarni yashiradi,
ular faqat foydalanuvchiga ma'lum bo'lishi kerak bo'lgan parolni ifodalaydi deb faraz qilish.

Doimiy tavsif Doimiy tavsif

Gorizontal joylashuv konstantalari Vertikal joylashuv konstantalari
CHAP Matnni chap tomonga joylashtiring YUQORI Matnni tepaga joylashtiring
CENTER Matnni markazga qo'ying CENTER Matnni markazga qo'ying
O‘RGA Matnni o‘ngga qo‘ying BOTTOM Matnni pastki qismiga joylashtiring

12.8-rasm | Joylashuv konstantalari (SwingConstants interfeysining statik a'zolari).


486 12-bob GUI komponentlari: 1-qism

Foydalanuvchi JTextField yoki JPasswordField da yozganda, Enter tugmasini bosgandan so'ng,
hodisa yuz beradi. Bizning keyingi misolimiz dastur javob sifatida vazifani qanday bajarishi mumkinligini ko'rsatadi
o'sha voqeaga. Bu erda ko'rsatilgan usullar barcha GUI komponentlari uchun amal qiladi.
voqealarni e'lon qilish.
Shakllarning qo'llanilishi. 12.9–12.10 JTextField va JPasswordField sinflaridan foydalanadi.
to'rtta matn maydonini yaratish va boshqarish. Foydalanuvchi matn maydonlaridan birini yozganda, keyin
Enter tugmasini bosgandan so'ng, dastur foydalanuvchi matnini o'z ichiga olgan xabar dialog oynasini ko'rsatadi
yozildi. Siz faqat "fokusda" bo'lgan matn maydoniga yozishingiz mumkin. Komponentni bosganingizda,
diqqatini oladi. Bu juda muhim, chunki diqqat markazida bo'lgan matn maydoni
Enter tugmasini bosganingizda hodisa hosil qiladi. Ushbu misolda Enter tugmasini bosganingizda
JPasswordField, parol ochiladi. Biz GUI-ni sozlashni muhokama qilishdan boshlaymiz,
keyin hodisani boshqarish kodini muhokama qiling.

1 // 12.9-rasm: TextFieldFrame.java


2 // JTextFields va JPasswordFields.
3 import java.awt.FlowLayout;
4 import java.awt.event.ActionListener;
5 import java.awt.event.ActionEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JTextField;
8 import javax.swing.JPasswordField;
9 import javax.swing.JOptionPane;
10
11 ochiq sinf TextFieldFrame JFrame-ni kengaytiradi
12 {
13 xususiy yakuniy JTextField textField1; // o'rnatilgan o'lchamli matn maydoni
14 xususiy yakuniy JTextField textField2; // matnli matn maydoni
15 xususiy yakuniy JTextField textField3; // matn va o'lchamli matn maydoni
16 xususiy yakuniy JPasswordField passwordField; // matnli parol maydoni
17
18 // TextFieldFrame konstruktori JTextFields-ni JFrame-ga qo'shadi
19 ochiq TextFieldFrame()
20 {
21 super("JTextField va JPasswordField testi");
22 setLayout(yangi FlowLayout());
23
24
25
26 qo'shish (textField1); // JFrame-ga textField1 qo'shing
27
28
29
30 qo'shish (textField2); // JFrame-ga textField2 qo'shing
31
32
33
34
35 qo'shish (textField3); // JFrame-ga textField3 qo'shing

12.9-rasm | JTextFields va JPasswordFields. (2-qismning 1-qismi.)

// 10 ta ustunli matn maydonini yaratish
textField1 = yangi JTextField(10);

// standart matn bilan matn maydonini yaratish


textField2 = new JTextField("Matnni shu yerga kiriting");

// standart matn va 21 ustunli matn maydonini yarating


textField3 = new JTextField("O'zgartirilmaydigan matn maydoni", 21);
textField3.setEditable(noto'g'ri); // tahrirlashni o'chirish

12.6 Matn maydonlari va ichki o'rnatilgan sinflar bilan hodisalarni boshqarishga kirish 487

Class TextFieldFrame JFrame-ni kengaytiradi va uchta JTextField o'zgaruvchisini va
JPasswordField o'zgaruvchisi (13-16-qatorlar). Tegishli matn maydonlarining har biri darhol
konstruktordagi TextFieldFrame ga biriktirilgan va biriktirilgan (19–47-qatorlar).

36
37 // standart matn bilan parol maydonini yarating


38
39 qo'shish (parol maydoni); // JFrame-ga passwordField qo'shing
40
41 // hodisa ishlov beruvchilarini ro'yxatdan o'tkazish
42
43
44
45
46
47 }
48
49 // hodisalarni boshqarish uchun shaxsiy ichki sinf
50
51 {
52 // matn maydoni hodisalarini qayta ishlash
53 @Bekor qilish
54
55 {
56 String string = "";
57
58 // foydalanuvchi JTextField textField1 da Enter tugmasini bosdi
59 agar ( )
60 string = String.format("textField1: %s",
61);
62
63 // foydalanuvchi JTextField textField2 da Enter tugmasini bosdi
64 boshqa agar ( )
65 string = String.format("textField2: %s",
66);
67
68 // foydalanuvchi JTextField textField3 da Enter tugmasini bosdi
69 boshqa agar ( )
70 string = String.format("textField3: %s",
71);
72
73 // foydalanuvchi JTextField passwordField da Enter tugmasini bosdi
74 boshqa agar ( )
75 string = String.format("passwordField: %s",
76);
77
78 // JTextField tarkibini ko'rsatish
79 JOptionPane.showMessageDialog(null, string);
80 }
81 } // TextFieldHandler xususiy ichki sinfini tugatish
82 } // oxirgi sinf TextFieldFrame

12.9-rasm | JTextFields va JPasswordFields. (2-qismning 2-qismi.)

passwordField = new JPasswordField("Yashirin matn");

TextFieldHandler ishlovchi = yangi TextFieldHandler();


textField1.addActionListener(ishlovchi);
textField2.addActionListener(ishlovchi);
textField3.addActionListener(ishlovchi);
passwordField.addActionListener(ishlovchi);

xususiy sinf TextFieldHandler ActionListener-ni amalga oshiradi

public void actionPerformed(ActionEvent hodisasi)

event.getSource() == textField1

event.getActionCommand()

event.getSource() == textField2

event.getActionCommand()

event.getSource() == textField3

event.getActionCommand()

event.getSource() == passwordField

event.getActionCommand()

488 12-bob GUI komponentlari: 1-qism



GUI yaratish
22-qator TextFieldFrame-ning tartibini FlowLayout-ga o'rnatadi. 25-qator bilan textField1 ni yaratadi
10 ustunli matn. Matn ustunining kengligi piksellardagi o'rtacha kengligi bilan aniqlanadi
matn maydonining joriy shriftidagi belgi. Matn maydonida matn ko'rsatilganda va
matn maydonning o'zidan kengroq, o'ng tarafdagi matnning bir qismi ko'rinmaydi. Agar bo'lsangiz
matn maydoniga terish va kursor o'ng chetiga etib boradi, chap chetidagi matn suriladi
maydonning chap tomonida va endi ko'rinmaydi. Foydalanuvchilar chap va o'ng strelkadan foydalanishlari mumkin
to'liq matn bo'ylab harakatlanish uchun tugmalar. 26-qator JFrame-ga textField1-ni qo'shadi.
29-qatorda ko'rsatish uchun "Matnni shu yerga kiriting" boshlang'ich matni bilan textField2 ni yaratadi
matn maydoni. Maydonning kengligi da ko'rsatilgan standart matnning kengligi bilan belgilanadi
konstruktor. 30-qator JFrame-ga textField2-ni qo'shadi.
33-qator textField3 ni yaratadi va JTextField konstruktorini ikkita argument bilan chaqiradi.
ments - ko'rsatish uchun standart matn "O'zgartirilmaydigan matn maydoni" va matn maydonining kengligi
ustunlar (21). 34-qator setEditable usulidan foydalanadi (sinfdan JTextField tomonidan meros qilib olingan
JTextComponent) matn maydonini o'zgartirib bo'lmaydigan qilish uchun, ya'ni foydalanuvchi matnni o'zgartira olmaydi
dalada. 35-qator JFrame-ga textField3-ni qo'shadi.
38-qator matnda aks ettirish uchun "Yashirin matn" matni bilan parol maydonini yaratadi
maydon. Maydonning kengligi standart matnning kengligi bilan belgilanadi. Siz exe-
ilovani yoqing, matn yulduzchalar qatori sifatida ko'rsatilganiga e'tibor bering. 39-qator qo'shiladi
JFrame uchun parol maydoni.
GUI komponenti uchun hodisalarni boshqarishni sozlash uchun zarur qadamlar
Bu misol qachon matn maydonidan matnni o'z ichiga olgan xabar dialogini ko'rsatishi kerak
foydalanuvchi ushbu matn maydonida Enter tugmasini bosadi. Ilova voqeaga javob berishidan oldin
ma'lum bir GUI komponenti uchun siz:
1. Hodisa ishlov beruvchisini ifodalovchi va mos keladigan sinfni yarating
interfeys - hodisani tinglovchi interfeysi sifatida tanilgan.
2. 1-bosqichdagi sinf ob'ekti voqea sodir bo'lganda xabardor qilinishi kerakligini ko'rsating
sodir bo'ladi - hodisa ishlov beruvchisini ro'yxatdan o'tkazish sifatida tanilgan.
Hodisa ishlov beruvchisini amalga oshirish uchun ichki sinfdan foydalanish
Hozirgacha muhokama qilingan barcha sinflar eng yuqori darajadagi sinflar deb ataladigan, ya'ni ular o'zgacha sinflar emas edi.
boshqa sinf ichida aniqlandi. Java sizga boshqa sinflar ichida sinflarni e'lon qilish imkonini beradi - bular
ichki sinflar deb ataladi. Ichki sinflar statik yoki statik bo'lmagan bo'lishi mumkin. Statik bo'lmagan ichki o'rnatilgan
sinflar ichki sinflar deb ataladi va ko'pincha hodisa ishlov beruvchilarini amalga oshirish uchun ishlatiladi.
Ichki sinf ob'ekti o'z ichiga olgan yuqori darajadagi sinf ob'ekti tomonidan yaratilishi kerak
ichki sinf. Har bir ichki sinf ob'ekti bilvosita o'zining yuqori darajadagi ob'ektiga havolaga ega
sinf. Ichki sinf ob'ektiga barchaga bevosita kirish uchun ushbu yashirin havoladan foydalanishga ruxsat berilgan
yuqori darajadagi sinfning o'zgaruvchilari va usullari. Statik bo'lgan ichki o'rnatilgan sinf bunday qilmaydi
yuqori darajadagi ob'ektni talab qiladi va ob'ektga bevosita havola qilmaydi
yuqori darajadagi sinfdan. 13-bobda, Grafika va Java 2D, Java 2D da ko'rganingizdek
grafik API statik ichki o'rnatilgan sinflardan keng foydalanadi.
Ichki sinf TextFieldHandler
Ushbu misoldagi hodisani qayta ishlash xususiy ichki sinf ob'ekti tomonidan amalga oshiriladi
TextFieldHandler (50–81-qatorlar). Bu sinf shaxsiy, chunki u faqat yaratish uchun ishlatiladi.
yuqori darajadagi TextFieldFrame sinfidagi matn maydonlari uchun hodisa ishlov beruvchilarini egalladi. Boshqa sinfdagi kabi

12.6 Matn maydonlari va ichki o'rnatilgan sinflar bilan hodisalarni boshqarishga kirish 489



a'zolar, ichki sinflar ommaviy, himoyalangan yoki xususiy deb e'lon qilinishi mumkin. Voqea sodir bo'lganidan beri -
Dlers odatda o'zlari belgilangan dasturga xos bo'ladi, ular ko'pincha amalga oshiriladi.
xususiy ichki sinflar yoki anonim ichki sinflar sifatida qayd etilgan (12.11-bo'lim).
GUI komponentlari foydalanuvchi o'zaro ta'siriga javoban ko'plab hodisalarni yaratishi mumkin. Har biri
hodisa sinf bilan ifodalanadi va faqat tegishli turdagi hodisa tomonidan qayta ishlanishi mumkin
ishlov beruvchi. Odatda, komponentning qo'llab-quvvatlanadigan hodisalari Java API hujjatida tasvirlangan.
ushbu komponent sinfi va uning yuqori sinflari uchun eslatma. Foydalanuvchi Enter tugmasini bosganida
JTextField yoki JPasswordField, ActionEvent (java.awt.event paketi) sodir bo'ladi.
Bunday hodisa ActionListener interfeysini amalga oshiruvchi ob'ekt tomonidan qayta ishlanadi
(java.awt.event to'plami). Bu yerda muhokama qilingan maʼlumotlar Java APIʼda mavjud
JTextField va ActionEvent sinflari uchun hujjatlar. JPasswordField kichik bo'lgani uchun
JTextField sinfi, JPasswordField bir xil hodisalarni qo'llab-quvvatlaydi.
Ushbu misoldagi voqealarni boshqarishga tayyorgarlik ko'rish uchun ichki sinf TextFieldHandler
ActionListener interfeysini amalga oshiradi va ushbu interfeysdagi yagona usulni e'lon qiladi -
Amal bajarildi (53–80-qatorlar). Bu usul qachon bajariladigan vazifalarni belgilaydi
ActionEvent sodir bo'ladi. Shunday qilib, TextFieldHandler ichki klassi avvalroq sanab o'tilgan 1-bosqichni qondiradi
Bo'lim. Tez orada bajarilgan harakatning tafsilotlarini muhokama qilamiz.
Har bir matn maydoni uchun voqea ishlov beruvchisini ro'yxatdan o'tkazish
TextFieldFrame konstruktorida 42-qator TextFieldHandler ob'ektini yaratadi va quyidagicha:
uni o'zgaruvchan ishlov beruvchiga imzolaydi. Ushbu obyektning actionPerformed usuli avtomatik deb ataladi.
foydalanuvchi GUI matn maydonlarining har qandayida Enter tugmasini bosganida. Biroq, bundan oldin
sodir bo'lishi mumkin bo'lsa, dastur ushbu ob'ektni har bir matn maydoni uchun hodisa ishlov beruvchisi sifatida ro'yxatdan o'tkazishi kerak.
43–46 qatorlar hodisani roʻyxatga olish iboralari boʻlib, ishlov beruvchini voqea ishlovchisi sifatida belgilaydi
uchta JTextFields va JPasswordField uchun. Ilova JTextField ni chaqiradi
AddActionListener usuli har bir komponent uchun hodisa ishlov beruvchisini ro'yxatdan o'tkazish. Bu usul-
od o'z argumenti sifatida har qanday sinf ob'ekti bo'lishi mumkin bo'lgan ActionListener ob'ektini oladi
ActionListener dasturini amalga oshiradi. Ob'ektni ishlov beruvchisi ActionListener, chunki
sinf TextFieldHandler ActionListener-ni amalga oshiradi. 43-46 qatorlar bajarilgandan so'ng, ob-
ob'ekt ishlov beruvchisi voqealarni tinglaydi. Endi foydalanuvchi ushbu to'rtta matndan birida Enter tugmasini bosganida
TextFieldHandler sinfida amalga oshirilgan (53-80-qator) maydonlar, usul harakati han-ga chaqiriladi.
voqeani o'tkazing. Agar voqea ishlov beruvchisi ma'lum bir matn maydoni uchun ro'yxatdan o'tmagan bo'lsa, bu hodisa
foydalanuvchi ushbu matn maydonida Enter tugmasini bosganida sodir bo'ladi, ya'ni u e'tiborga olinmaydi
ilova orqali.

TextFieldHandler sinfining tafsilotlari bajarilgan usul


Ushbu misolda biz bir hodisani boshqarish ob'ektining actionPerformed usulidan foydalanamiz (53–80-qatorlar)
to'rtta matn maydoni tomonidan yaratilgan hodisalarni boshqarish uchun. Chunki biz har birining nomini chiqarmoqchimiz
matn maydonining misol o'zgaruvchisi ko'rsatish maqsadida, biz qaysi matn maydonini aniqlashimiz kerak

Dasturiy ta'minot muhandisligi kuzatuvi 12.1


Voqea uchun hodisa tinglovchisi tegishli hodisa-tinglovchi interfeysini amalga oshirishi kerak.

Umumiy dasturlash xatosi 12.2


Muayyan GUI komponentining hodisasi uchun hodisani qayta ishlash ob'ektini ro'yxatdan o'tkazishni unutib qo'ysangiz
turi bo'lsa, bunday turdagi hodisalar e'tiborga olinmaydi.

490 12-bob GUI komponentlari: 1-qism

har safar actionPerformed chaqirilganda hodisa hosil qiladi. Voqea manbai - kompozitsiya
foydalanuvchi o'zaro aloqada bo'lgan nent. Matn maydonida yoki foydalanuvchi Enter tugmasini bosganida
parol maydoni diqqat markaziga ega, tizim o'z ichiga noyob ActionEvent ob'ektini yaratadi
voqea manbai va matn kabi hozirgina sodir bo'lgan voqea haqida ma'lumot
matn maydoni. Tizim ushbu ActionEvent obyektini voqea tinglovchisining actionPer-ga uzatadi.
shakllangan usul. 56-qator ko'rsatiladigan Stringni e'lon qiladi. O'zgaruvchi ishga tushirildi
bo'sh satr bilan - hech qanday belgilarsiz string. Kompilyator o'zgaruvchanlikni talab qiladi
agar 59-76 qatorlarda joylashgan bo'limlarning hech biri bajarilmasa, ishga tushirilishi mumkin.
ActionEvent usuli getSource (59, 64, 69 va 74-qatorlarda chaqiriladi) havolani qaytaradi
voqea manbasiga. 59-qatordagi shart: “Hodisa manbasi textField1mi?” Bu
shart havolalarni == operatori bilan solishtirib, ular bir xilga tegishli yoki yo'qligini aniqlaydi
ob'ekt. Agar ikkalasi ham textField1 ga murojaat qilsa, foydalanuvchi textField1 da Enter tugmasini bosdi. Keyin, chiziqlar
60–61 xabarlar dialogida 79-satr ko'rsatiladigan xabarni o'z ichiga olgan qatorni yarating.
61-qator foydalanuvchi kiritgan matnni olish uchun getActionCommand ActionEvent usulidan foydalanadi
hodisani yaratgan matn maydoni.
Ushbu misolda biz JPasswordFieldda parol matnini ko'rsatamiz
foydalanuvchi ushbu maydonda Enter tugmasini bosadi. Ba'zan dasturni qayta ishlash kerak bo'ladi
paroldagi belgilar. JPasswordField klassi getPassword usuli parolni qaytaradi.
so'z belgilarini char tipidagi massiv sifatida.
TextFieldTest sinfi
Sinf TextFieldTest (12.10-rasm) ushbu dasturni bajaradigan asosiy usulni o'z ichiga oladi.
va TextFieldFrame sinfining ob'ektini ko'rsatadi. Ilovani bajarganingizda, hatto
tahrir qilinmaydigan JTextField (textField3) ActionEvent yaratishi mumkin. Buni sinab ko'rish uchun bosing
Matn maydoniga diqqatni qaratib, Enter tugmasini bosing. Bundan tashqari, parolning haqiqiy matni
JPasswordField-da Enter tugmasini bosganingizda ko'rsatiladi. Albatta, siz odatdagidek bo'lardingiz
parolni ko'rsatmang!

1 // 12.10-rasm: TextFieldTest.java


2 // TextFieldFrame sinovi.
3 import javax.swing.JFrame;
4
5 umumiy sinf TextFieldTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 TextFieldFrame textFieldFrame = yangi TextFieldFrame();
10 textFieldFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 textFieldFrame.setSize(350, 100);
12 textFieldFrame.setVisible(rost);
13 }
14 } // oxirgi sinf TextFieldTest

12.10-rasm | TextFieldFrame sinovi. (2-qismning 1-qismi.)


12.7 Umumiy GUI hodisa turlari va tinglovchi interfeyslari 491

Ushbu ilova TextFieldHandler sinfining bitta obyektidan voqea tinglovchisi sifatida foydalangan
to'rtta matn maydoni uchun. 12.10-bo'limdan boshlab siz bir nechtasini e'lon qilish mumkinligini ko'rasiz
bir xil turdagi hodisalarni tinglovchi ob'ektlari va har bir ob'ektni alohida GUI kompozitsiyasi uchun ro'yxatdan o'tkazing.
Nent voqeasi. Ushbu uslub bizga bunda ishlatiladigan if…else mantiqini yo'q qilishga imkon beradi
Har bir komponent voqealari uchun alohida hodisa ishlov beruvchilarini taqdim etish orqali misolning hodisa ishlovchisi.
Java SE 8: Hodisa tinglovchilarini lambdalar bilan amalga oshirish
Eslatib o'tamiz, faqat bitta mavhum usulga ega ActionListener kabi interfeyslar ishlaydi.
Java SE 8 dagi milliy interfeyslar. 17.9-bo'limda biz amalga oshirishning yanada ixcham usulini ko'rsatamiz.
Java SE 8 lambdalari bilan voqea-tinglovchi interfeyslari.
12.7 Umumiy GUI hodisa turlari va tinglovchi interfeyslari
12.6-bo'limda siz foydalanuvchi sodir bo'lgan voqea haqida ma'lumotni bilib oldingiz
ActionEvent obyektida saqlanadigan matn maydonidagi Enter tugmasini bosadi. Ko'p turli xil turlari
hodisalar foydalanuvchi GUI bilan o'zaro aloqada bo'lganda sodir bo'lishi mumkin. Voqea haqida ma'lumot saqlanadi
AWTEventni kengaytiruvchi sinf ob'ekti (java.awt paketidan). 12.11-rasm
java.awt.event paketidagi ko'plab voqea sinflarini o'z ichiga olgan ierarxiyani ko'rib chiqadi. Biroz
bulardan ushbu bobda va 22-bobda muhokama qilinadi. Ushbu hodisa turlari ikkalasi bilan ham ishlatiladi

12.10-rasm | TextFieldFrame sinovi. (2-qismning 2-qismi.)


492 12-bob GUI komponentlari: 1-qism

AWT va Swing komponentlari. Swing GUI-ga xos bo'lgan qo'shimcha hodisa turlari
ponentlar javax.swing.event paketida e'lon qilinadi.

Keling, siz ko'rgan voqealarni boshqarish mexanizmining uchta qismini umumlashtiramiz


12.6-bo'lim - hodisa manbai, hodisa ob'ekti va voqea tinglovchisi. Voqea manbai
foydalanuvchi o'zaro aloqada bo'lgan GUI komponenti. Hodisa ob'ekti ma'lumotlarni qamrab oladi
sodir bo'lgan voqea haqida ma'lumot, masalan, voqea manbasiga havola va har qanday
voqeani tinglovchi tomonidan boshqarilishi uchun talab qilinishi mumkin bo'lgan hodisaga xos ma'lumotlar
voqea. Voqea tinglovchisi - bu voqea sodir bo'lganda voqea manbasi tomonidan xabardor qilinadigan ob'ekt
yuzaga keladi; Aslida, u hodisani "tinglaydi" va uning usullaridan biri javob sifatida amalga oshiriladi
voqea. Hodisa tinglovchisining usuli hodisa tinglovchisi hodisa ob'ektini qabul qilganda
voqea haqida xabardor qilinadi. Hodisa tinglovchisi keyin javob berish uchun voqea ob'ektidan foydalanadi
voqea. Hodisalarni boshqarishning ushbu modeli delegatsiya hodisasi modeli - hodisaning modeli sifatida tanilgan
ishlov berish ilovadagi ob'ektga (hodisalar tinglovchisiga) topshiriladi.
Har bir hodisa-ob'ekt turi uchun odatda mos keladigan hodisa-tinglovchi interfeysi mavjud.
GUI hodisasi uchun hodisa tinglovchisi bir yoki bir nechtasini amalga oshiradigan sinf ob'ektidir
java.awt.event va javax.swing.event paketlaridan voqea-tinglovchi interfeyslari.
Voqealar tinglovchilarining ko'p turlari Swing va AWT komponentlari uchun umumiydir. Bunday
turlari java.awt.event paketida e'lon qilinadi va ularning ba'zilari 12.12-rasmda ko'rsatilgan.
Swing komponentlariga xos bo'lgan qo'shimcha hodisa tinglovchi turlari e'lon qilingan
javax.swing.event paketi.

12.11-rasm | Java.awt.event paketining ba'zi voqea sinflari.

Ob'ekt

EventObject



AWTEvent

ContainerEvent

FocusEvent

PaintEvent

WindowEvent

InputEvent

ActionEvent

AdjustmentEvent

ItemEvent

TextEvent

ComponentEvent

KeyEvent MouseEvent

MouseWheelEvent

12.8 Hodisalarni boshqarish qanday ishlaydi 493

Har bir hodisani tinglovchi interfeysi bir yoki bir nechta hodisani boshqarish usullarini belgilaydi
interfeysni amalga oshiradigan sinfda e'lon qilinadi. 10.9-bo'limni eslang
interfeysni amalga oshiradigan sinf ushbu interfaolning barcha mavhum usullarini e'lon qilishi kerak.
yuz; aks holda, sinf mavhum sinf bo'lib, uni ob'ektlar yaratish uchun ishlatib bo'lmaydi.
Voqea sodir bo'lganda, foydalanuvchi o'zaro aloqada bo'lgan GUI komponenti xabar beradi
uning ro'yxatdan o'tgan tinglovchilariga har bir tinglovchining tegishli hodisani boshqarish usulini chaqirish orqali. Uchun
Masalan, foydalanuvchi JTextField-da Enter tugmasini bosganda, ro'yxatdan o'tgan tinglovchining
actionPerformed usuli deyiladi. Keyingi bo'limda biz muhokamamizni yakunlaymiz
oldingi misolda hodisani qayta ishlash qanday ishlaydi.

12.8 Hodisalarni boshqarish qanday ishlaydi


Keling, avvalgi matn maydonidan textField1 dan foydalanib, hodisalarni boshqarish mexanizmi qanday ishlashini ko'rsatamiz.
12.9-rasmning ko'pligi. 12.7-bo'limdan ikkita ochiq savolimiz bor:
1. Voqea boshqaruvchisi qanday ro'yxatdan o'tgan?
2. GUI komponenti ba'zi emas, balki actionPerformed deb chaqirishni qanday biladi
hodisalarni boshqarishning boshqa usuli?
Birinchi savolga 43-46-qatorlarda amalga oshirilgan voqea ro'yxatga olish javob beradi
12.9-rasm. Shakl 12.13 diagrammalar JTextField o'zgaruvchisi textField1, TextFieldHandler
o'zgaruvchan ishlov beruvchi va ular murojaat qiladigan ob'ektlar.
Hodisalarni ro'yxatdan o'tkazish
Har bir JComponentda bir ob'ektga ishora qiluvchi listenerList deb nomlangan misol o'zgaruvchisi mavjud
sinf EventListenerList (javax.swing.event to'plami). JComponent ning har bir ob'ekti

12.12-rasm | Java.awt.event to'plamining ba'zi umumiy hodisa-tinglovchi interfeyslari.

"interfeys"
ActionListener

"interfeys"


ComponentListener

"interfeys"


ContainerListener

"interfeys"


FocusListener

"interfeys"


ItemListener

"interfeys"


KeyListener

"interfeys"


Sichqoncha tinglovchisi

"interfeys"


MouseMotionListener

"interfeys"


TextListener

"interfeys"


WindowListener

"interfeys"


java.util.EventListener

"interfeys"


AdjustmentListener

494 12-bob GUI komponentlari: 1-qism

subklass o'zining ro'yxatdan o'tgan tinglovchilariga havolalarni tinglovchilar ro'yxatida saqlaydi. Oddiylik uchun,
12.13-rasmda biz listenerList ni JTextField obyekti ostidagi massiv sifatida chizdik.

Quyidagi bayonot (12.9-rasmning 43-qatori) bajarilganda

TextFieldHandler ob'ektiga havolani o'z ichiga olgan yangi yozuv joylashtirilgan
textField1 tinglovchilari ro'yxati. Diagrammada ko'rsatilmagan bo'lsa-da, bu yangi yozuv ham
tinglovchi turini o'z ichiga oladi (ActionListener). Bu mexanizm yordamida, har bir engil
Swing komponenti tinglovchilarning o'z ro'yxatini yuritadi, ular ushbu vazifani bajarish uchun ro'yxatdan o'tgan.
ponent voqealari.
Voqealarni ishlov beruvchini chaqirish
Hodisa-tinglovchi turi ikkinchi savolga javob berishda muhim: GUI qanday ishlaydi
komponent boshqa usuldan ko'ra actionPerformed deb nomlashni bilasizmi? Har bir GUI aloqasi
ponent bir nechta hodisa turlarini, jumladan, sichqoncha hodisalari, asosiy voqealar va boshqalarni qo'llab-quvvatlaydi. Qachon
voqea sodir bo'lganda, voqea faqat tegishli turdagi voqea tinglovchilariga yuboriladi.
Dispetcherlik - bu GUI komponenti hodisani qayta ishlashni chaqiradigan jarayon
sodir bo'lgan hodisa turi uchun ro'yxatdan o'tgan har bir tinglovchida usul.
Har bir hodisa turi bir yoki bir nechta mos keladigan hodisa tinglovchi interfeysiga ega. Masalan,
ActionEvents bilan ActionListeners, MouseEvents MouseListeners va
MouseMotionListeners va KeyListeners tomonidan KeyEvents. Voqea sodir bo'lganda, GUI
komponent hodisa turini ko'rsatuvchi noyob hodisa identifikatorini (JVM dan) oladi. GUI
Komponent voqea identifikatoridan foydalanib, voqea qaysi tinglovchi turiga qaytarilishi kerakligini hal qiladi.
yamalgan va har bir tinglovchi ob'ektida qaysi usulni chaqirishni hal qilish. ActionEvent uchun
hodisa ro'yxatdan o'tgan har bir ActionListenerning actionPerformed usuliga yuboriladi (yagona
ActionListener interfeysidagi usul). MouseEvent uchun voqea har biriga yuboriladi
ro'yxatdan o'tgan MouseListener yoki MouseMotionListener, sichqoncha hodisasiga qarab

12.13-rasm | JTextField textField1 uchun hodisani ro'yxatdan o'tkazish.

textField1.addActionListener(ishlovchi);

Ushbu ma'lumotnoma bayonot tomonidan yaratilgan


textField1.addActionListener( ishlov beruvchi );

Ommaviy bekor harakat bajarildi(


ActionEvent hodisasi)
{
// voqea shu yerda ko'rib chiqiladi
}

tinglovchilar roʻyxati

JTextField obyekti TextFieldHandler obyekti

textField1 ishlov beruvchisi

...

12.9 JButton 495

yuzaga keladi. MouseEvent hodisa identifikatori bir nechta sichqoncha hodisalaridan qaysi biri bilan ishlashni aniqlaydi
usullari deyiladi. Bu qarorlarning barchasi siz uchun GUI komponentlari tomonidan hal qilinadi. Hammangiz
qilish kerak bo'lgan narsa - ilovangizning muayyan hodisa turi uchun voqea ishlovchisini ro'yxatdan o'tkazish
talab qiladi va GUI komponenti voqea ishlov beruvchining mos usulini ta'minlaydi
voqea sodir bo'lganda chaqiriladi. Biz boshqa hodisa turlari va voqea-tinglovchi interfeyslarini muhokama qilamiz
chunki ular biz kiritgan har bir yangi komponent bilan kerak.

12.9 J tugmasi


Tugma - bu foydalanuvchi ma'lum bir harakatni boshlash uchun bosadigan komponent. Java ilovasi mumkin
bir necha turdagi tugmalardan foydalaning, jumladan, buyruq tugmalari, tasdiqlash qutilari, almashtirish tugmalari va
radio tugmalari. 12.14-rasmda biz ko'rgan Swing tugmalarining meros ierarxiyasi ko'rsatilgan.
bu bobda. Ko'rib turganingizdek, barcha tugma turlari AbstractButtonning pastki sinflaridir
(javax.swing paketi), bu Swing tugmalarining umumiy xususiyatlarini e'lon qiladi. Bunda
bo'limda biz odatda buyruqni boshlash uchun ishlatiladigan tugmalarga e'tibor qaratamiz.

Buyruq tugmasi (12.16-rasmning chiqishiga qarang) foydalanuvchi ActionEventni hosil qiladi.


bosadi. Buyruq tugmalari JButton klassi yordamida yaratilgan. A yuzidagi matn
JButton tugma yorlig'i deb ataladi.

Ishlash bo'yicha maslahat 12.1


GUI har doim foydalanuvchiga javob berishi kerak. An ichida uzoq davom etadigan vazifani bajarish
voqea ishlov beruvchisi foydalanuvchining ushbu vazifa tugaguniga qadar GUI bilan o'zaro ta'sir qilishiga to'sqinlik qiladi.
23.11-bo'limda bunday muammolarni oldini olish usullari ko'rsatilgan.

12.14-rasm | Tegishli tugma ierarxiyasi.

Ko'rish va his qilish kuzatuvi 12.8
Tugmalardagi matn odatda kitob sarlavhasini bosh harflardan foydalanadi.

Ko'rish va his qilish kuzatuvi 12.9


GUI ko'p JButtonlarga ega bo'lishi mumkin, lekin har bir tugma yorlig'i qismda noyob bo'lishi kerak
hozirda ko'rsatilgan GUI. Xuddi shu yorliqli bir nechta JButtonga ega bo'lish
JButtons foydalanuvchi uchun noaniq qiladi.

JComponent

Abstract tugmasi

JButton JToggleButton

JCheckBox JRadioButton

496 12-bob GUI komponentlari: 1-qism

Shakllarning qo'llanilishi. 12.15 va 12.16 ikkita JButtons yaratadi va buni ko'rsatadi
JButtons piktogrammalarni ko'rsatishi mumkin. Tugmalar uchun hodisalarni boshqarish bitta tomonidan amalga oshiriladi
ButtonHandler ichki sinfining namunasi (12.15-rasm, 39-48-qatorlar).

1 // 12.15-rasm: ButtonFrame.java


2 // Buyruq tugmalari va harakat hodisalari.
3 import java.awt.FlowLayout;
4 import java.awt.event.ActionListener;
5 import java.awt.event.ActionEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JButton;
8 import javax.swing.Icon;
9 import javax.swing.ImageIcon;
10 import javax.swing.JOptionPane;
11
12 ommaviy sinf ButtonFrame JFrame-ni kengaytiradi
13 {
14
15
16
17 // ButtonFrame JFrame-ga JButton-larni qo'shadi
18 umumiy tugma ramkasi()
19 {
20 super("Sinov tugmalari");
21 setLayout(yangi FlowLayout());
22
23
24 qo'shish (oddiy JButton); // JFrame-ga plainJButton qo'shing
25
26
27
28
29
30 qo'shish (fancyJButton); // JFrame-ga fancyJButton qo'shing
31
32
33
34
35
36 }
37
38 // tugma hodisalarini boshqarish uchun ichki sinf
39
40 {
41 // ishlov berish tugmasi hodisasi
42 @Bekor qilish
43 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
44 {
45 JOptionPane.showMessageDialog( , String.format(
46 "Siz bosdingiz: %s", ));
47 }
48 }
49 } // end klassi ButtonFrame
12.15-rasm | Buyruq tugmalari va harakat hodisalari.

xususiy final JButton plainJButton; // faqat matnli tugma


xususiy final JButton fancyJButton; // piktogramma bilan tugma

plainJButton = yangi JButton("Oddiy tugma"); // matnli tugma

Bug1 belgisi = yangi ImageIcon(getClass().getResource("bug1.gif"));
Bug2 belgisi = yangi ImageIcon(getClass().getResource("bug2.gif"));
fancyJButton = yangi JButton("Fancy Button", bug1); // tasvirni o'rnatish
fancyJButton.setRolloverIcon(bug2); // ag'darilgan tasvirni o'rnatish

// tugma hodisalarini boshqarish uchun yangi ButtonHandler yarating


ButtonHandler ishlov beruvchisi = yangi ButtonHandler();
fancyJButton.addActionListener(ishlovchi);
plainJButton.addActionListener(ishlovchi);

xususiy sinf ButtonHandler ActionListener-ni amalga oshiradi

ButtonFrame.this
event.getActionCommand()

12.9 JButton 497

14-15 qatorlar JButton o'zgaruvchilari plainJButton va fancyJButtonni e'lon qiladi. to'g'ri -
sponding ob'ektlar konstruktorda instantsiyalangan. 23-qator plainJButton bilan yaratadi
tugma yorlig'i "Oddiy tugma". 24-qator JFrame-ga JButton-ni qo'shadi.
JButton ikonkani ko'rsatishi mumkin. Foydalanuvchiga vizual interyerning qo'shimcha darajasini ta'minlash uchun
GUI bilan harakat qilish uchun JButton ham ag'darish belgisiga ega bo'lishi mumkin - bu belgi ko'rsatiladi
foydalanuvchi sichqonchani JButton ustiga qo'yganda. JButtondagi belgi shunday o'zgaradi
sichqonchani ekrandagi JButton maydoniga va undan tashqariga harakat qiladi. 26-27 qatorlar ikkita hosil qiladi

1 // 12.16-rasm: ButtonTest.java


2 // ButtonFrame-ni sinab ko'rish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf ButtonTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 ButtonFrame tugmasiFrame = new ButtonFrame();
10 buttonFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 buttonFrame.setSize(275, 110);
12 buttonFrame.setVisible(rost);
13 }
14 } // tugatish sinfi ButtonTest

12.16-rasm | ButtonFrame sinovi.


498 12-bob GUI komponentlari: 1-qism

JButton cre- uchun standart Icon va rollover Iconni ifodalovchi ImageIcon ob'ektlari
28-satrda berilgan. Ikkala bayonot ham tasvir fayllari bitta katalogda saqlanadi deb taxmin qiladi
ilova sifatida. Rasmlar odatda ilova bilan bir xil katalogga joylashtiriladi yoki
tasvirlar kabi pastki katalog). Ushbu rasm fayllari siz uchun taqdim etilgan
misol.
28-qator “Fancy Button” matni va bug1 belgisi bilan fancyButton yaratadi. tomonidan
sukut bo'yicha, matn belgining o'ng tomonida ko'rsatiladi. 29-qatorda setRolloverIcon ishlatiladi (o'ziga xos-
AbstractButton sinfidan olingan) JButtonda ko'rsatilgan tasvirni belgilash uchun
foydalanuvchi sichqonchani uning ustiga joylashtiradi. 30-qator JFrame-ga JButton-ni qo'shadi.

JTextFields kabi JButtons har kim tomonidan qayta ishlanishi mumkin bo'lgan ActionEvents-ni yaratadi


ActionListener obyekti. 33-35 qatorlar xususiy ichki sinf ob'ektini yaratadi ButtonHan-
dler va addActionListener dan foydalaning va uni har bir JButton uchun voqea ishlovchisi sifatida ro'yxatdan o'tkazing. Sinf
ButtonHandler (39-48-qatorlar) xabar dialog oynasini ko'rsatish uchun bajarilgan harakatni e'lon qiladi
foydalanuvchi bosgan tugma uchun yorliqni o'z ichiga oladi. JButton hodisasi uchun ActionEvent
getActionCommand usuli JButton yorlig'ini qaytaradi.

Ichki sinfdan yuqori darajadagi sinf ob'ektida ushbu havolaga kirish


Ushbu ilovani ishga tushirganingizda va uning tugmalaridan birini bosganingizda, xabar paydo bo'lishiga e'tibor bering
paydo bo'lgan dialog oynasi dastur oynasining markazida joylashgan. Bu qo'ng'iroq tufayli sodir bo'ladi
JOptionPane usulida showMessageDialog (45–46-qatorlar) oʻrniga ButtonFrame.this dan foydalanadi.
birinchi argument sifatida nulldan ko'ra. Agar bu argument null bo'lmasa, u atalmishni ifodalaydi
xabar dialogining asosiy GUI komponenti (bu holda dastur oynasi
ota-komponent) va dialog oynasini o'sha komponent ustida markazlashtirishga imkon beradi
dialog oynasi ko'rsatiladi. ButtonFrame.this yuqoridagi ob'ektning ushbu havolasini ifodalaydi.
ButtonFrame darajali sinf.

12.10 Holatni saqlaydigan tugmalar


Swing GUI komponentlarida uchta turdagi holat tugmalari mavjud - JToggleButton,
JCheckBox va JRadioButton - yoqish/o'chirish yoki rost/noto'g'ri qiymatlarga ega. JCheckBox sinflari
va JRadioButton JToggleButtonning quyi sinflaridir (12.14-rasm). JRadioButton farq qiladi
JCheckBox dan farq qiladi, chunki odatda bir nechta JRadioButtons birga guruhlangan va

Ko'rish va his qilish kuzatuvi 12.10


AbstractButton klassi tugmachada matn va tasvirlarni ko'rsatishni qo'llab-quvvatlaganligi sababli, barcha pastki
AbstractButton sinflari matn va tasvirlarni ko'rsatishni ham qo'llab-quvvatlaydi.

Ko'rish va his qilish kuzatuvi 12.11


Rollover piktogrammalari a
JButton bosiladi.

Dasturiy ta'minot muhandisligi kuzatuvi 12.2


Ichki sinfda foydalanilganda, bu kalit so'z joriy ichki sinf ob'ektiga ishora qiladi
manipulyatsiya qilingan. Ichki sinf usuli o'zining tashqi sinf ob'ekti this dan oldingisidan foydalanishi mumkin
ButtonFrame.this-dagi kabi tashqi sinf nomi va nuqta (.) ajratgich bilan.

12.10 Holatni saqlaydigan tugmalar 499

bir-birini istisno qiladi - istalgan vaqtda guruhda faqat bittasi tanlanishi mumkin, xuddi lekin-
tonna avtomobil radiosida. Biz birinchi navbatda JCheckBox sinfini muhokama qilamiz.
12.10.1 JCheckBox
Shakllarning qo'llanilishi. 12.17–12.18 istalgan shrift uslubini tanlash uchun ikkita JCheckBox-dan foydalanadi
JTextField da ko'rsatilgan matnning. Tanlanganda, biri qalin uslubni qo'llaydi, ikkinchisi
kursiv uslub. Agar ikkalasi ham tanlangan bo'lsa, uslub qalin va kursiv bo'ladi. Ilova dastlab qachon
bajariladi, JCheckBox ham belgilanmagan (ya'ni, ikkalasi ham noto'g'ri), shuning uchun shrift oddiy. Sinf
CheckBoxTest (12.18-rasm) ushbu dasturni bajaradigan asosiy usulni o'z ichiga oladi.

1 // 12.17-rasm: CheckBoxFrame.java


2 // JCheckBoxes va element hodisalari.
3 import java.awt.FlowLayout;
4 import java.awt.Font;
5 import java.awt.event.ItemListener;
6 import java.awt.event.ItemEvent;
7 import javax.swing.JFrame;
8 import javax.swing.JTextField;
9 import javax.swing.JCheckBox;
10
11 umumiy sinf CheckBoxFrame JFrame-ni kengaytiradi
12 {
13 xususiy yakuniy JTextField textField; // o'zgaruvchan shriftlarda matnni ko'rsatadi
14
15
16
17 // CheckBoxFrame konstruktori JFrame-ga JCheckBoxes-ni qo'shadi
18 ommaviy CheckBoxFrame()
19 {
20 super("JCheckBox Testi");
21 setLayout(yangi FlowLayout());
22
23 // JTextField-ni o'rnating va uning shriftini o'rnating
24 textField = new JTextField("Shrift uslubi o'zgarishini kuzatish", 20);
25
26 qo'shish (textField); // JFrame-ga textField qo'shing
27
28 boldJCheckBox = yangi JCheckBox("Qalin");
29 kursivJCheckBox = yangi JCheckBox("Kursiv");
30 qo'shish (boldJCheckBox); // JFrame-ga qalin belgilash katakchasini qo'shing
31 qo'shish (italikJCheckBox); // JFrame-ga kursiv belgilash katakchasini qo'shing
32
33
34
35
36
37 }
38
39 // ItemListener hodisalarini boshqarish uchun shaxsiy ichki sinf
40
41 {

12.17-rasm | JCheckBoxes va element hodisalari. (2-qismning 1-qismi.)

xususiy yakuniy JCheckBox boldJCheckBox; // qalin qilib tanlash/tanlovni olib tashlash
xususiy yakuniy JCheckBox italicJCheckBox; // kursivni tanlash/tanlovni olib tashlash uchun

textField.setFont(yangi Shrift("Serif", Font.PLAIN, 14));

// JCheckBoxes uchun tinglovchilarni ro'yxatdan o'tkazish
CheckBoxHandler ishlov beruvchisi = yangi CheckBoxHandler();
boldJCheckBox.addItemListener(ishlovchi);
italicJCheckBox.addItemListener(ishlovchi);

xususiy sinf CheckBoxHandler ItemListener-ni amalga oshiradi


500 12-bob GUI komponentlari: 1-qism

JTextField yaratilgandan va ishga tushirilgandan so'ng (12.17-rasm, 24-qator), 25-qator foydalanadi
Shriftni o'rnatish uchun setFont usuli (JTextField tomonidan komponent sinfidan bilvosita meros qilib olingan)
JTextField dan Shrift sinfining yangi ob'ektiga (java.awt to'plami). Yangi shrift ini-

42 // tasdiqlash qutisi hodisalariga javob bering


43 @Bekor qilish
44
45 {
46 Shrift shrifti = null; // yangi Shriftni saqlaydi
47
48 // Qaysi CheckBoxlar belgilanganligini aniqlang va Shrift yarating
49 agar ( )
50 shrift = yangi Shrift("Serif", Font.BOLD + Font.ITALIC, 14);
51 boshqa agar ( )
52 shrift = yangi Shrift("Serif", Font.BOLD, 14);
53 boshqa agar ( )
54 shrift = new Font("Serif", Font.ITALIC, 14);
yana 55
56 shrift = new Font("Serif", Font.PLAIN, 14);
57
58 textField.setFont(shrift);
59 }
60 }
61 } // oxirgi sinf CheckBoxFrame

1 // 12.18-rasm: CheckBoxTest.java


2 // CheckBoxFrame sinovi.
3 import javax.swing.JFrame;
4
5 umumiy sinf CheckBoxTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 CheckBoxFrame checkBoxFrame = yangi CheckBoxFrame();
10 checkBoxFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 checkBoxFrame.setSize(275, 100);
12 checkBoxFrame.setVisible(rost);
13 }
14 } // yakuniy sinf CheckBoxTest

12.18-rasm | CheckBoxFrame sinovdan o'tkazilmoqda.

12.17-rasm | JCheckBoxes va element hodisalari. (2-qismning 2-qismi.)

public void itemStateChanged (ItemEvent hodisasi)

boldJCheckBox.isSelected() && italicJCheckBox.isSelected()

boldJCheckBox.isSelected()

italicJCheckBox.isSelected()

12.10 501 holatini saqlaydigan tugmalar

"Serif" bilan bog'langan (Times kabi shriftni ifodalovchi umumiy shrift nomi va
barcha Java platformalarida portlangan), Shrift.PLAIN uslubi va 14 nuqtali o'lcham. Keyinchalik, 28-29 qatorlar yaratiladi
ikkita JCheckBox obyekti. JCheckBox konstruktoriga o'tkazilgan string belgilash katagidir
sukut bo'yicha JCheckBox o'ng tomonida ko'rinadigan yorliq.
Foydalanuvchi JCheckBox-ni bosganida, ItemEvent sodir bo'ladi. Ushbu hodisani hal qilish mumkin
ItemStateChanged usulini amalga oshirishi kerak bo'lgan ItemListener ob'ekti tomonidan. Bunda
Masalan, hodisani qayta ishlash CheckBox-ning xususiy ichki klassi misoli tomonidan amalga oshiriladi.
Ishlovchi (40-60 qatorlar). 34-36 qatorlar CheckBoxHandler sinfining namunasini yaratadi va reg-
JCheckBox ob'yektlari uchun tinglovchi sifatida addItemListener usuli bilan uni ishlating.
CheckBoxHandler usuli itemStateChanged (43–59-qatorlar) foydalanuvchi qachon chaqiriladi
boldJCheckBox yoki italicJCheckBox-ni bosing. Ushbu misolda biz to'sqinlik qilmaymiz -
JCheckBox bosilgan mening - biz shriftni aniqlash uchun ularning ikkala holatidan foydalanamiz
ko'rsatish. 49-qator ikkala JCheckBox-ning mavjudligini aniqlash uchun JCheckBox isSelected usulidan foydalanadi.
tanlangan. Agar shunday bo'lsa, 50-qator Shrift konstantalarini qo'shish orqali qalin kursiv shrift yaratadi.
va Shrift konstruktorining shrift uslubi argumenti uchun Font.ITALIC. 51-qator belgilaydi
boldJCheckBox tanlanganmi va agar shunday bo'lsa, 52-qator qalin shrift yaratadi. 53-qator cheklaydi
kursivJCheckBox tanlangan yoki yo'qligini tekshiradi va agar shunday bo'lsa, 54-satr kursiv shrift yaratadi. Agar
oldingi shartlarning hech biri to'g'ri emas, 56-satr Shrift konfiguratsiyasi yordamida oddiy shrift yaratadi.
doimiy Shrift.PLAIN. Nihoyat, 58-qator shriftni o'zgartiradigan textField-ning yangi shriftini o'rnatadi
ekrandagi JTextField.

Ichki sinf va uning yuqori darajadagi sinfi o'rtasidagi munosabatlar


CheckBoxHandler sinfi boldJCheckBox (49 va 51-qatorlar), italicJCheck- o'zgaruvchilaridan foydalangan.
Box (49 va 53-qatorlar) va textField (58-qator), garchi ular matnda e'lon qilinmagan bo'lsa ham.
ichki sinf. Eslatib o'tamiz, ichki sinf o'zining yuqori darajadagi sinfi bilan alohida munosabatga ega
yuqori darajadagi sinfning barcha o'zgaruvchilari va usullariga kirishga ruxsat berdi. CheckBoxHandler
itemStateChanged usuli (43–59-qator) qaysi birini aniqlash uchun ushbu munosabatdan foydalanadi
JTextField-da shriftni o'rnatish uchun JCheckBoxes belgilanadi. E'tibor bering, hech biri
CheckBoxHandler ichki sinfidagi kod yuqori darajadagi sinfga aniq havolani talab qiladi
ob'ekt.

12.10.2 JRadioButton


Radio tugmalari (JRadioButton klassi bilan e'lon qilingan) ular bo'yicha belgilash katakchalariga o'xshaydi
ikkita holatga ega - tanlangan va tanlanmagan (shuningdek, tanlanmagan deb ataladi). Biroq, radio tugmalari
odatda bir vaqtning o'zida faqat bitta tugmani tanlash mumkin bo'lgan guruh sifatida paydo bo'ladi (qarang:
qo'yish 12.20-rasm). Radio tugmalari bir-birini istisno qiluvchi variantlarni ko'rsatish uchun ishlatiladi (ya'ni,
guruhdagi bir nechta variantni bir vaqtning o'zida tanlab bo'lmaydi). Mantiqiy munosabat
radio tugmalari orasidagi tugmalar ButtonGroup obyekti (javax.swing paketi) tomonidan saqlanadi.
o'zi GUI komponenti emas. ButtonGroup obyekti tugmalar guruhini tashkil qiladi
va foydalanuvchi interfeysida o'zi ko'rsatilmaydi. Aksincha, individual JRadioButton ob'ektlari
guruhdan GUI-da ko'rsatiladi.
Shakllarning qo'llanilishi. 12.19-12.20 shakldagiga o'xshash. 12.17–12.18. Foydalanuvchi
JTextField matnining shrift uslubini o'zgartirishi mumkin. Ilova radio tugmalaridan foydalanadi
bir vaqtning o'zida guruhda faqat bitta shrift uslubini tanlashga ruxsat bering. RadioButtonTest sinfi
(12.20-rasm) ushbu dasturni bajaradigan asosiy usulni o'z ichiga oladi.

502 12-bob GUI komponentlari: 1-qism

1 // 12.19-rasm: RadioButtonFrame.java
2 // ButtonGroup va JRadioButton yordamida radio tugmalar yaratish.
3 import java.awt.FlowLayout;
4 import java.awt.Font;
5 import java.awt.event.ItemListener;
6 import java.awt.event.ItemEvent;
7 import javax.swing.JFrame;
8 import javax.swing.JTextField;
9 import javax.swing.JRadioButton;
10 import javax.swing.ButtonGroup;
11
12 ommaviy sinf RadioButtonFrame JFrame-ni kengaytiradi
13 {
14 xususiy yakuniy JTextField textField; // shrift o'zgarishlarini ko'rsatish uchun ishlatiladi
15 xususiy yakuniy Shrift plainFont; // oddiy matn uchun shrift
16 shaxsiy yakuniy Shrift boldFont; // qalin matn uchun shrift
17 shaxsiy yakuniy Shrift kursiv; // kursiv matn uchun shrift
18 shaxsiy yakuniy Shrift boldItalicFont; // qalin va kursiv matn uchun shrift
19
20
21
22
23
24
25 // RadioButtonFrame konstruktori JFrame-ga JRadioButtons qo'shadi
26 ommaviy RadioButtonFrame()
27 {
28 super("RadioButton Testi");
29 setLayout(yangi FlowLayout());
30
31 textField = new JTextField("Shrift uslubi o'zgarishini kuzatish", 25);
32 qo'shish (textField); // JFrame-ga textField qo'shing
33
34 // radio tugmalarini yaratish
35
36
37
38
39 qo'shish (oddiy JRadioButton); // JFrame-ga oddiy tugmani qo'shing
40 qo'shish (boldJRadioButton); // JFrame-ga qalin tugmani qo'shing
41 qo'shish (italik JRadioButton); // JFrame-ga kursiv tugmani qo'shing
42 qo'shish (boldItalicJRadioButton); // qalin va kursiv tugmani qo'shing
43
44
45
46
47
48
49
50
51 // shrift obyektlarini yaratish
52 plainFont = new Font("Serif", Font.PLAIN, 14);
53 boldFont = new Font("Serif", Font.BOLD, 14);

12.19-rasm | ButtonGroup va JRadioButton yordamida radio tugmalarini yaratish. (2-qismning 1-qismi.)

xususiy final JRadioButton plainJRadioButton; // oddiy matnni tanlaydi
xususiy final JRadioButton boldJRadioButton; // qalin matnni tanlaydi
xususiy final JRadioButton italicJRadioButton; // kursiv matnni tanlaydi
xususiy final JRadioButton boldItalicJRadioButton; // qalin va kursiv
xususiy yakuniy ButtonGroup radioGroup; // radio tugmalarini ushlab turadi

plainJRadioButton = yangi JRadioButton("Oddiy", rost);


boldJRadioButton = yangi JRadioButton("Qalin", noto'g'ri);
italicJRadioButton = yangi JRadioButton("Kursiv", noto'g'ri);
boldItalicJRadioButton = yangi JRadioButton("Qalin/kursiv", noto'g'ri);

// JRadioButtons o'rtasida mantiqiy aloqani yaratish


radioGroup = new ButtonGroup(); // ButtonGroup yarating
radioGroup.add(plainJRadioButton); // guruhga oddiy qo'shing
radioGroup.add(boldJRadioButton); // guruhga qalin qo'shing
radioGroup.add(italikJRadioButton); // guruhga kursiv qo'shing
radioGroup.add(boldItalicJRadioButton); // qalin va kursiv qo'shing

12.10 Holatni saqlaydigan tugmalar 503

54 italicFont = new Font("Serif", Font.ITALIC, 14);
55 boldItalicFont = new Font("Serif", Font.BOLD + Font.ITALIC, 14);
56 textField.setFont(plainFont);
57
58
59
60
61
62
63
64
65
66
67 }
68
69 // radio tugmalari hodisalarini boshqarish uchun shaxsiy ichki sinf
70
71 {
72 shaxsiy shrift; // bu tinglovchi bilan bog'langan shrift
73
74
75 {
76 shrift = f;
77 }
78
79 // radio tugma hodisalarini boshqarish
80 @Bekor qilish
81 ommaviy void itemStateChanged (ItemEvent hodisasi)
82 {
83 textField.setFont(shrift);
84 }
85 }
86 } // oxirgi sinf RadioButtonFrame

1 // 12.20-rasm: RadioButtonTest.java


2 // RadioButtonFrame-ni sinab ko'rish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf RadioButtonTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 RadioButtonFrame radioButtonFrame = yangi RadioButtonFrame();
10 radioButtonFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 radioButtonFrame.setSize(300, 100);
12 radioButtonFrame.setVisible(rost);
13 }
14 } // oxirgi sinf RadioButtonTest

12.20-rasm | RadioButtonFrame sinovi. (2-qismning 1-qismi.)

12.19-rasm | ButtonGroup va JRadioButton yordamida radio tugmalarini yaratish. (2-qismning 2-qismi.)

// JRadioButtons uchun voqealarni ro'yxatdan o'tkazish


plainJRadioButton.addItemListener(
yangi RadioButtonHandler(plainFont));
boldJRadioButton.addItemListener(
yangi RadioButtonHandler(boldFont));
italicJRadioButton.addItemListener(
yangi RadioButtonHandler(italicFont));
boldItalicJRadioButton.addItemListener(
yangi RadioButtonHandler(boldItalicFont));

xususiy sinf RadioButtonHandler ItemListener-ni amalga oshiradi

ommaviy RadioButtonHandler(f shrifti)

504 12-bob GUI komponentlari: 1-qism

Konstruktordagi 35–42-qatorlar (12.19-rasm) to‘rtta JRadioButton obyektini yaratib, qo‘shing.
ularni JFrame-ga. Har bir JRadioButton qatorda shunday konstruktor chaqiruvi bilan yaratilgan
35. Bu konstruktor JRadioButtonning o‘ng tomonida ko‘rinadigan yorliqni belgilaydi.
sukut bo'yicha va JRadioButtonning boshlang'ich holati. Haqiqiy ikkinchi dalil buni ko'rsatadi
JRadioButton ko'rsatilganda tanlangan ko'rinishi kerak.
45-qator ButtonGroup ob'ekti radioGroup ni yaratadi. Bu ob'ekt "yopishtiruvchi" dir
to'rtta JRadioButton ob'ektlari o'rtasidagi mantiqiy munosabatni hosil qiladi va faqat bittasiga ruxsat beradi
bir vaqtning o'zida to'rttadan tanlanadi. ButtonGroupda JRadioButtons bo'lmasligi mumkin
tanlangan, lekin bu faqat tugmachaga oldindan tanlangan JRadioButtonlar qo'shilmagan taqdirdagina sodir bo'lishi mumkin.
tonGroup va foydalanuvchi hali JRadioButtonni tanlamagan. 46–49 qatorlarda ButtonGroup ishlatiladi
JRadioButtonlarning har birini radioGroup bilan bog'lash uchun qo'shish usuli. Agar bir nechta bo'lsa
tanlangan JRadioButton ob'ekti guruhga qo'shiladi, birinchi qo'shilgan tanlangan
GUI ko'rsatilganda tanlanadi.
JRadioButtons, JCheckBoxes kabi, ular bosilganda ItemEvents yaratadi. Chiziqlar
59-66 RadioButtonHandler ichki sinfining to'rtta nusxasini yaratadi (70-85-qatorlarda e'lon qilingan).
Ushbu misolda, har bir voqea tinglovchi obyekti yaratilgan ItemEventni boshqarish uchun ro'yxatga olingan
foydalanuvchi ma'lum bir JRadioButton tugmachasini bosganda. E'tibor bering, har bir RadioButtonHandler
ob'ekt ma'lum Shrift ob'ekti bilan ishga tushiriladi (52-55 qatorlarda yaratilgan).
RadioButtonHandler sinfi (70–85-qator) ItemListener interfeysini amalga oshiradi, shuning uchun
JRadioButtons tomonidan yaratilgan ItemEvents-ni boshqaring. Konstruktor Shriftni saqlaydi
ob'ektni voqea-tinglovchi ob'ektining misol o'zgaruvchisi shriftida argument sifatida qabul qiladi
(72-qatorda e'lon qilingan). Foydalanuvchi JRadioButton tugmachasini bosganida radioGroup oldingi tugmani o'chiradi.
aniq tanlangan JRadioButton va itemStateChanged usuli (80–84-qatorlar) shriftni o'rnatadi
JTextField-da JRadioButton-ning tegishli hodisa tinglovchisida saqlangan shriftga
ob'ekt. E'tibor bering, RadioButtonHandler ichki sinfining 83-qatori yuqori darajadagi sinfdan foydalanadi.
shriftni o'rnatish uchun textField misol o'zgaruvchisi.
12.11 JComboBox; uchun anonim ichki sinfdan foydalanish
Voqealarni boshqarish
Birlashtirilgan oyna (ba'zan ochiladigan ro'yxat deb ataladi) foydalanuvchiga bitta elementni tanlash imkonini beradi
ro'yxati (12.22-rasm). Kombo qutilar kengaytirilgan JComboBox klassi bilan amalga oshiriladi

12.20-rasm | RadioButtonFrame sinovi. (2-qismning 2-qismi.)


12.11 JComboBox; Voqealarni boshqarish uchun anonim ichki sinfdan foydalanish 505

JComponent sinfi. JComboBox - bu ArrayList sinfi kabi umumiy sinf (7-bob). Qachon
JComboBox-ni yaratasiz, u boshqaradigan ob'ektlar turini belgilaysiz - JCombo-
Keyin Box har bir ob'ektning String tasvirini ko'rsatadi.

1 // 12.21-rasm: ComboBoxFrame.java


2 // JComboBox, bu rasm nomlari ro'yxatini ko'rsatadi.
3 import java.awt.FlowLayout;
4 import java.awt.event.ItemListener;
5 import java.awt.event.ItemEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JLabel;
8 import javax.swing.JComboBox;
9 import javax.swing.Icon;
10 import javax.swing.ImageIcon;
11
12 umumiy sinf ComboBoxFrame JFrame-ni kengaytiradi
13 {
14
15 xususiy yakuniy JLabel yorlig'i; // tanlangan belgini ko'rsatadi
16
17 ta xususiy statik yakuniy String[] nomlari =
18 {"bug1.gif", "bug2.gif", "travelbug.gif", "buganim.gif"};
19 ta shaxsiy yakuniy Icon[] belgisi = {
20 ta yangi ImageIcon(getClass().getResource(nomlar[0])),
21 ta yangi ImageIcon(getClass().getResource(nomlar[1])),
22 ta yangi ImageIcon(getClass().getResource(nomlar[2])),
23 ta yangi ImageIcon(getClass().getResource(names[3]))};
24
25 // ComboBoxFrame konstruktori JComboBox-ni JFrame-ga qo'shadi
26 umumiy ComboBoxFrame()
27 {
28 super("JComboBox sinovi");
29 setLayout(yangi FlowLayout()); // ramka tartibini o'rnatish
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

12.21-rasm | Rasm nomlari ro'yxatini ko'rsatadigan JComboBox. (2-qismning 1-qismi.)

xususiy final JComboBox imagesJComboBox; // ikona nomlarini saqlaydi

imagesJComboBox = yangi JComboBox(nomlar); // JComboBox-ni o'rnating


imagesJComboBox.setMaximumRowCount(3); // uchta qatorni ko'rsatish

imagesJComboBox.addItemListener(


new ItemListener() // anonim ichki sinf
{
// JComboBox hodisasini boshqarish
@Override
public void itemStateChanged (ItemEvent hodisasi)
{
// element tanlangan yoki yo'qligini aniqlang
agar (event.getStateChange() == ItemEvent.SELECTED)
label.setIcon(belgilar[
imagesJComboBox.getSelectedIndex()]);
}
} // anonim ichki sinfni tugatish
); // addItemListener-ga qo'ng'iroqni tugatish

506 12-bob GUI komponentlari: 1-qism

JComboBoxes, xuddi JCheckBoxes va JRadioButtons kabi ItemEvents yaratadi. Bu
misol, shuningdek, hodisa paytida tez-tez ishlatiladigan ichki sinfning maxsus shaklini ko'rsatadi.
dling. Ilova (12.21–12.22-rasmlar) to'rtta tasvir ro'yxatini taqdim etish uchun JComboBox-dan foydalanadi.
foydalanuvchi ko'rsatish uchun bitta rasmni tanlashi mumkin bo'lgan fayl nomlari. Foydalanuvchi a ni tanlaganda
nomi bo'lsa, ilova tegishli tasvirni JLabel-dagi Belgi sifatida ko'rsatadi. Sinf komiteti
boBoxTest (12.22-rasm) ushbu dasturni bajaradigan asosiy usulni o'z ichiga oladi. The
Ushbu ilova uchun ekran tasvirlari tanlangandan so'ng JComboBox ro'yxatini ko'rsatadi
qaysi rasm fayl nomi tanlanganligini ko'rsatish uchun.

49 qo'shish (rasmlarJComboBox); // JFrame-ga birlashgan oyna qo'shing


50 yorliq = yangi JLabel(belgilar[0]); // birinchi belgini ko'rsatish
51 qo'shish (yorliq); // JFrame-ga teg qo'shing
52 }
53 } // ComboBoxFrame sinfining yakuni

1 // 12.22-rasm: ComboBoxTest.java


2 // ComboBoxFrame sinovi.
3 import javax.swing.JFrame;
4
5 umumiy sinf ComboBoxTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 ComboBoxFrame comboBoxFrame = yangi ComboBoxFrame();
10 comboBoxFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 comboBoxFrame.setSize(350, 150);
12 comboBoxFrame.setVisible(rost);
13 }
14 } // ComboBoxTest sinfini yakunlash

12.22-rasm | ComboBoxFrame sinovdan o'tkazilmoqda.

12.21-rasm | Rasm nomlari ro'yxatini ko'rsatadigan JComboBox. (2-qismning 2-qismi.)

O'tish uchun aylantirish paneli


ro'yxatdagi narsalar

O'tkazish oynasi O'tish strelkalari


12.11 JComboBox; Voqealarni boshqarish uchun anonim ichki sinfdan foydalanish 507

19–23 qatorlar (12.21-rasm) to‘rtta yangi ImageIcon bilan massiv piktogrammalarini e’lon qiladi va ishga tushiradi.
ob'ektlar. Qator massiv nomlari (17-18-qatorlar) to'rtta tasvir faylining nomlarini o'z ichiga oladi
ilova bilan bir xil katalogda saqlanadi.
31-qatorda konstruktor JComboBox obyektini qatordagi Strings bilan ishga tushiradi.
nomlar ro'yxatdagi elementlar sifatida. Ro'yxatdagi har bir element indeksga ega. Birinchi element qo'shiladi
0 indeksida, keyingisi 1 indeksida va boshqalar. JComboBox-ga qo'shilgan birinchi element paydo bo'ladi
JComboBox ko'rsatilganda joriy tanlangan element sifatida. Boshqa elementlar tanlanadi
JComboBox-ni bosish va keyin paydo bo'lgan ro'yxatdan elementni tanlash orqali.
32-qator maksimal raqamni belgilash uchun JComboBox setMaximumRowCount usulidan foydalanadi
Foydalanuvchi JComboBox-ni bosganida ko'rsatiladigan elementlarning. Qo'shimchalar bo'lsa
elementlar, JComboBox foydalanuvchiga aylantirish imkonini beruvchi aylantirish panelini (birinchi ekranga qarang) taqdim etadi
ro'yxatdagi barcha elementlar orqali. Foydalanuvchi yuqoridagi aylantirish strelkalarini bosishi mumkin va
roʻyxat boʻylab bir vaqtning oʻzida bir elementni yuqoriga va pastga siljitish uchun aylantirish panelining pastki qismiga yoki
aks holda aylantirish panelining o'rtasida joylashgan aylantirish oynasini yuqoriga va pastga torting. O'tkazish oynasini sudrab borish uchun,
sichqoncha kursorini uning ustiga qo'ying, sichqoncha tugmasini bosib ushlab turing va sichqonchani harakatlantiring. In
bu misol, ochiladigan ro'yxat aylantirish oynasini sudrab borish uchun juda qisqa, shuning uchun siz yuqoriga bosishingiz mumkin
va pastga o'qlarni bosing yoki ro'yxatdagi to'rtta elementni aylantirish uchun sichqonchaning g'ildiragidan foydalaning.
49-qator JComboBox-ni ComboBoxFrame-ning FlowLayout-ga biriktiradi (29-qatorda o'rnatilgan). Chiziq
50 JLabel-ni yaratadi, u ImageIcons-ni ko'rsatadi va uni birinchi ImageIcon bilan ishga tushiradi
massiv piktogrammalarida. 51-qator JLabel-ni ComboBoxFrame-ning FlowLayout-ga biriktiradi.

Voqealarni boshqarish uchun anonim ichki sinfdan foydalanish


34–46 qatorlar voqea tinglovchisining sinfini e'lon qiladigan, ob'ektni yaratadigan bitta bayonotdir.
o'sha sinf va uni imagesJComboBox ItemEvent tinglovchisi sifatida ro'yxatdan o'tkazadi. Ushbu hodisani tinglovchi ob-
ject - anonim ichki sinfning namunasi - nomsiz e'lon qilingan sinf
va odatda usul deklaratsiyasida paydo bo'ladi. Boshqa ichki sinflarda bo'lgani kabi, anonim
ichki sinf o'zining yuqori darajadagi a'zolariga kirishi mumkin. Biroq, anonim ichki sinf mavjud
u e'lon qilingan usulning mahalliy o'zgaruvchilariga cheklangan kirish. Hech kimdan beri -
mous ichki sinfining nomi yo'q, sinfning bitta ob'ekti bu erda yaratilishi kerak
sinf e'lon qilinadi (35-qatordan boshlab).

34–47 qatorlar imagesJComboBox-ning addItemListener usuliga qo'ng'iroqdir. argu-


Ushbu usul uchun ItemListener ob'ekti bo'lishi kerak (ya'ni, sinfning har qanday ob'ekti
ItemListener ni amalga oshiradi). 35–46 qatorlar sinf namunasini yaratish ifodasidir
anonim ichki sinfni e'lon qiladi va shu sinfning bitta ob'ektini yaratadi. Bunga havola
keyin ob'ekt addItemListener ga argument sifatida uzatiladi. ItemListener() sintaksisi

Ko'rish va his qilish kuzatuvi 12.12


JComboBox uchun maksimal qatorlar sonini roʻyxatni toʻsadigan qatorlar soniga oʻrnating
u ishlatiladigan oynaning chegaralaridan tashqarida kengayishdan.

Dasturiy ta'minot muhandisligi kuzatuvi 12.3


Usulda e'lon qilingan anonim ichki sinf misol o'zgaruvchilari va
uni e'lon qilgan yuqori darajadagi sinf ob'ektining usullari, shuningdek, usulning yakuniy lokali
o'zgaruvchilar, lekin usulning yakuniy bo'lmagan mahalliy o'zgaruvchilariga kira olmaydi. Java SE 8 dan boshlab,
Anonim ichki sinflar mahalliy o'zgaruvchilarning "samarali yakuniy" usullariga ham kirishlari mumkin - qarang.
Qo'shimcha ma'lumot uchun 17-bob.

508 12-bob GUI komponentlari: 1-qism

new so'ng interfeysni amalga oshiradigan anonim ichki sinfning e'lon qilinishi boshlanadi
ItemListener. Bu sinf deklaratsiyasini boshlashga o'xshaydi

36-qatordagi ochiladigan chap qavs va 46-qatordagi oʻng yopuvchi qavs chegarani belgilaydi


anonim ichki sinfning tanasi. 38–45 qatorlar ItemListener elementining holatini e'lon qiladi.
O'zgartirilgan usul. Foydalanuvchi imagesJComboBox dan tanlov qilganda, bu usul
yorliq belgisini o'rnatadi. Belgisi indeksini aniqlash orqali massiv piktogrammalaridan tanlanadi
44-qatordagi getSelectedIndex usuli bilan JComboBox-da tanlangan element. Har bir element uchun
JComboBox-dan tanlansa, boshqa element birinchi navbatda bekor qilinadi - shuning uchun ikkita ItemEvents sodir bo'ladi
element tanlanganda. Biz faqat foydalanuvchi uchun faqat element belgisini ko'rsatishni xohlaymiz
tanlangan. Shu sababli, 42-qator ItemEvent usuli getStateChange yoki yo'qligini aniqlaydi
ItemEvent.SELECTED ni qaytaradi. Agar shunday bo'lsa, 43–44 qatorlar yorliq belgisini o'rnatadi.

Anonim bilan hodisa ishlov beruvchisini yaratish uchun 35–46 qatorlarda ko'rsatilgan sintaksis


ichki sinf Java integratsiyalashgan ishlanmasi tomonidan yaratilgan kodga o'xshaydi
muhit (IDE). Odatda, IDE sizga GUI-ni vizual ravishda loyihalash imkonini beradi, keyin esa u
GUI-ni amalga oshiradigan kodni o'chiradi. Siz shunchaki hodisani boshqarishda bayonotlarni kiritasiz
har bir hodisani qanday hal qilishni e'lon qiladigan usullar.
Java SE 8: Lambdalar bilan anonim ichki sinflarni amalga oshirish
17.9-bo'limda biz Java SE 8 lambdalaridan voqea ishlov beruvchilarini yaratish uchun qanday foydalanishni ko'rsatamiz. Siz xohlaganingizcha
o'rganish, kompilyator lambdani anonim ichki sinf ob'ektiga aylantiradi.
12.12 JList
Ro'yxat foydalanuvchi bir yoki bir nechta elementlarni tanlashi mumkin bo'lgan bir qator elementlarni ko'rsatadi (chiqishga qarang
12.24-rasm). Ro'yxatlar JComponent sinfini to'g'ridan-to'g'ri kengaytiradigan JList klassi bilan yaratilgan.
JComboBox kabi umumiy sinf bo'lgan JList klassi bitta tanlovli ro'yxatlarni qo'llab-quvvatlaydi (qaysi
bir vaqtning o'zida faqat bitta elementni tanlashga ruxsat berish) va bir nechta tanlash ro'yxatlari (har qanday imkoniyatga ega
tanlangan elementlar soni). Ushbu bo'limda biz bitta tanlovli ro'yxatlarni muhokama qilamiz.
Shakllarning qo'llanilishi. 12.23–12.24 13 ta rang nomidan iborat JListni yaratadi.
JList-da rang nomi bosilganda, ListSelectionEvent sodir bo'ladi va ilova
kation ilova oynasining fon rangini tanlangan rangga o'zgartiradi. Sinf
ListTest (12.24-rasm) ushbu dasturni bajaradigan asosiy usulni o'z ichiga oladi.

ommaviy klass MyHandler ItemListener-ni amalga oshiradi

Dasturiy ta'minot muhandisligi kuzatuvi 12.4
Boshqa har qanday sinf kabi, anonim ichki sinf interfeysni amalga oshirganda, sinf
interfeysdagi har bir mavhum usulni amalga oshirishi kerak.

1 // 12.23-rasm: ListFrame.java


2 // Ranglar ro'yxatini ko'rsatadigan JList.
3 import java.awt.FlowLayout;
4 import java.awt.Color;
5 import javax.swing.JFrame;
6 import javax.swing.JList;

12.23-rasm | Ranglar ro'yxatini ko'rsatadigan JList. (2-qismning 1-qismi.)


12.12 JList 509

7 import javax.swing.JScrollPane;
8 import javax.swing.event.ListSelectionListener;
9 import javax.swing.event.ListSelectionEvent;
10 import javax.swing.ListSelectionModel;
11
12 umumiy sinf ListFrame JFrame-ni kengaytiradi
13 {
14
15 ta shaxsiy statik yakuniy String[] colorNames = {"Qora", "Moviy", "Moviy",
16 "To'q kulrang", "kulrang", "yashil", "ochiq kulrang", "magenta",
17 "Apelsin", "Pushti", "Qizil", "Oq", "Sariq"};
18 ta shaxsiy statik yakuniy Rang[] ranglar = {Rang.QORA, Rang.BLUE,
19 Rang.SANGI, Rang.QO'QIQ_GRAY, Rang.KUZI, Rang.YaSIL,
20 Rang. OCH__GRAY, Rang. MAGENTA, Rang. ORANGE, Rang. PINK,
21 Rang.QIZIL, Rang.OQ, Rang.SARI};
22
23 // ListFrame konstruktori JFrame-ga JListni o'z ichiga olgan JScrollPane qo'shing
24 umumiy ListFrame()
25 {
26 super("Ro'yxat testi");
27 setLayout(yangi FlowLayout());
28
29
30
31
32
33
34
35
36
37
38 rangJList.addListSelectionListener(
39 yangi ListSelectionListener() // anonim ichki sinf
40 {
41 // ishlov berish ro'yxatini tanlash hodisalari
42 @Bekor qilish
43 public void valueChanged(ListSelectionEvent hodisasi)
44 {
45 getContentPane().setBackground(
46 rang[ ]);
47 }
48 }
49);
50 }
51 } // oxirgi sinf ListFrame

1 // 12.24-rasm: ListTest.java


2 // JList dan ranglarni tanlash.
3 import javax.swing.JFrame;
4

12.24-rasm | JList dan ranglarni tanlash. (2-qismning 1-qismi.)

12.23-rasm | Ranglar ro'yxatini ko'rsatadigan JList. (2-qismning 2-qismi.)

xususiy yakuniy JList colorJList; // ranglarni ko'rsatish uchun ro'yxat

colorJList = yangi JList(rang nomlari); // rang nomlari ro'yxati
colorJList.setVisibleRowCount(5); // bir vaqtning o'zida besh qatorni ko'rsatish

// bir nechta tanlashga ruxsat bermang


colorJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

// JScrollPane-ni o'z ichiga JList-ni ramkaga qo'shing


qo'shish (yangi JScrollPane (colorJList));

colorJList.getSelectedIndex()


510 12-bob GUI komponentlari: 1-qism

29-qator (12.23-rasm) JList obyekti colorJList ni yaratadi. JList uchun argument
konstruktor - ro'yxatda ko'rsatiladigan ob'ektlar (bu holda Strings) massivi. 30-qatordan foydalaniladi
Ro'yxatda ko'rinadigan elementlar sonini aniqlash uchun JList usuli setVisibleRowCount.
33-qator roʻyxatni tanlash rejimini belgilash uchun JList setSelectionMode usulidan foydalanadi.
Class ListSelectionModel (javax.swing to'plami) belgilovchi uchta konstantani e'lon qiladi.
JList tanlash rejimi — SINGLE_SELECTION (bu faqat bitta elementni tanlash imkonini beradi)
bir vaqtning o'zida), SINGLE_INTERVAL_SELECTION (tanlovga ruxsat beruvchi ko'p tanlovli ro'yxat uchun)
bir nechta qoʻshni elementlardan) va MULTIPLE_INTERVAL_SELECTION (bir nechta tanlov uchun)
tanlanishi mumkin bo'lgan narsalarni cheklamaydigan ro'yxat).
JComboBox-dan farqli o'laroq, JList-da ko'proq elementlar mavjud bo'lsa, aylantirish panelini ta'minlamaydi
ko'rinadigan qatorlar sonidan ko'ra ro'yxat. Bunday holda, ta'minlash uchun JScrollPane ob'ekti ishlatiladi
aylantirish qobiliyati. 36-qator JFrame-ga JScrollPane sinfining yangi namunasini qo'shadi.
JScrollPane konstruktori argument sifatida aylantirishni talab qiladigan JComponentni oladi.
funksionallik (bu holda, colorJList). E'tibor bering, ekranda aylantirish paneli cre-
JScrollPane tomonidan yaratilgan JListning o'ng tomonida paydo bo'ladi. Odatiy bo'lib, aylantirish paneli
faqat JListdagi elementlar soni ko'rinadigan elementlar sonidan oshib ketganda paydo bo'ladi.
38–49 qatorlar ob'ektni ro'yxatdan o'tkazish uchun JList addListSelectionListener usulidan foydalanadi
uchun tinglovchi sifatida ListSelectionListener (javax.swing.event paketi)ni amalga oshiradi.
JList tanlovi voqealari. Yana bir bor, biz anonim ichki sinfning namunasidan foydalanamiz (liniyalar
39–48) tinglovchi sifatida. Ushbu misolda, foydalanuvchi colorJList-dan tanlov qilganda,
valueChanged usuli (42-47-qator) Ro'yxatning fon rangini o'zgartirishi kerak -
Tanlangan rangga ramka. Bu 45-46 qatorlarda bajariladi. JFrame-dan foydalanishga e'tibor bering
getContentPane usuli 45-qatorda. Har bir JFrame aslida uchta qatlamdan iborat
fon, kontent paneli va oyna oynasi. Tarkib paneli oldida paydo bo'ladi
fon va JFrame-dagi GUI komponentlari ko'rsatiladigan joy. Shisha oyna
GUI kompozitsiyasi oldida paydo bo'lishi kerak bo'lgan asboblar maslahatlari va boshqa narsalarni ko'rsatish uchun ishlatiladi.
ekranda tiniqlar. Kontent paneli JFrame fonini butunlay yashiradi;
Shunday qilib, GUI komponentlari orqasidagi fon rangini o'zgartirish uchun siz o'zgartirishingiz kerak
kontent paneli fon rangi. getContentPane usuli havolani qaytaradi

5 umumiy sinf ListTest


6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 ListFrame listFrame = new ListFrame(); // ListFrame yarating
10 listFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 listFrame.setSize(350, 150);
12 listFrame.setVisible(rost);
13 }
14 } // yakuniy sinf ListTest

12.24-rasm | JList dan ranglarni tanlash. (2-qismning 2-qismi.)


12.13 Ko'p tanlovli ro'yxatlar 511

JFrame-ning kontent paneli (Container sinfining ob'ekti). 45-qatorda biz ushbu havoladan foydalanamiz
SetBackground usulini chaqirish uchun kontent panelining fon rangini o'ziga xos rangga o'rnatadi.
ranglar qatoridagi mentlar. Rang tanlangan element yordamida massivdan tanlanadi
indeks. JList usuli getSelectedIndex tanlangan element indeksini qaytaradi. Massivlarda bo'lgani kabi
va JComboBoxes, JList indekslash nolga asoslangan.
12.13 Ko'p tanlovli ro'yxatlar
Ko'p tanlovli ro'yxat foydalanuvchiga JList dan ko'p narsalarni tanlash imkonini beradi (chiqishga qarang
12.26-rasm). SINGLE_INTERVAL_SELECTION roʻyxati qoʻshni diapazonni tanlash imkonini beradi
buyumlar. Buni amalga oshirish uchun birinchi elementni bosing, keyin esa Shift tugmachasini bosib ushlab turing
diapazondagi oxirgi element. MULTIPLE_INTERVAL_SELECTION roʻyxati (standart) davom ettirishga imkon beradi
SINGLE_INTERVAL_SELECTION roʻyxati uchun tavsiflanganidek, diapazonni tanlash. Bunday ro'yxat ham al-
Ctrl tugmachasini bosish va ushlab turish orqali tanlanadigan turli elementlarni pasaytiradi
tanlash uchun har bir element. Elementni tanlashni bekor qilish uchun elementni bosish paytida Ctrl tugmasini bosing va ushlab turing
ikkinchi marta.
Shakllarning qo'llanilishi. 12.25–12.26 elementlarni nusxalash uchun bir nechta tanlovli roʻyxatlardan foydalanadi
bir JList boshqasiga. Bir roʻyxat MULTIPLE_INTERVAL_SELECTION roʻyxati, ikkinchisi esa a
SINGLE_INTERVAL_SELECTION roʻyxati. Ilovani ishga tushirganingizda, tanlovdan foydalanib ko'ring.
Har ikkala ro'yxatdagi elementlarni tanlash uchun avval tavsiflangan texnikalar.

1 // 12.25-rasm: MultipleSelectionFrame.java


2 // Bir nechta tanlash imkonini beruvchi JList.
3 import java.awt.FlowLayout;
4 import java.awt.event.ActionListener;
5 import java.awt.event.ActionEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JList;
8 import javax.swing.JButton;
9 import javax.swing.JScrollPane;
10 import javax.swing.ListSelectionModel;
11
12 ommaviy sinf MultipleSelectionFrame JFrame-ni kengaytiradi
13 {
14 xususiy yakuniy JList colorJList; // rang nomlarini saqlash uchun ro'yxat
15 xususiy yakuniy JList copyJList; // ko'chirilgan nomlarni saqlash uchun ro'yxat
16 shaxsiy JButton copyJButton; // tanlangan nomlarni nusxalash uchun tugma
17 ta shaxsiy statik yakuniy String[] colorNames = {"Qora", "Moviy", "Moviy",
18 "To'q kulrang", "kulrang", "yashil", "ochiq kulrang", "magenta", "to'q sariq",
19 "Pushti", "Qizil", "Oq", "Sariq"};
20
21 // MultipleSelectionFrame konstruktori
22 ommaviy MultipleSelectionFrame()
23 {
24 super("Bir nechta tanlov ro'yxati");
25 setLayout(yangi FlowLayout());
26
27 colorJList = yangi JList(rang nomlari); // rang nomlari ro'yxati
28 colorJList.setVisibleRowCount(5); // besh qatorni ko'rsatish

12.25-rasm | Bir nechta tanlovga ruxsat beruvchi JList. (2-qismning 1-qismi.)


512 12-bob GUI komponentlari: 1-qism

29
30
31 qo'shish (yangi JScrollPane (colorJList)); // aylantirish paneli bilan ro'yxat qo'shing
32
33 copyJButton = yangi JButton("Nusxalash >>>");
34 copyJButton.addActionListener(
35 ta yangi ActionListener() // anonim ichki sinf
36 {
37 // ishlov berish tugmasi hodisasi
38 @Bekor qilish
39 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
40 {
41 // tanlangan qiymatlarni copyJList-ga joylashtiring
42
43
44
45 }
46 }
47);
48
49 qo'shish(copyJButton); // JFrame-ga nusxa ko'chirish tugmachasini qo'shing
50
51 copyJList = yangi JList(); // nusxa ko'chirilgan rang nomlarini saqlash uchun ro'yxat
52 copyJList.setVisibleRowCount(5); // 5 qatorni ko'rsatish
53
54
55
56
57 qo'shish (yangi JScrollPane (copyJList)); // aylantirish paneli bilan ro'yxat qo'shing
58 }
59 } // oxirgi sinf MultipleSelectionFrame

1 // 12.26-rasm: MultipleSelectionTest.java


2 // MultipleSelectionFrame-ni sinab ko'rish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf MultipleSelectionTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 MultipleSelectionFrame multipleSelectionFrame =
10 ta yangi MultipleSelectionFrame();
11 multipleSelectionFrame.setDefaultCloseOperation(
12 JFrame.EXIT_ON_CLOSE);
13 multipleSelectionFrame.setSize(350, 150);
14 multipleSelectionFrame.setVisible(to'g'ri);
15 }
16 } // yakuniy sinf MultipleSelectionTest

12.26-rasm | MultipleSelectionFrame sinovi. (2-qismning 1-qismi.)

12.25-rasm | Bir nechta tanlovga ruxsat beruvchi JList. (2-qismning 2-qismi.)

colorJList.setSelectionMode(


ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

copyJList.setListData(


colorJList.getSelectedValuesList().toArray(
new String[0]));

copyJList.setFixedCellWidth(100); // kenglikni o'rnating


copyJList.setFixedCellHeight(15); // balandlikni o'rnatish
copyJList.setSelectionMode(
ListSelectionModel.SINGLE_INTERVAL_SELECTION);

12.14 Sichqoncha hodisalarini boshqarish 513



12.25-rasmning 27-qatori JList colorJList ni yaratadi va uni Strings in inisializatsiya qiladi.
massiv rang nomlari. 28-qator colorJList-dagi ko'rinadigan qatorlar sonini 5 ga o'rnatadi
29–30 rangJList MULTIPLE_INTERVAL_SELECTION roʻyxati ekanligini koʻrsating. 31-qatorga a
JFrame uchun colorJListni o'z ichiga olgan yangi JScrollPane. 51–57-qatorlar xuddi shunday ishlaydi
SINGLE_INTERVAL_SELECTION roʻyxati sifatida eʼlon qilingan copyJList uchun vazifalar. Agar JList bo'lsa
elementlarni o'z ichiga olmaydi, u FlowLayout'da ko'rsatilmaydi. Shu sababli, 53-54 qatorlardan foydalaniladi
copyJList kengligini sozlash uchun JList usullari setFixedCellWidth va setFixedCellHeight
100 pikselgacha va JListdagi har bir elementning balandligi mos ravishda 15 pikselgacha.
Odatda, boshqa GUI komponenti (tashqi deb nomlanuvchi) tomonidan yaratilgan hodisa
voqea) JListdagi bir nechta tanlovlar qachon qayta ishlanishi kerakligini bildiradi. Bunda
Misol uchun, foydalanuvchi nusxa ko'chirish hodisasini ishga tushirish uchun copyJButton deb nomlangan JButton tugmasini bosadi
JList-ni nusxalash uchun colorJList-dagi tanlangan elementlar.
34–47 qatorlar copyJButton uchun ActionListener-ni e'lon qiladi, yaratadi va ro'yxatdan o'tkazadi.
Foydalanuvchi copyJButton tugmasini bosganida, actionPerformed usuli (38–45-qatorlar) JList-dan foydalanadi.
copyJList-da ko'rsatilgan elementlarni o'rnatish uchun setListData usuli. 43-44 qatorlar qo'ng'iroq rangi -
JListning getSelectedValuesList usuli, bu List ni qaytaradi (chunki
JList JList) sifatida rangJList-dagi tanlangan elementlarni ifodalovchi sifatida yaratilgan. Biz
List ning toArray usulini chaqirib, uni satrlar massiviga aylantiring.
copyJList ning setListData usuliga argument sifatida uzatilishi mumkin. Array uchun ro'yxat usuli
o'z argumenti sifatida usul qaytaradigan massiv turini ifodalovchi massivni oladi.
16-bobda List va toArray haqida ko'proq bilib olasiz.
Nima uchun copyJList-dan 42-qatorda foydalanish mumkinligiga hayron bo'lishingiz mumkin
ilova 49-satrgacha o'zi murojaat qiladigan ob'ektni yaratmaydi. Shuni esda tuting
Amal qilingan usul (38–45-qatorlar) foydalanuvchi nusxasini bosmaguncha bajarilmaydi.
JButton, bu konstruktor bajarishni tugatmaguncha va
ilova GUI-ni ko'rsatadi. Ilovaning bajarilishining o'sha nuqtasida copyJList bo'ladi
allaqachon yangi JList obyekti bilan ishga tushirilgan.
12.14 Sichqoncha hodisalarini boshqarish
Ushbu bo'limda MouseListener va MouseMotionListener voqealar tinglovchisi taqdim etiladi.
sichqoncha hodisalarini boshqarish uchun yuzlar. Sichqoncha hodisalari har qanday GUI komponenti uchun qayta ishlanishi mumkin
java.awt.Component dan olingan. MouseListener va interfeyslarni yaratish usullari
MouseMotionListener 12.27-rasmda jamlangan. javax.swing.event to'plami
MouseInputListener interfeysini o'z ichiga oladi, u MouseListener va interfeyslarini kengaytiradi
MouseMotionListener barcha MouseListener va o'z ichiga olgan yagona interfeys yaratish uchun
MouseMotionListener usullari. MouseListener va MouseMotionListener usuli

12.26-rasm | MultipleSelectionFrame sinovi. (2-qismning 2-qismi.)


514 12-bob GUI komponentlari: 1-qism

sichqoncha komponent bilan o'zaro aloqada bo'lganda ods chaqiriladi, agar tegishli hodisani tinglovchi ob'ekt
ob'ektlar ushbu Komponent uchun ro'yxatdan o'tgan.
Sichqoncha hodisasini boshqarish usullarining har biri argument sifatida MouseEventni oladi
sodir bo'lgan sichqoncha hodisasi haqida ma'lumotni o'z ichiga olgan ob'ekt, shu jumladan x-
va uning joylashuvining y-koordinatalari. Ushbu koordinatalar yuqori chap burchakdan o'lchanadi
voqea sodir bo'lgan GUI komponentining. X koordinatalari 0 va dan boshlanadi
chapdan o'ngga oshirish. Y koordinatalari 0 dan boshlanadi va yuqoridan pastgacha ortadi. The
InputEvent klassining usullari va konstantalari (MouseEventning superklassi) sizni oldini olishga imkon beradi.
foydalanuvchi sichqonchaning qaysi tugmachasini bosganligi meniki.

MouseListener va MouseMotionListener interfeys usullari

MouseListener interfeysi usullari
public void mousePressed(MouseEvent hodisasi)
Sichqoncha kursori komponent ustida turganda sichqoncha tugmasi bosilganda chaqiriladi.
public void mouseClicked(MouseEvent hodisasi)
Sichqoncha tugmasi bosilganda va sichqoncha kursori qo'yib yuborilganda chaqiriladi.
komponent bo'yicha tionary. Har doim mousePressed va mouseReleased ga qo'ng'iroq qilishdan oldin.
public void mouseReleased(MouseEvent hodisasi)
Sichqoncha tugmasi bosilgandan keyin qo'yib yuborilganda chaqiriladi. Har doim qo'ng'iroqdan oldin
mousePressed va mouseDragged-ga bir yoki bir nechta qo'ng'iroqlar.
public void mouseEntered (MouseEvent hodisasi)
Sichqoncha kursori komponent chegarasiga kirganda chaqiriladi.
public void mouseExited(MouseEvent hodisasi)
Sichqoncha kursori komponent chegaralarini tark etganda chaqiriladi.
MouseMotionListener interfeysi usullari
public void mouseDragged(MouseEvent hodisasi)
Sichqoncha kursori komponent ustida turganda sichqoncha tugmasi bosilganda chaqiriladi va
sichqoncha tugmasi bosilganda sichqoncha harakatlanadi. Har doim qo'ng'iroqdan oldin
sichqonchani bosdi. Barcha tortish hodisalari foydalanuvchi sudrab boshlagan komponentga yuboriladi
sichqoncha.
public void mouseMoved(MouseEvent hodisasi)
Sichqoncha kursori harakatlantirilganda (sichqoncha tugmalari bosilmaganda) chaqiriladi
komponentda joylashgan. Barcha harakatlanish hodisalari sichqoncha ustida joylashgan komponentga yuboriladi
hozirda joylashgan.

12.27-rasm | MouseListener va MouseMotionListener interfeys usullari.

Dasturiy ta'minot muhandisligi kuzatuvi 12.5
MouseDragged-ga qo'ng'iroqlar komponent uchun MouseMotionListener-ga yuboriladi
tortish boshlandi. Xuddi shunday, drag operatsiyasi oxirida mouseReleased chaqiruvi yuboriladi
drag operatsiyasi boshlangan komponent uchun MouseListener dasturiga.

12.14 Sichqoncha hodisalarini boshqarish 515

Java shuningdek, ilovalarga javob berish uchun MouseWheelListener interfeysini taqdim etadi
sichqoncha g'ildiragining aylanishi. Ushbu interfeys mouseWheelMoved usulini e'lon qiladi, qaysi
argument sifatida MouseWheelEventni oladi. Class MouseWheelEvent (Sichqonchaning kichik klassi-
Voqealar) voqea ishlovchisiga voqea haqida ma'lumot olishga imkon beruvchi usullarni o'z ichiga oladi
g'ildirak aylanish miqdori.

JPanel-da sichqoncha hodisalarini kuzatish


MouseTracker ilovasi (12.28–12.29-rasmlar) MouseListener va
MouseMotionListener interfeysi usullari. Hodisalarni qayta ishlash sinfi (36-97-qatorlar).
12.28-rasm) ikkala interfeysni ham amalga oshiradi. Siz ushbu ikkitadan ettita usulni e'lon qilishingiz kerak
sizning sinfingiz ikkalasini ham amalga oshirganda interfeyslar. Ushbu misoldagi har bir sichqoncha hodisasi ko'rsatiladi
oynaning pastki qismiga biriktirilgan statusBar deb nomlangan JLabel-dagi satr.

1 // 12.28-rasm: MouseTrackerFrame.java


2 // Sichqoncha hodisasi bilan ishlash.
3 import java.awt.Color;
4 import java.awt.BorderLayout;
5 import java.awt.event.MouseListener;
6 import java.awt.event.MouseMotionListener;
7 import java.awt.event.MouseEvent;
8 import javax.swing.JFrame;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11
12 ommaviy sinf MouseTrackerFrame JFrame-ni kengaytiradi
13 {
14 xususiy yakuniy JPanel mousePanel; // sichqoncha hodisalari sodir bo'ladigan panel
15 xususiy yakuniy JLabel statusBar; // voqea ma'lumotlarini ko'rsatadi
16
17 // MouseTrackerFrame konstruktori GUI-ni o'rnatadi va
18 // sichqoncha hodisasi ishlov beruvchilarini qayd qiladi
19 ta umumiy MouseTrackerFrame()
20 {
21 super("Sichqoncha hodisalarini ko'rsatish");
22
23
24
25
26
27
28
29
30
31
32
33
34 }
35

12.28-rasm | Sichqoncha hodisasini boshqarish. (3-qismning 1-qismi.)

mousePanel = new JPanel();
mousePanel.setBackground(Color.WHITE);
qo'shish(mousePanel, BorderLayout.CENTER); // JFrame-ga panel qo'shing

statusBar = yangi JLabel("JPanel tashqarisidagi sichqoncha");


qo'shish(statusBar, BorderLayout.SOUTH); // JFrame-ga teg qo'shing

// sichqoncha va sichqoncha harakati hodisalari uchun tinglovchi yaratish va ro'yxatdan o'tkazish


MouseHandler ishlov beruvchisi = yangi MouseHandler();
mousePanel.addMouseListener(ishlab chiqaruvchi);
mousePanel.addMouseMotionListener(ishlab chiqaruvchi);

516 12-bob GUI komponentlari: 1-qism

36
37
38 {
39 // MouseListener hodisalari ishlov beruvchilari
40 // sichqonchani bosgandan so'ng darhol qo'yib yuborilgandagi hodisani boshqarish
41 @Bekor qilish
42
43 {
44 statusBar.setText(String.format("Bosilgan [%d, %d]",
45 , ));
46 }
47
48 // sichqoncha bosilganda hodisani boshqarish
49 @Bekor qilish
50
51 {
52 statusBar.setText(String.format("[%d, %d] da bosilgan",
53 , ));
54 }
55
56 // sichqonchani bo'shatganda hodisani boshqarish
57 @Bekor qilish
58
59 {
60 statusBar.setText(String.format("[%d, %d] da chiqarilgan",
61 , ));
62 }
63
64 // sichqoncha hududga kirganda hodisani boshqarish
65 @Bekor qilish
66
67 {
68 statusBar.setText(String.format("Sichqoncha [%d, %d] da kiritilgan",
69 , ));
70
71 }
72
73 // sichqoncha hududdan chiqqanda hodisani boshqarish
74 @Bekor qilish
75
76 {
77 statusBar.setText("JPanel tashqarisidagi sichqoncha");
78
79 }
80
81 // MouseMotionListener hodisalari ishlov beruvchilari
82 // foydalanuvchi tugmani bosgan holda sichqonchani sudrab ketganda sodir bo'ladigan hodisa
83 @Bekor qilish
84
85 {
86 statusBar.setText(String.format("Sudrab olingan [%d, %d]",
87 , ));
88 }

12.28-rasm | Sichqoncha hodisasini boshqarish. (3 qismning 2-qismi.)

xususiy sinf MouseHandler MouseListener-ni amalga oshiradi,
MouseMotionListener

public void mouseClicked(MouseEvent hodisasi)'

event.getX() event.getY()

public void mousePressed(MouseEvent hodisasi)

event.getX() event.getY()

public void mouseReleased(MouseEvent hodisasi)

event.getX() event.getY()

public void mouseEntered (MouseEvent hodisasi)

event.getX() event.getY()
mousePanel.setBackground(Color.GREEN);

public void mouseExited(MouseEvent hodisasi)

mousePanel.setBackground(Color.WHITE);

public void mouseDragged(MouseEvent hodisasi)

event.getX() event.getY()

12.14 Sichqoncha hodisalarini boshqarish 517

23-qator JPanel mousePanel-ni yaratadi. Ushbu JPanel sichqoncha hodisalari ilova tomonidan kuzatiladi.
24-qator mousePanel-ning fon rangini oq rangga o'rnatadi. Foydalanuvchi sichqonchani harakatlantirganda
mousePanel bo'lsa, dastur mousePanel fon rangini yashil rangga o'zgartiradi. Qachon
foydalanuvchi sichqonchani sichqoncha panelidan olib chiqadi, dastur fonni o'zgartiradi
rangi oq rangga qaytadi. 25-qator sichqoncha panelini JFrame-ga biriktiradi. O'rganganingizdek, siz yozasiz -
JFrame-da GUI komponentlarining tartibini belgilashi kerak. Ushbu bo'limda biz tanishtiramiz -

89
90 // foydalanuvchi sichqonchani harakatlantirganda hodisani boshqarish


91 @Bekor qilish
92
93 {
94 statusBar.setText(String.format("Koʻchirildi [%d, %d]",
95 , ));
96 }
97 } // MouseHandler ichki sinfini tugating
98 } // oxirgi sinf MouseTrackerFrame

1 // 12.29-rasm: MouseTrackerFrame.java


2 // MouseTrackerFrame-ni sinab ko'rish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf Sichqoncha kuzatuvchisi
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 MouseTrackerFrame mouseTrackerFrame = yangi MouseTrackerFrame();
10 mouseTrackerFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 mouseTrackerFrame.setSize(300, 100);
12 mouseTrackerFrame.setVisible(to'g'ri);
13 }
14 } // oxirgi sinf MouseTracker

12.29-rasm | MouseTrackerFrame sinovdan o'tkazilmoqda.

12.28-rasm | Sichqoncha hodisasini boshqarish. (3 qismning 3-qismi.)

public void mouseMoved(MouseEvent hodisasi)

event.getX() event.getY()

518 12-bob GUI komponentlari: 1-qism



FlowLayout layout menejerini ishga tushirdi. Bu erda biz JFrame tarkibining standart tartibidan foydalanamiz
panel - Shimoli, Janubi, Sharqiy, G'arbiy va MARKAZI komponentlarini tartibga soluvchi BorderLayout
hududlar. NORTH konteyner tepasiga mos keladi. Bu misolda CENTER va SOUTH ishlatiladi
hududlar. 25-qatorda mousePanel-ni joylashtirish uchun qo'shish usulining ikki argumentli versiyasi qo'llaniladi
MARKAZI mintaqasi. BorderLayout foydalanish uchun CENTERdagi komponentni avtomatik ravishda o'lchaydi
JFrame-dagi boshqa hududlardagi komponentlar egallamaydigan barcha bo'sh joy.
12.18.2 bo'limida BorderLayout batafsilroq muhokama qilinadi.
Konstruktordagi 27–28 qatorlar JLabel statusBar ni e'lon qiladi va uni ilovaga biriktiradi.
JFramening JANUBI mintaqasi. Bu JLabel JFrame kengligini egallaydi. Mintaqaning balandligi
JLabel tomonidan belgilanadi.
31-qator ishlovchi deb ataladigan ichki sinf MouseHandler (36-97-qatorlar) namunasini yaratadi.
bu sichqoncha hodisalariga javob beradi. 32-33 qatorlar sichqoncha uchun tinglovchi sifatida ishlov beruvchini ro'yxatdan o'tkazadi.
Panelning sichqoncha hodisalari. addMouseListener va addMouseMotionListener usullari mavjud
Komponent sinfidan bilvosita meros bo'lib, MouseListeners va ro'yxatga olish uchun ishlatilishi mumkin
MouseMotionListeners, mos ravishda. MouseHandler obyekti MouseListener bo‘lib, a
MouseMotionListener, chunki sinf ikkala interfeysni ham amalga oshiradi. Biz amalga oshirishni tanladik -
Bir nechta interfeyslarni amalga oshiradigan sinfni ko'rsatish uchun ikkala interfeysni bu erda ko'rsating,
lekin biz o'rniga MouseInputListener interfeysini amalga oshirishimiz mumkin edi.
Sichqoncha mousePanel maydoniga kirganda va undan chiqqanda mouseEntered usullari (liniyalar
65–71) va mouseExited (74–79 qatorlar) mos ravishda chaqiriladi. Sichqoncha usuli kiritildi
statusBar-da sichqoncha JPanel-ga kirganligini bildiruvchi xabarni ko'rsatadi va
fon rangini yashil rangga o'zgartiradi. MouseExited usuli xabarni ko'rsatadi
statusBar sichqonchaning JPaneldan tashqarida ekanligini ko'rsatadi (birinchi namunaviy chiqishga qarang
oyna) va fon rangini oq rangga o'zgartiradi.
Qolgan beshta hodisa vaziyat panelida voqea va voqeani o'z ichiga olgan qatorni ko'rsatadi
sodir bo'lgan koordinatalar. MouseEvent usullari getX va getY x- va y-ni qaytaradi.
hodisa sodir bo'lgan vaqtda sichqonchaning mos ravishda koordinatalari.
12.15 Adapterlar sinflari
MouseListener va MouseMotionListener kabi voqealarni tinglovchi ko'plab interfeyslar
bir nechta usullarni qo'llang. Voqealarni tinglashda har bir usulni e'lon qilish har doim ham istalmagan.
er interfeysi. Masalan, ilovaga faqat mouseClicked ishlov beruvchisi kerak bo'lishi mumkin
MouseListener yoki MouseMotionListener-dan mouseDragged ishlov beruvchisi. Interfeys Win-
dowListener yettita oyna hodisalarini boshqarish usullarini belgilaydi. Ko'pgina tinglovchilar uchun -
bir nechta usullarga ega bo'lgan interfeyslar, java.awt.event va javax.swing.event paketlari
hodisalarni tinglovchi adapter sinflarini taqdim eting. Adapter sinfi interfeys va pro-
ichidagi har bir usulning standart bajarilishini (bo'sh usul tanasi bilan) ko'rsatadi.
interfeys. 12.30-rasmda bir nechta java.awt.event adapter sinflari va ularning interfeyslari ko'rsatilgan
amalga oshirish. Har birining standart bajarilishini meros qilib olish uchun adapter sinfini kengaytirishingiz mumkin
usulini tanlang va keyin faqat voqeani qayta ishlash uchun kerak bo'lgan usul(lar)ni bekor qiling.
Dasturiy ta'minot muhandisligi kuzatuvi 12.6
Sinf interfeysni amalga oshirganda, sinf u bilan is-a munosabatiga ega bo'ladi
interfeys. Ushbu sinfning barcha to'g'ridan-to'g'ri va bilvosita kichik sinflari ushbu interfeysni meros qilib oladi. Shunday qilib, an
Hodisa-adapter sinfini kengaytiruvchi sinf ob'ekti mos keladigan hodisaning ob'ekti -
tinglovchi turi (masalan, MouseAdapter kichik sinfining ob'ekti MouseListener).

12.15 Adapterlar sinflari 519

Sichqoncha adapteri kengaytirilmoqda
Shakllarning qo'llanilishi. 12.31–12.32 sonini qanday aniqlashni ko'rsatadi
sichqonchani bosish (ya'ni, bosish soni) va turli xil sichqonchani qanday ajratish mumkin
tugmalar. Ushbu ilovadagi voqea tinglovchisi ichki sinf MouseClickHan- ob'ektidir.
dler (12.31-rasm, 25-46-qatorlar), bu MouseAdapter-ni kengaytiradi, shuning uchun biz faqat e'lon qilishimiz mumkin.
Ushbu misolda bizga mouseClicked usuli kerak.

Java.awt.eventdagi voqea-adapter klassi interfeysni amalga oshiradi

ComponentAdapter ComponentListener
ContainerAdapter ContainerListener
FocusAdapter FocusListener
KeyAdapter KeyListener
Sichqoncha adapteri Sichqoncha tinglovchisi
MouseMotionAdapter MouseMotionListener
WindowAdapter WindowListener

12.30-rasm | Voqea-adapter sinflari va ular amalga oshiradigan interfeyslar.

1 // 12.31-rasm: MouseDetailsFrame.java
2 // Sichqonchani bosish va sichqoncha tugmachalarini ajratishni namoyish qilish.
3 import java.awt.BorderLayout;
4 import java.awt.event.MouseAdapter;
5 import java.awt.event.MouseEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JLabel;
8
9 umumiy sinf MouseDetailsFrame JFrame-ni kengaytiradi
10 {
11 shaxsiy String tafsilotlari; // Status panelida ko'rsatilgan satr
12 xususiy yakuniy JLabel statusBar; // JLabel oynaning pastki qismida
13
14 // konstruktor sarlavha satrini o'rnatadi String va sichqonchani tinglovchini ro'yxatga olish
15 ta umumiy Sichqoncha DetailsFrame()
16 {
17 super("Sichqonchani bosish va tugmalar");
18
19 statusBar = yangi JLabel("Sichqonchani bosing");
20 qo'shish(statusBar, BorderLayout.SOUTH);
21
22 }
23
24 // sichqoncha hodisalarini boshqarish uchun ichki sinf
25 xususiy sinf MouseClickHandler MouseAdapter-ni kengaytiradi
26 {
27 // sichqonchani bosish hodisasini boshqaring va qaysi tugma bosilganligini aniqlang
28 @Bekor qilish
29 ommaviy void mouseClicked(MouseEvent hodisasi)
30 {

12.31-rasm | Sichqonchani bosish va sichqoncha tugmachalarini farqlashni ko'rsatish. (2-qismning 1-qismi.)

addMouseListener(yangi MouseClickHandler()); // ishlov beruvchi qo'shing

520 12-bob GUI komponentlari: 1-qism

31 int xPos = event.getX(); // sichqonchaning x pozitsiyasini oling
32 int yPos = event.getY(); // sichqonchaning y-pozitsiyasini oling
33
34 tafsilotlar = String.format("%d marta bosilgan",
35);
36
37 agar ( ) // sichqonchaning o'ng tugmasi
38 tafsilotlar += "sichqonchaning o'ng tugmasi bilan";
39 boshqa agar ( ) // sichqonchaning o'rta tugmasi
40 ta tafsilotlar += "sichqonchaning markaziy tugmasi bilan";
41 yana // sichqonchaning chap tugmasi
42 tafsilotlar += "sichqonchaning chap tugmasi bilan";
43
44 statusBar.setText(tafsilotlar); // holat panelida xabarni ko'rsatish
45 }
46 }
47 } // oxirgi sinf MouseDetailsFrame

1 // 12.32-rasm: MouseDetails.java


2 // MouseDetailsFrame-ni sinab ko'rish.
3 import javax.swing.JFrame;
4
5 umumiy sinf Sichqoncha tafsilotlari
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 MouseDetailsFrame mouseDetailsFrame = new MouseDetailsFrame();
10 mouseDetailsFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 mouseDetailsFrame.setSize(400, 150);
12 mouseDetailsFrame.setVisible(to'g'ri);
13 }
14 } // oxirgi sinf MouseDetails

12.32-rasm | Sichqoncha DetailsFrame sinovi.

12.31-rasm | Sichqonchani bosish va sichqoncha tugmachalarini farqlashni ko'rsatish. (2-qismning 2-qismi.)

event.getClickCount()

event.isMetaDown()

event.isAltDown()


12.15 Adapterlar sinflari 521

Java ilovasidan foydalanuvchi bitta, ikkita yoki uchta tugmachali tizimda bo'lishi mumkin
sichqoncha. Class MouseEvent InputEvent sinfidan bir nechta usullarni meros qilib oladi, ular quyidagilardan ajralib turadi:
ko'p tugmali sichqonchaning sichqoncha tugmachalari orasida harakat qilish yoki ko'p tugmali sichqonchani taqlid qilishi mumkin
kombinatsiyalangan tugma va sichqoncha tugmachasini bosish bilan. 12.33-rasmda InputEvent ko'rsatilgan
sichqoncha tugmachalarini bosish usullarini farqlash uchun foydalaniladi. Java har bir sichqonchani nazarda tutadi
sichqonchaning chap tugmasi mavjud. Shunday qilib, sichqonchaning chap tugmachasini bosishni sinab ko'rish oson. Qanaqasiga-
har doim bir yoki ikki tugmali sichqonchaga ega foydalanuvchilar va tugmalar birikmasidan foydalanishlari kerak
sichqoncha tugmachasini bir vaqtning o'zida bosish sichqonchadagi etishmayotgan tugmalarni taqlid qilish. In
bir yoki ikki tugmali sichqoncha holatida, Java ilovasi markaziy sichqonchani nazarda tutadi
tugmasi bosiladi, agar foydalanuvchi Alt tugmachasini bosib ushlab tursa va sichqonchaning chap tugmachasini bossa
ikki tugmali sichqoncha yoki bitta tugmachali sichqonchaning yagona tugmasi. bitta holatda -
tugmasi sichqoncha, Java ilovasi, agar foydalanuvchi sichqonchaning o'ng tugmasi bosilsa, deb taxmin qiladi
Meta tugmachasini bosib ushlab turadi (ba'zan Buyruq tugmasi yoki a.dagi "Apple" tugmasi deb ataladi
Mac) va sichqoncha tugmasini bosing.

12.31-rasmning 21-qatorida MouseDetailsFrame uchun MouseListener qayd etilgan. The


voqea tinglovchisi MouseClickHandler sinfining ob'ekti bo'lib, MouseAdapterni kengaytiradi. Bu
faqat mouseClicked usulini e'lon qilish imkonini beradi (28–45-qatorlar). Bu usul birinchi navbatda ushlaydi
voqea sodir bo'lgan koordinatalar va ularni xPos va yPos mahalliy o'zgaruvchilarida saqlaydi
(31–32-qatorlar). 34-35 qatorlar qatorlar sonini o'z ichiga oluvchi tafsilotlar deb ataladigan qatorni yaratadi.
35-qatorda getClickCount MouseEvent usuli bilan qaytariladigan sichqonchani ketma-ket bosish.
37–42 qatorlar sichqonchaning qaysi tugmachasini aniqlash uchun isMetaDown va isAltDown usullaridan foydalanadi
foydalanuvchi bosgan va har bir holatda tafsilotlarga tegishli Stringni qo'shgan. Olingan
String statusbarda ko'rsatiladi. Class MouseDetails (12.32-rasm) asosiyni o'z ichiga oladi
dasturni bajaradigan usul. Sichqonchaning har bir tugmasi bilan bosishga harakat qiling
marta bosish sonining o'sishini ko'rish uchun.

Umumiy dasturlash xatosi 12.3


Agar siz adapter sinfini kengaytirsangiz va siz bekor qilayotgan usul nomini noto'g'ri yozsangiz va
@Override bilan usulni e'lon qilmaysiz, sizning usulingiz boshqasiga aylanadi
sinfdagi usul. Bu mantiqiy xato bo'lib, uni aniqlash qiyin, chunki dastur buni aniqlaydi
adapter sinfidan meros bo'lib qolgan usulning bo'sh versiyasini chaqiring.

InputEvent usuli Tavsif

isMetaDown() Foydalanuvchi a-da sichqonchaning o'ng tugmachasini bosganida true qiymatini qaytaradi
ikki yoki uchta tugma bilan sichqoncha. O'ng sichqonchani simulyatsiya qilish uchun -
tugmasini bir tugma sichqonchani bosing, foydalanuvchi ushlab turishi mumkin
klaviaturadagi Meta tugmachasini bosing va sichqoncha tugmasini bosing.
isAltDown() Foydalanuvchi a-da sichqonchaning o'rta tugmachasini bosganida true qiymatini qaytaradi
uchta tugma bilan sichqoncha. Sichqonchaning o'rta tugmachasini simulyatsiya qilish uchun
bir yoki ikki tugmali sichqonchani bosing, foydalanuvchi Alt tugmasini bosishi mumkin
tugmachasini bosing va mos ravishda sichqonchaning yagona yoki chap tugmachasini bosing.

12.33-rasm | Sichqonchaning o'ng yoki markaziy ekanligini aniqlashga yordam beradigan InputEvent usullari


tugmasi bosildi.

522 12-bob GUI komponentlari: 1-qism

12.16 Sichqoncha bilan chizish uchun JPanel kichik sinfi
12.14-bo'lim JPanel-da sichqoncha hodisalarini qanday kuzatishni ko'rsatdi. Ushbu bo'limda biz a dan foydalanamiz
JPanel - bu foydalanuvchi sichqonchani sudrab chizish mumkin bo'lgan maxsus chizma maydoni. In
Bundan tashqari, ushbu bo'lim adapter sinfini kengaytiruvchi voqea tinglovchisini ko'rsatadi.
PaintComponent usuli
JComponent sinfini kengaytiruvchi engil Swing komponentlari (masalan, JPanel) o'z ichiga oladi
PaintComponent usuli, bu yengil Swing komponenti ishdan chiqqanda chaqiriladi.
o'ynadi. Ushbu usulni bekor qilish orqali siz Java grafigi yordamida shakllarni qanday chizishni belgilashingiz mumkin -
ics imkoniyatlari. JPanel-ni maxsus chizma maydoni sifatida ishlatish uchun sozlashda
pastki sinf paintComponent usulini bekor qilishi va bo'yoqning superklass versiyasini chaqirishi kerak.
Komponentni ta'minlash uchun bekor qilingan usulning tanasida birinchi bayonot sifatida
komponent to'g'ri ko'rsatiladi. Buning sababi shundaki, JComponent ning quyi sinflari trans-
ota-onalik. Komponentni to'g'ri ko'rsatish uchun dastur mavjud yoki yo'qligini aniqlashi kerak
komponent shaffofdir. Buni aniqlaydigan kod JComponent super klassida
paintComponentni amalga oshirish. Komponent shaffof bo'lsa, paintComponent
dastur komponentni ko'rsatganda uning fonini tozalamaydi. Qachon kompozitsiya-
nent shaffof emas, paintComponent komponentdan oldin komponent fonini tozalaydi.
nent ko'rsatiladi. Swing engil komponentining shaffofligi bilan o'rnatilishi mumkin
setOpaque usuli (noto'g'ri argument komponentning shaffofligini bildiradi).

Maxsus chizma maydonini belgilash


Rasmdagi Painter ilovasi. 12.34–12.35 JPan-ning moslashtirilgan kichik sinfini namoyish etadi.
el maxsus chizilgan maydoni yaratish uchun ishlatiladi. Ilova mouseDragged-dan foydalanadi
oddiy chizmachilik ilovasini yaratish uchun hodisa ishlovchisi. Foydalanuvchi sudrab suratlar chizishi mumkin
JPanel-dagi sichqoncha. Bu misolda mouseMoved usuli ishlatilmaydi, shuning uchun bizning voqea-list-
tener sinfi (12.34-rasmning 20-29-qatorlaridagi anonim ichki sinf) Sichqonchani kengaytiradi.
MotionAdapter. Bu sinf allaqachon mouseMoved va mouseDragged ni e'lon qilganligi sababli, biz
Ushbu ilova talab qiladigan hodisani boshqarish uchun mouseDragged-ni bekor qilishi mumkin.

Xatolarning oldini olish bo'yicha maslahat 12.1


JComponent kichik sinfining paintComponent usulida birinchi ibora har doim bo'lishi kerak
pastki sinf ob'ekti ishdan chiqishiga ishonch hosil qilish uchun superklassning paintComponent usulini chaqiring.
to'g'ri o'ynaydi.

Umumiy dasturlash xatosi 12.4


Agar bekor qilingan paintComponent usuli supersinf versiyasini chaqirmasa, pastki
sinf komponenti to'g'ri ko'rsatilmasligi mumkin. Agar bekor qilingan paintComponent usuli chaqirilsa
boshqa chizma bajarilgandan so'ng superklass versiyasi o'chiriladi.

1 // 12.34-rasm: PaintPanel.java


2 // Hodisa ishlov beruvchilarini amalga oshirish uchun ishlatiladigan adapter klassi.
3 import java.awt.Point;
4 import java.awt.Graphics;
5 import java.awt.event.MouseEvent;

12.34-rasm | Hodisa ishlov beruvchilarini amalga oshirish uchun adapter klassi ishlatiladi. (2-qismning 1-qismi.)


12.16 JPanel Sichqoncha bilan chizish uchun kichik sinf 523

PaintPanel klassi (12.34-rasm) JPanel-ni kengaytirib, ajratilgan chizma maydonini yaratadi.
Class Point (java.awt paketi) xy koordinatasini ifodalaydi. Biz ushbu sinf ob'ektlaridan foydalanamiz
har bir sichqonchani tortish hodisasining koordinatalarini saqlash uchun. Chizish uchun Class Graphics ishlatiladi. Bunda
Misol uchun, biz har bir sichqonchani joylashgan joyni saqlash uchun nuqtalar qatoridan (13-qator) foydalanamiz
tortish hodisasi sodir bo'ladi. Ko'rib turganingizdek, paintComponent usuli chizish uchun ushbu nuqtalardan foydalanadi.
19–30 qatorlar PaintPanel sichqonchasini tinglash uchun MouseMotionListener-ni ro'yxatdan o'tkazing
harakat hodisalari. 20-29-qatorlar anonim ichki sinf ob'ektini yaratadi, u kengaytiradi
MouseMotionAdapter adapter sinfi. Eslatib o'tamiz, MouseMotionAdapter Mouse-ni qo'llaydi.
MotionListener, shuning uchun anonim ichki sinf ob'ekti MouseMotionListener. The
anonim ichki sinf standart mouseMoved va mouseDragged ilovalarini meros qilib oladi,
shuning uchun u allaqachon interfeysning barcha usullarini amalga oshiradi. Biroq, standart amalga oshirish -

6 import java.awt.event.MouseMotionAdapter;


7 import java.util.ArrayList;
8 import javax.swing.JPanel;
9
10 umumiy sinf PaintPanel JPanel-ni kengaytiradi
11 {
12 // Point havolalari ro'yxati
13
14
15 // GUI-ni o'rnating va sichqoncha hodisasi ishlovchisini ro'yxatdan o'tkazing
16 ommaviy PaintPanel()
17 {
18 // ishlov berish ramkasi sichqoncha harakati hodisasi
19 qo'shimcha MouseMotionListener(
20 // anonim ichki sinf
21 {
22 // tortish koordinatalarini saqlash va qayta bo'yash
23 @Bekor qilish
24
25 {
26 ball.add( );
27
28 }
29 }
30);
31 }
32
33 // oynaning ko'rsatilgan joylarida 4x4 o'lchamdagi ovallarni chizing
34 @Bekor qilish
35 umumiy bekor bo'yoq Komponenti (Grafika g)
36 {
37 super.paintComponent(g); // chizilgan maydonni tozalaydi
38
39 // barcha nuqtalarni chizish
40 uchun (nuqta: ball)
41 g.fillOval( , 4, 4);
42 }
43 } // oxirgi sinf PaintPanel

12.34-rasm | Hodisa ishlov beruvchilarini amalga oshirish uchun adapter klassi ishlatiladi. (2-qismning 2-qismi.)

xususiy yakuniy ArrayList
ball = new ArrayList<>();

yangi MouseMotionAdapter()

public void mouseDragged(MouseEvent hodisasi)

event.getPoint()


qayta bo'yash (); // JFrame-ni qayta bo'yash

nuqta.x, nuqta.y


524 12-bob GUI komponentlari: 1-qism

Ular chaqirilganda hech narsa qilmaydi. Shunday qilib, biz sichqonchaning 23-qatordaDragged usulini bekor qilamiz
28 sichqonchani tortish hodisasining koordinatalarini olish va ularni Point obyekti sifatida saqlash uchun. Chiziq
26 hodisa sodir bo'lgan nuqtani olish uchun MouseEventning getPoint usulini chaqiradi
yuzaga keldi va uni ArrayList da saqlaydi. 27-qator qayta bo'yash usulini chaqiradi (meroslangan indi-
to'g'ridan-to'g'ri Komponent sinfidan) PaintPanel yangilanishi kerakligini ko'rsatish uchun
PaintPanel-ning paintComponent usuliga qo'ng'iroq qilish bilan imkon qadar tezroq ekranni oching.
Grafik parametrini qabul qiluvchi paintComponent usuli (34–42-qatorlar).
PaintPanel ekranda ko'rsatilishi kerak bo'lganda avtomatik ravishda chaqiriladi, masalan
GUI birinchi marta ekranda ko'rsatilganda yoki ekranda yangilanganda, masalan, qachon usuli
repaint chaqiriladi yoki GUI komponenti boshqa oynada yashiringan bo'lsa
ekranga tushadi va keyin yana ko'rinadigan bo'ladi.

37-qator PaintPanel-ni tozalash uchun paintComponent-ning superklass versiyasini chaqiradi.


fon (JPanellar sukut bo'yicha shaffof emas). 40-41-chi qatorlar joylashgan joyda oval chiziladi
ArrayListdagi har bir nuqta tomonidan belgilanadi. FillOval grafik usuli qattiq oval chizadi.
Usulning to'rtta parametri to'rtburchaklar maydonini (chegaralash qutisi deb ataladi) ifodalaydi
qaysi oval ko'rsatiladi. Birinchi ikkita parametr yuqori chap x-koordinata va
to'rtburchaklar maydonning yuqori chap y-koordinatasi. Oxirgi ikki koordinata ni ifodalaydi
to'rtburchaklar maydonining kengligi va balandligi. FillOval usuli ovalni ovalga tegishi uchun chizadi
to'rtburchaklar maydonning har bir tomonining o'rtasi. 41-qatorda birinchi ikkita argument ko'rsatilgan
Point sinfining ikkita umumiy misol o'zgaruvchilari - x va y yordamida. Siz ko'proq grafikani o'rganasiz
13-bobdagi xususiyatlar.

Ilovada Custom JPanel-dan foydalanish


Class Painter (12.35-rasm) ushbu dasturni bajaradigan asosiy usulni o'z ichiga oladi. Chiziq
14 foydalanuvchi chizish uchun sichqonchani sudrab borishi mumkin bo'lgan PaintPanel ob'ektini yaratadi. 15-qator
PaintPanel-ni JFrame-ga biriktiradi.

Ko'rish va his qilish kuzatuvi 12.13


Swing GUI komponenti uchun repaintni chaqirish komponentni qayta tiklash kerakligini bildiradi.
imkon qadar tezroq ekranda yangilanadi. Komponentning foni faqat quyidagi hollarda tozalanadi
komponent shaffof emas. JComponent usuli setOpaque mantiqiy argu-
komponentning shaffof (to'g'ri) yoki shaffof (noto'g'ri) ekanligini ko'rsatadigan ment.

Ko'rish va his qilish kuzatuvi 12.14


Har qanday GUI komponentida chizish o'lchangan koordinatalar bilan amalga oshiriladi
ekranning yuqori chap burchagi emas, balki ushbu GUI komponentining yuqori chap burchagi (0, 0).

1 // 12.35-rasm: Painter.java


2 // PaintPanel-ni sinab ko'rish.
3 import java.awt.BorderLayout;
4 import javax.swing.JFrame;
5 import javax.swing.JLabel;
6
7 umumiy sinf rassomi
8 {

12.35-rasm | PaintPanel sinovi. (2-qismning 1-qismi.)


12.17 Asosiy voqealarni boshqarish 525

12.17 Asosiy voqealarni boshqarish
Ushbu bo'lim asosiy voqealarni boshqarish uchun KeyListener interfeysini taqdim etadi. Asosiy voqealar
klaviaturadagi tugmalar bosilganda va qo'yib yuborilganda hosil bo'ladi. Amalga oshiruvchi sinf
KeyListener keyPressed, keyReleased va key- usullari uchun deklaratsiyalarni taqdim etishi kerak.
Yozilgan, ularning har biri o'z argumenti sifatida KeyEventni oladi. KeyEvent klassi quyi sinfdir
InputEvent. Metod keyPressed har qanday tugmachani bosishga javoban chaqiriladi. Usul kaliti -
Yozilgan tugmasi harakat tugmasi bo'lmagan har qanday tugmani bosishga javoban chaqiriladi. (Harakat tugmalari
har qanday strelka tugmasi, Bosh sahifa, End, Page Up, Page Down, istalgan funktsiya tugmasi va boshqalar.) Metod tugmasi-
Released har qanday keyPressed yoki keyTyped hodisasidan so‘ng kalit qo‘yib yuborilganda chaqiriladi.
Shakllarning qo'llanilishi. 12.36–12.37 KeyListener usullarini namoyish etadi. Sinf
KeyDemoFrame KeyListener interfeysini amalga oshiradi, shuning uchun uchta usul ham e'lon qilinadi
ilova. Konstruktor (12.36-rasm, 17-28-qatorlar) dasturni ro'yxatdan o'tkazadi
27-qatordagi addKeyListener usuli yordamida o'zining asosiy voqealarini boshqaring. AddKey- usuli
Tinglovchi Komponent sinfida e'lon qilinadi, shuning uchun Komponentning har bir kichik klassi Key-ga xabar berishi mumkin.
Ushbu Komponent uchun asosiy voqealarning tinglovchi ob'ektlari.

9 ta umumiy statik bekor asosiy(String[] args)


10 {
11 // JFrame yarating
12 JFrame ilovasi = yangi JFrame("Oddiy bo'yoq dasturi");
13
14
15 application.add(paintPanel, BorderLayout.CENTER);
16
17 // yorliq yarating va uni BorderLayout ning JANUBIGA joylashtiring
18 application.add(yangi JLabel("Chizish uchun sichqonchani torting"),
19 BorderLayout.SOUTH);
20
21 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
22 application.setSize(400, 200);
23 application.setVisible(rost);
24 }
25 } // oxirgi sinf Painter

1 // 12.36-rasm: KeyDemoFrame.java


2 // Asosiy voqealarni boshqarish.
3 import java.awt.Color;

12.36-rasm | Asosiy voqealarni boshqarish. (3-qismning 1-qismi.)

12.35-rasm | PaintPanel sinovi. (2-qismning 2-qismi.)

PaintPanel paintPanel = yangi PaintPanel();


526 12-bob GUI komponentlari: 1-qism

4 import java.awt.event.KeyListener;
5 import java.awt.event.KeyEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JTextArea;
8
9 ommaviy sinf KeyDemoFrame JFrame-ni kengaytiradi
10 {
11 xususiy yakuniy String line1 = ""; // matn maydonining birinchi qatori
12 xususiy yakuniy String line2 = ""; // matn maydonining ikkinchi qatori
13 xususiy yakuniy String line3 = ""; // matn maydonining uchinchi qatori
14 xususiy yakuniy JTextArea textArea; // chiqishni ko'rsatish uchun matn maydoni
15
16 // KeyDemoFrame konstruktori
17 ochiq KeyDemoFrame()
18 {
19 super("Klaviatura bosish hodisalarini ko'rsatish");
20
21 textArea = yangi JTextArea(10, 15); // JTextArea-ni o'rnating
22 textArea.setText("Klaviaturadagi istalgan tugmani bosing...");
23 textArea.setEnabled(false);
24
25 qo'shish (matn maydoni); // JFrame-ga matn maydoni qo'shing
26
27
28 }
29
30 // istalgan tugmachani bosish
31 @Bekor qilish
32
33 {
34 line1 = String.format("Klaviatura bosildi: %s",
35); // bosilgan tugmani ko'rsatish
36 setLines2 va 3 (voqea); // ikkinchi va uchinchi chiqish qatorlarini o'rnating
37 }
38
39 // istalgan tugmachani bo'shatish
40 @Bekor qilish
41
42 {
43 line1 = String.format("Kalit chiqarildi: %s",
44); // chiqarilgan kalitni ko'rsatish
45 setLines2 va 3 (voqea); // ikkinchi va uchinchi chiqish qatorlarini o'rnating
46 }
47
48 // harakat tugmachasini bosish
49 @Bekor qilish
50
51 {
52 line1 = String.format("Kalit kiritildi: %s", );
53 setLines2 va 3 (voqea); // ikkinchi va uchinchi chiqish qatorlarini o'rnating
54 }
55

12.36-rasm | Asosiy voqealarni boshqarish. (3 qismning 2-qismi.)

KeyListener dasturini amalga oshiradi

textArea.setDisabledTextColor(Color.BLACK);

addKeyListener(bu); // asosiy voqealarni qayta ishlash uchun ramkaga ruxsat berish

public void keyPressed (KeyEvent hodisasi)

KeyEvent.getKeyText(event.getKeyCode())

public void keyReleased(KeyEvent hodisasi)

KeyEvent.getKeyText(event.getKeyCode())

public void keyTyped(KeyEvent hodisasi)

event.getKeyChar()

12.17 Asosiy voqealarni boshqarish 527

56 // chiqishning ikkinchi va uchinchi qatorlarini o'rnating
57 shaxsiy bekor setLines2and3(KeyEvent hodisasi)
58 {
59 line2 = String.format("Bu kalit %san harakat kaliti",
60 ( ? "" : "emas");
61
62
63
64 line3 = String.format("O'zgartirish tugmalari bosildi: %s",
65 (temp.equals("") ? "none" : temp)); // chiqish modifikatorlari
66
67 textArea.setText(String.format("%s\n%s\n%s\n",
68 satr1, 2-qator, 3-qator); // uchta qatorli matnni chiqarish
69 }
70 } // KeyDemoFrame oxirgi sinfi

1 // 12.37-rasm: KeyDemo.java


2 // KeyDemoFrame sinovi.
3 import javax.swing.JFrame;
4
5 ommaviy sinf KeyDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 KeyDemoFrame keyDemoFrame = yangi KeyDemoFrame();
10 keyDemoFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 keyDemoFrame.setSize(350, 100);
12 keyDemoFrame.setVisible(rost);
13 }
14 } // KeyDemo klassi

12.37-rasm | KeyDemoFrame sinovdan o'tkazilmoqda. (2-qismning 1-qismi.)

12.36-rasm | Asosiy voqealarni boshqarish. (3 qismning 3-qismi.)

event.isActionKey()

String temp = KeyEvent.getKeyModifiersText(event.getModifiers());

528 12-bob GUI komponentlari: 1-qism



25-qatorda konstruktor JTextArea textArea (ilovaning
chiqishi ko'rsatiladi) JFrame-ga. JTextArea - bu ko'p qatorli maydon bo'lib, unda siz
matnni o'ynatish. (JTextAreas haqida batafsilroq 12.20-bo'limda muhokama qilamiz.) Ekrandagi eslatma
textArea butun oynani egallaganligini aniqlaydi. Bu JFrame-ning sukut bo'yicha
BorderLayout (12.18.2-bo'limda muhokama qilingan va 12.41-rasmda ko'rsatilgan). Qachon a
BorderLayout-ga bitta komponent qo'shiladi, komponent butun tarkibni egallaydi.
tayor. 23-qator JTextArea-ni o'chiradi, shuning uchun foydalanuvchi uni kirita olmaydi. Bu matnni keltirib chiqaradi
JTextArea da kul rangga aylanadi. 24-qator o'zgartirish uchun setDisabledTextColor usulidan foydalanadi
o'qilishi uchun JTextAreadagi matn rangini qora rangga aylantiring.
KeyBosilgan (31–37-qatorlar) va keyReleased (40–46-qatorlar) usullari KeyEventdan foydalanadi.
bosilgan tugmaning virtual kalit kodini olish uchun getKeyCode usuli. Class KeyEvent con-
klaviaturadagi har bir tugmani ifodalovchi virtual kalit-kod konstantalarini saqlaydi. Bu konstantalar
kalitdagi alohida kalitlarni sinab ko'rish uchun getKeyCode-ning qaytish qiymati bilan solishtirish mumkin.
taxta. GetKeyCode tomonidan qaytarilgan qiymat statik KeyEvent usuli getKey-ga o'tkaziladi.
Matn, bosilgan kalit nomini o'z ichiga olgan qatorni qaytaradi. a uchun
virtual kalit konstantalarining to'liq ro'yxati, KeyEvent sinfi uchun onlayn hujjatlarga qarang
(java.awt.event to'plami). Method keyTyped (49–54-qatorlar) KeyEvent usulidan foydalanadi.
Terilgan belgining Unicode qiymatini olish uchun KeyChar (belgini qaytaradi).
Voqealarni boshqarishning barcha uchta usuli setLines2 va 3 usulini chaqirish bilan yakunlanadi (57-qatorlar).
69) va unga KeyEvent ob'ektini o'tkazish. Bu usul KeyEvent isActionKey usulidan foydalanadi
(60-satr) voqeadagi kalit harakat kaliti yoki yo'qligini aniqlash uchun. Shuningdek, InputEvent
getModifiers usuli (62-satr) har qanday modifikator kalitlari (masalan,
Shift, Alt va Ctrl) kalit hodisa sodir bo'lganda bosilgan. Ushbu usulning natijasi
String hosil qiluvchi getKeyModifiersText statik KeyEvent usuliga uzatiladi
bosilgan o'zgartiruvchi tugmalar nomlarini o'z ichiga oladi.
[Izoh: Agar klaviaturada ma'lum bir tugmani sinab ko'rishingiz kerak bo'lsa, KeyEvent klassi taqdim etadi
har biri uchun asosiy konstanta. Ushbu konstantalar asosiy hodisalarni ishlov beruvchilardan tortib to
ma'lum bir tugma bosilganligini aniqlang. Shuningdek, Alt, Ctrl,
Meta va Shift tugmalari alohida bosiladi, InputEvent usullari -AltDown, isCon-
trolDown, isMetaDown va isShiftDown har biri mantiqiy qiymatni qaytaradi, bu
asosiy voqea paytida ma'lum bir tugma bosildi.]
12.18 Layout menejerlariga kirish
Layout menejerlari GUI komponentlarini taqdimot maqsadlari uchun konteynerga joylashtiradilar. Siz
Har bir GUIni aniqlash o'rniga asosiy tartib qobiliyatlari uchun tartib menejerlaridan foydalanishi mumkin
komponentning aniq joylashuvi va hajmi. Ushbu funksiya sizga diqqatni jamlashga imkon beradi
asosiy ko'rinish va tuyg'u va tartib menejerlariga tartib tafsilotlarining ko'pini qayta ishlash imkonini beradi. Hamma yotadi -
menejerlar LayoutManager interfeysini (java.awt paketida) amalga oshiradilar. Sinf konfiguratsiyasi

12.37-rasm | KeyDemoFrame sinovdan o'tkazilmoqda. (2-qismning 2-qismi.)


12.18 Layout menejerlariga kirish 529

tanerning setLayout usuli LayoutManager interfeysini amalga oshiradigan ob'ektni oladi
argument sifatida. GUIda komponentlarni tartibga solishning asosan uchta usuli mavjud:
1. Mutlaq joylashishni aniqlash: Bu GUI ilovasi ustidan eng yuqori darajadagi nazoratni ta'minlaydi.
befarqlik. Konteyner tartibini null ga o'rnatish orqali siz mutlaqni belgilashingiz mumkin
Har bir GUI komponentining konturning yuqori chap burchagiga nisbatan joylashuvi
setSize va setLocation yoki setBounds komponent usullaridan foydalangan holda tayorlang. Agar
buni qilsangiz, har bir GUI komponentining hajmini ham belgilashingiz kerak. Dasturlash a
Mutlaq joylashishni aniqlashga ega GUI zerikarli bo'lishi mumkin, agar sizda o'rnatilgan deformatsiya bo'lmasa.
siz uchun kod yaratishi mumkin bo'lgan rivojlanish muhiti (IDE).
2. Layout menejerlari: Elementlarni joylashtirish uchun tartib menejerlaridan foydalanish oddiyroq va bo'lishi mumkin
mutlaq joylashuvga ega GUI yaratishdan ko'ra tezroq va GUI'laringizni ko'proq qiladi
o'lchamini o'zgartirish mumkin, lekin siz o'lcham va aniq joylashishni nazorat qilishni yo'qotasiz
har bir komponent.
3. IDEda vizual dasturlash: IDElar yaratishni osonlashtiradigan vositalarni taqdim etadi
GUI'lar. Har bir IDE odatda GUI dizayn vositasini taqdim etadi, bu sizga sudrab borish imkonini beradi
GUI komponentlarini asboblar qutisidan dizayn maydoniga tashlang. Keyin joylashtirishingiz mumkin,
GUI komponentlarini xohlaganingizcha o'lcham va tekislang. IDE Java kodini yaratadi
GUI ni yaratadi. Bundan tashqari, siz odatda par
komponentni ikki marta bosish orqali tikular komponent. Ba'zi dizayn vositalari ham
Siz ushbu bobda va 22-bobda tasvirlangan tartib menejerlaridan foydalanishingiz mumkin.

12.38-rasmda ushbu bobda keltirilgan tartib menejerlari jamlangan. Bir juft


qo'shimcha tartib menejerlari 22-bobda muhokama qilinadi.

Ko'rish va his qilish kuzatuvi 12.15


Ko'pgina Java IDE-lar GUIni vizual tarzda loyihalash uchun GUI dizayn vositalarini taqdim etadi; keyin asboblar
GUI yaratadigan Java kodini yozing. Bunday vositalar ko'pincha o'lchamni ko'proq nazorat qilishni ta'minlaydi,
GUI komponentlarining joylashishi va hizalanishi o'rnatilgan tartib menejerlariga qaraganda.

Ko'rish va his qilish kuzatuvi 12.16


Konteyner tartibini nullga o'rnatish mumkin, bu hech qanday tartib menejeri yo'qligini ko'rsatadi
foydalanish kerak. Tartib boshqaruvchisi bo'lmagan konteynerda siz uni joylashtirishingiz va hajmini belgilashingiz kerak
komponentlarni o'zgartiring va hodisalar o'lchamini o'zgartirganda, barcha komponentlar kerak bo'lganda o'zgartirilishiga e'tibor bering.
sari. Komponentning o'lchamini o'zgartirish hodisalari ComponentListener tomonidan qayta ishlanishi mumkin.

Layout menejeri Tavsif

FlowLayout javax.swing.JPanel uchun standart. Komponentlarni ketma-ket, chapga joylashtiradi
to'g'ri, ular qo'shilgan tartibda. Buyurtmani belgilash ham mumkin
Komponentlarni Konteyner usulidan foydalanib, a oladi
Argument sifatida komponent va butun son indeks pozitsiyasi.
JFrames (va boshqa oynalar) uchun BorderLayout standarti. Komponentlarni tartibga soladi
beshta hududga: Shimol, Janub, Sharq, G'arbiy va MARKAZ.
GridLayout Komponentlarni satr va ustunlarga joylashtiradi.

12.38-rasm | Dizayn menejerlari.


530 12-bob GUI komponentlari: 1-qism

12.18.1 FlowLayout
FlowLayout - eng oddiy tartib menejeri. GUI komponentlari konteynerga joylashtirilgan
konteynerga qo'shilish tartibida chapdan o'ngga. Qachon chekkasi
konteyner yetib borsa, komponentlar keyingi qatorda ko'rishda davom etadi. Class FlowLay -
out GUI komponentlarini chapga, markazga (standart) va o'ngga tekislash imkonini beradi.
Shakllarning qo'llanilishi. 12.39–12.40 uchta JButton ob'ektini yaratadi va ularni qo'shadi
FlowLayout yordamida ilova. Komponentlar sukut bo'yicha markazga hizalanadi. Qachon
foydalanuvchi Chapga bosadi, FlowLayout hizalanishi chapga tekislanadi. Qachon foydalanuvchi
O'ngga bosgandan so'ng, FlowLayout hizalanishi o'ngga tekislanganga o'zgaradi. Foydalanuvchi chertganda
Markazda, FlowLayout hizalanishi markazga tekislanganga o'zgartiriladi. Namuna chiqishi g'alaba qozondi -
pastga har bir tekislashni ko'rsatadi. Oxirgi namunaviy chiqish dan keyin markazlashtirilgan hizalanishni ko'rsatadi
O'ng tugmasi yangi qatorga o'tishi uchun oyna kichikroq kenglikka o'zgartirildi.
Oldindan ko'rinib turganidek, konteynerning joylashuvi Con sinfining setLayout usuli bilan o'rnatiladi.
tayner. 25-qator (12.39-rasm) tartib menejerini satrda e'lon qilingan FlowLayout-ga o'rnatadi.
23. Odatda, sxema har qanday GUI komponentlarini konteynerga qo'shishdan oldin o'rnatiladi.
Ko'rish va his qilish kuzatuvi 12.17
Har bir alohida konteynerda faqat bitta tartib menejeri bo'lishi mumkin, lekin bir nechta konteyner ichida
bir xil dastur har biri turli tartib menejerlaridan foydalanishi mumkin.

1 // 12.39-rasm: FlowLayoutFrame.java


2 // FlowLayout komponentlarga bir nechta satrlar orqali oqish imkonini beradi.
3 import java.awt.FlowLayout;
4 import java.awt.Container;
5 import java.awt.event.ActionListener;
6 import java.awt.event.ActionEvent;
7 import javax.swing.JFrame;
8 import javax.swing.JButton;
9
10 ommaviy sinf FlowLayoutFrame JFrame-ni kengaytiradi
11 {
12 ta xususiy final JButton chapJButton; // chapga tekislashni o'rnatish uchun tugma
13 xususiy yakuniy JButton markaziJButton; Hizalash markazini o'rnatish uchun // tugma
14 xususiy final JButton o'ngJButton; // o'ngga tekislashni o'rnatish uchun tugma
15 ta xususiy yakuniy FlowLayout tartibi; // tartib obyekti
16 ta xususiy yakuniy konteyner konteyneri; // maketni o'rnatish uchun konteyner
17
18 // GUI-ni o'rnating va tugma tinglovchilarini ro'yxatdan o'tkazing
19 ommaviy FlowLayoutFrame()
20 {
21 super("FlowLayout demo");
22
23
24 konteyner = getContentPane(); // konteynerni maketga olish
25
26
27 // leftJButton-ni o'rnating va tinglovchini ro'yxatdan o'tkazing
28 chapJButton = yangi JButton("Chap");
29

12.39-rasm | FlowLayout komponentlarning bir nechta satrlar bo'ylab oqishiga imkon beradi. (2-qismning 1-qismi.)

tartib = yangi FlowLayout();

setLayout (tartib);

qo'shish (chap JButton); // ramkaga chap tugmani qo'shing

12.18 Layout menejerlariga kirish 531

30 chapJButton.addActionListener(
31 ta yangi ActionListener() // anonim ichki sinf
32 {
33 // leftJButton hodisasini qayta ishlash
34 @Bekor qilish
35 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
36 {
37
38
39 // biriktirilgan komponentlarni qayta tekislash
40
41 }
42 }
43);
44
45 // centerJButton-ni o'rnating va tinglovchini ro'yxatdan o'tkazing
46 centerJButton = yangi JButton("Markaz");
47
48 centerJButton.addActionListener(
49 ta yangi ActionListener() // anonim ichki sinf
50 {
51 // jarayon markaziJButton hodisasi
52 @Bekor qilish
53 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
54 {
55
56
57 // biriktirilgan komponentlarni qayta tekislang
58
59 }
60 }
61);
62
63 // o'ngJButton-ni o'rnating va tinglovchini ro'yxatdan o'tkazing
64 o'ngJButton = yangi JButton("O'ng");
65
66 rightJButton.addActionListener(
67 yangi ActionListener() // anonim ichki sinf
68 {
69 // rightJButton hodisasini qayta ishlash
70 @Bekor qilish
71 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
72 {
73
74
75 // biriktirilgan komponentlarni qayta tekislang
76
77 }
78 }
79);
80 } // FlowLayoutFrame konstruktorini tugatish
81 } // oxirgi sinf FlowLayoutFrame

12.39-rasm | FlowLayout komponentlarning bir nechta satrlar bo'ylab oqishiga imkon beradi. (2-qismning 2-qismi.)

layout.setAlignment(FlowLayout.LEFT);

layout.layoutContainer(konteyner);

qo'shish (centerJButton); // ramkaga markaziy tugmani qo'shing

layout.setAlignment(FlowLayout.CENTER);

layout.layoutContainer(konteyner);

qo'shish (o'ng JButton); // ramkaga o'ng tugmani qo'shing

layout.setAlignment(FlowLayout.RIGHT);

layout.layoutContainer(konteyner);


532 12-bob GUI komponentlari: 1-qism

Har bir tugmaning hodisa ishlovchisi alohida anonim ichki sinf obyekti bilan belgilanadi
(mos ravishda 30–43, 48–61 va 66–79 qatorlar) va usul harakati Har bir holatda bajariladi
ikkita bayonotni bajaradi. Masalan, leftJButton uchun hodisa ishlov beruvchisidagi 37-qatordan foydalaniladi
FlowLayout-ning hizalanishini chapga o'zgartirish uchun setAlignment usuli FlowLayout-
tekislangan (FlowLayout.LEFT) FlowLayout. 40-qator LayoutManager interfeys usulidan foydalanadi
layoutContainer (barcha tartib menejerlari tomonidan meros qilib olingan) JFrame ekanligini aniqlash uchun.
sozlangan tartib asosida qayta tartibga solinishi kerak. Qaysi tugma bosilganiga ko'ra,
Har bir tugma uchun actionPerformed usuli FlowLayout-ni Flow-ga moslashtirishni o'rnatadi.
Layout.LEFT (37-qator), FlowLayout.CENTER (55-qator) yoki FlowLayout.RIGHT (73-qator).
12.18.2 BorderLayout
BorderLayout layout menejeri (JFrame uchun standart tartib menejeri) tartibga soladi
Komponentlar beshta hududga: SHIMOLI, JANUBI, SARQ, G'ARB va MARKAZGA bo'linadi. NORTH ga mos keladi
konteynerning yuqori qismi. Class BorderLayout Ob'ektni kengaytiradi va interfeysni amalga oshiradi
LayoutManager2 (LayoutManager-ning pastki interfeysi, u bir nechta usullarni qo'shadi.
murakkab tartibni qayta ishlash).
BorderLayout konteynerni ko'pi bilan beshta komponentdan iborat bo'lishi bilan cheklaydi
har bir mintaqa. Har bir mintaqada joylashtirilgan komponent boshqa birlashadigan konteyner bo'lishi mumkin.
ponentlar biriktirilgan. SHIMOLIY va JANUBI mintaqalarida joylashgan komponentlar cho'ziladi.

1 // 12.40-rasm: FlowLayoutDemo.java


2 // FlowLayoutFrame sinovi.
3 import javax.swing.JFrame;
4
5 ommaviy sinf FlowLayoutDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 FlowLayoutFrame flowLayoutFrame = yangi FlowLayoutFrame();
10 flowLayoutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 flowLayoutFrame.setSize(300, 75);
12 flowLayoutFrame.setVisible(rost);
13 }
14 } // oxirgi sinf FlowLayoutDemo

12.40-rasm | FlowLayoutFrame sinovdan o‘tkazilmoqda.


12.18 Layout menejerlariga kirish 533

Izontal ravishda idishning yon tomonlariga joylashtiriladi va ular ichiga joylashtirilgan qismlarga teng bo'ladi
hududlar. SARQ va G'arbiy mintaqalar Shimol va Janub o'rtasida vertikal ravishda kengayadi
hududlar va shu hududlarda joylashtirilgan komponentlar kabi kengdir. Komponent joylashtirilgan
CENTER mintaqasi tartibdagi barcha qolgan bo'sh joyni to'ldirish uchun kengayadi (shuning sababi
12.37-rasmdagi JTextArea butun oynani egallaydi). Agar barcha beshta hudud ishg'ol qilingan bo'lsa,
butun konteyner maydoni GUI komponentlari bilan qoplangan. Agar SHIMOLIY yoki JANUBI mintaqasi bo'lmasa
egallagan holda, GUI komponentlari Sharqiy, CENTER va Gʻarbiy hududlarda vertikal ravishda kengayadi.
qolgan joyni to'ldiring. Agar Sharqiy yoki G'arbiy mintaqa band bo'lmasa, GUI komponenti
CENTER mintaqasida qolgan joyni to'ldirish uchun gorizontal ravishda kengayadi. Agar CENTER mintaqasi bo'lsa
band bo'lmasa, maydon bo'sh qoladi - boshqa GUI komponentlari to'ldirish uchun kengaytirilmaydi.
qolgan joy. Shakllarning qo'llanilishi. 12.41–12.42 BorderLayoutni namoyish etadi
beshta JButton yordamida tartib menejeri.

1 // 12.41-rasm: BorderLayoutFrame.java


2 // BorderLayout beshta tugmachani o'z ichiga oladi.
3 import java.awt.BorderLayout;
4 import java.awt.event.ActionListener;
5 import java.awt.event.ActionEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JButton;
8
9 umumiy sinf BorderLayoutFrame JFrame ActionListener dasturini kengaytiradi
10 {
11 ta shaxsiy yakuniy JButton [] tugmalari; // qismlarni yashirish uchun tugmalar majmuasi
12 ta shaxsiy statik yakuniy String[] nomlari = {"Shimolni yashirish", "Janubiyni yashirish",
13 "Sharqni yashirish", "G'arbni yashirish", "Markazni yashirish"};
14
15
16 // GUI va hodisalarni boshqarishni sozlang
17 ta umumiy BorderLayoutFrame()
18 {
19 super("BorderLayout Demo");
20
21
22 setLayout(tartib);
23 tugma = yangi JButton[names.length];
24
25 // JButtons yarating va ular uchun tinglovchilarni ro'yxatdan o'tkazing
26 uchun (int count = 0; count < names.length; count++)
27 {
28 tugmalar[hisoblash] = yangi JButton(nomlar[hisoblash]);
29
30 }
31
32 add(tugmalar[0], BorderLayout.NORTH);
33 add(tugmalar[1], BorderLayout.SOUTH);
34 add(tugmalar[2], BorderLayout.EAST);
35 add(tugmalar[3], BorderLayout.WEST);
36 add(tugmalar[4], BorderLayout.CENTER);
37 }

12.41-rasm | Beshta tugmani o'z ichiga olgan BorderLayout. (2-qismning 1-qismi.)

xususiy yakuniy BorderLayout tartibi;

tartib = yangi BorderLayout(5, 5); // 5 pikselli bo'shliqlar

tugmalar[count].addActionListener(bu);

534 12-bob GUI komponentlari: 1-qism

12.41-rasmning 21-qatori BorderLayout hosil qiladi. Konstruktor argumentlari ni belgilaydi
Gorizontal ravishda joylashtirilgan komponentlar orasidagi piksellar soni (gorizontal bo'shliq
bo'sh joy) va vertikal ravishda joylashtirilgan komponentlar orasidagi (vertikal bo'shliq bo'shlig'i), mos ravishda
ehtiyotkorlik bilan. Standart - gorizontal va vertikal bo'shliqning bir pikseli. 22-qatordan foydalaniladi
setLayout usuli - tarkib panelining tartibini tartibga solish uchun.
Konteyner usulining boshqa versiyasi bilan BorderLayout-ga komponentlarni qo'shamiz
qo'shish ikkita argumentni oladi - qo'shiladigan komponent va Komponent joylashgan hudud.
nent paydo bo'lishi kerak. Misol uchun, 32-satrda tugmalar [0] paydo bo'lishi kerakligini bildiradi
Shimoliy mintaqa. Komponentlar har qanday tartibda qo'shilishi mumkin, lekin faqat bitta komponent kerak
har bir mintaqaga qo'shiladi.

Class BorderLayoutFrame ActionListener-ni to'g'ridan-to'g'ri ushbu misolda amalga oshiradi, shuning uchun


BorderLayoutFrame JButtons hodisalarini boshqaradi. Shu sababli, 29-qator o'tadi
bu har bir JButtonning addActionListener usuliga havola. Foydalanuvchi chertganda
maketdagi ma'lum JButton, usul actionPerformed (40–53-qatorlar) bajariladi. The
44–50-qatorlardagi bayonot uchun kengaytirilgan maxsus JButtonni yashirish uchun if…else dan foydalanadi.
hodisani yaratdi. SetVisible usuli (Component sinfidan JButtonga meros qilib olingan).
JButtonni yashirish uchun noto'g'ri argument (47-satr) bilan chaqirilgan. Joriy JButton bo'lsa
massiv hodisani yaratgan emas, setVisible usuli haqiqiy argument bilan chaqiriladi.
JButtonning ekranda ko'rsatilishini ta'minlash uchun (49-qator). 52-qator Layout-dan foydalanadi

38
39 // tugma hodisalarini boshqarish


40 @Bekor qilish
41 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
42 {
43 // hodisa manbasini tekshiring va mos ravishda kontent panelini joylashtiring
44 uchun (JButton tugmasi: tugmalar)
45 {
46 agar (event.getSource() == tugmasi)
47
yana 48
49
50 }
51
52
53 }
54 } // oxirgi sinf BorderLayoutFrame

Ko'rish va his qilish kuzatuvi 12.18


BorderLayout-ga komponent qo'shganda mintaqa ko'rsatilmagan bo'lsa, tartib menejeri
Komponentni BorderLayout.CENTER hududiga qo'shish kerak deb hisoblaydi.

Umumiy dasturlash xatosi 12.5


BorderLayout-da mintaqaga bir nechta komponent qo'shilsa, faqat oxirgisi
ushbu hududga qo'shilgan komponent ko'rsatiladi. Buni ko'rsatadigan hech qanday xatolik yo'q
muammo.

12.41-rasm | Beshta tugmani o'z ichiga olgan BorderLayout. (2-qismning 2-qismi.)

button.setVisible(false); // bosilgan tugmani yashirish

button.setVisible(rost); // boshqa tugmalarni ko'rsatish

layout.layoutContainer(getContentPane()); // kontent panelini joylashtirish

12.18 Layout menejerlariga kirish 535

Kontent paneli tartibini qayta hisoblash uchun menejer usuli layoutContainer. E'tibor bering
12.42-rasmdagi ekran tasviri BorderLayout-dagi ba'zi hududlar shaklini o'zgartiradi.
JButtons yashirin va boshqa hududlarda ko'rsatiladi. Ilova oynasining oʻlchamini oʻzgartirib koʻring
oynaning kengligi va balandligidan kelib chiqib, turli mintaqalarning o'lchamlari qanday o'zgarishini ko'ring. Keyinchalik murakkab uchun
maketlar, JPanels-dagi guruh komponentlari, ularning har biri alohida tartib menejeriga ega. JPanellarni joylashtiring
JFrame-da standart BorderLayout yoki boshqa tartib yordamida.

1 // 12.42-rasm: BorderLayoutDemo.java


2 // BorderLayoutFrame sinovi.
3 import javax.swing.JFrame;
4
5 umumiy sinf BorderLayoutDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 BorderLayoutFrame borderLayoutFrame = yangi BorderLayoutFrame();
10 borderLayoutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 borderLayoutFrame.setSize(300, 200);
12 borderLayoutFrame.setVisible(rost);
13 }
14 } // oxirgi sinf BorderLayoutDemo

12.42-rasm | BorderLayoutFrame sinovi.

gorizontal
bo'shliq

vertikal
bo'shliq


536 12-bob GUI komponentlari: 1-qism

12.18.3 GridLayout
GridLayout layout menejeri konteynerni tarmoqqa ajratadi, shunda komponentlar mumkin
qator va ustunlarga joylashtiriladi. Class GridLayout to'g'ridan-to'g'ri Object va sinfidan meros bo'lib o'tadi
LayoutManager interfeysini amalga oshiradi. GridLayout dagi har bir komponent bir xil xususiyatga ega
kengligi va balandligi. Komponentlar GridLayout ning yuqori chap katakchasidan boshlab qo'shiladi
panjara va qator to'lguncha chapdan o'ngga o'ting. Keyin jarayon chap tomonda davom etadi
to'rning keyingi qatorida o'ngga va hokazo. Shakllarning qo'llanilishi. 12.43–12.44 dem-
oltita JButton yordamida GridLayout layout menejerini ishga tushiradi.

1 // 12.43-rasm: GridLayoutFrame.java


2 // Oltita tugmani o'z ichiga olgan GridLayout.
3 import java.awt.GridLayout;
4 import java.awt.Container;
5 import java.awt.event.ActionListener;
6 import java.awt.event.ActionEvent;
7 import javax.swing.JFrame;
8 import javax.swing.JButton;
9
10 umumiy sinf GridLayoutFrame JFrame ActionListener dasturini kengaytiradi
11 {
12 ta shaxsiy yakuniy JButton [] tugmalari; // tugmalar majmuasi
13 ta xususiy statik yakuniy String[] nomlari =
14 { "bir", "ikki", "uch", "to'rt", "besh", "olti" };
15 xususiy mantiqiy o'zgartirish = rost; // ikkita tartib o'rtasida o'tish
16 ta xususiy yakuniy konteyner konteyneri; // ramka konteyneri
17
18
19
20 // argumentsiz konstruktor
21 umumiy GridLayoutFrame()
22 {
23 super("GridLayout Demo");
24
25
26 konteyner = getContentPane();
27
28 tugma = yangi JButton[names.length];
29
30 uchun (int count = 0; count < names.length; count++)
31 {
32 tugmalar[hisoblash] = yangi JButton(nomlar[hisoblash]);
33 tugma [hisoblash].addActionListener(bu); // tinglovchini ro'yxatdan o'tkazish
34
35 }
36 }
37
38 // maketlar o'rtasida almashish orqali tugma hodisalarini boshqaring
39 @Bekor qilish
40 ta ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
41 {

12.43-rasm | Oltita tugmani o'z ichiga olgan GridLayout. (2-qismning 1-qismi.)

xususiy yakuniy GridLayout gridLayout1; // birinchi gridlayout
xususiy yakuniy GridLayout gridLayout2; // ikkinchi panjara tartibi

gridLayout1 = yangi GridLayout(2, 3, 5, 5); // 2 dan 3 gacha; bo'shliqlar 5


gridLayout2 = yangi GridLayout(3, 2); // 3 dan 2 gacha; bo'shliqlar yo'q

setLayout (gridLayout1);

qo'shish (tugmalar [hisoblash]); // JFrame-ga tugma qo'shing

12.18 Layout menejerlariga kirish 537

24–25-qatorlar (12.43-rasm) ikkita GridLayout obyektini yaratadi. GridLayout kon-
24-satrda ishlatiladigan instruktor 2 satr, 3 ustun, 5 pikselli gorizontal chiziqli GridLayout-ni belgilaydi.
To'rdagi komponentlar orasidagi zonali bo'shliq va ular orasidagi vertikal bo'shliq 5 piksel
Griddagi komponentlar. 25-satrda ishlatiladigan GridLayout konstruktori GridLayout ni belgilaydi
standart bo'shliqdan (1 piksel) foydalanadigan 3 qator va 2 ustun bilan.
Ushbu misoldagi JButton ob'ektlari dastlab gridLayout1 yordamida tartibga solingan (
setLayout usuli bilan 27-qatordagi kontent paneli). Birinchi komponent ga qo'shiladi
birinchi qatorning birinchi ustuni. Keyingi komponent ikkinchi ustunga qo'shiladi
birinchi qator va boshqalar. JButton bosilganda, usul amalga oshiriladi (39–49-qatorlar)
deyiladi. Har bir harakatga chaqiruvPerformed tartibni gridLayout2 va o'rtasida almashtiradi
gridLayout1, keyingi o'rnatish tartibini aniqlash uchun mantiqiy o'zgaruvchini almashtirishdan foydalaning.
48-qatorda joylashuvi o'zgargan konteynerni qayta formatlashning yana bir usuli ko'rsatilgan.
Konteyner usulini tekshirish joriy oqim asosida konteyner tartibini qayta hisoblab chiqadi
Konteyner uchun tartib menejeri va ko'rsatilgan GUI komponentlarining joriy to'plami.

42 if (almashtirish) // almashtirish asosida tartibni o'rnating


43 container.setLayout(gridLayout2);
yana 44
45 container.setLayout(gridLayout1);
46
47 toggle = !toggle;
48
49 }
50 } // oxirgi sinf GridLayoutFrame

1 // 12.44-rasm: GridLayoutDemo.java


2 // GridLayoutFrame sinovi.
3 import javax.swing.JFrame;
4
5 umumiy sinf GridLayoutDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 GridLayoutFrame gridLayoutFrame = yangi GridLayoutFrame();
10 gridLayoutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 gridLayoutFrame.setSize(300, 200);
12 gridLayoutFrame.setVisible(to'g'ri);
13 }
14 } // oxirgi sinf GridLayoutDemo

12.44-rasm | GridLayoutFrame sinovi.

12.43-rasm | Oltita tugmani o'z ichiga olgan GridLayout. (2-qismning 2-qismi.)

container.validate(); // konteynerni qayta joylashtirish


538 12-bob GUI komponentlari: 1-qism

12.19 Murakkab maketlarni boshqarish uchun panellardan foydalanish
Murakkab GUI (masalan, 12.1-rasm) ko'pincha har bir komponentni aniq bir joyga joylashtirishni talab qiladi.
Manzil. Ular ko'pincha har bir panelning tarkibiy qismlari joylashtirilgan bir nechta panellardan iborat
muayyan tartib. JPanel klassi JComponent-ni kengaytiradi va JComponent Con-klassni kengaytiradi.
tainer, shuning uchun har bir JPanel konteynerdir. Shunday qilib, har bir JPanel tarkibiy qismlariga ega bo'lishi mumkin.
Boshqa panellarni o'z ichiga olgan holda, unga konteyner usuli qo'shilishi bilan biriktirilgan. ning qo'llanilishi
Anjir. 12.45–12.46 JPanel-dan qanday qilib murakkabroq qatlamni yaratish uchun foydalanish mumkinligini ko'rsatadi.
BorderLayout ning JANUY mintaqasida bir nechta JButtons joylashtirilgan.

1 // 12.45-rasm: PanelFrame.java


2 // Komponentlarni joylashtirishda yordam berish uchun JPanel-dan foydalanish.
3 import java.awt.GridLayout;
4 import java.awt.BorderLayout;
5 import javax.swing.JFrame;
6 import javax.swing.JPanel;
7 import javax.swing.JButton;
8
9 umumiy sinf PanelFrame JFrame-ni kengaytiradi
10 {
11
12 ta shaxsiy yakuniy JButton [] tugmalari;
13
14 // argumentsiz konstruktor
15 ommaviy PanelFrame()
16 {
17 super("Panel demo");
18 tugma = yangi JButton[5];
19
20
21
22 // tugmalar yaratish va qo'shish
23 uchun (int count = 0; count < buttons.length; count++)
24 {
25 tugma [hisoblash] = yangi JButton("Button" + (hisoblash + 1));
26
27 }
28
29
30 }
31 } // oxirgi sinf PanelFrame

12.45-rasm | JPanel JPanel ning JANUBI mintaqasiga biriktirilgan GridLayoutdagi beshta JButtonli


BorderLayout.

1 // 12.46-rasm: PanelDemo.java


2 // PanelFrame sinovi.
3 import javax.swing.JFrame;
4

12.46-rasm | PanelFrame sinovi. (2-qismning 1-qismi.)

xususiy yakuniy JPanel tugmasiJPanel; // tugmalarni ushlab turish paneli

buttonJPanel = new JPanel();


buttonJPanel.setLayout(yangi GridLayout(1, buttons.length));

buttonJPanel.add(tugmalar[hisoblash]); // panelga tugma qo'shish

qo'shish(buttonJPanel, BorderLayout.SOUTH); // JFrame-ga panel qo'shing

12.20 JTextArea 539

JPanel tugmasiJPanel e'lon qilingandan so'ng (12.45-rasmning 11-qatori) va yaratilgan (19-qator),
20-qator tugma JPanel tartibini bitta satr va beshta ustunli GridLayout ga o'rnatadi (u erda
massiv tugmalaridagi beshta JButtons). 23-27-qatorlar qatordagi JButtons-ni qatorga qo'shing
JPanel. 26-qator tugmalarni to'g'ridan-to'g'ri JPanel-ga qo'shadi - JPanel sinfida a mavjud emas
JFrame-dan farqli o'laroq, kontent paneli. 29-qator qo'shish uchun JFrame-ning standart BorderLayout-dan foydalanadi
JPanel tugmasini JANUB mintaqasiga bosing. JANUBI mintaqasi tugma ustidagi tugmachalar kabi baland.
JPanel. JPanel o'lchami uning tarkibidagi komponentlarga mos keladi. Ko'proq komponentlar qo'shilsa,
JPanel moslashish uchun o'sadi (uning tartib menejerining cheklovlariga ko'ra).
komponentlar. Tartib boshqaruvchisi o'lchamiga qanday ta'sir qilishini ko'rish uchun oyna hajmini o'zgartiring
J tugmalari.
12.20 JTextArea
JTextArea matnning bir nechta satrini boshqarish uchun maydonni taqdim etadi. JTextField sinfi kabi,
JTextArea - JTextComponent-ning kichik klassi bo'lib, u JText- uchun umumiy usullarni e'lon qiladi.
Fields, JTextAreas va boshqa matnga asoslangan GUI komponentlari.
Rasmdagi dastur. 12.47–12.48 JTextAreas-ni namoyish etadi. Bitta JTextArea displey-
foydalanuvchi tanlashi mumkin bo'lgan matnni o'ynaydi. Ikkinchisi foydalanuvchi tomonidan tahrirlanmaydi va ko'rsatish uchun ishlatiladi
birinchi JTextArea-da foydalanuvchi tanlagan matn. JTextFields-dan farqli o'laroq, JTextAreas bunday qilmaydi
harakat hodisalariga ega bo'ling - JTextArea matn terish paytida Enter tugmasini bosganingizda, kursor oddiygina
keyingi qatorga o'tadi. Ko'p tanlovli JListsda bo'lgani kabi (12.13-bo'lim), tashqi
boshqa GUI komponentidan olingan hodisa JTextAreadagi matnni qachon qayta ishlash kerakligini ko'rsatadi.
Masalan, elektron pochta xabarini yozayotganda siz odatda yuborish uchun Yuborish tugmasini bosasiz
qabul qiluvchiga xabar matni. Xuddi shunday, hujjatni Word pro-da tahrirlashda
cessor, siz odatda Saqlash yoki Saqlash… menyu bandini tanlash orqali faylni saqlaysiz. Bu pro-
gram, Nusxalash >>> tugmasi tanlangan matndan nusxa ko'chiradigan tashqi hodisani yaratadi
JTextArea-dan chapga va uni o'ng JTextArea-da ko'rsatadi.

5 ommaviy sinf PanelDemo JFrame-ni kengaytiradi


6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 PanelFrame panelFrame = yangi PanelFrame();
10 panelFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 panelFrame.setSize(450, 200);
12 panelFrame.setVisible(rost);
13 }
14 } // oxirgi sinf PanelDemo

12.46-rasm | PanelFrame sinovi. (2-qismning 2-qismi.)


540 12-bob GUI komponentlari: 1-qism

Konstruktorda (18–48-qatorlar) 21-satr Box konteynerini (paket) yaratadi
javax.swing) GUI komponentlarini tartibga solish uchun. Box - bu konteynerning kichik klassi

1 // 12.47-rasm: TextAreaFrame.java


2 // Tanlangan matnni bir JText maydonidan boshqasiga nusxalash.
3 import java.awt.event.ActionListener;
4 import java.awt.event.ActionEvent;
5 import javax.swing.Box;
6 import javax.swing.JFrame;
7
8 import javax.swing.JButton;
9
10
11 ochiq sinf TextAreaFrame JFrame-ni kengaytiradi
12 {
13
14
15 xususiy yakuniy JButton copyJButton; // matndan nusxa olishni boshlaydi
16
17 // argumentsiz konstruktor
18 umumiy TextAreaFrame()
19 {
20 super("TextArea demo");
21
22 String demo = "Bu\n uchun demo string" +
23 "matnni\nbitta matn maydonidan \nga nusxa ko'chirishni ko'rsating" +
24 "tashqi hodisadan foydalanadigan boshqa matn maydoni\n";
25
26
27
28
29 copyJButton = yangi JButton("Nusxalash >>>"); // nusxa yaratish tugmasi
30
31 copyJButton.addActionListener(
32 ta yangi ActionListener() // anonim ichki sinf
33 {
34 // textArea2 dagi matnni textArea1 dan tanlangan matnga o'rnating
35 @Bekor qilish
36 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
37 {
38
39 }
40 }
41);
42
43
44
45
46
47 qo'shish (quti); // ramkaga quti qo'shish
48 }
49 } // oxirgi sinf TextAreaFrame

12.47-rasm | Tanlangan matnni bir JTextArea dan boshqasiga nusxalash.

import javax.swing.JTextArea;

import javax.swing.JScrollPane;

xususiy yakuniy JTextArea textArea1; // demo qatorni ko'rsatadi
xususiy yakuniy JTextArea textArea2; // ajratilgan matn shu yerga ko'chiriladi

Box box = Box.createHorizontalBox(); // quti yaratish

textArea1 = yangi JTextArea(demo, 10, 15);
box.add(yangi JScrollPane(textArea1)); // aylantirish paneli qo'shing

box.add(copyJButton); // qutiga nusxa ko'chirish tugmasini qo'shing

textArea2.setText(textArea1.getSelectedText());

textArea2 = yangi JTextArea(10, 15);


textArea2.setEditable(noto'g'ri);
box.add(yangi JScrollPane(textArea2)); // aylantirish paneli qo'shing

12.20 JTextArea 541

GUI aloqasini tartibga solish uchun BoxLayout layout menejeri (22.9-bo'limda batafsil muhokama qilingan)
gorizontal yoki vertikal ponentlar. Box ning statik usuli createHorizontalBox cre-
Komponentlarni biriktirilgan tartibda chapdan o'ngga joylashtiradigan quti.
26 va 43 qatorlar JTextAreas textArea1 va textArea2 ni yaratadi. 26-qator JText-dan foydalanadi
Dastlabki matnni ifodalovchi Stringni oladigan hududning uchta argumentli konstruktori va
JTextArea 10 satr va 15 ustunga ega ekanligini ko'rsatadigan ikkita ints. 43-qator JText-dan foydalanadi
JTextArea ning 10 qator va 15 ta ustunga ega ekanligini ko'rsatuvchi maydonning ikki argumentli konstruktori.
umns. 26-qator demo standart JTextArea mazmuni sifatida ko'rsatilishi kerakligini bildiradi.
JTextArea o'zining to'liq tarkibini ko'rsatolmasa, aylantirish panellarini ta'minlamaydi. Shunday qilib, chiziq
27 JScrollPane obyektini yaratadi, uni textArea1 bilan ishga tushiradi va konteynerga biriktiradi.
quti. Odatiy bo'lib, JScrollPane'da kerak bo'lganda gorizontal va vertikal aylantirish panellari paydo bo'ladi.
29–41 qatorlar JButton obyekt copyJButton "Nusxalash >>>" yorlig'ini yaratadi, nusxasini qo'shing
JButtonni konteyner qutisiga o'tkazing va copyJButton's ActionEvent uchun hodisa ishlov beruvchisini ro'yxatdan o'tkazing.
Ushbu tugma dastur qachon nusxa ko'chirish kerakligini aniqlaydigan tashqi hodisani ta'minlaydi
textArea1 da tanlangan matnni textArea2 ga. Foydalanuvchi copyJButton tugmasini bosganida, 38-qator
in actionPerformed getSelectedText usulini bildiradi (JTextArea ga meros qilib olingan
JTextComponent dan) tanlangan matnni textArea1 dan qaytarishi kerak. Foydalanuvchi tanlaydi
sichqonchani kerakli matn ustiga surish orqali matnni ajratib ko‘rsatish. SetText usulini o'zgartirish
textArea2 dagi matn getSelectedText tomonidan qaytarilgan satrga.
43-45 qatorlar textArea2 ni yaratadi, uning tahrirlanadigan xususiyatini false ga o'rnatadi va uni con-ga qo'shadi.
taymer qutisi. 47-qator JFrame-ga quti qo'shadi. 12.18.2 bo'limidan sukut bo'lganligini eslang
JFrame sxemasi BorderLayout bo'lib, qo'shish usuli sukut bo'yicha o'z argumentlarini biriktiradi.
BorderLayout ning MARKAZI ga.

1 // 12.48-rasm: TextAreaDemo.java


2 // TextAreaFrame sinovi.
3 import javax.swing.JFrame;
4
5 ommaviy sinf TextAreaDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 TextAreaFrame textAreaFrame = new TextAreaFrame();
10 textAreaFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 textAreaFrame.setSize(425, 200);
12 textAreaFrame.setVisible(rost);
13 }
14 } // oxirgi sinf TextAreaDemo

12.48-rasm | TextAreaFrame sinovi.


542 12-bob GUI komponentlari: 1-qism

Matn JTextArea ning o'ng chetiga yetganda, matn keyingi qatorga o'tishi mumkin.
Bu chiziqni o'rash deb ataladi. Odatiy bo'lib, JTextArea chiziqlarni o'ramaydi.

JScrollPane Scrollbar siyosatlari


Ushbu misol JTextArea uchun aylantirishni ta'minlash uchun JScrollPane-dan foydalanadi. Avvalboshdan,
JScrollPane faqat kerak bo'lganda aylantirish panellarini ko'rsatadi. Siz gorizontal va ver-
JScrollPane yaratilganda uning o'tish paneli siyosati. Agar dasturda havola bo'lsa
JScrollPane uchun dastur JScrollPane usullaridan foydalanishi mumkin setHorizontal-
ScrollBarPolicy va setVerticalScrollBarPolicy quyidagi sahifadagi aylantirish paneli siyosatlarini o'zgartirish uchun.
istalgan vaqtda. JScrollPane sinfi doimiylarni e'lon qiladi

aylantirish paneli doimo paydo bo'lishi kerakligini ko'rsatish uchun, doimiylar

aylantirish paneli faqat kerak bo'lganda (standartlar) va doimiylar paydo bo'lishi kerakligini ko'rsatish uchun

aylantirish paneli hech qachon paydo bo'lmasligini ko'rsatish uchun. Gorizontal aylantirish paneli siyosati o'rnatilgan bo'lsa


JScrollPane.HORIZONTAL_SCROLLBAR_NEVER, JScrollPane-ga biriktirilgan JTextArea
chiziqlarni avtomatik ravishda o'rab oladi.

12.21 Yakunlash


Ushbu bobda siz ko'plab GUI komponentlarini va ularning hodisalarini qanday boshqarishni o'rgandingiz. Siz
ichki sinflar, ichki sinflar va anonim ichki sinflar haqida ham bilib oldi. Siz ko'rdingiz
ichki sinf ob'ekti va uning yuqori darajadagi ob'ekti o'rtasidagi maxsus munosabatlar. Siz
foydalanuvchidan matn kiritish uchun JOptionPane dialoglaridan qanday foydalanishni va qanday qilishni o‘rgandi
foydalanuvchiga xabarlarni ko'rsatish. Siz ham bajariladigan ilovalarni yaratishni o'rgandingiz
o'z derazalari. Biz JFrame sinfini va foydalanuvchiga kirish imkonini beruvchi komponentlarni muhokama qildik.
ilova bilan ishlash. Shuningdek, biz sizga matn va tasvirlarni foydalanuvchiga qanday ko'rsatishni ko'rsatdik.
Siz foydalanadigan maxsus chizma maydonlarini yaratish uchun JPanels-ni qanday sozlashni o'rgandingiz
keyingi bobda keng. Siz oynada komponentlarni qanday tashkil qilishni ko'rdingiz
tartib menejerlari va tartibga solish uchun JPanels yordamida yanada murakkab GUI-larni qanday yaratish
komponentlar. Nihoyat, siz JTextArea komponenti haqida bilib oldingiz, unda foydalanuvchi mumkin
matn kiriting va ilova matnni ko'rsatishi mumkin. 22-bobda siz ko'proq reklama haqida bilib olasiz.
slayderlar, menyular va yanada murakkab tartib menejerlari kabi rivojlangan GUI komponentlari. In
keyingi bobda siz GUI ilovangizga qanday grafik qo'shishni o'rganasiz. Grafika ruxsat beradi
siz shakllar va matnlarni ranglar va uslublar bilan chizishingiz mumkin.

Ko'rish va his qilish kuzatuvi 12.19


JTextArea uchun satrlarni o'rash funksiyasini ta'minlash uchun JTextArea usullari to'plamini chaqiring -
Haqiqiy argument bilan LineWrap.

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS


JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS

JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED


JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED

JScrollPane.VERTICAL_SCROLLBAR_NEVER


JScrollPane.HORIZONTAL_SCROLLBAR_HECH QACHON

Xulosa 543



Xulosa
12.1-bo'lim Kirish
• Grafik foydalanuvchi interfeysi (GUI; 474-bet) foydalanuvchi bilan o'zaro ishlash uchun qulay mexanizmni taqdim etadi.
ilova. GUI ilovaga o'ziga xos ko'rinish va tuyg'u beradi (474-bet).
• Turli ilovalarni izchil, intuitiv foydalanuvchi interfeysi komponentlari bilan ta'minlash foydalanuvchilarga beradi
yangi dastur bilan tanishish hissi, ular uni tezroq o'rganishlari uchun.
• GUIlar GUI komponentlaridan (474-bet) qurilgan — baʼzan boshqaruv elementlari yoki vidjetlar deb ataladi.
12.2-bo'lim Java-ning Nimbus Look-and-Feel
• Java SE 6 10 yangilanishidan boshlab Java yangi, oqlangan, platformalararo koʻrinish va hissiyot bilan birga keladi.
Nimbus nomi bilan mashhur (476-bet).
• Nimbusni barcha Java ilovalari uchun sukut bo'yicha o'rnatish uchun, ichida swing.properties matn faylini yarating
JDK va JRE o'rnatish papkalaringizning lib papkasida. Faylga quyidagi kod qatorini joylashtiring:
swing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
• Nimbus-ni har bir ilova asosida tanlash uchun quyidagi buyruq qatorini joylashtiring:
dasturni ishga tushirganda java buyrug'idan keyin va dastur nomidan oldin gument:
-Dswing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
12.3-bo'lim JOptionPane bilan oddiy GUI-ga asoslangan kirish/chiqish
• Aksariyat ilovalar foydalanuvchi bilan muloqot qilish uchun oynalar yoki dialog oynalaridan (476-bet) foydalanadi.
• javax.swing paketining JOptionPane (476-bet) klassi (474-bet) oldindan tuzilgan dialog oynalarini taqdim etadi.
ham kirish, ham chiqish. JOptionPane statik usuli showInputDialog (477-bet) kirishni ko‘rsatadi
dialog oynasi (476-bet).
• Soʻrov odatda jumla uslubidagi bosh harflardan foydalanadi — birinchi harfning faqat birinchi harfini bosh harf bilan yozadi
matndagi so'z, agar so'z o'ziga xos ot bo'lmasa.
• Kirish dialogi faqat kirish satrlarini kiritishi mumkin. Bu ko'pchilik GUI komponentlariga xosdir.
• JOptionPane statik usuli showMessageDialog (478-bet) xabarlar dialogini ko‘rsatadi (476-bet).
12.4-bo'lim Swing komponentlarini ko'rib chiqish
• Aksariyat Swing GUI komponentlari (474-bet) javax.swing paketida joylashgan.
• Birgalikda tashqi ko'rinish va foydalanuvchining ilova bilan o'zaro munosabati ma'lum
bu ilovaning ko'rinishi va hissi sifatida. Swing GUI komponentlari bir xil ko'rinishni belgilashga imkon beradi.
and-feel ilovangiz uchun barcha platformalarda yoki har bir platformaning shaxsiy koʻrinishidan foydalaning.
• Yengil Swing komponentlari quyida qo‘llab-quvvatlanadigan haqiqiy GUI komponentlariga bog‘lanmagan.
ilova bajariladigan yotgan platforma.
• Bir nechta Swing komponentlari to‘g‘ridan-to‘g‘ri o‘zaro ta’sirni talab qiluvchi og‘ir vaznli komponentlardir (480-bet).
mahalliy oyna tizimi bilan (480-bet), bu ularning tashqi ko'rinishi va funksionalligini cheklashi mumkin.
• java.awt paketining sinf komponenti (480-bet) ko'plab atributlar va xatti-harakatlarni e'lon qiladi.
mon java.awt (479-bet) va javax.swing paketlaridagi GUI komponentlariga.
• java.awt paketining Container klassi (480-bet) Komponentning quyi sinfidir. Komponentlar biriktirilgan
Komponentlarni tartibga solish va ekranda ko'rsatish uchun konteynerlarga.
• javax.swing paketining JComponent klassi (480-bet) Konteynerning quyi sinfidir. JComponent - bu
barcha engil Swing komponentlarini o'z ichiga oladi va ularning umumiy atributlari va xatti-harakatlarini e'lon qiladi.
• JComponentning baʼzi umumiy funksiyalari orasida ulanadigan koʻrinish va tuygʻu (480-bet), yorliq tugmalari mavjud.
mnemonika (480-bet), asboblar bo‘yicha maslahatlar (480-bet), yordamchi texnologiyalarni qo‘llab-quvvatlash va
foydalanuvchi interfeysi lokalizatsiyasi (480-bet).

544 12-bob GUI komponentlari: 1-qism



12.5-bo'lim Matn va tasvirlarni oynada ko'rsatish
• JFrame klassi oynaning asosiy atributlari va xatti-harakatlarini taqdim etadi.
• JLabel (481-bet) faqat o‘qish uchun mo‘ljallangan matn, rasm yoki ikkala matn va tasvirni ko‘rsatadi. JLabel-dagi matn
odatda jumla uslubidagi bosh harflardan foydalanadi.
• Har bir GUI komponenti JFrame bilan yaratilgan oyna kabi konteynerga biriktirilishi kerak
(483-bet).
• Ko'pgina IDElar GUI dizayn vositalarini (529-bet) taqdim etadi, unda siz aniq o'lcham va joylashuvni belgilashingiz mumkin.
sichqoncha yordamida komponentni tanlash; keyin IDE siz uchun GUI kodini yaratadi.
• JComponent usuli setToolTipText (483-bet) foydalanuvchi tomonidan ko'rsatiladigan asbob maslahatini belgilaydi.
sichqoncha kursorini engil komponent ustiga qo'yadi (480-bet).
• Konteyner usuli qo‘shimchasi GUI komponentini konteynerga biriktiradi.
• Class ImageIcon (484-bet) GIF, PNG va JPEG kabi bir nechta tasvir formatlarini qo'llab-quvvatlaydi.
• Ob'ekt sinfining getClass usuli (484-bet) Sinf ob'ektiga havolani oladi.
usul chaqiriladigan ob'ekt uchun sinf deklaratsiyasi.
• GetResource sinf usuli (484-bet) o'z argumentining manzilini URL sifatida qaytaradi. Usul
getResource resurs joylashuvini aniqlash uchun Class obyektining sinf yuklagichidan foydalanadi.
• JLabelning gorizontal va vertikal tekislashlari setHorizontal- usullari bilan o'rnatilishi mumkin.
Mos ravishda Alignment (484-bet) va setVerticalAlignment (484-bet).
• JLabel usullari setText (484-bet) va getText (484-bet) yorliqda ko'rsatilgan matnni o'rnatadi va oladi.
• JLabel usullari setIcon (484-bet) va getIcon (484-bet) yorliqdagi Belgini (484-bet) o‘rnating va oling.
• JLabel usullari setHorizontalTextPosition (484-bet) va setVerticalTextPosition (484-bet)
yorliqdagi matn o'rnini belgilang.
• JFrame usuli setDefaultCloseOperation (485-bet) JFrame.EXIT_ON_CLOSE doimiysi sifatida
argument foydalanuvchi tomonidan oyna yopilganda dastur tugashi kerakligini bildiradi.
• Komponent usuli setSize (485-bet) komponentning kengligi va balandligini belgilaydi.
• True argumenti bilan setVisible komponent usuli (485-bet) ekranda JFrame-ni ko'rsatadi.
12.6-bo'lim Matn maydonlari va ichki o'rnatilgan sinflar bilan hodisalarni boshqarishga kirish
• GUI hodisalarga asoslangan — foydalanuvchi GUI komponenti, hodisalar (485-bet) drayveri bilan o‘zaro aloqada bo‘lganda.
vazifalarni bajarish uchun dastur.
• Hodisa ishlov beruvchisi (485-bet) hodisaga javoban vazifani bajaradi.
• JTextField klassi (485-bet) javax.swing.text paketining JTextComponent (485-bet) ni kengaytiradi,
umumiy matnga asoslangan komponent xususiyatlarini ta'minlaydi. JPasswordField klassi (485-bet) kengaytiriladi
JTextField va parollarni qayta ishlashga xos bo'lgan bir nechta usullarni qo'shadi.
• JPasswordField (485-bet) belgilar foydalanuvchi kiritayotganda yozilayotganligini ko‘rsatadi, lekin
aks-sado belgilari bilan haqiqiy belgilarni yashiradi (485-bet).
• Foydalanuvchi komponentni bosganida komponent fokusni oladi (486-bet).
• JTextComponent usuli setEditable (488-bet) matn maydonini tahrir qilib bo'lmaydigan qilish uchun ishlatilishi mumkin.
• Muayyan GUI komponenti uchun hodisaga javob berish uchun siz ifodalovchi sinf yaratishingiz kerak
hodisani qayta ishlovchi va tegishli hodisa tinglovchi interfeysini amalga oshiradi (488-bet), keyin ro'yxatdan o'ting
hodisalarni qayta ishlash sinfining ob'ekti voqea ishlovchisi sifatida (488-bet).
• Statik bo'lmagan ichki sinflar (488-bet) ichki sinflar deb ataladi va ko'pincha hodisalarni boshqarish uchun ishlatiladi.
• Statik bo'lmagan ichki sinf ob'ekti (488-bet) yuqori darajadagi sinf ob'ekti tomonidan yaratilishi kerak.
(488-bet) ichki sinfni o'z ichiga oladi.

Xulosa 545



• Ichki sinf ob'ekti o'zining yuqori darajali sinfining misol o'zgaruvchilari va usullariga bevosita kirishi mumkin.
• Statik bo‘lgan ichki o‘rnatilgan sinf o‘zining yuqori darajali klassi ob’ektini talab qilmaydi va bilvosita talab qilmaydi
yuqori darajadagi sinf ob'ektiga havolaga ega.
• JTextField yoki JPasswordField da Enter tugmasini bosish ActionEvent (p. 489) hosil qiladi.
java.awt.event paketining ActionListener (489-bet) tomonidan boshqariladi.
• JTextField usuli addActionListener (489-bet) matn maydoni uchun hodisa ishlov beruvchisini qayd qiladi.
ActionEvent.
• Foydalanuvchi bilan muloqot qiladigan GUI komponenti voqea manbai hisoblanadi (490-bet).
• ActionEvent obyekti hozirgina sodir bo'lgan voqea haqidagi ma'lumotlarni o'z ichiga oladi, masalan, voqea
manba va matn maydonidagi matn.
• ActionEvent usuli getSource hodisa manbasiga havolani qaytaradi. ActionEvent usuli
getActionCommand (490-bet) foydalanuvchi matn maydoniga kiritgan matnni yoki JButtondagi yorliqni qaytaradi.
• JPasswordField getPassword usuli (490-bet) foydalanuvchi kiritgan parolni qaytaradi.
12.7-bo'lim Umumiy GUI hodisa turlari va tinglovchi interfeyslari
• Har bir hodisa-obyekt turi odatda bitta yoki ni belgilaydigan tegishli hodisa-tinglovchi interfeysiga ega
interfeysni amalga oshiradigan sinfda e'lon qilinishi kerak bo'lgan hodisalarni boshqarish usullari.
12.8-bo'lim Voqealarni boshqarish qanday ishlaydi
• Voqea sodir bo'lganda, foydalanuvchi o'zaro aloqada bo'lgan GUI komponenti ro'yxatdan o'tganligi haqida xabar beradi
tinglovchilarni har bir tinglovchining tegishli hodisani boshqarish usulini chaqirish orqali.
• Har bir GUI komponenti bir nechta hodisa turlarini qo'llab-quvvatlaydi. Voqea sodir bo'lganda, voqea buziladi
yamoqlangan (494-bet) faqat tegishli turdagi hodisa tinglovchilariga.
12.9-bo'lim JButton
• Tugma – foydalanuvchi harakatni boshlash uchun bosadigan komponent. Barcha tugma turlari pastki sinflardir
AbstractButton (495-bet; javax.swing paketi). Tugma yorliqlari (495-bet) odatda kitob nomidan foydalanadi
bosh harf bilan yozish (495-bet).
• Buyruq tugmalari (495-bet) JButton klassi bilan yaratilgan.
• JButton Belgini ko'rsatishi mumkin. JButtonda aylanma piktogramma ham bo'lishi mumkin (497-bet) — bu belgi
foydalanuvchi sichqonchani tugma ustiga qo'yganda ko'rsatiladi.
• AbstractButton klassidagi RolloverIcon (498-bet) metodi ekranda ko'rsatilgan tasvirni belgilaydi.
foydalanuvchi sichqonchani uning ustiga qo'yganda tugma.
12.10-bo'lim Holatni saqlaydigan tugmalar
• Swing holati tugmalarining uchta turi mavjud — JToggleButton (498-bet), JCheckBox (p. 498) va
JRadioButton (498-bet).
• JCheckBox va JRadioButton sinflari JToggleButtonning quyi sinflaridir.
• setFont komponent usuli (500-bet) komponent shriftini yangi Shrift obyektiga (500-bet) o‘rnatadi.
java.awt paketi.
• JCheckBox-ni bosish ItemListener tomonidan boshqarilishi mumkin bo'lgan ItemEvent (501-bet) paydo bo'lishiga olib keladi.
(501-bet) itemStateChanged usulini belgilaydi (501-bet). addItemListener registrlari usuli
JCheckBox yoki JRadioButton obyektining ItemEvent tinglovchisi.
• JCheckBox usuli isSelected JCheckBox tanlangan yoki yo'qligini aniqlaydi.
• JRadioButtons ikkita holatga ega - tanlangan va tanlanmagan. Odatda radio tugmalari (495-bet)
nok bir vaqtning o'zida faqat bitta tugmani tanlash mumkin bo'lgan guruh sifatida (501-bet).

546 12-bob GUI komponentlari: 1-qism



• JRadioButtons bir-birini istisno qiluvchi variantlarni ifodalash uchun ishlatiladi (501-bet).
• JRadioButtons orasidagi mantiqiy munosabat ButtonGroup obyekti tomonidan saqlanadi (501-bet).
• ButtonGroup usuli qo‘shish (504-bet) har bir JRadioButton tugmachasini ButtonGroup bilan bog‘laydi. Agar ko'proq bo'lsa
guruhga bir nechta tanlangan JRadioButton ob'ekti qo'shiladi, birinchi qo'shilgan tanlangan
GUI ko'rsatilganda tanlanadi.
• JRadioButtons bosilganda ItemEvents hosil qiladi.
12.11 JComboBox bo'limi; Voqealarni boshqarish uchun anonim ichki sinfdan foydalanish
• JComboBox (504-bet) foydalanuvchi bitta tanlashi mumkin bo'lgan elementlar ro'yxatini taqdim etadi.
JComboBoxes ItemEvents yaratadi.
• JComboBox-dagi har bir element indeksga ega (507-bet). JComboBox-ga qo'shilgan birinchi element shunday ko'rinadi
JComboBox ko'rsatilganda joriy tanlangan element.
• JComboBox usuli setMaximumRowCount (507-bet) elementlarning maksimal sonini belgilaydi.
foydalanuvchi JComboBox-ni bosganida ko'rsatiladi.
• Anonim ichki sinf (507-bet) nomsiz sinf bo‘lib, odatda meth-
od deklaratsiyasi. Anonim ichki sinfning bitta ob'ekti sinf o'chirilganda yaratilishi kerak.
aniqlandi.
• JComboBox getSelectedIndex usuli (508-bet) tanlangan element indeksini qaytaradi.
12.12 JList bo'limi
• JList foydalanuvchi bir yoki bir nechta elementlarni tanlashi mumkin bo'lgan bir qator elementlarni ko'rsatadi. JList sinfi
bitta tanlovli ro'yxatlarni (508-bet) va ko'p tanlovli ro'yxatlarni qo'llab-quvvatlaydi.
• Foydalanuvchi JListdagi elementni bosganida, ListSelectionEvent (508-bet) paydo bo'ladi. JList usuli
addListSelectionListener (510-bet) JList uchun ListSelectionListener (510-bet)ni qayd qiladi.
tanlov voqealari. javax.swing.event (492-bet) paketining ListSelectionListener dasturi quyidagilarni bajarishi kerak:
ment usuli qiymati o'zgartirildi.
• JList usuli setVisibleRowCount (510-bet) ro‘yxatdagi ko‘rinadigan elementlar sonini belgilaydi.
• JList usuli setSelectionMode (510-bet) ro‘yxatni tanlash rejimini belgilaydi.
• JScrollPane (510-bet) ga JListni aylantirish paneli bilan ta'minlash uchun JList biriktirilishi mumkin.
• JFrame usuli getContentPane (510-bet) JFrame-ning kontent paneliga havolani qaytaradi.
GUI komponentlari ko'rsatiladi.
• JList usuli getSelectedIndex (511-bet) tanlangan element indeksini qaytaradi.
12.13-bo'lim Ko'p tanlovli ro'yxatlar
• Ko'p tanlovli ro'yxat (511-bet) foydalanuvchiga JList-dan ko'plab elementlarni tanlash imkonini beradi.
• JList usuli setFixedCellWidth (513-bet) JList kengligini o'rnatadi. SetFixedCellHeight usuli
(513-bet) JListdagi har bir elementning balandligini o'rnatadi.
• Odatda, boshqa GUI komponenti (masalan, JButton) tomonidan yaratilgan tashqi hodisa (513-bet)
JListdagi bir nechta tanlovlar qachon qayta ishlanishi kerakligini bildiradi.
• JList usuli setListData (513-bet) JListda ko'rsatilgan elementlarni o'rnatadi. JList usuli getSe-
lectedValues (513-bet) JListdagi tanlangan elementlarni ifodalovchi Ob'ektlar massivini qaytaradi.
12.14-bo'lim Sichqoncha hodisalarini boshqarish
• MouseListener (513-bet) va MouseMotionListener (513-bet) hodisalarni tinglovchi interfeyslari
sichqoncha hodisalarini boshqarish uchun ishlatiladi (513-bet). Sichqoncha hodisalari har qanday GUI komponenti uchun tuzoqqa tushishi mumkin
Komponentni kengaytiradi.

Xulosa 547



• javax.swing.event paketining MouseInputListener interfeysi (513-bet) interfeyslarni kengaytiradi
MouseListener va MouseMotionListener ularning barcha usullarini o'z ichiga olgan yagona interfeys yaratish uchun.
• Har bir sichqoncha hodisasini boshqarish usuli ma'lumotlarni o'z ichiga olgan MouseEvent ob'ektini (494-bet) oladi.
voqea haqida ma'lumot, shu jumladan voqea sodir bo'lgan x va y koordinatalari. Koordinator-
Nates hodisa sodir bo'lgan GUI komponentining yuqori chap burchagidan o'lchanadi
sodir bo'ldi.
• InputEvent sinfining usullari va konstantalari (514-bet; MouseEventning superklassi) ilovalarni faollashtiradi.
foydalanuvchi sichqonchaning qaysi tugmachasini bosganini aniqlash uchun plikatsiya.
• MouseWheelListener interfeysi (515-bet) ilovalarga sichqoncha g‘ildiragi hodisalariga javob berish imkonini beradi.
12.15-bo'lim Adapter sinflari
• Adapter klassi (518-bet) interfeysni amalga oshiradi va uning standart ilovalarini ta'minlaydi
usullari. Adapter sinfini kengaytirganingizda, faqat kerakli usul(lar)ni bekor qilishingiz mumkin.
• MouseEvent usuli getClickCount (521-bet) ketma-ket sichqoncha tugmalari sonini qaytaradi
bosish. isMetaDown (528-bet) va isAltDown (521-bet) usullari qaysi tugma bosilganligini aniqlaydi.
Sichqoncha bilan chizish uchun 12.16 JPanel kichik sinfi
• JComponents usuli paintComponent (522-bet) engil Swing komponenti bo'lganda chaqiriladi.
ko'rsatilgan. Java-ning grafik imkoniyatlaridan foydalangan holda shakllarni qanday chizishni belgilash uchun ushbu usulni bekor qiling.
• PaintComponent-ni bekor qilganda, tanadagi birinchi bayonot sifatida superklass versiyasini chaqiring.
• JComponentning quyi sinflari shaffoflikni qo'llab-quvvatlaydi. Agar komponent shaffof bo'lmasa (522-bet), bo'yash-
Komponent ko'rsatilishidan oldin komponent uning fonini tozalaydi.
• Swing engil komponentining shaffofligi setOpaque usuli bilan o'rnatilishi mumkin (522-bet;
noto'g'ri argument komponentning shaffofligini ko'rsatadi).
• Class Point (523-bet) java.awt paketi xy koordinatasini ifodalaydi.
• Chizish uchun Class Graphics (523-bet) ishlatiladi.
• GetPoint (524-bet) MouseEvent usuli sichqoncha hodisasi sodir bo'lgan nuqtani oladi.
• Component sinfidan bilvosita meros qilib olingan qayta bo'yash usuli (524-bet) komponentni ko'rsatadi.
imkon qadar tezroq ekranda yangilanishi kerak.
• paintComponent usuli Grafik parametrini oladi va a
engil komponent ekranda ko'rsatilishi kerak.
• FillOval grafik usuli (524-bet) qattiq oval chizadi. Birinchi ikkita argument yuqori chap
xy chegaralovchi qutining koordinatasi va oxirgi ikkitasi chegaralovchi qutining kengligi va balandligi.
12.17-bo'lim Asosiy hodisalarni boshqarish
• KeyListener interfeysi (494-bet) tugmalar bosilganda hosil bo'ladigan asosiy hodisalarni (494-bet) boshqarish uchun ishlatiladi.
klaviaturada bosiladi va qo'yib yuboriladi. Component sinfining addKeyListener usuli (525-bet)
KeyListenerni ro'yxatdan o'tkazadi.
• KeyEvent (494-bet) getKeyCode usuli (528-bet) bosilgan tugmaning virtual kalit kodini (528-bet) oladi.
kalit. KeyEvent sinfi klaviaturadagi har bir tugmani ifodalovchi virtual kalit-kod konstantalarini o'z ichiga oladi.
• KeyEvent usuli getKeyText (528-bet) bosilgan tugma nomini o'z ichiga olgan qatorni qaytaradi.
• KeyEvent usuli getKeyChar (528-bet) kiritilgan belgining Unicode qiymatini oladi.
• KeyEvent usuli isActionKey (528-bet) voqeadagi kalit harakat ekanligini aniqlaydi.
kalit (525-bet).
• getModifiers InputEvent usuli (528-bet) har qanday modifikator tugmalari (masalan, Shift,
Asosiy hodisa sodir bo'lganda Alt va Ctrl) bosilgan.

548 12-bob GUI komponentlari: 1-qism



• KeyEvent usuli getKeyModifiersText (528-bet) bosilgan modifikatorni o'z ichiga olgan qatorni qaytaradi.
er kalitlari.
12.18-bo'lim Layout menejerlariga kirish
• Layout menejerlari (528-bet) taqdimot maqsadlarida GUI komponentlarini konteynerga joylashtiradilar.
• Barcha maket menejerlari java.awt paketining LayoutManager (528-bet) interfeysini amalga oshiradilar.
• SetLayout konteyner usuli konteyner tartibini belgilaydi.
• FlowLayout komponentlarni konteynerga qo‘shilish tartibida chapdan o‘ngga joylashtiradi.
Idishning chetiga yetganda, komponentlar keyingi qatorda ko'rishda davom etadi. FlowLayout
GUI komponentlarini chapga, markazga (standart) va o'ngga tekislash imkonini beradi.
• FlowLayout usuli setAlignment (532-bet) FlowLayout uchun tekislashni o'zgartiradi.
• JFrame uchun standart boʻlgan BorderLayout (532-bet) komponentlarni beshta hududga ajratadi: NORTH,
JANUB, SARQ, G'ARB va MARKAZ. NORTH konteynerning yuqori qismiga to'g'ri keladi.
• BorderLayout konteynerni ko'pi bilan beshta komponentdan iborat bo'lishi bilan cheklaydi - har bir mintaqada bittadan.
• GridLayout (536-bet) konteynerni qatorlar va ustunlar panjarasiga ajratadi.
• Konteyner usulini tekshirish (537-bet) joriy joylashtirish asosida konteyner tartibini qayta hisoblab chiqadi.
Konteyner uchun boshqaruvchi va ko'rsatilgan GUI komponentlarining joriy to'plami.
12.19-bo'lim Murakkab sxemalarni boshqarish uchun panellardan foydalanish
• Murakkab grafik interfeyslar ko'pincha turli tartiblarga ega bo'lgan bir nechta panellardan iborat. Har bir JPanel bo'lishi mumkin
Komponentlar, shu jumladan boshqa panellar, konteyner usuli bilan biriktirilgan.
12.20 JTextArea bo'limi
• JTextArea (539-bet) — JTextComponentning quyi klassi — bir nechta satrli matnni o'z ichiga olishi mumkin.
• Class Box (540-bet) - konteynerning quyi sinfi bo‘lib, u BoxLayout layout menejeridan (541-bet) foydalanadi.
GUI komponentlarini gorizontal yoki vertikal ravishda tartibga soling.
• Box statik usuli createHorizontalBox (541-bet) quyidagidan komponentlarni tartibga soluvchi Box yaratadi.
ular biriktirilgan tartibda chapdan o'ngga.
• getSelectedText usuli (541-bet) JTextArea dan tanlangan matnni qaytaradi.
• JScrollPane oʻzgartirilganda uning gorizontal va vertikal aylantirish paneli siyosatlarini (542-bet) oʻrnatishingiz mumkin.
tuzilgan. JScrollPane usullari setHorizontalScrollBarPolicy (542-bet) va setVertical-
ScrollBarPolicy (542-bet) istalgan vaqtda aylantirish paneli siyosatlarini o'zgartirish uchun ishlatilishi mumkin.
O'z-o'zini tekshirish mashqlari
12.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Usul sichqonchani hech qanday tugma bosilmagan holda harakatlantirilganda chaqiriladi va an
voqea tinglovchisi hodisani boshqarish uchun ro'yxatdan o'tgan.
b) Foydalanuvchi tomonidan o'zgartirib bo'lmaydigan matn matn deyiladi.
c) A(n) GUI komponentlarini konteynerda joylashtiradi.
d) GUI komponentlarini biriktirish uchun qo'shish usuli sinf usuli hisoblanadi.
e) GUI - bu qisqartma.
f) Metod konteyner uchun joylashish menejerini belgilash uchun ishlatiladi.
g) mouseDragged usuli chaqiruvi oldidan (n) usul chaqiruvi va undan keyin keladi
a(n) usul chaqiruvi.
h) Sinfda xabarlar va kiritish dialoglarini aks ettiruvchi usullar mavjud.
i) Usul bilan foydalanuvchidan ma'lumot olishga qodir bo'lgan kiritish dialogi ko'rsatiladi
sinfdan.

O'z-o'zini tekshirish mashqlariga javoblar 549



j) Usul bilan foydalanuvchiga xabarni ko'rsatishga qodir dialog oynasi ko'rsatiladi
sinfdan.
k) JTextFields ham, JTextAreas ham sinfni bevosita kengaytiradi.
12.2 Har bir bayonot to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) BorderLayout JFrame kontent paneli uchun standart tartib menejeri.
b) Sichqoncha kursori GUI komponentining chegarasiga o'tkazilganda, usul
mouseOver chaqiriladi.
c) JPanel-ni boshqa JPanel-ga qo'shib bo'lmaydi.
d) BorderLayout-da SHIMOLIY mintaqaga qo'shilgan ikkita tugma yonma-yon joylashtiriladi.
e) BorderLayout ga ko'pi bilan beshta komponent qo'shilishi mumkin.
f) Ichki sinflarga qo'shuvchi sinf a'zolariga kirishga ruxsat berilmaydi.
g) JTextArea matni har doim faqat o'qish uchun mo'ljallangan.
h) JTextArea klassi Component sinfining bevosita kichik sinfidir.
12.3 Quyidagi gaplarning har birida xato(lar)ni toping va uni qanday tuzatish kerakligini tushuntiring (ularni):
a) buttonName = JButton("Sarlavha");
b) JLabel aLabel, JLabel;
c) txtField = yangi JTextField(50, "Birlamchi matn");
d) setLayout(yangi BorderLayout());
button1 = yangi JButton("Shimoliy yulduz");
button2 = yangi JButton("Janubiy qutb");
qo'shish (tugma 1);
qo'shish (tugma 2);
O'z-o'zini tekshirish mashqlariga javoblar
12.1 a) sichqonchani siljitish. b) tahrir qilib bo'lmaydigan (faqat o'qish uchun). c) tartib menejeri. d) konteyner. e) grafik
foydalanuvchi interfeysi. f) setLayout. g) sichqoncha bosildi, sichqoncha bosildi. h) JOptionPane. i) showInputDi-
alog, JOptionPane. j) showMessageDialog, JOptionPane. k) JTextComponent.
12.2 a) To'g'ri.
b) yolg'on. MouseEntered usuli chaqiriladi.
c) yolg'on. JPanel-ni boshqa JPanel-ga qo'shish mumkin, chunki JPanel bilvosita kichik sinfdir
Komponentdan. Shunday qilib, JPanel - bu komponent. Har qanday komponentni konteynerga qo'shish mumkin.
d) yolg'on. Faqat oxirgi qo'shilgan tugma ko'rsatiladi. Esda tutingki, faqat bitta kompozitsiya
BorderLayout-da har bir mintaqaga nent qo'shilishi kerak.
e) To'g'ri. [Izoh: Har bir mintaqaga bir nechta komponentlarni o'z ichiga olgan panellar qo'shilishi mumkin.]
f) yolg'on. Ichki sinflar qo'shimcha sinf deklaratsiyasining barcha a'zolariga kirish huquqiga ega.
g) yolg'on. JTextAreas sukut bo'yicha tahrirlanishi mumkin.
h) yolg'on. JTextArea JTextComponent sinfidan olingan.
12.3 a) ob'ektni yaratish uchun new kerak.
b) JLabel sinf nomi bo‘lib, uni o‘zgaruvchi nomi sifatida ishlatib bo‘lmaydi.
c) Konstruktorga berilgan argumentlar teskari. String birinchi navbatda o'tkazilishi kerak.
d) BorderLayout o'rnatildi va komponentlar qayta belgilanmagan holda qo'shilmoqda.
gion, shuning uchun ikkalasi ham markaziy mintaqaga qo'shiladi. To'g'ri qo'shish bayonotlari bo'lishi mumkin
qo'shish(button1, BorderLayout.NORTH);
add(button2, BorderLayout.SOUTH);
Mashqlar
12.4 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) JTextField klassi to'g'ridan-to'g'ri sinfni kengaytiradi.

550 12-bob GUI komponentlari: 1-qism

b) Konteyner usuli GUI komponentini konteynerga biriktiradi.
c) Usul sichqoncha tugmasi qo'yib yuborilganda chaqiriladi (ko'chirmasdan
sichqoncha).
d) Sinf JRadioButtons guruhini yaratish uchun ishlatiladi.
12.5 Har bir bayonot to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Har bir konteyner uchun faqat bitta tartib menejeridan foydalanish mumkin.
b) GUI komponentlarini Konteynerga BorderLayout-da istalgan tartibda qo'shish mumkin.
c) JRadioButtons bir-birini istisno qiluvchi variantlarni taqdim etadi (ya'ni, faqat bittasi rost bo'lishi mumkin)
bir vaqtning o'zida).
d) setFont grafik usuli matn maydonlari uchun shriftni o'rnatish uchun ishlatiladi.
e) Agar ro'yxatda ko'rsatilishi mumkin bo'lgandan ko'proq elementlar mavjud bo'lsa, JList aylantirish panelini ko'rsatadi.
f) Sichqoncha obyektida mouseDragged deb nomlangan usul mavjud.
12.6 Har bir bayonot to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) JPanel - bu JComponent.
b) JPanel - bu komponent.
c) JLabel - bu konteyner.
d) JList - bu JPanel.
e) AbstractButton bu JButton.
f) JTextField - bu ob'ekt.
g) ButtonGroup JComponentning kichik sinfidir.
12.7 Quyidagi kod satrlarining har birida xatolarni toping va ularni qanday tuzatish kerakligini tushuntiring.
a) javax.swing.JFrame-ni import qilish
b) panelObject.GridLayout(8, 8);
c) container.setLayout(yangi FlowLayout(FlowLayout.DEFAULT));
d) container.add(eastButton, EAST); yuz
12.8 Quyidagi grafik interfeysni yarating. Hech qanday funksiyani taqdim etishingiz shart emas.

12.9 Quyidagi grafik interfeysni yarating. Hech qanday funksiyani taqdim etishingiz shart emas.


12.10 Quyidagi grafik interfeysni yarating. Hech qanday funksiyani taqdim etishingiz shart emas.

551-mashqlar

12.11 Quyidagi grafik interfeysni yarating. Hech qanday funksiyani taqdim etishingiz shart emas.


12.12 (haroratni o'zgartirish) dan o'zgartiradigan haroratni o'zgartirish dasturini yozing.


Farengeytdan Selsiyga qadar. Farengeyt haroratini klaviaturadan kiritish kerak (a
JTextField). O'zgartirilgan haroratni ko'rsatish uchun JLabel dan foydalanish kerak. Quyidagilardan foydalaning -
aylantirish uchun mula:
Selsiy = × (Farengeyt - 32)
12.13 (haroratni o'zgartirishni o'zgartirish) Haroratni o'zgartirish dasturini yaxshilang
Kelvin harorat shkalasini qo'shish orqali 12.12-mashq. Ilova foydalanuvchiga ham ruxsat berishi kerak
har qanday ikkita o'lchov o'rtasida konvertatsiya qilish. O'rtasidagi konvertatsiya qilish uchun quyidagi formuladan foydalaning
Kelvin va Selsiy (12.12-mashqdagi formulaga qo'shimcha ravishda):
Kelvin = Selsiy + 273,15
12.14 (Raqamni taxmin o‘yini) “Raqamni taxmin qil” o‘yini quyidagi tarzda o‘ynaydigan dastur yozing:
Ilovangiz diapazonda tasodifiy butun sonni tanlash orqali taxmin qilinadigan raqamni tanlaydi
1–1000. Keyin ilova yorliqda quyidagilarni ko'rsatadi:
Menda 1 dan 1000 gacha raqam bor. Raqamimni taxmin qila olasizmi?
Iltimos, birinchi taxminingizni kiriting.
Tahminni kiritish uchun JTextField dan foydalanish kerak. Har bir taxmin kiritilganligi sababli, fon rangi
qizil yoki ko'k rangga o'zgarishi kerak. Qizil rang foydalanuvchining "issiq" bo'layotganini ko'rsatadi va ko'k,
"sovuqroq." JLabel foydalanuvchiga nolga yordam berish uchun "Juda baland" yoki "Juda past" ko'rsatilishi kerak.
foydalanuvchi to'g'ri javob oladi, "To'g'ri!" ko'rsatilishi kerak va JTextField uchun ishlatiladi
kiritishni tahrir qilib bo'lmaydigan qilib o'zgartirish kerak. Foydalanuvchiga o'ynashga ruxsat berish uchun JButton taqdim etilishi kerak
yana o'yin. JButton bosilganda, yangi tasodifiy raqam yaratilishi kerak va
JTextField kiritilishi tahrirlanadigan qilib o'zgartirildi.
12.15 (Hodisalarni ko'rsatish) Ko'pincha ijro paytida sodir bo'lgan voqealarni ko'rsatish foydalidir
ilovadan. Bu voqealar qachon sodir bo'lishini va ular qanday yaratilganligini tushunishga yordam beradi.
Foydalanuvchiga ushbu bobda muhokama qilingan har bir voqeani yaratish va qayta ishlash imkonini beradigan dastur yozing.
ter. Ilova ActionListener, ItemListener, ListSelec-dan usullarni taqdim etishi kerak.
ko'rsatish uchun tionListener, MouseListener, MouseMotionListener va KeyListener interfeyslari
voqealar sodir bo'lganda xabarlar. Har birida olingan hodisa obyektlarini aylantirish uchun toString usulidan foydalaning
ko'rsatilishi mumkin bo'lgan satrlarga hodisa ishlov beruvchisi. toString usuli hammasini o'z ichiga olgan Stringni yaratadi
hodisa ob'ektidagi ma'lumotlar.
12.16 (GUI-ga asoslangan Craps o'yini) 6.10-bo'lim ilovasini o'zgartiring, bu grafik interfeysni taqdim etadi.
foydalanuvchiga zarni tashlash uchun JButton tugmasini bosish imkonini beradi. Ilova to'rtta JLabelni ham ko'rsatishi kerak
va har bir JTextField uchun bitta JLabel bilan to'rtta JTextField. JTextFields dan foydalanish kerak
har bir o'lim qiymatini va har bir rulon so'ng zarlar yig'indisini ko'rsatish. Nuqta ko'rsatilishi kerak
to'rtinchi JTextField da foydalanuvchi g'alaba qozonmaydi yoki birinchi rulonni yo'qotmaydi va davom etishi kerak
o'yin yo'qolguncha ko'rsatiladi.

5
-9--


552 12-bob GUI komponentlari: 1-qism



(ixtiyoriy) GUI va grafik misollarni o'rganish mashqlari: interfeysni kengaytirish
12.17 (Interaktiv chizmachilik ilovasi) Ushbu mashqda siz GUI ilovasini amalga oshirasiz
GUI-dan MyShape ierarxiyasidan va grafik misollarni o'rganish 10.2 mashqidan foydalanadi.
teraktiv chizmachilik ilovasi. Siz GUI uchun ikkita sinf yaratasiz va test sinfini taqdim etasiz
ilovani ishga tushiradi. MyShape ierarxiyasining sinflari qo'shimcha o'zgarishlarni talab qilmaydi.
Yaratiladigan birinchi sinf JPanelning DrawPanel nomli kichik klassi boʻlib, u maydonni ifodalaydi
foydalanuvchi shakllarni chizadi. DrawPanel sinfida quyidagi misol o'zgaruvchilari bo'lishi kerak:
a) Foydalanuvchi chizgan barcha shakllarni saqlaydigan MyShape tipidagi massiv shakllari.
b) Massivdagi shakllar sonini hisoblovchi butun son shapeCount.
c) Chiziladigan shakl turini aniqlaydigan butun son shakl.
d) Foydalanuvchi chizayotgan joriy shaklni ifodalovchi MyShape currentShape.
e) joriy chizma rangini ifodalovchi Color currentColor.
f) to'ldirilgan shaklni chizish yoki chizish kerakligini aniqlaydigan mantiqiy filledShape.
g) Holat satrini ifodalovchi JLabel statusLabel. Holat satrida hamkorlik ko'rsatiladi.
sichqonchaning joriy holatining ordinatalari.
DrawPanel klassi quyidagi usullarni ham e'lon qilishi kerak:
a) PaintComponentning bekor qilingan usuli Massivdagi shakllarni chizuvchi. Misoldan foydalaning
o'zgaruvchan shapeCount qancha shakl chizish kerakligini aniqlash uchun. PaintComponent usuli
Agar currentShape null bo'lmasa, currentShape ning chizish usulini ham chaqirishi kerak.
b) shapeType, currentColor va filledShape uchun usullarni o'rnating.
c) clearLastShape usuli misolni kamaytirish orqali chizilgan oxirgi shaklni tozalashi kerak
o'zgaruvchan shakl soni. shapeCount hech qachon noldan kam bo'lmasligiga ishonch hosil qiling.
d) clearDrawing usuli joriy chizmadagi barcha shakllarni sozlash orqali olib tashlashi kerak
shapeCount nolga.
clearLastShape va clearDrawing usullari yangilash uchun repaint (JPanel'dan meros bo'lib qolgan) ni chaqirishi kerak.
DrawPanel-dagi chizma tizimning paintComponent usulini chaqirishi kerakligini ko'rsatib beradi.
Class DrawPanel shuningdek, foydalanuvchiga rasm chizish imkoniyatini berish uchun hodisalarni boshqarishni ta'minlashi kerak
sichqoncha. MouseAdapter-ni kengaytiradigan va MouseMotion-ni amalga oshiradigan yagona ichki sinf yarating.
Barcha sichqoncha hodisalarini bir sinfda boshqarish uchun tinglovchi.
Ichki sinfda mousePressed usulini bekor qiling, shunda u currentShape yangi shaklni tayinlaydi.
shapeType tomonidan belgilangan turdagi va ikkala nuqtani sichqoncha holatiga ishga tushiradi. Keyinchalik, bekor qiling
sichqoncha usuli Joriy shaklni chizishni tugatish va uni massivga joylashtirish uchun chiqariladi. Ikkinchisini o'rnating
currentShape nuqtasini sichqonchaning joriy holatiga o'tkazing va qatorga currentShape qo'shing. Misol
o'zgaruvchan shapeCount qo'shish indeksini aniqlaydi. currentShape ni null va chaqiruv usuliga o'rnating
chizmani yangi shakl bilan yangilash uchun qayta bo'yash.
StatusLabel matnini sichqonchani ko'rsatadigan tarzda o'rnatish uchun mouseMoved override usuli
koordinatalar - bu foydalanuvchi har safar harakat qilganda yorliqni koordinatalar bilan yangilaydi (lekin qiladi
tortmang) DrawPanel ichida sichqonchani. Keyinchalik, mouseDragged usulini bekor qiling, shunda u o'rnatadi
currentShape ning ikkinchi nuqtasi sichqonchani joriy holatiga o'tkazadi va qayta bo'yash usulini chaqiradi. Bu
foydalanuvchiga sichqonchani surish paytida shaklni ko'rish imkonini beradi. Shuningdek, sichqonchada JLabel-ni yangilang -
Sichqonchaning joriy holati bilan tortilgan.
DrawPanel uchun bitta JLabel parametriga ega konstruktor yarating. Konstruktorda ini-
statusLabelni parametrga o'tkazilgan qiymat bilan tialize. Shuningdek, massiv shakllarini 100 bilan ishga tushiring
yozuvlar, shapeCount dan 0 gacha, shapeType chiziqni ifodalovchi qiymatga, currentShape dan nullgacha va
joriyRangdan Rangga.QORA. Keyin konstruktor Draw-ning fon rangini o'rnatishi kerak.
Panelni Color.WHITE ga o'tkazing va JPanel uchun MouseListener va MouseMotionListenerni ro'yxatdan o'tkazing.
sichqoncha hodisalarini to'g'ri boshqaradi.
Keyinchalik, DrawFrame deb nomlangan JFrame kichik sinfini yarating, bu foydalanuvchiga grafik interfeysni taqdim etadi.
chizishning turli tomonlarini nazorat qilish. DrawFrame-ni joylashtirish uchun biz BorderLay-ni tavsiya qilamiz.

Farq qilish 553

SHIMOL mintaqadagi komponentlar bilan, CENTER hududidagi asosiy chizma paneli va a
12.49-rasmda bo'lgani kabi JANUB mintaqasidagi holat paneli. Yuqori panelda ro'yxatdagi komponentlarni yarating
quyida. Har bir komponentning hodisa ishlovchisi DrawPanel sinfidagi tegishli usulni chaqirishi kerak.
a) Oxirgi chizilgan shaklni bekor qilish tugmasi.
b) Chizmadan barcha shakllarni tozalash tugmasi.
c) Oldindan belgilangan 13 ta rangdan rangni tanlash uchun kombinatsiyalangan oyna.
d) Chizish uchun shaklni tanlash uchun birlashtirilgan oyna.
e) Shaklni to'ldirish yoki to'ldirish kerakligini belgilovchi katakcha.
DrawFrame konstruktorida interfeys komponentlarini e'lon qiling va yarating. Siz yaratishingiz kerak
DrawPanel-ni yaratishdan oldin JLabel holat satriga o'ting, shuning uchun JLabelni argument sifatida topshirishingiz mumkin.
DrawPanel konstruktoriga. Nihoyat, DrawFrame-ni ishga tushiradigan va ko'rsatadigan test sinfini yarating
dasturni bajaring.

12.18 (ATM Case Studyning GUI-asoslangan versiyasi) Ixtiyoriy ATM misolini qayta tiklash


GUI-ga asoslangan dastur sifatida 33-34-boblarning. ATMni taxmin qilish uchun GUI komponentlaridan foydalaning
33.1-rasmda ko'rsatilgan foydalanuvchi interfeysi. Naqd pul dispenseri va depozit uyasi uchun JButtons yorlig'idan foydalaning
Naqd pulni olib tashlang va konvertni joylashtiring. Bu ilovaga qachon ko'rsatilgan voqealarni qabul qilish imkonini beradi
foydalanuvchi naqd pul oladi va mos ravishda depozit konvertini kiritadi.
Farq qilish
12.19 (Ecofont) Ecofont (www.ecofont.eu/ecofont_en.html) — SPRANQ tomonidan ishlab chiqilgan (Net-
erlands-ga asoslangan kompaniya) - bu bepul, ochiq manbali kompyuter shrifti bo'lib, shuncha qisqartirishga mo'ljallangan
Bosib chiqarish uchun ishlatiladigan siyoh miqdorining 20% ga, shu tariqa ishlatiladigan siyoh kartrijlari soni ham kamayadi va
ishlab chiqarish va tashish jarayonlarining atrof-muhitga ta'siri (kamroq energiya, kamroq yoqilg'i ishlatish).
yuk tashish uchun va boshqalar). Sans-serif Verdana-ga asoslangan shriftda kichik dumaloq "teshiklar" mavjud
kichikroq o'lchamlarda ko'rinmaydigan harflar, masalan, tez-tez ishlatiladigan 9 yoki 10 nuqtali harflar. Pastga -
Ecofont-ni yuklang, so'ngra quyidagi ko'rsatmalardan foydalanib Spranq_eco_sans_regular.ttf shrift faylini o'rnating.
Ecofont veb-sayti. Keyinchalik, matn qatorini kiritish imkonini beruvchi GUI-ga asoslangan dasturni ishlab chiqing
Ekofontda ko'rsatiladi. Sizga ruxsat beruvchi Shrift hajmini oshirish va Shrift hajmini kamaytirish tugmalarini yarating

12.49-rasm | Shakllarni chizish uchun interfeys.


554 12-bob GUI komponentlari: 1-qism

bir vaqtning o'zida bir nuqtaga kattalashtirish yoki pasaytirish. 9 nuqtadan iborat standart shrift o'lchamidan boshlang. Siz o'lchov sifatida
yuqoriga qarab, siz harflardagi teshiklarni aniqroq ko'rishingiz mumkin bo'ladi. Kichraytirsangiz, teshiklar kamroq bo'ladi
aniq. Teshiklarni sezishni boshlagan eng kichik shrift o'lchami nima?
12.20 (Yozuv o'qituvchisi: kompyuter asrida muhim mahoratni sozlash) Tez va to'g'ri yozish
kompyuter va Internet bilan samarali ishlash uchun zaruriy mahoratdir. Ushbu mashqda siz
Foydalanuvchilarga “tegish bilan yozish”ni o‘rganishga yordam beradigan GUI ilovasini yarating (ya’ni, ko‘rinmasdan to‘g‘ri yozish)
klaviaturada). Ilova virtual klaviaturani ko'rsatishi kerak (12.50-rasm) va al-
foydalanuvchi ekranda nima yozayotganini klaviaturaga qaramasdan tomosha qilish imkoniyatini pasaytiring.
Tugmachalarni ifodalash uchun JButtons dan foydalaning. Foydalanuvchi har bir tugmachani bosganda, dastur asosiy narsani ta'kidlaydi.
GUI-da JButton-ga javob beradi va foydalanuvchi nima borligini ko'rsatadigan JTextArea-ga belgi qo'shadi
hozirgacha yozilgan. [Maslahat: JButtonni ajratib koʻrsatish uchun uning fonini oʻzgartirish uchun uning setBackground usulidan foydalaning
rang. Kalit bo'shatilganda, uning asl fon rangini tiklang. JButton-ni olishingiz mumkin
rangini o'zgartirishdan oldin getBackground usuli bilan asl fon rangi.]

Siz dasturingizni har bir harfni o'z ichiga olgan pangram - iborani kiritish orqali sinab ko'rishingiz mumkin


alifboni kamida bir marta - "Tez jigarrang tulki dangasa it ustidan sakrab o'tdi" kabi. Boshqasini topishingiz mumkin
Internetdagi pangrams.
Dasturni yanada qiziqarli qilish uchun siz foydalanuvchining aniqligini kuzatishingiz mumkin. Siz bo'lishingiz mumkin edi
foydalanuvchi dasturingizda oldindan saqlagan va ekranda ko'rsatadigan maxsus iboralarni kiritadi
virtual klaviatura ustidagi ekran. Siz foydalanuvchining qancha tugma bosishlarini kuzatishingiz mumkin
to'g'ri va qanchasi noto'g'ri yozilgan. Shuningdek, foydalanuvchi qaysi kalitlarga ega ekanligini kuzatishingiz mumkin.
qiyinchilik tug'diring va ushbu kalitlarni ko'rsatadigan hisobotni ko'rsating.

12.50-rasm | Matn yozish o'qituvchisi.


Grafika va Java 2D 13


Tabiatga nisbatan munosabatda bo'ling
silindr, shar, konus, hammasi
nuqtai nazardan.
- Pol Sezan
Ranglar, xususiyatlar kabi, quyidagiga amal qiladi
hissiyotlarning o'zgarishi.
- Pablo Pikasso
Ungacha hech narsa haqiqiy bo'lib qolmaydi
tajribali — hatto maqol ham
umringgacha sen uchun maqol emas
uni tasvirlab berdi.
- Jon Keats

Oh maqsadlar


Ushbu bobda siz:
■ Grafikalarni tushunish
kontekstlar va grafikalar
ob'ektlar.
■ Ranglar va shriftlarni boshqaring.
■ Sinf usullaridan foydalanish
Turli xil chizish uchun grafika
shakllar.
■ Sinf usullaridan foydalanish
Java-dan Graphics2D
Turli xil chizish uchun 2D API
shakllar.
■ Paint and Stroke-ni belgilang
shakllarning xususiyatlari
bilan ko'rsatiladi
Grafika 2D.

556 13-bob Grafika va Java 2D



13.1 Kirish
Ushbu bobda biz Java-ning ikki o'lchovli chizish uchun bir nechta imkoniyatlarini ko'rib chiqamiz
shakllar, ranglarni boshqarish va shriftlarni boshqarish. Java-ning dastlabki murojaatining bir qismi uni qo'llab-quvvatlash edi
dasturchilarga o'z ilovalarini vizual ravishda yaxshilash imkonini beradigan grafikalar uchun. Java o'z ichiga oladi
Java 2D API ning bir qismi sifatida yanada murakkab chizish imkoniyatlari (ushbu bobda keltirilgan)
va uning vorisi JavaFX texnologiyasi (25-bobda va ikkita onlayn bobda keltirilgan). Bu
bo'lim Java-ning ko'plab original chizmachilik imkoniyatlarini tanishtirish bilan boshlanadi. Keyinchalik taqdim etamiz
ishlatiladigan qatorlar uslubini boshqarish kabi bir qancha kuchli Java 2D imkoniyatlari
shakllarni chizish va shakllarning ranglar va naqshlar bilan to'ldirilishi. Bo'lgan sinflar
Java ning asl grafik imkoniyatlarining bir qismi endi Java 2D API ning bir qismi hisoblanadi.
13.1-rasmda turli grafiklarni o'z ichiga olgan sinf ierarxiyasining bir qismi ko'rsatilgan
sinflar va Java 2D API sinflari va ushbu bobda ko'rib chiqilgan interfeyslar. Class Color o'z ichiga oladi
ranglarni manipulyatsiya qilish usullari va konstantalari. JComponent klassi usulni o'z ichiga oladi
paintComponent, bu komponentga grafik chizish uchun ishlatiladi. Class Shrift o'z ichiga oladi
shriftlarni manipulyatsiya qilish usullari va konstantalari. FontMetrics klassi uchun usullar mavjud
shrift haqida ma'lumot olish. Grafika sinfida satrlar, chiziqlar chizish usullari mavjud.
to'rtburchaklar va boshqa shakllar. Grafika sinfini kengaytiruvchi Class Graphics2D uchun ishlatiladi
Java 2D API bilan chizish. Poligon klassi ko‘pburchaklar yaratish usullarini o‘z ichiga oladi. The
rasmning pastki yarmida Java 2D API-dan bir nechta sinflar va interfeyslar ro'yxati keltirilgan. Sinf
BasicStroke chiziqlarni chizish xususiyatlarini aniqlashga yordam beradi. GradientPaint va sinflar
TexturePaint shakllarni ranglar yoki naqshlar bilan to'ldirish xususiyatlarini aniqlashga yordam beradi.
GeneralPath, Line2D, Arc2D, Ellipse2D, Rectangle2D va RoundRectangle2D sinflari
bir nechta Java 2D shakllarini ifodalaydi.
Java tilida chizishni boshlash uchun avvalo Java koordinata tizimini tushunishimiz kerak
(13.2-rasm), bu ekrandagi har bir nuqtani aniqlash sxemasi. Odatiy bo'lib,
GUI komponentining yuqori chap burchagi (masalan, oyna) koordinatalariga (0, 0) ega. Hamkor -
dinat juftligi x-koordinata (gorizontal koordinata) va y-koordinatadan iborat.
(vertikal koordinata). X koordinatasi to'g'ridan-to'g'ri harakatlanuvchi gorizontal masofadir
ekranning chap chekkasi. y-koordinata - dan pastga qarab harakatlanadigan vertikal masofa
ekranning yuqori qismida. X o'qi har bir gorizontal koordinatani, y o'qi esa har bir ver-
tik koordinata. Koordinatalar grafiklar qayerda ko'rsatilishi kerakligini ko'rsatish uchun ishlatiladi
ekranda. Koordinata birliklari piksellarda o'lchanadi (bu "rasm elementlari" degan ma'noni anglatadi).
Piksel - bu displey monitorining eng kichik ruxsat birligi.

13.1 Kirish


13.2 Grafik kontekst va grafika
Ob'ektlar
13.3 Rangni boshqarish
13.4 Shriftlarni manipulyatsiya qilish
13.5 Chiziqlar, to'rtburchaklar va tasvirlar chizish

13.6 Yoylarni chizish


13.7 Ko‘pburchaklar va poliliniyalarni chizish
13.8 Java 2D API
13.9 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar |


Farq qilish

13.1 Kirish 557

13.1-rasm | Ushbu bobda Java-ning asl grafiklaridan foydalanilgan sinflar va interfeyslar
imkoniyatlar va Java 2D API dan.

Portativlik bo'yicha maslahat 13.1


Turli displey monitorlari turli xil ruxsatlarga ega (ya'ni, piksellarning zichligi o'zgaradi).
Bu grafiklarning turli monitorlarda yoki bir xil o'lchamlarda ko'rinishiga olib kelishi mumkin
turli xil sozlamalar bilan monitor.

java.awt.Color

java.lang.Object

java.awt.Component

java.awt.shrift

java.awt.FontMetrics

java.awt.Grafika

java.awt.Poligon

java.awt.geom.Arc2D

java.awt.geom.Ellipse2D

java.awt.geom.Rectangle2D

java.awt.geom.RoundRectangle2D

java.awt.Graphics2D

java.awt.Konteyner javax.swing.JComponent

"interfeys"
java.awt.Paint

"interfeys"


java.awt.Shape

"interfeys"


java.awt.Stroke

java.awt.BasicStroke

java.awt.GradientPaint

java.awt.TexturePaint

java.awt.geom.GeneralPath

java.awt.geom.Line2D

java.awt.geom.RectangularShape

558 13-bob Grafika va Java 2D

13.2 Grafik kontekst va grafik ob'ektlar
Grafik kontekst ekranda rasm chizish imkonini beradi. Grafik obyekti grafikani boshqaradi
matn va boshqa grafik ob'ektlarni ifodalovchi piksellarni ekranga chizadi (masalan,
chiziqlar, ellipslar, to'rtburchaklar va boshqa ko'pburchaklar). Grafik ob'ektlarda chizish usullari mavjud,
shriftni manipulyatsiya qilish, ranglarni manipulyatsiya qilish va boshqalar.
Class Graphics - bu mavhum sinf (ya'ni, siz Grafik ob'ektlarini instantsiya qila olmaysiz).
Bu Java-ning portativligiga hissa qo'shadi. Chunki har birida chizish turlicha bajariladi
Java-ni qo'llab-quvvatlaydigan platformada chizmaning faqat bitta ilovasi bo'lishi mumkin emas
barcha tizimlardagi imkoniyatlar. Java ma'lum bir platformada amalga oshirilganda, pastki
Chizish imkoniyatlarini amalga oshiradigan Grafika sinfi yaratilgan. Ushbu amalga oshirish-
tion Graphics sinfi tomonidan yashiringan bo'lib, u bizga foydalanish imkonini beruvchi interfeysni ta'minlaydi
platformadan mustaqil tarzda grafika.
12-bobdan eslaylikki, Komponent sinfi ko'pgina sinflar uchun yuqori sinfdir
java.awt paketida. Bilvosita meros qilib oladigan JComponent klassi (javax.swing paketi).
Component sinfidan, chizish uchun ishlatilishi mumkin bo'lgan paintComponent usulini o'z ichiga oladi
grafika. PaintComponent usuli argument sifatida Grafik obyektini oladi. Bu ob'ekt
tizim tomonidan paintComponent usuliga engil Swing kompozitsiyasi o'tkazilganda.
nentni qayta bo'yash kerak. paintComponent usulining sarlavhasi

Parametr g tizimga xos Grafik kichik sinfining namunasiga havolani oladi.


Oldingi usul sarlavhasi sizga tanish bo'lishi kerak - bu biz ishlatgan sarlavha
12-bobdagi ba'zi ilovalar. Aslida JComponent klassi JPan-ning yuqori sinfidir.
el. JPanel sinfining ko'pgina imkoniyatlari JComponent sinfidan meros bo'lib o'tgan.
Siz kamdan-kam hollarda paintComponent usulini to'g'ridan-to'g'ri chaqirasiz, chunki chizilgan grafikalar - bu
hodisaga asoslangan jarayon. 11-bobda aytib o'tganimizdek, Java ko'p tarmoqli modelidan foydalanadi
dasturning bajarilishi. Har bir mavzu parallel faoliyatdir. Har bir dasturda ko'plab mavzular bo'lishi mumkin.
GUI-ga asoslangan ilovani yaratganingizda, ushbu mavzulardan biri voqea sifatida tanilgan.
Dispatch thread (EDT) - u barcha GUI hodisalarini qayta ishlash uchun ishlatiladi. Barcha manipulyatsiyalar -
ekranning GUI komponentlari o'sha ipda bajarilishi kerak. GUI ilovasi exe-
cutes, dastur konteyneri paintComponent usulini chaqiradi (voqea-dispatch
GUI ko'rsatilgandek har bir engil komponent uchun thread). PaintComponent uchun
qayta chaqirilsa, voqea sodir bo'lishi kerak (komponentni bilan qoplash va ochish kabi
boshqa oyna).

13.2-rasm | Java koordinata tizimi. Birliklar piksellarda o'lchanadi.

public void paintComponent (Grafika g)

(0, 0)


(x, y)

+y

+x



y o'qi

x o'qi

13.3 Rangni boshqarish 559

Agar sizga bajarish uchun paintComponent kerak bo'lsa (ya'ni chizilgan grafiklarni yangilashni xohlasangiz


Swing komponentida) siz repaint usulini chaqirishingiz mumkin, bu bekor bo'lganini qaytaradi, hech qanday dalil talab qilmaydi.
ments va barcha JComponents tomonidan bilvosita Component sinfidan (paket
java.awt).
13.3 Rangni boshqarish
Class Color Java dasturida ranglarni manipulyatsiya qilish usullari va konstantalarini e'lon qiladi.
Oldindan e'lon qilingan rang konstantalari 13.3-rasmda va bir nechta rang usullarida jamlangan
va konstruktorlar 13.4-rasmda umumlashtirilgan. 13.4-rasmdagi usullardan ikkitasi Grafik-
ranglarga xos bo'lgan ics usullari.

Rang doimiy RGB qiymati

ommaviy statik yakuniy Rang RED 255, 0, 0
umumiy statik yakuniy Rang YASIL 0, 255, 0
ommaviy statik yakuniy Rang BLUE 0, 0, 255
umumiy statik yakuniy Rang ORANGE 255, 200, 0
ommaviy statik yakuniy Rang PINK 255, 175, 175
umumiy statik yakuniy Rang CYAN 0, 255, 255
umumiy statik yakuniy Rang MAGENTA 255, 0, 255
umumiy statik yakuniy Rang SARI 255, 255, 0
ommaviy statik yakuniy Rang BLACK 0, 0, 0
ommaviy statik yakuniy Rang OQ 255, 255, 255
ommaviy statik yakuniy Rang GREY 128, 128, 128
umumiy statik yakuniy Rang LIGHT_GRAY 192, 192, 192
umumiy statik yakuniy Rang DARK_GRAY 64, 64, 64

13.3-rasm | Rang konstantalari va ularning RGB qiymatlari.

Usul tavsifi

Rang konstruktorlari va usullari


umumiy rang(int r, int g, int b)
Butun sonlar bilan ifodalangan qizil, yashil va ko‘k komponentlar asosida rang hosil qiladi
0 dan 255 gacha.
umumiy rang(float r, float g, float b)
Suzuvchi sifatida ifodalangan qizil, yashil va ko'k komponentlar asosida rang yaratadi.
nuqta qiymatlari 0,0 dan 1,0 gacha.
public int getRed()
Qizil tarkibni ifodalovchi 0 dan 255 gacha bo'lgan qiymatni qaytaradi.

13.4-rasm | Rang usullari va rang bilan bog'liq Grafik usullari. (2-qismning 1-qismi.)


560 13-bob Grafika va Java 2D

Har bir rang qizil, yashil va ko'k qiymatdan yaratilgan. Bular birgalikda deyiladi
RGB qiymatlari. Barcha uchta RGB komponentlari 0 dan 255 gacha bo'lgan butun sonlar yoki barchasi bo'lishi mumkin
uchtasi 0,0 dan 1,0 gacha bo'lgan suzuvchi nuqta qiymatlari bo'lishi mumkin. Birinchi RGB komponentining spetsifikatsiyasi
qizil miqdorini, ikkinchi yashil miqdorini va uchinchi ko'k miqdorini ifodalaydi.
Qiymat qanchalik katta bo'lsa, ushbu rangning miqdori shunchalik ko'p bo'ladi. Java sizga imkon beradi
256 × 256 × 256 (taxminan 16,7 million) ranglardan tanlang. Hamma kompyuterlar ham shunday emas
bu ranglarning barchasini ko'rsatishga qodir. Ekran eng yaqin rangni ko'rsatadi.
Rang sinfining ikkita konstruktori 13.4-rasmda ko'rsatilgan - bittasi uchta int oladi
argumentlar va bittasi uchta float argumentini oladi, har bir argumentda ko'rsatilgan
qizil, yashil va ko'k miqdori. int qiymatlari 0–255 va float oralig'ida bo'lishi kerak
0,0-1,0 oralig'idagi qiymatlar. Yangi Color ob'ektida qizil rang belgilangan miqdorda bo'ladi,
yashil va ko'k. Rang usullari getRed, getGreen va getBlue dan butun son qiymatlarini qaytaradi
0 dan 255 gacha, mos ravishda qizil, yashil va ko'k miqdorini ifodalaydi. Grafik usul
getColor Graphics obyektining joriy chizilgan rangini ifodalovchi Color obyektini qaytaradi.
Grafik metod setColor joriy chizma rangini o'rnatadi.
Turli ranglarda chizish
13.5-13.6-rasmlarda to'ldirilgan to'rtburchaklar chizish orqali 13.4-rasmdagi bir nechta usullar ko'rsatilgan.
va bir necha xil rangdagi strings. Ilova bajarila boshlaganda, sinf Col-
yoki JPanelning paintComponent usuli (13.5-rasmning 10–37-qatorlari) yutuqni bo'yash uchun chaqiriladi.
dow. 17-qator chizma rangini belgilash uchun setColor Grafik usulidan foydalanadi. Usul to'plamiColor
Rang ob'ektini oladi. new Color (255, 0, 0) ifodasi yangi Rang obyektini yaratadi
bu qizil rangni ifodalaydi (qizil qiymat 255 va yashil va ko'k qiymatlar uchun 0). 18-qatordan foydalaniladi
Joriy rangda to‘ldirilgan to‘rtburchak chizish uchun fillRect grafik usuli. To'ldirish usuli -
Rect to'rtta argumenti asosida to'rtburchak chizadi. Birinchi ikkita butun qiymat ifodalaydi
yuqori chap x-koordinata va yuqori chap y-koordinata, bu erda Grafik obyekti boshlanadi
to'rtburchakni chizish. Uchinchi va to'rtinchi argumentlar manfiy bo'lmagan butun sonlardir
to'rtburchakning kengligi va balandligini mos ravishda piksellarda ifodalaydi. To'rtburchak
fillRect usuli yordamida chizilgan Graphics ob'ektining joriy rangi bilan to'ldiriladi.

public int getGreen()


Yashil tarkibni ifodalovchi 0 dan 255 gacha bo'lgan qiymatni qaytaradi.
public int getBlue()
Moviy tarkibni ifodalovchi 0 dan 255 gacha bo'lgan qiymatni qaytaradi.
Ranglarni manipulyatsiya qilishning grafik usullari
ommaviy rang getColor()
Grafik kontekst uchun joriy rangni ifodalovchi Color ob'ektini qaytaradi.
umumiy bo'shliq to'plamiRang (rang c)
Grafik kontekst bilan chizish uchun joriy rangni o'rnatadi.

Usul tavsifi

13.4-rasm | Rang usullari va rang bilan bog'liq Grafik usullari. (2-qismning 2-qismi.)

13.3 Rangni boshqarish 561

1 // 13.5-rasm: ColorJPanel.java
2 // Chizma ranglarini o'zgartirish.
3 import java.awt.Graphics;
4
5 import javax.swing.JPanel;
6
7 ommaviy sinf ColorJPanel JPanel-ni kengaytiradi
8 {
9 // turli rangdagi to'rtburchaklar va Stringlarni chizish
10 @Bekor qilish
11 umumiy bekor bo'yoq Komponenti (Grafika g)
12 {
13 super.paintComponent(g);
14 this.setBackground(Color.WHITE);
15
16 // butun sonlar yordamida yangi chizma rangini o'rnating
17
18
19 g.drawString("Hozirgi RGB: " + , 130, 40);
20
21 // float yordamida yangi chizma rangini o'rnating
22
23 g.fillRect(15, 50, 100, 20);
24 g.drawString("Hozirgi RGB: " + , 130, 65);
25
26 // Statik Color ob'ektlari yordamida yangi chizma rangini o'rnating
27
28 g.fillRect(15, 75, 100, 20);
29 g.drawString("Hozirgi RGB: " + g.getColor(), 130, 90);
30
31 // individual RGB qiymatlarini ko'rsatish
32
33
34 g.fillRect(15, 100, 100, 20);
35 g.drawString("RGB qiymatlari: " + + ", " +
36 + ", " + , 130, 115);
37 }
38 } // oxirgi sinf ColorJPanel

13.5-rasm | Chizma ranglarini o'zgartirish.

1 // 13.6-rasm: ShowColors.java
2 // Ranglarni namoyish qilish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf ShowColors
6 {
7 // dasturni bajarish
8 ta umumiy statik bekor asosiy(String[] args)
9 {

13.6-rasm | Ranglarni namoyish qilish. (2-qismning 1-qismi.)

import java.awt.Color;

g.setColor(yangi rang(255, 0, 0));


g.fillRect(15, 25, 100, 20);
g.getColor()

g.setColor(yangi rang(0.50f, 0.75f, 0.0f));

g.getColor()

g.setColor(Color.BLUE);

Rang rangi = Color.MAGENTA;
g.setColor(rang);

color.getRed()


color.getGreen() color.getBlue()

562 13-bob Grafika va Java 2D

19-qator joriy rangda Stringni chizish uchun drawString Grafik usulidan foydalanadi.
g.getColor() ifodasi Graphics obyektidan joriy rangni oladi. Biz
keyin Rangni "Joriy RGB:" qatori bilan birlashtiring, natijada yashirin qo'ng'iroq qiling
Class Color ning toString usuli. Rangning string tasviri sinfni o'z ichiga oladi
nom va paket (java.awt.Color) va qizil, yashil va ko'k qiymatlar.

22-24 va 27-29 qatorlar yana bir xil vazifalarni bajaradi. 22-qatorda Color con-


quyuq yashil rang yaratish uchun uchta float argumentli struktura (qizil uchun 0,50 f, uchun 0,75 f)
yashil va ko'k uchun 0,0f). Qiymatlarning sintaksisiga e'tibor bering. f harfi a ga qo'shilgan
floating-point literal literalni float turi sifatida ko'rib chiqish kerakligini ko'rsatadi. Shuni eslang
sukut bo'yicha, suzuvchi nuqtali harflar double turi sifatida ko'rib chiqiladi.
27-qator joriy chizma rangini oldindan e'lon qilingan Rang konstantalaridan biriga o'rnatadi
(Rang. MAVK). Rang konstantalari statikdir, shuning uchun ular Color sinfida yaratiladi
bajarilish vaqtida xotiraga yuklanadi.
35–36-qatorlardagi bayonot GetRed, getGreen va Rang usullariga qo'ng'iroq qiladi
getBlue oldindan e'lon qilingan Color.MAGENTA doimiysida. ShowColors sinfining asosiy usuli
(13.6-rasmning 8–18-qatorlari) ColorJPanel obyektini o‘z ichiga olgan JFrame ni yaratadi.
ranglar ko'rsatiladi.

10 // ColorJPanel uchun ramka yarating


11 JFrame ramkasi = yangi JFrame("Ranglardan foydalanish");
12 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13
14 ColorJPanel colorJPanel = yangi ColorJPanel();
15 frame.add(colorJPanel);
16 frame.setSize(400, 180);
17 frame.setVisible(rost);
18 }
19 } // oxirgi sinf ShowColors

Ko'rish va his qilish kuzatuvi 13.1


Odamlar ranglarni boshqacha qabul qiladilar. Qo'llanilishingizga ishonch hosil qilish uchun ranglaringizni diqqat bilan tanlang.
Rangni idrok eta oladigan odamlar uchun ham, rangli ko'rlar uchun ham o'qilishi mumkin.
Yaqin atrofda turli xil ranglardan foydalanmaslikka harakat qiling.

Dasturiy ta'minot muhandisligi kuzatuvi 13.1


Rangni o'zgartirish uchun siz yangi Color ob'ektini yaratishingiz kerak (yoki oldindan e'lon qilinganlardan birini ishlatishingiz kerak
Rang konstantalari). String ob'ektlari kabi, Color ob'ektlari o'zgarmasdir (o'zgartirilmaydi).

13.6-rasm | Ranglarni namoyish qilish. (2-qismning 2-qismi.)


13.3 Rangni boshqarish 563

JColorChooser komponenti (javax.swing paketi) ilova foydalanuvchilariga imkon beradi
ranglarni tanlang. 13.7–13.8-rasmlarda JColorChooser dialog oynasi koʻrsatilgan. ni bosganingizda
Rangni o'zgartirish tugmasi, JColorChooser dialog oynasi paydo bo'ladi. Rangni tanlaganingizda va bosing
dialog oynasining OK tugmasini bosgandan so'ng, dastur oynasining fon rangi o'zgaradi.

1 // 13.7-rasm: ShowColors2JFrame.java


2 // JColorChooser yordamida ranglarni tanlash.
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import javax.swing.JButton;
8 import javax.swing.JFrame;
9
10 import javax.swing.JPanel;
11
12 ommaviy sinf ShowColors2JFrame JFrame-ni kengaytiradi
13 {
14 xususiy yakuniy JButton changeColorJButton;
15 shaxsiy Rang rangi = Rang.LIGHT_GRAY;
16 xususiy yakuniy JPanel colorJPanel;
17
18 // GUI-ni o'rnating
19 ommaviy ShowColors2JFrame()
20 {
21 super("JColorChooser-dan foydalanish");
22
23 // displey rangi uchun JPanel yarating
24 rangJPanel = yangi JPanel();
25 colorJPanel.setBackground(rangli);
26
27 // changeColorJButton-ni o'rnating va uning hodisa ishlovchisini ro'yxatdan o'tkazing
28 changeColorJButton = new JButton("Rangni o'zgartirish");
29 changeColorJButton.addActionListener(
30 ta yangi ActionListener() // anonim ichki sinf
31 {
32 // foydalanuvchi tugmani bosganida JColorChooser ko'rsatiladi
33 @Bekor qilish
34 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
35 {
36
37
38
39 // hech qanday rang qaytarilmasa, standart rangni o'rnating
40 agar (rang == null)
41 rang = Rang.LIGHT_GRAY;
42
43 // kontent paneli fon rangini o'zgartirish
44
45 } // tugatish usuli harakati bajarildi
46 } // anonim ichki sinfni tugatish
47); // addActionListener-ga qo'ng'iroqni tugatish

13.7-rasm | JColorChooser yordamida ranglarni tanlash. (2-qismning 1-qismi.)

import javax.swing.JColorChooser;

rang = JColorChooser.showDialog(


ShowColors2JFrame.this, "Rangni tanlang", rang);

colorJPanel.setBackground(rang);


564 13-bob Grafika va Java 2D

JColorChooser klassi JColor-ni yaratadigan showDialog statik usulini taqdim etadi.
Ob'ektni tanlash, uni dialog oynasiga biriktiradi va dialog oynasini ko'rsatadi. 13.7-rasmning 36-37-qatorlari

48
49 qo'shish(colorJPanel, BorderLayout.CENTER);


50 qo'shish(changeColorJButton, BorderLayout.SOUTH);
51
52 toʻplamOʻlcham(400, 130);
53 setVisible(to'g'ri);
54 } // tugatish ShowColor2JFrame konstruktori
55 } // oxirgi sinf ShowColors2JFrame

1 // 13.8-rasm: ShowColors2.java


2 // JColorChooser yordamida ranglarni tanlash.
3 import javax.swing.JFrame;
4
5 ommaviy sinf ShowColors2
6 {
7 // dasturni bajarish
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 ShowColors2JFrame ilovasi = yangi ShowColors2JFrame();
11 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12 }
13 } // oxirgi sinf ShowColors2

13.8-rasm | JColorChooser yordamida ranglarni tanlash.

13.7-rasm | JColorChooser yordamida ranglarni tanlash. (2-qismning 2-qismi.)

Rangni tanlang


ranglardan biri
namunalar

(a) Ilovaning dastlabki oynasi (b) JColorChooser oynasi

(c) JPanel-ni o'zgartirgandan so'ng dastur oynasi
fon rangi

13.3 Rangni boshqarish 565

rang tanlash dialogini ko'rsatish uchun ushbu usulni chaqiring. showDialog usuli ni qaytaradi
tanlangan Rang ob'ekti yoki agar foydalanuvchi Bekor qilish tugmasini bosgan bo'lsa yoki ularsiz dialogni yopsa null
OK tugmasini bosish. Usul uchta argumentni oladi - uning asosiy komponentiga havola, a
Muloqot oynasining sarlavha satrida ko'rsatiladigan qator va dialog oynasi uchun dastlabki tanlangan Rang.
Ota-komponent dialog oynasi ko'rsatiladigan oynaga havoladir (
bu holda JFrame, mos yozuvlar nomi ramkasi bilan). Muloqot oynasi markazida bo'ladi
ota-ona. Agar ota-ona null bo'lsa, dialog ekranning markazida joylashgan. Rang tanlashda
dialog oynasi ekranda bo'lsa, foydalanuvchi dialog oynasigacha asosiy komponent bilan o'zaro aloqa qila olmaydi
ishdan bo'shatiladi. Bunday dialog turi modal dialog deb ataladi.
Foydalanuvchi rangni tanlagandan so'ng, 40-41 qatorlar rangning nol ekanligini aniqlaydi va agar shunday bo'lsa,
rangni Rangga o‘rnating.LIGHT_GRAY. 44-qator o'zgartirish uchun setBackground usulini chaqiradi
JPanel fon rangi. SetBackground usuli ko'p komponentlardan biridir
ko'pgina GUI komponentlarida qo'llanilishi mumkin bo'lgan usullar. Foydalanuvchi foydalanishni davom ettirishi mumkin
Ilovaning fon rangini o'zgartirish uchun Rangni o'zgartirish tugmasi. 13.8-rasm kon-
tains usuli main, bu dasturni bajaradi.
Shakl 13.8(b) da foydalanuvchiga a tanlash imkonini beruvchi standart JColorChooser dialog oynasi ko'rsatilgan
turli xil rang namunalaridan rang. Muloqot oynasining yuqori qismida uchta yorliq mavjud -
Swatchlar, HSB va RGB. Bular rang tanlashning uch xil usulini ifodalaydi. HSB yorlig'i
tus, toʻyinganlik va yorqinlik – oʻrganilgan qiymatlar asosida rang tanlash imkonini beradi
rangdagi yorug'lik miqdorini aniqlang. http://en.wikipedia.org/wiki/HSL_and_HSV saytiga tashrif buyuring
HSB haqida qo'shimcha ma'lumot olish uchun. RGB yorlig'i sizga slayderlar yordamida rang tanlash imkonini beradi
qizil, yashil va ko'k komponentlarni tanlang. HSB va RGB yorliqlari 13.9-rasmda ko'rsatilgan.

13.9-rasm | JColorChooser muloqot oynasining HSB va RGB yorliqlari. (2-qismning 1-qismi.)


566 13-bob Grafika va Java 2D

13.4 Shriftlarni manipulyatsiya qilish
Ushbu bo'lim shriftlarni manipulyatsiya qilish usullari va konstantalari bilan tanishadi. Eng ko'p shrift usuli -
ods va shrift konstantalari Shrift sinfining bir qismidir. Ayrim konstruktorlar, usullar va konstantalar
sinfi Shrift va sinf Grafika 13.10-rasmda jamlangan.

Usul yoki doimiy tavsif

Shrift konstantalari, konstruktorlari va usullari
public static final int PLAIN Oddiy shrift uslubini ifodalovchi doimiy.
public static final int BOLD Qalin shrift uslubini ifodalovchi doimiy.
public static final int ITALIC Kursiv shrift uslubini ifodalovchi doimiy.
Umumiy shrift (String nomi,
int uslubi, int hajmi)

Belgilangan shrift nomi bilan Shrift ob'ektini yaratadi,


uslub va o'lcham.
public int getStyle() Joriy shrift uslubini ko'rsatuvchi intni qaytaradi.
public int getSize() Joriy shrift hajmini ko'rsatuvchi intni qaytaradi.
public String getName() Joriy shrift nomini satr sifatida qaytaradi.
public String getFamily() Shriftning familiyasini qator sifatida qaytaradi.
public boolean isPlain() Agar shrift oddiy bo'lsa, true qiymatini qaytaradi, aks holda noto'g'ri.
public boolean isBold() Agar shrift qalin bo'lsa, true qiymatini qaytaradi, aks holda false.
public boolean isItalic() Agar shrift kursiv bo'lsa, true qiymatini qaytaradi, aks holda false.

13.10-rasm | Shriftga oid usullar va konstantalar. (2-qismning 1-qismi.)

13.9-rasm | JColorChooser muloqot oynasining HSB va RGB yorliqlari. (2-qismning 2-qismi.)

Tanlash uchun slayderlar


qizil, yashil
va ko'k rang
komponentlar

13.4 Shriftlarni boshqarish 567

Class Shrift konstruktori uchta argumentni oladi - shrift nomi, shrift uslubi va shrift
hajmi. Shrift nomi hozirda dastur ishlaydigan tizim tomonidan qo'llab-quvvatlanadigan har qanday shriftdir
Monospaced, SansSerif va Serif kabi standart Java shriftlari ishlayapti. Shrift uslubi
Font.PLAIN, Font.ITALIC yoki Font.BOLD (har biri Shrift sinfining statik maydonidir). Shrift
uslublar kombinatsiyalangan holda ishlatilishi mumkin (masalan, Font.ITALIC + Font.BOLD). Shrift o'lchami o'rtacha
ball bilan aniqlandi. Nuqta 1/72 dyuymga teng. SetFont grafik usuli joriyni o'rnatadi
chizilgan shrift - matn ko'rsatiladigan shrift - uning Shrift argumentiga.

Shakllarning qo'llanilishi. 13.11–13.12 matnlarni har biri bilan to'rt xil shriftda ko'rsatadi


boshqa o'lchamdagi shrift. 13.11-rasmda Shrift obyektlarini ishga tushirish uchun Shrift konstruktoridan foydalanilgan (in
17, 21, 25 va 30 satrlar), ularning har biri o'zgartirish uchun setFont Grafik usuliga o'tkaziladi.
chizilgan shrift. Shrift konstruktoriga har bir qo'ng'iroq shrift nomini o'tkazadi (Serif, Monospaced yoki
SansSerif) qator, shrift uslubi (Font.PLAIN, Font.ITALIC yoki Font.BOLD) va shrift sifatida
hajmi. SetFont Grafik usuli chaqirilgandan so'ng, qo'ng'iroqdan keyin ko'rsatiladigan barcha matn paydo bo'ladi
shrift o'zgartirilgunga qadar yangi shriftda paydo bo'ladi. Har bir shrift haqidagi ma'lumotlar ko'rsatiladi
DrawString usuli yordamida 18, 22, 26 va 31-32 qatorlar. Chizish uchun o'tkazilgan koordinatalar -
String shriftning asosiy chizig'ining pastki chap burchagiga to'g'ri keladi. 29-qatorni o'zgartiradi
rangni qizilga chizish, shuning uchun keyingi ko'rsatilgan satr qizil rangda ko'rinadi. 31-32 qatorlar ma'lumotlarni ko'rsatadi
yakuniy Shrift ob'ekti haqida ma'lumot. Graphics sinfining getFont usuli Shriftni qaytaradi
joriy shriftni ifodalovchi ob'ekt. getName usuli joriy shrift nomini a sifatida qaytaradi
ip. getSize usuli shrift hajmini nuqtalarda qaytaradi.

13.12-rasmda Shriftni ko'rsatish uchun JFrame yaratuvchi asosiy usul mavjud.


JPanel. Grafiklarni aks ettiruvchi ushbu JFrame (15-qator) ga FontJPanel ob'ektini qo'shamiz
13.11-rasmda yaratilgan.

Shriftlarni manipulyatsiya qilishning grafik usullari


public Font getFont() ni ifodalovchi Shrift obyekti havolasini qaytaradi
joriy shrift.
public void setFont(Font f) Joriy shriftni shrift, uslub va o'lchamga o'rnatadi
Shrift ob'ekti havolasi bilan belgilangan f.

Portativlik bo'yicha maslahat 13.2


Shriftlar soni tizimlarda farq qiladi. Java beshta shrift nomini taqdim etadi - Serif, Mono-
intervalli, SansSerif, Dialog va DialogInput — barcha Java platformalarida foydalanish mumkin.
Har bir platformadagi Java ish vaqti muhiti (JRE) ushbu mantiqiy shrift nomlarini moslashtiradi
platformada o'rnatilgan haqiqiy shriftlar. Amaldagi haqiqiy shriftlar platformaga qarab farq qilishi mumkin.

Dasturiy ta'minot muhandisligi kuzatuvi 13.2


Shriftni o'zgartirish uchun siz yangi Shrift ob'ektini yaratishingiz kerak. Shrift ob'ektlari o'zgarmas - sinf
Shriftda joriy shrift xususiyatlarini o'zgartirish uchun belgilangan usullar yo'q.

Usul yoki doimiy tavsif

13.10-rasm | Shriftga oid usullar va konstantalar. (2-qismning 2-qismi.)

568 13-bob Grafika va Java 2D

1 // 13.11-rasm: FontJPanel.java
2 // Turli shriftlar va ranglardagi satrlarni ko'rsatish.
3
4 import java.awt.Color;
5 import java.awt.Graphics;
6 import javax.swing.JPanel;
7
8 umumiy sinf FontJPanel JPanel-ni kengaytiradi
9 {
10 // Stringlarni turli shriftlar va ranglarda ko'rsatish
11 @Bekor qilish
12 umumiy bekor bo'yoq Komponenti (Grafika g)
13 {
14 super.paintComponent(g);
15
16 // shriftni Serif (Vaqt), qalin, 12pt qilib belgilang va satr chizing
17
18 g.drawString("Serif 12 nuqta qalin.", 20, 30);
19
20 // shriftni Monospaced (Courier), kursiv, 24pt qilib belgilang va satr chizing
21
22 g.drawString("Monospaced 24 point italic.", 20, 50);
23
24 // shriftni SansSerif (Helvetica) ga o'rnating, oddiy, 14pt va satr chizing
25
26 g.drawString("SansSerif 14 nuqtali tekis.", 20, 70);
27
28 // shriftni Serif (Vaqt), qalin/kursiv, 18pt qilib belgilang va satr chizing
29 g.setRang(Rangli.QIZIL);
30
31 g.drawString( + " " + +
32 "nuqta qalin kursiv.", 20, 90);
33 }
34 } // FontJPanel klassining oxiri

13.11-rasm | Turli shriftlar va ranglardagi satrlarni ko'rsatish.

1 // 13.12-rasm: Fonts.java
2 // Shriftlardan foydalanish.
3 import javax.swing.JFrame;
4
5 umumiy sinf shriftlari
6 {
7 // dasturni bajarish
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // FontJPanel uchun ramka yaratish
11 JFrame ramkasi = yangi JFrame("Shriftlardan foydalanish");
12 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13
14 FontJPanel fontJPanel = new FontJPanel();
15 frame.add(fontJPanel);

13.12-rasm | Shriftlardan foydalanish. (2-qismning 1-qismi.)

import java.awt.Font;

g.setFont(yangi Shrift("Serif", Font.BOLD, 12));

g.setFont(yangi Shrift("Monospaced", Font.ITALIC, 24));

g.setFont(yangi Shrift("SansSerif", Font.PLAIN, 14));

g.setFont(yangi Shrift("Serif", Font.BOLD + Shrift.ITALIC, 18));
g.getFont().getName() g.getFont().getSize()

13.4 Shriftlarni boshqarish 569

Shrift ko'rsatkichlari
Ba'zan joriy chizilgan shrift haqida ma'lumot olish kerak bo'ladi, masalan, uning
nomi, uslubi va hajmi. Shrift ma'lumotlarini olish uchun ishlatiladigan bir nechta Shrift usullari umumlashtiriladi
13.10-rasmda. getStyle usuli joriy uslubni ifodalovchi butun son qiymatini qaytaradi.
Qaytariladigan butun son qiymati Font.PLAIN, Font.ITALIC, Font.BOLD yoki kombinatsiyadir.
Font.ITALIC va Font.BOLD millati. getFamily usuli shrift nomini qaytaradi
joriy shrift tegishli bo'lgan oila. Shriftlar oilasining nomi platformaga xosdir.
Joriy shrift uslubini sinab ko'rish uchun shrift usullari ham mavjud va ular ham yig'indisidir.
13.10-rasmda marized. Agar joriy bo'lsa, isPlain, isBold va isItalic usullari rost qaytaradi
shrift uslubi mos ravishda tekis, qalin yoki kursiv.
13.13-rasmda aniqlikni ta'minlaydigan ba'zi umumiy shrift ko'rsatkichlari tasvirlangan
shrift haqidagi ma'lumotlar, masalan, balandlik, tushish (belgidan pastga tushadigan miqdor
asosiy chiziq), ko'tarilish (belgining asosiy chiziqdan yuqoriga ko'tarilgan miqdori) va etakchi (farq-
matnning bir qatorining tushishi va uning ostidagi matn satrining ko'tarilishi o'rtasidagi -
ya'ni qatorlar oralig'i).

FontMetrics klassi shrift ko'rsatkichlarini olishning bir necha usullarini e'lon qiladi. Bular


getFontMetrics usullari va Grafik usuli 13.14-rasmda jamlangan. The
shakllarni qo'llash. 13.15–13.16 shrift ko'rsatkichini olish uchun 13.14-rasmdagi usullardan foydalanadi
ikkita shrift uchun ma'lumot.

16 frame.setSize(420, 150);


17 frame.setVisible(rost);
18 }
19 } // end klassi Shriftlar

13.13-rasm | Shrift ko'rsatkichlari.

13.12-rasm | Shriftlardan foydalanish. (2-qismning 2-qismi.)

balandlikka ko'tarilish

yetakchi

tushish


asosiy chiziq

570 13-bob Grafika va Java 2D

Usul tavsifi

FontMetrics usullari


public int getAscent() Shriftning nuqtalarda ko'tarilishini qaytaradi.
public int getDescent() Shriftning nuqtalarda tushishini qaytaradi.
public int getLeading() Shriftning boshini nuqtalarda qaytaradi.
public int getHeight() Shrift balandligini nuqtalarda qaytaradi.
Shriftning FontMetriklarini olishning grafik usullari
umumiy FontMetrics getFontMetrics()
Joriy chizilgan Shrift uchun FontMetrics obyektini qaytaradi.
umumiy FontMetrics getFontMetrics(Font f)
Belgilangan Shrift argumenti uchun FontMetrics obyektini qaytaradi.

13.14-rasm | Shrift o'lchovlarini olish uchun FontMetrics va Graphics usullari.

1 // 13.15-rasm: MetricsJPanel.java
2 // Shrift ko'rsatkichlarini olish uchun foydali bo'lgan FontMetrics va Graphics usullari.
3 import java.awt.Font;
4
5 import java.awt.Graphics;
6 import javax.swing.JPanel;
7
8 umumiy sinf MetricsJPanel JPanel-ni kengaytiradi
9 {
10 // shrift ko'rsatkichlarini ko'rsatish
11 @Bekor qilish
12 umumiy bekor bo'yoq Komponenti (Grafika g)
13 {
14 super.paintComponent(g);
15
16 g.setFont(yangi Shrift("SansSerif", Font.BOLD, 12));
17
18 g.drawString("Joriy shrift: " + , 10, 30);
19 g.drawString("Ko'tarilish: " + , 10, 45);
20 g.drawString("Topish: " + , 10, 60);
21 g.drawString("Balandlik: " + , 10, 75);
22 g.drawString("Etakchi: " + , 10, 90);
23
24 Shrift shrifti = yangi Shrift("Serif", Font.ITALIC, 14);
25
26 g.setFont(shrift);
27 g.drawString("Joriy shrift: " + shrift, 10, 120);
28 g.drawString("Ko'tarilish: " + , 10, 135);
29 g.drawString("Topish: " + , 10, 150);
30 g.drawString("Balandlik: " + , 10, 165);
31 g.drawString("Etakchi: " + , 10, 180);
32 }
33 } // oxirgi sinf MetricsJPanel

13.15-rasm | Shrift o'lchovlarini olish uchun foydali bo'lgan FontMetrics va Graphics usullari.

import java.awt.FontMetrics;

FontMetrics ko'rsatkichlari = g.getFontMetrics();


g.getFont()
metrics.getAscent()
metrics.getDescent()
metrics.getHeight()
metrics.getLeading()

ko'rsatkichlar = g.getFontMetrics(shrift);

metrics.getAscent()
metrics.getDescent()
metrics.getHeight()
metrics.getLeading()

13.5 Chiziqlar, to'rtburchaklar va tasvirlar chizish 571

13.15-rasmning 16-qatori joriy chizilgan shriftni yaratadi va o'rnatadi SansSerif, qalin,
12 nuqtali shrift. 17-qator FontMetricsni olish uchun getFontMetrics Grafik usulidan foydalanadi
joriy shrift uchun ob'ekt. 18-qator qaytarilgan Shriftning String tasvirini chiqaradi
g.getFont() tomonidan. 19-22 satrlarda ko'tarilish, tushish,
balandligi va shrift uchun yetakchi.
24-qator yangi Serif, kursiv, 14 nuqtali shrift yaratadi. 25-qator ikkinchi versiyasidan foydalanadi
GetFontMetrics grafik usuli, Shrift argumentini qabul qiladi va tegishli qiymatni qaytaradi.
sponding FontMetrics obyekti. 28-31 qatorlar ko'tarilish, tushish, balandlik va etakchilikni oladi
shrift uchun. Shrift ko'rsatkichlari ikki shrift uchun bir oz farq qiladi.
13.5 Chiziqlar, to'rtburchaklar va tasvirlar chizish
Ushbu bo'limda chiziqlar, to'rtburchaklar va tasvirlar chizishning Grafik usullari keltirilgan. The
usullari va ularning parametrlari 13.17-rasmda umumlashtirilgan. Har bir chizish usuli uchun
kenglik va balandlik parametrini talab qiladigan kenglik va balandlik manfiy bo'lmasligi kerak
qiymatlar. Aks holda, shakl ko'rsatilmaydi.

1 // 13.16-rasm: Metrics.java


2 // Shrift ko'rsatkichlarini ko'rsatish.
3 import javax.swing.JFrame;
4
5 umumiy sinf ko'rsatkichlari
6 {
7 // dasturni bajarish
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // MetricsJPanel uchun ramka yaratish
11 JFrame ramkasi = yangi JFrame("ShriftMetriklarini ko'rsatish");
12 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13
14 MetricsJPanel metricsJPanel = new MetricsJPanel();
15 frame.add(metricsJPanel);
16 frame.setSize(510, 240);
17 frame.setVisible(rost);
18 }
19 } // yakuniy sinf ko'rsatkichlari

13.16-rasm | Shrift ko'rsatkichlari ko'rsatilmoqda.


572 13-bob Grafika va Java 2D

Usul tavsifi

public void drawLine(int x1, int y1, int x2, int y2)


(x1, y1) nuqta va (x2, y2) nuqta o'rtasida chiziq chiziladi.
public void drawRect(int x, int y, int width, int height)
Belgilangan kenglik va balandlikdagi to'rtburchak chizadi. To'rtburchakning yuqori chap tomoni
burchak (x, y) da joylashgan. yordamida faqat to'rtburchakning konturi chiziladi
Grafik ob'ektning rangi - to'rtburchakning tanasi bu rang bilan to'ldirilmagan.
public void fillRect (int x, int y, int eni, int balandligi)
Belgilangan kenglikdagi joriy rangda to'ldirilgan to'rtburchak chizadi va
balandlik. To'rtburchakning yuqori chap burchagi (x, y) da joylashgan.
public void clearRect (int x, int y, int width, int height)
Joriyda belgilangan kenglik va balandlik bilan to'ldirilgan to'rtburchak chizadi
fon rangi. To'rtburchakning yuqori chap burchagi (x, y) da joylashgan. Bu
Agar rasmning bir qismini olib tashlamoqchi bo'lsangiz, usul foydalidir.
public void drawRoundRect(int x, int y, int eni, int balandligi, int arcWidth,
int archHeight)
Joriy rangda ko'rsatilgan bilan yumaloq burchakli to'rtburchaklar chizadi
kengligi va balandligi. arcWidth va arcHeight yaxlitlashni aniqlaydi
burchaklar (13.20-rasmga qarang). Shaklning faqat konturi chiziladi.
public void fillRoundRect(int x, int y, int eni, int balandligi, int arcWidth,
int archHeight)
Joriy rangda burchaklari yumaloq bo‘lgan, to‘ldirilgan to‘rtburchak chiziladi.
aniqlangan kenglik va balandlik. arcWidth va arcHeight yaxlitlashni aniqlaydi
burchaklarning (13.20-rasmga qarang).
public void draw3DRect(int x, int y, int width, int balandligi, mantiqiy b)
Belgilangan rang bilan uch o'lchamli to'rtburchak chizadi
kengligi va balandligi. To'rtburchakning yuqori chap burchagi (x, y) da joylashgan. to'rtburchak -
gle b rost bo'lganda ko'tarilgan va b noto'g'ri bo'lsa pastroq ko'rinadi. Faqat kontur
shakli chiziladi.
public void fill3DRect(int x, int y, int eni, int balandligi, mantiqiy b)
To'ldirilgan uch o'lchamli to'rtburchakni joriy rangda maxsus belgi bilan chizadi.
belgilangan kenglik va balandlik. To'rtburchakning yuqori chap burchagi (x, y) da joylashgan. The
to'rtburchak b rost bo'lganda ko'tarilgan va b noto'g'ri bo'lsa pastga tushirilgan ko'rinadi.
public void drawOval(int x, int y, int width, int height)
Belgilangan kenglik va balandlik bilan joriy rangda oval chizadi. The
chegaralovchi to'rtburchakning yuqori chap burchagi (x, y) da joylashgan. Oval to'rttasiga tegadi
har bir tomonning markazida chegaralovchi to'rtburchakning tomonlari (13.21-rasmga qarang). Faqat
shaklning konturi chiziladi.
umumiy boʻshliqni toʻldirishOval(int x, int y, int kengligi, int balandligi)
Belgilangan kenglik va balandlik bilan joriy rangda to'ldirilgan ovalni chizadi.
Chegaralovchi toʻrtburchakning yuqori chap burchagi (x, y) da joylashgan. Oval tegadi
chegaralovchi to'rtburchakning barcha to'rt tomonining markazi (13.21-rasmga qarang).

13.17-rasm | Chiziqlar, to'rtburchaklar va tasvirlar chizishning grafik usullari.


13.5 Chiziqlar, to'rtburchaklar va tasvirlar chizish 573

Shakllarning qo'llanilishi. 13.18–13.19 turli xil chiziqlar chizishni ko'rsatadi, to'g'ri burchakli
gles, uch o'lchamli to'rtburchaklar, yumaloq to'rtburchaklar va tasvirlar. 13.18-rasmda 17-qator
qizil chiziq chizadi, 20-chiziq bo'sh ko'k to'rtburchak chizadi va 21-chiziq to'ldirilgan ko'k to'rtburchak chizadi.
burchak. FillRoundRect (24-satr) va drawRoundRect (25-qator) toʻrtburchaklar chizish usullari
yumaloq burchaklar bilan. Ularning dastlabki ikkita argumenti yuqori chap tomonning koordinatalarini belgilaydi
chegaralovchi to'rtburchakning burchagi - yumaloq to'rtburchak chizilgan maydon.
Yuqori chap burchak koordinatalari yumaloq to'rtburchakning cheti emas, balki
Agar to'rtburchaklar kvadrat burchaklarga ega bo'lsa, chekka qayerda bo'lardi? Uchinchi va to'rtinchi
argumentlar to'rtburchakning kengligi va balandligini belgilaydi. Oxirgi ikkita dalil to'xtatadi
yoyning gorizontal va vertikal diametrlarini qazib oling (ya'ni, yoy kengligi va yoy balandligi)
burchaklarni ifodalash uchun ishlatiladi.
13.20-rasmda dumaloq to'rtburchakning yoy kengligi, yoy balandligi, kengligi va balandligi ko'rsatilgan.
Yoy kengligi va yoy balandligi uchun bir xil qiymatdan foydalanish har birida chorak doira hosil qiladi

1 // 13.18-rasm: LinesRectsOvalsJPanel.java


2 // Chiziqlar, to'rtburchaklar va tasvirlar chizish.
3 import java.awt.Color;
4 import java.awt.Graphics;
5 import javax.swing.JPanel;
6
7 umumiy sinf LinesRectsOvalsJPanel JPanel-ni kengaytiradi
8 {
9 // turli xil chiziqlar, to'rtburchaklar va ovallarni ko'rsatish
10 @Bekor qilish
11 umumiy bekor bo'yoq Komponenti (Grafika g)
12 {
13 super.paintComponent(g);
14 this.setBackground(Color.WHITE);
15
16 g.setRang(Rangli.QIZIL);
17
18
19 g.setRang(Rangli.BLUE);
20
21
22
23 g.to‘plamColor(Color.CYAN);
24
25
26
27 g.setRang(Rang.GREEN);
28
29
30
31 g.setColor(Color.MAGENTA);
32
33
34 }
35 } // oxirgi sinf LinesRectsOvalsJPanel

13.18-rasm | Chiziqlar, to'rtburchaklar va tasvirlar chizish.

g.drawLine(5, 30, 380, 30);

g.drawRect(5, 40, 90, 55);


g.fillRect(100, 40, 90, 55);

g.fillRoundRect(195, 40, 90, 55, 50, 50);


g.drawRoundRect(290, 40, 90, 55, 20, 20);

g.draw3DRect(5, 100, 90, 55, rost);


g.fill3DRect(100, 100, 90, 55, noto'g'ri);

g.drawOval(195, 100, 90, 55);


g.fillOval(290, 100, 90, 55);

574 13-bob Grafika va Java 2D

1 // 13.19-rasm: LinesRectsOvals.java
2 // Testing LinesRectsOvalsJPanel.
3 import java.awt.Color;
4 import javax.swing.JFrame;
5
6 ommaviy sinf LinesRectsOvals
7 {
8 // dasturni bajarish
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 // LinesRectsOvalsJPanel uchun ramka yarating
12 JFrame ramkasi =
13 ta yangi JFrame ("Chiziqlar, to'rtburchaklar va tasvirlar chizish");
14 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15
16 satrRectsOvalsJPanel chiziqlarRectsOvalsJPanel =
17 ta yangi LinesRectsOvalsJPanel();
18 satrRectsOvalsJPanel.setBackground(Color.WHITE);
19 frame.add(linesRectsOvalsJPanel);
20 frame.setSize(400, 210);
21 frame.setVisible(rost);
22 }
23 } // oxirgi sinf LinesRectsOvals

13.19-rasm | Sinov qatorlariRectsOvalsJPanel.

13.20-rasm | Dumaloq to'rtburchaklar uchun yoy kengligi va yoy balandligi.

drawRect


chizilgan chiziq

to'ldirishRect

draw3DRect

fill3DRect

fillRoundRect

drawRoundRect


chizishOval

to'ldirishOval

kengligi

(x,y)


yoy balandligi
yoy kengligi

balandligi


13.6 Yoylarni chizish 575

burchak. Yoyning kengligi, yoy balandligi, kengligi va balandligi bir xil qiymatlarga ega bo'lganda, natija
aylana hisoblanadi. Agar kenglik va balandlik qiymatlari bir xil bo'lsa va arcWidth va qiymatlari
arcHeight 0, natija kvadratdir.
Dra3DRect (13.18-rasm, 28-satr) va fill3DRect (29-qator) usullari bir xil bo'ladi.
argumentlar. Birinchi ikkitasi to'rtburchakning yuqori chap burchagini belgilaydi. Keyingi ikkita bahs -
ments mos ravishda to'rtburchakning kengligi va balandligini belgilaydi. Oxirgi dalil to'xtatadi -
to'rtburchak ko'tarilgan (to'g'ri) yoki tushirilgan (noto'g'ri) bo'ladimi, minalar. Uch o'lchovli
draw3DRect effekti asl rangdagi to'rtburchakning ikki qirrasi va ikkitasi sifatida namoyon bo'ladi
qirralari biroz quyuqroq rangda. fill3DRect ning uch o'lchovli effekti ikkita sifatida ko'rinadi
to'rtburchakning chetlari asl chizma rangida va plomba va boshqa ikkita chetida a
biroz quyuqroq rang. Ko'tarilgan to'rtburchaklar tepada asl chizilgan rang qirralariga ega va
to'rtburchakning chap tomonida. Pastga tushirilgan to'rtburchaklar asl chizma rangidagi qirralarga ega
to'rtburchakning pastki va o'ng tomonida. Ba'zilarida uch o'lchovli effektni ko'rish qiyin
ranglar.
DrawOval va fillOval usullari (32-33-qatorlar) bir xil to'rtta argumentni oladi. The
birinchi ikkitasi ovalni o'z ichiga olgan chegaralovchi to'rtburchakning yuqori chap koordinatasini belgilaydi.
Oxirgi ikkitasi mos ravishda chegaralovchi to'rtburchakning kengligi va balandligini belgilaydi.
13.21-rasmda to'rtburchak bilan chegaralangan oval ko'rsatilgan. Oval to'rttasining markaziga tegadi
chegaralovchi to'rtburchakning tomonlari. (Chekuvchi toʻrtburchak ekranda koʻrsatilmaydi.)

13.6 Yoylarni chizish


Ovalning bir qismi sifatida yoy chizilgan. Ark burchaklari darajalarda o'lchanadi. Yoylarni supurish
(ya'ni, egri chiziq bo'ylab harakatlanish) belgilangan darajalar soni orqali boshlang'ich burchakdan
ularning yoy burchagi bo'yicha. Boshlanish burchagi yoyning qayerdan boshlanishini darajalarda ko'rsatadi. yoy
burchak yoy o'tadigan darajalarning umumiy sonini belgilaydi. 13.22-rasm il-
ikkita yoyni lyustrasiya qiladi. Chap o'qlar to'plami nol darajadan taxminan gacha bo'lgan yoyni ko'rsatadi.
taxminan 110 daraja. Soat miliga teskari yo'nalishda harakatlanadigan yoylar o'lchanadi
ijobiy darajalar. O'ng tarafdagi o'qlar to'plami nol darajadan tortib to yoyni ko'rsatadi
taxminan -110 daraja. Soat yo'nalishi bo'yicha aylanuvchi yoylar negativ tarzda o'lchanadi.
ijodiy darajalar. 13.22-rasmdagi yoylar atrofidagi chiziqli qutilarga e'tibor bering. Yoy chizishda,
oval uchun chegaralovchi to'rtburchakni belgilaymiz. Yoy ovalning bir qismi bo'ylab supurib ketadi.
Yoylarni chizish uchun drawArc va fillArc grafik usullari 13.23-rasmda umumlashtirilgan.

13.21-rasm | To'rtburchak bilan chegaralangan oval.

(x,y)

kengligi


balandlik

576 13-bob Grafika va Java 2D

13.24-13.25-rasmlar 13.23-rasmdagi yoy usullarini ko'rsatadi. Ilova
oltita yoyni tortadi (uchtasi to'ldirilmagan va uchtasi to'ldirilgan). Chegaralovchi to'rtburchakni tasvirlash uchun
yoy qaerda paydo bo'lishini aniqlashga yordam beradi, birinchi uchta yoy qizil to'g'ri chiziq ichida ko'rsatiladi.
yoylar bilan bir xil x, y, kenglik va balandlik argumentlariga ega bo'lgan burchak.

13.22-rasm | Ijobiy va manfiy yoy burchaklari.

Usul tavsifi

public void drawArc(int x, int y, int width, int height, int startAngle,


ichki yoy burchagi)
Chegaralovchi toʻrtburchakning yuqori chap tomonidagi x va y koordinatasiga nisbatan yoy chizadi.
belgilangan kenglik va balandlikka ega. Yoy segmenti boshlab chiziladi
startAngle at va arcAngle darajalarini supuradi.
public void fillArc(int x, int y, int eni, int balandligi, int startAngle,
ichki yoy burchagi)
Chegaralovchi toʻrtburchakning yuqori chap tomoniga nisbatan toʻldirilgan yoyni (yaʼni, sektor) chizadi
belgilangan kenglik va balandlikdagi x va y koordinatalari. Ark segmenti
startAngle dan boshlab chiziladi va arcAngle darajalarini supuradi.

13.23-rasm | Yoylarni chizishning grafik usullari.

1 // 13.24-rasm: ArcsJPanel.java
2 // DrawArc va fillArc bilan ko'rsatilgan yoylar.
3 import java.awt.Color;
4 import java.awt.Graphics;
5 import javax.swing.JPanel;
6
7 ommaviy sinf ArcsJPanel JPanel-ni kengaytiradi
8 {
9 // to'rtburchaklar va yoylarni chizish
10 @Bekor qilish
11 umumiy bekor bo'yoq Komponenti (Grafika g)
12 {
13 super.paintComponent(g);
14

13.24-rasm | Yoylar drawArc va fillArc bilan ko'rsatiladi. (2-qismning 1-qismi.)

90º

270º


Ijobiy burchaklar

180º 0º


90º

270º


Salbiy burchaklar

180º 0º

13.6 Yoylarni chizish 577

15 // 0 dan boshlang va 360 daraja supuring


16 g.setRang(Rangli.QIZIL);
17 g.drawRect(15, 35, 80, 80);
18 g.setRang(Rangli.QORA);
19
20
21 // 0 dan boshlang va 110 daraja supuring
22 g.setRang(Rangli.QIZIL);
23 g.drawRect(100, 35, 80, 80);
24 g.setRang(Rangli.QORA);
25
26
27 // 0 dan boshlang va -270 daraja supuring
28 g.setRang(Rangli.QIZIL);
29 g.drawRect(185, 35, 80, 80);
30 g.setRang(Rang.Qora);
31
32
33 // 0 dan boshlang va 360 daraja supuring
34
35
36 // 270 dan boshlanadi va -90 daraja supurib tashlang
37
38
39 // 0 dan boshlang va -270 daraja supuring
40
41 }
42 } // oxirgi sinf ArcsJPanel

1 // 13.25-rasm: DrawArcs.java


2 // Yoylarni chizish.
3 import javax.swing.JFrame;
4
5 umumiy sinf DrawArcs
6 {
7 // dasturni bajarish
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // ArcsJPanel uchun ramka yaratish
11 JFrame ramkasi = yangi JFrame ("Yonlarni chizish");
12 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13
14 ArcsJPanel arcsJPanel = new ArcsJPanel();
15 frame.add(arcsJPanel);
16 frame.setSize(300, 210);
17 frame.setVisible(rost);
18 }
19 } // DrawArcs sinfini yakunlash

13.25-rasm | Yoylarni chizish. (2-qismning 1-qismi.)

13.24-rasm | Yoylar drawArc va fillArc bilan ko'rsatiladi. (2-qismning 2-qismi.)

g.drawArc(15, 35, 80, 80, 0, 360);

g.drawArc(100, 35, 80, 80, 0, 110);

g.drawArc(185, 35, 80, 80, 0, -270);

g.fillArc(15, 120, 80, 40, 0, 360);

g.fillArc(100, 120, 80, 40, 270, -90);

g.fillArc(185, 120, 80, 40, 0, -270);

578 13-bob Grafika va Java 2D

13.7 Ko‘pburchaklar va poliliniyalarni chizish
Ko'pburchaklar to'g'ri chiziqli segmentlardan tashkil topgan yopiq ko'p qirrali shakllardir. Poliliniyalar se-
bog'langan nuqtalar ketma-ketligi. 13.26-rasmda ko'pburchaklarni chizish usullari va
poliliniyalar. Ba'zi usullar Polygon ob'ektini talab qiladi (java.awt paketi). Poligonlar sinfi
konstruktorlar 13.26-rasmda ham tasvirlangan. Shakllarning qo'llanilishi. 13.27–13.28 durang
ko'pburchaklar va ko'p chiziqlar.

Usul tavsifi

Ko'pburchaklarni chizishning grafik usullari
public void drawPolygon(int[] xPoints, int[] yPoints, int ball)
Ko‘pburchak chizadi. Har bir nuqtaning x-koordinatasi xPoints-da ko'rsatilgan
massiv va yPoints massividagi har bir nuqtaning y-koordinatasi. Oxirgi bahs-
ment nuqtalar sonini belgilaydi. Bu usul yopiq ko'pburchak chizadi. Agar
oxirgi nuqta birinchisidan farq qiladi, ko'pburchak shunday chiziq bilan yopiladi
oxirgi nuqtani birinchisiga bog'laydi.
public void drawPolyline(int[] xPoints, int[] yPoints, int ball)
Bog'langan chiziqlar ketma-ketligini chizadi. Har bir nuqtaning x koordinatasi aniq
xPoints massivida va yPointsdagi har bir nuqtaning y-koordinatasida aniqlangan
massiv. Oxirgi argument nuqtalar sonini belgilaydi. Agar oxirgi nuqta bo'lsa
birinchisidan farqli o'laroq, poliliniya yopiq emas.
umumiy bekor chizilganPoligon(Polygon p)
Belgilangan ko'pburchakni chizadi.
umumiy boʻshliqni toʻldirishPolygon(int[] xPoints, int[] yPoints, int nuqtalari)
To‘ldirilgan ko‘pburchak chizadi. Har bir nuqtaning x-koordinatasi da ko'rsatilgan
xPoints massivi va yPoints massividagi har bir nuqtaning y-koordinatasi. The
oxirgi argument nuqtalar sonini belgilaydi. Bu usul yopiq chizilgan
poligon. Agar oxirgi nuqta birinchisidan farq qiladigan bo'lsa, ko'pburchak a bilan yopiladi
oxirgi nuqtani birinchisiga bog'laydigan chiziq.
umumiy boʻshliqni toʻldirishPoligon (koʻpburchak p)
Belgilangan to'ldirilgan ko'pburchakni chizadi. Poligon yopiq.

13.26-rasm | Ko'pburchaklar uchun grafik usullar va sinf Poligon usullari. (2-qismning 1-qismi.)

13.25-rasm | Yoylarni chizish. (2-qismning 2-qismi.)

13.7 Ko‘pburchaklar va ko‘p chiziqli chiziqlarni chizish 579

Ko‘pburchak konstruktorlari va usullari
ommaviy poligon()
Yangi ko'pburchak ob'ektini quradi. Ko'pburchakda hech qanday nuqta yo'q.
umumiy koʻpburchak(int[] xValues, int[] yValues, int numberOfPoints)
Yangi ko'pburchak ob'ektini quradi. Ko'pburchakning soniOfPoints tomonlari bor,
har bir nuqta bilan xValues dan x-koordinata va y-koordinatadan iborat
yValues dan nate.
public void addPoint(int x, int y)
Ko'pburchakga x va y koordinatalarining juftlarini qo'shadi.

1 // 13.27-rasm: PolygonsJPanel.java


2 // Ko'pburchaklarni chizish.
3 import java.awt.Graphics;
4
5 import javax.swing.JPanel;
6
7 umumiy sinf PolygonsJPanel JPanel-ni kengaytiradi
8 {
9 // ko'pburchak va ko'p chiziq chizish
10 @Bekor qilish
11 umumiy bekor bo'yoq Komponenti (Grafika g)
12 {
13 super.paintComponent(g);
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

13.27-rasm | Ko'pburchaklar drawPolygon va fillPolygon bilan ko'rsatiladi. (2-qismning 1-qismi.)

Usul tavsifi

13.26-rasm | Ko'pburchaklar uchun grafik usullar va sinf Poligon usullari. (2-qismning 2-qismi.)

import java.awt.Polygon;

// Polygon ob'ekti bilan ko'pburchak chizish


int[] xValues = {20, 40, 50, 30, 20, 15};
int[] yValues = {50, 50, 60, 80, 80, 60};
Ko'pburchak ko'pburchak1 = yangi Ko'pburchak(xValues, yValues, 6);
g.drawPolygon(poligon1);

// ikkita massiv bilan poliliniyalarni chizish


int[] xValues2 = {70, 90, 100, 80, 70, 65, 60};
int[] yValues2 = {100, 100, 110, 110, 130, 110, 90};
g.drawPolyline(xValues2, yValues2, 7);

// ko'pburchakni ikkita massiv bilan to'ldirish


int[] xValues3 = {120, 140, 150, 190};
int[] yValues3 = {40, 70, 80, 60};
g.fillPolygon(xValues3, yValues3, 4);

// Polygon ob'ekti bilan to'ldirilgan ko'pburchak chizish


Ko'pburchak poligon2 = yangi Poligon();
polygon2.addPoint(165, 135);
polygon2.addPoint(175, 150);
polygon2.addPoint(270, 200);

580 13-bob Grafika va Java 2D

13.27-rasmning 16-17-qatorlari ikkita int massivni yaratadi va ulardan nuqtalarni belgilash uchun foydalaning.
Ko‘pburchak ko‘pburchak1. 18-qatordagi Polygon konstruktor chaqiruvi xValues massivini oladi, bu esa
har bir nuqtaning x-koordinatasini o'z ichiga oladi; y-koordinatasini o'z ichiga olgan yValues massivi
har bir nuqtadan; va 6 (ko'pburchakdagi nuqtalar soni). 19-qatorda ko'pburchak 1 by ko'rsatiladi
uni argument sifatida DrawPolygon Graphics usuliga o'tkazish.
22-23 qatorlar ikkita int massiv yaratadi va ulardan bir qator nuqtalarni belgilash uchun foydalaning.
bog'langan chiziqlar. XValues2 massivida har bir nuqta va massivning x-koordinatalari mavjud
yQiymatlar2 har bir nuqtaning y-koordinatasi. 24-qatorda drawPolyline Graphics usulidan foydalaniladi

36
37


38
39 }
40 } // yakuniy sinf PolygonsJPanel

1 // 13.28-rasm: DrawPolygons.java


2 // Ko'pburchaklarni chizish.
3 import javax.swing.JFrame;
4
5 ta ochiq sinf DrawPolygons
6 {
7 // dasturni bajarish
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // PolygonsJPanel uchun ramka yaratish
11 JFrame ramkasi = yangi JFrame ("Ko'pburchaklarni chizish");
12 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13
14 ko‘pburchaklarJPanel ko‘pburchaklariJPanel = yangi PoligonlarJPanel();
15 frame.add(polygonsJPanel);
16 frame.setSize(280, 270);
17 frame.setVisible(rost);
18 }
19 } // DrawPolygons klassining oxiri

13.28-rasm | Ko'pburchaklarni chizish.

13.27-rasm | Ko'pburchaklar drawPolygon va fillPolygon bilan ko'rsatiladi. (2-qismning 2-qismi.)

polygon2.addPoint(200, 220);


polygon2.addPoint(130, 180);
g.fillPolygon(poligon2);

18-qator natijasi

23-qator natijasi

28-qator natijasi

37-qator natijasi

13.8 Java 2D API 581

xValues2, yValues2 va argumentlar bilan belgilangan ulangan qatorlarni ko'rsatish
7 (ballar soni).
27–28 qatorlar ikkita int massiv hosil qiladi va ulardan ko'pburchak nuqtalarini belgilash uchun foydalaning.
XValues3 massivi har bir nuqtaning x-koordinatasini va yValues3 massivida y-koordinatasini o'z ichiga oladi.
har bir nuqtaning tabiati. 29-satr Grafik to'ldirish usuliga o'tish orqali ko'pburchakni ko'rsatadi.
Ikki massivni (xValues3 va yValues3) va chiziladigan nuqtalar sonini (4) poligonga aylantiring.

32-qator nuqtalarsiz ko'pburchak 2 hosil qiladi. 33-37 qatorlarda Poligon usuli qo'llaniladi


Ko'pburchakga x va y koordinatalarini qo'shish uchun addPoint. 38-qatorda Poligon ko'rsatiladi
polygon2 fillPolygon Grafik usuliga o'tkazish orqali.
13.8 Java 2D API
Java 2D API dastur uchun ilg'or ikki o'lchovli grafik imkoniyatlarini taqdim etadi.
batafsil va murakkab grafik manipulyatsiyalarni talab qiluvchi mers. API xususiyatlari o'z ichiga oladi
java.awt, java.awt.image, ja- paketlardagi chizmalar, matn va tasvirlarni qayta ishlash uchun
va.awt.color, java.awt.font, java.awt.geom, java.awt.print va java.awt.im-
yoshi.renderable. API imkoniyatlari bu darslikda yoritib berish uchun juda keng. Uchun
umumiy koʻrinish uchun http://docs.oracle.com/javase/7/docs/technotes/guides/2d/ tashrif buyuring. In
Ushbu bo'limda biz bir nechta Java 2D imkoniyatlarini ko'rib chiqamiz.
Java 2D API bilan chizish Graphics2D havolasi (paket
java.awt). Graphics2D Graphics sinfining mavhum kichik sinfidir, shuning uchun u barcha grafiklarga ega
Ushbu bobda ilgari ko'rsatilgan imkoniyatlar. Aslida, haqiqiy ob'ekt chizish uchun ishlatilgan
har bir paintComponent usuli Graphics2D ning quyi sinfiga o'tkaziladigan namunadir
paintComponent usuli va Grafika superklassi orqali kirish mumkin. Graphics2D ga kirish uchun
imkoniyatlarga ega bo'lsak, paintComponent-ga o'tkazilgan Grafik ma'lumotnomasini (g) a ga o'tkazishimiz kerak
kabi bayonot bilan Graphics2D havolasi

Keyingi ikkita misolda ushbu texnikadan foydalaniladi.


Chiziqlar, to'rtburchaklar, dumaloq to'rtburchaklar, yoylar va ellipslar
Ushbu misol java.awt.geom paketidan bir nechta Java 2D shakllarini ko'rsatadi, shu jumladan:
Line2D.Double, Rectangle2D.Double, RoundRectangle2D.Double, Arc2D.Double
va Ellipse2D.Double. Har bir sinf nomining sintaksisiga e'tibor bering. Har bir sinf shaklni ifodalaydi
ikki tomonlama qiymatlar sifatida belgilangan o'lchamlar bilan. Har birining alohida versiyasi mavjud
float qiymatlari bilan (masalan, Ellipse2D.Float). Har bir holatda Double umumiy statik ichki joylashadi
nuqtaning chap tomonida ko'rsatilgan sinf sinfi (masalan, Ellipse2D). Statik ichki joydan foydalanish uchun
sinf, biz shunchaki uning nomini tashqi sinf nomi bilan kvalifikatsiya qilamiz.
Shakllarda. 13.29–13.30, biz Java 2D shakllarini chizamiz va ularning chizma xususiyatlarini o'zgartiramiz.
tics, masalan, chiziq qalinligini o'zgartirish, shakllarni naqshlar bilan to'ldirish va chiziqli chiziqlarni chizish.
Bular Java 2D tomonidan taqdim etilgan ko'plab imkoniyatlardan faqat bir nechtasi.

Umumiy dasturlash xatosi 13.1


ArrayIndexOutOfBoundsException o'rnatiladi, agar nuqtalar soni ko'rsatilgan bo'lsa
drawPolygon usuli yoki fillPolygon usulining uchinchi argumenti sondan katta.
ko'rsatish uchun ko'pburchakni belgilaydigan koordinatalar massivlaridagi elementlardan iborat.

Graphics2D g2d = (Graphics2D) g;


582 13-bob Grafika va Java 2D

13.29-rasmning 25-qatori paintComponent tomonidan qabul qilingan Grafik ma'lumotnomasini
Graphics2D havolasi va Java 2D xususiyatlaridan foydalanishga ruxsat berish uchun uni g2d ga tayinlaydi.

1 // 13.29-rasm: ShapesJPanel.java


2 // Ba'zi Java 2D shakllarini namoyish qilish.
3 import java.awt.Color;
4 import java.awt.Graphics;
5
6
7
8 import java.awt.Rectangle;
9
10
11
12
13
14
15
16 import javax.swing.JPanel;
17
18 ommaviy sinf ShapesJPanel JPanel-ni kengaytiradi
19 {
20 // Java 2D API yordamida shakllarni chizish
21 @Bekor qilish
22 umumiy bekor bo'yoq Komponenti (Grafika g)
23 {
24 super.paintComponent(g);
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 // buffImage-dan Graphics2D-ni oling va ustiga chizing
42
43 gg.setColor(Color.YELLOW);
44 gg.fillRect(0, 0, 10, 10);
45 gg.setColor(Color.BLACK);
46 gg.drawRect(1, 1, 6, 6);
47 gg.setColor(Color.BLUE);
48 gg.fillRect(1, 1, 3, 3);
49 gg.setColor(Color.RED);

13.29-rasm | Ba'zi Java 2D shakllarini namoyish qilish. (2-qismning 1-qismi.)

import java.awt.BasicStroke;
import java.awt.GradientPaint;
import java.awt.TexturePaint;

import java.awt.Graphics2D;


import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.geom.Arc2D;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;

Graphics2D g2d = (Graphics2D) g; // g Graphics2D ga o'tkazing

// ko'k-sariq gradient bilan to'ldirilgan 2D ellipsni chizish
g2d.setPaint(yangi GradientPaint(5, 30, Color.BLUE, 35, 100,
Rang.SARI, rost));
g2d.fill(yangi Ellipse2D.Double(5, 30, 65, 100));

// qizil rangda 2D to'rtburchak chizish


g2d.setPaint(Color.RED);
g2d.setStroke(yangi BasicStroke(10.0f));
g2d.draw(yangi Rectangle2D.Double(80, 30, 65, 100));

// buferlangan fon bilan 2D yumaloq to'rtburchak chizish


BufferedImage buffImage = yangi BufferedImage (10, 10,
BufferedImage.TYPE_INT_RGB);

Graphics2D gg = buffImage.createGraphics();


13.8 Java 2D API 583

50 gg.fillRect(4, 4, 3, 3); // to'ldirilgan to'rtburchak chizish
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 // kontur yordamida 2D chiziq chizish
69 ta float[] tire = {10}; // chiziqcha naqshini belgilang
70 g2d.setPaint(Color.YELLOW);
71 g2d.setStroke(yangi BasicStroke(4, BasicStroke.CAP_ROUND,
72 BasicStroke.JOIN_ROUND, 10, tire, 0));
73 g2d.draw(yangi Line2D.Double(320, 30, 395, 150));
74 }
75 } // oxirgi sinf ShapesJPanel

1 // 13.30-rasm: Shakllar.java


2 // Shakllarni sinab ko'rishJPanel.
3 import javax.swing.JFrame;
4
5 ommaviy sinf shakllari
6 {
7 // dasturni bajarish
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // ShapesJPanel uchun ramka yaratish
11 JFrame ramkasi = yangi JFrame("2D shakllarni chizish");
12 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13
14 // ShapesJPanel yarating
15 ShaklJPanel shakllariJPanel = yangi ShakllarJPanel();
16
17 frame.add(shapesJPanel);
18 frame.setSize(425, 200);
19 frame.setVisible(rost);
20 }
21 } // oxirgi sinf Shakllar

13.30-rasm | Shakllarni sinab ko'rish JPanel. (2-qismning 1-qismi.)

13.29-rasm | Ba'zi Java 2D shakllarini namoyish qilish. (2-qismning 2-qismi.)

// JFrame-ga buffImage rasmini bo'yash


g2d.setPaint(yangi TexturePaint(buffImage,
yangi Rectangle(10, 10)));
g2d.fill(
yangi RoundRectangle2D.Double(155, 30, 75, 100, 50, 50));

// oq rangda 2D pirog shaklidagi yoyni chizish


g2d.setPaint(Color.WHITE);
g2d.setStroke(yangi BasicStroke(6.0f));
g2d.draw(
yangi Arc2D.Double(240, 30, 75, 100, 0, 270, Arc2D.PIE));

// yashil va sariq rangda 2D chiziqlar chizish


g2d.setPaint(Color.GREEN);
g2d.draw(yangi Line2D.Double(395, 30, 320, 150));

584 13-bob Grafika va Java 2D



Ovallar, gradient plomba va ob'ektlarni bo'yash
Biz chizgan birinchi shakl asta-sekin o'zgaruvchan ranglar bilan to'ldirilgan ovaldir. 28-29 qatorlar chaqiriladi
Graphics2D usuli setPaint uchun rangni aniqlaydigan Paint obyektini o'rnatish
ko'rsatish uchun shakl. Paint obyekti java.awt.Paint interfeysini amalga oshiradi. Bu ba'zi bo'lishi mumkin -
13.3-bo'limda (sinf
Rang Paint-ni qo'llaydi) yoki Java 2D API GradientPaint-ning namunasi bo'lishi mumkin,
SystemColor, TexturePaint, LinearGradientPaint yoki RadialGradientPaint sinflari. In
bu holda biz GradientPaint obyektidan foydalanamiz.
GradientPaint klassi asta-sekin o'zgaruvchan ranglarda shaklni chizishga yordam beradi - gra-
ovqatlanish. Bu erda ishlatiladigan GradientPaint konstruktori ettita argumentni talab qiladi. Birinchi ikkitasi
gradient uchun boshlang'ich koordinatalarini belgilang. Uchinchisi boshlang'ich Rangni belgilaydi
gradient. To'rtinchi va beshinchi gradient uchun tugatish koordinatalarini belgilaydi. The
oltinchisi gradient uchun yakuniy Rangni belgilaydi. Oxirgi argument bu yoki yo'qligini aniqlaydi
gradient siklik (to'g'ri) yoki asiklik (noto'g'ri). Ikki koordinatalar to'plami aniqlaydi
gradient yo'nalishi. Chunki ikkinchi koordinata (35, 100) pastga va o'ngga
birinchi koordinatadan (5, 30) gradient pastga va burchak ostida o'ngga tushadi. Chunki
bu gradient tsiklik (to'g'ri), rang ko'kdan boshlanadi, asta-sekin sariq rangga aylanadi, keyin
asta-sekin ko'k rangga qaytadi. Agar gradient asiklik bo'lsa, rang birinchi rangdan o'tadi
belgilangan (masalan, ko'k) ikkinchi rangga (masalan, sariq).
30-qator to'ldirilgan Shakl ob'ektini chizish uchun Graphics2D to'ldirish usulidan foydalanadi - bu ob'ekt
Shakl interfeysini amalga oshiradi (java.awt paketi). Bunday holda, biz ko'rsatamiz
Ellipse2D.Double ob'ekt. Ellipse2D.Double konstruktori to'rtta argumentni oladi
ellipsni ko'rsatish uchun chegaralovchi to'rtburchakni belgilash.
To'rtburchaklar, chiziqlar
Keyinchalik qalin chegara bilan qizil to'rtburchak chizamiz. 33-qatorni o'rnatish uchun setPaint-ni chaqiradi
Ob'ektni Color.RED ga bo'yash. 34-qator belgilarni o'rnatish uchun Graphics2D setStroke usulidan foydalanadi.
to'rtburchaklar chegarasining xususiyatlari (yoki boshqa har qanday shakl uchun chiziqlar). Stroke usuli
o'zining argumenti sifatida Stroke interfeysini amalga oshiradigan ob'ektni talab qiladi (java.awt paketi).
Bunday holda, biz BasicStroke sinfining namunasidan foydalanamiz. Class BasicStroke bir nechtasini taqdim etadi
konstruktorlar chiziqning kengligini, chiziq qanday tugashini (oxirgi qopqoqlar deb ataladi), qanday qilib belgilash uchun
chiziqlar bir-biriga qo'shiladi (chiziq birlashmalari deb ataladi) va chiziqning tire atributlari (agar u chiziqli bo'lsa
chiziq). Bu erda konstruktor chiziqning kengligi 10 piksel bo'lishi kerakligini belgilaydi.
35-qator Shakl ob'ektini chizish uchun Graphics2D chizish usulidan foydalanadi - bu holda, a
Rectangle2D.Double. Rectangle2D.Double konstruktori maxsus argumentlarni oladi.
to'rtburchakning yuqori chap x koordinatasini, yuqori chap y koordinatasini, kengligi va balandligini aniqlash.

13.30-rasm | Shakllarni sinab ko'rish JPanel. (2-qismning 2-qismi.)


13.8 Java 2D API 585



Dumaloq to'rtburchaklar, BufferedImages va TexturePaint obyektlari
Keyin BufferedImage (paket-) da yaratilgan naqsh bilan to'ldirilgan yumaloq to'rtburchak chizamiz.
yoshi java.awt.image) obyekti. 38–39 qatorlar BufferedImage obyektini yaratadi. Sinf buffi -
eredImage-dan rangli va kul rangdagi tasvirlarni yaratish uchun foydalanish mumkin. Bu maxsus
BufferedImage kengligi 10 piksel va balandligi 10 piksel (birinchi ikkita argumentda ko'rsatilgandek)
konstruktordan). Uchinchi argument BufferedImage.TYPE_INT_RGB shuni ko'rsatadiki
tasvir RGB rang sxemasi yordamida rangli saqlanadi.
Dumaloq to'rtburchakning to'ldirish naqshini yaratish uchun biz avval Buferlangan-ga chizishimiz kerak.
Rasm. 42-qator Graphics2D ob'ektini yaratadi (BufferedImage yaratish usulini chaqirish orqali)
Grafika) BufferedImage-ga chizish uchun ishlatilishi mumkin. 43-50 qatorlar qo'llaniladigan usullar
naqsh yaratish uchun setColor, fillRect va drawRect.
53–54 qatorlar Paint obyektini yangi TexturePaint (java.awt paketi) obyektiga o‘rnatadi.
TexturePaint ob'ekti o'zi bilan bog'langan BufferedImage-da saqlangan tasvirdan foydalanadi (birinchi
konstruktor argumenti) toʻldirilgan shakl uchun toʻldirish teksturasi sifatida. Ikkinchi argument spetsifikatsiyasi -
Agar BufferedImage-dan to'rtburchaklar maydoni paydo bo'lsa, u matn orqali takrorlanadi.
tur. Bunday holda, Rectangle bufferedImage bilan bir xil o'lchamda bo'ladi. Biroq, kichikroq
BufferedImage qismidan foydalanish mumkin.
55–56 qatorlar toʻldirilgan Shakl obyektini chizish uchun Graphics2D toʻldirish usulidan foydalanadi — bu holda,
a RoundRectangle2D.Double. RoundRectangle2D.Double sinfi uchun konstruktor
to'rtburchaklar o'lchamlarini va yoy kengligi va yoyni ko'rsatuvchi oltita argumentni oladi
burchaklarning yaxlitlanishini aniqlash uchun ishlatiladigan balandlik.
Yoylar
Keyinchalik qalin oq chiziq bilan pirog shaklidagi yoyni chizamiz. 59-qator Paint obyektini o‘rnatadi
Rang.OQ. 60-qator Stroke ob'ektini kengligi 6 pikselli chiziq uchun yangi BasicStroke-ga o'rnatadi.
61-62 qatorlar Shape ob'ektini chizish uchun Graphics2D chizish usulidan foydalanadi - bu holda
Arc2D.Double. Arc2D.Double konstruktorining dastlabki to'rtta argumenti yuqori-
chap x-koordinata, yuqori chap y-koordinata, chegaralovchi to'rtburchakning kengligi va balandligi
yoy. Beshinchi argument boshlanish burchagini belgilaydi. Oltinchi argument yoyni belgilaydi
burchak. Oxirgi argument yoyning qanday yopilishini bildiradi. Doimiy Arc2D.PIE shuni ko'rsatadi
yoy ikkita chiziq chizish orqali yopiladi - yoyning boshlang'ich nuqtasidan markazga bir chiziq
chegaralovchi to'rtburchakning va chegaralovchi to'rtburchakning markazidan bir chiziq
tugatish nuqtasi. Arc2D klassi yoyning qandayligini aniqlash uchun yana ikkita statik konstantani taqdim etadi
yopiq. Constant Arc2D.CHORD boshlang'ich nuqtadan oxirigacha chiziq chizadi.
Doimiy Arc2D.OPEN yoy yopilmasligi kerakligini bildiradi.
Chiziqlar
Nihoyat, biz Line2D ob'ektlari yordamida ikkita chiziq chizamiz - biri qattiq va biri chiziqli. 65-qator
Paint obyekti Color.GREEN. 66-qator Shaklni chizish uchun Graphics2D chizish usulidan foydalanadi
ob'ekt - bu holda, Line2D.Double sinfining namunasi. Line2D.Double konstruksiya-
tor argumentlari chiziqning boshlang'ich koordinatalarini va tugatish koordinatalarini belgilaydi.
69-qator 10 qiymatini o'z ichiga olgan bir elementli float massivini e'lon qiladi. Bu massiv
kesilgan chiziqdagi tirelarni tasvirlaydi. Bunday holda, har bir chiziq 10 piksel uzunlikda bo'ladi. Kimga
naqshda turli uzunlikdagi tirelarni yarating, shunchaki har bir tire uzunligini a sifatida taqdim eting
massivdagi element. 70-qator Paint obyektini Rang.SARI rangga o'rnatadi. 71-72 qatorlar o'rnatiladi
Yangi BasicStroke uchun kontur obyekti. Chiziq 4 piksel kengligida va yaxlitlangan bo'ladi
tugaydi (BasicStroke.CAP_ROUND). Agar chiziqlar bir-biriga qo'shilsa (burchakdagi to'rtburchakda bo'lgani kabi),

586 13-bob Grafika va Java 2D

ularning qo'shilishi yaxlitlanadi (BasicStroke.JOIN_ROUND). Chiziqlar argumenti belgilaydi
chiziq uchun chiziq uzunligi. Oxirgi argument chiziqchalardagi boshlang'ich indeksni ko'rsatadi
naqshdagi birinchi tire uchun massiv. Keyin 73-qator joriy Strok bilan chiziq chizadi.
Umumiy yo'llar bilan o'z shakllarini yaratish
Keyinchalik biz umumiy yo'lni taqdim etamiz - to'g'ri chiziqlardan qurilgan shakl va murakkab
chiziqlar. Umumiy yo'l GeneralPath sinfidagi ob'ekt bilan ifodalanadi (ja-paket
va.awt.geom). Shakllarning qo'llanilishi. 13.31 va 13.32 general chizishni ko'rsatadi
besh qirrali yulduz shaklidagi yo'l.

1 // 13.31-rasm: Shapes2JPanel.java


2 // Umumiy yo'lni ko'rsatish.
3 import java.awt.Color;
4 import java.awt.Graphics;
5 import java.awt.Graphics2D;
6 import java.awt.geom.GeneralPath;
7 import java.security.SecureRandom;
8 import javax.swing.JPanel;
9
10 ommaviy sinf Shapes2JPanel JPanel-ni kengaytiradi
11 {
12 // umumiy yo'llarni chizish
13 @Bekor qilish
14 umumiy bekor bo'yoq Komponenti (Grafika g)
15 {
16 super.paintComponent(g);
17 SecureRandom tasodif = yangi SecureRandom();
18
19 int[] xPoints = {55, 67, 109, 73, 83, 55, 27, 37, 1, 43};
20 int[] yPoints = {0, 36, 36, 54, 96, 72, 96, 54, 36, 36};
21
22 Graphics2D g2d = (Graphics2D) g;
23
24
25
26
27
28 // yulduzni yarating - bu yulduzni tortmaydi
29 uchun (int count = 1; count < xPoints.length; count++)
30
31
32
33
34
35
36 // boshlang'ich atrofida aylantiring va yulduzlarni tasodifiy ranglarda chizing
37 uchun (int count = 1; count <= 20; count++)
38 {
39
40

13.31-rasm | Java 2D umumiy yo'llari. (2-qismning 1-qismi.)

GeneralPath yulduzi = yangi GeneralPath();

// Umumiy yo'lning boshlang'ich koordinatasini o'rnating


star.moveTo(xPoints[0], yPoints[0]);

star.lineTo(xPoints[hisoblash], yPoints[hisoblash]);

star.closePath(); // shaklni yoping

g2d.translate(150, 150); // kelib chiqishini (150, 150) ga tarjima qiling

g2d.rotate (Math.PI / 10.0); // koordinata tizimini aylantirish

13.8 Java 2D API 587

19–20 qatorlar (13.31-rasm) x va y koordinatalarini ifodalovchi ikkita int massivni e'lon qiladi.
yulduzdagi nuqtalardan. 23-qator GeneralPath obyekt yulduzini yaratadi. 26-qatorda General-
Yulduzdagi birinchi nuqtani belgilash uchun yo'l usuli moveTo. 29-qatordagi for bayonoti

41 // tasodifiy chizma rangini o'rnating


42 g2d.setColor(yangi rang(random.nextInt(256),)
43 random.nextInt(256), random.nextInt(256)));
44
45
46 }
47 }
48 } // oxirgi sinf Shapes2JPanel

1 // 13.32-rasm: Shakllar2.java


2 // Umumiy yo'lni ko'rsatish.
3 import java.awt.Color;
4 import javax.swing.JFrame;
5
6 ommaviy sinf Shakllar2
7 {
8 // dasturni bajarish
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 // Shapes2JPanel uchun ramka yarating
12 JFrame ramkasi = yangi JFrame("2D shakllarni chizish");
13 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
14
15 Shakl2JPanel shakllari2JPanel = yangi Shakllar2JPanel();
16 frame.add(shapes2JPanel);
17 frame.setBackground(Color.WHITE);
18 frame.setSize(315, 330);
19 frame.setVisible(rost);
20 }
21 } // oxirgi sinf Shakllar2

13.32-rasm | Umumiy yo'lni ko'rsatish.

13.31-rasm | Java 2D umumiy yo'llari. (2-qismning 2-qismi.)

g2d.fill(yulduzcha); // to'ldirilgan yulduzni chizish


588 13-bob Grafika va Java 2D

30 yulduzning keyingi nuqtasiga chiziq chizish uchun GeneralPath usuli lineTo dan foydalanadi. Har biri
line to new callTo oldingi nuqtadan joriy nuqtaga chiziq tortadi. 32-qatordan foydalaniladi
Oxirgi nuqtadan belgilangan nuqtagacha chiziq chizish uchun GeneralPath usuli closePath
ko'chirish uchun oxirgi qo'ng'iroqda. Bu umumiy yo'lni yakunlaydi.
34-qator chizmaning boshini joyga ko'chirish uchun Graphics2D tarjima usulidan foydalanadi
(150, 150). Endi barcha chizish operatsiyalari joylashuvni (150, 150) (0, 0) sifatida ishlatadi.
37-46 qatorlardagi for iborasi yulduzni 20 marta aylantirib chizadi.
yangi kelib chiqish nuqtasi. 39-qator keyingi ko'rsatilganni aylantirish uchun Graphics2D aylantirish usulidan foydalanadi
shakli. Argument radyanlarda aylanish burchagini belgilaydi (360 ° = 2p radyan bilan). Chiziq
45 yulduzning to'ldirilgan versiyasini chizish uchun Graphics2D to'ldirish usulidan foydalanadi.
13.9 Yakunlash
Ushbu bobda siz rang-barang rang yaratish uchun Java-ning grafik imkoniyatlaridan qanday foydalanishni o'rgandingiz
chizmalar. Siz Java-ning koordinata tizimidan foydalanib ob'ektning joylashuvini qanday aniqlashni o'rgandingiz.
tem va paintComponent usuli yordamida oynaga rasm chizish. Siz intro-
Rang sinfiga aylantirildi va siz ushbu sinfdan foydalanib turli xil ranglarni belgilash uchun qanday foydalanishni o'rgandingiz
ularning RGB komponentlari. Siz foydalanuvchilarga ranglarni tanlashga ruxsat berish uchun JColorChooser dialog oynasidan foydalangansiz
dasturda. Keyin oynaga matn chizishda shriftlar bilan ishlashni o'rgandingiz.
Siz shrift nomi, uslubi va o'lchamidan Shrift ob'ektini qanday yaratishni, shuningdek, qanday qilishni o'rgandingiz
shrift ko'rsatkichlariga kirish uchun. U erdan siz a ga turli shakllarni chizishni o'rgandingiz
oyna, masalan, to'rtburchaklar (odatiy, yumaloq va 3D), tasvirlar va ko'pburchaklar, shuningdek, chiziqlar
va yoylar. Keyinchalik murakkabroq shakllarni yaratish va ularni to'ldirish uchun Java 2D API dan foydalandingiz
gradientlar yoki naqshlar bilan. Bob umumiy yo'llarni muhokama qilish bilan yakunlandi, ishlatilgan
to'g'ri chiziqlar va murakkab egri chiziqlardan shakllar qurish. Keyingi bobda biz muhokama qilamiz
class String va uning usullari. Biz naqshlarni moslashtirish uchun muntazam iboralarni kiritamiz
strings va foydalanuvchi kiritishini oddiy iboralar bilan qanday tekshirishni ko'rsating.

Xulosa
13.1-bo'lim Kirish


• Java ning koordinatalar tizimi (556-bet) ekrandagi har bir nuqtani (567-bet) aniqlash sxemasidir.
• Koordinatalar juftligi (556-bet) x koordinatasiga (gorizontal) va y koordinatasiga (vertikal) ega.
• Koordinatalar ekranda grafiklar qayerda ko'rsatilishi kerakligini ko'rsatish uchun ishlatiladi.
• Koordinata birliklari piksellarda o'lchanadi (556-bet). Piksel - bu displey monitorining eng kichik birligi
rezolyutsiya.
13.2-bo'lim Grafik kontekstlar va grafik ob'ektlar
• Java grafik konteksti (558-bet) ekranda chizish imkonini beradi.
• Class Graphics (558-bet) qatorlar, chiziqlar, to'rtburchaklar va boshqa shakllarni chizish usullarini o'z ichiga oladi.
Usullar shrift va ranglarni manipulyatsiya qilish uchun ham kiritilgan.
• Grafika obyekti grafik kontekstni boshqaradi va ekranda matnni ifodalovchi piksellarni chizadi
va boshqa grafik ob'ektlar, masalan, chiziqlar, ellipslar, to'rtburchaklar va boshqa ko'pburchaklar (558-bet).
• Class Graphics — mavhum sinf. Har bir Java ilovasi Grafik kichik sinfiga ega bo'lib, ular
chizmachilik qobiliyatini ko'rsatadi. Ushbu dastur bizdan Graphics sinfi tomonidan yashiringan, bu
platformadan mustaqil ravishda grafikadan foydalanishimizga imkon beruvchi interfeysni qo'llaydi.

Xulosa 589



• PaintComponent usuli har qanday JComponent komponentida grafiklarni chizish uchun ishlatilishi mumkin.
• paintComponent usuli tizim tomonidan metodga uzatiladigan Grafik ob'ektni oladi
engil Swing komponentini qayta bo'yash kerak bo'lganda.
• Ilova bajarilganda, dastur konteyneri paintComponent usulini chaqiradi. Uchun
paintComponent qayta chaqirilishi uchun hodisa yuz berishi kerak.
• JComponent ko'rsatilganda uning paintComponent usuli chaqiriladi.
• Komponentni qayta bo'yash usulini chaqirish (559-bet) ushbu komponentda chizilgan grafiklarni yangilaydi.
13.3-bo'lim Rangni boshqarish
• Class Color (559-bet) Java dasturida ranglarni manipulyatsiya qilish usullari va konstantalarini e'lon qiladi.
• Har bir rang qizil, yashil va ko'k komponentlardan yaratilgan. Bu komponentlar birgalikda
RGB qiymatlari deb ataladi (560-bet). RGB komponentlari qizil, yashil va ko'k rang miqdorini belgilaydi
mos ravishda rang. Qiymat qanchalik katta bo'lsa, ushbu rangning miqdori shunchalik ko'p bo'ladi.
• getRed, getGreen va getBlue (560-bet) rang usullari 0 dan 255 gacha int qiymatlarini qaytaradi.
mos ravishda qizil, yashil va ko'k miqdorini yuborish.
• getColor grafik usuli (560-bet) joriy chizilgan rangga ega Color ob’ektini qaytaradi.
• SetColor grafik usuli (560-bet) joriy chizma rangini o‘rnatadi.
• FillRect grafik usuli (560-bet) Grafik obyektining joriy rangi bilan to‘ldirilgan to‘rtburchak chizadi.
• DrawingString grafik usuli (562-bet) joriy rangda String chizadi.
• JColorChooser GUI komponenti (563-bet) ilova foydalanuvchilariga ranglarni tanlash imkonini beradi.
• JColorChooser showDialog statik usuli (564-bet) JColorChooser modal dialogini ko‘rsatadi.
13.4-bo'lim Shriftlarni boshqarish
• Class Shrift (566-bet) shriftlarni manipulyatsiya qilish usullari va konstantalarini o'z ichiga oladi.
• Class Shrifti konstruktori uchta argument oladi — shrift nomi (567-bet), shrift uslubi va shrift o‘lchami.
• Shriftning shrift uslubi Font.PLAIN, Font.ITALIC yoki Font.BOLD bo‘lishi mumkin (har biri sinfning statik maydonidir)
Shrift). Shrift uslublari kombinatsiyalangan holda ishlatilishi mumkin (masalan, Font.ITALIC + Font.BOLD).
• Shrift o'lchami nuqtalarda o'lchanadi. Nuqta 1/72 dyuymga teng.
• setFont grafik usuli (567-bet) matn ko'rsatiladigan chizma shriftini o'rnatadi.
• Shrift usuli getSize (567-bet) shrift hajmini nuqtalarda qaytaradi.
• getName shrift usuli (567-bet) joriy shrift nomini qator sifatida qaytaradi.
• getStyle Shrift usuli (569-bet) joriy Shrift uslubini ifodalovchi butun son qiymatini qaytaradi.
• getFamily shrift usuli (569-bet) joriy shrift qaysi shrift turkumining nomini qaytaradi
tegishli. Shriftlar oilasining nomi platformaga xosdir.
• FontMetrics klassi (569-bet) shrift ma'lumotlarini olish usullarini o'z ichiga oladi.
• Shrift ko'rsatkichlari (569-bet) balandlik, pastga tushish va boshlanishni o'z ichiga oladi.
13.5-bo'lim Chiziqlar, to'rtburchaklar va tasvirlar chizish
• FillRoundRect (573-bet) va drawRoundRect (573-bet) grafik usullari bilan to‘rtburchaklar chizish.
yumaloq burchaklar.
• Drawing3DRect (575-bet) va fill3DRect (575-bet) uch o‘lchamli to‘g‘ri chizishning grafik usullari.
burchaklar.
• Grafik usullari chizishOval (575-bet) va fillOval (575-bet) ovallarni chizish.

590 13-bob Grafika va Java 2D



13.6-bo'lim Yoylarni chizish
• Ovalning bir qismi sifatida yoy (575-bet) chizilgan.
• Yoylar boshlanish burchagidan yoy burchagi bilan belgilangan darajalar soniga qarab supuradi (575-bet).
• Yoylarni chizish uchun drawArc (575-bet) va fillArc (575-bet) grafik usullaridan foydalaniladi.
13.7-bo'lim Ko'pburchaklar va poliliniyalarni chizish
• Poligon klassi ko‘pburchaklar yaratish usullarini o‘z ichiga oladi.
• Ko‘pburchaklar to‘g‘ri chiziqli segmentlardan tashkil topgan yopiq ko‘p qirrali shakllardir.
• Poliliniyalar (578-bet) ulangan nuqtalar ketma-ketligidir.
• DrawingPolyline (580-bet) grafik usuli ulangan qatorlarni ko'rsatadi.
• Ko‘pburchaklarni chizish uchun drawPolygon (580-bet) va fillPolygon (581-bet) grafik usullaridan foydalaniladi.
• AddPoint ko'pburchak usuli (581-bet) Ko'pburchakka x va y koordinatalarini qo'shadi.
13.8-bo'lim Java 2D API
• Java 2D API (581-bet) ilg'or ikki o'lchovli grafik imkoniyatlarini taqdim etadi.
• Graphics2D sinfi (581-bet) — Grafikaning quyi sinfi — Java 2D API bilan chizish uchun ishlatiladi.
• Java 2D API ning shakllarni chizish sinflari qatoriga Line2D.Double, Rectangle2D.Double,
RoundRectangle2D.Double, Arc2D.Double va Ellipse2D.Double (581-bet).
• GradientPaint klassi (584-bet) asta-sekin o‘zgaruvchan ranglarda shakl chizishga yordam beradi, bu gradient deb ataladi.
(584-bet).
• Graphics2D to‘ldirish usuli (584-bet) interfeysni amalga oshiradigan har qanday turdagi to‘ldirilgan obyektni chizadi.
Shakl (584-bet).
• Class BasicStroke (584-bet) chiziqlarning chizma xarakteristikalarini belgilashga yordam beradi.
• Graphics2D chizish usuli (584-bet) Shape obyektini chizish uchun ishlatiladi.
• GradientPaint (584-bet) va TexturePaint (585-bet) sinflari xususiyatlarni aniqlashga yordam beradi.
shakllarni ranglar yoki naqshlar bilan to'ldirish.
• Umumiy yo‘l (586-bet) to‘g‘ri chiziqlar va murakkab egri chiziqlardan tuzilgan shakl bo‘lib, takrorlanadi.
GeneralPath sinfidagi ob'ektdan norozi bo'ldi (586-bet).
• GeneralPath usuli moveTo (587-bet) umumiy yo‘lda birinchi nuqtani belgilaydi.
• GeneralPath usuli lineTo (588-bet) yo‘lning keyingi nuqtasiga chiziq tortadi. Har bir yangi qo'ng'iroq
to lineTo oldingi nuqtadan joriy nuqtaga chiziq chizadi.
• GeneralPath usuli closePath (588-bet) oxirgi nuqtadan belgilangan nuqtagacha chiziq chizadi
ko'chirish uchun oxirgi qo'ng'iroqda. Bu umumiy yo'lni yakunlaydi.
• Graphics2D translate usuli (588-bet) chizmaning boshini yangi joyga ko‘chirish uchun ishlatiladi.
• Graphics2D rotate usuli (588-bet) keyingi ko'rsatilgan shaklni aylantirish uchun ishlatiladi.
O'z-o'zini tekshirish mashqlari
13.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Java 2D da sinf usuli qo'llanilgan zarba xarakteristikalarini belgilaydi
shakl chizish uchun.
b) Sinf shakl uchun to'ldirishni belgilashga yordam beradi, shunda to'ldirish asta-sekin o'zgaradi
bir rangdan boshqasiga.
c) Grafika sinfining usuli ikki nuqta orasiga chiziq chizadi.
d) RGB , va ning qisqartmasi.

O'z-o'zini tekshirish mashqlariga javoblar 591



e) Shrift o'lchamlari deb nomlangan birliklarda o'lchanadi.
f) Sinf BufferedImage-da chizilgan naqsh yordamida shakl uchun to'ldirishni belgilashga yordam beradi.
13.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) DrawOval Grafik usulining dastlabki ikkita argumenti markaz koordinatasini belgilaydi
oval.
b) Java koordinata tizimida x-koordinatalar chapdan o'ngga va y-koordinata-
yuqoridan pastga qarab turadi.
c) fillPolygon grafik usuli joriy rangda to'ldirilgan ko'pburchak chizadi.
d) drawArc grafik usuli manfiy burchaklarga ruxsat beradi.
e) getSize grafik usuli joriy shrift hajmini santimetrda qaytaradi.
f) Piksel koordinatasi (0, 0) monitorning aniq markazida joylashgan.
13.3 Quyidagilarning har biridagi xato(lar)ni toping va ularni qanday tuzatish kerakligini tushuntiring. Faraz qilaylik, g
Grafik obyekti hisoblanadi.
a) g.setFont("SansSerif");
b) g.oʻchirish(x, y, w, h); // (x, y) da to'rtburchakni tozalang
c) Shrift f = new Font("Serif", Font.BOLDITALIC, 12);
d) g.setColor(255, 255, 0); // rangni sariq rangga o'zgartiring
O'z-o'zini tekshirish mashqlariga javoblar
13.1 a) setStroke, Graphics2D. b) GradientPaint. c) chizilgan chiziq. d) qizil, yashil, ko'k. e) ball.
f) TexturePaint.
13.2 a) noto'g'ri. Birinchi ikkita argument chegaralovchi to'rtburchakning yuqori chap burchagini belgilaydi.
b) To'g'ri.
c) To'g'ri.
d) To'g'ri.
e) yolg'on. Shrift o'lchamlari nuqtalarda o'lchanadi.
f) yolg'on. Koordinata (0,0) GUI komponentining yuqori chap burchagiga mos keladi
qaysi chizma sodir bo'ladi.
13.3 a) setFont usuli argument sifatida String emas, Shrift obyektini oladi.
b) Graphics sinfida o'chirish usuli yo'q. clearRect usuli bo'lishi kerak
ishlatilgan.
c) Shrift.BOLDITALIC yaroqli shrift uslubi emas. Qalin kursiv shriftni olish uchun Font.BOLD + dan foydalaning
Shrift.ITALIC.
d) setColor usuli argument sifatida uchta butun son emas, balki Color obyektini oladi.
Mashqlar
13.4 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Java 2D API sinfi ovallarni chizish uchun ishlatiladi.
b) Graphics2D sinfini chizish va to'ldirish usullari o'zlariga xos turdagi ob'ektni talab qiladi
dalil.
c) Shrift uslubini belgilovchi uchta konstanta , va .
d) Graphics2D usuli Java 2D shakllari uchun bo'yash rangini o'rnatadi.
13.5 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) DrawingPolygon grafik usuli ko'pburchakning so'nggi nuqtalarini avtomatik ravishda bog'laydi.
b) DrawLine grafik usuli ikki nuqta orasiga chiziq chizadi.
c) fillArc grafik usuli burchakni belgilash uchun darajalardan foydalanadi.
d) Java koordinata tizimida y o'qi bo'yicha qiymatlar chapdan o'ngga ortadi.
e) Grafika ob'ekt sinfidan to'g'ridan-to'g'ri meros qilib olinadi.

592 13-bob Grafika va Java 2D



f) Grafika mavhum sinfdir.
g) Shrift sinfi bevosita Graphics sinfidan meros bo‘lib o‘tadi.
13.6 (DravelArc usuli yordamida konsentrik doiralar) Sakkizta qator chizuvchi dastur yozing
konsentrik doiralar. Doiralar 10 piksel bilan ajratilishi kerak. DrawingArc Grafik usulidan foydalaning.
13.7 (Klass Ellipse2D.Double yordamida konsentrik doiralar) Yechimni 13.6-mashqga o‘zgartiring.
Ellipse2D sinfidan foydalanib ovallarni chizish. Graphics2D sinfining Double va usuli chizish.
13.8 (Line2D.Double sinfidan foydalangan holda tasodifiy chiziqlar) Yechimni 13.7-mashqga o'zgartiring.
tasodifiy ranglar va tasodifiy qalinlikdagi tasodifiy chiziqlar chizish. Line2D sinfidan foydalaning.Double va usul
chiziqlar chizish uchun Graphics2D sinfini chizing.
13.9 (Tasodifiy uchburchaklar) Tasodifiy yaratilgan uchburchaklarni turlicha ko'rsatadigan dastur yozing.
achchiq ranglar. Har bir uchburchak boshqa rang bilan to'ldirilishi kerak. GeneralPath va meth sinfidan foydalaning -
uchburchaklarni chizish uchun Graphics2D sinfini to'ldiring.
13.10 (Tasodifiy belgilar) Turli xil belgilarni tasodifiy chizadigan dastur yozing.
shriftlar, o'lchamlar va ranglar.
13.11 (DravelLine usuli yordamida panjara) 8 ga 8 o'lchamdagi panjara chizuvchi dastur yozing. Foydalanish
DrawLine grafik usuli.
13.12 (Class Line2D.Double yordamida panjara) Chizish uchun yechimingizni 13.11-mashqga o'zgartiring.
Graphics2D sinfining Line2D.Double va usuli chizish misollari yordamida panjara.
13.13 (DrawRect usuli yordamida panjara) 10 ga 10 o'lchamdagi panjara chizuvchi dastur yozing. dan foydalaning
DrawRect grafik usuli.
13.14 (Class Rectangle2D.Double yordamida panjara) Chizish uchun yechimingizni 13.13-mashqga o'zgartiring
Rectangle2D.Double va Graphics2D sinfining chizish usuli yordamida panjara.
13.15 (Tetraedrlarni chizish) Tetraedr (uch oʻlchamli) chizuvchi dastur yozing.
to'rtta uchburchak yuzli al shakli). GeneralPath sinfidan va Graphics2D sinfining chizish usulidan foydalaning.
13.16 (Kubiklarni chizish) Kub chizuvchi dastur yozing. GeneralPath va meth sinfidan foydalaning -
Graphics2D sinfining chizmasi.
13.17 (Ellipse2D.Double sinfidan foydalanadigan doiralar) Foydalanuvchidan kiritishni so‘raydigan dastur yozing.
aylana radiusi suzuvchi nuqtali raqam sifatida va aylana chizadi, shuningdek qiymatlari
doira diametri, aylanasi va maydoni. p uchun 3,14159 qiymatidan foydalaning. [Izoh: Siz ham foydalanishingiz mumkin
p qiymati uchun oldindan belgilangan doimiy Math.PI. Bu doimiy qiymatdan aniqroqdir
3.14159. Matematik sinf java.lang paketida e'lon qilingan, shuning uchun uni import qilishingiz shart emas.] Quyidagilardan foydalaning.
pasaytirish formulalari (r - radius):
diametri = 2r
aylana = 2pr
maydon = pr2
Bundan tashqari, foydalanuvchidan radiusga qo'shimcha ravishda koordinatalar to'plamini so'rash kerak. Keyin chizing
aylana va uning diametrini, aylanasini va maydonini ko'rsatish uchun Ellipse2D.Double ob'ektidan foydalaning.
uni ko'rsatish uchun Graphics2D sinfining doira va usuli chizmasini yubordi.
13.18 (Screen Saver) Ekran pardasini simulyatsiya qiluvchi dastur yozing. Ilova kerak
Graphics sinfining drawLine usuli yordamida tasodifiy chiziqlar chizish. 100 ta chiziq chizilgandan so'ng, dastur
kation o'zini tozalashi va yana chiziqlar chizishni boshlashi kerak. Dasturni doimiy ravishda chizishga ruxsat berish uchun,
paintComponent usulida oxirgi qator sifatida qayta bo'yash uchun qo'ng'iroq qiling. bilan bog'liq har qanday muammolarni sezasiz
bu sizning tizimingizdami?
13.19 (Taymer yordamida ekran saqlovchisi) javax.swing to'plami Timer deb nomlangan sinfni o'z ichiga oladi.
ActionListener interfeysi tomonidan belgilangan vaqt oralig'ida amalga oshiriladi (maxsus)

593-mashqlar



millisekundlarda ko'rsatilgan). Qayta bo'yash uchun qo'ng'iroqni olib tashlash uchun yechimingizni 13.18-mashqga o'zgartiring
paintComponent usuli. ActionListener dasturini amalga oshirish uchun sinfingizni e'lon qiling. (Bajarilgan harakat
usul oddiygina repaintni chaqirishi kerak.) Taymer deb nomlangan taymer tipidagi misol o‘zgaruvchisini e’lon qiling.
sinf. Sinfingiz konstruktorida quyidagi gaplarni yozing:
taymer = yangi taymer (1000, bu);
timer.start();
Bu har bir ob'ektning actionPerformed usulini chaqiradigan Timer sinfining namunasini yaratadi
1000 millisekund (ya'ni, har soniyada).
13.20 (Tasodifiy qatorlar soni uchun ekran saqlovchisi) Yechimni 13.19-mashqga oʻzgartiring.
foydalanuvchiga dasturdan oldin chizilgan tasodifiy chiziqlar sonini kiritish imkonini beradi
o'zini tozalaydi va yana chiziqlar chizishni boshlaydi. Qiymatni olish uchun JTextField dan foydalaning. Foydalanuvchi bo'lishi kerak
dasturni bajarish vaqtida istalgan vaqtda JTextField-ga yangi raqam kiritish imkoniyatiga ega. a foydalaning
JTextField uchun hodisalarni boshqarish uchun ichki sinf.
13.21 (Shakllar bilan ekran saqlovchisi) Yechimni 13.20-mashqga o'zgartiring, shunda u ran-ni ishlatadi.
ko'rsatish uchun turli shakllarni tanlash uchun dom-raqam avlodi. Grafika sinfining usullaridan foydalaning.
13.22 (Java 2D API yordamida ekran saqlovchisi) Sinflardan foydalanish uchun yechimingizni 13.21-mashqga oʻzgartiring.
va Java 2D API ning chizish imkoniyatlari. To'rtburchaklar va ellipslar kabi shakllarni tasodifiy chizish
hosil qilingan gradientlar. Gradient yaratish uchun GradientPaint sinfidan foydalaning.
13.23 (Toshbaqa grafikasi) Yechimingizni 7.21-mashq — Kaplumbağa grafikasiga o‘zgartiring.
JTextFields va JButtons yordamida grafik foydalanuvchi interfeysi. Yulduzcha (*) o'rniga chiziqlar chizing. Qachon
toshbaqa grafik dasturi harakatni belgilaydi, pozitsiyalar sonini bir qatorga aylantiradi
pozitsiyalar sonini 10 ga (yoki siz tanlagan istalgan qiymatga) ko'paytirish orqali ekrandagi piksellar soni. Men-
chizmani Java 2D API xususiyatlari bilan to'ldiring.
13.24 (Knight's Tour) Ritsar sayohati muammosining grafik versiyasini yarating (7.22-mashq,
7.23-mashq va 7.26-mashq). Har bir harakat bajarilganda, shaxmat taxtasining tegishli katakchasi
tegishli harakat raqami bilan yangilanishi kerak. Agar dasturning natijasi to'liq tur yoki yopiq bo'lsa
tur, dastur tegishli xabarni ko'rsatishi kerak. Agar xohlasangiz, sinf taymeridan foydalaning (qarang
Ritsar sayohatini jonlantirishga yordam berish uchun 13.19-mashq.
13.25 (Toshbaqa va quyon) Toshbaqa va quyon simulyatsiyasining grafik versiyasini yarating
(7.28-mashq). Pastki chap burchakdan cho'zilgan yoyni chizish orqali tog'ni simulyatsiya qiling
oynaning yuqori o'ng burchagiga. Toshbaqa va quyon tog'ga yugurishlari kerak. Men-
Har bir harakatda toshbaqa va quyonni yoyda chop etish uchun grafik chiqishni to'ldiring.
[Maslahat: Kattaroq grafik maydonga ega bo'lish uchun poyga uzunligini 70 dan 300 gacha uzaytiring.]
13.26 (Spirallarni chizish) Chizish uchun drawPolyline Grafik usulidan foydalanadigan dastur yozing
13.33-rasmda ko'rsatilganga o'xshash spiral.
13.27 (Pie diagramma) To'rtta raqam kirituvchi va ularni doiraviy diagramma ko'rinishida chizuvchi dastur tuzing. Foydalanish
sinf Arc2D.Chizmani bajarish uchun Graphics2D sinfining Double va usuli to'ldirish. Har bir qismni chizish
pirogni alohida rangda.
13.28 (Shakllarni tanlash) Foydalanuvchiga JCombo-dan shakl tanlash imkonini beruvchi dastur yozing.
Box va uni paintComponent usulida tasodifiy joylar va o'lchamlar bilan 20 marta chizadi. The
JComboBox-dagi birinchi element birinchi marta paintCompo-da ko'rsatiladigan standart shakl bo'lishi kerak.
nent deyiladi.
13.29 (Tasodifiy ranglar) 20 ta tasodifiy oʻlchamdagi shakllarning har birini chizish uchun 13.28-mashqni oʻzgartiring.
tasodifiy tanlangan rang. Ranglar massivida oldindan belgilangan barcha 13 ta Rang ob'ektidan foydalaning.
13.30 (JColorChooser Dialog) 13.28-mashqni foydalanuvchiga rang tanlashiga ruxsat berish uchun o'zgartiring.
JColorChooser dialog oynasidan qaysi shakllar chizilishi kerak.

594 13-bob Grafika va Java 2D



(Ixtiyoriy) GUI va grafik misollarni o'rganish mashqlari: Java 2D qo'shish
13.31 Java 2D noyob va ta'sirchan grafiklarni yaratish uchun ko'plab yangi imkoniyatlarni taqdim etadi.
12.17-mashqda siz yaratgan chizma ilovasiga ushbu xususiyatlarning kichik bir qismini qo'shamiz.
Ushbu versiyada siz foydalanuvchiga shakllarni to'ldirish uchun gradientlarni belgilash va chiziq chizig'ini o'zgartirish imkoniyatini berasiz.
chizmalar va shakllarning konturlarini chizish uchun harakat. Foydalanuvchi qaysi ranglarga mos kelishini tanlashi mumkin.
gradientni qo'ying va zarbaning kengligi va tire uzunligini o'rnating.
Birinchidan, Java 2D funksiyasini qo'llab-quvvatlash uchun MyShape ierarxiyasini yangilashingiz kerak. Buni qiling -
MyShape sinfidagi o'zgarishlarni kamaytirish:
a) Abstrakt usul chizmasining parametr turini Graphics dan Graphics2D ga o'zgartiring.
b) Rang turidagi barcha o'zgaruvchilarni gradientlarni qo'llab-quvvatlashni yoqish uchun Paint turiga o'zgartiring. [Eslatma:
Eslatib o'tamiz, Color sinfi Paint interfeysini qo'llaydi.]
c) MyShape sinfiga Stroke tipidagi misol o‘zgaruvchisini va Stroke parametrini qo‘shing.
yangi misol o'zgaruvchisini ishga tushirish uchun konstruktor. Odatiy zarba in-
BasicStroke sinfining pozitsiyasi.
MyLine, MyBoundedShape, MyOval va MyRectangle sinflarining har biri Stroke parametrini qo‘shishi kerak.
ularning konstruktorlariga. Chizish usullarida har bir shakl avval Bo'yoq va Strokni o'rnatishi kerak
shaklni chizish yoki to'ldirish. Graphics2D Grafikaning quyi sinfi boʻlgani uchun biz Graphics-dan foydalanishda davom etishimiz mumkin.
ics usullari shakllarni chizish uchun drawLine, drawOval, fillOval va hokazo. Bu usullar qachon
deb nomlangan bo'lsa, ular belgilangan Bo'yoq va Strok sozlamalari yordamida tegishli shaklni chizadilar.
Keyin Java 2D funksiyalarini boshqarish uchun DrawPanel-ni yangilaysiz. Barcha rang o'zgaruvchilarini o'zgartiring
Paint o'zgaruvchilari uchun. Stroke tipidagi currentStroke misol o'zgaruvchisini e'lon qiling va to'plamni taqdim eting
Buning uchun usul. Paint va ni qo'shish uchun individual shakl konstruktorlariga qo'ng'iroqlarni yangilang
Strok argumentlari. PaintComponent usulida Graphics2D va turiga Grafik havolasini o'tkazing
MyShape usuli chizishiga har bir qo'ng'iroqda Graphics2D havolasidan foydalaning.
Keyin, yangi Java 2D funksiyalarini GUI-dan foydalanish mumkin qiling. GUI com-ning JPanelini yarating
Java 2D opsiyalarini sozlash uchun ponentlar. Quyidagi DrawFrame-ning yuqori qismiga ushbu komponentlarni qo'shing
hozirda standart shakl boshqaruvlarini o'z ichiga olgan panel (13.34-rasmga qarang). Ushbu GUI kompozitsiyasi
to'lovlar quyidagilarni o'z ichiga olishi kerak:
a) Gradient yordamida bo'yashni belgilash uchun katakcha.
b) Har biri foydalanuvchiga tanlash imkonini beruvchi JColorChooser dialogini ko'rsatadigan ikkita JButton
gradientdagi birinchi va ikkinchi rang. (Bular tanlov uchun ishlatiladigan JComboBox o'rnini bosadi -
12.17-mashqdagi rangni aniqlash.)
c) Stroke width kiritish uchun matn maydoni.
d) Stroke tire uzunligini kiritish uchun matn maydoni.
e) Kesikli yoki qattiq chiziq chizishni tanlash uchun katakcha.

13.33-rasm | DrawPolyline usuli yordamida spiral chizilgan.


Farq qilish 595



Agar foydalanuvchi gradient bilan chizishni tanlasa, DrawPanel-dagi Paint-ni gradient qilib belgilang.
foydalanuvchi tanlagan ikkita rang. Ifodasi
yangi GradientPaint(0, 0, rang1, 50, 50, rang2, rost))
GradientPaint-ni yaratadi, u har 50 pikselda diagonal ravishda yuqori chapdan pastki o'ngga aylanadi.
ls. color1 va color2 o'zgaruvchilari foydalanuvchi tanlagan ranglarni ifodalaydi. Agar foydalanuvchi tanlamasa
gradientdan foydalaning, so'ngra DrawPanel-dagi Paint-ni foydalanuvchi tanlagan birinchi rang qilib o'rnating.
Qatlamlar uchun, agar foydalanuvchi qattiq chiziqni tanlasa, u holda ibora bilan Strok yarating
yangi BasicStroke(kenglik, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)
bu erda o'zgaruvchan kenglik - satr kengligi matn maydonida foydalanuvchi tomonidan ko'rsatilgan kenglik. Agar foydalanuvchi
kesilgan chiziqni tanlaydi, so'ngra ifoda bilan Strok yarating
yangi BasicStroke(kenglik, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
10, tire, 0)
bu erda kenglik yana chiziq kengligi maydonidagi kenglikdir va chiziqchalar bitta elementli massivdir
uning qiymati chiziq uzunligi maydonida ko'rsatilgan uzunlikdir. Panel va Stroke ob'ektlari bo'lishi kerak
DrawPanel-da shakl yaratilganda shakl ob'ektining konstruktoriga o'tkazilishi mumkin.
Farq qilish
13.32 (Ko‘rish qobiliyati past odamlar uchun katta turdagi displeylar) Kompyuterlardan foydalanish imkoniyati va
Nogironligidan qat'i nazar, barcha odamlar uchun Internet muhimroq bo'lib bormoqda, chunki bu vositalar
shaxsiy va biznes hayotimizda rollarni oshirish. Jahon sog'liqni saqlash tashkilotining so'nggi hisob-kitoblariga ko'ra
Tashkilot (www.who.int/mediacentre/factsheets/fs282/en/), butun dunyo bo'ylab 246 million kishi
ko'rish qobiliyati past. Kam ko'rish haqida ko'proq ma'lumot olish uchun GUI-ga asoslangan past ko'rish simulyatsiyasini tekshiring
www.webaim.org/simulations/lowvision.php. Ko'rish qobiliyati past odamlar shrift tanlashni afzal ko'rishlari mumkin
va/yoki elektron hujjatlar va veb-sahifalarni o‘qiyotganda kattaroq shrift o‘lchami. Java-da beshta o'rnatilgan o'rnatilgan
Har qanday Java ilovasida, jumladan Serifda mavjud bo'lishi kafolatlangan "mantiqiy" shriftlar,
Sans-serif va monospaced. Foydalanuvchi joylashgan JTextArea ni ta'minlovchi GUI ilovasini yozing
matn yozish mumkin. Foydalanuvchiga JComboBox-dan Serif, Sans-serif yoki Monospaced-ni tanlashga ruxsat bering. Ta'minlash
Qalin JCheckBox, agar belgilansa, matn qalin qiladi. Shrift hajmini kattalashtirish va kichraytirishni qo'shing
Shrift o'lchami JButtonlar foydalanuvchiga shrift hajmini mos ravishda yuqoriga yoki pastga bir marta o'lchash imkonini beradi.
bir vaqtning o'zida nuqta. 18 nuqtali shrift o'lchamidan boshlang. Ushbu mashqni bajarish uchun shrift hajmini o'rnating
JComboBox, JButtons va JCheckBox-da 20 ballgacha ko'rish qobiliyati past bo'lgan odam ko'rish qobiliyatiga ega bo'ladi.
ulardagi matnni o'qish.

13.34-rasm | Java 2D bilan chizish.


14 S


tringlar, Belgilar va
Oddiy ifodalar

Genri Kingning asosiy nuqsoni


Kichik iplarni chaynab yurardi.
- Xilaire Bellok
Kuchli yozish qisqacha. A
jumlada no bo'lishi kerak
keraksiz so'zlar, paragraf
keraksiz gaplar yo'q.
- Uilyam Strunk, kichik.
Men bu xatni uzoqroq qildim
odatdagidan ko'ra, chunki menda kam
qisqa qilish vaqti keldi.
- Blez Paskal

Oh maqsadlar


Ushbu bobda siz:
■ Yarating va boshqaring
o'zgarmas belgilar qatori
String sinfining ob'ektlari.
■ Yarating va boshqaring
o'zgaruvchan belgilar qatori
sinf ob'ektlari
StringBuilder.
■ Yarating va boshqaring
Character sinfining ob'ektlari.
■ String obyektini sindirish
String yordamida tokenlar
usulni ajratish.
■ uchun oddiy iboralardan foydalaning
String ma'lumotlarini tekshirish
arizaga kiritilgan.

14.1 Kirish 597

14.1 Kirish
Ushbu bob Java ning string va belgilarni qayta ishlash imkoniyatlari bilan tanishtiradi. texnologiya -
Bu yerda muhokama qilingan niklar dastur kiritilishini tekshirish, ma'lumotlarni ko'rsatish uchun mos keladi
foydalanuvchilarga va boshqa matnga asoslangan manipulyatsiyalarga. Ular matnni ishlab chiqish uchun ham mos keladi
muharrirlar, matn protsessorlari, sahifalarni joylashtirish dasturlari, kompyuterlashtirilgan matn terish tizimlari va boshqalar.
matnni qayta ishlash dasturlari turlari. Biz bir nechta satrlarni qayta ishlash imkoniyatlarini taqdim etdik
oldingi boblarda. Ushbu bobda String sinflarining imkoniyatlari batafsil muhokama qilinadi,
Java.lang paketidagi StringBuilder va Character - bu sinflar
Java-da string va belgilar manipulyatsiyasi uchun asos.
Ushbu bobda ilovalarni sig'imga ega bo'lgan muntazam iboralar ham muhokama qilinadi.
kiritishni tasdiqlash qobiliyati. Funktsionallik sinflar bilan birga String sinfida joylashgan
Matcher va Pattern java.util.regex paketida joylashgan.
14.2 Belgilar va satrlar asoslari
Belgilar Java manba dasturlarining asosiy qurilish bloklaridir. Har bir dastur
Belgilar ketma-ketligidan iborat bo'lib, ular ma'noli ravishda guruhlanganda - bo'ladi
Java kompilyatori tomonidan vazifani bajarish uchun foydalaniladigan bir qator ko'rsatmalar sifatida talqin etiladi. pro-
gramm harf harflarini o'z ichiga olishi mumkin. Belgilar harfi a sifatida ifodalangan butun son qiymatidir
bitta tirnoq ichidagi belgi. Masalan, 'z' z ning butun qiymatini, '\t' esa
yorliq belgisining butun qiymatini o'zgartiradi. Belgining literal qiymati butun sondir
Unicode belgilar to'plamidagi belgilar qiymati. B ilovasida butun son ekvivalenti keltirilgan.
Unicode ning kichik to'plami bo'lgan ASCII belgilar to'plamidagi belgilarning ma'lumotlari (muhokama qilingan)
onlayn H ilovasida).
2.2-bo'limdan eslaylikki, satr bitta birlik sifatida ko'rilgan belgilar ketma-ketligidir.
Satr harflar, raqamlar va turli xil maxsus belgilarni o'z ichiga olishi mumkin, masalan, +, -, *, / va $.
String - bu String sinfining ob'ekti. String literallari (xotirada String obyektlari sifatida saqlanadi)
Quyidagi kabi qo'sh tirnoq ichida belgilar ketma-ketligi sifatida yoziladi:

14.1 Kirish


14.2 Belgilar va satrlar asoslari
14.3 Sinf satri
14.3.1 String konstruktorlari
14.3.2 String usullari uzunligi, charAt
va getChars
14.3.3 Satrlarni solishtirish
14.3.4 Belgilar va pastki qatorlarni joylashtirish
Strings
14.3.5 Satrlardan pastki satrlarni ajratib olish
14.3.6 Birlashtiruvchi satrlar
14.3.7 Turli qatorli usullar
14.3.8 String usuli qiymatiOf
14.4 Class StringBuilder
14.4.1 StringBuilder konstruktorlari

14.4.2 StringBuilder usullari uzunligi,


sig'im, o'rnatilganUzunlik va
Imkoniyatlarni ta'minlash
14.4.3 StringBuilder usullari charAt,
setCharAt, getChars va teskari
14.4.4 StringBuilder qo'shimcha usullari
14.4.5 StringBuilder qo'shish va
Yo'q qilish usullari
14.5 Sinf belgisi
14.6 Tokenizatsiya satrlari
14.7 Muntazam iboralar, sinf namunasi
va Class Matcher
14.8 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar |


Maxsus bo'lim: Kengaytirilgan string-manipulyatsiya mashqlari |
Maxsus bo'lim: qiyin string-manipulyatsiya loyihalari | Farq qilish

598 14-bob Satrlar, belgilar va muntazam ifodalar

String ma'lumotnomasiga string tayinlanishi mumkin. Deklaratsiya

"ko'k" qatorni o'z ichiga olgan String ob'ektiga murojaat qilish uchun String o'zgaruvchi rangini ishga tushiradi.

14.3 Sinf satri
Class String Java-da satrlarni ifodalash uchun ishlatiladi. Keyingi bir nechta kichik bo'limlar ko'pchilikni qamrab oladi
String sinfining imkoniyatlari.

14.3.1 String konstruktorlari


Class String String obyektlarini turli usullarda ishga tushirish uchun konstruktorlarni taqdim etadi. To'rt
konstruktorlarning asosiy usuli 14.1-rasmda ko'rsatilgan.

"Jon Q. Doe" (ism)


"9999 Main Street" (ko'cha manzili)
"Waltham, Massachusetts" (shahar va shtat)
"(201) 555-1212" (telefon raqami)

String rangi = "ko'k";

Ishlash bo'yicha maslahat 14.1
Xotirani tejash uchun Java bir xil tarkibga ega bo'lgan barcha string literallarini bitta bilan ishlaydi
Unga ko'p havolalarga ega bo'lgan string ob'ekti.

1 // 14.1-rasm: StringConstructors.java


2 // String sinfi konstruktorlari.
3
4 umumiy sinf StringConstructors
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 ta char[] charArray = {'b', 'i', 'r', 't', 'h', ' ', 'd', 'a', 'y'};
9 String s = new String("salom");
10
11
12
13
14
15
16
17 System.out.printf(
18 "s1 = %s%ns2 = %s%ns3 = %s%ns4 = %s%n", s1, s2, s3, s4);
19 }
20 } // StringConstructors oxirgi sinfi

s1 =
s2 = salom


s3 = tug'ilgan kun
s4 = kun

14.1-rasm | String sinfi konstruktorlari.

// String konstruktorlaridan foydalaning
String s1 = new String();
String s2 = yangi string(lar);
String s3 = new String(charArray);
String s4 = new String(charArray, 6, 3);

14.3 Class String 599

12-qator String sinfining argumentsiz konstruktoridan foydalangan holda yangi Stringni yaratadi va
o'z havolasini s1 ga belgilaydi. Yangi String obyekti hech qanday belgilarni o'z ichiga olmaydi (ya'ni, bo'sh
satr, u "") sifatida ham ifodalanishi mumkin va uzunligi 0 ga teng. 13-qator a
String ob'ektini argument sifatida qabul qiladigan String sinfining konstruktoridan foydalangan holda yangi String ob'ekti
ment va uning havolasini s2 ga belgilaydi. Yangi String obyekti bir xil ketma-ketlikni o'z ichiga oladi
Konstruktorga argument sifatida uzatiladigan String obyekti sifatida belgilar soni.

14-qator yangi String ob'ektini yaratadi va sinf yordamida s3 ga havolasini tayinlaydi


Argument sifatida char massivini oladigan String konstruktori. Yangi String obyekti -
massivdagi belgilarning nusxasini saqlaydi.
15-qator yangi String ob'ektini yaratadi va sinf yordamida s4 ga havolasini tayinlaydi
Argument sifatida char massivi va ikkita butun sonni oladigan string konstruktori. Ikkinchisi
argument massivdagi belgilarning boshlang'ich pozitsiyasini (ofset) belgilaydi
kirgan. Birinchi belgi 0 pozitsiyasida ekanligini unutmang. Uchinchi argument belgilaydi
massivga kirish uchun belgilar soni (hisob). Yangi String obyekti
kirish belgilaridan tuzilgan. Agar ofset yoki hisob argument sifatida ko'rsatilgan bo'lsa
belgilar qatori chegarasidan tashqaridagi elementga kirishga olib keladi, StringIndex-
OutOfBoundsException tashlanadi.

14.3.2 String usullari uzunligi, charAt va getChars


String usullari length, charAt va getChars String uzunligini qaytaradi, ni oling
Stringning ma'lum bir joyidagi belgi va Stringdan belgilar to'plamini oling
mos ravishda char massivi sifatida. 14.2-rasmda ushbu usullarning har biri ko'rsatilgan.

Ishlash bo'yicha maslahat 14.2


Mavjud String obyektini nusxalash shart emas. String ob'ektlari o'zgarmasdir, chunki
class String String ob'ekti tarkibiga ruxsat beruvchi usullarni taqdim etmaydi
yaratilganidan keyin o'zgartiriladi.

1 // 14.2-rasm: StringMiscellaneous.java


2 // Ushbu ilova uzunlik, charAt va getCharsni ko'rsatadi
3 // String sinfining usullari.
4
5 ommaviy sinf StringMiscellaneous
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 String s1 = "salom";
10 ta char[] charArray = new char[5];
11
12 System.out.printf("s1: %s", s1);
13
14 // sinov uzunligi usuli
15 System.out.printf("%nLength of s1: %d", );
16
17 // s1 dagi belgilarni charAt va displeyni teskari aylantirish bilan aylantiring
18 System.out.printf("%n teskari satr: ");

14.2-rasm | String usullari uzunligi, charAt va getChars. (2-qismning 1-qismi.)

s1.length()

600 14-bob Satrlar, belgilar va oddiy iboralar

15-qator Stringdagi belgilar sonini aniqlash uchun String usuli uzunligidan foydalanadi
s1. Massivlar singari, satrlar ham o'z uzunligini biladi. Biroq, massivlardan farqli o'laroq, siz a
String uzunligi klassi orqali String uzunligi.
20–21 qatorlar s1 String belgilarini teskari tartibda chop etadi (va ular bilan ajratilgan).
bo'shliqlar). String usuli charAt (21-satr) belgining ma'lum bir pozitsiyasidagi belgini qaytaradi
String. charAt usuli indeks sifatida ishlatiladigan butun son argumentini oladi va qaytaradi
o'sha pozitsiyadagi xarakter. Massivlar singari, Stringning birinchi elementi 0 pozitsiyasida.
24-qator satr belgilarini belgiga nusxalash uchun getChars String usulidan foydalanadi.
aktyorlar qatori. Birinchi argument - bu belgilar ko'chirilishi kerak bo'lgan boshlang'ich indeks.
Ikkinchi argument - ko'chiriladigan oxirgi belgidan bir o'tgan indeks
String. Uchinchi argument - belgilar bo'lishi kerak bo'lgan belgilar qatori
nusxalangan. Oxirgi argument ko'chirilgan belgilar joylashtirilgan boshlang'ich indeksdir
maqsadli belgilar qatori. Keyin, 27–28-qatorlar bir belgida belgilar massivi tarkibini chop etadi
bir vaqt.
14.3.3 Satrlarni solishtirish
19-bobda massivlarni saralash va izlash muhokama qilinadi. Ko'pincha ma'lumotlar saralanadi
ed or searched satrlardan iborat bo'lib, ularni tartibda joylashtirish uchun solishtirish kerak
satrning massivda (yoki boshqa to'plamda) paydo bo'lishini aniqlash. Class String beradi
Keyingi ikkita misolda ko'rsatilgandek, satrlarni taqqoslash usullari.
Bir satr boshqasidan katta yoki kichik bo'lishi nimani anglatishini tushunish uchun,
bir qator familiyalarni alifbo tartibida o'tkazish jarayonini ko'rib chiqing. Shubhasiz, siz "Jons" ni joylashtirasiz.
"Smit" dan oldin, chunki "Jons" ning birinchi harfi "Smit" ning birinchi harfidan oldin keladi
alifboda. Ammo alifbo 26 ta harfdan iborat ro'yxat emas, balki tartiblangan ro'yxatdir
belgilar. Har bir harf ro'yxatdagi ma'lum bir pozitsiyada uchraydi. Z shunchaki a emas
alifboning harfi - bu alifboning yigirma oltinchi harfi.

19
20 uchun (int count = s1.length() - 1; count >= 0; count--)


21 System.out.printf("%c ", );
22
23 // satrdagi belgilarni charArray-ga nusxalash
24
25 System.out.printf("%n Belgilar massivi: ");
26
27 uchun (belgi belgisi: charArray)
28 System.out.print(belgi);
29
30 System.out.println();
31 }
32 } // tugatish sinfi StringMiscellaneous

s1: salom


s1 uzunligi: 11
Satr teskari: erehtolleh
Belgilar qatori: salom

14.2-rasm | String usullari uzunligi, charAt va getChars. (2-qismning 2-qismi.)

s1.charAt(hisoblash)

s1.getChars(0, 5, charArray, 0);


14.3 Class String 601

Kompyuter bir harf boshqasidan "oldin" kelishini qanday biladi? Barcha belgilar
kompyuterda raqamli kodlar sifatida ifodalanadi (B ilovasiga qarang). Kompyuter qachon
Strings ni solishtiradi, u aslida Stringsdagi belgilarning raqamli kodlarini solishtiradi.
14.3-rasmda teng, equalsIgnoreCase, compareTo String usullari ko'rsatilgan
va regionMatches va tenglik operatori == yordamida String obyektlarini solishtirish.

1 // 14.3-rasm: StringCompare.java


2 // String usullari teng, equalsIgnoreCase, compareTo va regionMatches.
3
4 umumiy sinf StringCompare
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 String s1 = new String("salom"); // s1 - "salom" ning nusxasi
9 String s2 = "xayr";
10 string s3 = "Tug'ilgan kuningiz bilan";
11 String s4 = "tug'ilgan kuningiz bilan";
12
13 System.out.printf(
14 "s1 = %s%ns2 = %s%ns3 = %s%ns4 = %s%n%n", s1, s2, s3, s4);
15
16 // tenglik uchun test
17 agar ( ) // rost
18 System.out.println("s1 teng \"salom\"");
yana 19
20 System.out.println("s1 \"salom\"ga teng emas");
21
22 // == bilan tenglikni sinab ko'ring
23 agar ( ) // noto'g'ri; ular bir xil ob'ekt emas
24 System.out.println("s1 - \"salom\" bilan bir xil ob'ekt");
yana 25
26 System.out.println("s1 - \"salom\" bilan bir xil ob'ekt emas");
27
28 // tenglik uchun test (harf e'tibor bermang)
29 agar ( ) // rost
30 System.out.printf("%s ga teng %s bilan %n katta-kichik harf e'tiborga olinmaydi", s3, s4);
yana 31
32 System.out.println("s3 s4 ga teng emas");
33
34 // solishtirish
35 System.out.printf(
36 "%ns1.compareTo(s2) %d", );
37 System.out.printf(
38 "%ns2.compareTo(s1) - %d", );
39 System.out.printf(
40 "%ns1.compareTo(s1) - %d", );
41 System.out.printf(
42 "%ns3.compareTo(s4) - %d", );
43 System.out.printf(
44 "%ns4.compareTo(s3) bu %d%n%n", );

14.3-rasm | String usullari teng, equalsIgnoreCase, compareTo va regionMatches.


(2-qismning 1-qismi.)

s1.equals("salom")

s1 == "salom"

s3.equalsIgnoreCase(s4)

s1.qiyoslash(s2)

s2.qiyoslash(s1)

s1.qiyoslash(s1)

s3.compareTo(s4)

s4.compareTo(s3)

602 14-bob Satrlar, belgilar va oddiy iboralar

String usuli teng
17-qatordagi shart String s1 va String literalini solishtirish uchun tenglar usulidan foydalanadi
tenglik uchun "salom". Method equals (Stringda bekor qilingan Ob'ekt sinfining usuli)
har qanday ikkita ob'ektni tenglik uchun sinab ko'radi - ikkita ob'ekt tarkibidagi satrlar bir xil.
Usul ob'ektlarning mazmuni teng bo'lsa, true qiymatini qaytaradi, aks holda noto'g'ri.
Oldingi shart rost, chunki String s1 string literal bilan ishga tushirilgan
"Salom". Method equals leksikografik taqqoslashdan foydalanadi - u butun sonni taqqoslaydi
Har bir belgini ifodalovchi Unicode qiymatlari (qo'shimcha ma'lumot olish uchun onlayn H ilovasiga qarang).
har bir satrda ter. Shunday qilib, agar "salom" qatori "HELLO" qatori bilan solishtirilsa
natija noto'g'ri, chunki kichik harfning butun soni bundan farq qiladi
tegishli bosh harfdan.

45
46 // Sinov mintaqasiMatchlar (katta harflar sezgir)


47 agar ( )
48 System.out.println("s3 va s4 ning birinchi 5 ta belgisi mos keladi");
yana 49
50 System.out.println(
51 "s3 va s4 ning birinchi 5 ta belgisi mos kelmaydi");
52
53 // Sinov mintaqasiMatchlar (harf e'tibor bermang)
54 agar ( )
55 System.out.println(
56 "s3 va s4 ning birinchi 5 ta belgisi hisobga olinmagan katta harflar bilan mos keladi");
yana 57
58 System.out.println(
59 "s3 va s4 ning birinchi 5 ta belgisi mos kelmaydi");
60 }
61 } // StringCompare sinfining oxiri

s1 = salom


s2 = xayr
s3 = Tug'ilgan kuningiz bilan
s4 = tug'ilgan kuningiz bilan

s1 "salom" ga teng


s1 "salom" bilan bir xil ob'ekt emas
Tug'ilgan kuningiz bilan tug'ilgan kuningiz e'tiborsiz qolgan holda tug'ilgan kuningiz bilan tengdir

s1.compareTo(s2) 1 ga teng


s2.compareTo(s1) -1 ga teng
s1.compareTo(s1) 0 ga teng
s3.compareTo(s4) -32 ga teng
s4.compareTo(s3) 32 ga teng

s3 va s4 ning dastlabki 5 ta belgisi mos kelmaydi


s3 va s4 ning dastlabki 5 ta belgisi katta harflar bilan mos keladi

14.3-rasm | String usullari teng, equalsIgnoreCase, compareTo va regionMatches.


(2-qismning 2-qismi.)

s3.regionMatches(0, s4, 0, 5)

s3.regionMatches(haqiqiy, 0, s4, 0, 5)

14.3 Class String 603

Satrlarni == Operator bilan solishtirish
23-satrdagi shart tenglik uchun s1 qatorini solishtirish uchun == tenglik operatoridan foydalanadi
String to'g'ridan-to'g'ri "salom" bilan. Primitiv tipdagi qiymatlar == bilan solishtirilganda, bu
agar ikkala qiymat bir xil bo'lsa, natija to'g'ri bo'ladi. Murojaatlarni == bilan taqqoslaganda, natija
agar ikkala murojaat ham xotiradagi bir xil ob'ektga tegishli bo'lsa, to'g'ri bo'ladi. Haqiqiy tarkibni solishtirish uchun
(yoki davlat ma'lumotlari) tenglik uchun ob'ektlar, usulni chaqirish kerak. Bo'lgan holatda
Strings, bu usul tengdir. Oldingi shart 23-satrda noto'g'ri deb baholanadi -
s1 havolasi bayonot bilan ishga tushirilganligi sababli

u "salom" satrining nusxasi bilan yangi String ob'ektini yaratadi va yangisini tayinlaydi


s1 o'zgaruvchisiga ob'ekt. Agar s1 bayonot bilan ishga tushirilgan bo'lsa

s1 o'zgaruvchisiga to'g'ridan-to'g'ri "salom" satrini belgilaydi, shart shunday bo'ladi


rost. Esda tutingki, Java barcha string literal ob'ektlari bilan bir xil tarkibga ega
Ko'p havolalar bo'lishi mumkin bo'lgan string ob'ekti. Shunday qilib, 8, 17 va 23-qatorlarning barchasi tegishli
xotirada bir xil String ob'ekti "salom".

String usuli equalsIgnoreCase


Agar siz satrlarni saralayotgan bo'lsangiz, ularni tenglik uchun tenglik usuli bilan solishtirishingiz mumkin -
IgnoreCase, bu har bir Stringdagi harflar katta yoki kichik bo'lishini e'tiborga olmaydi
taqqoslash paytida. Shunday qilib, "salom" va "SALOM" so'zlari tengdir. 29-qator
String s3—Happy Birthday—ni solishtirish uchun teng IgnoreCase string usulidan foydalanadi
String s4 bilan tenglik - tug'ilgan kuningiz bilan. Bu taqqoslash natijasi to'g'ri, chunki
taqqoslashda katta-kichik holat hisobga olinmaydi.
Satr usuli solishtirishTo
35–44 qatorlar satrlarni solishtirish uchun compareTo usulidan foydalanadi. compareTo usuli e'lon qilindi
Comparable interfeysida va String sinfida amalga oshiriladi. 36-qator taqqoslanadi
s1 qatoridan s2 qatoriga. Agar satrlar teng bo'lsa, solishtirma usuli 0 ni qaytaradi, salbiy
raqam, agar compareTo ni chaqiruvchi String a sifatida uzatilgan Stringdan kichik bo'lsa
argument va musbat raqam, agar compareTo ni chaqiruvchi String dan katta bo'lsa
Argument sifatida uzatilgan satr. solishtirish usuli leksikografik taqqoslashdan foydalanadi.
o'g'il - bu har bir satrdagi tegishli belgilarning raqamli qiymatlarini taqqoslaydi.
String usuli regionMatchlar
47-qatordagi shartlar taqqoslash uchun String usuli regionMatches versiyasidan foydalanadi.
Tenglik uchun ikkita satr. Usulning ushbu versiyasiga birinchi dalil
usulni chaqiruvchi Stringdagi boshlang'ich indeks. Ikkinchi dalil taqqoslashdir.

s1 = new String("salom");

s1 = "salom";

Umumiy dasturlash xatosi 14.1


Murojaatlarni == bilan solishtirish mantiqiy xatolarga olib kelishi mumkin, chunki == havolalarni taqqoslaydi
ikkita ob'ektga ega yoki yo'qligini emas, balki bir xil ob'ektga tegishli ekanligini aniqlash uchun
bir xil tarkib. Bir xil qiymatlarni o'z ichiga olgan ikkita alohida ob'ekt solishtirilganda
== bilan natija noto'g'ri bo'ladi. Ob'ektlarni solishtirganda, ular bor yoki yo'qligini aniqlash uchun
bir xil tarkib, foydalanish usuli teng.

604 14-bob Satrlar, belgilar va oddiy iboralar

ison String. Uchinchi dalil taqqoslash Stringdagi boshlang'ich indeksdir. Oxirgi
argument - bu ikki satr o'rtasida taqqoslash uchun belgilar soni. Usul
Belgilangan belgilar soni leksikografik jihatdan teng bo'lsagina true qiymatini qaytaradi.
Nihoyat, 54-qatordagi shart String usulining beshta argumentli versiyasidan foydalanadi
Tenglik uchun ikkita satrning qismlarini solishtirish uchun regionMatch. Birinchi argument qachon
to'g'ri bo'lsa, usul taqqoslanayotgan belgilar holatini e'tiborsiz qoldiradi. Qolganlari; qolgan
argumentlar to'rt argumentli regionMatch usuli uchun tavsiflanganlar bilan bir xil.
String Methods startsWith va endsWith
Keyingi misolda (14.4-rasm) String usullari startsWith va endsWith ko'rsatilgan.
Asosiy usul "boshlandi", "boshlang'ich", "tugadi" va "tugash-" ni o'z ichiga olgan massiv qatorlarini yaratadi.
ing". Asosiy usulning qolgan qismi elementlarni sinab ko'radigan uchta for bayonotidan iborat
massivning ma'lum belgilar to'plami bilan boshlanishi yoki tugashini aniqlash uchun.

1 // 14.4-rasm: StringStartEnd.java


2 // String usullari startsWith va endsWith.
3
4 umumiy sinf StringStartEnd
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 String[] strings = {"boshlandi", "boshlandi", "tugadi", "tugadi"};
9
10 // test usuli startsWith
11 uchun (String string: strings)
12 {
13 agar ( )
14 System.out.printf("\"%s\" \"st\"%n", string bilan boshlanadi);
15 }
16
17 System.out.println();
18
19 // test usuli satrning 2-pozitsiyasidan boshlanadi
20 uchun (String string: strings)
21 {
22 agar ( )
23 System.out.printf(
24 "\"%s\" 2%n pozitsiyasida \"art\" bilan boshlanadi, string);
25 }
26
27 System.out.println();
28
29 // test usuli endsWith
30 uchun (String string: strings)
31 {
32 agar ( )
33 System.out.printf("\"%s\" oxiri \"ed\"%n", string);
34 }
35 }
36 } // tugatish sinfi StringStartEnd

14.4-rasm | String usullari startsWith va endsWith. (2-qismning 1-qismi.)

string.startsWith("st")

string.startsWith("san'at", 2)

string.endsWith("ed")

14.3 Class String 605

11–15 qatorlar String argumentini oladigan startsWith usuli versiyasidan foydalanadi.
If operatoridagi shart (13-satr) massivdagi har bir Stringning mavjudligini aniqlaydi
"st" belgilaridan boshlanadi. Agar shunday bo'lsa, usul haqiqatni qaytaradi va dastur chop etadi
bu String. Aks holda, usul false qaytaradi va hech narsa sodir bo'lmaydi.
20–25 qatorlar argument sifatida String va butun sonni oladigan startsWith usulidan foydalanadi.
mentlar. Butun sonda taqqoslash boshlanishi kerak bo'lgan indeksni belgilaydi
String. If operatoridagi shart (22-satr) har bir satrning kirish-qilmasligini aniqlaydi
massivda har bir Stringdagi uchinchi belgidan boshlanadigan "art" belgilar mavjud. Agar shunday bo'lsa,
usul haqiqatni qaytaradi va dastur Stringni chop etadi.
Uchinchi for bayonoti (30–34-qatorlar) endsWith usulidan foydalanadi, bu esa Stringni oladi.
dalil. 32-qatordagi shart massivdagi har bir String bilan tugashini aniqlaydi
belgilar "ed". Agar shunday bo'lsa, usul haqiqatni qaytaradi va dastur Stringni chop etadi.
14.3.4 Stringlarda belgilar va pastki qatorlarni joylashtirish
Ko'pincha belgilar yoki belgilar to'plami uchun satrni qidirish foydalidir. Misol uchun, agar siz bo'lsangiz
o'z so'z protsessoringizni yaratganingizda, siz qidiruv qobiliyatini taqdim etishni xohlashingiz mumkin
hujjatlar orqali. 14.5-rasmda String usullarining ko'p versiyalari ko'rsatilgan
indexOf va lastIndexOf satrda belgilangan belgi yoki pastki qatorni qidiradi.

"started" "st" bilan boshlanadi


"boshlash" "st" bilan boshlanadi

"boshlangan" 2-pozitsiyada "san'at" bilan boshlanadi


"boshlash" 2-pozitsiyada "san'at" bilan boshlanadi

"started" "ed" bilan tugaydi


"tugadi" "ed" bilan tugaydi

1 // 14.5-rasm: StringIndexMethods.java


2 // indexOf va lastIndexOf qatorlarni qidirish usullari.
3
4 umumiy sinf StringIndexMethods
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 qatorli harflar = "abcdefghijklmabcdefghijklm";
9
10 // satrdagi belgini aniqlash uchun indexOf ni sinab ko'ring
11 System.out.printf(
12 "'c" %d%n indeksida joylashgan, );
13 System.out.printf(
14 "'a" %d%n indeksida joylashgan, );
15 System.out.printf(
16 "'$' %d%n%n indeksida joylashgan", );
17

14.5-rasm | String-qidiruv usullari indexOf va lastIndexOf. (2-qismning 1-qismi.)

14.4-rasm | String usullari startsWith va endsWith. (2-qismning 2-qismi.)

letters.indexOf('c')

letters.indexOf('a', 1)

letters.indexOf('$')


606 14-bob Satrlar, belgilar va muntazam ifodalar

Ushbu misoldagi barcha qidiruvlar String harflarida amalga oshiriladi (boshlang'ich
"abcdefghijklmabcdefghijklm"). 11-16 qatorlar birinchisini topish uchun indexOf usulidan foydalanadi
Stringdagi belgining paydo bo'lishi. Agar usul belgini topsa, u belgini qaytaradi
Stringdagi akter indeksi - aks holda u –1 ni qaytaradi. indexOf ning ikkita versiyasi mavjud
Stringdagi belgilarni qidiradigan. 12-qatordagi ifoda usul versiyasidan foydalanadi
indexOf topish uchun belgining butun sonini oladi. Chiziqdagi ifoda
14 indexOf usulining boshqa versiyasidan foydalanadi, u ikkita butun son argumentini oladi - the
belgi va Stringni qidirish boshlanishi kerak bo'lgan boshlang'ich indeks.

18 // satrdagi belgini topish uchun lastIndexOf ni sinab ko'ring


19 System.out.printf("Oxirgi "c" %d%n indeksida joylashgan",
20);
21 System.out.printf("Oxirgi "a" %d%n indeksida joylashgan",
22);
23 System.out.printf("Oxirgi '$' %d%n%n indeksida joylashgan",
24);
25
26 // satrdagi pastki qatorni topish uchun indexOf ni sinab ko'ring
27 System.out.printf("\"def\" %d%n indeksida joylashgan",
28);
29 System.out.printf("\"def\" %d%n indeksida joylashgan",
30);
31 System.out.printf("\"salom\" %d%n%n indeksida joylashgan",
32);
33
34 // satrdagi pastki qatorni topish uchun lastIndexOf ni sinab ko'ring
35 System.out.printf("Oxirgi \"def\" %d%n indeksida joylashgan",
36);
37 System.out.printf("Oxirgi \"def\" %d%n indeksida joylashgan",
38);
39 System.out.printf("Oxirgi \"salom\" %d%n indeksida joylashgan",
40);
41 }
42 } // oxirgi sinf StringIndexMethods

'c' indeks 2 da joylashgan


'a' 13 indeksda joylashgan
'$' -1 indeksida joylashgan

Oxirgi "c" indeks 15 da joylashgan


Oxirgi "a" indeks 13 da joylashgan
Oxirgi "$" -1 indeksida joylashgan

"def" indeks 3 da joylashgan


"def" 16 indeksda joylashgan
"salom" -1 indeksida joylashgan

Oxirgi "def" indeks 16 da joylashgan


Oxirgi "def" indeks 16 da joylashgan
Oxirgi "salom" -1 indeksida joylashgan

14.5-rasm | String-qidiruv usullari indexOf va lastIndexOf. (2-qismning 2-qismi.)

letters.lastIndexOf('c')

letters.lastIndexOf('a', 25)

letters.lastIndexOf('$')

letters.indexOf("def")

letters.indexOf("def", 7)

letters.indexOf("salom")

letters.lastIndexOf("def")

letters.lastIndexOf("def", 25)

letters.lastIndexOf("salom")

14.3 Class String 607

19–24-qatorlarda belgining oxirgi paydo boʻlishini aniqlash uchun lastIndexOf usuli qoʻllaniladi.
String. Usul String oxiridan boshigacha qidiradi. Agar topsa
belgi bo'lsa, u Stringdagi belgi indeksini qaytaradi - aks holda -1 ni qaytaradi.
Stringdagi belgilarni qidiradigan lastIndexOf ning ikkita versiyasi mavjud. ifoda-
20-qatordagi sion belgining butun sonini oladigan versiyadan foydalanadi. The
22-satrdagi ifoda ikkita tamsayı argumentini oladigan versiyadan foydalanadi - butun sonni aks ettiruvchi
Belgining yuborilishi va orqaga qarab qidirishni boshlash uchun indeks.
27–40 qatorlar indexOf va lastIndexOf usullarining har biri uchun versiyalarini ko'rsatadi.
birinchi argument sifatida Stringni oling. Ushbu versiyalar tavsiflanganlar bilan bir xil ishlaydi
avvalroq ular belgilangan belgilar ketma-ketligini (yoki pastki qatorlarni) qidiradi
ularning String argumentlari bilan. Agar pastki qator topilsa, bu usullar indeksni qaytaradi
pastki qatordagi birinchi belgining satri.
14.3.5 Satrlardan pastki satrlarni ajratib olish
Class String yangi String ob'ektini yaratish uchun ikkita pastki qatorni ta'minlaydi.
Mavjud String ob'ektining bir qismini nusxalash orqali ed. Har bir usul yangi String obyektini qaytaradi.
Ikkala usul ham 14.6-rasmda ko'rsatilgan.

12-satrdagi letters.substring(20) ifodasi substring usulidan foydalanadi


bitta butun son argumentini oladi. Argument asl nusxadagi boshlang'ich indeksni belgilaydi
Belgilardan nusxa ko'chirish kerak bo'lgan qator harflar. Qaytarilgan pastki qator o'z ichiga oladi
boshlang'ich indeksdan String oxirigacha bo'lgan belgilarning nusxasi. Belgilash a
String chegarasidan tashqaridagi indeks StringIndexOutOfBoundsExceptionni keltirib chiqaradi.
15-qator ikkita butun son argumentini qabul qiluvchi pastki qator usulidan foydalanadi - boshlanish
asl Stringdagi belgilarni nusxalash uchun indeks va undan keyingi indeks

1 // 14.6-rasm: SubString.java


2 // String sinfi pastki qator usullari.
3
4 umumiy sinf SubString
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 qatorli harflar = "abcdefghijklmabcdefghijklm";
9
10 // test pastki qator usullari
11 System.out.printf("20-indeksdan oxirigacha bo'lgan pastki qator - \"%s\"%n",
12);
13 System.out.printf("%s \"%s\"%n",
14 "Indeks 3 dan 6 gacha bo'lgan pastki qator",
15);
16 }
17 } // oxirgi sinf SubString

Indeks 20 dan oxirigacha bo'lgan pastki qator "hijklm"


Indeks 3 dan 6 gacha bo'lgan, lekin 6 dan tashqari pastki qator "def"

14.6-rasm | String sinfining pastki qator usullari.

letters.substring(20)

letters.substring(3, 6)


608 14-bob Satrlar, belgilar va muntazam ifodalar

nusxa ko'chirish uchun oxirgi belgi (ya'ni, Stringdagi indeksgacha nusxa ko'chiring, lekin shu indeksni qo'shmaydi). The
Qaytarilgan pastki qator asl Stringdagi belgilangan belgilarning nusxasini o'z ichiga oladi. An
String chegarasidan tashqaridagi indeks StringIndexOutOfBoundsExceptionni keltirib chiqaradi.
14.3.6 Birlashtiruvchi satrlar
String usuli concat (14.7-rasm) ikkita String ob'ektini (+ dan foydalanishga o'xshash) birlashtiradi.
operator) va ikkala asl nusxadagi belgilarni o'z ichiga olgan yangi String ob'ektini qaytaradi
Satrlar. 13-qatordagi s1.concat(s2) ifodasi belgini qo'shish orqali String hosil qiladi.
s2dagi aktyorlar s1dagilarga. s1 va s2 tegishli bo'lgan asl satrlar o'zgartirilmaydi.

14.3.7 Turli qatorli usullar


Class String o'z ichiga olgan strings yoki belgilar massivlarini qaytaradigan bir nechta usullarni taqdim etadi
asl String tarkibining nusxalari, keyinchalik o'zgartiriladi. Bu usullar - yo'q
Ulardan o'zlari chaqirilgan Stringni o'zgartiradi - 14.8-rasmda ko'rsatilgan.

1 // 14.7-rasm: StringConcatenation.java


2 // String usuli concat.
3
4 umumiy sinf StringConcatenation
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 string s1 = "Baxtli";
9 string s2 = "Tug'ilgan kun";
10
11 System.out.printf("s1 = %s%ns2 = %s%n%n",s1, s2);
12 System.out.printf(
13 "s1.concat(s2) natijasi = %s%n", );
14 System.out.printf("birlashtirishdan keyin s1 = %s%n", s1);
15 }
16 } // tugatish sinfi StringConcatenation

s1 = Baxtli


s2 = Tug'ilgan kun
s1.concat(s2) natijasi = Tug'ilgan kuningiz bilan
Biriktiruvdan keyin s1 = Baxtli

14.7-rasm | String usuli concat.

1 // 14.8-rasm: StringMiscellaneous2.java
2 // String usullari almashtiriladi, toLowerCase, toUpperCase, trim va toCharArray.
3
4 umumiy sinf StringMiscellaneous2
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {

14.8-rasm | String usullari almashtiriladi, toLowerCase, toUpperCase, trim va toCharArray.


(2-qismning 1-qismi.)

s1.concat(s2)


14.3 Class String 609

16-qator yangi String ob'ektini qaytarish uchun String almashtirish usulidan foydalanadi
s1 dagi “l” (kichik el) belgisi “L” belgisi bilan almashtiriladi. Usul
almashtirish asl Stringni o'zgarishsiz qoldiradi. Agar birinchi argumentlarning hodisalari bo'lmasa
Stringdagi ment, replace usuli asl Stringni qaytaradi. Haddan tashqari yuklangan versiya
almashtirish usuli alohida belgilarni emas, balki pastki qatorlarni almashtirish imkonini beradi.
19-qator bosh harf bilan yangi String yaratish uchun toUpperCase String usulidan foydalanadi
s1 da tegishli kichik harflar mavjud bo'lgan harflar. Usul yangi Stringni qaytaradi
o'zgartirilgan Stringni o'z ichiga olgan ob'ekt va asl Stringni o'zgarishsiz qoldiradi. Agar bor bo'lsa
o'zgartiradigan belgilar bo'lmasa, toUpperCase usuli asl Stringni qaytaradi.

8 String s1 = "salom";


9 qator s2 = "Xayr";
10 String s3 = "bo'shliqlar";
11
12 System.out.printf("s1 = %s%ns2 = %s%ns3 = %s%n%n", s1, s2, s3);
13
14 // sinov usulini almashtiring
15 System.out.printf(
16 "s1 da 'l' ni 'L' bilan almashtiring: %s%n%n", );
17
18 // LowerCase va toUpperCase ni sinab ko'ring
19 System.out.printf("s1.toUpperCase() = %s%n", );
20 System.out.printf("s2.toLowerCase() = %s%n%n", );
21
22 // test kesish usuli
23 System.out.printf("s3 trimdan keyin = \"%s\"%n%n", );
24
25 // CharArray usulini sinab ko'ring
26
27 System.out.print("s1 belgilar qatori sifatida = ");
28
29 uchun (belgi belgisi: charArray)
30 System.out.print(belgi);
31
32 System.out.println();
33 }
34 } // tugatish sinfi StringMiscellaneous2

s1 = salom


s2 = Xayr
s3 = bo'shliqlar

s1 da "l" ni "L" bilan almashtiring: hLLo

s1.toUpperCase() = SALOM
s2.toLowerCase() = xayr

trimdan keyin s3 = "bo'shliqlar"

s1 belgilar qatori sifatida = salom

14.8-rasm | String usullari almashtiriladi, toLowerCase, toUpperCase, trim va toCharArray.


(2-qismning 2-qismi.)

s1.almashtirish('l', 'L')

s1.toUpperCase()
s2.toLowerCase()

s3.trim()

char[] charArray = s1.toCharArray();

610 14-bob Satrlar, belgilar va oddiy iboralar

20-qator yangi String obyektini qaytarish uchun toLowerCase String usulidan foydalanadi.
s2 da tegishli bosh harflar mavjud bo'lgan katta harflar. Asl String qoladi
o'zgarmagan. Agar o'zgartirish uchun asl Stringda belgilar bo'lmasa, toLowerCase
asl Stringni qaytaradi.
23-qator barchani olib tashlaydigan yangi String obyektini yaratish uchun String usuli trimidan foydalanadi
bo'sh bo'sh joy belgilari bo'lgan String boshida va/yoki oxirida paydo bo'ladi
trim ishlaydi. Usul String holda yangi String obyektini qaytaradi
oldingi yoki keyingi oq bo'shliq. Asl String o'zgarishsiz qoladi. Agar yo'q bo'lsa
boshida va/yoki oxirida bo'sh bo'shliq belgilari, trim asl Stringni qaytaradi.
26-qator yangi belgilar qatorini yaratish uchun toCharArray String usulidan foydalanadi
s1-dagi belgilarning nusxasi. 29–30 qatorlar massivdagi har bir belgini chiqaradi.
14.3.8 String usuli qiymatiOf
Ko'rib turganimizdek, Java'dagi har bir ob'ekt dasturni olish imkonini beruvchi toString usuliga ega
ob'ektning satr tasviri. Afsuski, bu usulni primer bilan ishlatib bo'lmaydi.
itiv tiplari, chunki ular usullari yo'q. Class String statik usullarni taqdim etadi
har qanday turdagi argumentni oling va uni String ob'ektiga aylantiring. 14.9-rasmda ko'rsatilgan
String sinf valueOf usullari.
18-qatordagi String.valueOf(charArray) ifodasi char- belgilar massividan foydalanadi.
Yangi String obyektini yaratish uchun massiv. String.valueOf(charArray, 3, 3) ifodasi
20-satrda charArray belgilar qatorining bir qismi yangi String obyektini yaratish uchun foydalanadi.
Ikkinchi argument belgilar ishlatiladigan boshlang'ich indeksni belgilaydi. The
uchinchi argument foydalaniladigan belgilar sonini belgilaydi.

1 // 14.9-rasm: StringValueOf.java


2 // String valueOf usullari.
3
4 umumiy sinf StringValueOf
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 ta char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'};
9 mantiqiy booleanValue = rost;
10 ta belgili belgiValue = 'Z';
11 int integerValue = 7;
12
13
14 double doubleValue = 33,333; // qo'shimchasiz, double sukut bo'yicha
15 Object objectRef = "salom"; // Ob'ekt havolasiga satr tayinlash
16
17 System.out.printf(
18 "char massivi = %s%n", );
19 System.out.printf("char massiv qismi = %s%n",
20);
21 System.out.printf(
22 "boolean = %s%n", );
23 System.out.printf(
24 "char = %s%n", );

14.9-rasm | String valueOf usullari. (2-qismning 1-qismi.)

long longValue = 10000000000L; // L qo'shimchasi uzunlikni bildiradi
float floatValue = 2.5f; // f 2,5 float ekanligini bildiradi

String.valueOf(charArray)

String.valueOf(charArray, 3, 3)

String.valueOf(booleanValue)

String.valueOf(characterValue)

14.4 StringBuilder 611 sinfi

ValueOf usulining yana yettita versiyasi mavjud bo'lib, ular turdagi argumentlarni oladi
mantiqiy, char, int, long, float, double va Object. Bular jin-
21–30 qatorlarda chizilgan. Argument sifatida Ob'ektni oladigan valueOf versiyasi mumkin
buni qiling, chunki barcha ob'ektlar toString usuli bilan Strings ga aylantirilishi mumkin.
[Izoh: 12–13-qatorlarda boshlangʻich qiymatlar sifatida 10000000000L va 2.5f literal qiymatlari qoʻllaniladi.
mos ravishda long o'zgaruvchisi longValue va float o'zgaruvchisi floatValue. Odatiy bo'lib, Java
butun sonli literallarni int tipidagi va suzuvchi nuqtali literallarni double turi sifatida ko'rib chiqadi. Qo'shish
10000000000 harfiga L harfi va 2.5 harfiga f qo'shilishi
10000000000 uzun va 2,5 float sifatida ko'rib chiqilishi kerak bo'lgan kompilyator. Katta harf
L yoki kichik l uzun turdagi o'zgaruvchini va katta F yoki kichik harfni belgilash uchun ishlatilishi mumkin.
ercase f float tipidagi o'zgaruvchini belgilash uchun ishlatilishi mumkin.]
14.4 Class StringBuilder
Endi biz dinamikani yaratish va boshqarish uchun StringBuilder sinfining xususiyatlarini muhokama qilamiz.
ic string ma'lumotlari - ya'ni o'zgartiriladigan satrlar. Har bir StringBuilder saqlashga qodir-
sig'imi bo'yicha ko'rsatilgan bir qator belgilar. Agar StringBuilderning imkoniyatlari bo'lsa
oshib ketgan bo'lsa, sig'im qo'shimcha belgilarni joylashtirish uchun kengayadi.

25 System.out.printf("int = %s%n", );


26 System.out.printf("long = %s%n", );
27 System.out.printf("float = %s%n", );
28 System.out.printf(
29 "double = %s%n", );
30 System.out.printf("Ob'ekt = %s", );
31 }
32 } // tugatish sinfi StringValueOf

char massivi = abcdef


char massivining bir qismi = def
mantiqiy = rost
belgi = Z
int = 7
uzun = 10000000000
float = 2,5
ikki barobar = 33,333
Ob'ekt = salom

Ishlash bo'yicha maslahat 14.3


Java String ob'ektlari (masalan, biriga murojaat qilish) bilan ma'lum optimallashtirishlarni amalga oshirishi mumkin
Bir nechta o'zgaruvchilardan string ob'ekti), chunki u bu ob'ektlar o'zgarmasligini biladi.
Ma'lumotlar o'zgarmasa, strings (StringBuilders emas) ishlatilishi kerak.

Ishlash bo'yicha maslahat 14.4


Tez-tez satrlarni birlashtirish yoki boshqa qator o'zgartirishlarni amalga oshiradigan dasturlarda,
StringBuilder sinfi bilan o'zgartirishlarni amalga oshirish ko'pincha samaraliroq.

14.9-rasm | String valueOf usullari. (2-qismning 2-qismi.)

String.valueOf(integerValue)
String.valueOf(longValue)
String.valueOf(floatValue)

String.valueOf(doubleValue)


String.valueOf(objectRef)

612 14-bob Satrlar, belgilar va oddiy iboralar

14.4.1 StringBuilder konstruktorlari
Class StringBuilder to'rtta konstruktorni taqdim etadi. Biz ulardan uchtasini ko'rsatamiz
14.10-rasm. 8-qator String-ni yaratish uchun argumentsiz StringBuilder konstruktoridan foydalanadi.
Hech qanday belgilarsiz quruvchi va boshlang'ich sig'imi 16 ta belgidan iborat (a
StringBuilder). 9-qatorda butun sonni oladigan StringBuilder konstruktori ishlatiladi.
Hech qanday belgilarsiz va belgilangan boshlang'ich sig'imi bo'lmagan StringBuilder yaratish uchun
butun son argumenti bo'yicha (ya'ni, 10). 10-qator StringBuilder konstruktoridan foydalanadi
String argumentidagi belgilarni o'z ichiga olgan StringBuilder yaratish uchun string argumenti
gument. Dastlabki sig'im - bu String argumentidagi belgilar soni va 16 ga teng.
12–14 qatorlar chiqarish uchun StringBuilder sinfining toString usulidan bilvosita foydalanadi
printf usuli bilan StringBuilders. 14.4.4-bo'limda biz Java-dan qanday foydalanishni muhokama qilamiz
StringBuilder obyektlari satrlarni birlashtirish uchun + va += operatorlarini amalga oshiradi.

14.4.2 StringBuilder usullari uzunligi, sig'imi, to'plamiLength va


Imkoniyatlarni ta'minlash
Class StringBuilder sonini qaytarish uchun usullar uzunligi va imkoniyatlarini taqdim etadi
StringBuilder dasturidagi belgilar va saqlanishi mumkin boʻlgan belgilar soni

Dasturiy ta'minot muhandisligi kuzatuvi 14.1


StringBuilders ip xavfsiz emas. Agar bir nechta mavzular bir xilga kirishni talab qilsa
dinamik satr ma'lumotlari uchun kodingizda StringBuffer sinfidan foydalaning. StringBuilder sinflari
va StringBuffer bir xil imkoniyatlarni ta'minlaydi, ammo StringBuffer klassi ip xavfsizdir.
Ip o'tkazish haqida ko'proq ma'lumot olish uchun 23-bobga qarang.

1 // 14.10-rasm: StringBuilderConstructors.java


2 // StringBuilder konstruktorlari.
3
4 umumiy sinf StringBuilderConstructors
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8
9
10
11
12 System.out.printf("bufer1 = \"%s\"%n", bufer1);
13 System.out.printf("bufer2 = \"%s\"%n", bufer2);
14 System.out.printf("bufer3 = \"%s\"%n", bufer3);
15 }
16 } // StringBuilderConstructors oxirgi sinfi

bufer1 = ""


bufer2 = ""
bufer3 = "salom"

14.10-rasm | StringBuilder konstruktorlari.

StringBuilder bufer1 = yangi StringBuilder();
StringBuilder bufer2 = yangi StringBuilder(10);
StringBuilder bufer3 = yangi StringBuilder("salom");

14.4 Class StringBuilder 613

StringBuilder-da mos ravishda ko'proq xotira ajratmasdan. Ta'minlash usuli -
Imkoniyat StringBuilder kamida belgilangan imkoniyatlarga ega ekanligini kafolatlaydi. Usul
setLength StringBuilder uzunligini oshiradi yoki kamaytiradi. 14.11-rasm jin-
bu usullarni belgilaydi.

Ilovada bufer deb nomlangan bitta StringBuilder mavjud. 8-qator String-dan foydalanadi


StringBuilderni ishga tushirish uchun String argumentini oladigan Builder konstruktori
"Salom qalaysiz?". 10-11 qatorlar mazmuni, uzunligi va hajmini chop etadi
StringBuilder. Chiqish oynasida StringBuilder sig'imi ini-
35. Eslatib o'tamiz, String argumentini qabul qiluvchi StringBuilder konstruktori-
sig'imni argument sifatida berilgan satr uzunligiga plyus 16 ga tenglashtiradi.
13-qator StringBuilder imkoniyatlarini kengaytirish uchun provideCapacity usulidan foydalanadi
kamida 75 ta belgi. Aslida, agar asl sig'im argumentdan kamroq bo'lsa,
usul argument sifatida ko'rsatilgan sondan kattaroq hajmni ta'minlaydi
va ikki barobar asl sig'im plus 2. StringBuilder ning joriy sig'imi qoladi
belgilangan hajmdan ortiq bo'lsa, o'zgarmaydi.

1 // 14.11-rasm: StringBuilderCapLen.java


2 // StringBuilder uzunligi, setLength, sig'im va provideCapacity usullari.
3
4 umumiy sinf StringBuilderCapLen
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 StringBuilder buferi = yangi StringBuilder("Salom, yaxshimisiz?");
9
10 System.out.printf("bufer = %s%nlength = %d%ncopacity = %d%n%n",
11 buffer.toString(), , );
12
13
14 System.out.printf("Yangi sig'im = %d%n%n", );
15
16
17 System.out.printf("Yangi uzunlik = %d%nbufer = %s%n",
18 , buffer.toString());
19 }
20 } // oxirgi sinf StringBuilderCapLen

bufer = Salom, yaxshimisiz?


uzunligi = 19
sig'imi = 35

Yangi sig'im = 75

Yangi uzunlik = 10
bufer = Salom, qanday qilib

14.11-rasm | StringBuilder uzunligi, setLength, sig'im va ta'minlashCapacity


usullari.

buffer.length() buffer.capacity()

buffer.ensureCapacity(75);

buffer.capacity()

buffer.setLength(10));

buffer.length()


614 14-bob Satrlar, belgilar va muntazam ifodalar

16-qator StringBuilder uzunligini 10 ga belgilash uchun setLength usulidan foydalanadi.
belgilangan uzunlik StringBuilder-dagi joriy belgilar sonidan kamroq, uning
kontent belgilangan uzunlikka (ya'ni, StringBuilder-dagi belgilar) qisqartiriladi
belgilangan uzunlik bekor qilingandan keyin). Belgilangan uzunlik raqamdan kattaroq bo'lsa
Hozirda StringBuilder-dagi belgilar soni, null belgilar (
Raqamli ko'rinish 0) belgilarning umumiy soniga qadar qo'shiladi
StringBuilder belgilangan uzunlikka teng.
14.4.3 StringBuilder usullari charAt, setCharAt, getChars va
teskari
Class StringBuilder charAt, setCharAt, getChars va ma-ga teskari usullarni taqdim etadi.
StringBuilder-da belgilarni nipulatsiyalash (14.12-rasm). charAt usuli (12-satr) a oladi
integer argumenti va o'sha indeksdagi StringBuilderdagi belgini qaytaradi. Usul
getChars (15-qator) StringBuilder-dan belgilarni uzatilgan belgilar qatoriga nusxalaydi
argument sifatida. Ushbu usul to'rtta argumentni oladi - boshlang'ich indeks qaysi belgidan
ters StringBuilder-ga ko'chirilishi kerak, indeks ko'chiriladigan oxirgi belgidan bir o'tgan
StringBuilder'dan, belgilar ko'chirilishi kerak bo'lgan belgilar qatori va
birinchi belgi joylashtirilishi kerak bo'lgan belgilar qatoridagi boshlang'ich joy. Usul
setCharAt (21 va 22-qatorlar) butun son va belgilar argumentini oladi va belgini o'rnatadi
Belgilar argumentiga StringBuilder-da belgilangan pozitsiyada. Usul teskari
(25-satr) StringBuilder tarkibini o'zgartiradi. Belgiga kirishga urinish
StringBuilder chegarasidan tashqarida StringIndexOutOfBoundsException natija beradi.

Ishlash bo'yicha maslahat 14.5


StringBuilder quvvatini dinamik ravishda oshirish nisbatan uzoq vaqt talab qilishi mumkin.
Ushbu operatsiyalarning ko'p qismini bajarish dasturning ish faoliyatini yomonlashtirishi mumkin.
tion. Agar StringBuilder hajmi sezilarli darajada o'sadigan bo'lsa, ehtimol bir necha marta, sozlash
uning quvvati boshida yuqori bo'lishi unumdorlikni oshiradi.

1 // 14.12-rasm: StringBuilderChars.java


2 // StringBuilder usullari charAt, setCharAt, getChars va teskari.
3
4 umumiy sinf StringBuilderChars
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 StringBuilder buferi = yangi StringBuilder("salom");
9
10 System.out.printf("bufer = %s%n", bufer.toString());
11 System.out.printf("0-da belgi: %s%n4-da belgi: %s%n%n",
12 , );
13
14 ta char[] charArray = new char[buffer.length()];
15
16 System.out.print("Belgilar: ");

14.12-rasm | StringBuilder usullari charAt, setCharAt, getChars va teskari. (1-qism


dan 2.)

buffer.charAt(0) buffer.charAt(4)

buffer.getChars(0, buffer.length(), charArray, 0);

14.4 StringBuilder 615 sinfi

14.4.4 StringBuilder qo'shimcha usullari
Class StringBuilder qiymatlariga ruxsat berish uchun haddan tashqari yuklangan qo'shish usullarini taqdim etadi (14.13-rasm).
StringBuilder oxiriga qo'shiladigan turli xil turlari. Versiyalar taqdim etiladi
ibtidoiy turlarning har biri va belgilar massivlari, Stringlar, Ob'ektlar va boshqalar uchun. (Yodda tuting -
toString usuli har qanday Ob'ektning satrli tasvirini ishlab chiqaradi.) Har bir usul
argumentini oladi, uni satrga aylantiradi va StringBuilder-ga qo'shadi.

17
18 uchun (belgi belgisi: charArray)


19 System.out.print(belgi);
20
21
22
23 System.out.printf("%n%nbufer = %s", bufer.toString());
24
25
26 System.out.printf("%n%nbufer = %s%n", bufer.toString());
27 }
28 } // StringBuilderChars oxirgi sinfi

bufer = salom


0 da belgi: h
4-raqamdagi belgi: o

Qahramonlar: salom

bufer = Salom

bufer = erehT olleH

1 // 14.13-rasm: StringBuilderAppend.java
2 // StringBuilder qo'shish usullari.
3
4 umumiy sinf StringBuilderAppend
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 Object objectRef = "salom";
9 String string = "xayr";
10 ta char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'};
11 mantiqiy booleanValue = rost;
12 belgili belgiValue = 'Z';
13 int integerValue = 7;
14 uzun longValue = 10000000000L;
15 float floatValue = 2.5f;
16 double doubleValue = 33.333;

14.13-rasm | StringBuilder qo'shish usullari. (2-qismning 1-qismi.)

14.12-rasm | StringBuilder usullari charAt, setCharAt, getChars va teskari. (2-qism
dan 2.)

buffer.setCharAt(0, 'H');


buffer.setCharAt(6, 'T');

buffer.reverse();


616 14-bob Satrlar, belgilar va muntazam ifodalar

Kompilyator + ni amalga oshirish uchun StringBuilder va qo'shish usullaridan foydalanishi mumkin
va += Satrlarni birlashtirish operatorlari. Masalan, deklaratsiyalarni nazarda tutsak

bayonot


17
18 StringBuilder lastBuffer = new StringBuilder("oxirgi bufer");
19 StringBuilder buferi = yangi StringBuilder();
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 System.out.printf("buferda %n%s%n mavjud", bufer.toString());
44 }
45 } // tugatish StringBuilderAppend

bufer o'z ichiga oladi


Salom
Xayr. Salomat bo'ling
abcdef
abc
rost
Z
7
10000000000
2.5
33.333
oxirgi bufer

String string1 = "salom";


String string2 = "BC";
int qiymati = 22;

String s = string1 + string2 + qiymat;

14.13-rasm | StringBuilder qo'shish usullari. (2-qismning 2-qismi.)

buffer.append(objectRef)


.append("%n")
.append(string)
.append("%n")
.append(charArray)
.append("%n")
.append(charArray, 0, 3)
.append("%n")
.append(booleanValue)
.append("%n")
.append(characterValue);
.append("%n")
.append(integerValue)
.append("%n")
.append(longValue)
.append("%n")
.append(floatValue)
.append("%n")
.append(doubleValue)
.append("%n")
.append(lastBuffer);

14.4 Class StringBuilder 617

"salom", "BC" va 22-ni birlashtiradi. Birlashtiruvchi quyidagi tarzda bajarilishi mumkin:

Birinchidan, oldingi bayonot bo'sh StringBuilder-ni yaratadi, so'ngra unga qo'shiladi


"salom" va "BC" qatorlari va butun son 22. Keyin, StringBuilder toString usuli
StringBuilderni String s ga tayinlanadigan String ob'ektiga aylantiradi. Bayonot

quyidagicha bajarilishi mumkin (bu kompilyatorga qarab farq qilishi mumkin):

Bu bo'sh StringBuilder-ni yaratadi, so'ngra unga s fol-ning joriy tarkibini qo'shadi.
"!" tomonidan tushirilgan. Keyinchalik, StringBuilderning toString usuli (uni aniq chaqirish kerak
bu yerda) StringBuilder tarkibini String sifatida qaytaradi va natija s ga tayinlanadi.
14.4.5 StringBuilder qo'shish va o'chirish usullari
StringBuilder har xil turdagi qiymatlarni kiritish uchun haddan tashqari yuklangan kiritish usullarini taqdim etadi
StringBuilder-dagi har qanday pozitsiya. Versiyalar ibtidoiy turlar va uchun taqdim etiladi
belgilar massivlari, Strings, Objects va CharSequences. Har bir usul ikkinchi ar-
gument va uni birinchi argument tomonidan belgilangan indeksga kiritadi. Agar birinchi dalil bo'lsa
0 dan kam yoki StringBuilder uzunligidan kattaroq, StringIndexOutOfBounds-
Istisno sodir bo'ladi. Class StringBuilder shuningdek, CharAtni o'chirish va o'chirish usullarini ham taqdim etadi
StringBuilder-ning istalgan joyidagi belgilarni o'chirish uchun. O'chirish usuli ikkita argument oladi
ments - boshlang'ich indeks va o'chiriladigan belgilar oxiridan bir keyingi indeks. Hammasi
Boshlang'ich indeksdan boshlab, oxirigacha bo'lgan, lekin oxirigacha bo'lmagan belgilar ajratiladi.
ruxsat berdi. DeleteCharAt usuli bitta argumentni oladi - o'chiriladigan belgi indeksi.
Noto'g'ri indekslar ikkala usulda StringIndexOutOfBoundsException ni chiqarishga olib keladi.
14.14-rasmdaCharAt kiritish, o'chirish va o'chirish usullari ko'rsatilgan.

String s = yangi StringBuilder().append("salom").append("BC").


append(22).toString();

s += "!";

s = new StringBuilder().append(s).append("!").toString();

1 // 14.14-rasm: StringBuilderInsertDelete.java


2 // StringBuilder usullari CharAtni qo'shish, o'chirish va o'chirish.
3
4 umumiy sinf StringBuilderInsertDelete
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 Object objectRef = "salom";
9 String string = "xayr";
10 ta char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'};
11 mantiqiy booleanValue = rost;
12 belgili belgiValue = 'K';
13 int integerValue = 7;
14 long longValue = 10000000;
15 float floatValue = 2.5f; // f qo'shimchasi 2,5 ning float ekanligini bildiradi
16 double doubleValue = 33.333;
17

14.14-rasm | StringBuilder usullariCharAt-ni qo'shish, o'chirish va o'chirish. (2-qismning 1-qismi.)


618 14-bob Satrlar, belgilar va muntazam ifodalar

14.5 Sinf belgisi
Java sakkiz turdagi o'rash sinflarini taqdim etadi - Mantiqiy, Belgilar, Double, Float, Bayt,
Qisqa, Integer va Long - bu ibtidoiy turdagi qiymatlarni ob'ekt sifatida ko'rib chiqishga imkon beradi. In
Ushbu bo'limda biz Character sinfini taqdim etamiz - ibtidoiy turdagi char uchun tur-o'rash sinfi.
Ko'pgina belgilar usullari ishlov berishda qulaylik uchun mo'ljallangan statik usullardir
individual belgilar qiymatlari. Bu usullar hech bo'lmaganda xarakter argumentini oladi va bajaradi
yo sinov yoki xarakterning manipulyatsiyasi. Sinf belgisi shuningdek, kon-
Character obyektini ishga tushirish uchun char argumentini qabul qiluvchi struktura. Ko'pchilik
Xarakter sinfining usullari keyingi uchta misolda keltirilgan. Qo'shimcha ma'lumot uchun -

18 StringBuilder buferi = yangi StringBuilder();


19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 System.out.printf(
41 "qo'shimchalardan keyingi bufer:%n%s%n%n", buffer.toString());
42
43 buffer.deleteCharAt(10); // 2,5 da 5 tani o'chirish
44 buffer.delete(2, 6); // 33.333-dagi .333-ni o'chirish
45
46 System.out.printf(
47 "oʻchirishdan keyingi bufer:%n%s%n", buffer.toString());
48 }
49 } // oxirgi sinf StringBuilderInsertDelete

qo'shimchalardan keyin bufer:


33.333 2.5 10000000 7 K rost def abcdef xayr salom

o'chirishdan keyin bufer:


33 2. 10000000 7 K rost def abcdef xayr salom

14.14-rasm | StringBuilder usullariCharAt-ni qo'shish, o'chirish va o'chirish. (2-qismning 2-qismi.)

buffer.insert(0, objectRef);
buffer.insert(0, ""); // ularning har birida ikkita bo'sh joy mavjud
buffer.insert(0, string);
buffer.insert(0, "");
buffer.insert(0, charArray);
buffer.insert(0, "");
buffer.insert(0, charArray, 3, 3);
buffer.insert(0, "");
buffer.insert(0, booleanValue);
buffer.insert(0, "");
buffer.insert(0, characterValue);
buffer.insert(0, "");
buffer.insert(0, integerValue);
buffer.insert(0, "");
buffer.insert(0, longValue);
buffer.insert(0, "");
buffer.insert(0, floatValue);
buffer.insert(0, "");
buffer.insert(0, doubleValue);

14.5 619-sinf belgisi

Belgilar sinfida (va barcha turdagi o'rash sinflari) java.lang paketiga qarang
Java API hujjatlari.
14.15-rasmda belgilarni aniqlash uchun statik usullar ko'rsatilgan
ular muayyan belgilar turi va katta-kichik registrlarni o'zgartirishni amalga oshiradigan statik usullardir
belgilar. Siz istalgan belgini kiritishingiz va belgilarga usullarni qo'llashingiz mumkin.

1 // 14.15-rasm: StaticCharMethods.java


2 // Belgilarni sinash va registrni o'zgartirish uchun belgilarning statik usullari.
3 import java.util.Scanner;
4
5 umumiy sinf StaticCharMethods
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 Skaner skaneri = yangi Skaner(System.in); // skaner yaratish
10 System.out.println("Belgi kiriting va Enter tugmasini bosing");
11 String kiritish = scanner.next();
12
13
14 // belgilar ma'lumotlarini ko'rsatish
15 System.out.printf("aniqlangan: %b%n", );
16 System.out.printf("raqam: %b%n", );
17 System.out.printf("Java identifikatoridagi birinchi belgi: %b%n",
18);
19 System.out.printf("Java identifikatorining bir qismi: %b%n",
20);
21 System.out.printf("harf: %b%n", );
22 System.out.printf(
23 "harf yoki raqam: %b%n", );
24 System.out.printf(
25 "kichik harf: %b%n", );
26 System.out.printf(
27 "katta harf: %b%n", );
28 System.out.printf(
29 "katta harfga: %s%n", );
30 System.out.printf(
31 "kichik harfga: %s%n", );
32 }
33 } // oxirgi sinf StaticCharMethods

Belgini kiriting va Enter tugmasini bosing


A
aniqlanadi: rost
raqam: noto'g'ri
Java identifikatoridagi birinchi belgi: true
Java identifikatorining bir qismidir: true
bu harf: rost
harf yoki raqam: rost
kichik harf: false
katta harf: rost
katta harfga: A
kichik harfga: a

14.15-rasm | Belgilarni sinab ko'rish va registrni o'zgartirish uchun belgilarning statik usullari. (2-qismning 1-qismi.)

char c = input.charAt(0); // kirish belgisini olish

Belgilangan belgi(c)


Character.isDigit(c)

Character.isJavaIdentifierStart(c)

Character.isJavaIdentifierPart(c)

Character.isLetter(c)

Character.isLetterOrDigit(c)

Belgi.kichik harf(c)

Character.isUpperCase(c)

Belgi.toUpperCase(c)

Belgidan kichik harfga(c)

620 14-bob Satrlar, belgilar va oddiy iboralar

15-qator c belgi yoki yo'qligini aniqlash uchun Character isDefined usulidan foydalanadi
Unicode belgilar to'plamida belgilangan. Agar shunday bo'lsa, usul haqiqatni qaytaradi; aks holda, u qaytadi
yolg'on. 16-qator c belgisi a ekanligini aniqlash uchun isDigit Belgilar usulidan foydalanadi
aniqlangan Unicode raqami. Agar shunday bo'lsa, usul haqiqatni qaytaradi, aks holda, noto'g'ri.
18-qator c ekanligini aniqlash uchun isJavaIdentifierStart Belgilar usulidan foydalanadi
Java-da identifikatorning birinchi belgisi bo'lishi mumkin bo'lgan belgi, ya'ni harf, pastki-
ball (_) yoki dollar belgisi ($). Agar shunday bo'lsa, usul haqiqatni qaytaradi, aks holda, noto'g'ri. Chiziq
20 c belgisi a ekanligini aniqlash uchun isJavaIdentifierPart Character usulidan foydalanadi
Java-da identifikatorda ishlatilishi mumkin bo'lgan belgi, ya'ni raqam, harf, pastki chiziq
(_) yoki dollar belgisi ($). Agar shunday bo'lsa, usul haqiqatni qaytaradi, aks holda, noto'g'ri.
21-qator c belgining harf ekanligini aniqlash uchun isLetter Belgilar usulidan foydalanadi.
Agar shunday bo'lsa, usul haqiqatni qaytaradi, aks holda, noto'g'ri. 23-qatorda Belgilar usuli qo'llaniladi
c belgisi harf yoki raqam ekanligini aniqlash uchun isLetterOrDigit. Agar shunday bo'lsa, usul
rost, aks holda noto'g'ri qaytaradi.
25-qator c belgi a ekanligini aniqlash uchun isLowerCase Belgilar usulidan foydalanadi
kichik harf. Agar shunday bo'lsa, usul haqiqatni qaytaradi, aks holda, noto'g'ri. 27-qatorda Char-
c belgisi katta harf ekanligini aniqlash uchun aktyor usuli -UpperCase. Agar shunday bo'lsa,
usul rost, aks holda yolg'onni qaytaradi.
29-qator c belgisini yuqorisiga aylantirish uchun Character usuli toUpperCase-dan foydalanadi.
holat ekvivalenti. Usul o'zgartirilgan belgini qaytaradi, agar belgi yuqori bo'lsa

Belgini kiriting va Enter tugmasini bosing


8
aniqlanadi: rost
raqam: rost
Java identifikatoridagi birinchi belgi: false
Java identifikatorining bir qismidir: true
bu harf: yolg'on
harf yoki raqam: rost
kichik harf: false
bosh harf: noto'g'ri
katta harfga: 8
kichik harfga: 8

Belgini kiriting va Enter tugmasini bosing


$
aniqlanadi: rost
raqam: noto'g'ri
Java identifikatoridagi birinchi belgi: true
Java identifikatorining bir qismidir: true
bu harf: yolg'on
harf yoki raqam: noto'g'ri
kichik harf: false
bosh harf: noto'g'ri
katta harfga: $
kichik harfga: $

14.15-rasm | Belgilarni sinab ko'rish va registrni o'zgartirish uchun belgilarning statik usullari. (2-qismning 2-qismi.)


14.5 621-sinf belgisi

holat ekvivalenti va aks holda, usul o'zining asl argumentini qaytaradi. 31-qatordan foydalaniladi
c belgisini kichik harf ekvivalentiga aylantirish uchun belgilar usuli toLowerCase.
Agar belgi kichik ekvivalentga ega bo'lsa, usul aylantirilgan belgini qaytaradi,
va aks holda, usul o'zining asl argumentini qaytaradi.
14.16-rasmda raqam va forDigit statik belgilar usullari ko'rsatilgan
Turli xil raqamlar tizimidagi belgilarni mos ravishda raqamlarga va raqamlarni belgilarga aylantiring
tems. Umumiy sanoq sistemalariga oʻnlik (asos 10), sakkizlik (8-asos), oʻn oltilik sanoq kiradi.
(asos 16) va ikkilik (baza 2). Raqamning asosi uning radisi deb ham ataladi. Ko'proq ma'lumot uchun
sanoq tizimlari o'rtasida konvertatsiya qilish haqida ma'lumot, onlayn J ilovasiga qarang.

1 // 14.16-rasm: StaticCharMethods2.java


2 // Belgilar sinfini statik konvertatsiya qilish usullari.
3 import java.util.Scanner;
4
5 umumiy sinf StaticCharMethods2
6 {
7 // dasturni bajaradi
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 Skaner skaneri = yangi Skaner(System.in);
11
12 // radixni oling
13 System.out.println("Radiksni kiriting:");
14 int radix = scanner.nextInt();
15
16 // foydalanuvchi tanlovini olish
17 System.out.printf("Iltimos, birini tanlang:%n1 -- %s%n2 -- %s%n",
18 "Raqamni belgiga aylantirish", "Belgini raqamga aylantirish");
19 int tanlovi = scanner.nextInt();
20
21 // so'rovni qayta ishlash
22 kalit (tanlov)
23 {
24 1-holat: // raqamni belgiga aylantirish
25 System.out.println("Raqam kiriting:");
26 int raqam = scanner.nextInt();
27 System.out.printf("Raqamni belgiga aylantirish: %s%n",
28);
29 tanaffus;
30
31 holat 2: // belgini raqamga aylantirish
32 System.out.println("Belgi kiriting:");
33 ta belgi = scanner.next().charAt(0);
34 System.out.printf("Belgilarni raqamga aylantirish: %s%n",
35);
36 tanaffus;
37 }
38 }
39 } // oxirgi sinf StaticCharMethods2

14.16-rasm | Belgilar sinfini statik aylantirish usullari. (2-qismning 1-qismi.)

Character.forDigit(raqam, radix)

Belgi.raqam(belgi, radix)


622 14-bob Satrlar, belgilar va muntazam ifodalar

28-qatorda butun sonni belgiga aylantirish uchun forDigit usuli qo'llaniladi
butun sonli radikal (son asosi) bilan belgilangan sanoq sistemasi. Masalan,
16-asosdagi oʻnlik butun 13 (radiks) “d” belgisiga ega. Kichik va katta harflar -
registr harflari sanoq sistemalarida bir xil qiymatni ifodalaydi. 35-qator o'rnatish uchun usul raqamidan foydalanadi.
vert o'zgaruvchi belgisini butun sonlar radisi bilan belgilangan sanoq sistemasidagi butun songa aylantirish
(raqamning asosi). Masalan, 'A' belgisi 16 ta asosiy (radiks) ifodalanadi.
asos 10 qiymatini yuborish 10. Radix 2 va 36 orasida bo'lishi kerak, shu jumladan.
14.17-rasmda konstruktor va sinfning bir necha misol usullari ko'rsatilgan
Belgilar - charValue, toString va tenglar. 7–8 qatorlar ikkita belgini ifodalaydi
Belgiga mos ravishda "A" va "a" belgilar konstantalarini belgilash orqali ob'ektlar
o'zgaruvchilar. Java avtomatik ravishda ushbu harf harflarini Belgilar ob'ektiga - jarayonga aylantiradi
avtoboks sifatida tanilgan, biz 16.4-bo'limda batafsilroq muhokama qilamiz. 11-qatorda Char-
Character usuli charValue Character ob'ekti c1da saqlangan char qiymatini qaytarish uchun. 11-qator
toString usuli yordamida c2 Belgilar ob'ektining satr tasvirini qaytaradi. kon-
13-qatordagi belgi c1 ob'ekti bir xil shartga ega yoki yo'qligini aniqlash uchun tenglar usulidan foydalanadi.
c2 ob'ekti sifatida chodirlar (ya'ni, har bir ob'ekt ichidagi belgilar teng).

Iltimos, radikalni kiriting:


16
Iltimos, birini tanlang:
1 -- Raqamni belgiga aylantirish
2 -- Belgini raqamga aylantiring
2
Belgini kiriting:
A
Belgini raqamga aylantirish: 10

Iltimos, radikalni kiriting:


16
Iltimos, birini tanlang:
1 -- Raqamni belgiga aylantirish
2 -- Belgini raqamga aylantiring
1
Raqam kiriting:
13
Raqamni belgiga aylantirish: d

1 // 14.17-rasm: OtherCharMethods.java


2 // Belgilar sinfi misol usullari.
3 ommaviy sinf BoshqaCharMethods
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7
8

14.17-rasm | Belgilar sinfi misol usullari. (2-qismning 1-qismi.)

14.16-rasm | Belgilar sinfini statik aylantirish usullari. (2-qismning 2-qismi.)

c1 belgisi = 'A';


c2 belgisi = 'a';

14.6 Tokenizatsiya satrlari 623

14.6 Tokenizatsiya satrlari
Siz jumlani o'qiyotganingizda, ongingiz uni belgilarga ajratadi - alohida so'zlar va nuqta.
sizga ma'no bildiradigan o'quv belgilari. Kompilyatorlar tokenizatsiyani ham amalga oshiradilar. Ular
bayonotlarni kalit so'zlar, identifikatorlar, operatorlar va boshqalar kabi alohida qismlarga ajrating
dasturlash tili elementlari. Endi biz String sinfining bo'linish usulini o'rganamiz, bu
Stringni komponent belgilariga ajratadi. Tokenlar bir-biridan ajratilgan
cheklovchilar, odatda bo'sh joy, bo'sh joy, varaq, yangi qator va karetaning qaytishi kabi bo'sh joy belgilari.
Tokenlarni ajratish uchun boshqa belgilar ham chegaralovchi sifatida ishlatilishi mumkin. Ilova ichida
14.18-rasmda Stringning bo'linish usuli ko'rsatilgan.
Foydalanuvchi Enter tugmachasini bosganda, kiritilgan jumla o'zgaruvchan jumlada saqlanadi.
17-qator String argumentini " " bilan bo'lish String usulini chaqiradi.
Strings massivi. String argumentidagi bo'sh joy belgisi ushbu usulning ajratuvchisidir
split Stringdagi tokenlarni aniqlash uchun foydalanadi. Keyingi bo'limda bilib olganingizdek, argu-
Metodga bo'linish murakkabroq tokenizatsiya uchun muntazam ifoda bo'lishi mumkin. 19-qator
massiv tokenlarining uzunligini, ya'ni jumladagi tokenlar sonini ko'rsatadi. 21-qatorlar
22 har bir tokenni alohida satrga chiqaradi.

9
10 System.out.printf(


11 "c1 = %s%nc2 = %s%n%n", , );
12
13 agar ( )
14 System.out.println("c1 va c2 teng%n");
yana 15
16 System.out.println("c1 va c2 teng emas%n");
17 }
18 } // BoshqaCharMethods klassi

c1 = A
c2 = a

c1 va c2 teng emas

1 // 14.18-rasm: TokenTest.java


2 // StringTokenizer obyekti satrlarni tokenlash uchun ishlatiladi.
3 import java.util.Scanner;
4 import java.util.StringTokenizer;
5
6 umumiy sinf TokenTest
7 {
8 // dasturni bajarish
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 // jumlani oling
12 Skaner skaneri = yangi Skaner(System.in);

14.18-rasm | StringTokenizer obyekti satrlarni tokenlash uchun ishlatiladi. (2-qismning 1-qismi.)

14.17-rasm | Belgilar sinfi misol usullari. (2-qismning 2-qismi.)

c1.charValue() c2.toString()

c1.teng (c2)

624 14-bob Satrlar, belgilar va muntazam ifodalar

14.7 Muntazam iboralar, sinf namunasi va sinf
Match
Muntazam ifoda - bu mos keladigan belgilar uchun qidiruv sxemasini tavsiflovchi String
boshqa Strings. Bunday iboralar kiritilgan ma'lumotlarni tekshirish va ma'lumotlar mavjudligini ta'minlash uchun foydalidir
ma'lum bir format. Masalan, pochta indeksi beshta raqamdan va familiyadan iborat bo'lishi kerak
faqat harflar, bo'shliqlar, apostroflar va defislardan iborat bo'lishi kerak. Oddiy sobiq dasturning bitta ilovasi
presslar kompilyatorni qurishni osonlashtirishdir. Ko'pincha, katta va murakkab muntazam
ifoda dastur sintaksisini tekshirish uchun ishlatiladi. Agar dastur kodi mos kelmasa
muntazam ifoda, kompilyator kodda sintaksis xatosi borligini biladi.
Class String muntazam ifoda operatsiyalarini bajarish uchun bir nechta usullarni taqdim etadi,
ulardan eng oddiyi mos keladigan operatsiyadir. String usuli mos keladi a
Muntazam ifodani belgilaydigan va String obyekti mazmuniga mos keladigan satr
bunda u muntazam ifodaga chaqiriladi. Usul mantiqiy ko'rsatkichni qaytaradi
o'yin muvaffaqiyatli bo'ldimi.
Muntazam ibora harfiy belgilar va maxsus belgilardan iborat. 14.19-rasm
muntazam ifodalar bilan ishlatilishi mumkin bo'lgan ba'zi oldindan belgilangan belgilar sinflarini belgilaydi. A
belgilar sinfi - bu belgilar guruhini ifodalovchi qochish ketma-ketligi. Raqam har qanday
raqamli belgi. So'z belgisi - bu har qanday harf (katta yoki kichik), har qanday raqam yoki
pastki chiziq belgisi. Bo'sh joy belgisi - bu bo'sh joy, yorliq, karetaning qaytishi, yangi qator
yoki shakl tasmasi. Har bir belgi sinfi biz bo'lgan Stringdagi bitta belgiga mos keladi
muntazam ifoda bilan moslashishga harakat qilish.

13 System.out.println("Gapni kiriting va Enter tugmasini bosing");


14 String jumla = scanner.nextLine();
15
16 // foydalanuvchi jumlasini qayta ishlash
17
18 System.out.printf("Elementlar soni: %d%nTokenlar:%n",
19 tokens.uzunlik);
20
21
22
23 }
24 } // yakuniy sinf TokenTest

Gapni kiriting va Enter tugmasini bosing


Bu ettita belgidan iborat jumla
Elementlar soni: 7
Tokenlar quyidagilardir:
Bu
hisoblanadi
a
jumla
bilan
Yetti
tokenlar

14.18-rasm | StringTokenizer obyekti satrlarni tokenlash uchun ishlatiladi. (2-qismning 2-qismi.)

String[] tokens = sentence.split(" ");

uchun (string token: tokens)


System.out.println(token);

14.7 Oddiy iboralar, sinf namunasi va sinf moslamasi 625

Muntazam ifodalar bu oldindan belgilangan belgilar sinflari bilan cheklanmaydi. ifoda-
sionlar murakkab naqshlarga mos kelish uchun turli operatorlar va boshqa belgilar shakllaridan foydalanadi.
Biz ushbu usullarning bir nechtasini shakldagi dasturda ko'rib chiqamiz. 14.20 va 14.21, qaysi
muntazam ifodalar orqali foydalanuvchi kiritishini tasdiqlaydi. [Eslatma: Ushbu ilova mos kelish uchun mo'ljallanmagan
barcha mumkin bo'lgan haqiqiy foydalanuvchi kiritish.]

Belgilar mos keladi Belgilar mos keladi

\d har qanday raqam \D har qanday raqam bo'lmagan
\w har qanday so'z belgisi \W har qanday so'z bo'lmagan belgi
\s har qanday bo'sh joy belgisi \S bo'sh bo'lmagan har qanday belgi
xarakter

14.19-rasm | Oldindan belgilangan belgilar sinflari.

1 // 14.20-rasm: ValidateInput.java
2 // Oddiy iboralar yordamida foydalanuvchi ma'lumotlarini tekshirish.
3
4 umumiy sinf ValidateInput
5 {
6 // ismni tasdiqlang
7 ta umumiy statik mantiqiy validateFirstName(String firstName)
8 {
9
10 }
11
12 // familiyani tasdiqlang
13 umumiy statik mantiqiy validateLastName(String lastName)
14 {
15
16 }
17
18 // manzilni tasdiqlang
19 umumiy statik boolean validateAddress (String manzili)
20 {
21
22
23 }
24
25 // shaharni tasdiqlang
26 umumiy statik mantiqiy validateCity(String city)
27 {
28
29 }
30
31 // holatni tasdiqlash
32 umumiy statik mantiqiy validateState(String holati)
33 {

14.20-rasm | Oddiy iboralar yordamida foydalanuvchi ma'lumotlarini tekshirish. (2-qismning 1-qismi.)

return firstName.matches("[AZ][a-zA-Z]*");

return lastName.matches("[a-zA-z]+(['-][a-zA-Z]+)*");

qaytish manzili.matches(
"\\d+\\s+([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)”);

return city.matches("([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)");


626 14-bob Satrlar, belgilar va muntazam ifodalar

34
35 }
36
37 // zipni tasdiqlang
38 umumiy statik mantiqiy validateZip (String zip)
39 {
40
41 }
42
43 // telefonni tasdiqlang
44 umumiy statik boolean validatePhone (String telefon)
45 {
46
47 }
48 } // oxirgi sinf ValidateInput

1 // 14.21-rasm: Validate.java


2 // ValidateInput klassi yordamida foydalanuvchi ma'lumotlarini kiriting va tasdiqlang.
3 import java.util.Scanner;
4
5 umumiy sinf Validate
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // foydalanuvchi ma'lumotlarini olish
10 Skaner skaneri = yangi Skaner(System.in);
11 System.out.println("Iltimos, ismingizni kiriting:");
12 String firstName = scanner.nextLine();
13 System.out.println("Iltimos, familiyani kiriting:");
14 String lastName = scanner.nextLine();
15 System.out.println("Iltimos, manzilni kiriting:");
16 String manzili = scanner.nextLine();
17 System.out.println("Iltimos, shaharni kiriting:");
18 String city = scanner.nextLine();
19 System.out.println("Iltimos, davlatni kiriting:");
20 String holati = scanner.nextLine();
21 System.out.println("Iltimos, zip kiriting:");
22 String zip = scanner.nextLine();
23 System.out.println("Telefonni kiriting:");
24 String telefon = scanner.nextLine();
25
26 // foydalanuvchi kiritishini tasdiqlang va xato xabarini ko'rsating
27 System.out.println("%nValidate Natija:");
28
29 agar (!ValidateInput.validateFirstName(firstName))
30 System.out.println("Ism noto'g'ri");
31 agar (!ValidateInput.validateLastName(lastName))
32 System.out.println("Familiya noto'g'ri");
33 boshqa agar (!ValidateInput.validateAddress(manzil))
34 System.out.println("Yaroqsiz manzil");

14.21-rasm | ValidateInput klassi yordamida foydalanuvchi ma'lumotlarini kiriting va tasdiqlang. (2-qismning 1-qismi.)

14.20-rasm | Oddiy iboralar yordamida foydalanuvchi ma'lumotlarini tekshirish. (2-qismning 2-qismi.)

return state.matches("([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)");

return zip.matches("\\d{5}");

return phone.matches("[1-9]\\d{2}-[1-9]\\d{2}-\\d{4}");


14.7 Oddiy iboralar, sinf namunasi va sinf moslamasi 627

14.20-rasm foydalanuvchi kiritishini tasdiqlaydi. 9-qator birinchi ismni tasdiqlaydi. To'plamga mos kelish uchun
oldindan belgilangan belgilar sinfiga ega bo'lmagan belgilar, kvadrat qavslardan foydalaning, []. Uchun
Misol uchun, "[aeiou]" naqshi unli bo'lgan bitta belgiga mos keladi. Belgilar diapazoni

35 boshqa agar (!ValidateInput.validateCity(shahar))


36 System.out.println("Yaroqsiz shahar");
37 boshqa agar (!ValidateInput.validateState(state))
38 System.out.println("Yaroqsiz holat");
39 boshqa agar (!ValidateInput.validateZip(zip))
40 System.out.println("Pochta indeksi noto'g'ri");
41 boshqa agar (!ValidateInput.validatePhone(telefon))
42 System.out.println("Telefon raqami noto'g'ri");
yana 43
44 System.out.println("To'g'ri kiritilgan. Rahmat.");
45 }
46 } // tugatish sinfi Validate

Iltimos, ismingizni kiriting:


Jeyn
Iltimos, familiyani kiriting:
Doe
Iltimos, manzilni kiriting:
Ba'zi ko'cha, 123
Iltimos, shaharni kiriting:
Ba'zi shahar
Iltimos, davlatni kiriting:
SS
Iltimos, zip kiriting:
123
Iltimos, telefon raqamini kiriting:
123-456-7890

Natijani tasdiqlash:


Pochta indeksi yaroqsiz

Iltimos, ismingizni kiriting:


Jeyn
Iltimos, familiyani kiriting:
Doe
Iltimos, manzilni kiriting:
Ba'zi ko'cha, 123
Iltimos, shaharni kiriting:
Ba'zi shahar
Iltimos, davlatni kiriting:
SS
Iltimos, zip kiriting:
12345
Iltimos, telefon raqamini kiriting:
123-456-7890

Natijani tasdiqlash:


Yaroqli kiritish. Rahmat.

14.21-rasm | ValidateInput klassi yordamida foydalanuvchi ma'lumotlarini kiriting va tasdiqlang. (2-qismning 2-qismi.)


628 14-bob Satrlar, belgilar va muntazam ifodalar



ikki belgi orasiga tire (-) qo'yish bilan ifodalanadi. Misolda, "[AZ]"
bitta bosh harfga mos keladi. Qavs ichidagi birinchi belgi "^" bo'lsa, ifoda
ko'rsatilganidan boshqa har qanday belgini qabul qiladi. Biroq, "[^Z]" "[A-" bilan bir xil emas
Y]", bosh harflar A–Y-ga mos keladi—"[^Z]" bosh harfdan boshqa har qanday belgiga mos keladi.
ital Z, shu jumladan kichik harflar va yangi satr belgisi kabi harf bo'lmagan harflar. Diapazonlari
belgilar sinflari harflarning butun qiymatlari bilan aniqlanadi. Ushbu misolda "[A-Za-z]"
barcha katta va kichik harflarga mos keladi. “[Az]” diapazoni barcha harflarga mos keladi, shuningdek
bu belgilarga (masalan, [va \) Z va bosh harflar orasidagi butun son qiymatiga mos keladi
kichik a (belgilarning butun qiymatlari haqida qo'shimcha ma'lumot olish uchun B ilovasiga qarang). Kabi
oldindan belgilangan belgilar sinflari, kvadrat qavslar bilan ajratilgan belgilar sinflari bittaga mos keladi
qidiruv ob'ektidagi belgi.
9-qatorda ikkinchi belgilar sinfidan keyingi yulduzcha istalgan sonli ruxsat etilganligini bildiradi.
larga mos kelishi mumkin. Umuman olganda, "*" muntazam ifoda operatori reg-
Ular ifodalanganda, dastur nol yoki undan ko'p holatlarga mos kelishga harakat qiladi
"*" dan darhol oldingi pastki ifoda. Operator "+" bir yoki biriga mos kelishga harakat qiladi
"+" dan darhol oldingi pastki ifodaning ko'proq takrorlanishi. Shunday qilib, "A*" va "A+"
"AAA" yoki "A" ga mos keladi, lekin faqat "A*" bo'sh qatorga mos keladi.
Agar validateFirstName usuli haqiqatni qaytarsa (14.21-rasmning 29-qatori), dastur
validateLastName (13-16-qatorlar) ni chaqirish orqali familiyani (31-qator) tasdiqlashga urinadi.
14.20-rasm). Familiyani tasdiqlash uchun oddiy ibora har qanday harflar soniga mos keladi
bo'shliqlar, apostroflar yoki defislar bilan ajratiladi.
14.21-rasmning 33-qatori validateAddress usulini chaqiradi (14.20-rasmning 19-23-qatorlari)
manzilni tasdiqlang. Birinchi belgilar sinfi har qanday raqamga bir yoki bir necha marta mos keladi (\\ d+).
Ikkita \ belgilar ishlatiladi, chunki \ odatda satrda qochish ketma-ketligini boshlaydi. Shunday qilib, \\ d
Stringda muntazam ifoda naqshini ifodalaydi \d. Keyin biz bir yoki bir nechtasini moslashtiramiz
bo'sh joy belgilari (\\s+). "|" belgisi ifodani uning chap yoki uning tomoniga moslashtiradi
to'g'ri. Masalan, "Salom (John|Jeyn)" "Salom Jon" va "Salom Jeyn"ga mos keladi. ota-
tezislar muntazam ifoda qismlarini guruhlash uchun ishlatiladi. Ushbu misolda | ning chap tomoni
bitta so'zga mos keladi va o'ng tomoni istalgan miqdor bilan ajratilgan ikkita so'zga mos keladi
oq bo'shliq. Shunday qilib, manzilda bir yoki ikkita so'zdan keyin raqam bo'lishi kerak. U yerda-
avvalo, "10 Broadway" va "10 Main Street" ikkalasi ham ushbu misolda haqiqiy manzillardir. The
shahar (14.20-rasmning 26-29-qatorlari) va davlat (14.20-rasmning 32-35-qatorlari) usullari ham mos keladi.
kamida bitta belgidan iborat har qanday so'z yoki muqobil ravishda kamida bitta belgidan iborat har qanday ikkita so'z, agar
so'zlar bitta bo'shliq bilan ajratilgan, shuning uchun ham Uoltham, ham West Nyuton mos keladi.

Miqdor ko'rsatkichlari


Yulduzcha (*) va plyus (+) rasmiy ravishda miqdor ko'rsatkichlari deb ataladi. 14.22-rasmda barcha kvantlar keltirilgan.
bog'lovchilar. Biz allaqachon yulduzcha (*) va ortiqcha (+) miqdoriy ko'rsatkichlari qanday ishlashini muhokama qildik. Hammasi
miqdor ko'rsatkichlari faqat kvantdan oldingi pastki ifodaga ta'sir qiladi. Miqdor ko'rsatkichi
savol belgisi (?) u miqdoriy ifodalovchi iboraning nolga yoki bitta takroriga mos keladi. A
Bitta raqamni ({n}) o'z ichiga olgan qavslar to'plami ifodaning n ta takrorlanishiga to'liq mos keladi
miqdoriy beradi. 14.20-rasmdagi pochta indeksini tasdiqlash uchun biz ushbu kvantni ko'rsatamiz.
40. Qavslar ichiga olingan raqamdan keyin vergul qoʻyish kamida n ta holatga toʻgʻri keladi.
miqdoriy ifodasi. Ikkita raqamni ({n,m}) o'z ichiga olgan qavslar to'plami mos keladi
u kvalifikatsiya qiluvchi ifodaning n va m ta takrorlanishi orasida. Miqdor ko'rsatkichlari qo'llanilishi mumkin
murakkabroq muntazam iboralar yaratish uchun qavs ichiga olingan naqshlarga.

14.7 Oddiy iboralar, sinf namunasi va sinf moslamasi 629

Miqdor ko'rsatkichlarining barchasi ochko'zdir. Bu shuni anglatadiki, ular shunchalik ko'p hodisalarga mos keladi
o'yin hali ham muvaffaqiyatli bo'lsa, ular mumkin. Biroq, agar bu miqdor ko'rsatkichlaridan biri bo'lsa
so‘roq belgisi (?) qo‘yilgan bo‘lsa, miqdor ko‘rsatkichi istaksiz bo‘ladi (ba’zan dangasa deb ataladi).
O'yin muvaffaqiyatli davom etar ekan, u imkon qadar kamroq holatlarga mos keladi.
Pochta indeksi (14.20-rasmdagi 40-satr) besh marta raqamga to'g'ri keladi. Bu muntazam ifoda
raqamli belgilar sinfi va qavslar orasida 5 raqami bo'lgan kvantatordan foydalanadi. Telefon
raqam (14.20-rasmdagi 46-satr) uchta raqamga mos keladi (birinchi raqam nol bo'lishi mumkin emas) keyin
tire va undan keyin yana uchta raqam (yana birinchisi nolga teng bo'lishi mumkin emas) va undan keyin
yana to'rtta raqam.
String usuli mosligi butun Stringning muntazamga mos kelishini tekshiradi
ifoda. Misol uchun, biz "Smit" ni familiya sifatida qabul qilmoqchimiz, lekin "9@Smith#" emas.
Agar oddiy iboraga faqat pastki qator mos kelsa, mos keladigan usul noto'g'ri ma'lumotni qaytaradi.
Pastki satrlarni almashtirish va bo'lish satrlari
Ba'zan satrning qismlarini almashtirish yoki satrni bo'laklarga bo'lish foydali bo'ladi. Buning uchun
maqsadi, sinf String replaceAll, replaceFirst va split usullarini taqdim etadi. Bular
usullari 14.23-rasmda ko'rsatilgan.

Miqdor moslamalari

* Naqshning nol yoki undan ortiq takrorlanishiga mos keladi.
+ Naqshning bir yoki bir nechta takrorlanishiga mos keladi.
? Naqshning nol yoki bitta takrorlanishiga mos keladi.
{n} n ta holatga toʻliq mos keladi.
{n,} Kamida n ta holatga mos keladi.
{n,m} n va m (inklyuziv) hodisalar orasidagi mos keladi.

14.22-rasm | Muntazam iboralarda qo‘llaniladigan miqdor ko‘rsatkichlari.

1 // 14.23-rasm: RegexSubstitution.java
2 // String usullari replaceFirst, replaceAll va split.
3 import java.util.Arrays;
4
5 ommaviy sinf RegexSubstitution
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 String firstString = "Bu gap 5 yulduz bilan tugaydi *****";
10 String secondString = "1, 2, 3, 4, 5, 6, 7, 8";
11
12 System.out.printf("Original string 1: %s%n", firstString);
13
14 // '*' o'rniga '^'
15
16
17 System.out.printf("^ o'rniga *: %s%n", firstString);

14.23-rasm | String usullari replaceFirst, replaceAll va split. (2-qismning 1-qismi.)

firstString = firstString.replaceAll("\\*", "^");

630 14-bob Satrlar, belgilar va oddiy iboralar

replaceAll usuli Stringdagi matnni yangi matn bilan almashtiradi (ikkinchi argument)
asl String muntazam ifodaga mos keladigan joyda (birinchi argument). 15-qator
firstStringdagi "*" ning har bir nusxasini "^" bilan almashtiradi. Oddiy ifoda ("\\*")
ikkita teskari chiziq bilan * belgisidan oldin. Odatda, * - bu regulyatsiyani ko'rsatadigan miqdor
Ular ifodasi oldingi naqshning istalgan soniga mos kelishi kerak. Biroq,
15-qatorda biz to'g'ridan-to'g'ri belgining barcha hodisalarini topmoqchimiz - buning uchun biz kerak
qochish belgisi * belgisi bilan \. Maxsus muntazam ifoda belgisidan chiqish \ bilan
mos keladigan dvigatelga haqiqiy belgini topishni buyuradi. Ifoda saqlanganligi sababli
Java String va \ - Java Strings-dagi maxsus belgi, biz qo'shimchasini kiritishimiz kerak
\. Shunday qilib, "\\*" Java satri a ga mos keladigan \* muntazam ifoda naqshini ifodalaydi
qidiruv satrida bitta * belgi. 20-qatorda har bir oddiy ifoda uchun mos keladi
Birinchi satrdagi "yulduzlar" "karet" bilan almashtiriladi. 27-qator almashtirish uchun replaceAll-dan foydalanadi
qatordagi barcha so'zlar "so'z" bilan.

18
19 // "yulduzlar" ni "karet" bilan almashtiring


20
21
22 System.out.printf(
23 "\"yulduzlar\" o'rniga "\"karet\": %s%n", firstString);
24
25 // so'zlarni "so'z" bilan almashtiring
26 System.out.printf("Har bir so'z \"word\" bilan almashtirildi: %s%n%n",
27);
28
29 System.out.printf("Original String 2: %s%n", secondString);
30
31 // birinchi uchta raqamni "raqam" bilan almashtiring
32 uchun (int i = 0; i < 3; i++)
33
34
35 System.out.printf(
36 "Birinchi 3 ta raqam \"raqam\" bilan almashtirildi : %s%n", secondString);
37
38 System.out.print("Stringni vergul bilan ajratish: ");
39
40 System.out.println( );
41 }
42 } // oxirgi sinf RegexSubstitution

Asl qator 1: Bu jumla 5 yulduz bilan tugaydi *****


^ * o'rniga qo'yilgan: Bu gap 5 yulduz bilan tugaydi ^^^^^
"Yulduzlar" o'rniga "karet" qo'yilgan: Bu gap 5 karet bilan tugaydi ^^^^^
Har bir so'z "so'z" bilan almashtiriladi: so'z so'z so'z so'z so'z so'z ^^^^^

Asl qator 2: 1, 2, 3, 4, 5, 6, 7, 8


Birinchi 3 ta raqam "raqam" bilan almashtirildi: raqam, raqam, raqam, 4, 5, 6, 7, 8
Satrlarni vergul bilan ajratish: ["raqam", "raqam", "raqam", "4", "5", "6", "7", "8"]

14.23-rasm | String usullari replaceFirst, replaceAll va split. (2-qismning 2-qismi.)

firstString = firstString.replaceAll("yulduzlar", "karetlar");

firstString.replaceAll("\\w+", "so'z")

secondString = secondString.replaceFirst("\\d", "raqam");

String[] natijalari = secondString.split(",\\s*"); // vergul ustiga bo'linadi


Arrays.toString(natijalar)

14.7 Oddiy iboralar, sinf namunasi va sinf moslamasi 631

Method replaceFirst (33-qator) naqsh mosligining birinchi takrorlanishini almashtiradi. Java
Satrlar o'zgarmasdir; shuning uchun replaceFirst usuli yangi Stringni qaytaradi
tegishli belgilar almashtirildi. Bu satr asl String va ni oladi
uni replaceFirst tomonidan qaytarilgan String bilan almashtiradi. Uch marta takrorlash orqali biz almashtiramiz
soniyada (\d) raqamning dastlabki uchta nusxasi "raqam" matni bilan.
Split usuli Stringni bir nechta pastki qatorlarga ajratadi. Asl har qandayida buzilgan
belgilangan muntazam ifodaga mos keladigan joy. Split usuli qatorni qaytaradi
Muntazam ifoda uchun mosliklar orasidagi pastki qatorlarni o'z ichiga olgan satrlar. 39-qatorda,
vergul bilan ajratilgan butun sonlar qatorini tokenizatsiya qilish uchun split usulidan foydalanamiz. Dalil
chegaralovchini aniqlovchi muntazam ifoda. Bunday holda biz muntazam ifodadan foydalanamiz
",\\s*" vergul kelgan joyda pastki qatorlarni ajratish uchun. Har qanday oq rangga mos ravishda -
bo'sh joy belgilari, biz hosil bo'lgan pastki qatorlardan qo'shimcha bo'shliqlarni yo'q qilamiz. Vergul va
bo'sh joy belgilari pastki qatorlarning bir qismi sifatida qaytarilmaydi. Yana Java String
",\\s*" ,\s* muntazam ifodasini ifodalaydi. 40-qatorda toString uchun Arrays usuli qo'llaniladi
massiv natijalari mazmunini kvadrat qavs ichida va vergul bilan ajratib ko'rsatish.
Sinflar Pattern va Matcher
String sinfining muntazam ifodalash qobiliyatiga qo'shimcha ravishda, Java boshqa sinflarni taqdim etadi -
es java.util.regex to'plamida ishlab chiquvchilarga oddiy iboralarni manipulyatsiya qilishga yordam beradi. Sinf
Pattern muntazam ifodani ifodalaydi. Class Matcher ikkala oddiy ifodani ham o'z ichiga oladi
naqsh va naqsh izlash uchun CharSequence.
CharSequence (java.lang paketi) a.ga oʻqishga ruxsat beruvchi interfeysdir
belgilar ketma-ketligi. Interfeys charAt, length, subSe- usullarini talab qiladi.
quence va toString e'lon qilinadi. String ham, StringBuilder ham interfeysni amalga oshiradi
CharSequence, shuning uchun ushbu sinflardan birining namunasi Matcher sinfida ishlatilishi mumkin.

Agar muntazam ifoda faqat bir marta ishlatilsa, statik Pattern usuli mos kelishi mumkin


foydalanilsin. Bu usul muntazam ifodani va CharSe-ni belgilaydigan Stringni oladi.
o'yinni o'tkazish tartibi. Bu usul mantiqiy ko'rsatkichni qaytaradi
qidiruv ob'ekti (ikkinchi argument) muntazam ifodaga mos keladimi.
Agar muntazam ifoda bir necha marta ishlatilsa (masalan, tsiklda), bu ko'proq
Muayyan Pattern ob'ektini yaratish uchun statik Pattern usulidan foydalanish samarali
bu muntazam ifoda. Bu usul naqshni ifodalovchi Stringni oladi va
yangi Pattern ob'ektini qaytaradi, undan keyin usul moslashtiruvchini chaqirish uchun foydalanish mumkin. Bu
usuli qidirish uchun CharSequence ni oladi va Matcher obyektini qaytaradi.
Matcher Pattern usuli bilan bir xil vazifani bajaradigan usul mosliklarini taqdim etadi
mos keladi, lekin hech qanday argumentni olmaydi - qidiruv namunasi va qidiruv ob'ekti inkapsu-
Matcher ob'ektida kechiktirilgan. Class Matcher boshqa usullarni taqdim etadi, shu jumladan topish,
LookAt, replaceFirst va replaceAll.
14.24-rasmda oddiy iboralar qo'llaniladigan oddiy misol keltirilgan. Bu pro-
gramm tug'ilgan kunlar bilan muntazam ifodaga mos keladi. Bu ibora faqat tug'ilishga mos keladi -
aprel oyida sodir bo'lmagan va ismlari "J" bilan boshlangan odamlarga tegishli kunlar.

Umumiy dasturlash xatosi 14.2


Muntazam ifoda interfeysni amalga oshiradigan har qanday sinf ob'ektiga nisbatan sinovdan o'tkazilishi mumkin
CharSequence, lekin muntazam ifoda String bo'lishi kerak. Registr yaratishga urinish
StringBuilder sifatidagi ifoda xatodir.

632 14-bob Satrlar, belgilar va muntazam ifodalar

11–12 qatorlar statik Pattern usuli kompilyatsiyasini chaqirish orqali Pattern yaratadi. nuqta
belgi "." muntazam ifodada (12-qator) har qanday bitta belgiga mos keladi, bundan mustasno yangi-
chiziq belgisi. 20-qator kompilyatsiya qilingan muntazam ifoda uchun Matcher ob'ektini yaratadi va
mos keladigan ketma-ketlik (string1). 22–23 qatorlar orqali takrorlash uchun while tsiklidan foydalaniladi
String. 22-qator qidiruvning bir qismini moslashtirishga harakat qilish uchun "Matcher find" usulidan foydalanadi
qidiruv namunasiga e'tiroz bildirish. Ushbu usulga har bir qo'ng'iroq oxirgi qo'ng'iroq qilingan nuqtadan boshlanadi
tugadi, shuning uchun bir nechta mosliklarni topish mumkin. LookAt moslashtiruvchi usuli xuddi shunday bajaradi
yo'l, bundan tashqari u har doim qidiruv ob'ektining boshidan boshlanadi va har doim bo'ladi
agar mavjud bo'lsa, birinchi moslikni toping.

23-qatorda qidirish obyektidan Stringni qaytaruvchi Matcher metodlar guruhi qo‘llaniladi


bu qidiruv namunasiga mos keladi. Qaytarilgan string oxirgi bo'lgan
topish yoki LookAt uchun qo'ng'iroq bilan mos keladi. 14.24-rasmdagi chiqish ikkita o'yinni ko'rsatadi
string1 da topilgan.

1 // 14.24-rasm: RegexMatches.java


2 // Sinflar namunasi va moslamasi.
3 import java.util.regex.Matcher;
4 import java.util.regex.Pattern;
5
6 ommaviy sinf RegexMatches
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // muntazam ifoda yaratish
11
12
13
14 string string1 = "Jeynning tug'ilgan kuni 05-12-75\n" +
15 "Deyvning tug'ilgan kuni - 11-04-68\n" +
16 "Jonning tug'ilgan kuni - 04-28-73\n" +
17 "Joning tug'ilgan kuni - 12-17-77";
18
19 // oddiy ifodani satr va chop etish moslamalariga moslang
20
21
22
23
24 }
25 } // oxirgi sinf RegexMatches

Jeynning tug'ilgan kuni - 05-12-75


Joning tug'ilgan kuni 12-17-77

14.24-rasm | Sinflar Pattern va Matcher.

Umumiy dasturlash xatosi 14.3
Metod mosliklari (String, Pattern yoki Matcher sinfidan) faqat en-
shinalarni qidirish ob'ekti muntazam ifodaga mos keladi. Topish va qidirish usullari (sinfdan
Matcher) qidiruv ob'ektining bir qismi muntazam ifodaga mos keladigan bo'lsa, true qiymatini qaytaradi.

Shakl ifodasi =


Pattern.compile("J.*\\d[0-35-9]-\\d\\d-\\d\\d");

Matcher matcher = expression.matcher(string1);

while (matcher.find())
System.out.println(matcher.group());

14.8 Yakunlash 633

Java SE 8
17.7-bo'limda ko'rib turganingizdek, siz oddiy ifodalarni qayta ishlashni Java SE bilan birlashtira olasiz.
Kuchli String-and-fayl-ni qayta ishlash dasturlarini amalga oshirish uchun 8 lambda va oqim.
14.8 Yakunlash
Ushbu bobda siz String qismlarini tanlashning ko'proq String usullari haqida bilib oldingiz
va Stringlarni manipulyatsiya qilish. Siz Belgilar sinfi va ba'zi usullar haqida bilib oldingiz.
belgilar bilan ishlashni e'lon qiladi. Bob shuningdek, String-ning imkoniyatlarini muhokama qildi.
Strings yaratish uchun Builder klassi. Bobning oxirida muntazam iboralar muhokama qilindi,
Bu bir qatorga mos keladigan strings qismlarini qidirish va moslashtirish uchun kuchli qobiliyatni ta'minlaydi.
tikular naqsh. Keyingi bobda siz fayllarni qayta ishlash haqida bilib olasiz, shu jumladan
sistent ma'lumotlar saqlanadi va olinadi.

Xulosa
14.2-bo'lim Belgilar va satrlarning asoslari


• Belgilar harfining qiymati (597-bet) uning Unicode-dagi butun son qiymatidir (597-bet). Satrlar o'z ichiga olishi mumkin
harflar, raqamlar va +, -, *, / va $ kabi maxsus belgilar. Java tilidagi satr sinf ob'ekti hisoblanadi
String. String literallari (597-bet) ko'pincha String ob'ektlari deb ataladi va pro-
ikki tirnoq ichida gramm.
14.3-bo'lim Sinf satri
• String ob'ektlari o'zgarmasdir (599-bet) — ular yaratilgandan so'ng ularning belgilar mazmuni o'zgarmasdir.
o'zgardi.
• String usuli uzunligi (599-bet) Stringdagi belgilar sonini qaytaradi.
• CharAt string usuli (599-bet) belgini ma'lum bir pozitsiyaga qaytaradi.
• RegionMatches string usuli (601-bet) tenglik uchun ikkita satrning qismlarini solishtiradi.
• String usuli tenglik uchun testlarga teng. Agar Strings mazmuni bo'lsa, usul true qiymatini qaytaradi
teng, aks holda noto'g'ri. Method equals satrlar uchun leksikografik taqqoslashdan (602-bet) foydalanadi.
• Primitiv tipdagi qiymatlar == bilan solishtirilganda, ikkala qiymat bir xil bo'lsa, natija to'g'ri bo'ladi.
Murojaatlarni == bilan taqqoslaganda, ikkalasi ham bir xil ob'ektga tegishli bo'lsa, natija to'g'ri bo'ladi.
• Java bitta String ob'ekti bilan bir xil tarkibga ega bo'lgan barcha satr literallarini ko'rib chiqadi.
• String usuli equalsIgnoreCase katta-kichik harflarni sezmaydigan qatorni taqqoslashni amalga oshiradi.
• string usuli compareTo leksikografik taqqoslashdan foydalanadi va agar Stringlar boʻlsa, 0 ni qaytaradi.
teng, agar compareTo ni chaqiruvchi satr String va argumentidan kichik bo'lsa, salbiy son
Agar compareTo ni chaqiruvchi satr String argumentidan katta bo'lsa, ijobiy raqam.
• String usullari startsWith va endsWith (604-bet) satr yoki bilan boshlanishini aniqlaydi.
mos ravishda belgilangan belgilar bilan tugaydi.
• String usuli indexOf (605-bet) belgi yoki pastki satrning birinchi marta paydo bo‘lishini aniqlaydi.
ip. lastIndexOf string usuli (605-bet) belgi yoki pastki qismning oxirgi paydo bo'lishini aniqlaydi.
satrdagi string.
• String usuli pastki satr mavjud satr obyektining bir qismini nusxalaydi va qaytaradi.
• String usuli concat (608-bet) ikkita satr ob'ektini birlashtiradi va yangi satr ob'ektini qaytaradi.

634 14-bob Satrlar, belgilar va muntazam ifodalar



• String almashtirish usuli String of dagi har bir hodisani almashtiradigan yangi satr obyektini qaytaradi
uning birinchi belgi argumenti ikkinchi belgi argumenti bilan.
• UpperCase string usuli (609-bet) pozitsiyalarida katta harflar bilan yangi qatorni qaytaradi
asl satrda kichik harflar bo'lgan. Satr usuli toLowerCase (610-bet) a qaytaradi
asl satrda katta harflar bo'lgan joylarda kichik harflar bilan yangi satr.
• String usuli trim (610-bet) barcha boʻsh joy belgilari (masalan,
bo'shliqlar, yangi qatorlar va yorliqlar) satrning boshidan va oxiridan olib tashlandi.
• toCharArray string usuli (610-bet) satr belgilarining nusxasini o'z ichiga olgan char massivini qaytaradi.
aktyorlar.
• String sinfining statik usuli valueOf o'z argumentini satrga aylantirgan holda qaytaradi.
14.4-bo'lim StringBuilder sinfi
• Class StringBuilder StringBuilders-ni no bilan ishga tushirishga imkon beruvchi konstruktorlarni taqdim etadi
belgilar va boshlang'ich sig'imi 16 ta belgidan iborat bo'lib, hech qanday belgilarsiz va boshlang'ich sig'im xususiyatlari
butun son argumentida yoki String argumenti belgilarining nusxasi va
boshlang'ich sig'imi, bu String argumentidagi belgilar soni va plyus 16.
• StringBuilder usuli uzunligi (612-bet) a da hozirda saqlangan belgilar sonini qaytaradi
StringBuilder. StringBuilder usuli sig'imi (612-bet) belgilar sonini qaytaradi
ko'proq xotira ajratmasdan StringBuilder-da saqlanishi mumkin.
• StringBuilder usuli ta'minlashCapacity (613-bet) StringBuilder hech bo'lmaganda
belgilangan quvvat. SetLength usuli StringBuilder uzunligini oshiradi yoki kamaytiradi.
• StringBuilder usuli charAt (614-bet) belgilangan indeksdagi belgini qaytaradi. Usul
setCharAt (614-bet) belgini belgilangan joyga o'rnatadi. StringBuilder usuli getChars
(614-bet) StringBuilder dasturidagi belgilarni argument sifatida berilgan belgilar massiviga ko‘chiradi.
• StringBuilder’ning haddan tashqari yuklangan qo‘shish usullari (615-bet) ibtidoiy tip, belgilar massivi,
StringBuilder oxirigacha String, Object yoki CharSequence (615-bet) qiymatlari.
• StringBuilderning haddan tashqari yuklangan insert (617-bet) usullari ibtidoiy turdagi, belgilar massivi,
StringBuilder-ning istalgan pozitsiyasidagi String, Object yoki CharSequence qiymatlari.
14.5-bo'lim Sinf belgisi
• Belgilar usuli aniqlangan (620-bet) belgining Unicode belgisida yoki yo‘qligini aniqlaydi.
ter to'plami.
• Belgilar usuli isDigit (620-bet) belgining belgilangan Unicode raqami ekanligini aniqlaydi.
• Belgilar usuli -JavaIdentifierStart (620-bet) belgidan foydalanish mumkinligini aniqlaydi.
Java identifikatorining birinchi belgisi sifatida. Belgilar usuli JavaIdentifierPart (620-bet) de-
Agar belgi identifikatorda ishlatilishi mumkin bo'lsa, tugaydi.
• Belgilar usuli isLetter (620-bet) belgining harf ekanligini aniqlaydi. Belgilar usuli -
od isLetterOrDigit (620-bet) belgining harf yoki raqam ekanligini aniqlaydi.
• Belgilar usuli isKichik harf (620-bet) belgining kichik harf ekanligini aniqlaydi.
Belgilar usuli isUpperCase (620-bet) belgining bosh harf ekanligini aniqlaydi.
• Belgilar usuli toUpperCase (620-bet) belgini katta harf ekvivalentiga aylantiradi. Char-
acter usuli toLowerCase (621-bet) belgini kichik harf ekvivalentiga aylantiradi.
• Belgilar usuli raqami (621-bet) o‘zining belgilar argumentini sondagi butun songa aylantiradi
butun son argument radixi bilan belgilangan tizim (621-bet). Raqam uchun belgilar usuli (621-bet)
uning butun son argument raqamini butun soni bilan belgilangan sanoq sistemasidagi belgiga aylantiradi
argument radikali.

Xulosa 635



• Character usuli charValue (622-bet) Character obyektida saqlangan belgini qaytaradi. Xarakter
toString usuli Belgining String tasvirini qaytaradi.
14.6-bo'lim Tokenizatsiya satrlari
• Class Stringning ajratish usuli (623-bet) ajratuvchi (623-bet) xususiyatlariga asoslangan Stringni tokenlashtiradi.
argument sifatida berilgan va tokenlarni o'z ichiga olgan Stringlar massivini qaytaradi (623-bet).
14.7-bo'lim Oddiy iboralar, sinf namunasi va sinf moslamasi
• Muntazam ifodalar (624-bet) qatorlar to‘plamini belgilovchi belgilar va belgilar ketma-ketligidir.
Ular kiritilgan ma'lumotlarni tekshirish va ma'lumotlarning ma'lum bir formatda bo'lishini ta'minlash uchun foydalidir.
• String usuli mos keladi (624-bet) muntazam ifoda va moslikni belgilaydigan qatorni oladi.
es muntazam ifodaga chaqiriladigan String obyektining mazmuni. Usul
o'yin muvaffaqiyatli bo'lganligini ko'rsatadigan mantiqiy qiymatni qaytaradi.
• Belgilar sinfi - bu belgilar guruhini ifodalovchi qochish ketma-ketligi. Har bir xarakter sinfi
biz muntazam ifoda bilan moslashtirishga urinayotgan satrdagi bitta belgiga mos keladi.
• So‘z belgisi (\w; 624-bet) har qanday harf (katta yoki kichik), istalgan raqam yoki pastki chiziqdir.
xarakter.
• Bo‘sh joy belgisi (\s) bo‘sh joy, yorliq, karetani qaytarish, yangi qator yoki shakl tasmasi.
• Raqam (\d) har qanday raqamli belgidir.
• Oldindan belgilangan belgilar sinfiga (624-bet) ega bo‘lmagan belgilar to‘plamiga mos kelish uchun kvadratdan foydalaning.
qavslar, []. Diapazonlarni ikkita belgi orasiga tire (-) qo'yish orqali ifodalash mumkin. Agar birinchi
qavs ichidagi belgi "^", ifoda ko'rsatilganlardan boshqa har qanday belgini qabul qiladi.
• Oddiy iborada "*" oddiy ifoda operatori paydo bo'lganda, dastur harakat qiladi
"*" dan oldingi to'g'ridan-to'g'ri pastki ifodaning nol yoki undan ortiq holatlariga mos kelish.
• Operator "+" o'zidan oldingi pastki ifodaning bir yoki bir nechta holatlariga mos kelishga harakat qiladi.
• “|” belgisi ifodaning chap yoki o'ng tomoniga mos kelishiga imkon beradi.
• Qavslar () muntazam ifoda qismlarini guruhlash uchun ishlatiladi.
• Yulduzcha (*) va plyus (+) rasman kvantlar deb ataladi (628-bet).
• Miqdor ko'rsatkichi faqat o'zidan oldingi pastki ifodaga ta'sir qiladi.
• Miqdor ko'rsatkichi so'roq belgisi (?) u miqdoriy ifodalovchi ifodaning nolga yoki bitta takroriga mos keladi.
• Bitta raqamni ({n}) o‘z ichiga olgan qavslar to‘plami u ifodasining n ta takrorlanishiga to‘liq mos keladi
miqdoriy beradi. Qavslar ichiga olingan raqamdan keyin vergul qoʻyish kamida n ta holatga mos keladi.
• Ikkita raqamdan ({n,m}) iborat qavslar toʻplami n va m ta takrorlanishlar orasidagi mos keladi.
tegishli ekanligini ifodalaydi.
• Miqdor ko‘rsatkichlari ochko‘zdir (629-bet) — ular imkon qadar ko‘p hodisalarga mos keladi.
o'yin muvaffaqiyatli o'tdi. Agar miqdor ko'rsatkichidan keyin savol belgisi (?) qo'yilsa, miqdor ko'rsatkichi qayta bo'ladi.
luctant (629-bet), agar o'yin muvaffaqiyatli bo'lsa, iloji boricha kamroq holatlarga mos keladi.
• Satrning replaceAll usuli (629-bet) satrdagi matnni yangi matn bilan almashtiradi (ikkinchi argument)
asl satr muntazam ifodaga mos keladigan joyda (birinchi argument).
• Maxsus muntazam ifoda belgisidan \ bilan qochish muntazam ifodani moslashtirishni buyuradi
muntazam ifodada ifodalagan narsadan farqli o'laroq, haqiqiy belgini topish uchun vosita.
• String replaceFirst usuli (629-bet) naqsh mosligining birinchi takrorlanishini almashtiradi va qayta
tegishli belgilar almashtirilgan yangi qatorni aylantiradi.
• String usulini ajratish (629-bet) satrni spetsifikatsiyaga mos keladigan istalgan joyda pastki qatorlarga ajratadi.
muntazam ifodalangan va pastki qatorlar qatorini qaytaradi.

636 14-bob Satrlar, belgilar va muntazam ifodalar



• Sinf namunasi (631-bet) muntazam ifodani ifodalaydi.
• Class Matcher (631-bet)da oddiy ifoda namunasi va CharSequence mavjud.
qidirmoq.
• CharSequence – interfeys (631-bet) bo‘lib, u belgilar ketma-ketligini o‘qishga ruxsat beradi. Ikkalasi ham
String va StringBuilder ushbu interfeysni amalga oshiradi, shuning uchun ular Matcher sinfida ishlatilishi mumkin.
• Agar oddiy ifoda faqat bir marta ishlatilsa, statik Pattern usuli mos keladi (631-bet) qatorni oladi
bu moslikni bajarish uchun muntazam ifoda va CharSequenceni belgilaydi. Bu
usuli qidiruv ob'ektining muntazam ifodaga mos kelishini ko'rsatuvchi mantiqiy qiymatni qaytaradi.
• Agar muntazam ifoda bir necha marta ishlatilsa, statik Pattern usulidan foydalanish samaraliroq bo'ladi.
od kompilyatsiyasi (631-bet) o'sha muntazam ifoda uchun maxsus Pattern ob'ektini yaratish. Bu usul
naqshni ifodalovchi qatorni oladi va yangi Pattern obyektini qaytaradi.
• Pattern usuli moslashtiruvchi (631-bet) qidirish uchun CharSequence-ni oladi va Matcher ob'ektini qaytaradi.
ob'ekt. Matcher usuli matches (631-bet) Pattern method matches lekin bir xil vazifani bajaradi
argumentlarsiz.
• Match usulini topish (631-bet) qidiruv ob'ektining bir qismini qidirish pat-
tern. Ushbu usulga har bir qo'ng'iroq oxirgi qo'ng'iroq tugagan nuqtadan boshlanadi, shuning uchun bir nechta mos keladi
topish mumkin.
• LookAt moslashtiruvchi usuli (631-bet) find bilan bir xil ishlaydi, faqat u har doim quyidagidan boshlanadi
qidiruv ob'ektining boshlanishi va agar mavjud bo'lsa, har doim birinchi moslikni topadi.
• Matcher usullari guruhi (632-bet) qidiruvga mos keladigan qidiruv ob'ektidan qatorni qaytaradi
naqsh. Qaytarilgan satr oxirgi marta find yoki lookingAt qo'ng'irog'i bilan moslangan qatordir.
O'z-o'zini tekshirish mashqlari
14.1 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) String ob'ektlari == yordamida solishtirilganda, agar Strings tarkibida bo'lsa, natija to'g'ri bo'ladi
bir xil qiymatlar.
b) String yaratilgandan keyin uni o'zgartirish mumkin.
14.2 Quyidagilarning har biri uchun ko'rsatilgan vazifani bajaradigan bitta bayonot yozing:
a) Tarkiblar tengligi uchun s1 dagi satrni s2 dagi satr bilan solishtiring.
b) s2 qatorini s1 qatoriga += yordamida qo‘shing.
c) s1 dagi ip uzunligini aniqlang.
O'z-o'zini tekshirish mashqlariga javoblar
14.1 a) noto'g'ri. String ob'ektlari ularning mavjudligini aniqlash uchun == operatori yordamida taqqoslanadi
xotirada bir xil ob'ekt.
b) yolg'on. String ob'ektlari o'zgarmasdir va ularni yaratilgandan keyin o'zgartirib bo'lmaydi.
StringBuilder ob'ektlari yaratilgandan keyin o'zgartirilishi mumkin.
14.2 a) s1.teng(s2)
b) s1 += s2;
c) s1.uzunlik()
Mashqlar
14.3 (Stringlarni solishtirish) Taqqoslash uchun solishtirish String usulidan foydalanadigan dastur yozing
foydalanuvchi tomonidan kiritilgan ikkita satr. Birinchi qatordan kichik, teng yoki kattaroqligini chiqaring
ikkinchisi.

637-mashqlar



14.4 (String qismlarini solishtirish) String usuli mintaqasidan foydalanadigan dastur yozing.
Foydalanuvchi kiritgan ikkita qatorni solishtirish uchun mos keladi. Ilova belgilar sonini kiritishi kerak
solishtiriladigan aktyorlar va taqqoslashning boshlang'ich ko'rsatkichi. Arizada ko'rsatilishi kerak
satrlar teng bo'ladimi. Taqqoslashni amalga oshirayotganda belgilarning holatiga e'tibor bermang.
14.5 (Tasodifiy jumlalar) Yaratish uchun tasodifiy sonlarni yaratishdan foydalanadigan dastur yozing
jumlalar. Artik, ot, fe'l va predlog deb nomlangan to'rtta qatordan foydalaning. Gap tuzing
quyidagi tartibda har bir massivdan tasodifiy so'zni tanlash orqali: artikl, ot, fe'l, bosh-
tion, artikl va ot. Har bir so'z tanlanayotganda, uni gapdagi oldingi so'zlar bilan bog'lang.
So'zlar bo'sh joy bilan ajratilishi kerak. Yakuniy jumla chiqarilganda, u a bilan boshlanishi kerak
bosh harf va nuqta bilan tugaydi. Ilova 20 ta jumla yaratishi va ko'rsatishi kerak.
Maqola massivida “the”, “a”, “bir”, “baʼzi” va “har qanday” maqolalari boʻlishi kerak; ot
massivda "o'g'il", "qiz", "it", "shahar" va "mashina" otlari bo'lishi kerak; fe'l massivi mos bo'lishi kerak
haydab ketdi, sakrab ketdi, yugurdi, yurdi, o‘tkazib yubordi fe’llarini yozing; predlog massivi bo'lishi kerak
tarkibida “to”, “dan”, “over”, “ast” va “on” predloglari mavjud.
14.6 (Loyiha: Limeriks) Limerik besh qatorli hazilli misra boʻlib, unda birinchi va ikkinchi qatorlar boʻladi.
beshinchisi bilan qofiya, uchinchi misra esa to‘rtinchisi bilan qofiyalanadi. Shu kabi usullardan foydalanish
14.5-mashqda ishlab chiqilgan, tasodifiy limeriklarni ishlab chiqaradigan Java dasturini yozing. Ushbu ilovani jilolash
Yaxshi limeriklarni ishlab chiqarish qiyin muammo, ammo natija kuchga arziydi!
14.7 (Pig Lotin) Ingliz tilidagi iboralarni pig lotin tiliga kodlaydigan dastur yozing. Cho'chqa
Lotin tili kodlangan tilning shaklidir. Cho'chqa lotincha iboralarni yaratishning turli xil usullari mavjud. Uchun
soddaligi uchun quyidagi algoritmdan foydalaning:
Ingliz tilidagi iboradan cho'chqa lotincha iborani yaratish uchun iborani so'zlarga aylantiring
String usuli bo'linishi bilan. Har bir inglizcha so'zni cho'chqa lotincha so'ziga tarjima qilish uchun birinchisini qo'ying
so'z oxirida inglizcha so'zning harfini qo'ying va "ay" harflarini qo'shing. Shunday qilib, "sakrash" so'zi
“umpjay”, “the” so‘zi “hetay” ga, “kompyuter” so‘zi esa “omputer-” ga aylanadi.
cay.” So'zlar orasidagi bo'shliqlar bo'sh joy sifatida qoladi. Quyidagilarni faraz qiling: Inglizcha ibora quyidagilardan iborat
bo'sh joylar bilan ajratilgan so'zlar, tinish belgilari yo'q va barcha so'zlarda ikki yoki undan ortiq harf mavjud.
PrintLatinWord usuli har bir so'zni ko'rsatishi kerak. Har bir token printLatin usuliga o'tkaziladi-
Cho'chqa lotincha so'zni chop etish uchun so'z. Foydalanuvchiga jumlani kiritishga ruxsat bering. Ishlayotgan displeyni saqlang
matn maydonidagi barcha aylantirilgan jumlalar.
14.8 (Telefon raqamlarini tokenlash) Telefon raqamini telefon raqami sifatida kirituvchi dastur yozing.
(555) 555-5555 ko'rinishidagi qator. Ilova ni chiqarish uchun String split usulidan foydalanishi kerak
token sifatida hudud kodi, token sifatida telefon raqamining birinchi uchta raqami va oxirgi to'rtta raqami
telefon raqami belgi sifatida. Telefon raqamining ettita raqami birlashtirilishi kerak
bitta ip. Hudud kodi ham, telefon raqami ham chop etilishi kerak. Sizda bo'lishini unutmang
tokenizatsiya jarayonida ajratuvchi belgilarni o'zgartirish uchun.
14.9 (Gapni soʻzlari teskari holatda koʻrsatish) qatorni kirituvchi dastur yozing.
matn, String usuli bo'linishi bilan chiziqni tokenizatsiya qiladi va tokenlarni teskari tartibda chiqaradi. Bo'sh joydan foydalaning
belgilar chegaralovchi sifatida.
14.10 (Stringlarni katta va kichik harflarda ko'rsatish) qatorni kirituvchi dastur yozing.
matn va matnni ikki marta chiqaradi - bir marta barcha katta harflar va bir marta barcha kichik harflar.
14.11 (Qidiruv satrlari) Matn qatori va qidiruv belgisini kirituvchi dastur yozing va
Belgining matndagi takrorlanish sonini aniqlash uchun String usuli indexOf dan foydalanadi.
14.12 (Qidiruv satrlari) 14.11-mashqdagi ilova asosida ariza yozing.
matn qatorini kiritadi va hodisalarning umumiy sonini aniqlash uchun String usuli indexOf dan foydalanadi
matndagi alifboning har bir harfi. Katta va kichik harflarni birgalikda sanash kerak.
Har bir harf uchun jami ma'lumotlarni massivda saqlang va jami bo'lgandan keyin qiymatlarni jadval ko'rinishida chop eting
belgilangan.

638 14-bob Satrlar, belgilar va muntazam ifodalar

14.13 (Tokenizatsiya va satrlarni taqqoslash) Matn qatorini o'qiydigan dastur yozing, token-
chegaralovchi sifatida bo'sh joy belgilaridan foydalangan holda qatorni ajratadi va faqat bilan boshlanadigan so'zlarni chiqaradi
"b" harfi.
14.14 (Tokenizatsiya va satrlarni taqqoslash) Matn qatorini o'qiydigan dastur yozing, token-
uni ajratuvchi sifatida bo'sh joy belgilaridan foydalanadi va faqat "ED" harflari bilan tugaydigan so'zlarni chiqaradi.
14.15 (Int qiymatlarini belgilarga aylantirish) uchun butun son kodini kirituvchi dastur yozing.
belgi va tegishli belgini ko'rsatadi. Ushbu ilovani hammasini yaratadigan tarzda o'zgartiring
000 dan 255 gacha bo'lgan oraliqdagi mumkin bo'lgan uch xonali kodlar va mos keladiganlarni chop etishga urinishlar
belgilar.
14.16 (O'z String usullarini aniqlash) String qidiruv usullarining o'z versiyalarini yozing
indexOf va lastIndexOf.
14.17 (Besh harfli so'zdan uch harfli satrlar yaratish) a o'qiydigan dastur yozing.
foydalanuvchidan besh harfli so'z va olinishi mumkin bo'lgan har bir uch harfli qatorni ishlab chiqaradi
bu so'zning harflaridan. Masalan, “cho‘milish” so‘zidan hosil bo‘lgan uch harfli so‘zlar
"egan", "ko'rshapalak", "tikish", "tab", "shlyapa", "the" va "choy" kiradi.

Maxsus bo'lim: Kengaytirilgan string-manipulyatsiya mashqlari


Oldingi mashqlar matnga asoslanadi va sizning asosiy tushunchalaringizni sinab ko'rish uchun mo'ljallangan.
aqliy string-manipulyatsiya tushunchalari. Ushbu bo'lim oraliq va to'plamini o'z ichiga oladi
ilg'or torli manipulyatsiya mashqlari. Siz bu muammolarni qiyin, ammo qiziqarli deb bilishingiz kerak.
ing. Muammolar qiyinchilikda sezilarli darajada farqlanadi. Ba'zilar bir yoki ikki soat ariza yozishni talab qiladi -
ing va amalga oshirish. Boshqalari ikkita yoki uchta talab qilishi mumkin bo'lgan laboratoriya topshiriqlari uchun foydalidir
o'rganish va amalga oshirish haftalari. Ba'zilar qiyin muddatli loyihalardir.
14.18 (Matnni tahlil qilish) String-manipulyatsiya qobiliyatiga ega kompyuterlarning mavjudligi qayta tiklandi.
buyuk mualliflarning asarlarini tahlil qilishda juda qiziqarli yondashuvlar bilan ta'minlangan. Ko'p e'tibor -
Uilyam Shekspir qachonlardir yashab o'tganmi, degan savolga e'tibor qaratildi. Ba'zi olimlar bunga ishonishadi
Kristofer Marlou asarlarni haqiqatda yozganligini ko'rsatadigan jiddiy dalillar
Shekspirga aytilgan. Tadqiqotchilar bu yozuvlardagi o'xshashlikni topish uchun kompyuterlardan foydalanganlar
ikki muallif. Ushbu mashq matnlarni kompyuter yordamida tahlil qilishning uchta usulini ko'rib chiqadi.
a) Klaviaturadan matn qatorini o‘qiydigan va jadvalni chop etuvchi dastur yozing.
matnda alifboning har bir harfining takrorlanish sonini aniqlash. Masalan,
ibora
Bo'lish yoki bo'lmaslik: bu savol:
tarkibida bitta “a”, ikkita “b”, “c” yo‘q va hokazo.
b) Matn qatorini o'qiydigan va raqamni ko'rsatuvchi jadvalni chop etuvchi dastur yozing
bir harfli so'zlar, ikki harfli so'zlar, uch harfli so'zlar va hokazo
matn. Misol uchun, 14.25-rasmda ibora uchun hisoblar ko'rsatilgan
Ongda azob chekish olijanobroqmi
c) Matn satrini o'qiydigan va raqamni ko'rsatadigan jadvalni chop etadigan dastur yozing
matndagi har bir so'zning kelishi. Ilova quyidagilarni o'z ichiga olishi kerak
jadvaldagi so'zlar matnda qanday tartibda paydo bo'lsa, xuddi shunday tartibda. Masalan,
chiziqlar
Bo'lish yoki bo'lmaslik: bu savol:
Ongda azob chekish olijanobroqmi
uch marta "to" so'zini, ikki marta "bo'l" so'zini, bir marta "yoki" so'zini va boshqalarni o'z ichiga oladi.

Maxsus bo'lim: Kengaytirilgan string-manipulyatsiya mashqlari 639

14.19 (Turli formatlarda chop etish sanalari) Sanalar bir nechta umumiy formatlarda chop etiladi. Ikki dan
keng tarqalgan formatlar
04/25/1955 va 1955 yil 25 aprel
Birinchi formatda sanani o'qiydigan va ikkinchi formatda chop etadigan dastur yozing.
14.20 (Tekshirish himoyasi) Kompyuterlar tez-tez chek yozish tizimlarida qo'llaniladi, masalan
ish haqi va kreditorlik qarzlari bo'yicha ilovalar. Haftalik ish haqi haqida juda ko'p g'alati hikoyalar mavjud
1 million dollardan ortiq summaga (xatolik bilan) chop etilmoqda. Noto'g'ri miqdorlar tomonidan chop etilgan
inson xatosi yoki mashinaning ishdan chiqishi tufayli kompyuterlashtirilgan tekshirish tizimlari. Tizim dizaynerlari
bunday noto'g'ri tekshiruvlar chiqarilishining oldini olish uchun o'z tizimlariga boshqaruv elementlarini o'rnatish.
Yana bir jiddiy muammo - bu kimningdir chek miqdorini qasddan o'zgartirishi
chekni firibgarlik yo‘li bilan naqd qilishni rejalashtirmoqda. Dollar miqdori o'zgarishining oldini olish uchun ba'zi kompyuter-
Chek yozish tizimlari chekni himoya qilish deb ataladigan usuldan foydalanadi. Cheklar uchun mo'ljallangan
kompyuter tomonidan chop etishda kompyuter chop etishi mumkin bo'lgan ma'lum miqdordagi bo'sh joy mavjud
miqdori. Aytaylik, ish haqi chekida kompyuter bo'lishi kerak bo'lgan sakkizta bo'sh joy mavjud
haftalik ish haqi miqdorini chop eting. Agar miqdor katta bo'lsa, unda sakkizta bo'shliqning hammasi bo'ladi
to'ldirilgan. Masalan,
1,230,60 (tekshirish summasi)
--------
12345678 (lavozim raqamlari)
Boshqa tomondan, agar miqdor 1000 dollardan kam bo'lsa, unda bir nechta bo'shliqlar odatda bo'ladi.
bo'sh qoldirilgan. Masalan,
99,87
--------
12345678
uchta bo'sh joyni o'z ichiga oladi. Agar chek bo'sh joylar bilan chop etilsa, kimdir o'zgartirishi osonroq bo'ladi
soni; miqdori. O'zgarishlarning oldini olish uchun ko'plab chek-yozuv tizimlari himoya qilish uchun etakchi yulduzchalarni qo'yadi
miqdori quyidagicha:
***99,87
--------
12345678
Chekda chop etilishi kerak bo'lgan dollar miqdorini kiritadigan ariza yozing, so'ngra uni chop eting
agar kerak bo'lsa, bosh yulduzcha bilan chekdan himoyalangan formatda summa. To'qqiz bo'shliq bor deb faraz qilaylik
miqdorni chop etish mumkin.

So'z uzunligi Voqealar

1 0
2 2
3 1
4 2 (shu jumladan 'tis)
5 0
6 2
7 1

14.25-rasm | So'z uzunligi satr uchun hisoblanadi


"Ongda azob chekish olijanobroqmi".

640 14-bob Satrlar, belgilar va oddiy iboralar

14.21 (Chek summasining so'z ekvivalentini yozish) Muhokamani davom ettirish
14.20-mashq, biz o'zgarishlarni oldini olish uchun chek yozish tizimlarini loyihalash muhimligini yana bir bor ta'kidlaymiz
chek summalari. Umumiy xavfsizlik usullaridan biri miqdorni raqamlar bilan yozishni talab qiladi
va so'zlarda ham talaffuz qilinadi. Agar kimdir chekning son miqdorini o'zgartirishi mumkin bo'lsa ham,
miqdorni so'z bilan o'zgartirish juda qiyin. Raqam kiritadigan dastur yozing
$1000 dan kam bo'lgan miqdorni tekshiring va so'z ekvivalentini yozadi. Masalan,
miqdori 112,43 deb yozilishi kerak
BIR yuz o'n ikki va 43/100
14.22 (Morze kodi) Ehtimol, barcha kodlash sxemalarining eng mashhuri ishlab chiqilgan Morze kodidir.
1832 yilda Samuel Morse tomonidan telegraf tizimida foydalanish uchun. Morze kodi bir qator nuqtalarni belgilaydi
va alifboning har bir harfiga, har bir raqamga va bir nechta maxsus belgilarga (masalan, nuqta, kom-
ma, ikki nuqta, nuqtali vergul). Tovushga yoʻnaltirilgan tizimlarda nuqta qisqa tovushni, chiziqcha esa a
uzoq ovoz. Nuqtalar va chiziqlarning boshqa tasvirlari yorug'likka yo'naltirilgan tizimlar va belgilar bilan ishlatiladi.
nal bayroq tizimlari. So'zlar orasidagi bo'linish bo'sh joy yoki oddiygina nuqta yo'qligi bilan ko'rsatiladi
yoki chiziqcha. Ovozga yo'naltirilgan tizimda bo'sh joy tovush bo'lmagan qisqa vaqt bilan ko'rsatiladi
uzatiladi. Morze alifbosining xalqaro versiyasi 14.26-rasmda keltirilgan.
Ingliz tilidagi iborani o'qiydigan va uni Morze alifbosiga kodlaydigan dastur yozing.
Shuningdek, Morze alifbosidagi iborani o'qiydigan va uni ingliz tiliga o'zgartiradigan dastur yozing.
til ekvivalenti. Har bir Morze kodli harf o'rtasida bitta bo'sh joy va har biri orasida uchta bo'sh joydan foydalaning
Morze kodli so'z.

14.23 (Metrik konversiyalar) Foydalanuvchiga metrik konvertatsiya qilishda yordam beradigan dastur yozing.


Sizning ilovangiz foydalanuvchiga birliklar nomlarini satrlar (ya'ni, santimetr,
metrik tizim uchun litr, gramm va boshqalar, inglizlar uchun esa dyuym, kvart, funt va boshqalar.
tizimi) va oddiy savollarga javob berishi kerak, masalan
"2 metrda necha dyuym bor?"
"10 litrda nechta litr bor?"

Belgilar kodi Belgilar kodi Belgilar kodi

A .- N -. Raqamlar
B -... O --- 1 .----
C -.-. P .--. 2 ..---
D -.. Q --.- 3 ...--
E . R .-. 4 ....-
F ..-. S ... 5 ......
G --. T - 6 -....
H .... U ..- 7 --...
I .. V ...- 8 ---..
J .--- V .-- 9 ----.
K -.- X -..- 0 -----
L .-.. Y -.--
M -- Z --..

14.26-rasm | Xalqaro Morze kodida ifodalangan harflar va raqamlar.


Maxsus bo'lim: String-manipulyatsiya loyihalarini qiyinlashtirish 641



Sizning arizangiz noto'g'ri konvertatsiyalarni tan olishi kerak. Masalan, savol
"5 kilogrammda qancha oyoq bor?"
ma'noli emas, chunki "oyoq" uzunlik birligi, "kilogramm" esa massa birligi.
Maxsus bo'lim: String-manipulyatsiya loyihalarini qiyinlashtirish
14.24 (Loyiha: Imlo tekshiruvi) Ko'pgina mashhur so'zlarni qayta ishlash dasturiy paketlari o'rnatilgan
imlo tekshirgichlarida. Ushbu loyihada sizdan o'zingizning imlo tekshiruvi yordam dasturingizni ishlab chiqish so'raladi. qilamiz
boshlashingizga yordam beradigan takliflar. Keyin qo'shimcha imkoniyatlarni qo'shish haqida o'ylashingiz kerak. Kompozitsiyadan foydalaning
so'zlar manbai sifatida (agar sizda mavjud bo'lsa) puterized lug'at.
Nega biz noto'g'ri imlo bilan juda ko'p so'zlarni yozamiz? Ba'zi hollarda, biz oddiygina, chunki
to'g'ri imloni bilmayman, shuning uchun biz eng yaxshi taxmin qilamiz. Ba'zi hollarda, bu biz o'tkazganimiz uchun
ikkita harf (masalan, "standart" o'rniga "default"). Ba'zan biz xatni tasodifan ikki marta teramiz
(masalan, “qulay” o‘rniga “hanndy”). Ba'zan biz kalit o'rniga yaqin-atrofdagi kalitni kiritamiz
mo'ljallangan (masalan, "tug'ilgan kun" o'rniga "biryhday") va boshqalar.
Java-da imlo tekshirgich dasturini loyihalash va amalga oshirish. Sizning arizangiz saqlanib qolishi kerak
massiv so'z satrlar ro'yxati. Foydalanuvchiga ushbu qatorlarni kiritishga ruxsat bering. [Izoh: 15-bobda biz kirish-
fayllarni qayta ishlash. Ushbu imkoniyat yordamida siz imlo tekshiruvi uchun so'zlarni a dan olishingiz mumkin
faylda saqlangan kompyuterlashtirilgan lug'at.]
Sizning ilovangiz foydalanuvchidan so'z kiritishni so'rashi kerak. Keyin dastur buni izlashi kerak
wordList massividagi so'z. Agar so'z massivda bo'lsa, ilovangiz "Word is
to'g'ri yozilgan." Agar so'z massivda bo'lmasa, ilovangiz "So'z emas" deb chop etishi kerak.
To'g'ri yozilgan." Keyin ilovangiz wordList-dagi boshqa so'zlarni topishga harakat qilishi kerak
foydalanuvchi yozmoqchi bo'lgan so'z bo'lishi mumkin. Masalan, siz barcha mumkin bo'lgan yagona transpozitsiyani sinab ko'rishingiz mumkin.
“standart” soʻzi wordListʼdagi soʻzga toʻgʻridan-toʻgʻri mos kelishini aniqlash uchun qoʻshni harflar bilan tanishing.
Albatta, bu sizning ilovangiz boshqa barcha yagona transpozitsiyalarni tekshirishini anglatadi, masalan
"edfault", "dfeault", "deafult", "defalut" va "defautl". Mos keladigan yangi so'zni topganingizda
WordList-da, uni xabarda chop eting, masalan
Siz "standart" degan edingizmi?
Har bir qo'sh harfni bitta harf bilan almashtirish va boshqa har qanday boshqa testlarni amalga oshiring
imlo tekshirgichingizning qiymatini yaxshilash uchun ishlab chiqishingiz mumkin bo'lgan testlar.
14.25 (Loyiha: Krossvord generatori) Ko‘pchilik krossvord ustida ishlagan, lekin
Bir nechtasi bittasini yaratishga harakat qilgan. Bu yerda krossvord yaratish tavsiya etiladi.
katta murakkablik va kuch talab qiladigan manipulyatsiya loyihasi.
Eng oddiy krossvord topish uchun dasturchi hal qilishi kerak bo'lgan ko'plab masalalar mavjud.
zle-generator ilovasi ishlaydi. Masalan, krossvord to'plamini qanday ifodalaysiz?
kompyuter ichida zle? Bir qator qatorlar yoki ikki o'lchovli massivlardan foydalanish kerakmi?
Dasturchiga bevosita bo'lishi mumkin bo'lgan so'zlar manbai (ya'ni, kompyuterlashtirilgan lug'at) kerak
ilova tomonidan havola qilingan. Kompleksni engillashtirish uchun bu so'zlarni qanday shaklda saqlash kerak
ilova tomonidan talab qilinadigan manipulyatsiyalar?
Agar siz haqiqatan ham shuhratparast bo'lsangiz, jumboqning maslahat qismini yaratishni xohlaysiz.
har bir so'z bo'ylab va har bir past so'z uchun qisqacha maslahatlar chop etiladi. Faqat versiyasini chop etish
bo'sh jumboqning o'zi oddiy muammo emas.
Farq qilish
14.26 (Sog'lomroq ingredientlar bilan pishirish) Amerikada semirish dahshatli darajada oshib bormoqda.
Xaritani Kasalliklarni nazorat qilish va oldini olish markazlaridan (CDC) tekshiring: www.cdc.gov/
nccdphp/dnpa/Obesity/trend/maps/index.htm, bu Qo'shma Shtatlardagi semirish tendentsiyalarini ko'rsatadi

642 14-bob Satrlar, belgilar va muntazam ifodalar

so'nggi 20 yil ichida. Semirib ketish ortishi bilan bog'liq muammolar (masalan, yurak kasalliklari,
yuqori qon bosimi, yuqori xolesterin, 2-toifa diabet). Foydalanuvchilarga tanlashga yordam beradigan dastur yozing
Ovqat pishirishda sog'lom ingredientlarni topishga yordam beradi va ba'zi oziq-ovqatlarga (masalan, yong'oq, kleykovina) alerjisi bo'lganlarga yordam beradi
o'rinbosarlari. Dastur JTextArea dan retseptni o'qishi va sog'lomroq almashtirishlarni taklif qilishi kerak
ba'zi ingredientlar uchun. Oddiylik uchun dasturingiz retseptda qisqartma yo'q deb taxmin qilish kerak.
choy qoshiqlari, stakanlar va osh qoshiqlar kabi o'lchovlar uchun ishlatiladi va miqdor uchun raqamli raqamlardan foydalanadi.
galstuklarni (masalan, 1 tuxum, 2 stakan) talaffuz qilishdan ko'ra (bir tuxum, ikki stakan). Ba'zi umumiy
almashtirishlar 14.27-rasmda ko'rsatilgan. Sizning dasturingiz ogohlantirishni ko'rsatishi kerak, masalan: "Har doim
Sizning dietangizga jiddiy o'zgarishlar kiritishdan oldin shifokoringizga murojaat qiling.
Sizning dasturingiz almashtirishlar har doim ham bitta emasligini hisobga olishi kerak.
Misol uchun, agar pirojnoe retsepti uchta tuxumni talab qilsa, uning o'rniga oltita tuxum oqidan foydalanish mumkin.
O'lchovlar va almashtirishlar uchun konvertatsiya ma'lumotlarini quyidagi veb-saytlarda olish mumkin:
chinesefood.about.com/od/recipeconversionfaqs/f/usmetricrecipes.htm
www.pioneerthinking.com/eggsub.html
www.gourmetsleuth.com/conversions.htm
Sizning dasturingiz yuqori xolesterin, yuqori qon bosimi kabi foydalanuvchining sog'lig'i bilan bog'liq muammolarni ko'rib chiqishi kerak.
albatta, vazn yo'qotish, kleykovina allergiyasi va boshqalar. Yuqori xolesterin uchun dastur o'rinbosarlarni taklif qilishi kerak.
tuxum va sut mahsulotlari uchun pishiriqlar; agar foydalanuvchi vazn yo'qotmoqchi bo'lsa, uni past kaloriyali almashtiradi
shakar kabi ingredientlarni taklif qilish kerak.

14.27 (Spam skaneri) Spam (yoki keraksiz elektron pochta) AQSh tashkilotlariga yiliga milliardlab dollarga tushadi.


spamning oldini olish dasturi, uskunalar, tarmoq resurslari, tarmoqli kengligi va yo'qolgan mahsuldorlik.
Internetda eng keng tarqalgan spam elektron pochta xabarlari va so'zlarini o'rganing va o'zingiznikini tekshiring
keraksiz elektron pochta papkasi. Spam-xabarlarda tez-tez uchraydigan 30 ta so'z va iboralar ro'yxatini yarating. Yozing
foydalanuvchi JTextArea-ga elektron pochta xabarini kiritadigan dastur. Keyin xabarni skanerlang
30 ta kalit so'z yoki iboraning har biri uchun. Xabarda ulardan birining har bir paydo bo'lishi uchun qo'shing

Ingredientlarni almashtirish

1 stakan smetana 1 stakan yogurt
1 stakan sut 1/2 chashka bug'langan sut va 1/2 stakan suv
1 choy qoshiq limon sharbati 1/2 choy qoshiq sirka
1 stakan shakar 1/2 chashka asal, 1 stakan melas
yoki 1/4 chashka agave nektar
1 stakan sariyog '1 stakan margarin yoki yogurt
1 stakan un 1 stakan javdar yoki guruch uni
1 stakan mayonez 1 stakan tvorog
yoki 1/8 chashka mayonez va 7/8 chashka yogurt
1 tuxum 2 osh qoshiq jo'xori kraxmal, o'q uni
yoki kartoshka kraxmal yoki 2 tuxum oqi
yoki katta bananning 1/2 qismi (pyuresi)
1 stakan sut 1 stakan soya suti
1/4 chashka yog '1/4 chashka olma
oq non to'liq donli non

14.27-rasm | Umumiy oziq-ovqat almashinuvi.


Farq qilish 643

xabarning "spam reytingi" ga nuqta. Keyinchalik, xabarning spam bo'lish ehtimolini hisobga olgan holda baholang
olingan ballar soni.
14.28 (SMS tili) Qisqa xabarlar xizmati (SMS) - bu aloqa xizmati
mobil telefonlar o'rtasida 160 yoki undan kam belgidan iborat matnli xabarlarni yuborish. ning tarqalishi bilan
butun dunyo bo'ylab mobil telefondan foydalaniladi, SMS ko'plab rivojlanayotgan mamlakatlarda siyosiy maqsadlarda qo'llaniladi
(masalan, fikr bildirish va qarshilik bildirish), tabiiy ofatlar haqidagi yangiliklarni xabar qilish va hokazo. sobiq uchun -
etarli, comunica.org/radio2.0/archives/87 ni tekshiring. SMS-xabarlar uzunligi cheklanganligi sababli
ited, SMS Language — mobil matnli xabarlardagi umumiy soʻz va iboralarning qisqartmasi, e-
pochta, lahzali xabarlar va boshqalar — tez-tez ishlatiladi. Masalan, "mening fikrimcha" SMS Lan-da "imo"
til. Onlayn SMS tilini o'rganing. Foydalanuvchi xabarni kiritishi mumkin bo'lgan GUI ilovasini yozing.
SMS tilidan foydalangan holda adaçayı ni bosing, keyin uni ingliz tiliga (yoki o'z tilingizga) tarjima qilish uchun tugmani bosing.
Shuningdek, ingliz tilida (yoki o'z tilingizda) yozilgan matnni SMS Lan-ga tarjima qilish mexanizmini taqdim eting.
til. Mumkin bo'lgan muammolardan biri shundaki, bitta SMS qisqartmasi turli iboralarga kengayishi mumkin.
Masalan, IMO (yuqorida ishlatilganidek) “Xalqaro dengiz tashkiloti”ni ham anglatishi mumkin
xotirasi" va boshqalar.

15 F


Iles, Streams va Object
Seriyalashtirish

Ong ... qilmaydi


o'z-o'zidan maydalangan ko'rinadi
bitlar. ... “daryo” yoki “oqim”
bu metaforalardir
eng tabiiy tarzda tasvirlangan.
- Uilyam Jeyms

Oh maqsadlar


Ushbu bobda siz:
■ Yaratish, o'qish, yozish va
fayllarni yangilash.
■ haqida ma'lumot olish
fayllar va kataloglar yordamida
NIO.2 API xususiyatlari.
■ orasidagi farqlarni bilib oling
matnli fayllar va ikkilik fayllar.
■ Class Formatterdan foydalaning
matnni faylga chiqarish.
■ Kiritish uchun sinf skaneridan foydalaning
fayldan matn.
■ Ob'ektlarni yozish va o'qish
yordamida fayldan ob'ektlar
ob'ektni ketma-ketlashtirish, interfeys
Serializatsiya va sinflar
ObjectOutputStream
va ObjectInputStream.
■ JFileChooser muloqot oynasidan foydalaning
foydalanuvchilarga fayllarni tanlashga ruxsat berish yoki
diskdagi kataloglar.

15.1 Kirish 645

15.1 Kirish
O'zgaruvchilar va massivlarda saqlanadigan ma'lumotlar vaqtinchalik - mahalliy o'zgaruvchi tashqariga chiqqanda ular yo'qoladi.
qamrovi yoki dastur tugashi. Ma'lumotlarni uzoq muddatli saqlash uchun, hatto pro-
Ma'lumotlarni yaratuvchi grammlar tugaydi, kompyuterlar fayllardan foydalanadi. Vazifalar uchun har kuni fayllardan foydalanasiz
hujjat yozish yoki elektron jadval yaratish kabi. Kompyuterlar ikkinchi darajali fayllarni saqlaydi
saqlash qurilmalari, jumladan, qattiq disklar, flesh-disklar, DVD disklar va boshqalar. Saqlangan ma'lumotlar
fayllar doimiy ma'lumotlar bo'lib, ular dasturni bajarish muddatidan keyin ham mavjud. Ushbu bobda -
Biz Java dasturlari fayllarni qanday yaratish, yangilash va qayta ishlashni tushuntiramiz.
Biz fayllarni dasturiy jihatdan qayta ishlash uchun Java arxitekturasini muhokama qilishdan boshlaymiz.
Keyinchalik biz ma'lumotlar matnli fayllar va ikkilik fayllarda saqlanishi mumkinligini tushuntiramiz va biz farqni ko'rib chiqamiz.
ular orasidagi farqlar. Biz fayllar va kataloglar haqida ma'lumot olishni ko'rsatamiz
Paths and Files sinflari hamda Path va DirectoryStream interfeyslaridan foydalanish (barchasi paketdan
java.nio.file), keyin ma'lumotlarni yozish va undan ma'lumotlarni o'qish mexanizmlarini ko'rib chiqing
fayllar. Biz ketma-ket kirish matnli fayllarni qanday yaratish va manipulyatsiya qilishni ko'rsatamiz. Bilan ishlash
matnli fayllar fayllarni boshqarishni tez va oson boshlash imkonini beradi. Biroq, siz o'rganganingizdek,
matnli fayllardan ma'lumotlarni qaytadan ob'ekt shakliga o'qish qiyin. Yaxshiyamki, ko'pchilik qarshi
yo'naltirilgan tillar (shu jumladan Java) ob'ektlarni yozish va undan o'qish usullarini taqdim etadi
fayllar (ob'ektni ketma-ketlashtirish va seriyadan chiqarish deb nomlanadi). Buni ko'rsatish uchun biz qayta yaratamiz
matnli fayllardan foydalanadigan ba'zi ketma-ket kirish dasturlarimiz, bu safar ob'ektlarni saqlash orqali
va ikkilik fayllardan ob'ektlarni olish.
15.2 Fayllar va oqimlar
Java har bir faylni baytlarning ketma-ket oqimi sifatida ko'rib chiqadi (15.1-rasm).1 Har bir operatsion tizim
faylning oxirini aniqlash mexanizmini taqdim etadi, masalan, fayl oxiri belgisi yoki a
tizim tomonidan boshqariladigan ma'muriyatda qayd etilgan fayldagi jami baytlar soni
ma'lumotlar tuzilishi. Baytlar oqimini qayta ishlovchi Java dasturi shunchaki ko'rsatma oladi
operatsion tizimdan oqimning oxiriga yetganda - dastur buni qilmaydi
asosiy platforma fayllar yoki oqimlarni qanday ifodalashini bilish kerak. Ba'zi hollarda,

15.1 Kirish


15.2 Fayllar va oqimlar
15.3 NIO sinflari va interfeyslaridan foydalanish
Fayl va katalog ma'lumotlarini oling
15.4 Matnli fayllarga ketma-ket kirish
15.4.1 Ketma-ket kirish matn faylini yaratish
15.4.2 Ketma-ket ma'lumotlarni o'qish
Matn fayliga kirish
15.4.3 Case Study: Kredit so'rovi dasturi
15.4.4 Ketma-ket kirish fayllarini yangilash
15.5 Ob'ektni ketma-ketlashtirish

15.5.1 Ketma-ket kirish faylini yaratish


Ob'ektni ketma-ketlashtirishdan foydalanish
15.5.2 Ma'lumotlarni o'qish va seriyadan chiqarish a
Ketma-ket kirish fayli
15.6 JFileChooser yordamida fayllarni ochish
15.7 (ixtiyoriy) Qo'shimcha java.io
Sinflar
15.7.1 Baytga asoslangan interfeyslar va sinflar
Kirish va chiqish
15.7.2 Belgilar uchun interfeyslar va sinflar
Kirish va chiqishga asoslangan
15.8 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish

1. Java-ning NIO API-lari, shuningdek, kanalga asoslangan me'morchilikni amalga oshiradigan sinflar va interfeyslarni o'z ichiga oladi.
yuqori samarali kiritish/chiqarish uchun tur. Bu mavzular ushbu kitob doirasidan tashqarida.

646 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

fayl oxiri ko'rsatkichi istisno sifatida yuzaga keladi. Boshqalarida ko'rsatkich qaytish qiymati hisoblanadi
oqimni qayta ishlash ob'ektida chaqirilgan usuldan.

Baytga asoslangan va belgilarga asoslangan oqimlar


Fayl oqimlari ma'lumotlarni bayt yoki belgilar sifatida kiritish va chiqarish uchun ishlatilishi mumkin.
• Baytga asoslangan oqimlar ikkilik formatda ma'lumotlarni chiqaradi va kiritadi - belgi ikkitadir
bayt, int to'rt bayt, double sakkiz bayt va hokazo.
• Belgilar ketma-ketligi sifatida belgilarga asoslangan oqimlar chiqaradi va ma'lumotlarni kiritadi
har bir belgi ikki baytdan iborat - berilgan qiymat uchun baytlar soni
ushbu qiymatdagi belgilar soniga bog'liq. Masalan, qiymat
2000000000 20 baytni talab qiladi (har bir belgi uchun ikki baytda 10 ta belgi), lekin
7 qiymati faqat ikki baytni talab qiladi (har bir belgi uchun ikki baytda 1 belgi).
Baytga asoslangan oqimlar yordamida yaratilgan fayllar ikkilik fayllar deb ataladi, biz yaratgan fayllar esa -
belgilarga asoslangan oqimlar matnli fayllar deb ataladi. Matn fayllari matn tahrirlash orqali o'qilishi mumkin
torlar, ikkilik fayllar esa faylning o'ziga xos mazmunini tushunadigan dasturlar tomonidan o'qiladi va
uning buyurtmasi. Ikkilik fayldagi raqamli qiymat hisob-kitoblarda ishlatilishi mumkin, char-
aktyor 5 shunchaki matn qatorida ishlatilishi mumkin bo'lgan belgidir, masalan "Sara Miller 15 yoshda"
yoshda".
Standart kirish, standart chiqish va standart xato oqimlari
Java dasturi ob'ekt yaratish va baytlar yoki belgilar oqimini bog'lash orqali faylni ochadi.
u bilan aktyorlar. Ob'ekt konstruktori faylni ochish uchun operatsion tizim bilan o'zaro ta'sir qiladi.
Java shuningdek, oqimlarni turli qurilmalar bilan bog'lashi mumkin. Java dasturi bajarila boshlaganda-
ing, u qurilmalar bilan bog'langan uchta oqim ob'ektini yaratadi - System.in, Sys-
tem.out va System.err. System.in (standart kirish oqimi) obyekti odatda faollashtiradi
klaviaturadan bayt kiritish dasturi. Object System.out (standart chiqish
oqim ob'ekti) odatda dasturga belgilar ma'lumotlarini ekranga chiqarish imkonini beradi. Ob'ekt
System.err (standart xato oqimi ob'ekti) odatda dasturga belgilarni chiqarishga imkon beradi.
ekranga aktyorga asoslangan xato xabarlari. Har bir oqim qayta yo'naltirilishi mumkin. System.in uchun,
bu imkoniyat dasturga boshqa manbadan baytlarni o'qish imkonini beradi. System.out uchun
va System.err, u chiqishni boshqa joyga, masalan, yoqilgan faylga yuborish imkonini beradi
disk. Sinf tizimi standartni qayta yo'naltirish uchun setIn, setOut va setErr usullarini taqdim etadi
mos ravishda kirish, chiqish va xato oqimlari.
java.io va java.nio paketlari
Java dasturlari paketdagi sinflar va interfeyslar bilan oqimga asoslangan ishlov berishni amalga oshiradi
java.io va java.nio subpaketlari - Java'ning birinchi kirish-chiqarish API-lari.
Java SE 6 da ishlab chiqilgan va shundan beri takomillashtirildi. Boshqa paketlar ham mavjud
java.io-ga asoslangan sinflar va interfeyslarni o'z ichiga olgan Java API-larida
va java.nio paketlari.

15.1-rasm | n baytdan iborat faylning Java ko'rinishi.

0 1 2 3 4 5 6 7 8 9 ...
...

n-1


fayl oxiri belgisi

15.3 Fayl va katalog ma'lumotlarini olish uchun NIO sinflari va interfeyslaridan foydalanish 647

Belgilarga asoslangan kirish va chiqish Scanner va For- sinflari bilan amalga oshirilishi mumkin.
15.4-bo'limda ko'rib turganingizdek. Maʼlumotlarni kiritish uchun Scanner sinfidan keng foydalandingiz
klaviaturadan. Skaner fayldan ma'lumotlarni ham o'qiy oladi. Class Formatter quyidagilarga imkon beradi:
Matted ma'lumotlar har qanday matnga asoslangan oqimga usulga o'xshash tarzda chiqariladi
System.out.printf. Ilova I printf bilan formatlangan chiqish tafsilotlarini taqdim etadi. Hammasi
bu funksiyalardan matnli fayllarni formatlash uchun ham foydalanish mumkin. 28-bobda biz oqim sinflaridan foydalanamiz
tarmoq ilovalarini amalga oshirish uchun.
Java SE 8 boshqa turdagi oqimlarni qo'shadi
17-bob, Java SE 8 Lambdas va Streams, ishlatiladigan oqimning yangi turini taqdim etadi
oqimlarini emas, balki elementlar to'plamini (masalan, massivlar va ArrayLists) qayta ishlash uchun
baytlarni biz ushbu bobdagi fayllarni qayta ishlash misollarida muhokama qilamiz.
15.3 Fayllarni olish uchun NIO sinflari va interfeyslaridan foydalanish va
Katalog ma'lumotlari
Interfeyslar Path va DirectoryStream va sinflar Paths and Files (barchasi ja-paketdan)
va.nio.file) diskdagi fayllar va kataloglar haqidagi ma'lumotlarni olish uchun foydalidir:
• Path interfeysi—Ushbu interfeysni amalga oshiradigan sinflar ob'ektlari lo-
fayl yoki katalogning kationi. Yo'l ob'ektlari fayllarni ochmaydi yoki biron bir faylni ta'minlamaydi.
o'chirish qobiliyatlari.
• Paths klassi — a ni ifodalovchi Path obyektini olish uchun foydalaniladigan statik usullarni taqdim etadi
fayl yoki katalog joylashuvi.
• Files klassi — umumiy fayl va kataloglarni boshqarish uchun statik usullarni taqdim etadi.
fayllarni nusxalash kabi ishlar; fayllar va kataloglarni yaratish va o'chirish; olish
fayllar va kataloglar haqida ma'lumot; fayllar tarkibini o'qish; ob-
fayllar va kataloglar mazmunini manipulyatsiya qilish imkonini beruvchi obyektlar; va boshqalar
• DirectoryStream interfeysi — bu interfeysni amalga oshiradigan sinflar ob'ektlari.
dasturni katalog mazmuni bo'ylab takrorlash imkoniyatiga ega.
Yo'l ob'ektlarini yaratish
Faylni ifodalovchi Stringni aylantirish uchun Paths sinfining get sinfining statik usulidan foydalanasiz
yoki katalogning joylashuvini Path obyektiga kiriting. Keyin Path interfeysi usullaridan foydalanishingiz mumkin
va ko'rsatilgan fayl yoki katalog haqidagi ma'lumotlarni aniqlash uchun Fayllar sinfi. Biz muhokama qilamiz
bir zumda bir nechta bunday usullar. Ularning usullarining to'liq ro'yxati uchun tashrif buyuring:

Mutlaq va nisbiy yo'llar


Fayl yoki katalog yo'li uning diskdagi joylashuvini belgilaydi. Yo'l bir qismini yoki barchasini o'z ichiga oladi
fayl yoki katalogga olib boradigan kataloglar. Mutlaq yo'l barcha kataloglarni o'z ichiga oladi, start-
Muayyan fayl yoki katalogga olib boradigan ildiz katalogi bilan. Har bir fayl yoki katalog
ma'lum bir diskda o'z yo'lida bir xil ildiz katalogiga ega. Nisbiy yo'l "nisbiy"
boshqa katalogga - masalan, ilova joylashgan katalogga nisbatan yo'l
ijro eta boshladi.

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html


http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html

648 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

URI'lardan yo'l ob'ektlarini olish
Files static get-ning haddan tashqari yuklangan versiyasi faylni topish uchun URI obyektidan foydalanadi yoki
katalog. Yagona resurs identifikatori (URI) uniformaning umumiyroq shaklidir
Veb-saytlarni aniqlash uchun foydalaniladigan Resurs Locators (URL). Masalan, URL http:/
/www.deitel.com/ bu Deitel & Associates veb-saytining URL manzilidir. Fayllarni aniqlash uchun URI
operatsion tizimlarda farqlanadi. Windows platformalarida URI

C: diskining ildiz katalogida saqlangan data.txt faylini aniqlaydi. UNIX/Linux da


platformalar, URI

foydalanuvchi talabasining uy katalogida saqlangan data.txt faylini aniqlaydi.


Misol: Fayl va katalog ma'lumotlarini olish
15.2-rasm foydalanuvchidan fayl yoki katalog nomini kiritishni taklif qiladi, keyin Paths sinflaridan foydalanadi,
Path, Files va DirectoryStream ushbu fayl yoki katalog haqidagi ma'lumotlarni chiqarish uchun
dastur foydalanuvchidan fayl yoki katalogni so'rash bilan boshlanadi (16-qator). 19-qatorni kiritadi
fayl nomi yoki katalog nomini o'zgartiradi va uni Paths statik get usuliga o'tkazadi
Yo'lga string. 21-qator Files-ni chaqiradi, Pathni qabul qiluvchi statik usul mavjud
va uning diskda mavjudligini (fayl yoki katalog sifatida) aniqlaydi. Agar ism bo'lsa
mavjud bo'lmasa, boshqaruv Yo'lni o'z ichiga olgan xabarni ko'rsatadigan 49-qatorga o'tadi
“Mavjud emas” belgisidan keyin qator ko‘rinishi. Aks holda, 24-45 qatorlar bajariladi:
• getFileName yo'l usuli (24-satr) fayl yoki katalogning String nomini oladi
hech qanday joylashuv ma'lumotisiz.
• Files statik usuli isDirectory (26-satr) Path oladi va bool-ni qaytaradi.
ean bu Path diskdagi katalogni ifodalaydimi yoki yo'qligini ko'rsatadi.
• Path usuli isAbsolute (28-satr) mantiqiy qiymatni qaytaradi va buning yo'qligini ko'rsatadi
Yo'l fayl yoki katalogga mutlaq yo'lni ifodalaydi.
• GetLastModifiedTime fayllarining statik usuli (30-qator) Path oladi va qaytaradi
Fayl oxirgi marta qachon bo'lganini ko'rsatadigan FileTime (java.nio.file.atribut paketi)
tahrirlangan. Dastur FileTime-ning standart String tasvirini chiqaradi.
• Fayllarning statik usuli o'lchami (31-qator) Path ni oladi va uzun tasvirni qaytaradi-
fayl yoki katalogdagi baytlar sonini aniqlash. Kataloglar uchun qiymat qaytarildi
platformaga xosdir.
• Path usuli toString (32-satrda bilvosita deyiladi) String ifodasini qaytaradi-
Yo'lda.
• AbsolutePath yo‘li usuli (33-qator) chaqirilgan yo‘lni o‘zgartiradi
mutlaq yo'l.
Agar yo'l katalogni ifodalasa (35-qator), 40-41 qatorlar Files statik yangi usulidan foydalanadi.
Path obyektlarini o'z ichiga olgan DirectoryStream
ni olish uchun DirectoryStream (40–41-qatorlar)
katalog mazmuni uchun. 43–44 qatorlar har bir yoʻlning String tasvirini koʻrsatadi
DirectoryStream
da. E'tibor bering, DirectoryStream - Array- kabi umumiy tur.
Ro'yxat (7.16-bo'lim).

file://C:/data.txt

fayl:/home/student/data.txt

15.3 Fayl va katalog ma'lumotlarini olish uchun NIO sinflari va interfeyslaridan foydalanish 649

Ushbu dasturning birinchi chiqishi ushbu papkani o'z ichiga olgan yo'lni ko'rsatadi
bobga oid misollar. Ikkinchi chiqish ushbu misolning manba kodi uchun yo'lni ko'rsatadi
fayl. Ikkala holatda ham biz mutlaq yo'lni belgilab oldik.

1 // 15.2-rasm: FileAndDirectoryInfo.java


2 // Fayl va katalog ma'lumotlarini olish uchun foydalaniladigan fayl sinfi.
3
4
5
6
7
8 import java.util.Scanner;
9
10 umumiy sinf FileAndDirectoryInfo
11 {
12 ta umumiy statik void main(String[] args) IOExceptionni tashlaydi
13 {
14 Skaner kiritish = yangi Skaner(System.in);
15
16 System.out.println("Fayl yoki katalog nomini kiriting:");
17
18
19
20
21 agar ( ) // agar yo'l mavjud bo'lsa, u haqida ma'lumotni chiqaring
22 {
23 // fayl (yoki katalog) ma'lumotlarini ko'rsatish
24 System.out.printf("%n%s mavjud%n", );
25 System.out.printf("%sa katalogi%n",
26 ? "Is" : "Yo'q");
27 System.out.printf("%s mutlaq yo'l%n",
28 ? "Is" : "Yo'q");
29 System.out.printf("Oxirgi tahrirlangan: %s%n",
30);
31 System.out.printf("Hajmi: %s%n", );
32 System.out.printf("Yo'l: %s%n", );
33 System.out.printf("Mutlaq yo'l: %s%n", );
34
35 agar ( ) // katalog ro'yxatini chiqarish
36 {
37 System.out.printf("%nDirectory tarkibi:%n");
38
39
40
41
42
43
44 System.out.println(p);
45 }
46 }
47 else // fayl yoki katalog emas, xato xabarini chiqaring
48 {

15.2-rasm | Fayl sinfi fayl va katalog ma'lumotlarini olish uchun ishlatiladi. (2-qismning 1-qismi.)

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

// foydalanuvchi kiritishi asosida Path obyektini yarating


Yo'l yo'li = Paths.get(input.nextLine());

Files.exists (yo'l)

path.getFileName()

Files.isDirectory(yo'l)

path.isAbsolute()

Files.getLastModifiedTime(yo'l)


Files.size(yoʻl)
yo'l
path.toAbsolutePath()

Files.isDirectory(yo'l)

// katalog tarkibini takrorlash uchun ob'ekt
DirectoryStream
directoryStream =
Files.newDirectoryStream(yo'l);

uchun (p. yoʻl: DirectoryStream)


650 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

Ajratuvchi belgilar
Ajratuvchi belgi yo'lda katalog va fayllarni ajratish uchun ishlatiladi. Windowsda
kompyuterda ajratuvchi belgi teskari chiziq (\) dir. Linux yoki Mac OS X tizimida bu
oldinga qiyshiq chiziq (/). Java yo'l nomidagi ikkala belgini bir xil tarzda qayta ishlaydi. Masalan,
agar biz yo'ldan foydalansak

Har bir ajratuvchi belgidan foydalansa, Java hali ham yo'lni to'g'ri qayta ishlaydi.

49 System.out.printf("%s mavjud emas%n", yo'l);
50 }
51 } // asosiyni tugatish
52 } // oxirgi sinf FileAndDirectoryInfo
Fayl yoki katalog nomini kiriting:
c:\misollar\ch15

ch15 mavjud


Katalog hisoblanadi
Mutlaq yo'l
Oxirgi tahrirlangan: 2013-11-08T19:50:00.838256Z
Hajmi: 4096
Yo'l: c:\misollar\ch15
Mutlaq yo'l: c:\misollar\ch15

Katalog tarkibi:


C:\misollar\ch15\fig15_02
C:\misollar\ch15\fig15_12_13
C:\misollar\ch15\SerializationApps
C:\misollar\ch15\TextFileApps

Fayl yoki katalog nomini kiriting:


C:\examples\ch15\fig15_02\FileAndDirectoryInfo.java

FileAndDirectoryInfo.java mavjud


Katalog emas
Mutlaq yo'l
Oxirgi tahrirlangan: 2013-11-08T19:59:01.848255Z
Hajmi: 2952
Yo'l: C:\examples\ch15\fig15_02\FileAndDirectoryInfo.java
Mutlaq yo'l: C:\examples\ch15\fig15_02\FileAndDirectoryInfo.java

Xatolarning oldini olish bo'yicha maslahat 15.1


Yo'l mavjudligini tasdiqlaganingizdan so'ng, unda ko'rsatilgan usullar hali ham mumkin
15.2-rasm IOExceptions-ni tashlaydi. Masalan, bilan ifodalangan fayl yoki katalog
Fayllarga qo'ng'iroq qilish usuli mavjud bo'lgandan keyin va undan oldin yo'l tizimdan o'chirilishi mumkin
24–45-qatorlardagi boshqa bayonotlar bajariladi. Sanoat quvvati fayl va kataloglarni qayta ishlash
dasturlar bunday imkoniyatlardan xalos bo'lish uchun keng qamrovli istisnolardan foydalanishni talab qiladi.

c:\Program Files\Java\jdk1.6.0_11\demo/jfc

15.2-rasm | Fayl sinfi fayl va katalog ma'lumotlarini olish uchun ishlatiladi. (2-qismning 2-qismi.)

15.4 Ketma-ket kirish matnli fayllar 651



15.4 Matnli fayllarga ketma-ket kirish
Keyinchalik, biz ketma-ket kirish fayllarini yaratamiz va boshqaramiz, ularda yozuvlar tartibda saqlanadi
yozuv kaliti maydoni. Biz matnli fayllardan boshlaymiz, bu o'quvchiga tezda yaratish va tahrirlash imkonini beradi
odamlar o'qiy oladigan fayllar. Biz ma'lumotlarni yaratish, yozish, ma'lumotlarni o'qish va yangilashni muhokama qilamiz
ketma-ket kirish matnli fayllar. Shuningdek, biz ma'lumotlarni oladigan kredit so'rov dasturini ham o'z ichiga olamiz
fayl. 15.4.1–15.4.3 bo'limlaridagi dasturlarning barchasi bobning TextFileApps yo'nalishida joylashgan.
tory o'sha katalogda saqlanadigan bir xil matn faylini boshqarishi mumkin.
15.4.1 Ketma-ket kirish matn faylini yaratish
Java faylga hech qanday tuzilma yuklamaydi - yozuvlar kabi tushunchalar Java tilining bir qismi sifatida mavjud emas.
til. Shuning uchun siz ilovalaringiz talablariga javob beradigan fayllarni tuzishingiz kerak.
Quyidagi misolda biz faylga kalitli yozuv strukturasini qanday o'rnatishni ko'rib chiqamiz.
Ushbu bo'limdagi dastur ishlatilishi mumkin bo'lgan oddiy ketma-ket kirish faylini yaratadi
debitorlik tizimida kompaniya tomonidan uning qarzdorligini hisobga olish
kredit mijozlari. Har bir mijoz uchun dastur foydalanuvchidan hisob raqamini oladi va
mijozning nomi va balansi (ya'ni, mijozning kompaniyaga tovarlar uchun qarzi miqdori va
olingan xizmatlar). Har bir mijozning ma'lumotlari ushbu mijoz uchun "rekord" ni tashkil qiladi. Ushbu ilova
qayd kaliti sifatida hisob raqamidan foydalanadi - fayl yozuvlari yaratiladi va asosiy
hisob raqami tartibida saqlanadi. Dastur foydalanuvchi yozuvlarni kiritishini taxmin qiladi
hisob raqamiga buyurtma. Debitorlik qarzlarining kompleks tizimida (ketma-ketlik asosida)
tial-access fayllar), foydalanuvchi kirishi uchun saralash imkoniyati taqdim etiladi
har qanday tartibda yozuvlar. Keyin yozuvlar saralanadi va faylga yoziladi.
CreateTextFile sinfi
Class CreateTextFile (15.3-rasm) formatlangan satrlarni chiqarish uchun Formatterdan foydalanadi.
System.out.printf usuli bilan bir xil formatlash imkoniyatlari. Formater ob'ekti mumkin
turli joylarga, masalan, buyruqlar oynasiga yoki faylga, biz buni qilamiz
misol. Formatter ob'ekti openFile usulida 26-qatorda yaratilgan (22-qatorlar).
38). 26-qatorda foydalanilgan konstruktor bitta argumentni oladi - ismni o'z ichiga olgan String
fayl, shu jumladan uning yo'li. Agar yo'l ko'rsatilmagan bo'lsa, bu erda bo'lgani kabi, JVM qabul qiladi
fayl dastur bajarilgan katalogda ekanligi. Matnli fayllar uchun biz foydalanamiz
.txt fayl kengaytmasi. Agar fayl mavjud bo'lmasa, u yaratiladi. Agar mavjud fayl bo'lsa
ochilganda, uning mazmuni qisqartiriladi - fayldagi barcha ma'lumotlar o'chiriladi. Agar istisno bo'lmasa,
curs, fayl yozish uchun ochiq va natijada Formatter ob'ekti yozish uchun ishlatilishi mumkin
faylga ma'lumotlar.

Yaxshi dasturlash amaliyoti 15.1


Yo'l ma'lumotlarini ifodalovchi satrlarni yaratishda olish uchun File.separator dan foydalaning
/ yoki \ dan aniq foydalanish o'rniga mahalliy kompyuterning tegishli ajratuvchi belgisi. Bu
doimiy - bu bitta belgidan tashkil topgan String - tizim uchun mos ajratuvchi.

Umumiy dasturlash xatosi 15.1


String literalida \\ emas, balki katalog ajratuvchi sifatida \ dan foydalanish mantiqiy xatodir. Bitta
\ keyingi belgidan keyin \ qochish ketma-ketligini bildirishini bildiradi. Foydalanish \\
satr literaliga \ qo'shish uchun.

652 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

1 // 15.3-rasm: CreateTextFile.java
2 // Formatter sinfi bilan ketma-ket matnli faylga ma'lumotlarni yozish.
3
4
5
6
7
8 import java.util.Scanner;
9
10 umumiy sinf CreateTextFile
11 {
12
13
14 ta umumiy statik bekor asosiy (String [] args)
15 {
16 openFile();
17 addRecords();
18 closeFile();
19 }
20
21 // clients.txt faylini oching
22 umumiy statik bekor openFile()
23 {
24 urinib ko'ring
25 {
26
27 }
28 catch (SecurityException securityException)
29 {
30 System.err.println("Yozish ruxsati rad etildi. Tugatilmoqda.");
31 System.exit(1); // dasturni tugatish
32 }
33 ushlash (FileNotFoundException fileNotFoundException)
34 {
35 System.err.println("Faylni ochishda xatolik. Tugatish.");
36 System.exit(1); // dasturni tugatish
37 }
38 }
39
40 // faylga yozuvlar qo'shish
41 umumiy statik bekor addRecords()
42 {
43 Skaner kiritish = yangi Skaner(System.in);
44 System.out.printf("%s%n%s%n? ",
45 "Hisob raqami, ismi, familiyasi va balansini kiriting.",
46 "Kirishni tugatish uchun fayl oxiri indikatorini kiriting.");
47
48 while (input.hasNext()) // fayl oxirigacha koʻrsatkich
49 {
50 urinib ko'ring
51 {

15.3-rasm | Formatter sinfi bilan ketma-ket matn fayliga ma'lumotlarni yozish. (2-qismning 1-qismi.)

import java.io.FileNotFoundException;
import java.lang.SecurityException;
import java.util.Formatter;
import java.util.FormatterClosedException;
import java.util.NoSuchElementException;

xususiy statik Formatter chiqishi; // faylga matn chiqaradi

chiqish = new Formatter("clients.txt"); // faylni oching

15.4 Ketma-ket kirish matnli fayllar 653

28–32-qatorlar SecurityException-ni boshqaradi, bu foydalanuvchida mavjud bo'lmasa sodir bo'ladi
faylga ma'lumotlarni yozish uchun ruxsat. 33-37 qatorlar FileNotFoundException bilan ishlaydi,
bu fayl mavjud bo'lmasa va yangi fayl yaratilmasa paydo bo'ladi. Bu istisno bo'lishi mumkin
faylni ochishda xatolik yuz berganda ham paydo bo'ladi. Ikkala istisno ishlovchilarida biz statik deb ataymiz
usul System.exit va qiymatni o'tkazing 1. Bu usul dasturni tugatadi. An
Usuldan chiqish uchun 0 argumenti dastur muvaffaqiyatli tugatilganligini bildiradi. Nolga teng bo'lmagan qiymat,
bu misoldagi 1 kabi odatda xatolik yuz berganligini bildiradi. Bu qiymat
dasturni bajaruvchi buyruqlar oynasiga o'tadi. Agar argument foydali bo'lsa
dastur Windows tizimlarida ommaviy ish faylidan yoki UNIX/da qobiq skriptidan bajariladi.
Linux/Mac OS X tizimlari. Ommaviy fayllar va qobiq skriptlari bajarishning qulay usulini taklif qiladi
ketma-ket bir nechta dasturlar. Birinchi dastur tugagach, keyingi dastur exe-ni boshlaydi.
kesish. Ommaviy ish faylida yoki qobiq skriptida chiqish usuli uchun argumentdan foydalanish mumkin
boshqa dasturlar bajarilishi kerakligini aniqlash. Ommaviy fayllar haqida qo'shimcha ma'lumot olish uchun yoki
qobiq skriptlari uchun operatsion tizimingiz hujjatlariga qarang.

52 // faylga yangi yozuvni chiqarish; to'g'ri kiritishni nazarda tutadi


53
54
55 }
56 ta tutish (FormatterClosedException formatterClosedException)
57 {
58 System.err.println("Faylga yozishda xatolik. Tugatish.");
59 tanaffus;
60 }
61 catch (NoSuchElementException elementException)
62 {
63 System.err.println("Noto'g'ri kiritilgan. Iltimos, qayta urinib ko'ring.");
64 input.nextLine(); // foydalanuvchi qayta urinib ko'rishi uchun kiritilgan ma'lumotlarni bekor qiling
65 }
66
67 System.out.print("? ");
68 } // tugash vaqti
69 } // end usuli addRecords
70
71 // faylni yoping
72 umumiy statik bekor closeFile()
73 {
74 agar (chiqish != null)
75
76 }
77 } // oxirgi sinf CreateTextFile
Hisob raqami, ismi, familiyasi va balansini kiriting.
Kirishni tugatish uchun fayl oxiri indikatorini kiriting.
? 100 Bob Blue 24.98
? 200 Stiv Green -345,67
? 300 Pam White 0,00
? 400 Sam Red -42.16
? 500 Sue Sariq 224.62
? ^Z
15.3-rasm | Formatter sinfi bilan ketma-ket matn fayliga ma'lumotlarni yozish. (2-qismning 2-qismi.)

output.format("%d %s %s %.2f%n", input.nextInt(),


input.next(), input.next(), input.nextDouble());

output.close();


654 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

AddRecords usuli (41–69-qatorlar) foydalanuvchidan har biri uchun turli maydonlarni kiritishni taklif qiladi.
ma'lumotlarni kiritish tugallangandan so'ng yozuv yoki fayl oxiri tugmalari ketma-ketligi. 15.4-rasmda kalit ko'rsatilgan
turli kompyuter tizimlari uchun fayl oxirini kiritish uchun kombinatsiyalar.

44-46 qatorlar foydalanuvchini kiritishni taklif qiladi. 48-qator hasNext to Skaner usulidan foydalanadi


fayl oxiridagi tugmalar birikmasi kiritilganligini aniqlash. Loop bajariladi
hasNext fayl oxiriga duch kelguncha.
53–54 qatorlar foydalanuvchi maʼlumotlarini oʻqish uchun Skanerdan foydalanadi, soʻngra maʼlumotlarni yozuv sifatida chiqaradi
Formater yordamida. Har bir Skaner kiritish usuli NoSuchElementException ni chiqaradi
(61–65-qatorlarda ishlanadi) agar maʼlumotlar notoʻgʻri formatda boʻlsa (masalan, int boʻlganda string
kutilgan) yoki kiritish uchun boshqa maʼlumot boʻlmasa. Yozuv ma'lumotlari yordamida chiqariladi
System.out.printf bilan bir xil formatlashni amalga oshirishi mumkin bo'lgan usul formati
oldingi boblarda keng qo'llanilgan usul. Usul formati formatlangan Stringni chiqaradi
Formatter ob'ektining chiqish manziliga - clients.txt fayliga. Format
"%d %s %s %.2f%n" qatori joriy yozuv butun son sifatida saqlanishini bildiradi.
(hisob raqami), undan keyin String (ism), boshqa String (oxirgi
nomi) va suzuvchi nuqta qiymati (balans). Har bir ma'lumot alohida ajratilgan
keyingisidan bo'sh joy qo'yiladi va er-xotin qiymat (balans) ikkita raqam bilan chiqariladi
kasrning o'ng tomoni (%.2f da .2 bilan ko'rsatilgandek). Matn faylidagi ma'lumotlar mumkin
matn muharriri yordamida ko'rish yoki faylni o'qish uchun mo'ljallangan dastur tomonidan keyinroq olish mumkin
(15.4.2-bo'lim).
66-68 qatorlar bajarilganda, Formatter ob'ekti yopiq bo'lsa, FormatterClosedEx-
qabul qilinadi. Ushbu istisno 76-80 qatorlarda ko'rib chiqiladi. [Izoh: Siz ham qila olasiz
format va
formatlangan ma'lumotlarni chiqarish uchun printf usullari.]
93-97 qatorlar formatlovchini va pastki qismini yopadigan closeFile usulini e'lon qiladi.
yolg'on chiqish fayli. 96-qator ob'ektni shunchaki yopish usulini chaqirish orqali yopadi. Agar usul
close aniq chaqirilmaydi, operatsion tizim odatda pro-faylni yopadi.
gramm ijrosi tugaydi - bu operatsion tizimning "uy xo'jaligi" ga misoldir.
Biroq, kerak bo'lmaganda, faylni har doim aniq yopishingiz kerak.

Chiqish namunasi


Ushbu dastur uchun namuna ma'lumotlari 15.5-rasmda ko'rsatilgan. Namuna chiqishida foydalanuvchi
beshta hisob uchun ma'lumotlarni kiritadi, so'ngra ma'lumotlar kiritilganligini bildirish uchun fayl oxirini kiritadi
to'liq. Namuna chiqishi ma'lumotlar yozuvlari aslida qanday paydo bo'lishini ko'rsatmaydi
fayl. Keyingi bo'limda fayl muvaffaqiyatli yaratilganligini tekshirish uchun biz pro-
gram faylni o'qiydi va uning mazmunini chop etadi. Bu matn fayli bo'lgani uchun siz ham tekshirishingiz mumkin
faqat matn muharririda faylni ochish orqali ma'lumot.

Operatsion tizim tugmalar birikmasi

UNIX/Linux/Mac OS X d
Windows z

15.4-rasm | Fayl tugaydigan tugmalar birikmalari.


15.4 Ketma-ket kirish matnli fayllar 655

15.4.2 Ketma-ket kirish matn faylidan ma'lumotlarni o'qish
Ma'lumotlar kerak bo'lganda qayta ishlash uchun olinishi uchun fayllarda saqlanadi.
15.4.1-bo'lim ketma-ket kirish uchun faylni qanday yaratishni ko'rsatdi. Ushbu bo'lim ko'rsatilgan
matn faylidan ma'lumotlarni ketma-ket o'qish. Biz Scanner qanday sinf bo'lishi mumkinligini ko'rsatamiz
klaviaturadan emas, balki fayldan ma'lumotlarni kiritish uchun ishlatiladi. Ilova (15.6-rasm) o'qiydi
15.4.1-bo'lim ilovasi tomonidan yaratilgan "clients.txt" faylidagi yozuvlar va dis-
yozuv mazmunini o'ynaydi. 13-qator kirishni olish uchun ishlatiladigan Skanerni e'lon qiladi
fayldan.

Ma'lumotlar namunasi

100 Bob Blue 24.98
200 Stiv Green -345,67
300 Pam White 0,00
400 Sam Red -42.16
500 Sue Sariq 224.62

15.5-rasm | 15.3-rasmdagi dastur uchun namuna ma'lumotlari.

1 // 15.6-rasm: ReadTextFile.java
2 // Ushbu dastur matnli faylni o'qiydi va har bir yozuvni ko'rsatadi.
3 import java.io.IOException;
4 import java.lang.IllegalStateException;
5 import java.nio.file.Files;
6 import java.nio.file.Path;
7 import java.nio.file.Paths;
8 import java.util.NoSuchElementException;
9 import java.util.Scanner;
10
11 ommaviy sinf ReadTextFile
12 {
13
14
15 ta umumiy statik bekor asosiy (String [] args)
16 {
17 openFile();
18 o'qilgan yozuvlar ();
19 closeFile();
20 }
21
22 // clients.txt faylini oching
23 umumiy statik bekor openFile()
24 {
25 urinib ko'ring
26 {
27
28 }

15.6-rasm | Skaner yordamida faylni ketma-ket o'qish. (2-qismning 1-qismi.)

shaxsiy statik Skaner kiritish;

kiritish = yangi Skaner(Paths.get("clients.txt"));


656 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

OpenFile usuli (23–34-qatorlar) Skanerni ishga tushirish orqali faylni oʻqish uchun ochadi.
27-satrdagi ob'ekt. Konstruktorga Path ob'ektini o'tkazamiz, bu esa the
Skaner ob'ekti qaysi katalogda joylashgan "clients.txt" faylidan o'qiydi
ilova amalga oshiriladi. Agar fayl topilmasa, IOException paydo bo'ladi. bundan mustasno -
29-33 qatorlarda ko'rib chiqiladi.

29 ta tutish (IOException ioException)


30 {
31 System.err.println("Faylni ochishda xato. Tugatish.");
32 System.exit(1);
33 }
34 }
35
36 // fayldan yozuvni o'qish
37 ta umumiy statik bekor o'qilgan yozuvlar()
38 {
39 System.out.printf("%-10s%-12s%-12s%10s%n", "Hisob",
40 "Ism", "Familiya", "Balans");
41
42 urinib ko'ring
43 {
44 while ( ) // o'qish uchun ko'proq vaqt bor
45 {
46 // yozuv mazmunini ko'rsatish
47
48
49 }
50 }
51 catch (NoSuchElementException elementException)
52 {
53 System.err.println("Fayl noto'g'ri tuzilgan. Tugatilmoqda.");
54 }
55 catch (IllegalStateException stateException)
56 {
57 System.err.println("Fayldan o'qishda xatolik. Tugatish.");
58 }
59 } // tugatish usuli readRecords
60
61 // faylni yoping va dasturni tugating
62 umumiy statik bekor closeFile()
63 {
64 agar (kirish != null)
65
66 }
67 } // oxirgi sinf ReadTextFile
Hisob familiyasi balansi
100 Bob Blue 24.98
200 Stiv Green -345,67
300 Pam White 0,00
400 Sam Red -42.16
500 Sue Sariq 224.62
15.6-rasm | Skaner yordamida faylni ketma-ket o'qish. (2-qismning 2-qismi.)

input.hasNext()

System.out.printf("%-10d%-12s%-12s%10.2f%n", input.nextInt(),
input.next(), input.next(), input.nextDouble());

input.close();


15.4 Ketma-ket kirish matnli fayllar 657

ReadRecords usuli (37–59-qatorlar) fayldagi yozuvlarni oʻqiydi va koʻrsatadi. Chiziqlar
Ilovaning chiqishidagi ustunlar uchun 39–40 sarlavhalar. 44-49 qatorlarni o'qing va
faylning oxiri belgisiga yetguncha fayldan ma'lumotlarni ko'rsatish (bu holda usul
hasNext 44-satrda false qiymatini qaytaradi). 47–48 qatorlar keyingiInt, keyingisi Skaner usullaridan foydalanadi
va int kiritish uchun nextDouble (hisob raqami), ikkita satr (birinchi va oxirgi
nomlar) va qo'sh qiymat (balans). Har bir yozuv fayldagi ma'lumotlarning bir qatoridir. Agar
fayldagi ma'lumotlar to'g'ri shakllantirilmagan (masalan, familiya bo'lishi kerak bo'lgan joyda
balans bo'lishi), yozuv kiritilganda NoSuchElementException paydo bo'ladi. Bu istisno
51-54 qatorlarda ko'rib chiqiladi. Agar ma'lumotlar kiritilishidan oldin skaner yopilgan bo'lsa,
galStateException yuzaga keladi (55-58-qatorlarda ishlanadi). 47-qatordagi format qatoriga e'tibor bering
hisob raqami, ismi va familiyasi asosli qoldirilishi, qoldiq esa
o'ngga asoslangan va ikkita aniqlik raqami bilan chiqaring. Loop kirishlarining har bir iteratsiyasi
matn faylidan bitta yozuvni ifodalovchi bir qator matn. 62-66 qatorlar usulni belgilaydi
closeFile, bu Skanerni yopadi.

15.4.3 Case Study: Kredit so'rovi dasturi


Fayldan ma'lumotlarni ketma-ket olish uchun dasturlar fayl boshidan boshlanadi va
kerakli ma'lumot topilmaguncha barcha ma'lumotlarni ketma-ket o'qing. Bu kerak bo'lishi mumkin
faylni bir necha marta ketma-ket qayta ishlash (fayl boshidan boshlab).
dasturning bajarilishi. Class Scanner boshiga o'zgartirishga ruxsat bermaydi
fayl. Agar faylni qayta o'qish kerak bo'lsa, dastur faylni yopishi va uni qayta ochishi kerak.
Shakldagi dastur. 15.7–15.8 kredit menejeriga mijozlar ro'yxatini olish imkonini beradi
balansi nol bo'lgan (ya'ni, qarzi bo'lmagan mijozlar), kredit ballari bo'lgan mijozlar
abonentlar (ya'ni, kompaniya qarzdor bo'lgan mijozlar) va debet baliga ega bo'lgan mijozlar.
ma'lumotlar (ya'ni, olingan tovarlar va xizmatlar uchun kompaniyaga qarzdor bo'lgan mijozlar). A
kredit qoldig'i - salbiy miqdor, debet balansi - ijobiy miqdor.

MenuOption enum


Biz turli xil menyu variantlarini aniqlash uchun enum turini yaratishdan boshlaymiz (15.7-rasm).
kredit menejeriga ega bo'ladi - agar siz uchun maxsus qiymatlarni taqdim etishingiz kerak bo'lsa, bu talab qilinadi
enum konstantalari. Variantlar va ularning qiymatlari 7–10 qatorlarda keltirilgan.

1 // 15.7-rasm: MenuOption.java


2 // kredit so'rovi dasturi variantlari uchun raqam turi.
3
4 umumiy enum MenuOption
5 {
6 // enum tipidagi tarkibni e'lon qilish
7 ZERO_BALANCE(1),
8 CREDIT_BALANCE(2),
9 DEBIT_BALANCE(3),
10 END(4);
11
12 xususiy yakuniy int qiymati; // joriy menyu opsiyasi
13

15.7-rasm | kredit so'rovi dasturining menyu variantlari uchun enum turi. (2-qismning 1-qismi.)


658 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

CreditInquiry klassi
15.8-rasmda kredit so'rovi dasturi uchun funksionallik mavjud. Dastur dis-
matn menyusini o'ynaydi va kredit menejeriga olish uchun uchta variantdan birini kiritish imkonini beradi
kredit ma'lumotlari:
• 1-variant (ZERO_BALANCE) balansi nol bo'lgan hisoblarni ko'rsatadi.
• 2-variant (CREDIT_BALANCE) kredit qoldig'i bilan hisoblarni ko'rsatadi.
• 3-variant (DEBIT_BALANCE) debet qoldig'i bilan hisoblarni ko'rsatadi.
• 4-variant (END) dasturning bajarilishini tugatadi.

14 // konstruktor


15 shaxsiy menyu opsiyasi (int qiymati)
16 {
17 this.value = qiymat;
18 }
19 } // end enum MenuOption

1 // 15.8-rasm: CreditInquiry.java


2 // Ushbu dastur faylni ketma-ket o'qiydi va ko'rsatadi
3 // foydalanuvchi so'ragan hisob turiga asoslangan tarkib
4 // (kredit balansi, debet balansi yoki nol balans).
5 import java.io.IOException;
6 import java.lang.IllegalStateException;
7 import java.nio.file.Paths;
8 import java.util.NoSuchElementException;
9 import java.util.Scanner;
10
11 ommaviy sinf CreditInquiry
12 {
13 ta xususiy yakuniy statik MenuOption[] tanlovi = ;
14
15 ta umumiy statik bekor asosiy (String [] args)
16 {
17 // foydalanuvchi so'rovini olish (masalan, nol, kredit yoki debet balansi)
18 MenuOption accountType = getRequest();
19
20 vaqt (accountType != MenuOption.END)
21 {
22 kaliti (hisob turi)
23 {
24 ta holat ZERO_BALANCE:
25 System.out.printf("Nol balansga ega %nHisoblar:%n");
26 tanaffus;
27 ta holat CREDIT_BALANCE:
28 System.out.printf("%nKredit qoldig'i bo'lgan hisoblar:%n");
29 tanaffus;

15.8-rasm | Kredit so'rov dasturi. (4-qismning 1-qismi.)

15.7-rasm | kredit so'rovi dasturining menyu variantlari uchun enum turi. (2-qismning 2-qismi.)

MenuOption.values()


15.4 Ketma-ket kirish matnli fayllar 659

30 ta holat DEBIT_BALANCE:
31 System.out.printf("%nDebet qoldig'i bilan hisoblar:%n");
32 tanaffus;
33 }
34
35 ta o'qilgan yozuvlar (hisob turi);
36 accountType = getRequest(); // foydalanuvchi so'rovini olish
37 }
38 }
39
40 // foydalanuvchidan so'rovni olish
41 shaxsiy statik MenuOption getRequest()
42 {
43 int so'rovi = 4;
44
45 // so'rov parametrlarini ko'rsatish
46 System.out.printf("%nEnter so'rovi%n%s%n%s%n%s%n%s%n",
47 "1 - Nol qoldiqli hisoblarni ro'yxatlash",
48 " 2 - Kredit qoldiqlari bo'lgan hisoblarni ro'yxatlash",
49 " 3 - debet qoldiqlari bilan hisob-kitoblarni ro'yxatlash",
50 " 4 - Dasturni tugatish");
51
52 urinib ko'ring
53 {
54 Skaner kiritish = yangi Skaner(System.in);
55
56 do // foydalanuvchi so'rovini kiriting
57 {
58 System.out.printf("%n? ");
59 so'rov = input.nextInt();
60 } while ((so'rov < 1) || (so'rov > 4));
61 }
62 catch (NoSuchElementException noSuchElementException)
63 {
64 System.err.println("Noto'g'ri kiritish. Tugatish.");
65 }
66
67 ta qaytish tanlovi[so'rov - 1]; // variant uchun raqam qiymatini qaytaring
68 }
69
70 // fayldan yozuvlarni o'qing va faqat tegishli turdagi yozuvlarni ko'rsating
71 ta shaxsiy statik bekor qilingan oʻqish yozuvlari (MenuOption accountType)
72 {
73 // faylni oching va tarkibini qayta ishlang
74
75 {
76 while (input.hasNext()) // o'qish uchun ko'proq ma'lumot
77 {
78 int accountNumber = input.nextInt();
79 String firstName = input.next();
80 String familiyasi = input.next();
81 juft balans = input.nextDouble();
82

15.8-rasm | Kredit so'rov dasturi. (4 qismning 2-qismi.)

harakat qilib ko'ring (Skaner kiritish = yangi Skaner(Paths.get("clients.txt")))

660 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

83 // hisob turi to'g'ri bo'lsa, yozuvni ko'rsating
84 agar (ko'rsatish kerak (hisob turi, balans))
85 System.out.printf("%-10d%-12s%-12s%10.2f%n", hisob raqami,
86 ismi, familiyasi, balansi);
yana 87
88 input.nextLine(); // joriy yozuvning qolgan qismini olib tashlang
89 }
90 }
91 catch (NoSuchElementException |
92 IllegalStateException | IOException e)
93 {
94 System.err.println("Faylni qayta ishlashda xatolik. Tugatish.");
95 System.exit(1);
96 }
97 } // tugatish usuli readRecords
98
99 // yozuvni ko'rsatish kerakligini aniqlash uchun yozuv turidan foydalaning
100 ta xususiy statik mantiqiy shouldDisplay(
101 MenyuVariant hisobi turi, ikki baravar balans)
102 {
103 agar ((hisob turi == MenuOption.CREDIT_BALANCE) && (balans < 0))
104 rostni qaytaradi;
105 boshqa agar ((hisob turi == MenuOption.DEBIT_BALANCE) && (balans > 0))
106 haqiqatni qaytaradi;
107 boshqa agar ((hisob turi == MenuOption.ZERO_BALANCE) && (balans == 0))
108 rostni qaytaradi;
109
110 false qaytaradi;
111 }
112 } // oxirgi sinf CreditInquiry

So'rovni kiriting


1 - balansi nol bo'lgan hisoblarni ko'rsating
2 - kredit qoldig'i bilan hisob-kitoblarni ro'yxatlash
3 - debet qoldiqlari bilan hisoblarni ro'yxatlash
4 - Dasturni tugatish

? 1


Nol qoldiqli hisobvaraqlar:
300 Pam White 0,00

So'rovni kiriting


1 - balansi nol bo'lgan hisoblarni ko'rsating
2 - kredit qoldig'i bilan hisob-kitoblarni ro'yxatlash
3 - debet qoldiqlari bilan hisoblarni ro'yxatlash
4 - Dasturni tugatish

? 2


Kredit qoldig'i bilan hisob-kitoblar:
200 Stiv Green -345,67
400 Sam Red -42.16

15.8-rasm | Kredit so'rov dasturi. (4 qismning 3-qismi.)


15.4 Ketma-ket kirish matnli fayllar 661

Yozuv ma'lumotlari faylni o'qish va yo'qligini aniqlash orqali yig'iladi
har bir yozuv tanlangan hisob turi uchun mezonlarga javob beradi. Asosiy qo'ng'iroqlar usulida 18-qator
getRequest (41–68-qatorlar) menyu parametrlarini ko'rsatish uchun terilgan raqamni tarjima qiladi.
foydalanuvchi MenuOption-ga kiritadi va natijani MenuOption o'zgaruvchisi accountType-da saqlaydi. Chiziqlar
Foydalanuvchi dasturni tugatish kerakligini aniqlamaguncha 20–37 tsikli. 22–33 qatorlar ko'rsatiladi
ekranga chiqarish uchun joriy yozuvlar to'plami uchun sarlavha. 35-qator qo'ng'iroq qilish usuli
readRecords (71–97-qatorlar), ular faylni aylantiradi va har bir yozuvni o'qiydi.
ReadRecords usuli manbalarni sinab ko'rish bayonotidan foydalanadi (kiritilgan
11.12-bo'lim) faylni o'qish uchun ochadigan Skanerni yaratish uchun (74-qator) - esda tuting
try-with-sources o'z resurs(lar)ini sinash bloki muvaffaqiyatli tugatilganda yoki yopadi
istisno tufayli. Fayl har birida yangi Skaner ob'ekti bilan o'qish uchun ochiladi
time readRecords chaqiriladi, shuning uchun biz faylning boshidan yana o'qiymiz. Chiziqlar
78–81 yozuvni o'qidi. Aniqlash uchun 84-qatorni chaqirish usuli shouldDisplay (100–111-qatorlar).
joriy yozuv so'ralgan hisob turiga mos keladimi. If shouldDisplay qaytariladi
rost, dastur hisob ma'lumotlarini ko'rsatadi. Fayl oxiri belgisi bo'lganda
erishilganda, tsikl tugaydi va manbalarni sinab ko'rish bayonoti Skanerni yopadi va
fayl. Barcha yozuvlar o'qilgandan so'ng, boshqaruv asosiyga qaytadi va getRequest bo'ladi
foydalanuvchining keyingi menyu variantini olish uchun yana (36-satr) chaqirildi.

15.4.4 Ketma-ket kirish fayllarini yangilash


Ko'pgina ketma-ket fayllardagi ma'lumotlarni boshqasini yo'q qilish xavfisiz o'zgartirib bo'lmaydi
fayldagi ma'lumotlar. Misol uchun, agar "White" nomini "Worthington" ga o'zgartirish kerak bo'lsa,
eski ismni shunchaki yozib bo'lmaydi, chunki yangi nom ko'proq joy talab qiladi.
Oq uchun rekord faylga sifatida yozilgan

So'rovni kiriting


1 - balansi nol bo'lgan hisoblarni ko'rsating
2 - kredit qoldig'i bilan hisob-kitoblarni ro'yxatlash
3 - debet qoldiqlari bilan hisoblarni ro'yxatlash
4 - Dasturni tugatish

? 3


Debet qoldig'i bo'lgan hisobvaraqlar:
100 Bob Blue 24.98
500 Sue Sariq 224.62

So'rovni kiriting


1 - balansi nol bo'lgan hisoblarni ko'rsating
2 - kredit qoldig'i bilan hisob-kitoblarni ro'yxatlash
3 - debet qoldiqlari bilan hisoblarni ro'yxatlash
4 - Dasturni tugatish

? 4


300 Pam White 0,00

15.8-rasm | Kredit so'rov dasturi. (4 qismning 4-qismi.)


662 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

Agar yozuv yangi nom yordamida faylning xuddi shu joyidan boshlab qayta yozilsa,
rekord bo'ladi

Yangi yozuv asl yozuvdan kattaroq (ko'proq belgilarga ega). "Uortington"


joriy yozuvdagi “0,00” va ikkinchisidan keyingi belgilarning ustiga yozadi
"Uortington" da "o" keyingi ketma-ket yozuvning boshini yozadi
fayl. Muammo shundaki, matn faylidagi maydonlar va shuning uchun yozuvlar hajmi jihatidan farq qilishi mumkin. Uchun
Masalan, 7, 14, –117, 2074 va 27383 bir xil bayt sonida saqlangan barcha ints (4)
ichki, lekin ular faylga matn sifatida yozilganda turli o'lchamdagi maydonlardir. Shuning uchun, qayta-
ketma-ket kirish faylidagi kordonlar odatda joyida yangilanmaydi - buning o'rniga butun fayl
qayta yozilgan. Oldingi nomni o'zgartirish uchun 300 Pam White 0,00 dan oldingi yozuvlar
yangi faylga, yangi yozuvga ko'chiriladi (uning o'lchami
uning o'rnini bosadigan biri) yoziladi va 300 Pam White 0.00 dan keyingi yozuvlar kop-
yangi faylga o'rnatildi. Butun faylni qayta yozish faqat bitta yozuvni yangilash uchun iqtisodiy emas, lekin
agar ko'p sonli yozuvlarni yangilash kerak bo'lsa, oqilona.
15.5 Ob'ektni ketma-ketlashtirish
15.4-bo'limda biz yozuvning alohida maydonlarini faylga qanday yozishni ko'rsatdik
matn sifatida va bu maydonlarni fayldan qanday o'qish kerak. Ma'lumotlar diskka chiqarilganda, aniq
har bir qiymatning turi kabi ma'lumotlar yo'qolgan. Misol uchun, agar "3" qiymati o'qilgan bo'lsa
fayldan int, string yoki double dan kelganligini aniqlashning hech qanday usuli yo'q. Biz
diskda faqat ma'lumotlarga ega bo'ladi, turi ma'lumotlari emas.
Ba'zan biz ob'ektni fayldan yoki tarmoqdan o'qish yoki unga yozishni xohlaymiz.
ish aloqasi. Java ushbu maqsadlar uchun ob'ektni ketma-ketlashtirishni ta'minlaydi. Seriyalashtirilgan ob'ekt
ob'ekt ma'lumotlarini o'z ichiga olgan baytlar ketma-ketligi sifatida ifodalangan ob'ekt
ob'ekt turi va ob'ektda saqlanadigan ma'lumotlar turlari haqida ma'lumot. Bir qatordan keyin
alized ob'ekt faylga yozilgan bo'lsa, uni fayldan o'qish va seriyadan chiqarish mumkin - bu
ya'ni ob'ektni va uning ma'lumotlarini aks ettiruvchi turdagi ma'lumotlar va baytlar qayta tiklash uchun ishlatilishi mumkin.
ob'ektni xotirada qayta tiklash.
ObjectInputStream va ObjectOutputStream sinflari
ObjectInputStream va ObjectOutputStream sinflari (java.io to'plami), ular
ObjectInput va ObjectOutput interfeyslarini faol ravishda amalga oshirish, barcha ob'ektlarni yoqish
oqimdan o'qilishi yoki unga yozilishi (ehtimol fayl). Fayllar bilan serializatsiyadan foydalanish uchun biz ishga tushiramiz.
ObjectInputStream va ObjectOutputStream ob'ektlarini o'qiydigan oqim ob'ektlari bilan bog'lash
dan va fayllarga yozish. Oqim obyektlarini shu tarzda boshqa oqim obyektlari bilan ishga tushirish
Ba'zan o'rash deb ataladi - yaratilayotgan yangi oqim ob'ekti oqim ob'ektini o'rab oladi.
konstruktor argumenti sifatida belgilangan.
ObjectInputStream va ObjectOutputStream sinflari oddiygina o'qish va yozish
ob'ektlarning baytga asoslangan ko'rinishi - ular baytlarni qayerdan yoki qaerdan o'qishni bilishmaydi
ularga yozing. ObjectInputStream konstruktoriga uzatiladigan oqim obyekti
ObjectInputStream ob'ektlarga aylantiradigan baytlarni ta'minlaydi. Xuddi shunday, oqim
ObjectOutputStream konstruktoriga o'tadigan ob'ekt baytga asoslangan nusxani oladi.
ObjectOutputStream ishlab chiqaradigan va baytlarni yozadigan ob'ektni yuborish
belgilangan maqsad (masalan, fayl, tarmoq ulanishi va boshqalar).

300 Pam Uortington 0,00


15.5 Ob'ektni ketma-ketlashtirish 663



ObjectOutput va ObjectInput interfeyslari
ObjectOutput interfeysida Ob'ektni qabul qiluvchi writeObject usuli mavjud
argument va uning ma'lumotlarini OutputStream ga yozadi. Inter-ni amalga oshiradigan sinf
face ObjectOutput (masalan, ObjectOutputStream) ushbu usulni e'lon qiladi va buni ta'minlaydi.
chiqarilayotgan ob'ekt Serializable interfeysini amalga oshiradi (qisqacha muhokama qilinadi). Xuddi shunday,
ObjectInput interfeysi o'qish va havolani qaytaradigan readObject usulini o'z ichiga oladi.
InputStream dan ob'ektga. Ob'ekt o'qilgandan so'ng, unga havola mumkin
ob'ektning haqiqiy turiga o'tkazilishi mumkin. 28-bobda ko'rib turganingizdek, bir-biriga ulanadigan ilovalar
Internet kabi tarmoq orqali ob'ektlarni tarmoq bo'ylab ham uzatishi mumkin.
15.5.1 Ob'ektni ketma-ketlashtirish yordamida ketma-ket kirish faylini yaratish
Ushbu bo'lim va 15.5.2 bo'lim ob'ekt yordamida ketma-ket kirish fayllarini yaratadi va boshqaradi
ketma-ketlashtirish. Biz bu erda ko'rsatgan ob'ektni ketma-ketlashtirish baytga asoslangan oqimlar bilan amalga oshiriladi,
shuning uchun yaratilgan va manipulyatsiya qilingan ketma-ket fayllar ikkilik fayllar bo'ladi. Ikkilik fayllarni eslang
odatda standart matn muharrirlarida ko'rib bo'lmaydi. Shuning uchun biz alohida dastur yozamiz.
ketma-ketlashtirilgan ob'ektlarni qanday o'qish va ko'rsatishni biladigan plication. Biz yaratishdan boshlaymiz va
ketma-ket kirish fayliga ketma-ketlashtirilgan ob'ektlarni yozish. Misol ichidagi misolga o'xshaydi
15.4-bo'lim, shuning uchun biz faqat yangi xususiyatlarga e'tibor qaratamiz.
Sinf hisobini aniqlash
Biz hisob sinfini aniqlashdan boshlaymiz (15.9-rasm), u mijozning yozuvini o'z ichiga oladi.
ketma-ketlashtirish misollar tomonidan ishlatiladigan shakllantirish. Bu misollar va sinf hisobi hammasi lo-
bob misollari bilan SerializationApps katalogida joylashgan. Bu sinfga ruxsat beradi
Hisob qaydnomasi ikkala misolda ham qo'llanilishi kerak, chunki ularning fayllari bir xil standartda belgilangan
paket. Class Account shaxsiy misol o'zgaruvchilar hisobini o'z ichiga oladi, firstName, last-
Nom va muvozanat (7-10-qatorlar) va ushbu misol variantlariga kirish usullarini o'rnating va oling.
qodir. Belgilangan usullar ushbu misoldagi ma'lumotlarni tasdiqlamasa ham, ular buni qilishlari kerak
"sanoat quvvati" tizimida. Class Account Serializable interfeysini amalga oshiradi
(5-qator), bu sinf ob'ektlarini ObjectOut- bilan ketma-ketlashtirish va seriyadan chiqarish imkonini beradi.
mos ravishda putStreams va ObjectInputStreams. Serializable interfeysi teglashdir
interfeys. Bunday interfeys usullarni o'z ichiga olmaydi. Serializ-ni amalga oshiradigan sinf
able Serializatsiya qilinadigan ob'ekt sifatida belgilangan. Bu muhim, chunki ObjectOut-
putStream, agar u Serializatsiya qilinadigan ob'ekt bo'lmasa, ob'ektni chiqarmaydi
Serializable-ni amalga oshiradigan sinfning har qanday ob'ekti uchun.

1 // 15.9-rasm: Hisob.java


2 // Yozuvlarni ob'ektlar sifatida saqlash uchun Serializable Account klassi.
3
4
5
6 {
7 shaxsiy int hisob;
8 xususiy String firstName;
9 shaxsiy String familiyasi;
10 shaxsiy juft balans;
11

15.9-rasm | Serializatsiya qilinadigan ob'ektlar uchun hisob klassi. (3-qismning 1-qismi.)

import java.io.Serializable;

public class Account Serializable dasturini amalga oshiradi


664 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

12 // hisobni standart qiymatlar bilan ishga tushiradi
13 umumiy hisob ()
14 {
15 this(0, "", "", 0,0); // boshqa konstruktorni chaqirish
16 }
17
18 // berilgan qiymatlar bilan hisobni ishga tushiradi
19 umumiy hisob (int hisob, String firstName,
20 satr familiyasi, juft balans)
21 {
22 this.hisob = hisob;
23 this.firstName = firstName;
24 this.lastName = familiya;
25 this.balance = balans;
26 }
27
28 // hisob raqamini o'rnating
29 ommaviy bekor qilingan hisob qaydnomasi (int acct)
30 {
31 this.account = account;
32 }
33
34 // hisob raqamini oling
35 ommaviy int getAccount()
36 {
37 hisobni qaytarish;
38 }
39
40 // ismni belgilang
41 umumiy bekor setFirstName(String firstName)
42 {
43 this.firstName = firstName;
44 }
45
46 // ismni oling
47 ommaviy string getFirstName()
48 {
49 nomini qaytarish;
50 }
51
52 // familiyani belgilang
53 umumiy bekor setLastName(String familiyasi)
54 {
55 this.lastName = familiya;
56 }
57
58 // familiyani oling
59 ommaviy string getLastName()
60 {
61 familiyasini qaytarish;
62 }
63

15.9-rasm | Serializatsiya qilinadigan ob'ektlar uchun hisob klassi. (3 qismning 2-qismi.)


15.5 Ob'ektni ketma-ketlashtirish 665

Serializable sinfida har bir misol o'zgaruvchisi Serializable bo'lishi kerak. Seriyadan tashqari-
alizable misol o'zgaruvchilari bo'lishi kerakligini ko'rsatish uchun vaqtinchalik deb e'lon qilinishi kerak
ketma-ketlashtirish jarayonida e'tiborga olinmaydi. Odatiy bo'lib, barcha ibtidoiy turdagi o'zgaruvchilar ketma-ketlashtiriladi.
qodir. Malumot turidagi o'zgaruvchilar uchun siz sinf hujjatlarini tekshirishingiz kerak (va ehtimol
uning superklasslari) turini seriyali bo'lishini ta'minlash uchun. Masalan, satrlar ketma-ket
ajratish mumkin. Odatiy bo'lib, massivlarni ketma-ketlashtirish mumkin; ammo, mos yozuvlar tipidagi massivda, havola
o'rnatilgan ob'ektlar bo'lmasligi mumkin. Class Account shaxsiy maʼlumotlar aʼzolari hisobini oʻz ichiga oladi,
ism, familiya va balans - bularning barchasi seriyali bo'lishi mumkin. Bu sinf ham pro-
shaxsiy maydonlarga kirish uchun ommaviy olish va o'rnatish usullarini ko'rsatadi.
Ketma-ket kirish fayliga ketma-ketlashtirilgan ob'ektlarni yozish
Endi ketma-ket kirish faylini yaratuvchi kodni muhokama qilaylik (15.10-rasm). Biz e'tiroz bildiramiz -
Bu erda faqat yangi tushunchalar haqida gapiring. Faylni ochish uchun 27-qator Files statik usulini chaqiradi
newOutputStream, u ochiladigan faylni ko'rsatadigan Yo'lni oladi va agar fayl mavjud bo'lsa,
faylga yozish uchun ishlatilishi mumkin bo'lgan OutputStreamni qaytaradi. Ochilgan mavjud fayllar
bu tarzda chiqish uchun qisqartiriladi. Fayllar uchun standart fayl nomi kengaytmasi mavjud emas
ketma-ketlashtirilgan ob'ektlarni saqlaydi, shuning uchun biz .ser ni tanladik.

64 // balansni o'rnatish


65 ommaviy bekor to'plam Balans (ikki balans)
66 {
67 this.balance = balans;
68 }
69
70 // muvozanatni oling
71 umumiy juft getBalance()
72 {
73 qaytish balansi;
74 }
75 } // yakuniy sinf Hisob

1 // 15.10-rasm: CreateSequentialFile.java


2 // ObjectOutputStream sinfiga ega faylga ob'ektlarni ketma-ket yozish.
3 import java.io.IOException;
4
5 import java.nio.file.Files;
6 import java.nio.file.Paths;
7 import java.util.NoSuchElementException;
8 import java.util.Scanner;
9
10 umumiy sinf CreateSequentialFile
11 {
12
13

15.10-rasm | ObjectOutputStream yordamida yaratilgan ketma-ket fayl. (3-qismning 1-qismi.)

15.9-rasm | Serializatsiya qilinadigan ob'ektlar uchun hisob klassi. (3 qismning 3-qismi.)

import java.io.ObjectOutputStream;

xususiy statik ObjectOutputStream chiqishi; // faylga ma'lumotlarni chiqaradi

666 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

14 ta umumiy statik bekor asosiy (String [] args)
15 {
16 openFile();
17 addRecords();
18 closeFile();
19 }
20
21 // clients.ser faylini oching
22 umumiy statik bekor openFile()
23 {
24 urinib ko'ring
25 {
26
27
28 }
29 ta tutish (IOException ioException)
30 {
31 System.err.println("Faylni ochishda xato. Tugatish.");
32 System.exit(1); // dasturni tugatish
33 }
34 }
35
36 // faylga yozuvlar qo'shish
37 umumiy statik bekor addRecords()
38 {
39 Skaner kiritish = yangi Skaner(System.in);
40
41 System.out.printf("%s%n%s%n? ",
42 "Hisob raqami, ismi, familiyasi va balansini kiriting.",
43 "Kirishni tugatish uchun fayl oxiri ko'rsatkichini kiriting.");
44
45 while (input.hasNext()) // fayl tugaguniga qadar aylanish indikatori
46 {
47 urinib ko'ring
48 {
49 // yangi yozuv yaratish; bu misol to'g'ri kiritishni nazarda tutadi
50 Hisob qaydnomasi = yangi hisob (input.nextInt(),
51 input.next(), input.next(), input.nextDouble());
52
53
54
55 }
56 catch (NoSuchElementException elementException)
57 {
58 System.err.println("Noto'g'ri kiritilgan. Iltimos, qayta urinib ko'ring.");
59 input.nextLine(); // foydalanuvchi qayta urinib ko'rishi uchun kiritilgan ma'lumotlarni bekor qiling
60 }
61 ta tutish (IOException ioException)
62 {
63 System.err.println("Faylga yozishda xatolik. Tugatish.");
64 tanaffus;
65 }

15.10-rasm | ObjectOutputStream yordamida yaratilgan ketma-ket fayl. (3 qismning 2-qismi.)

chiqish = yangi ObjectOutputStream(
Files.newOutputStream(Paths.get("clients.ser")));

// yozuv ob'ektini faylga ketma-ketlashtirish


output.writeObject(yozuv);

15.5 Ob'ektni ketma-ketlashtirish 667

Class OutputStream bayt massivlarini va individual chiqish usullarini taqdim etadi
bayt, lekin biz faylga ob'ektlarni yozishni xohlaymiz. Shu sababli, 26-27 qatorlar Kirish-
ObjectInputStream konstruktori sinfiga oqim o'tkazing, u OutputStreamni o'z ichiga oladi.
ObjectOutputStream. ObjectOutputStream obyekti yozish uchun OutputStream dan foydalanadi
faylga butun ob'ektlarni ifodalovchi baytlarni kiriting. 26-27 qatorlar IOExcep-ni tashlashi mumkin
Agar faylni ochishda muammo yuzaga kelsa (masalan, fayl yozish uchun ochilganda).
etarli joy bo'lmagan disk yoki yozish uchun faqat o'qish uchun fayl ochilganda). Agar shunday bo'lsa,
dastur xato xabarini ko'rsatadi (29–33-qatorlar). Agar istisno bo'lmasa, fayl ochiq,
va o'zgaruvchan chiqish unga ob'ektlarni yozish uchun ishlatilishi mumkin.
Ushbu dastur ma'lumotlar to'g'ri va to'g'ri rekord raqamda kiritilganligini taxmin qiladi
buyurtma. AddRecords usuli (37–69-qatorlar) yozish operatsiyasini bajaradi. 50–51 qatorlar
foydalanuvchi tomonidan kiritilgan ma'lumotlardan Hisob ob'ektini yaratish. 54-qator ObjectOutput-ni chaqiradi
Yozuv ob'ektini chiqish fayliga yozish uchun oqim usuli writeObject. Faqat bitta davlat -
ment butun ob'ektni yozish uchun talab qilinadi.
CloseFile usuli (72–83-qatorlar) ObjectOutputStream usulini yopishni chaqiradi
ObjectOutputStream va uning asosiy OutputStream-ni yopish uchun chiqish. Qo'ng'iroq
to method close sinash blokida mavjud, chunki close agar bo'lsa IOException ni chiqaradi
faylni to'g'ri yopish mumkin emas. O'ralgan oqimlarni ishlatganda, eng tashqi oqimni yoping
shuningdek, o'ralgan oqimni ham yopadi.

66
67 System.out.print("? ");


68 }
69 }
70
71 // faylni yoping va dasturni tugating
72 umumiy statik bekor closeFile()
73 {
74 urinib ko'ring
75 {
76 agar (chiqish != null)
77 chiqdi.close();
78 }
79 catch (IOException ioException)
80 {
81 System.err.println("Faylni yopishda xatolik yuz berdi. Tugatish.");
82 }
83 }
84 } // oxirgi sinf CreateSequentialFile
Hisob raqami, ismi, familiyasi va balansini kiriting.
Kirishni tugatish uchun fayl oxiri indikatorini kiriting.
? 100 Bob Blue 24.98
? 200 Stiv Green -345,67
? 300 Pam White 0,00
? 400 Sam Red -42.16
? 500 Sue Sariq 224.62
? ^Z
15.10-rasm | ObjectOutputStream yordamida yaratilgan ketma-ket fayl. (3 qismning 3-qismi.)

668 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

15.10-rasmdagi dasturning namunaviy bajarilishida biz uchun ma'lumotlarni kiritdik
beshta hisob - 15.5-rasmda ko'rsatilgan bir xil ma'lumotlar. Dastur ko'rsatilmaydi
ma'lumotlar yozuvlari aslida faylda qanday ko'rinadi. Esda tutingki, endi biz ikkilikdan foydalanamiz
inson tomonidan o'qib bo'lmaydigan fayllar. Fayl muvaffaqiyatli yaratilganligini tekshirish uchun,
keyingi bo'lim fayl mazmunini o'qish uchun dasturni taqdim etadi.
15.5.2 Ketma-ket kirish faylidan ma'lumotlarni o'qish va seriyadan chiqarish
Oldingi bo'limda ketma-ket kirish uchun faylni qanday yaratish ko'rsatilgan edi.
lash. Ushbu bo'limda biz fayldan ketma-ket ma'lumotlarni qanday o'qishni muhokama qilamiz.
15.11-rasmdagi dastur dastur tomonidan yaratilgan fayldagi yozuvlarni o'qiydi
15.5.1-bo'lim va mazmunini ko'rsatadi. Dastur qo'ng'iroq qilish orqali faylni kiritish uchun ochadi
Fayllarning statik usuli newInputStream, u ochiladigan faylni ko'rsatuvchi Yo'lni oladi
va agar fayl mavjud bo'lsa, fayldan o'qish uchun ishlatilishi mumkin bo'lgan InputStreamni qaytaradi. In
15.10-rasm, biz ObjectOutputStream ob'ektidan foydalanib, faylga ob'ektlarni yozdik. Ma'lumotlar kerak
fayldan u yozilgan formatda o'qilishi mumkin. Shuning uchun biz dan foydalanamiz
ObjectInputStream InputStream atrofiga o'ralgan (26–27-qatorlar). Agar istisnolar bo'lmasa
faylni ochishda sodir bo'ladi, o'zgaruvchan kiritish fayldan ob'ektlarni o'qish uchun ishlatilishi mumkin.

1 // 15.11-rasm: ReadSequentialFile.java


2 // ObjectInputStream bilan ob'ektlar faylini ketma-ket o'qish
3 // va har bir yozuvni ko'rsatish.
4 import java.io.EOFException;
5 import java.io.IOException;
6
7 import java.nio.file.Files;
8 import java.nio.file.Paths;
9
10 ommaviy sinf ReadSequentialFile
11 {
12
13
14 ta umumiy statik bekor asosiy (String [] args)
15 {
16 openFile();
17 ta o'qilgan yozuvlar ();
18 closeFile();
19 }
20
21 // foydalanuvchiga ochish uchun faylni tanlash imkonini beradi
22 umumiy statik bekor openFile()
23 {
24 harakat qilib ko'ring // faylni oching
25 {
26
27
28 }
29 ta tutish (IOException ioException)
30 {

15.11-rasm | ObjectInputStream bilan ob'ektlar faylini ketma-ket o'qish va ko'rsatish


har bir rekord. (3-qismning 1-qismi.)

java.io.ObjectInputStreamni import qilish;

xususiy statik ObjectInputStream kiritish;

kirish = yangi ObjectInputStream(


Files.newInputStream(Paths.get("clients.ser")));

15.5 Ob'ektni ketma-ketlashtirish 669

31 System.err.println("Faylni ochishda xatolik.");
32 System.exit(1);
33 }
34 }
35
36 // fayldan yozuvni o'qish
37 ta umumiy statik bekor o'qilgan yozuvlar()
38 {
39 System.out.printf("%-10s%-12s%-12s%10s%n", "Hisob",
40 "Ism", "Familiya", "Balans");
41
42 urinib ko'ring
43 {
44 while (to'g'ri) // EOFException paydo bo'lguncha tsikl
45 {
46
47
48 // yozuv mazmunini ko'rsatish
49 System.out.printf("%-10d%-12s%-12s%10,2f%n",
50 record.getAccount(), record.getFirstName(),
51 record.getLastName(), record.getBalance());
52 }
53 }
54 catch (EOFException endOfFileException)
55 {
56 System.out.printf("%Boshqa yozuvlar yo'q%n");
57 }
58 ta tutish (ClassNotFoundException classNotFoundException)
59 {
60 System.err.println("Obyekt turi noto'g'ri. Tugatilmoqda.");
61 }
62 catch (IOException ioException)
63 {
64 System.err.println("Fayldan o'qishda xatolik. Tugatish.");
65 }
66 } // tugatish usuli readRecords
67
68 // faylni yoping va dasturni tugating
69 umumiy statik bekor closeFile()
70 {
71 urinib ko'ring
72 {
73 agar (kirish != null)
74 input.close();
75 }
76 catch (IOException ioException)
77 {
78 System.err.println("Faylni yopishda xatolik yuz berdi. Tugatish.");
79 System.exit(1);
80 }
81 }
82 } // oxirgi sinf ReadSequentialFile
15.11-rasm | ObjectInputStream bilan ob'ektlar faylini ketma-ket o'qish va ko'rsatish
har bir rekord. (3 qismning 2-qismi.)

Hisob qaydnomasi = (Hisob qaydnomasi) input.readObject();


670 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

Dastur readRecords usulida fayldan yozuvlarni o'qiydi (37–66 qatorlar). Chiziq
46 fayldan Ob'ektni o'qish uchun ObjectInputStream usulini readObject chaqiradi. Foydalanish uchun
Hisobga xos usullar, biz qaytarilgan Ob'ektni Hisob turiga tushiramiz. Usul
readObject EOFExceptionni (54–57-qatorlarda qayta ishlanadi) chiqaradi
fayl oxiridan keyin o'qing. ReadObject usuli ClassNotFoundException ni chiqaradi
agar o'qilayotgan ob'ekt uchun sinfni topib bo'lmasa. Agar faylga kirish bo'lsa, bu sodir bo'lishi mumkin
sinfga ega bo'lmagan kompyuterda.

15.6 JFileChooser yordamida fayllarni ochish


JFileChooser klassi foydalanuvchiga fayllar yoki yo'riqnomalarni osongina tanlash imkonini beruvchi dialog oynasini ko'rsatadi.
ries. JFileChooser-ni namoyish qilish uchun biz 15.3-bo'limda ko'rsatilganidek, misolni yaxshilaymiz.
Anjir. 15.12–15.13. Misol endi grafik foydalanuvchi interfeysini o'z ichiga oladi, lekin baribir ko'rsatiladi
oldingi kabi ma'lumotlar. Konstruktor 24-qatorda analizPath usulini chaqiradi. Bu usul-
od keyin Path obyektini qayta tiklash uchun 31-qatordagi getFileOrDirectoryPath usulini chaqiradi.
tanlangan fayl yoki katalogni yuborish.
getFileOrDirectoryPath usuli (15.12-rasmning 71-85-qatorlari) JFile-ni yaratadi.
Tanlovchi (74-qator). 75–76 qatorlar nima ekanligini aniqlash uchun setFileSelectionMode usulini chaqiradi
foydalanuvchi faylni tanlashi mumkin. Ushbu dastur uchun biz JFileChooser statik dan foydalanamiz
doimiy FILES_AND_DIRECTORIES fayllar va kataloglarni tanlash mumkinligini bildiradi.
Boshqa statik konstantalarga FILES_ONLY (standart) va DIRECTORIES_ONLY kiradi.
77-qator Open deb nomlangan JFileChooser dialog oynasini ko'rsatish uchun showOpenDialog usulini chaqiradi.
Argument bu JFileChooser dialogining asosiy oynasini belgilaydi, bu esa
dialog oynasining ekrandagi joylashuvi. Agar null o'tkazilsa, dialog markazda ko'rsatiladi
ekranda - aks holda, dialog dastur oynasining markazida joylashgan (belgilangan
argument bu). JFileChooser dialogi foydalanuvchiga ruxsat bermaydigan modal dialogdir
dialog oynasi yopilgunga qadar dasturning istalgan boshqa oynasi bilan o'zaro aloqada bo'lish. Foydalanuvchi tanlaydi
drayverni, katalogni yoki fayl nomini tanlang, so'ng Ochish tugmasini bosing. showOpenDialog usuli a qaytaradi
foydalanuvchi muloqot oynasini yopish uchun qaysi tugmani (Ochish yoki Bekor qilish) bosganligini ko'rsatadigan butun son. Chiziq

Hisob familiyasi balansi


100 Bob Blue 24.98
200 Stiv Green -345,67
300 Pam White 0,00
400 Sam Red -42.16
500 Sue Sariq 224.62

Boshqa yozuvlar yo'q

Dasturiy ta'minot muhandisligi kuzatuvi 15.1
Ushbu bo'lim ob'ektni ketma-ketlashtirishni taqdim etdi va asosiy seriyalash texnologiyasini namoyish etdi.
niklar. Serializatsiya - bu juda ko'p tuzoq va tuzoqlarga ega chuqur mavzu. Amalga oshirishdan oldin
sanoat kuchli ilovalarda ob'ektni ketma-ketlashtirish, onlayn Java hujjatini diqqat bilan o'qing.
ob'ektni ketma-ketlashtirish uchun umentatsiya.

15.11-rasm | ObjectInputStream bilan ob'ektlar faylini ketma-ket o'qish va ko'rsatish


har bir rekord. (3 qismning 3-qismi.)

15.6 JFileChooser 671 yordamida fayllarni ochish

48 foydalanuvchi natijani statik doimiy bilan solishtirish orqali Bekor qilish tugmasini bosganligini tekshiradi
CANCEL_OPTION. Agar ular teng bo'lsa, dastur tugaydi. 84-qator JFileChooser ni chaqiradi
faylni ifodalovchi Fayl obyektini (java.io paketi) olish uchun getSelectedFile usuli
yoki foydalanuvchi tanlagan katalogni tanlang, keyin Path obyektini qaytarish uchun File usulini toPath deb chaqiradi.
Keyin dastur tanlangan fayl yoki katalog haqidagi ma'lumotlarni ko'rsatadi.

1 // 15.12-rasm: JFileChooserDemo.java


2 // JFileChooserni namoyish qilish.
3 import java.io.IOException;
4 import java.nio.file.DirectoryStream;
5 import java.nio.file.Files;
6 import java.nio.file.Path;
7 import java.nio.file.Paths;
8
9 import javax.swing.JFrame;
10 import javax.swing.JOptionPane;
11 import javax.swing.JScrollPane;
12 import javax.swing.JTextArea;
13
14 umumiy sinf JFileChooserDemo JFrame-ni kengaytiradi
15 {
16 xususiy yakuniy JTextArea outputArea; // fayl tarkibini ko'rsatadi
17
18 // GUI-ni o'rnating
19 ommaviy JFileChooserDemo() IOExceptionni tashlaydi
20 {
21 super("JFileChoose Demo");
22 outputArea = yangi JTextArea();
23 qo'shish (yangi JScrollPane (outputArea)); // outputArea aylantirilishi mumkin
24 analyzePath(); // foydalanuvchidan yo'lni oling va ma'lumotni ko'rsating
25 }
26
27 // foydalanuvchi ko'rsatgan fayl yoki katalog haqidagi ma'lumotlarni ko'rsatish
28 public void analyzePath() IOException-ni tashlaydi
29 {
30 // foydalanuvchi tanlagan fayl yoki katalogga yo'lni oling
31 Yoʻl yoʻli = getFileOrDirectoryPath();
32
33 agar (yo'l != null && Files.exists(yo'l)) // agar mavjud bo'lsa, ma'lumotni ko'rsatish
34 {
35 // fayl (yoki katalog) ma'lumotlarini yig'ish
36 StringBuilder quruvchisi = yangi StringBuilder();
37 builder.append(String.format("%s:%n", path.getFileName()));
38 builder.append(String.format("%sa katalogi%n",
39 Files.isDirectory(yo'l) ? "Is" : "Emas");
40 builder.append(String.format("%s mutlaq yo'l%n",
41 path.isAbsolute() ? "Is" : "Emas");
42 builder.append(String.format("Oxirgi tahrirlangan: %s%n",
43 Files.getLastModifiedTime(yo'l)));
44 builder.append(String.format("Hajmi: %s%n", Files.size(yo'l)));
45 builder.append(String.format("Yo'l: %s%n", yo'l));

15.12-rasm | JFileChooser ko'rsatilmoqda. (2-qismning 1-qismi.)

import javax.swing.JFileChooser;

672 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

46 builder.append(String.format("Mutlaq yo'l: %s%n",
47 path.toAbsolutePath()));
48
49 if (Files.isDirectory(yo'l)) // katalog ro'yxatini chiqarish
50 {
51 builder.append(String.format("%nDirectory tarkibi:%n"));
52
53 // katalog tarkibini takrorlash uchun ob'ekt
54 DirectoryStream
directoryStream =
55 Files.newDirectoryStream(yo‘l);
56
57 uchun (Path p : directoryStream)
58 builder.append(String.format("%s%n", p));
59 }
60
61 outputArea.setText(builder.toString()); // String tarkibini ko'rsatish
62 }
63 boshqa // Yo'l mavjud emas
64 {
65 JOptionPane.showMessageDialog(bu, path.getFileName() +
66 "mavjud emas.", "ERROR", JOptionPane.ERROR_MESSAGE);
67 }
68 } // end method analyzePath
69
70 // foydalanuvchiga fayl yoki katalog nomini belgilashga ruxsat bering
71 shaxsiy yo'l getFileOrDirectoryPath()
72 {
73
74
75
76
77
78
79 // agar foydalanuvchi muloqot oynasida Bekor qilish tugmasini bosgan bo'lsa, qayting
80 agar (natija == )
81 System.exit(1);
82
83 // tanlangan faylni ifodalovchi yo'lni qaytarish
84 qaytish;
85 }
86 } // yakuniy sinf JFileChooserDemo

1 // 15.13-rasm: JFileChooserTest.java


2 // JFileChooserDemo sinfini sinovdan o'tkazadi.
3 import java.io.IOException;
4 import javax.swing.JFrame;
5
6 umumiy sinf JFileChooserTest
7 {

15.13-rasm | FileDemonstration sinov sinfi. (2-qismning 1-qismi.)

15.12-rasm | JFileChooser ko'rsatilmoqda. (2-qismning 2-qismi.)

// fayl yoki katalog tanlashga ruxsat beruvchi dialog oynasini sozlash


JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(
JFileChooser.FILES_AND_DIRECTORIES);
int natija = fileChooser.showOpenDialog(bu);

JFileChooser.CANCEL_OPTION

fileChooser.getSelectedFile().toPath()

15.7 (Ixtiyoriy) Qo'shimcha java.io sinflari 673

15.7 (Ixtiyoriy) Qo'shimcha java.io sinflari
Ushbu bo'lim qo'shimcha interfeyslar va sinflarni ko'rib chiqadi (java.io paketidan).
15.7.1 Baytga asoslangan kirish va chiqish uchun interfeyslar va sinflar
InputStream va OutputStream - bajarish usullarini e'lon qiladigan mavhum sinflar
baytga asoslangan kirish va chiqish.
Quvur oqimlari
Quvurlar iplar orasidagi sinxronlashtirilgan aloqa kanallari. Biz mavzularni muhokama qilamiz
23-bob. Java PipedOutputStream (OutputStreamning quyi sinfi) va Piped-ni taqdim etadi.

8 ta umumiy statik void main(String [] args) IOExceptionni tashlaydi


9 {
10 JFileChooserDemo ilovasi = yangi JFileChooserDemo();
11 application.setSize(400, 400);
12 application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13 application.setVisible(rost);
14 }
15 } // yakuniy sinf JFileChooserTest

15.13-rasm | FileDemonstration sinov sinfi. (2-qismning 2-qismi.)

Fayllar va
kataloglar
bu yerda ko'rsatilgan

a) Ushbu dialog oynasidan foydalaning


topish va
faylni tanlang yoki
katalog Ochish tugmasini bosing
faylni yuborish yoki
katalog nomi
dasturlash

b) Tanlangan fayl yoki


katalog ma'lumotlari;
agar bu katalog bo'lsa,
uning mazmuni
katalog ko'rsatiladi

674 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

InputStream (InputStreamning kichik klassi) pro-formatdagi ikkita ip o'rtasida quvurlar o'rnatish uchun.
gramm. Bitta ip PipedOutputStream ga yozish orqali ma'lumotlarni boshqasiga yuboradi. Maqsad
ip quvurdan PipedInputStream orqali ma'lumotni o'qiydi.

Oqimlarni filtrlash


FilterInputStream InputStreamni filtrlaydi va FilterOutputStream Out-
putStream. Filtrlash shunchaki filtr oqimi qo'shimcha funktsiyalarni taqdim etishini anglatadi,
baytlarni mazmunli ibtidoiy tipdagi birliklarga jamlash kabi. FilterInputStream va
FilterOutputStream odatda yuqori sinflar sifatida ishlatiladi, shuning uchun ularning ba'zi filtrlash imkoniyatlari
aloqalar ularning kichik sinflari bilan ta'minlanadi.
PrintStream (FilterOutputStreamning quyi sinfi) spetsifikatsiyaga matn chiqarishni amalga oshiradi.
birlashtirilgan oqim. Aslida, biz buning uchun butun matn davomida PrintStream chiqishidan foydalandik
point—System.out va System.err PrintStream obyektlaridir.

Ma'lumotlar oqimlari


Ma'lumotni xom baytlar sifatida o'qish tez, ammo qo'pol. Odatda, dasturlar ma'lumotlarni yig'indisi sifatida o'qiydi
ints, float, double va hokazolarni tashkil etuvchi baytlar. Java dasturlari bir nechta sinflardan foydalanishi mumkin
ma'lumotlarni umumiy shaklda kiritish va chiqarish.
Interface DataInput kirishdan ibtidoiy turlarni o'qish usullarini tavsiflaydi
oqim. DataInputStream va RandomAccessFile sinflarining har biri ushbu interfeysni amalga oshiradi
baytlar to'plamini o'qish va ularni ibtidoiy turdagi qiymatlar sifatida ko'rish. Interface DataInput o'z ichiga oladi
readBoolean, readByte, readChar, readDouble, readFloat, readFully kabi usullar
(bayt massivlari uchun), readInt, readLong, readShort, readUnsignedByte, readUnsigned-
Qisqacha, readUTF (Java tomonidan kodlangan Unicode belgilarini o'qish uchun - biz UTFni muhokama qilamiz
H ilovasida kodlash) va skipBytes.
Interface DataOutput ibtidoiy turlarni yozish uchun usullar to'plamini tavsiflaydi
chiqish oqimi. DataOutputStream sinflari (FilterOutputStreamning quyi sinfi) va Ran-
domAccessFile har biri ibtidoiy turdagi qiymatlarni bayt sifatida yozish uchun ushbu interfeysni amalga oshiradi.
Interface DataOutput usuli yozishning haddan tashqari yuklangan versiyalarini o'z ichiga oladi (bayt yoki a
bayt massivi) va writeBoolean, writeByte, writeBytes, writeChar, writeChars usullari
(Unicode strings uchun), writeDouble, writeFloat, writeInt, writeLong, writeShort
va writeUTF (Unicode uchun o'zgartirilgan matnni chiqarish uchun).

Buferlangan oqimlar


Buferlash - bu I/U-ning ishlashini yaxshilash usuli. BufferedOutput bilan -
Stream (FilterOutputStream sinfining quyi sinfi), har bir chiqish bayonoti shart emas-
Bu ma'lumotlarning chiqish qurilmasiga haqiqiy jismoniy uzatilishiga olib keladi (bu sekin
protsessor va asosiy xotira tezligi bilan solishtirganda ishlash). Aksincha, har bir chiqish opera-
tion xotiradagi ma'lumotlarni saqlash uchun yetarli bo'lgan bufer deb ataladigan hududga yo'naltiriladi
ko'p chiqish operatsiyalari. Keyinchalik, chiqish qurilmasiga haqiqiy o'tkazish birida amalga oshiriladi
bufer har safar to'lganida katta jismoniy chiqish operatsiyasi. Yo'naltirilgan chiqish operatsiyalari
Xotiradagi chiqish buferiga ko'pincha mantiqiy chiqish operatsiyalari deyiladi. Buff bilan -
eredOutputStream, qisman to'ldirilgan buferni istalgan vaqtda qurilmaga majburan chiqarish mumkin.
oqim obyektining flush usulini chaqirish.
Buferlashdan foydalanish dasturning ishlashini sezilarli darajada oshirishi mumkin. Odatdagi kiritish/chiqarish
kompyuterdagi ma'lumotlarga kirish tezligiga nisbatan operatsiyalar juda sekin

15.7 (Ixtiyoriy) Qo'shimcha java.io sinflari 675

xotira. Buferlash birinchi navbatda kichikroq chiqishlarni birlashtirib, kiritish-chiqarish operatsiyalari sonini kamaytiradi.
xotiraga jamlaydi. Haqiqiy jismoniy kiritish-chiqarish operatsiyalari soni nisbatan kichik
dastur tomonidan chiqarilgan kiritish-chiqarish so'rovlari soni bilan. Shunday qilib, foydalanayotgan dastur
buferlash samaraliroq.

BufferedInputStream (FilterInputStream sinfining kichik klassi) bilan ko'p "log-


fayldan olingan ma'lumotlarning "ical" bo'laklari bitta katta jismoniy kiritish operatsiyasi sifatida o'qiladi
xotira buferi. Dastur har bir yangi ma'lumot bo'lagini so'raganda, u buferdan olinadi.
(Ushbu protsedura ba'zan mantiqiy kiritish operatsiyasi deb ataladi.) Bufer bo'lganda
bo'sh, o'qish uchun kiritish qurilmasidan keyingi haqiqiy jismoniy kiritish operatsiyasi bajariladi
ma'lumotlarning keyingi "mantiqiy" bo'laklari guruhida. Shunday qilib, haqiqiy jismoniy kirish soni
Operatsiyalar dastur tomonidan berilgan o'qish so'rovlari soniga nisbatan kichikdir.
Xotiraga asoslangan bayt massivi Steams
Java oqimini kiritish-chiqarish xotiraga va chiqishga bayt massivlaridan kiritish imkoniyatlarini o'z ichiga oladi.
baytga massivlarni xotiraga joylashtirish. ByteArrayInputStream (InputStreamning quyi sinfi)
xotiradagi bayt massividan o'qiydi. ByteArrayOutputStream (chiqishning kichik klassi-
Stream) xotiradagi bayt massiviga chiqadi. Bayt-massiv kiritish-chiqarishdan foydalanishdan biri ma'lumotlarni tekshirishdir.
Dastur bir vaqtning o'zida kirish oqimidan bayt massiviga butun qatorni kiritishi mumkin. Keyin
tekshirish tartibi bayt massivining mazmunini sinchkovlik bilan tekshirishi va agar bo'lsa, ma'lumotlarni tuzatishi mumkin
zarur. Nihoyat, dastur buni "bilgan holda" bayt massividan kiritishga o'tishi mumkin
kiritilgan ma'lumotlar to'g'ri formatda. Bayt massiviga chiqish - olishning yaxshi usuli
Java oqimlarining kuchli chiqish formatlash imkoniyatlarining afzalligi. Masalan,
ma'lumotlar bayt massivida saqlanishi mumkin, a da ko'rsatiladigan bir xil formatlashdan foydalangan holda
keyinroq va bayt massivi formatlashni saqlab qolish uchun faylga chiqarilishi mumkin.
Bir nechta oqimlardan kirishni ketma-ketlashtirish
SequenceInputStream (InputStreamning quyi klassi) bir nechta kirishni mantiqiy ravishda birlashtiradi.
Oqimlar - dastur guruhni bitta doimiy InputStream sifatida ko'radi. Dastur qachon
bitta kirish oqimining oxiriga yetadi, bu oqim yopiladi va keyingi oqim
klapan ochiladi.

15.7.2 Belgilarga asoslangan kirish va chiqish uchun interfeyslar va sinflar


Baytga asoslangan oqimlarga qo'shimcha ravishda Java Reader va Writer ma'lumotlarini taqdim etadi
sinflar, ular matnli fayllarni qayta ishlashda foydalanganlar kabi belgilarga asoslangan oqimlardir
15.4-bo'lim. Baytga asoslangan oqimlarning aksariyati tegishli belgilarga asoslangan betonga ega
Reader yoki Writer darslari.
O'quvchilar va yozuvchilarni belgilarga asoslangan buferlash
BufferedReader (mavhum sinf Readerning quyi sinfi) va BufferedWriter (a) sinflari
mavhum sinf Writer kichik klassi) belgilarga asoslangan oqimlar uchun buferlashni yoqadi. Esda tuting -
belgilarga asoslangan oqimlar Unicode belgilaridan foydalanishi kerak - bunday oqimlar ma'lumotlarni qayta ishlashi mumkin
Unicode belgilar to'plami ifodalaydigan har qanday tilda.

Ishlash bo'yicha maslahat 15.1


Buferlangan kiritish-chiqarish buferlanmagan kiritish-chiqarishga qaraganda unumdorlikni sezilarli darajada oshirishi mumkin.

676 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

Xotiraga asoslangan char massiv o'quvchilari va yozuvchilari
CharArrayReader va CharArrayWriter sinflari mos ravishda o'qiydi va yozadi
belgilar qatoriga belgilar. LineNumberReader (BufferedReaderning quyi klassi) buff-
o'qilgan satrlar sonini kuzatib turuvchi belgi oqimi - yangi qatorlar, qaytariladigan va
vagon-qaytish-chiziq-tasvir birikmalari qatorlar sonini oshiradi. Chiziqni kuzatib borish
Agar dastur o'quvchini ma'lum bir xato haqida xabardor qilishi kerak bo'lsa, raqamlar foydali bo'lishi mumkin
chiziq.
Belgilarga asoslangan fayl, quvur va string o'quvchilari va yozuvchilari
InputStreamni InputStreamReader sinfi orqali Readerga aylantirish mumkin. Xuddi shunday, an
OutputStreamni OutputStreamWriter sinfi orqali Writerga aylantirish mumkin. Sinf fayli -
Reader (InputStreamReader kenja sinfi) va FileWriter sinfi (Output-ning quyi sinfi)
StreamWriter) mos ravishda fayldagi belgilarni o'qish va belgilarni yozish. Sinf
PipedReader va sinf PipedWriter uzatish uchun quvurli belgilar oqimini amalga oshiradi
iplar orasidagi ma'lumotlar. Class StringReader va StringWriter va dan belgilarni o'qiydi
o'z navbatida Strings ga belgilar yozish. PrintWriter oqimga belgilar yozadi.
15.8 Yakunlash
Ushbu bobda siz doimiy ma'lumotlarni qanday boshqarishni o'rgandingiz. Biz bayt asosida solishtirdik
va belgilarga asoslangan oqimlar va java.io va paketlardan bir nechta sinflarni taqdim etdi
java.nio.file. Siz Files va Path sinflaridan hamda Path and Directo- interfeyslaridan foydalandingiz.
ryStream fayllar va kataloglar haqida ma'lumot olish uchun. Siz ketma-ket kirishdan foydalandingiz
yozuv kaliti maydonida tartibda saqlanadigan yozuvlarni boshqarish uchun fayllarni qayta ishlash. Siz
matnli fayllarni qayta ishlash va ob'ektni ketma-ketlashtirish o'rtasidagi farqlarni bilib oldilar va seriyalardan foydalandilar.
butun ob'ektlarni saqlash va olish uchun alization. Bob kichik bir misol bilan yakunlandi
Foydalanuvchilarga GUI dan fayllarni osongina tanlash imkonini berish uchun JFileChooser dialog oynasidan foydalanish. Keyingi
bobda ma'lumotlar to'plamini manipulyatsiya qilish uchun Java sinflari muhokama qilinadi, masalan, sinf Array-
Ro'yxat, biz 7.16-bo'limda kiritilgan.

Xulosa
15.1-bo'lim Kirish


• Kompyuterlar katta hajmdagi doimiy ma'lumotlarni uzoq muddat saqlash uchun fayllardan foydalanadi (645-bet), hattoki
ma'lumotlarni yaratgan dasturlar tugatilgandan keyin.
• Kompyuterlar fayllarni qattiq disklar kabi ikkilamchi saqlash qurilmalarida (645-bet) saqlaydi.
15.2-bo'lim Fayllar va oqimlar
• Java har bir faylni baytlarning ketma-ket oqimi sifatida ko'radi (645-bet).
• Har bir operatsion tizim faylning oxirini aniqlash mexanizmini taqdim etadi, masalan, oxiri
fayl belgisi (645-bet) yoki fayldagi jami baytlar soni.
• Baytga asoslangan oqimlar (646-bet) ma'lumotlarni ikkilik formatda ifodalaydi.
• Belgilarga asoslangan oqimlar (646-bet) ma'lumotlarni belgilar ketma-ketligi sifatida ifodalaydi.
• Baytga asoslangan oqimlar yordamida yaratilgan fayllar ikkilik fayllardir (646-bet). Belgilar yordamida yaratilgan fayllar
asoslangan oqimlar matnli fayllardir (646-bet). Matnli fayllar matn muharrirlari tomonidan o'qilishi mumkin, ikkilik fayllar esa
ma'lumotlarni inson o'qiy oladigan formatga aylantiruvchi dastur tomonidan o'qiladi.

Xulosa 677



• Java shuningdek, oqimlarni turli qurilmalar bilan bog'lashi mumkin. Uchta oqim ob'ekti bilan bog'langan
Java dasturi ishga tusha boshlagan qurilmalar - System.in, System.out va System.err.
15.3-bo'lim Fayl va katalog ma'lumotlarini olish uchun NIO sinflari va interfeyslaridan foydalanish
• Yo‘l (647-bet) fayl yoki katalog joylashuvini bildiradi. Yo'l ob'ektlari fayllarni ochmaydi yoki
har qanday faylni qayta ishlash imkoniyatlarini taqdim eting.
• Class Paths (647-bet) fayl yoki katalog joylashuvini ifodalovchi Path obyektini olish uchun ishlatiladi.
• Class Files (647-bet) umumiy fayl va katalog manipulyatsiyasi uchun statik usullarni taqdim etadi.
fayllarni nusxalash usullarini o'z ichiga oladi; fayllar va kataloglarni yaratish va o'chirish; ma'lumot olish
fayllar va kataloglar haqida; fayllar tarkibini o'qish; manipulyatsiya qilish imkonini beruvchi ob'ektlarni olish
fayllar va kataloglarning mazmunini o'zgartirish; va boshqalar.
• DirectoryStream (647-bet) dasturga katalog tarkibini takrorlash imkonini beradi.
• Paths sinfining statik usuli (647-bet) fayl yoki yo'riqnomani ifodalovchi Stringni o'zgartiradi.
ry joylashuvini Path ob'ektiga kiriting.
• Belgilarga asoslangan kiritish va chiqarish Scanner va Formatter sinflari bilan amalga oshirilishi mumkin.
• Class Formatter (647-bet) formatlangan ma'lumotlarni ekranga yoki insondagi faylga chiqarish imkonini beradi.
System.out.printf ga o'xshash.
• Mutlaq yo‘l (647-bet) ildiz katalogidan boshlab (647-bet) barcha kataloglarni o‘z ichiga oladi.
ma'lum bir fayl yoki katalogga olib keladi. Diskdagi har bir fayl yoki katalog bir xil ildizga ega
o'z yo'lidagi katalog.
• Nisbiy yo‘l (647-bet) ilova bajara boshlagan katalogdan boshlanadi.
• Fayllarning statik usuli mavjud (648-bet) Yo‘lni oladi va uning mavjudligini aniqlaydi (yoki
fayl yoki katalog sifatida) diskda.
• getFileName yo'l usuli (648-bet) fayl yoki katalogning String nomini hech qanday joylashuvsiz oladi.
haqida ma'lumot.
• Files statik usuli isDirectory (648-bet) Path oladi va mantiqiy ko'rsatkichni qaytaradi
bu yo'l diskdagi katalogni ifodalaydimi.
• Yo‘l usuli isAbsolute (648-bet) yo‘l absolyutni ifodalash yoki yo‘qligini ko‘rsatuvchi mantiqiy qiymatni qaytaradi.
fayl yoki katalogga hal qiluvchi yo'l.
• GetLastModifiedTime fayllarining statik usuli (648-bet) Path oladi va FileTime ni qaytaradi
(java.nio.file.attribute to'plami) fayl oxirgi marta qachon o'zgartirilganligini ko'rsatadi.
• Fayllarning statik usuli hajmi (648-bet) Yo‘lni oladi va raqamni ifodalovchi uzunlikni qaytaradi
fayl yoki katalogdagi baytlar soni. Kataloglar uchun qaytarilgan qiymat platformaga xosdir.
• Path usuli toString (648-bet) Pathning String tasvirini qaytaradi.
• AbsolutePathga yoʻl usuli (648-bet) chaqirilgan yoʻlni mutlaq yoʻlga aylantiradi.
• newDirectoryStream fayllarining statik usuli (648-bet) DirectoryStream
tarkibini qaytaradi-
Katalog mazmuni uchun Path ob'ektlari.
• Ajratuvchi belgi (650-bet) yo'lda katalog va fayllarni ajratish uchun ishlatiladi.
15.4-bo'lim ketma-ket kirish matnli fayllar
• Java faylga hech qanday tuzilma yuklamaydi. Ilova ehtiyojlarini qondirish uchun fayllarni tuzishingiz kerak.
• Fayldan ma'lumotlarni ketma-ket olish uchun dasturlar odatda fayl boshidan boshlanadi
va kerakli ma'lumot topilmaguncha barcha ma'lumotlarni ketma-ket o'qing.
• Ko'pgina ketma-ket fayllardagi ma'lumotlarni fayldagi boshqa ma'lumotlarni yo'q qilish xavfisiz o'zgartirib bo'lmaydi
fayl. Ketma-ket kirish faylidagi yozuvlar odatda butun faylni qayta yozish orqali yangilanadi.

678 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish



15.5-bo'lim Ob'ektni ketma-ketlashtirish
• Java ob'ektni ketma-ketlashtirish (662-bet) deb nomlangan mexanizmni taqdim etadi, bu esa butun ob'ektlarni bo'lishini ta'minlaydi
oqimga yozilgan yoki oqimdan o'qilgan.
• Seriyalashtirilgan ob'ekt (662-bet) ob'ekt ma'lumotlarini o'z ichiga olgan baytlar ketma-ketligi sifatida taqdim etiladi.
shuningdek, ob'ekt turi va u saqlaydigan ma'lumotlar turlari haqida ma'lumot.
• Seriyalashtirilgan obyekt faylga yozilgandan so‘ng uni fayldan o‘qish va seriyadan chiqarish mumkin
(662-bet) ob'ektni xotirada qayta yaratish uchun.
• ObjectInputStream (662-bet) va ObjectOutputStream (662-bet) sinflari butun ob'ektlarni
oqimdan o'qilishi yoki unga yozilishi (ehtimol fayl).
• Faqat Serializable interfeysini amalga oshiradigan sinflar (663-bet) seriyali va seriyali holga keltirilishi mumkin.
• ObjectOutput interfeysi (662-bet) WriteObject (663-bet) usulini o‘z ichiga oladi.
ject ni argument sifatida ishlatadi va o'z ma'lumotlarini OutputStream ga yozadi. Buni amalga oshiradigan sinf
ObjectOutputStream kabi interfeys, Ob'ektning seriyali bo'lishini ta'minlaydi.
• ObjectInput interfeysi (662-bet) o‘qiydi va qayta o‘qiydigan readObject (663-bet) usulini o‘z ichiga oladi.
InputStream dan ob'ektga havolani aylantiradi. Ob'ekt o'qilgandan so'ng, unga havola
ob'ektning haqiqiy turiga o'tkazilishi mumkin.
15.6-bo'lim JFileChooser yordamida fayllarni ochish
• JFileChooser klassi (670-bet) dastur foydalanuvchilariga osonlikcha ishlash imkonini beruvchi dialog oynasini ko‘rsatish uchun ishlatiladi.
GUI-dan fayllar yoki kataloglarni tanlang.
15.7-bo'lim (ixtiyoriy) Qo'shimcha java.io sinflari
• InputStream va OutputStream baytga asoslangan kiritish-chiqarishni bajarish uchun mavhum sinflardir.
• Quvurlar (673-bet) iplar orasidagi sinxronlashtirilgan aloqa kanallaridir. Bitta ip yuboriladi
PipedOutputStream orqali ma'lumotlar (673-bet). Maqsadli ip quvurdan ma'lumotni a orqali o'qiydi
PipedInputStream (673-bet).
• Filtr oqimi (674-bet) ma’lumotlar baytlarini yig‘ish kabi qo‘shimcha funksiyalarni ta’minlaydi.
mazmunli ibtidoiy tipdagi birliklar. FilterInputStream (674-bet) va FilterOutputStream yoziladi.
Kengaytirilgan, shuning uchun ularning ba'zi filtrlash imkoniyatlari o'zlarining aniq kichik sinflari bilan ta'minlangan.
• PrintStream (674-bet) matn chiqarishni amalga oshiradi. System.out va System.err - PrintStreams.
• Interface DataInput kirish oqimidan ibtidoiy turlarni o'qish usullarini tavsiflaydi. Sinflar
DataInputStream (674-bet) va RandomAccessFile har biri ushbu interfeysni amalga oshiradi.
• Interface DataOutput chiqish oqimiga ibtidoiy turlarni yozish usullarini tavsiflaydi. Sinflar
DataOutputStream (674-bet) va RandomAccessFile har biri ushbu interfeysni amalga oshiradi.
• Buferlash - bu I/U-ning ishlashini yaxshilash texnikasi. Buferlash kirish/chiqarish sonini kamaytiradi
xotirada kichikroq chiqishlarni birlashtirish orqali operatsiyalar. Jismoniy kiritish-chiqarish operatsiyalari soni
eratsiyalar dastur tomonidan chiqarilgan kiritish-chiqarish so'rovlari sonidan ancha kichikdir.
• BufferedOutputStream (674-bet) bilan har bir chiqish operatsiyasi katta buferga (674-bet) yo‘naltiriladi.
ko'plab chiqish operatsiyalari ma'lumotlarini saqlash uchun etarli. Chiqish qurilmasiga o'tkazish ichida amalga oshiriladi
bufer to'lganida bitta katta jismoniy chiqish operatsiyasi (674-bet). Qisman to'ldirilgan bufer bo'lishi mumkin
oqim ob'ektini yuvish usulini chaqirish orqali istalgan vaqtda qurilmaga majburan chiqarib yuboriladi (674-bet).
• BufferedInputStream (675-bet) yordamida fayldagi ma’lumotlarning ko‘p “mantiqiy” bo‘laklari bitta sifatida o‘qiladi.
xotira buferiga katta jismoniy kirish operatsiyasi (675-bet). Dastur ma'lumotlarni so'raganidek, u olinadi
buferdan. Bufer bo'sh bo'lganda, keyingi haqiqiy jismoniy kiritish operatsiyasi amalga oshiriladi.
• ByteArrayInputStream xotiradagi bayt massividan o'qiydi. ByteArrayOutputStream chiqadi
xotiradagi bayt massiviga.

O'z-o'zini tekshirish mashqlari 679



• SequenceInputStream bir nechta InputStreamlarni birlashtiradi. Dastur oxiriga yetganda
kirish oqimining oqimi yopiladi va ketma-ketlikdagi keyingi oqim ochiladi.
• Reader (675-bet) va Writer (675-bet) abstrakt sinflari Unicode belgilarga asoslangan oqimlardir.
Ko'pgina baytga asoslangan oqimlar tegishli belgilarga asoslangan aniq Reader yoki Writer sinflariga ega.
• BufferedReader (675-bet) va BufferedWriter (675-bet) sinflari belgilarga asoslangan oqimlarni buferlaydi.
• CharArrayReader (676-bet) va CharArrayWriter (676-bet) sinflari belgilar massivlarini manipulyatsiya qiladi.
• LineNumberReader (676-bet) o‘qilgan satrlar sonini kuzatuvchi buferlangan belgilar oqimidir.
• FileReader (676-bet) va FileWriter (676-bet) sinflari belgilarga asoslangan fayl kiritish-chiqarishni amalga oshiradi.
• PipedReader sinfi (676-bet) va PipedWriter sinfi (676-bet) quvurli belgilar oqimini amalga oshiradi
iplar o'rtasida ma'lumotlarni uzatish uchun.
• Class StringReader (676-bet) va StringWriter (676-bet) belgilarni o‘qiydi va belgilarni yozadi.
ters to Strings, mos ravishda. PrintWriter (654-bet) oqimga belgilar yozadi.
O'z-o'zini tekshirish mashqlari
15.1 Quyidagi gaplarning har biri to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) System.in, System.out va System.err oqim obyektlarini aniq yaratishingiz kerak.
b) Skaner sinfi yordamida fayldan ma'lumotlarni o'qiyotganda, agar siz fayldagi ma'lumotlarni o'qishni xohlasangiz, mul-
Vaqt o'tishi bilan fayl boshidan o'qish uchun fayl yopilishi va qayta ochilishi kerak.
c) mavjud fayllarning statik usuli Pathni oladi va uning mavjudligini aniqlaydi (yoki
fayl yoki katalog sifatida) diskda
d) Ikkilik fayllar matn muharririda odam o'qishi mumkin.
e) Mutlaq yo'l asosiy katalogdan boshlab barcha kataloglarni o'z ichiga oladi
ma'lum bir fayl yoki katalogga.
f) Class Formatter formatlangan ma'lumotlarni chiqarish imkonini beruvchi printf usulini o'z ichiga oladi
ekranga yoki faylga.
15.2 Quyidagi vazifalarni bajaring, ularning har biri bitta dasturga tegishli deb faraz qiling:
a) Kirish uchun "oldmast.txt" faylini ochadigan bayonot yozing - Skaner o'zgaruvchisidan foydalaning -
OldMaster.
b) Kirish uchun "trans.txt" faylini ochadigan bayonot yozing - Skaner o'zgaruvchisidan foydalaning -
Tranzaksiya.
c) Chiqarish (va yaratish) uchun "newmast.txt" faylini ochadigan bayonot yozing - uchun foydalaning
materiya o'zgaruvchisi outNewMaster.
d) “oldmast.txt” faylidan yozuvni o‘qish uchun zarur bo‘lgan gaplarni yozing. Ma'lumotlardan foydalaning
sinf ob'ektini yaratish uchun Account - OldMaster-da Skaner o'zgaruvchisidan foydalaning. Buni taxmin qiling
sinf Hisob 15.9-rasmdagi Hisob sinfi bilan bir xil.
e) “trans.txt” faylidan yozuvni o‘qish uchun zarur bo‘lgan gaplarni yozing. Rekord
TransactionRecord sinfining ob'ekti - Transactionda Skaner o'zgaruvchisidan foydalaning. Faraz qilaylik
bu sinf TransactionRecord o'rnatish uchun setAccount (int oladi) usulini o'z ichiga oladi
hisob raqami va summani belgilash uchun setAmount usuli (bu ikki baravar oladi).
tranzaktsiyadan.
f) “newmast.txt” fayliga yozuvni chiqaradigan bayonot yozing. Rekord ob-
Hisob turi ob'ekti - Formatter o'zgaruvchisidan outNewMaster foydalaning.
15.3 Quyidagi vazifalarni bajaring, ularning har biri bitta dasturga tegishli deb faraz qiling:
a) Kirish uchun "oldmast.ser" faylini ochadigan bayonot yozing - ObjectInputStream dasturidan foydalaning
InputStream ob'ektini o'rash uchun inOldMaster o'zgaruvchisi.
b) Kirish uchun "trans.ser" faylini ochadigan bayonot yozing - ObjectInputStream vari-dan foydalaning.
InputStream ob'ektini o'rash uchun inTransaction.

680 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish



c) Chiqish (va yaratish) uchun "newmast.ser" faylini ochadigan bayonot yozing - foydalanish
ObjectOutputStream o'zgaruvchisi OutputStreamni o'rash uchun outNewMaster.
d) "oldmast.ser" faylidan yozuvni o'qiydigan bayonot yozing. Rekord - bu
Hisob sinfining ob'ekti -OldMaster-da ObjectInputStream o'zgaruvchisidan foydalaning. Sinfni qabul qiling
Hisob 15.9-rasmdagi Hisob sinfi bilan bir xil
e) "trans.ser" faylidan yozuvni o'qiydigan bayonot yozing. Yozuv ob'ekt hisoblanadi
sinfning TransactionRecord - inTransaction ObjectInputStream o'zgaruvchisidan foydalaning.
f) “Newmast.ser” fayliga Hisob turidagi yozuvni chiqaradigan bayonot yozing—foydalanish.
ObjectOutputStream o'zgaruvchisi outNewMaster.
O'z-o'zini tekshirish mashqlariga javoblar
15.1 a) noto'g'ri. Java ilovasi ishga tusha boshlaganda ushbu uchta oqim siz uchun yaratiladi.
b) To'g'ri. c) To'g'ri. d) yolg'on. Matnli fayllar matn muharririda odamlar tomonidan o'qilishi mumkin. Ikkilik fayllar hu-
odam o'qilishi mumkin, lekin faqat fayldagi baytlar ASCII belgilarini ifodalasa. e) To'g'ri. f) yolg'on. Sinf
Formalagich formatlangan ma'lumotlarni ekranga yoki ekranga chiqarish imkonini beruvchi usul formatini o'z ichiga oladi
fayl.
15.2 a) OldMaster-dagi skaner = yangi skaner (Paths.get("oldmast.txt"));
b) Tranzaktsiyadagi skaner = yangi Skaner(Paths.get("trans.txt"));
c) Formatter outNewMaster = new Formatter("newmast.txt");
d) Hisob qaydnomasi = yangi hisob ();
account.setAccount(inOldMaster.nextInt());
account.setFirstName(inOldMaster.next());
account.setLastName(inOldMaster.next());
account.setBalance(inOldMaster.nextDouble());
e) TransactionRecord tranzaksiya = yangi tranzaksiya();
transaction.setAccount(inTransaction.nextInt());
transfer.setAmount(inTransaction.nextDouble());
f) outNewMaster.format("%d %s %s %.2f%n",
account.getAccount(), account.getFirstName(),
account.getLastName(), account.getBalance());
15.3 a) ObjectInputStream inOldMaster = yangi ObjectInputStream(
Files.newInputStream(Paths.get("oldmast.ser")));
b) ObjectInputStream inTransaction = yangi ObjectInputStream(
Files.newOutputStream(Paths.get("trans.ser")));
c) ObjectOutputStream outNewMaster = yangi ObjectOutputStream(
Files.newOutputStream(Paths.get("newmast.ser")));
d) Hisob = (Hisob) inOldMaster.readObject();
e) transactionRecord = (TransactionRecord) inTransaction.readObject();
f) outNewMaster.writeObject(newAccount);
Mashqlar
15.4 (Faylni moslashtirish) O'z-o'zini ko'rib chiqish mashqi 15.2 sizdan bir qator bitta bayonot yozishni so'radi.
Aslida, bu bayonotlar fayllarni qayta ishlash dasturining muhim turining yadrosini tashkil qiladi, ya'ni
fayllarni moslashtirish dasturi. Tijoriy ma'lumotlarni qayta ishlashda har birida bir nechta fayl bo'lishi odatiy holdir
dastur tizimi. Masalan, debitorlik qarzlari tizimida odatda asosiy fayl konfiguratsiyasi mavjud.
mijozning ismi, manzili, telefoni kabi har bir mijoz haqida batafsil ma'lumotni olish
raqam, to'lanmagan qoldiq, kredit limiti, chegirma shartlari, shartnoma shartlari va ehtimol a
so'nggi xaridlar va naqd to'lovlarning qisqacha tarixi.

681-mashqlar

Tranzaktsiyalar sodir bo'lganda (ya'ni, savdo amalga oshiriladi va to'lovlar pochta orqali keladi), haqida ma'lumot
ular faylga kiritiladi. Har bir ish davri oxirida (ayrim kompaniyalar uchun bir oy, a
boshqalar uchun hafta, ayrim hollarda esa bir kun), tranzaktsiyalar fayli ("trans.txt" deb ataladi) qo'llaniladi.
har bir hisobning xarid va toʻlov rekordini yangilash uchun asosiy fayl (“oldmast.txt” deb ataladi).
Yangilash vaqtida asosiy fayl "newmast.txt" fayli sifatida qayta yoziladi, keyinchalik u quyidagi manzilda ishlatiladi.
yangilash jarayonini qayta boshlash uchun keyingi ish davrining oxiri.
Fayllarni moslashtirish dasturlari bitta faylda yuzaga kelmaydigan ba'zi muammolar bilan shug'ullanishi kerak.
gramm. Misol uchun, o'yin har doim ham sodir bo'lmaydi. Agar asosiy faylda mijoz qilmagan bo'lsa
joriy ish davridagi har qanday xaridlar yoki naqd to'lovlar, bu mijoz uchun hech qanday yozuv bo'lmaydi
tranzaksiya faylida paydo bo'ladi. Xuddi shunday, ba'zi xaridlarni amalga oshirgan yoki naqd pul to'lagan mijoz -
mentlar endigina ushbu jamoaga ko'chib o'tishlari mumkin edi va agar shunday bo'lsa, kompaniyada bo'lmagan bo'lishi mumkin
ushbu mijoz uchun asosiy rekord yaratish imkoniyati.
To'liq faylga mos keladigan debitorlik dasturini yozing. Hisob raqamidan foydalaning
har bir fayl mos keladigan maqsadlar uchun yozuv kaliti sifatida. Har bir fayl ketma-ket matn fayli deb faraz qiling
hisob raqamini ko'paytirish tartibida saqlanadigan yozuvlar.
a) TransactionRecord sinfini aniqlang. Ushbu sinf ob'ektlari hisob raqamini o'z ichiga oladi va
tranzaktsiya uchun summa. Ushbu qiymatlarni o'zgartirish va olish usullarini taqdim eting.
b) 15.9-rasmdagi hisob sinfini o'zgartiring, bu esa Transaksiyani talab qiladigan birlashma usulini o'z ichiga oladi.
tionRecord ob'ekti va Hisob ob'ektining qoldig'i va qiymat miqdorini birlashtiradi.
TransactionRecord obyektining ue.
c) Dasturni sinab ko'rish uchun ma'lumotlar yaratish dasturini yozing. Namunaviy hisob ma'lumotlaridan foydalaning
Anjir. 15.14 va 15.15. Trans.txt va oldmast.txt fayllarini yaratish uchun dasturni ishga tushiring
faylni moslashtirish dasturingiz tomonidan foydalaniladi.

d) Fayllarni moslashtirish funksiyasini bajarish uchun FileMatch sinfini yarating. Sinf kerak


oldmast.txt va trans.txt o'qiydigan usullarni o'z ichiga oladi. O'yin sodir bo'lganda (ya'ni, qayta-
bir xil hisob raqamiga ega kordonlar asosiy faylda ham, tranzaksiyada ham ko'rinadi

Asosiy fayl


hisob raqami Ism Balans

100 Alan Jons 348.17


300 Meri Smit 27.19
500 Sam Sharp 0,00
700 Suzy Green -14.22

15.14-rasm | Asosiy fayl uchun namuna ma'lumotlar.

Tranzaksiya fayli
hisob raqami

Tranzaksiya


miqdori

100 27.14


300 62.11
400 100,56
900 82.17

15.15-rasm | Tranzaksiya fayli uchun namuna ma'lumotlari.


682 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish

fayl), operatsiya yozuvidagi dollar miqdorini massivdagi joriy balansga qo'shing.
ter yozib oling va "newmast.txt" yozuvini yozing. (Xaridlar ko'rsatilgan deb faraz qiling
tranzaksiya faylidagi ijobiy summalar va to'lovlar salbiy miqdorlar bo'yicha.) Qachon
ma'lum bir hisob uchun asosiy yozuv mavjud, ammo tegishli tranzaksiya yo'q.
shnur, faqat asosiy yozuvni "newmast.txt" ga yozing. Tranzaksiya qayta amalga oshirilganda
shnur, lekin tegishli asosiy yozuv yo'q, jurnal fayliga "Tegishlanmagan
hisob raqami uchun tranzaksiya yozuvi ..." (transportdan hisob raqamini to'ldiring.
harakat yozuvi). Jurnal fayli "log.txt" nomli matn fayli bo'lishi kerak.
15.5 (Bir nechta tranzaksiyalar bilan faylni moslashtirish) Bu mumkin (va aslida keng tarqalgan)
bir xil yozuv kaliti bilan bir nechta tranzaksiya yozuvlari. Bu holat, masalan, cus-
tomer biznes davrida bir nechta xaridlar va naqd to'lovlarni amalga oshiradi. Hisoblaringizni qayta yozing
15.4-mashqdan olingan debitorlik faylini moslashtirish dasturi.
bir xil qayd kaliti bilan tranzaksiya yozuvlari. CreateData.java test ma'lumotlarini in-
15.16-rasmdagi qo'shimcha bitim yozuvlarini kiriting.

15.6 (Obyektni ketma-ketlashtirish bilan faylni moslashtirish) 15.5-mashq uchun yechimingizni qayta yarating.


ob'ektni ketma-ketlashtirish. Ushbu dastur uchun asos sifatida 15.3-mashqdagi bayonotlardan foydalaning. Sizga mumkin
.ser fayllarida saqlangan ma'lumotlarni o'qish uchun ilovalar yaratmoqchi bo'lsangiz - 15.5.2-bo'limdagi kod
shu maqsadda o'zgartirilishi mumkin.
15.7 (Telefon raqami so'z generatori) Standart telefon klaviaturalarida nol raqamlari mavjud
to'qqiz orqali. Ikkidan to'qqizgacha bo'lgan raqamlarning har birida ular bilan bog'langan uchta harf mavjud
(15.17-rasm). Ko'pchilik telefon raqamlarini yodlashda qiynaladi, shuning uchun ular mos keladigan raqamlardan foydalanadilar.
ularning telefon raqamiga mos keladigan etti harfli so'zlarni ishlab chiqish uchun raqamlar va harflar o'rtasida
bers. Masalan, telefon raqami 686-2377 bo'lgan shaxs yozishmalardan foydalanishi mumkin
15.17-rasmda ko'rsatilgan etti harfli so'zni ishlab chiqish uchun "RAQAMLAR". Har etti harfli so'z
aniq yetti xonali telefon raqamiga javob beradi. Ovqatlanish hajmini oshirishni istagan restoran
Ishbilarmon buni 825-3688 raqami bilan amalga oshirishi mumkin (ya'ni, "TAKEOUT").

Har bir yetti harfli telefon raqami turli etti harfli so'zlarga to'g'ri keladi, lekin ko'pchilik


bu so'zlardan harflarning tanib bo'lmaydigan qo'shilishi ifodalanadi. Biroq, bu mumkin

Hisob raqami Dollar miqdori

300 83,89
700 80,78
700 1.53

15.16-rasm | Qo'shimcha tranzaksiya yozuvlari.

Raqamli harflar Raqamli harflar Raqamli harflar

2 ABC 5 JKL 8 TUV


3 DEF 6 MNO 9 WXY
4 GHI 7 PRS

15.17-rasm | Telefon klaviaturasidagi raqamlar va harflar.


Farq qilish 683



sartaroshxona egasi do'konning telefon raqamini bilishdan mamnun bo'lardi, 424-7288, kor-
“SOCH KERAK” ga javob beradi. 738-2273 telefon raqamiga ega veterinar mamnun bo'ladi
raqam "PETCARE" harflariga mos kelishini biling. Avtomobil sotuvchisi bo'lardi
Dilerlik raqami 639-2277 "NEWCARS" ga mos kelishini bilishdan mamnunman.
Etti xonali raqam berilgan holda, faylga yozish uchun PrintStream obyektidan foydalanadigan dastur yozing
bu raqamga mos keladigan har bir yetti harfli so'z birikmasi. 2187 (37) bor
bunday kombinatsiyalar. 0 va 1 raqamlari bo'lgan telefon raqamlaridan saqlaning.
15.8 (Talabalar so'rovi) 7.8-rasmda qattiq kodlangan so'rov javoblari to'plami mavjud.
dastur. Aytaylik, biz faylda saqlangan so'rov natijalarini qayta ishlashni xohlaymiz. Ushbu mashq talab qiladi
ikkita alohida dastur. Birinchidan, foydalanuvchini so'rov javoblarini taklif qiladigan dastur yarating va
faylga har bir javobni chiqaradi. Numbers.txt nomli faylni yaratish uchun Formatterdan foydalaning. Har bir butun son
usul formatidan foydalangan holda yozilishi kerak. Keyin so'rovni o'qish uchun 7.8-rasmdagi dasturni o'zgartiring
numbers.txt dan javoblar. Javoblar Skaner yordamida fayldan o'qilishi kerak. Foydalanish
fayldan bir vaqtning o'zida bitta butun sonni kiritish uchun nextInt usuli. Dastur o'qishni davom ettirishi kerak
fayl oxirigacha javob beradi. Natijalar matnli faylga chiqarilishi kerak "out-
put.txt".
15.9 (MyShape Drawing ilovasiga ob'ekt seriyasini qo'shish) 12.17-mashqni o'zgartirish
foydalanuvchiga chizmani faylga saqlash yoki fayldan oldingi chizmani yuklash imkonini beradi.
lash. Yuklash (fayldan ob'ektlarni o'qish uchun) va Saqlash (faylga ob'ektlarni yozish uchun) tugmalarini qo'shing. a foydalaning
Faylga yozish uchun ObjectOutputStream va fayldan o'qish uchun ObjectInputStream. ni yozing
writeObject (sinf ObjectOutputStream) usulidan foydalangan holda MyShape ob'ektlari massivi va massivni o'qing
readObject (ObjectInputStream) usuli yordamida. Ob'ektni ketma-ketlashtirish mexanizmi o'qishi mumkin yoki
butun massivlarni yozing - MyShape ob'ektlari massivining har bir elementini o'zgartirish shart emas
alohida. Faqatgina barcha shakllar seriyali bo'lishi talab qilinadi. Yuklash va Saqlash uchun
tugmalari bo'lsa, foydalanuvchiga shakllar saqlanadigan faylni tanlashga ruxsat berish uchun JFileChooser dan foydalaning yoki
undan o'qiladi. Foydalanuvchi dasturni birinchi marta ishga tushirganda, hech qanday shakl ko'rsatilmasligi kerak
ekran. Foydalanuvchi oldindan saqlangan faylni ochish yoki yangi shakllarni chizish orqali shakllarni ko'rsatishi mumkin.
Ekranda shakllar paydo bo'lgandan so'ng, foydalanuvchilar ularni Saqlash tugmasi yordamida faylga saqlashlari mumkin.
Farq qilish
15.10 (Phishing Scanner) Fishing identifikatorni o'g'irlashning bir turi bo'lib, unda elektron pochta orqali jo'natuvchi
Ishonchli manba sifatida foydalanuvchi nomlaringiz, parolingiz kabi shaxsiy ma'lumotlarni olishga harakat qiladi.
so'zlar, kredit karta raqamlari va ijtimoiy xavfsizlik raqami. Kimdan ekanligini da'vo qiluvchi fishing elektron pochta xabarlari
mashhur banklar, kredit karta kompaniyalari, auktsion saytlari, ijtimoiy tarmoqlar va onlayn to'lov xizmatlari
juda qonuniy ko'rinishi mumkin. Ushbu firibgar xabarlar ko'pincha soxta (soxta) veb-saytlarga havolalar beradi
sizdan maxfiy ma'lumotlarni kiritish so'raladigan joyda.
Fishing firibgarliklarini onlayn qidiring. Shuningdek, Anti-Fishing Ishchi Guruhi bilan tanishing
(www.antiphishing.org) va FQBning kiber tergov veb-sayti (www.fbi.gov/about-us/)
investigate/cyber/cyber), bu erda siz so'nggi firibgarliklar va ularni qanday himoya qilish haqida ma'lumot topasiz.
o'zingizni tekshirib ko'ring.
Fishing xabarlarida tez-tez uchraydigan 30 ta soʻz, ibora va kompaniya nomlaridan iborat roʻyxat tuzing.
Fishing xabarida bo'lish ehtimoli haqidagi taxminingiz asosida har biriga ball qiymatini belgilang
(Masalan, agar bu biroz ehtimol bo'lsa, bir ball, agar ehtimol o'rtacha bo'lsa, ikki ball yoki yuqori bo'lsa, uch ball
ehtimol). Ushbu atamalar va iboralar uchun matn faylini skanerlaydigan dastur yozing. Har bir hodisa uchun -
Matn faylida kalit so'z yoki ibora mavjud bo'lsa, umumiy ballga tayinlangan ball qiymatini qo'shing
bu so'z yoki ibora. Topilgan har bir kalit so'z yoki ibora uchun so'z yoki ibora bilan bitta qatorni chiqaring,
hodisalar soni va umumiy ball. Keyin butun xabar uchun umumiy ballni ko'rsating.
Sizning dasturingiz sizga kelgan ba'zi haqiqiy fishing elektron pochta xabarlariga yuqori ball beradimi? qiladi
u sizga kelgan ba'zi qonuniy elektron xatlarga yuqori ball beradimi?

16 ta umumiy toʻplamlar


Menimcha, bu eng ko'p
ning favqulodda to'plami
iste'dod, inson bilimi,
bu hech qachon yig'ilgan
Oq uyda birga -
mumkin bo'lgan istisnolardan tashqari
Tomas Jefferson tushlik qilganda
yolg'iz.
— Jon F. Kennedi

Oh maqsadlar


Ushbu bobda siz:
■ To'plamlar nima ekanligini bilib oling.
■ Massiv uchun massivlar sinfidan foydalaning
manipulyatsiyalar.
■ O'ram turini o'rganing
dasturlarni faollashtiradigan sinflar
ibtidoiy ma'lumotlarni qayta ishlash uchun
ob'ektlar sifatida qadriyatlar.
■ Oldindan tuzilgan umumiy ma'lumotlardan foydalaning
dan tuzilmalar
kollektsiyalar ramkasi.
■ Yurish uchun iteratorlardan foydalaning
orqali” to‘plami.
■ Doimiy xesh jadvallaridan foydalaning
ob'ektlari bilan manipulyatsiya qilingan
sinf xususiyatlari.
■ Sinxronizatsiya haqida bilib oling
va o'zgartiriladigan o'ramlar.

16.1 Kirish 685

16.1 Kirish
7.16-bo'limda biz umumiy ArrayList to'plamini taqdim etdik - dinamik ravishda o'lchamlarini o'zgartiruvchi.
Siz belgilagan turdagi ob'ektlarga havolalarni saqlaydigan massivga o'xshash ma'lumotlar strukturasi
ArrayList ni yaratasiz. Ushbu bobda biz Java to'plamini muhokama qilishni davom ettiramiz.
Boshqa ko'plab oldindan tuzilgan umumiy ma'lumotlar tuzilmalarini o'z ichiga olgan tions ramka.
To'plamlarning ba'zi misollari smartfoningizda saqlangan sevimli qo'shiqlaringiz yoki
media pleer, kontaktlar ro'yxati, karta o'yinida ushlab turgan kartalar, sizning a'zolaringiz
sevimli sport jamoasi va bir vaqtning o'zida maktabda o'qiyotgan kurslaringiz.
Biz har birining imkoniyatlarini e'lon qiladigan to'plamlar-ramka interfeyslarini muhokama qilamiz
to'plam turi, ushbu interfeyslarni amalga oshiradigan turli sinflar, yig'indini qayta ishlash usullari.
lection ob'ektlari va to'plamlarni "o'tadigan" iteratorlar.
Java SE 8
17-bob, Java SE 8 Lambdas va Streamsni oʻqib chiqqaningizdan soʻng siz uni qaytadan oʻrnatishingiz mumkin boʻladi.
16-bobning ko'plab misollari qisqaroq va oqlangan tarzda va shunday tarzda
bugungi ko'p yadroli tizimlarda ishlashni yaxshilash uchun ularni parallellashtirishni osonlashtiradi. In
23-bob, Parametrlilik, siz ko'p yadroli tizimda ishlashni qanday yaxshilashni o'rganasiz.
Java-ning parallel to'plamlari va parallel oqim operatsiyalaridan foydalangan holda.
16.2 To'plamlar haqida umumiy ma'lumot
To'plam - bu boshqa ob'ektlarga havolalarni o'z ichiga oladigan ma'lumotlar strukturasi - aslida ob'ekt.
ob'ektlar. Odatda, to'plamlar o'zaro bog'liqlikka ega bo'lgan har qanday turdagi ob'ektlarga havolalarni o'z ichiga oladi.
to'plamda saqlangan turga tegishli. To'plamlar-ramka interfeyslari
har xil turdagi to'plamlar bo'yicha umumiy bajariladigan operatsiyalarni e'lon qilish.
16.1-rasmda ba'zi to'plamlar ramka interfeyslari ro'yxati keltirilgan. ning bir nechta ilovalari
bu interfeyslar doirasida taqdim etiladi. Shuningdek, siz o'zingizning im-
qo'shimchalar.

16.1 Kirish


16.2 To'plamlar haqida umumiy ma'lumot
16.3 Turi-o‘rash sinflari
16.4 Autoboxing va Auto-Unboxing
16.5 Interfeyslar to'plami va klassi
To'plamlar
16.6 Ro'yxatlar
16.6.1 ArrayList va Iterator
16.6.2 Bog'langan ro'yxat
16.7 Yig'ish usullari
16.7.1 Usulni saralash
16.7.2 Usullarni aralashtirish
16.7.3 Teskari, to'ldirish, nusxalash usullari, maks
va min

16.7.4 BinarySearch usuli


16.7.5 AddAll usullari, chastota va
ajratilgan
16.8 java.util paketining stek klassi
16.9 Class PriorityQueue va interfeysi
Navbat
16.10 To'plamlar
16.11 Xaritalar
16.12 Xususiyatlar klassi
16.13 Sinxronlashtirilgan to'plamlar
16.14 O'zgartirilmaydigan to'plamlar
16.15 Referatni amalga oshirish
16.16 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar


686 16-bob Umumiy to'plamlar

Ob'ektga asoslangan to'plamlar
To'plamlar ramka sinflari va interfeyslari java.util paketining a'zolaridir. In
Java-ning dastlabki versiyalarida, to'plamlar ramka sinflari saqlanadi va faqat Ob'ektni boshqaradi
mos yozuvlar, to'plamda har qanday ob'ektni saqlash imkonini beradi, chunki barcha sinflar to'g'ridan-to'g'ri yoki
ob'ekt sinfidan bilvosita kelib chiqadi. Dasturlar odatda ma'lum turdagi ob'ektlarni qayta ishlashlari kerak.
ob'ektlar. Natijada, to'plamdan olingan Ob'ektga havolalar pastga tushirilishi kerak
dasturga ob'ektlarni to'g'ri qayta ishlashga imkon beradigan tegishli turdagi. Biz muhokama qilganimizdek
10-bobda, odatda, pastga tushirishdan qochish kerak.
Umumiy to'plamlar
Ushbu muammoni hal qilish uchun to'plamlar asosi generiklar imkoniyatlari bilan yaxshilandi.
Biz 7-bobda umumiy ArrayLists bilan tanishtirgan va biz muhokama qiladigan xususiyatlar
batafsilroq 20-bob, Umumiy sinflar va usullar. Generics sizga belgilash imkonini beradi
to'plamda saqlanadigan va kompilyatsiya vaqtining afzalliklarini beradigan aniq tur
turini tekshirish - agar siz noto'g'ri turlardan foydalansangiz, kompilyator xato xabarlarini chiqaradi
to'plamlar. Umumiy to'plamda saqlangan turni ko'rsatganingizdan so'ng, har qanday ma'lumot qayta
to'plamdan trieve bu turga ega bo'ladi. Bu aniq turga bo'lgan ehtiyojni yo'q qiladi
Agar havola qilingan ob'ekt mos kelmasa, ClassCastExceptionsni tashlashi mumkin bo'lgan translatsiyalar
turi. Bundan tashqari, umumiy to'plamlar Java kodi bilan orqaga qarab mos keladi
generiklar kiritilishidan oldin yozilgan.

To'plamni tanlash


Har bir to'plam uchun hujjatlar uning xotira talablari va usullarini muhokama qiladi.
elementlarni qo'shish va olib tashlash kabi operatsiyalar uchun odsning ishlash xususiyatlari,
elementlarni qidirish, elementlarni saralash va boshqalar. To'plamni tanlashdan oldin, ko'rib chiqing
Siz ko'rib chiqayotgan to'plam toifasi uchun onlayn hujjatlar (Set, Ro'yxat, Xarita,
Navbat va h.k.), keyin ilovangiz ehtiyojlariga eng mos keladigan dasturni tanlang.
19-bob, Qidirish, Saralash va Katta O, qanchalik qiyinligini tasvirlash uchun vositani muhokama qiladi

Interfeys tavsifi

To'plam To'plamlar ierarxiyasidagi ildiz interfeysi, qaysi interfeyslardan Set, Queue
va Ro'yxat olinadi.
O'rnatish Dublikatlarni o'z ichiga olmaydi.
Ro'yxat Ikki nusxadagi elementlarni o'z ichiga olishi mumkin bo'lgan tartiblangan to'plam.
Xarita Kalitlarni qiymatlar bilan bog'laydigan va ikki nusxadagi kalitlarni o'z ichiga olmaydi. Xarita
To'plamdan olinmaydi.
Queue Odatda kutish liniyasini modellashtiruvchi birinchi kelgan, birinchi chiqadigan kolleksiya; boshqa buyurtmalar
belgilanishi mumkin.

16.1-rasm | Ba'zi to'plamlar-ramka interfeyslari.

Yaxshi dasturlash amaliyoti 16.1
G'ildirakni qayta ixtiro qilishdan saqlaning - o'zingizning ma'lumotlar tuzilmalaringizni yaratish o'rniga,
Java to'plamlari ramkasidan ehtiyotkorlik bilan yaratilgan interfeyslar va to'plamlar
ko'pgina dastur talablariga javob berish uchun sinovdan o'tgan va sozlangan.

16.3 Turi-o‘rash sinflari 687

Algoritm o'z vazifasini bajarish uchun ishlaydi - ishlov beriladigan ma'lumotlar elementlari soniga qarab.
19-bobni o'qib bo'lgach, har bir to'plamning ishlash xususiyatini yaxshiroq tushunasiz.
onlayn hujjatlarda tavsiflanganidek teristika.
16.3 Turi-o‘rash sinflari
Har bir ibtidoiy tur (D-ilovada keltirilgan) tegishli turdagi o'rash sinfiga ega (in
java.lang paketi). Bu sinflar mantiqiy, bayt, belgi, ikkilik, float,
Butun, uzun va qisqa. Bu sizga ibtidoiy turdagi qiymatlarni ob'ektiv sifatida boshqarish imkonini beradi.
ob'ektlar. Bu juda muhim, chunki biz qayta ishlatadigan yoki ishlab chiqadigan ma'lumotlar tuzilmalari
16-21 boblar ob'ektlarni boshqaradi va almashadi - ular asosiy o'zgaruvchilarni boshqara olmaydi.
tirnash xususiyati beruvchi turlari. Biroq, ular o'rash tipidagi ob'ektlarni boshqarishi mumkin, chunki ev-
ery sinf oxir-oqibat Ob'ektdan kelib chiqadi.
Raqamli turdagi o'rash sinflarining har biri - Bayt, Qisqa, Integer, Long, Float va
Double - sinf raqamini kengaytiradi. Bundan tashqari, turdagi o'rash sinflari yakuniy sinflardir, shuning uchun siz
ularni uzaytira olmaydi. Ibtidoiy tiplarda usullar mavjud emas, shuning uchun a ga tegishli usullar
ibtidoiy tip mos keladigan o'rash turi sinfida joylashgan (masalan, parseInt usuli,
Stringni int qiymatiga aylantiruvchi Integer sinfida joylashgan).
16.4 Autoboxing va Auto-Unboxing
Java boks va unboxing konversiyalarini taqdim etadi, ular avtomatik ravishda primerlar o'rtasida aylanadi.
itive-type qiymatlari va type-wrapper ob'ektlari. Boks konvertatsiyasi a qiymatini o'zgartiradi
ibtidoiy turdagi mos keladigan o'rash sinfidagi ob'ektga. Qutidan ochiladigan konversiya -
sion turi o'rash sinfi ob'ektini mos keladigan primitiv qiymatiga o'zgartiradi
turi. Ushbu konvertatsiyalar avtomatik ravishda amalga oshiriladi - autoboxing va auto-un- deb ataladi.
boks. Quyidagi bayonotlarni ko'rib chiqing:

Bunday holda, autoboxing integerArray[0] ga int qiymatini (10) belgilashda sodir bo'ladi.


cause integerArray havolalarni int qiymatlariga emas, Integer obyektlariga saqlaydi. Avtomatik qutidan chiqarish
integerArray[0] ni int o'zgaruvchi qiymatiga belgilashda yuzaga keladi, chunki o'zgaruvchan qiymat
Integer obyektiga havola emas, balki int qiymatini saqlaydi. Boks konvertatsiyalari ham sodir bo'ladi
ibtidoiy mantiqiy qiymatlar yoki mantiqiy ob'ektlarga baholanishi mumkin bo'lgan shartlar. Ko'pchilik
16–21-boblardagi misollar ibtidoiy qiymatlarni saqlash va qayta tiklash uchun ushbu konversiyalardan foydalanadi.
ularni ma'lumotlar tuzilmalaridan sinab ko'ring.
16.5 Interfeyslar to'plami va sinflar to'plamlari
Interfeyslar to'plami ommaviy operatsiyalarni o'z ichiga oladi (ya'ni, bir butun bo'ylab bajariladigan operatsiyalar
yig'ish) ob'ektlarni (yoki elementlarni) qo'shish, tozalash va taqqoslash kabi operatsiyalar uchun
yig'ish. To'plamni massivga ham aylantirish mumkin. Bundan tashqari, interfeys Collec-
tion dasturga yurish imkonini beruvchi Iterator ob'ektini qaytaruvchi usulni taqdim etadi
to'plam orqali va iteratsiya paytida undan elementlarni olib tashlang. Biz sinfni muhokama qilamiz
16.6.1-bo'limdagi iterator. Interfeysni yig'ishning boshqa usullari dasturga imkon beradi
kollektsiya hajmini va to'plam bo'sh yoki yo'qligini aniqlang.

Integer[] integerArray = new Integer[5]; // integerArray yaratish


integerArray[0] = 10; // integerArray[0] ga Integer 10ni tayinlash
int qiymati = integerArray[0]; // Integerning int qiymatini oling

688 16-bob Umumiy to'plamlar



Class Collections boshqa operatsiyalarni qidirish, saralash va bajarish uchun statik usullarni taqdim etadi.
kollektsiyalar bo'yicha. 16.7-bo'lim To'plam usullari haqida ko'proq muhokama qiladi. Biz ham
To'plamni sinxronlash sifatida ko'rib chiqishga imkon beruvchi to'plamlarni o'rash usullari
ajratilgan to'plam (16.13-bo'lim) yoki o'zgartirilmaydigan to'plam (16.14-bo'lim). Sinxro-
nized to'plamlar multithreading bilan foydalanish uchun mo'ljallangan (23-bobda muhokama qilingan), bu
operatsiyalarni parallel ravishda bajarish uchun dasturlar. Dasturning ikki yoki undan ortiq mavzulari ulashganda
yig'ish, muammolar yuzaga kelishi mumkin. Analogiya sifatida transport chorrahasini ko'rib chiqing. Agar barcha mashinalar bo'lsa
bir vaqtning o'zida chorrahaga kirishga ruxsat berilsa, to'qnashuvlar yuz berishi mumkin. Buning uchun
Shuning uchun chorrahaga kirishni boshqarish uchun svetoforlar o'rnatilgan. Xuddi shunday, biz ham qila olamiz
to'plamga kirishni sinxronlashtiring, shunda faqat bitta ip to'plamni boshqaradi
bir vaqtning o'zida. To'plamlar sinfining sinxronlash o'rash usullari sinxronizatsiyani qaytaradi.
dasturdagi mavzular orasida bo'lishish mumkin bo'lgan to'plamlarning aniq versiyalari. O'zgartirib bo'lmaydi
to'plamlar sinf mijozlari to'plam elementlarini ko'rishlari kerak bo'lganda foydalidir, lekin ular
elementlarni qo'shish va olib tashlash orqali to'plamni o'zgartirishga ruxsat berilmasligi kerak.
16.6 Ro'yxatlar
Ro'yxat (ba'zan ketma-ketlik deb ataladi) takroriy nusxani o'z ichiga olishi mumkin bo'lgan tartiblangan To'plamdir
elementlar. Massiv indekslari singari, Ro'yxat indekslari ham nolga asoslangan (ya'ni, birinchi element indeksi
nol). To'plamdan meros bo'lib qolgan usullardan tashqari, List uchun usullar mavjud
elementlarni indekslari orqali manipulyatsiya qilish, elementlarning belgilangan diapazonini boshqarish;
elementlarni qidirish va elementlarga kirish uchun ListIteratorni olish.
Interfeyslar ro'yxati bir nechta sinflar tomonidan amalga oshiriladi, jumladan ArrayList, LinkedList
va Vektor. Avtobokslash bu ob'ektlarga ibtidoiy turdagi qiymatlarni qo'shganda sodir bo'ladi
sinflar, chunki ular faqat ob'ektlarga havolalarni saqlaydi. ArrayList va Vector sinflari
Ro'yxatning o'lchamini o'zgartiruvchi massiv ilovalari. Mavjud elementlar orasiga element kiritish
ArrayList yoki Vektorning ishlashi samarasiz operatsiya bo'lib, yangisidan keyingi barcha elementlar bo'lishi kerak
yo'ldan ko'chirilishi mumkin, a bilan to'plamda qimmat operatsiya bo'lishi mumkin
ko'p sonli elementlar. LinkedList elementlarni samarali kiritish (yoki olib tashlash) imkonini beradi.
to'plam o'rtasida joylashgan, lekin ArrayList uchun unumdorligidan ancha past
to'plamdagi ma'lum bir elementga o'tish. Biz bog'langan ro'yxatlar arxitekturasini muhokama qilamiz
21-bobda.
ArrayList va Vector deyarli bir xil xatti-harakatlarga ega. Vektor ustidagi amallar sin-
sukut bo'yicha xronlanadi, ArrayLists'dagilar esa bunday emas. Bundan tashqari, Vektor sinfi Java-dan olingan
1.0, Java-ga to'plamlar ramkasi qo'shilishidan oldin. Shunday qilib, Vektorning ba'zi usullari mavjud
interfeyslar ro'yxatining bir qismi bo'lmagan va ArrayList sinfida amalga oshirilmagan. Uchun
Masalan, Vektor usullari addElement va ikkalasi ham elementni Vektorga qo'shadi, lekin
faqat qo'shish usuli interfeys ro'yxatida ko'rsatilgan va ArrayList tomonidan amalga oshiriladi. Sinxronsiz

Dasturiy ta'minot muhandisligi kuzatuvi 16.1


To'plam odatda polimorflikka ruxsat berish usullarida parametr turi sifatida ishlatiladi
To'plam interfeysini amalga oshiradigan barcha ob'ektlarni qayta ishlash.

Dasturiy ta'minot muhandisligi kuzatuvi 16.2


Ko'pgina to'plam ilovalari To'plamni oladigan konstruktorni ta'minlaydi
argument, shu bilan elementlarni o'z ichiga olgan yangi to'plamni yaratishga imkon beradi
belgilangan to'plam.

16.6 Ro'yxatlar 689

nized to'plamlar sinxronlashtirilganlarga qaraganda yaxshiroq ishlashni ta'minlaydi. Shu sababli, Array-
To'plamni o'zaro baham ko'rmaydigan dasturlarda, odatda, ro'yxat Vektorga qaraganda afzalroqdir
iplar. Alohida-alohida, Java kolleksiyalari API sinxronizatsiya paketlarini taqdim etadi
(16.13-bo'lim) sinxronlashtirilmagan to'plamlarga sinxronizatsiya qo'shish uchun ishlatilishi mumkin,
va Java parallel API-larida bir nechta kuchli sinxronlashtirilgan to'plamlar mavjud.

Quyidagi uchta kichik bo'lim Ro'yxat va To'plam imkoniyatlarini namoyish etadi.


16.6.1-bo'lim iterator bilan ArrayList dan elementlarni olib tashlaydi. 16.6.2-bo'lim
ListIterator va bir nechta List va LinkedList-ga xos usullardan foydalanadi.
16.6.1 ArrayList va Iterator
16.2-rasmda bir nechta imkoniyatlarni ko'rsatish uchun ArrayList (7.16-bo'limda keltirilgan) qo'llaniladi.
interfeys qobiliyatlari to'plami. Dastur ArrayLists va ichiga ikkita Rangli massivni joylashtiradi
Ikkinchi ArrayList to'plamidagi elementlarni birinchisidan olib tashlash uchun Iteratordan foydalanadi.

Ishlash bo'yicha maslahat 16.1


ArrayLists sinxronizatsiyasiz Vektorlar kabi harakat qiladi va shuning uchun tezroq ishlaydi
Vektorlardan ko'ra, chunki ArrayLists-da ish zarralarini sinxronlashtirish uchun ortiqcha yuk yo'q.

Dasturiy ta'minot muhandisligi kuzatuvi 16.3


LinkedLists steklar, navbatlar va deklar yaratish uchun ishlatilishi mumkin (ikki tomonlama navbatlar,
talaffuz qilingan "pastki"). To'plamlar ramkasi ba'zilarini amalga oshirishni ta'minlaydi
bu ma'lumotlar tuzilmalari.

1 // 16.2-rasm: CollectionTest.java


2 // ArrayList obyekti orqali ko'rsatilgan to'plam interfeysi.
3 import java.util.List;
4 import java.util.ArrayList;
5 import java.util.Collection;
6 import java.util.Iterator;
7
8 ommaviy sinf CollectionTest
9 {
10 ta umumiy statik bekor asosiy (String [] args)
11 {
12 // ro'yxatga ranglar qatoridagi elementlarni qo'shing
13 string[] ranglari = {"MAGENTA", "QIZIL", "OQ", "KO'K", "MOVBIR"};
14
15
16 uchun (String rangi: ranglar)
17
18
19 // removeList uchun removeColors massiviga elementlar qo'shing
20 String[] removeColors = {"QIZIL", "OQ", "KO'K"};
21
22
23 uchun (String rangi: removeColors)
24
25

16.2-rasm | To'plam interfeysi ArrayList obyekti orqali ko'rsatilgan. (2-qismning 1-qismi.)

List list = new ArrayList();

list.add(rang); // ro'yxat oxiriga rang qo'shadi

List removeList = new ArrayList();

removeList.add(rang);


690 16-bob Umumiy to‘plamlar

13 va 20-qatorlar String massivlarining ranglarini e'lon qiladi va ishga tushiradi va Colorsni olib tashlaydi. Chiziqlar
14 va 21 ArrayList obyektlarini yaratadi va ularning havolalarini List ga tayinlaydi.
mos ravishda o'zgaruvchilar ro'yxati va removeList. Eslatib o'tamiz, ArrayList umumiy sinfdir, shuning uchun biz
har biridagi elementlarning turini ko'rsatish uchun turdagi argumentni (bu holda String) belgilashi mumkin
ro'yxati. Siz kompilyatsiya vaqtida to'plamda saqlash turini belgilaganingiz uchun, umumiy to'plam
kompilyatorga foydalanishga urinishlarni ushlash imkonini beruvchi kompilyatsiya vaqti turi xavfsizligini ta'minlaydi
noto'g'ri turlari. Masalan, siz Ishchilarni Strings to'plamida saqlay olmaysiz.
16–17 qatorlar qator ranglarida saqlangan satrlar bilan roʻyxatni toʻldiradi va 23–24-qatorlar ochiladi.
ulate removeList-ni List usulidan foydalanib, removeColors qatorida saqlangan satrlar bilan qo'shing.
29–30 qatorlar roʻyxatning har bir elementini chiqaradi. 29-qator qo'ng'iroqlar Ro'yxat usuli hajmini olish uchun
ArrayListdagi elementlar soni. 30-qatorda ma'lumotlarni olish uchun List usuli qo'llaniladi.

26 // ro'yxat tarkibini chiqarish


27 System.out.println("ArrayList: ");
28
29 uchun (int count = 0; count < ; count++)
30 System.out.printf("%s ", );
31
32 // removeList tarkibidagi ranglarni ro'yxatdan olib tashlang
33 rangni olib tashlash (ro'yxat, olib tashlash ro'yxati);
34
35 // ro'yxat mazmunini chiqarish
36 System.out.printf("%n%nArrayList, removeColors ni chaqirgandan keyin:%n");
37
38 uchun (String rangi: ro'yxat)
39 System.out.printf("%s ", rangli);
40 }
41
42 // to'plam2da ko'rsatilgan ranglarni to'plam1dan olib tashlang
43 ta shaxsiy statik bo'shliqni olib tashlashColors( ,
44)
45 {
46 // iteratorni oling
47
48
49 // to'plamda elementlar mavjud bo'lganda tsikl
50 vaqt ( )
51 {
52
53
54 }
55 }
56 } // yakuniy sinf CollectionTest

ArrayList:


MAGENTA QIZIL OQ KO'K SIAN

RemoveColors ni chaqirgandan keyin ArrayList:


MAGENTA CYAN

16.2-rasm | To'plam interfeysi ArrayList obyekti orqali ko'rsatilgan. (2-qismning 2-qismi.)

list.size()
list.get(hisoblash)

To'plam to'plami1

To'plam to'plami2

Iterator iterator = collection1.iterator();

iterator.hasNext()

agar (collection2.contains(iterator.next()))


iterator.remove(); // joriy elementni o'chirish

16.6 Ro'yxatlar 691

vidual element qiymatlari. 29-30 qatorlar kengaytirilgan for bayonotidan ham foydalanishi mumkin edi
(buni biz boshqa misollarda to'plamlar bilan ko'rsatamiz).
33-qator removeColors usulini chaqiradi (43–55-qatorlar), o'tish ro'yxati va removeList sifatida
argumentlar. RemoveColors usuli removeList-dagi satrlarni Stringlardan o'chiradi
ro'yxatda. 38–39 qatorlar, removeColors oʻz vazifasini bajargandan soʻng roʻyxat elementlarini chop eting.
RemoveColors usuli ikkita Collection parametrini e'lon qiladi (43-qatorlar).
44) - Stringlarni o'z ichiga olgan har qanday ikkita To'plam argument sifatida uzatilishi mumkin. Usul
Iterator orqali birinchi To'plamning (to'plam1) elementlariga kiradi. 47-qator qo'ng'iroqlar
To'plam uchun iteratorni olish uchun yig'ish usuli iteratori. Interfeyslar to'plami -
tion va Iterator umumiy turlardir. Loopni davom ettirish sharti (50-qator) chaqiradi
Takrorlash uchun ko'proq elementlar mavjudligini aniqlash uchun iterator usuli hasNext
orqali. HasNext usuli, agar boshqa element mavjud bo'lsa, "true" ni, aks holda "false" ni qaytaradi.
52-qatordagi if sharti havolani olish uchun yonidagi Iterator usulini chaqiradi
keyingi element, so'ngra ikkinchi To'plamning (to'plam2) tarkibidagi usulidan foydalanadi
collection2 keyingi tomonidan qaytarilgan elementni o'z ichiga oladi yoki yo'qligini aniqlang. Agar shunday bo'lsa, 53-qator qo'ng'iroq qiladi
Elementni Collection to'plamidan olib tashlash uchun iterator usulini olib tashlang1.

<> belgisi bilan xulosa yozing
14 va 21-qatorlar chapdagi ArrayList (ya'ni String) da saqlangan turni va
ishga tushirish bayonotlarining o'ng tomonlari. Java SE 7 bilan turdagi xulosa chiqarishni joriy qildi
<> notation - olmos belgisi sifatida tanilgan - ge-ni e'lon qiladigan va yaratadigan bayonotlarda
nerik tipidagi o'zgaruvchilar va ob'ektlar. Masalan, 14-qator quyidagicha yozilishi mumkin:

Bunday holda, Java deklaratsiyaning chap tomonidagi burchakli qavslardagi turdan foydalanadi (ya'ni,


String) deklaratsiyaning o'ng tomonida yaratilgan ArrayList-da saqlangan tur sifatida.
Ushbu bobdagi qolgan misollar uchun biz ushbu sintaksisdan foydalanamiz.
16.6.2 Bog'langan ro'yxat
16.3-rasmda LinkedLists bo'yicha turli operatsiyalar ko'rsatilgan. Dastur ikkitasini yaratadi
Satrlarning bog'langan ro'yxati. Bir Ro'yxatning elementlari boshqasiga qo'shiladi. Keyin hammasi
Satrlar bosh harfga aylantiriladi va bir qator elementlar o'chiriladi.

Umumiy dasturlash xatosi 16.1


Agar to'plam ushbu to'plam uchun iterator yaratilgandan keyin uning usullaridan biri bilan o'zgartirilsa,
Agar iterator darhol yaroqsiz bo'ladi - takrorlash bilan bajarilgan har qanday operatsiya.
tor darhol ishlamay qoladi va ConcurrentModificationException ni chiqaradi. Shu sababli,
iteratorlar "tez muvaffaqiyatsiz" deb aytiladi. Muvaffaqiyatsiz tez iteratorlar o'zgartiriladigan to'plamni ta'minlashga yordam beradi.
tion bir vaqtning o'zida ikki yoki undan ortiq iplar tomonidan boshqarilmaydi, bu esa uni buzishi mumkin
yig'ish. 23-bobda, Concurrency, siz bir vaqtning o'zida to'plamlar haqida bilib olasiz (paket
java.util.concurrent) bir vaqtning o'zida bir nechta iplar tomonidan xavfsiz boshqarilishi mumkin.
Dasturiy ta'minot muhandisligi kuzatuvi 16.4
Biz ushbu misoldagi ArrayLists-ga List o'zgaruvchilari orqali murojaat qilamiz. Bu bizning kodimizni ko'proq qiladi
moslashuvchan va o'zgartirish osonroq - agar biz keyinchalik LinkedLists yanada mos kelishini aniqlasak
tegishli, faqat biz ArrayList obyektlarini yaratgan satrlar (14 va 21-qatorlar) kerak
o'zgartirilishi kerak. Umuman olganda, siz to'plam ob'ektini yaratganingizda, ushbu ob'ektga a bilan murojaat qiling
mos keladigan yig'ish interfeysi turining o'zgaruvchisi.

List list = new ArrayList<>();


692 16-bob Umumiy to'plamlar

1 // 16.3-rasm: ListTest.java
2 // Ro'yxatlar, LinkedLists va ListIterators.
3 import java.util.List;
4 import java.util.LinkedList;
5 import java.util.ListIterator;
6
7 umumiy sinf ListTest
8 {
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 // ro'yxatga rang elementlarini qo'shing1
12 qator [] ranglar =
13 {"qora", "sariq", "yashil", "ko'k", "binafsha", "kumush"};
14 List list1 = new LinkedList<>();
15
16 uchun (String rangi: ranglar)
17
18
19 // ro'yxatga rang2 elementlarni qo'shing2
20 qator [] ranglar2 =
21 {"oltin", "oq", "jigarrang", "ko'k", "kulrang", "kumush"};
22 List list2 = new LinkedList<>();
23
24 uchun (String rangi: ranglar2)
25
26
27
28 ro'yxat2 = null; // resurslarni chiqarish
29 bosma roʻyxat (roʻyxat 1); // ro'yxat 1 elementlarini chop etish
30
31 convertToUppercaseStrings(roʻyxat1); // katta harflar qatoriga aylantirish
32 bosma roʻyxat (roʻyxat 1); // ro'yxat 1 elementlarini chop etish
33
34 System.out.printf("%n4 dan 6 gacha elementlarni o'chirish...");
35 ta o'chirish elementlari (ro'yxat 1, 4, 7); // ro'yxatdan 4-6 bandlarni olib tashlang
36 bosma roʻyxat (roʻyxat 1); // ro'yxat 1 elementlarini chop etish
37 printReversedList(ro'yxat1); // ro'yxatni teskari tartibda chop etish
38 }
39
40 // ro'yxat mazmunini chiqarish
41 shaxsiy statik bekor bosma roʻyxat( )
42 {
43 System.out.printf("%nlist:%n");
44
45 uchun (String rangi: ro'yxat)
46 System.out.printf("%s ", rang);
47
48 System.out.println();
49 }
50
51 // String obyektlarini toping va bosh harfga aylantiring
52 ta xususiy statik void convertToUppercaseStrings( )
53 {

16.3-rasm | Ro'yxatlar, LinkedLists va ListIterators. (2-qismning 1-qismi.)

list1.qo‘shish(rang);

list2.add(rang);

list1.addAll(ro'yxat2); // ro'yxatlarni birlashtirish

List ro'yxati

List ro'yxati

16.6 Ro'yxatlar 693

14 va 22-qatorlar String tipidagi LinkedLists ro'yxati1 va list2 ni yaratadi. LinkedList - bu
bir turdagi parametrga ega bo'lgan umumiy sinf, biz String turi argumentini belgilaymiz
bu misolda. 16–17 va 24–25 qatorlar roʻyxat usulidan elementlarni qoʻshish uchun qoʻshiladi
ranglar va ranglar2 massivlarini mos ravishda list1 va list2 ning oxiriga joylashtiradi.
27-qator ro'yxat 2 ning barcha elementlarini ro'yxat 1 oxiriga qo'shish uchun ro'yxat usuli addAllni chaqiradi.
28-qator ro'yxat2ni nullga o'rnatadi, chunki list2 endi kerak emas. 29-qatorni chaqirish usuli
list1 mazmunini chiqarish uchun printList (41–49-qatorlar). 31-qatorni chaqirish usuli
Har bir String elementini bosh harfga aylantirish uchun convertToUppercaseStrings (52–61-qatorlar),
keyin 32-qator o'zgartirilgan Stringlarni ko'rsatish uchun printList-ni yana chaqiradi. 35-qator qo'ng'iroq qilish usuli

54
55


56 vaqt ( )
57 {
58
59
60 }
61 }
62
63 // pastki ro'yxatni oling va pastki ro'yxat elementlarini o'chirish uchun aniq usuldan foydalaning
64 ta shaxsiy statik bo'shliqni olib tashlash elementlari( ,
65 int start, int end)
66 {
67
68 }
69
70 // teskari ro'yxatni chop etish
71 shaxsiy statik bekor chop ReversedList( )
72 {
73
74
75 System.out.printf("%nReversed List:%n");
76
77 // ro'yxatni teskari tartibda chop etish
78 ( )
79 System.out.printf("%s ", );
80 }
81 } // yakuniy sinf ListTest

ro'yxat:
qora sariq yashil ko'k binafsha kumush oltin oq jigarrang ko'k kulrang kumush

ro'yxat:
QORA SARIQ YASHIL KO‘K BINFUSAT KUMUSH OLTINA OQ QUVAR KO‘K KULUZ KUMUSH

4 dan 6 gacha elementlar o‘chirilmoqda...


ro'yxat:
QORA SARI YASHIL KO‘K OQ QUVAR KO‘K KULU KUMUSH

Teskari ro'yxat:


KUMUSH KULONG KO‘K QO‘NGAR OQ KO‘K YASHIL SARIQ QORA

16.3-rasm | Ro'yxatlar, LinkedLists va ListIterators. (2-qismning 2-qismi.)

ListIterator iterator = list.listIterator();

iterator.hasNext()

String rangi = iterator.next(); // elementni oling
iterator.set(color.toUpperCase()); // katta harfga aylantirish

List roʻyxati

list.subList(boshlash, tugatish).clear(); // elementlarni o'chirish

List roʻyxati

ListIterator iterator = list.listIterator(list.size());

iterator.hasPrevious()


iterator.previous()

694 16-bob Umumiy to'plamlar



RemoveItems (64–68-qatorlar) indeks 4 dan boshlab elementlar oraligʻini olib tashlash uchun, lekin
ro'yxatning 7 indeksini hisobga olmaganda. 37-qator chaqiruv usuli printReversedList (71–80-qatorlar)
ro'yxatni teskari tartibda chop etish uchun.
ConvertToUppercaseStrings usuli
convertToUppercaseStrings usuli (52–61-qatorlar) kichik harflarni oʻzgartiradi String elementlari
uning List argumentida katta harflar Strings. 54-qator List usuli listIterator-ga qo'ng'iroq qiladi
Ro'yxatning ikki yo'nalishli iteratorini oling (ya'ni, Ro'yxatni orqaga yoki orqaga aylantira oladigan)
palata). ListIterator ham umumiy sinfdir. Ushbu misolda ListIterator havola qiladi
String ob'ektlari, chunki listIterator usuli Stringlar ro'yxatida chaqiriladi. 56-qator qo'ng'iroqlar
ro'yxatda boshqa element mavjudligini aniqlash uchun hasNext usuli. 58-qatorni oladi
Ro'yxatdagi keyingi qator. 59-qator bosh harfni olish uchun String usulini UpperCase ga chaqiradi
String versiyasi va joriy Stringni almashtirish uchun ListIterator usulini chaqiradi
iterator toUpperCase usuli bilan qaytarilgan Stringga ishora qiladi. O'xshash usul
toUpperCase, String usuli toLowerCase Stringning kichik harfli versiyasini qaytaradi.
Elementlarni olib tashlash usuli
RemoveItems usuli (64–68-qatorlar) roʻyxatdan bir qator elementlarni olib tashlaydi. 67-qator qo'ng'iroqlar
Ro'yxatning bir qismini (pastki ro'yxat deb ataladi) olish uchun ro'yxat usuli subList. Bu a deyiladi
dasturga ro'yxatning bir qismini ko'rish imkonini beruvchi diapazonni ko'rish usuli. Pastki ro'yxat
Bu shunchaki pastki ro'yxat chaqiriladigan Ro'yxatning ko'rinishi. Metod sublist argu-
pastki ro'yxatning boshi va oxiri indeksini ko'rsatadi. Yakunlovchi indeks qismi emas
pastki ro'yxat diapazoni. Ushbu misolda 35-satr boshlang'ich indeks uchun 4 va 7 uchun o'tadi
pastki ro'yxatga yakunlovchi indeks. Qaytarilgan pastki ro'yxat - indekslari 4 dan bo'lgan elementlar to'plami
6. Keyinchalik, dastur elementlarini olib tashlash uchun pastki ro'yxatdagi List usulini tozalashni chaqiradi
Ro'yxatdagi pastki ro'yxat. Quyi roʻyxatga kiritilgan har qanday oʻzgartirishlar asl roʻyxatga ham kiritiladi.
PrintReversedList usuli
PrintReversedList usuli (71–80-qatorlar) roʻyxatni orqaga qarab chop etadi. 73-qator qo'ng'iroqlar ro'yxati
argument sifatida boshlang'ich pozitsiyasi bilan usullar ro'yxatiIterator (bizning holatda, oxirgi element-
roʻyxat uchun ikki yoʻnalishli iteratorni olish uchun. Ro'yxat usuli hajmi qaytaradi
Ro'yxatdagi elementlar soni. while sharti (78-qator) ListIterator-ning hasPre- ni chaqiradi.
Ro'yxatni orqaga o'tishda ko'proq elementlar mavjudligini aniqlashning ajoyib usuli
palata. 79-qator oldingi elementni olish uchun ListIteratorning oldingi usulini chaqiradi
ro'yxatni chiqaradi va uni standart chiqish oqimiga chiqaradi.
To'plamlar va massivlardagi ko'rishlar ro'yxati
Sinf massivlari massivni ko'rish uchun statik usul asList bilan ta'minlaydi (ba'zan orqa deb ataladi).
ing array) roʻyxat toʻplami sifatida. Ro'yxat ko'rinishi massivni xuddi xuddi shunday boshqarishga imkon beradi
ro'yxat. Bu massivdagi elementlarni to'plamga qo'shish va massivni saralash uchun foydalidir
elementlar. Keyingi misol, Ro'yxat ko'rinishida LinkedListni qanday yaratishni ko'rsatadi
massivning, chunki biz massivni LinkedList konstruktoriga o‘tkaza olmaymiz. Saralash massivi
Ro'yxat ko'rinishidagi elementlar 16.7-rasmda ko'rsatilgan. orqali qilingan har qanday o'zgartirishlar
Ro'yxat ko'rinishi massivni o'zgartiradi va massivga kiritilgan har qanday o'zgartirishlar Ro'yxatni o'zgartiradi
ko'rinish. AsList tomonidan qaytarilgan ko'rinishda ruxsat etilgan yagona operatsiya o'rnatiladi, u o'zgaradi
ko'rinish va qo'llab-quvvatlovchi massivning qiymati. Ko'rinishni o'zgartirishga boshqa har qanday urinishlar (masalan
elementlarni qo'shish yoki olib tashlash kabi) UnsupportedOperationExceptionga olib keladi.

16.6 Ro'yxatlar 695

Massivlarni ro‘yxat sifatida ko‘rish va ro‘yxatlarni massivlarga aylantirish
16.4-rasmda massivni Ro‘yxat sifatida ko‘rish uchun asList Massivlar usuli va List usulidan foydalaniladi.
LinkedList to'plamidan massiv olish uchun toArray. Dastur asList usulini chaqiradi
LinkedList ob'ektini ishga tushirish uchun ishlatiladigan massivning Ro'yxat ko'rinishini yaratish uchun, keyin qo'shadi
LinkedList-ga bir qator qatorlar va massiv mosligini olish uchun toArray usulini chaqiradi.
Stringlarga havolalar olish.

12-qator massiv ranglari elementlarini o'z ichiga olgan Linked List Strings tuzadi.


Massivlar usuli asList massivning Ro'yxat ko'rinishini qaytaradi, so'ngra uni ishga tushirish uchun ishlatadi
LinkedList oʻzining konstruktori bilan Toʻplamni argument sifatida qabul qiladi (Roʻyxat - bu
To'plam). 14-qator havolalar oxiriga "qizil" qo'shish uchun AddLast LinkedList usulini chaqiradi.
15–16 qatorlar LinkedList usulini chaqiradi va oxirgi element sifatida "pushti" va "yashil" qo'shiladi.
3-indeksdagi element sifatida (ya'ni, to'rtinchi element). AddLast usuli (14-qator) funktsiyalari

1 // 16.4-rasm: ToArray.java dan foydalanish


2 // Massivlarni Ro'yxatlar sifatida ko'rish va Ro'yxatlarni massivlarga aylantirish.
3 import java.util.LinkedList;
4 import java.util.Arrays;
5
6 umumiy sinf UseToArray
7 {
8 // LinkedList ni yaratadi, elementlarni qo'shadi va massivga o'zgartiradi
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 qator [] ranglar = {"qora", "ko'k", "sariq"};
12
13
14
15
16
17
18
19
20
21
22 System.out.println("ranglar: ");
23
24 uchun (String rangi: ranglar)
25 System.out.println(rangli);
26 }
27 } // ToArray yordamida sinfni tugatish

ranglar:
zangori


qora
ko'k
sariq
yashil
qizil
pushti

16.4-rasm | Massivlarni Ro‘yxat sifatida ko‘rish va Ro‘yxatlarni massivlarga aylantirish.

LinkedList havolalari = yangi LinkedList<>(Arrays.asList(ranglar));

links.addLast("qizil"); // oxirgi element sifatida qo'shing


links.add("pushti"); // oxiriga qo'shing
links.add(3, "yashil"); // uchinchi indeksga qo'shing
links.addFirst("moviy"); // birinchi element sifatida qo'shing

// LinkedList elementlarini massiv sifatida oling


ranglar = links.toArray(yangi String[links.size()]);

696 16-bob Umumiy to'plamlar

qo'shish usuli bilan bir xil (15-qator). 17-qator qo'shish uchun LinkedList addFirst usulini chaqiradi
"Cyan" LinkedList-dagi yangi birinchi element sifatida. Qo'shish operatsiyalariga ruxsat berilgan, chunki
ular asList tomonidan qaytarilgan ko'rinishda emas, balki LinkedList obyektida ishlaydi. [Izoh: qachon
Birinchi element sifatida "ko'k" qo'shiladi, "yashil" esa beshinchi elementga aylanadi
Bog'langan ro'yxat.]
20-qator havolalardan String massivini olish uchun List interfeysining toArray usulini chaqiradi. The
massiv - ro'yxat elementlarining nusxasi - massiv tarkibini o'zgartirish ro'yxatni o'zgartirmaydi.
toArray usuliga uzatilgan massiv siz toArray usulini xohlaganingiz bilan bir xil turdagi
qaytish. Agar massivdagi elementlar soni elementlar sonidan katta yoki teng bo'lsa,
LinkedList-dagi toArray ro'yxat elementlarini massiv argumentiga ko'chiradi va
bu massivni qaytaradi. Agar LinkedList tarkibidagi elementlar sonidan ko'proq elementlar bo'lsa
toArray ga uzatilgan massiv, toArray argument sifatida qabul qiladigan bir xil turdagi yangi massivni ajratadi.
ment, roʻyxat elementlarini yangi massivga koʻchiradi va yangi massivni qaytaradi.

16.7 Yig'ish usullari


Class Collections to'plamni manipulyatsiya qilish uchun bir nechta yuqori samarali algoritmlarni taqdim etadi.
tsion elementlari. Algoritmlar (16.5-rasm) statik usullar sifatida amalga oshiriladi. Metod -
Ro'yxatlar bo'yicha tartiblash, binarySearch, teskari, aralashtirma, to'ldirish va nusxa ko'chirish. Usullari
To'plamlarda min, maks, addAll, chastota va disjoint ishlaydi.

Umumiy dasturlash xatosi 16.2


Ma'lumotlarni o'z ichiga olgan massivni toArray-ga o'tkazish mantiqiy xatolarga olib kelishi mumkin. Agar soni
massivdagi elementlar ro'yxatdagi elementlar sonidan kichikroq
chaqirilsa, ro'yxat elementlarini saqlash uchun yangi massiv ajratiladi - ar-ni saqlamasdan.
ray argumentining elementlari. Agar massivdagi elementlar soni sonidan ko'p bo'lsa
ro'yxatdagi elementlardan iborat bo'lsa, massiv elementlari (indeks noldan boshlanadi) ustiga yoziladi
ro'yxat elementlari bilan. Ustiga yozilmagan massiv elementlari o'z qiymatlarini saqlab qoladi.

Usul tavsifi

sort Roʻyxat elementlarini tartiblaydi.
binarySearch Yuqori samarali ikkilik qidiruv algoritmidan foydalanib, ob'ektni Ro'yxatda joylashtiradi.
biz 7.15-bo'limda tanishtirdik va 19.4-bo'limda batafsil muhokama qilamiz.
teskari Roʻyxat elementlarini teskari oʻzgartiradi.
aralashtirish Ro'yxat elementlarini tasodifiy buyurtma qiladi.
to'ldirish Har bir Ro'yxat elementini belgilangan ob'ektga murojaat qilish uchun o'rnatadi.
nusxa Bir roʻyxatdagi havolalarni boshqasiga koʻchiradi.
min To'plamdagi eng kichik elementni qaytaradi.
max To'plamdagi eng katta elementni qaytaradi.
addAll Massivdagi barcha elementlarni To'plamga qo'shadi.
chastota Ko'rsatilgan elementga qancha yig'ish elementlari teng ekanligini hisoblaydi.
disjoint Ikki to'plamda umumiy elementlar yo'qligini aniqlaydi.

16.5-rasm | To'plam usullari.


16.7 To'plamlar usullari 697

16.7.1 Usulni saralash
Usul saralash Ro'yxatning elementlarini tartiblaydi, ular taqqoslanadigan o'zaro bog'liqlikni amalga oshirishi kerak.
yuz. Tartib elementlarning amalga oshirilgan turining tabiiy tartibi bilan belgilanadi
solishtirish usuli bilan. Masalan, son qiymatlar uchun tabiiy tartib ortib bormoqda
Tartibi va Stringlarning tabiiy tartibi ularning leksikografik tartibiga asoslanadi
(14.3-bo'lim). Method compareTo Comparable interfeysida e'lon qilinadi va ba'zan bo'ladi
tabiiy taqqoslash usuli deb ataladi. Saralash chaqiruvi ikkinchi argument sifatida ko'rsatilishi mumkin a
Elementlarning muqobil tartibini belgilaydigan taqqoslash ob'ekti.
O'sish tartibida saralash
16.6-rasmda Roʻyxat elementlarini oʻsish tartibida tartiblash uchun Toʻplamlar usulidan foydalaniladi.
buyurtma (17-qator). Tartiblash usuli iterativ birlashmani amalga oshiradi (biz takroriy tartibni ko'rsatdik)
19.8-bo'limda birlashtirish tartibi). 14-qator ro'yxatni Stringlar ro'yxati sifatida yaratadi. 15 va qatorlar
18 har biri roʻyxat mazmunini chiqarish uchun roʻyxatning toString usuliga yashirin chaqiruvdan foydalanadi
chiqishda ko'rsatilgan format.

Kamayish tartibida saralash


16.7-rasmda 16.6-rasmda qo'llanilgan satrlarning bir xil ro'yxati kamayish tartibida tartiblangan. Misol
To'plam elementlarini saralash uchun ishlatiladigan Comparator interfeysini taqdim etadi

Dasturiy ta'minot muhandisligi kuzatuvi 16.5


To'plamlar ramka usullari polimorfikdir. Ya'ni, har biri ob'ektlar ustida ishlashi mumkin
asosiy ilovalardan qat'i nazar, maxsus interfeyslarni amalga oshiradigan.

1 // 16.6-rasm: Sort1.java


2 // To'plamlarni tartiblash usuli.
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 ommaviy sinf Saralash1
8 {
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 torli [] kostyumlar = {"Yuraklar", "Olmoslar", "Klublar", "Spades"};
12
13 // kostyumlar massivi elementlarini o'z ichiga olgan ro'yxatni yarating va ko'rsating
14 List list = Arrays.asList(suits);
15 System.out.printf("Tartiblanmagan massiv elementlari: %s%n", ro'yxat);
16
17
18 System.out.printf("Tartiblangan massiv elementlari: %s%n", ro'yxat);
19 }
20 } // tugatish sinfi Sort1

Saralanmagan massiv elementlari: [Yuraklar, olmoslar, klublar, belkuraklar]


Saralangan massiv elementlari: [Klublar, olmoslar, yuraklar, belkuraklar]

16.6-rasm | To'plamlarni saralash usuli.

Collections.sort(ro'yxat); // ArrayListni tartiblash

698 16-bob Umumiy to'plamlar

boshqacha tartib. 18-qator Ro'yxatni pasayish bo'yicha tartiblash uchun Collections usulini saralaydi -
buyurtma. Statik Collections usuli reverseOrder Comparator obyektini qaytaradi
Bu kollektsiya elementlarini teskari tartibda tartibga soladi.

Comparator yordamida saralash


16.8-rasmda TimeComparator nomli moslashtirilgan Comparator klassi yaratilgan, u amalga oshiradi
Ikki Time2 ob'ektini solishtirish uchun interfeys Comparator. Sinf vaqti2, 8.5-rasmda e'lon qilingan, rep-
vaqtlarni soatlar, daqiqalar va soniyalar bilan norozi qiladi.

1 // 16.7-rasm: Sort2.java


2 // Tartiblash usuli bilan solishtiruvchi obyektdan foydalanish.
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 umumiy sinf Sort2
8 {
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 torli [] kostyumlar = {"Yuraklar", "Olmoslar", "Klublar", "Spades"};
12
13 // kostyumlar massivi elementlarini o'z ichiga olgan ro'yxatni yarating va ko'rsating
14 List list = Arrays.asList(suits); // Ro'yxat yaratish
15 System.out.printf("Tartiblanmagan massiv elementlari: %s%n", ro'yxat);
16
17
18
19 System.out.printf("Tartiblangan ro'yxat elementlari: %s%n", ro'yxat);
20 }
21 } // tugatish sinfi Sort2

Saralanmagan massiv elementlari: [Yuraklar, olmoslar, klublar, belkuraklar]


Saralangan roʻyxat elementlari: [Spades, Hearts, Diamonds, Clubs]

16.7-rasm | Collections usuli Comparator obyekti bilan tartiblash.

1 // 16.8-rasm: TimeComparator.java
2 // Ikki Time2 ob'ektini solishtiradigan Custom Comparator klassi.
3 import java.util.Comparator;
4
5 ta umumiy sinf TimeComparator dasturlari
6 {
7 @Bekor qilish
8 umumiy int solishtirish( , )
9 {
10 int soatDifference = time1.getHour() - time2.getHour();
11
12 if (hourDifference != 0) // avval soatni sinab ko'ring
13 qaytish soati solishtiring;

16.8-rasm | Ikki Time2 ob'ektini solishtiradigan Custom Comparator klassi. (2-qismning 1-qismi.)

// komparator yordamida kamayish tartibida tartiblash
Collections.sort(ro'yxat, Collections.reverseOrder());

Taqqoslovchi

Vaqt2 vaqt1 Vaqt2 vaqt2

16.7 To'plamlar usullari 699

Class TimeComparator umumiy turdagi Comparator interfeysini qo'llaydi
bir turdagi argument (bu holda Time2). Comparatorni amalga oshiradigan sinf e'lon qilishi kerak
ikki argumentni qabul qiladigan va agar birinchi bo'lsa, manfiy butun sonni qaytaradigan taqqoslash usuli
argument ikkinchidan kichik, agar argumentlar teng bo'lsa 0 yoki birinchi bo'lsa musbat butun son
argument ikkinchisidan kattaroqdir. Taqqoslash usuli (7-22-qatorlar) taqqoslashni amalga oshiradi
Time2 ob'ektlari orasida. 10-qator ikkalasining soatlari orasidagi farqni hisoblab chiqadi
Vaqt 2 ob'ektlari. Agar soatlar boshqacha bo'lsa (12-qator), unda biz bu qiymatni qaytaramiz. Agar bu qiymat bo'lsa
ijobiy bo'lsa, birinchi soat ikkinchidan va birinchi soatdan kattaroq bo'ladi
ikkinchi. Agar bu qiymat salbiy bo'lsa, unda birinchi soat ikkinchi va birinchi martadan kamroq
ikkinchisidan kamroq. Agar bu qiymat nolga teng bo'lsa, soatlar bir xil bo'ladi va biz uni sinab ko'rishimiz kerak
Qaysi vaqt kattaroq ekanligini aniqlash uchun daqiqalar (va ehtimol soniyalar).
16.9-rasmda TimeComparator moslashtirilgan Comparator sinfidan foydalanib ro'yxat tartiblangan. 11-qator
Time2 obyektlarining ArrayListini yaratadi. Eslatib o'tamiz, ArrayList ham, List ham umumiydir
turlari va to'plamning element turini ko'rsatadigan tip argumentini qabul qiladi. Chiziqlar
13–17 beshta Time2 ob'ektini yarating va ularni ushbu ro'yxatga qo'shing. 23-qator qo'ng'iroqlar usulini saralash,
uni bizning TimeComparator sinfimiz ob'ektini o'tkazish (16.8-rasm).

14
15 int minuteDifference = time1.getMinute() - time2.getMinute();


16
17 agar (minuteDifference != 0) // keyin daqiqani sinab ko'ring
18 qaytish daqiqasi Farq;
19
20 int secondDifference = time1.getSecond() - time2.getSecond();
21 ikkinchi farqni qaytarish;
22 }
23 } // oxirgi sinf TimeComparator

1 // 16.9-rasm: Sort3.java


2 // To'plamlar usuli moslashtirilgan Comparator ob'ekti bilan tartiblash.
3 import java.util.List;
4 import java.util.ArrayList;
5 import java.util.Collections;
6
7 ommaviy sinf Sort3
8 {
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 List list = new ArrayList<>(); // Ro'yxat yaratish
12
13 list.add(yangi Vaqt2(6, 24, 34));
14 list.add(yangi Vaqt2(18, 14, 58));
15 list.add(yangi Vaqt2(6, 05, 34));
16 list.add(yangi Vaqt2(12, 14, 58));
17 list.add(yangi Vaqt2(6, 24, 22));
18

16.9-rasm | To'plamlar usuli moslashtirilgan Comparator obyekti bilan tartiblash. (2-qismning 1-qismi.)

16.8-rasm | Ikki Time2 ob'ektini solishtiradigan Custom Comparator klassi. (2-qismning 2-qismi.)

700 16-bob Umumiy to‘plamlar

16.7.2 Usullarni aralashtirish
Aralash usuli tasodifiy ro'yxat elementlarini buyurtma qiladi. 7-bobda kartani aralashtirish ko'rsatilgan
va halqa bilan kartalar to'plamini aralashtirgan diling simulyatsiyasi. 16.10-rasmda usuldan foydalaniladi
karta o'yini simulyatorida ishlatilishi mumkin bo'lgan karta ob'ektlari palubasini aralashtirib yuborish.

19 // ro'yxat elementlarini chiqarish


20 System.out.printf("Tartiblanmagan massiv elementlari:%n%s%n", ro'yxat);
21
22
23 Collections.sort(ro‘yxat, yangi TimeComparator());
24
25 // ro'yxat elementlarini chiqarish
26 System.out.printf("Tartiblangan ro'yxat elementlari:%n%s%n", ro'yxat);
27 }
28 } // end sinf Sort3

Saralanmagan massiv elementlari:


[6:24:34, 18:14:58, 6:05:34, 12:14:58, 6:24:22]
Saralangan ro'yxat elementlari:
[6:05:34, 6:24:22, 6:24:34, 12:14:58, 18:14:58]

1 // 16.10-rasm: DeckOfCards.java


2 // Kartalarni aralashtirish va Collections usuli bilan ishlash.
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 // kartani kartalar to'plamida ifodalash uchun sinf
8-sinf kartasi
9 {
10 umumiy statik raqam Yuz {Ace, Deuce, Three, Four, Five, Six,
11 Etti, Sakkiz, To'qqiz, O'n, Jek, Qirolicha, Qirol};
12 umumiy statik enum Suit {Klublar, olmoslar, yuraklar, belkuraklar};
13
14 shaxsiy yakuniy yuz;
15 ta shaxsiy final kostyum kostyumi;
16
17 // konstruktor
18 ta umumiy karta (yuz, kostyum kostyumi)
19 {
20 this.face = face;
21 this.suit = kostyum;
22 }
23
24 // kartaning qaytish yuzi
25 ommaviy yuz getFace()
26 {

16.10-rasm | Kartalarni aralashtirish va Collections usuli bilan ishlash. (3-qismning 1-qismi.)

16.9-rasm | To'plamlar usuli moslashtirilgan Comparator obyekti bilan tartiblash. (2-qismning 2-qismi.)

// solishtirgich yordamida tartiblash


16.7 Yig'ish usullari 701

27 qaytish yuzi;
28 }
29
30 // Kartani qaytarish kostyumi
31 davlat kostyumi getSuit()
32 {
33 qaytarish kostyumi;
34 }
35
36 // Kartaning string tasvirini qaytarish
37 ommaviy string toString()
38 {
39 return String.format("%s of %s", yuz, kostyum);
40 }
41 } // oxirgi sinf kartasi
42
43 // sinf DeckOfCards deklaratsiyasi
44 umumiy sinf DeckOfCards
45 {
46 shaxsiy ro'yxat ro'yxati; // Kartalarni saqlaydigan Ro'yxatni e'lon qilish
47
48 // Kartalar palubasini o'rnating va aralashtiramiz
49 ta umumiy DeckOfCards()
50 {
51 Card[] pastki = yangi karta[52];
52 int soni = 0; // kartalar soni
53
54 // Karta ob'ektlari bilan pastki to'ldirish
( : Card.Suit.values()) uchun 55
56 {
( : Card.Face.values()) uchun 57
58 {
59 deck[hisoblash] = yangi karta (yuz, kostyum);
60 ++ hisoblash;
61 }
62 }
63
64
65
66 } // DeckOfCards konstruktorini tugatish
67
68 // chiqish paneli
69 ommaviy bekor chop etish kartalari()
70 {
71 // 52 ta kartani ikkita ustunda ko'rsatish
72 uchun (int i = 0; i < list.size(); i++)
73 System.out.printf("%-19s%s", list.get(i),
74 ((i + 1) % 4 == 0) ? "% n" : "");
75 }
76
77 umumiy statik bekor asosiy (String [] args)
78 {

16.10-rasm | Kartalarni aralashtirish va Collections usuli bilan ishlash. (3 qismning 2-qismi.)

Karta. Kostyum kostyumi

Karta. Yuz

list = Arrays.asList(pastki); // Ro'yxatni oling
Collections.shuffle(ro'yxat); // palubani aralashtirib yuborish

702 16-bob Umumiy to‘plamlar

Sinf kartasi (8-41-qatorlar) kartalar to'plamidagi kartani ifodalaydi. Har bir kartaning yuzi bor
kostyum. 10-12-qatorlar yuz va yuzni ifodalovchi ikkita raqam turini - Face va Suitni bildiradi.
mos ravishda kartaning kostyumi. toString usuli (37–40-qatorlar) Stringni qaytaradi.
Kartaning yuzi va kostyumi "ning" qatori bilan ajratiladi. Enum birlashganda
stant Stringga aylantiriladi, doimiy identifikator String sifatida ishlatiladi
vakillik. Odatda enum konstantalari uchun barcha bosh harflardan foydalanardik. Bunda
Masalan, biz har bir enum konstantasining faqat birinchi harfi uchun bosh harflardan foydalanishni tanladik
chunki biz karta yuz va kostyum uchun bosh harflar bilan ko'rsatilishini xohlaymiz
(masalan, "Ace of Spades").
55–62-qatorlar paluba massivini noyob yuz va kostyumga ega kartalar bilan to'ldiradi.
ikkilanishlar. Face va Suit ikkala sinf kartasining umumiy statik sanab turidir. Bulardan foydalanish uchun
sinfdan tashqaridagi enum turlari Card, har bir enum turi nomini nom bilan belgilashingiz kerak
u joylashgan sinfning (ya'ni, Card) va nuqta (.) ajratuvchisi. Demak, 55 va 57 qatorlar
for bayonotlarining nazorat o'zgaruvchilarini e'lon qilish uchun Card.Suit va Card.Face dan foydalaning. Eslab qoling
enum tipidagi usul qiymatlari barcha konstantalarni o'z ichiga olgan massivni qaytaradi
enum turi. 55-62 qatorlar 52 ta yangi kartani yaratish uchun kengaytirilgan bayonotlardan foydalanadi.
Aralashtirish 65-qatorda sodir bo'ladi, bu sinfning statik usulini aralashtirishni chaqiradi
Massiv elementlarini aralashtirish uchun to'plamlar. Usul aralashish uchun List argu-
ment, shuning uchun biz massivni aralashtirishdan oldin uning List ko'rinishini olishimiz kerak. 64-qator chaqiradi
statik usul sifatida, pastki massivning Ro'yxat ko'rinishini olish uchun sinf massivlari ro'yxati.
PrintCards usuli (69–75-qatorlar) kartalar toʻplamini toʻrtta ustunda koʻrsatadi. Har birida
tsiklning takrorlanishi, 73–74 qatorlar 19 belgidan iborat maydonda oqlangan chap kartani chiqaradi
hozirgacha chiqarilgan kartalar soniga asoslangan yangi qator yoki bo'sh qator orqali. Agar
kartalar soni 4 ga bo'linadi, yangi qator chiqariladi; aks holda, bo'sh satr chiqariladi.
16.7.3 Teskari, to'ldirish, nusxalash, maks va min usullari
Class Collections ro'yxatlarni teskari o'zgartirish, to'ldirish va nusxalash usullarini taqdim etadi. To'plamlar
teskari usul Ro'yxatdagi elementlar tartibini o'zgartiradi va to'ldirish usuli qayta yozadi

79 DeckOfCards kartalari = yangi DeckOfCards();


80 ta karta.printCards();
81 }
82 } // oxirgi sinf DeckOfCards

Klublar Deuce Olti belku To'qqiz olmos o'n yurak


Olmoslarning uchtasi Klublarning beshtasi Olmoslarning beshtasi Klublarning ettitasi
Three of Spades Oltita olmos Klublar qiroli Jek of Hearts
O'nta belku Olmos qiroli Sakkiz belkurak oltita yurak
Klublardan to'qqizta olmosdan o'nta olmosdan sakkiztadan sakkizta yurakdan
Klublar o'nta yuraklari Beshta klublar Ace of Hearts
Olmos malikasi Olmos Ace of Clubs To'qqiz yurak
Ace of Spades Deuce of Spades Ace of Hearts Jek olmos
Olmosning yettisi Yurakning uchtasi, kurakning to'rttasi, olmosning to'rttasi
Etti belku Yuraklar shohi Yetti yurak Olmos beshtasi
Klublarning sakkiztasi Klublarning uchtasi Klublar malikasi
Klublarning oltitasi To'qqizta belkurakning to'rttasi, Jek of Clubs
Beshta belkurak shohi Jack of spades qiroli yuraklar malikasi

16.10-rasm | Kartalarni aralashtirish va Collections usuli bilan ishlash. (3 qismning 3-qismi.)


16.7 Yig'ish usullari 703

Belgilangan qiymatga ega ro'yxatdagi elementlar. To'ldirish operatsiyasi a.ni qayta ishga tushirish uchun foydalidir
Roʻyxat. Usul nusxasi ikkita argumentni oladi - maqsad ro'yxati va manbalar ro'yxati. Har biri
manba Ro'yxat elementi maqsad ro'yxatiga ko'chiriladi. Mo‘ljal ro‘yxati shu yerda bo‘lishi kerak
kamida manbalar ro'yxatigacha; aks holda IndexOutOfBoundsException yuzaga keladi. Agar
maqsad ro'yxati uzunroq, ustiga yozilmagan elementlar o'zgarmaydi.
Biz hozirgacha ko'rgan har bir usul Ro'yxatlarda ishlaydi. Min va max usullari har biri ishlaydi
har qanday to'plamda. Min usuli To'plamdagi eng kichik elementni qaytaradi va
max usuli To'plamdagi eng katta elementni qaytaradi. Bu usullarning ikkalasi ham bo'lishi mumkin
maxsus taqqoslashlarni amalga oshirish uchun ikkinchi argument sifatida Comparator obyekti bilan chaqiriladi
ob'ektlar, masalan, 16.9-rasmdagi TimeComparator. 16.11-rasmda usullar ko'rsatilgan
teskari, to'ldirish, nusxalash, maksimal va min.

1 // 16.11-rasm: Algoritmlar1.java


2 // To'plamlar usullari teskari, to'ldirish, nusxalash, maks va min.
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 umumiy sinf Algoritmlari1
8 {
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 // Ro'yxat yaratish va ko'rsatish
12 ta belgi [] harf = {'P', 'C', 'M'};
13 Ro'yxat ro'yxati = Arrays.asList(harflar); // Ro'yxatni oling
14 System.out.println("ro'yxatda: ");
15 chiqish (ro'yxat);
16
17 // teskari aylantiring va Ro'yxatni ko'rsating
18
19 System.out.printf("%nTeskari chaqiruvdan so'ng, ro'yxatda:%n");
20 chiqish (ro'yxat);
21
22 // 3 ta belgidan iborat massivdan copyList yarating
23 Belgi[] lettersCopy = yangi belgi[3];
24 List copyList = Arrays.asList(letterCopy);
25
26 // ro'yxat tarkibini copyList-ga nusxalash
27
28 System.out.printf("%nNusxa olingandan so'ng, nusxa ko'chirish ro'yxatida:%n");
29 chiqish (nusxa roʻyxati);
30
31 // ro'yxatni Rs bilan to'ldiring
32
33 System.out.printf("%nTo'ldirishni chaqirgandan so'ng, ro'yxatda:%n");
34 chiqish (ro'yxat);
35 }
36
37 // ro'yxat ma'lumotlarini chiqarish
38 ta xususiy statik bekor chiqish (Roʻyxat listRef)
39 {

16.11-rasm | To'plamlar usullari teskari, to'ldirish, nusxalash, maks va min. (2-qismning 1-qismi.)

Collections.reverse(ro'yxat); // elementlarni teskari tartiblash

Collections.copy(nusxa ro'yxati, ro'yxat);

Collections.fill(ro'yxat, 'R');

704 16-bob Umumiy to'plamlar

13-qator Ro'yxat o'zgaruvchilar ro'yxatini yaratadi va uni Ro'yxat ko'rinishi bilan ishga tushiradi.
Belgilar massivi harflari. 14–15 qatorlar Ro‘yxatning joriy mazmunini chiqaradi. Chiziq
18 qo'ng'iroqlar Ro'yxat tartibini o'zgartirish uchun Collections usuli teskari. Usul teskari oladi
bitta ro'yxat argumenti. Roʻyxat massiv harflarining Roʻyxat koʻrinishi boʻlgani uchun massiv elementlari ham shundaydir
endi teskari tartibda. Teskari tarkib 19-20 qatorlarda chiqariladi. 27-qator Col-dan foydalanadi
lections usuli nusxa ko'chirish ro'yxat elementlarini copyList-ga nusxalash. Nusxalash roʻyxatiga oʻzgartirishlar kiritiladi
harflarni o'zgartirmang, chunki copyList massivning Ro'yxat ko'rinishi bo'lmagan alohida Ro'yxatdir
harflar. Usul nusxasi ikkita Ro'yxat argumentini talab qiladi - maqsad ro'yxati va
manbalar ro'yxati. 32-qator har birida 'R' belgisini joylashtirish uchun To'plamlar usulini to'ldirishni chaqiradi
ro'yxat elementi. Roʻyxat massiv harflarining Roʻyxat koʻrinishi boʻlgani uchun bu operatsiya oʻzgaradi
Har bir element "R" ga harflar bilan yoziladi. Toʻldirish usuli birinchi argument uchun Roʻyxatni talab qiladi va
Ikkinchi argument uchun Ob'ekt - bu holda Ob'ekt -ning qutidagi versiyasidir
"R" belgisi. 45–46-qatorlar eng katta va eng kattasini topish uchun Collections usullari max va minni chaqiradi
mos ravishda To'plamning eng kichik elementi. Eslatib o'tamiz, interfeys ro'yxati kengaytirilgan
interfeysi To'plam, shuning uchun Ro'yxat to'plamdir.

16.7.4 BinarySearch usuli


Yuqori tezlikdagi ikkilik qidiruv algoritmi - biz 19.4-bo'limda batafsil muhokama qilamiz -
Java to'plamlari ramkasiga binarySearch statik Collections usuli sifatida o'rnatilgan.
Ushbu usul ob'ektni Ro'yxatdagi (masalan, LinkedList yoki ArrayList) joylashtiradi. Agar ob'ekt
topilsa, uning indeksi qaytariladi. Agar ob'ekt topilmasa, binarySearch salbiyni qaytaradi

40 System.out.print("Ro'yxat: ");


41
42 uchun (Belgi elementi: listRef)
43 System.out.printf("%s ", element);
44
45 System.out.printf("%nMax: %s", );
46 System.out.printf(" Min: %s%n", );
47 }
48 } // yakuniy sinf Algoritmlari1

ro'yxat quyidagilarni o'z ichiga oladi:


Ro'yxat: PCM
Maks: P Min: C

Orqaga qo'ng'iroq qilgandan so'ng, ro'yxat quyidagilarni o'z ichiga oladi:


Ro'yxat: MCP
Maks: P Min: C

Nusxalashdan so'ng copyList quyidagilarni o'z ichiga oladi:


Ro'yxat: MCP
Maks: P Min: C

Chaqiruvdan so'ng to'ldirish ro'yxati quyidagilarni o'z ichiga oladi:


Ro'yxat: RRR
Maks: R Min: R

16.11-rasm | To'plamlar usullari teskari, to'ldirish, nusxalash, maks va min. (2-qismning 2-qismi.)

Collections.max(listRef)
Collections.min(listRef)

16.7 Yig'ish usullari 705

qiymat. BinarySearch usuli bu salbiy qiymatni avval qo'shishni hisoblash orqali aniqlaydi.
tion nuqtasi va uning belgisini manfiy qilish. Keyin binarySearch qo'shimchadan 1ni ayiradi.
Qaytish qiymatini olish uchun tion nuqtasi, bu ikkilik qidiruv usulining qaytishini kafolatlaydi
musbat raqamlar (>= 0), agar ob'ekt topilgan bo'lsa. Ro'yxatda bir nechta element bo'lsa
qidiruv kalitiga mos kelsa, qaysi biri birinchi bo'lib joylashishiga kafolat yo'q. 16.12-rasm
ArrayListdagi qator qatorlarni qidirish uchun binarySearch usulidan foydalanadi.

1 // 16.12-rasm: BinarySearchTest.java


2 // To'plamlar usuli binarySearch.
3 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6 import java.util.ArrayList;
7
8 umumiy sinf BinarySearchTest
9 {
10 ta umumiy statik bekor asosiy (String [] args)
11 {
12 // Ranglar massivi tarkibidan ArrayList yarating
13 qator [] ranglar = {"qizil", "oq", "ko'k", "qora", "sariq",
14 "binafsharang", "to'ng'iz", "pushti"};
15 List list =
16 yangi ArrayList<>(Arrays.asList(ranglar));
17
18
19 System.out.printf("Tartiblangan ArrayList: %s%n", ro'yxat);
20
21 // turli qiymatlarni qidirish ro'yxati
22 printSearchResults(ro'yxat, "qora"); // birinchi element
23 printSearchResults(ro'yxat, "qizil"); // o'rta element
24 printSearchResults(roʻyxat, “pushti”); // oxirgi element
25 printSearchResults(ro'yxat, "aqua"); // eng pastdan past
26 printSearchResults(roʻyxat, “kulrang”); // mavjud emas
27 printSearchResults(roʻyxat, “koʻk”); // mavjud emas
28 }
29
30 // qidiruvni amalga oshirish va natijani ko'rsatish
31 ta shaxsiy statik bekor chopSearchResults(
32 List roʻyxati, String key)
33 {
34 int natija = 0;
35
36 System.out.printf("%nIzlash: %s%n", kalit);
37
38
39 agar (natija >= 0)
40 System.out.printf("%d%n indeksida topildi", natija);
yana 41
42 System.out.printf("Topilmadi (%d)%n", natija);
43 }
44 } // oxirgi sinf BinarySearchTest

16.12-rasm | To'plamlar usuli binarySearch. (2-qismning 1-qismi.)

Collections.sort(ro'yxat); // ArrayListni tartiblang

natija = Collections.binarySearch(ro'yxat, kalit);


706 16-bob Umumiy to'plamlar

15–16-qatorlar roʻyxatdagi elementlarning nusxasini oʻz ichiga olgan ArrayList bilan ishga tushiradi
massiv ranglari. To'plamlar usuli binarySearch o'zining List argumenti elementlarini kutadi
o'sish tartibida tartiblanadi, shuning uchun 18-qator ro'yxatni saralash uchun To'plamlar saralash usulidan foydalanadi. Agar
Roʻyxat argumenti elementlari tartiblanmagan, binarySearch dan foydalanish natijasi aniqlanmagan. Chiziq
19 tartiblangan ro'yxatni chiqaradi. 22-27-qatorlar qo'ng'iroq qilish usuli printSearchResults (31-43-qatorlar)
qidiruvlarni amalga oshiring va natijalarni chiqaring. 37-qator qo'ng'iroqlar Collections usuli binarySearch
belgilangan kalit uchun ro'yxatni qidirish uchun. BinarySearch usuli birinchi argument sifatida Ro'yxatni oladi
va ikkinchi argument sifatida Ob'ekt. 39-42 qatorlar qidiruv natijalarini chiqaradi. An
binarySearch ning haddan tashqari yuklangan versiyasi o'zining uchinchi argumenti sifatida Comparator ob'ektini oladi
binarySearch qidiruv kalitini Ro'yxat elementlari bilan qanday solishtirish kerakligini belgilaydi.
16.7.5 AddAll usullari, chastota va ajratilgan
Class Collections shuningdek addAll, chastota va disjoint usullarini taqdim etadi. To'plash -
addAll usuli ikkita argumentni oladi - yangisini kiritish uchun to'plam
element(lar) va kiritiladigan elementlarni ta'minlovchi massiv. To'plamlar usuli
quency ikkita argumentni oladi - qidiriladigan to'plam va qidiriladigan ob'ekt
kollektsiya uchun. Usul chastotasi ikkinchi marta takrorlanish sonini qaytaradi.
to'plamda gument paydo bo'ladi. Collections usuli disjoint ikkita To'plamni oladi
va agar ularda umumiy elementlar bo'lmasa, true qiymatini qaytaradi. 16.13-rasmda foydalanish ko'rsatilgan
addAll usullari, chastota va disjoint.

Saralangan qatorlar roʻyxati: [qora, koʻk, pushti, binafsha, qizil, sargʻish, oq, sariq]


Qidirilmoqda: qora
0 indeksida topilgan
Qidirilmoqda: qizil
4-indeksda topilgan
Qidirilmoqda: pushti
2-indeksda topilgan
Qidirilmoqda: aqua
Topilmadi (-1)
Qidirilmoqda: kulrang
Topilmadi (-3)
Qidirilmoqda: teal
Topilmadi (-7)

1 // 16.13-rasm: Algoritmlar2.java


2 // to'plamlar usullari addAll, chastota va disjoint.
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.Arrays;
6 import java.util.Collections;

16.13-rasm | To'plamlar usullari addAll, chastota va disjoint. (2-qismning 1-qismi.)

16.12-rasm | To'plamlar usuli binarySearch. (2-qismning 2-qismi.)

16.7 To'plamlar usullari 707

14-qator massiv ranglaridagi elementlar bilan ro'yxat 1ni ishga tushiradi va 17-19 qatorlar qatorlarni qo'shadi
"qora", "qizil" va "yashil" ro'yxatga 2. 27-qator elementlarni qo'shish uchun addAll usulini chaqiradi
2 ro'yxatiga massiv ranglarida. 36-qator ro'yxat 2 da "qizil" satr chastotasini oladi
usul chastotasi. 41-qator To'plamlar ro'yxati1 yoki yo'qligini tekshirish uchun disjoint usulini chaqiradi
va list2 ning umumiy elementlari bor, ular bu misolda shunday qilishadi.

7
8 umumiy sinf Algoritmlari2


9 {
10 ta umumiy statik bekor asosiy (String [] args)
11 {
12 // list1 va list2 ni ishga tushiring
13 qator [] ranglar = {"qizil", "oq", "sariq", "ko'k"};
14 List list1 = Arrays.asList(ranglar);
15 ArrayList list2 = new ArrayList<>();
16
17 list2.add("qora"); // ro'yxat 2 oxiriga "qora" qo'shing
18 list2.add("qizil"); // ro'yxat 2 oxiriga "qizil" qo'shing
19 list2.add("yashil"); // ro'yxat 2 oxiriga "yashil" qo'shing
20
21 System.out.print("Barchasini qo'shishdan oldin, ro'yxat 2 quyidagilarni o'z ichiga oladi: ");
22
23 // 2 ro'yxatdagi elementlarni ko'rsatish
24 uchun (String s : list2)
25 System.out.printf("%s ", s);
26
27
28
29 System.out.printf("%nAll add'dan keyin 2 ro'yxatda quyidagilar mavjud: ");
30
31 // 2-ro'yxatdagi elementlarni ko'rsatish
32 uchun (String s : list2)
33 System.out.printf("%s ", s);
34
35
36
37
38
39
40
41
42
43 System.out.printf("roʻyxat 1 va roʻyxat2 %s elementlar umumiy%n",
44 (ajralgan ? "yo'q" : "bor"));
45 }
46 } // yakuniy sinf Algoritmlari2

AddAlldan oldin roʻyxat 2 quyidagilarni oʻz ichiga oladi: qora qizil yashil


AddAlldan keyin roʻyxat 2 quyidagilarni oʻz ichiga oladi: qora qizil yashil qizil oq sariq koʻk
2-ro'yxatdagi qizil rangning chastotasi: 2
list1 va list2 umumiy elementlarga ega

16.13-rasm | To'plamlar usullari addAll, chastota va disjoint. (2-qismning 2-qismi.)

Collections.addAll(ro'yxat2, ranglar); // 2-ro'yxatga ranglar qo'shing

// "qizil" chastotasini olish


int chastotasi = Collections.frequency(ro'yxat2, "qizil");
System.out.printf(
"% n2 ro'yxatdagi qizilning chastotasi: %d% n", chastota);

// list1 va list2 umumiy elementlar mavjudligini tekshiring


mantiqiy disjoint = Collections.disjoint(ro'yxat1, ro'yxat2);

708 16-bob Umumiy to'plamlar

16.8 java.util paketining stek klassi
Usul chaqiruvini muhokama qilganimizda biz 6.6-bo'limda stek tushunchasini kiritdik
stack. 21-bobda, Shaxsiy umumiy ma'lumotlar tuzilmalarida biz ma'lumotlar tuzilmasini qanday yaratishni o'rganamiz.
bog'langan ro'yxatlar, steklar, navbatlar va daraxtlarni o'z ichiga olgan turlar. Dasturiy ta'minotni qayta ishlatish dunyosida, o'rniga
Bizga kerak bo'lgan ma'lumotlar tuzilmalarini qurishda biz ko'pincha mavjud ma'lumotlar tuzilmasidan foydalanishimiz mumkin.
turlar. Ushbu bo'limda biz Java yordam dasturlari paketidagi (java.util) Stack sinfini o'rganamiz.
Class Stack stek ma'lumotlar strukturasini amalga oshirish uchun Vektor sinfini kengaytiradi. 16.14-rasm
bir nechta Stack usullarini namoyish etadi. Stack sinfining tafsilotlari uchun http:// saytiga tashrif buyuring
docs.oracle.com/javase/7/docs/api/java/util/Stack.html.

1 // 16.14-rasm: StackTest.java


2 // java.util paketining stek klassi.
3
4
5
6 umumiy sinf StackTest
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10
11
12 // push usulidan foydalaning
13
14 System.out.println("12L surildi");
15 printStack (stek);
16
17 System.out.println("Pushed 34567");
18 printStack (stek);
19
20 System.out.println("1,0F bosildi");
21 printStack (stek);
22
23 System.out.println("Pushed 1234.5678 ");
24 printStack (stek);
25
26 // elementlarni stekdan olib tashlash
27 urinib ko'ring
28 {
29 Raqam o'chirildiObject = null;
30
31 // stekdan ochilgan elementlar
32 vaqt (to'g'ri)
33 {
34
35 System.out.printf("Popped %s%n", removeObject);
36 printStack (stek);
37 }
38 }
39 ta tutish (EmptyStackException emptyStackException)
40 {

16.14-rasm | java.util paketining stek klassi. (2-qismning 1-qismi.)

import java.util.Stack;
import java.util.EmptyStackException;

Stack stek = new Stack<>(); // Stack yarating

stack.push(12L); // 12L uzun qiymatni surish

stack.push(34567); // 34567 int qiymatini bosing

stack.push(1,0F); // surish float qiymati 1,0F

stack.push(1234.5678); // 1234.5678 juft qiymatini bosing

RemoveObject = stack.pop(); // pop usulidan foydalaning

16.8 java.util 709 paketining stek klassi

10-qator bo'sh raqamlar to'plamini yaratadi. Sinf raqami (java.lang paketida).
ibtidoiy sonli turlar (masalan, Integer,
Ikki marta). Raqamlar to'plamini yaratish orqali raqamni kengaytiradigan har qanday sinf ob'ektlari bo'lishi mumkin
Stack ustiga surildi. 13, 16, 19 va 22-qatorlar har bir qo'ng'iroqni qo'shish uchun Stack usulini bosing
Raqam ob'ekti stekning yuqori qismiga. 12L (13-qator) va 1.0F (19-qator) harflariga e'tibor bering.
L qo'shimchasiga ega bo'lgan har qanday butun son harfi uzun qiymatdir. Qo‘shimchasiz butun son harfi

41 emptyStackException.printStackTrace();


42 }
43 }
44
45 // Stack tarkibini ko'rsatish
46 shaxsiy statik bekor printStack(Stack stek)
47 {
48 agar ( )
49 System.out.printf("stek bo'sh%n%n"); // stek bo'sh
50 ta // stek bo'sh emas
51 System.out.printf("stek o'z ichiga oladi: %s (yuqori)%n", stek);
52 }
53 } // oxirgi sinf StackTest

12 l
stek quyidagilarni o'z ichiga oladi: [12] (yuqori)


34567 bosildi
stek quyidagilarni o'z ichiga oladi: [12, 34567] (yuqori)
1,0F bosildi
stek quyidagilarni o'z ichiga oladi: [12, 34567, 1.0] (yuqori)
1234.5678 bosildi
stekda: [12, 34567, 1.0, 1234.5678] (yuqori)
1234.5678 ochildi
stek quyidagilarni o'z ichiga oladi: [12, 34567, 1.0] (yuqori)
1.0 ochildi
stek quyidagilarni o'z ichiga oladi: [12, 34567] (yuqori)
34567 ochildi
stek quyidagilarni o'z ichiga oladi: [12] (yuqori)
12 ochildi
stek bo'sh

java.util.EmptyStackException


java.util.Stack.peek manzilida (noma'lum manba)
java.util.Stack.pop manzilida (noma'lum manba)
StackTest.main da (StackTest.java: 34)

Xatolarning oldini olish bo'yicha maslahat 16.1


Stack Vektorni kengaytirganligi sababli, barcha umumiy vektor usullarini Stack ob'ektida chaqirish mumkin.
jects, garchi usullar an'anaviy stek operatsiyalarini ifodalamasa ham. Masalan,
Vektor qo'shish usuli elementni stekning istalgan joyiga kiritish uchun ishlatilishi mumkin - operatsiya
bu stekni "buzishi" mumkin. Stackni manipulyatsiya qilishda faqat surish va ochish usullari
mos ravishda Stackga elementlar qo'shish va elementlarni olib tashlash uchun ishlatilishi kerak. In
21.5-bo'limda biz kompozitsiyadan foydalangan holda Stack sinfini yaratamiz, shunda Stack o'z ichiga oladi
umumiy interfeys faqat Stack tomonidan ruxsat etilishi kerak bo'lgan imkoniyatlar.

16.14-rasm | java.util paketining stek klassi. (2-qismning 2-qismi.)

stack.isEmpty()

710 16-bob Umumiy to'plamlar



int qiymati hisoblanadi. Xuddi shunday, F qo'shimchasiga ega bo'lgan har qanday suzuvchi nuqtali literal suzuvchi qiymatdir.
Qo‘shimchasiz suzuvchi nuqtali harf ikki tomonlama qiymatdir. haqida ko'proq bilib olishingiz mumkin
Java tili spetsifikatsiyasidagi raqamli harflar http://docs.oracle.com/javase/
specs/jls/se7/html/jls-15.html#jls-15.8.1.
Cheksiz tsikl (32–37-qatorlar) yuqori elementni olib tashlash uchun Stack usulini chaqiradi.
to'plam. Usul olib tashlangan elementga raqam havolasini qaytaradi. Agar yo'q bo'lsa
Stack-dagi elementlar, pop-up usuli EmptyStackException-ni chiqaradi va u tugaydi
halqa. Class Stack ham usul peekini e'lon qiladi. Bu usul ning yuqori elementini qaytaradi
elementni stekdan olib tashlamasdan stekni.
PrintStack usuli (46–52-qatorlar) stek tarkibini ko'rsatadi. Joriy tepasi
stek (stekga surilgan oxirgi qiymat) birinchi bosilgan qiymatdir. 48-qator Stackni chaqiradi
isEmpty usuli (Vektor sinfidan Stack tomonidan meros qilib olingan) stek mavjudligini aniqlash uchun
bo'sh. Agar u bo'sh bo'lsa, usul haqiqatni qaytaradi; aks holda, yolg'on.
16.9 Class PriorityQueue va interfeys navbati
Eslatib o'tamiz, navbat kutish chizig'ini ifodalovchi to'plamdir - odatda qo'shimchalar
navbatning orqasida amalga oshiriladi va o'chirishlar old tomondan amalga oshiriladi. 21.6-bo'limda biz
navbatdagi ma'lumotlar strukturasini muhokama qilish va amalga oshirish. Ushbu bo'limda biz Java navbatini o'rganamiz
interfeysi va java.util paketidan PriorityQueue klassi. Interfeys navbati kengaytiriladi -
Terfasni yig'ish va kiritish, olib tashlash va tekshirish uchun qo'shimcha operatsiyalarni ta'minlaydi
elementlarni navbatda joylashtirish. Queue interfeysini amalga oshiradigan PriorityQueue buyurtma beradi
Qiyoslanadigan elementlarning solishtirma usuli bilan belgilangan tabiiy tartib bo'yicha elementlar
od yoki konstruktorga taqdim etilgan Comparator ob'ekti tomonidan.
Class PriorityQueue tartiblangan tartibda qo'shish imkonini beruvchi funksionallikni ta'minlaydi
asosiy ma'lumotlar strukturasi va asosiy ma'lumotlar strukturasining old qismidan o'chirishlar.
PriorityQueue ga elementlar qo'shilganda, elementlar ustuvor tartibda kiritiladi
shunday qilib, eng yuqori ustuvor element (ya'ni, eng katta qiymat) birinchi element bo'ladi
PriorityQueue dan olib tashlandi.
Keng tarqalgan PriorityQueue operatsiyalari elementni mos keladigan joyga kiritishni taklif qiladi.
Priate joylashuvi ustuvor tartib asosida, eng yuqori ustuvor elementni olib tashlash uchun so'rov
ustuvor navbat (ya'ni, navbat boshlig'i), eng yuqori ustuvorlikka havola olish uchun ko'z tashlang
ustuvor navbat elementi (bu elementni olib tashlamasdan), barcha elementlarni olib tashlash uchun tozalang.
ustuvor navbatdagi elementlar sonini olish uchun ustuvor navbatdagi va o'lchami.
16.15-rasmda PriorityQueue klassi ko'rsatilgan. 10-qator PriorityQueue ni yaratadi
Dastlabki sig'imi 11 ta element bo'lgan Doubles ni saqlaydi va elementlarni mos ravishda tartibga soladi
ob'ektning tabiiy tartibiga (PriorityQueue uchun standart sozlamalar). PriorityQueue - a
umumiy sinf. 10-qator Double turi argumenti bilan PriorityQueue ni yaratadi. Sinf
PriorityQueue beshta qo'shimcha konstruktorni taqdim etadi. Ulardan biri int va Com-ni oladi.
int va tomonidan belgilangan boshlang'ich sig'imga ega PriorityQueue yaratish uchun parator ob'ekti
solishtiruvchi tomonidan buyurtma berish. 13-15-qatorlar pri-ga elementlar qo'shish uchun usul taklifidan foydalanadi.
ority navbat. Usul taklifi, agar dastur harakat qilsa, NullPointerException ni chiqaradi
navbatga null ob'ekt qo'shing. 20–24-qatorlardagi halqa aniqlash uchun usul hajmidan foydalanadi
ustuvor navbat bo'sh yoki yo'qmi (20-qator). Ko'proq elementlar mavjud bo'lsa-da, 22-qatordan foydalaniladi
PriorityQueue usuli chiqish uchun navbatdagi eng yuqori ustuvor elementni olish uchun peek
(aslida uni navbatdan olib tashlamasdan). 23-qator eng muhim elementni olib tashlaydi.
o'chirilgan elementni qaytaradigan so'rov usuli bilan navbatda.

16.10 711-to'plamlar

16.10 To'plamlar
To'plam - noyob elementlarning tartibsiz to'plamidir (ya'ni, dublikatlar yo'q). To'plamlar
Framework HashSet va TreeSet kabi bir nechta Set ilovalarini o'z ichiga oladi. Xesh-
Set o'z elementlarini xesh-jadvalda, TreeSet esa o'z elementlarini daraxtda saqlaydi. Xesh jadvallari
16.11-bo'limda keltirilgan. Daraxtlar 21.7-bo'limda muhokama qilinadi.
16.16-rasmda ro'yxatdagi takroriy satrlarni olib tashlash uchun HashSet-dan foydalaniladi. Eslatib o'tamiz, ikkalasi ham
Ro'yxat va To'plam umumiy turlardir, shuning uchun 16-qator Stringni o'z ichiga olgan Ro'yxatni yaratadi
ob'ektlar va 20-satr printNonDuplicates usuliga satrlar to'plamini o'tkazadi.
PrintNonDuplicates usuli (24–35-qatorlar) Collection argumentini oladi. 27-qator -
Collection argumentidan HashSet ni tuzadi. Ta'rifga ko'ra, Sets
dublikatlarni o'z ichiga olmaydi, shuning uchun HashSet tuzilganda, u har qanday dublikatlarni olib tashlaydi.
To'plam. To'plamdagi 31-32 qatorlar chiqish elementlari.

1 // 16.15-rasm: PriorityQueueTest.java


2 // PriorityQueue test dasturi.
3 import java.util.PriorityQueue;
4
5 umumiy sinf PriorityQueueTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9
10
11
12
13
14
15
16
17 System.out.print("Navbatdan so'rov: ");
18
19 // navbatdagi elementlarni ko'rsatish
20 vaqt (> 0)
21 {
22 System.out.printf("%.1f ", ); // yuqori elementni ko'rish
23 // yuqori elementni olib tashlang
24 }
25 }
26 } // PriorityQueueTest klassining yakuni

Navbatdan ovoz berish: 3,2 5,4 9,8

16.15-rasm | PriorityQueue test dasturi.

1 // 16.16-rasm: SetTest.java


2 // HashSet satrlar massividan takroriy qiymatlarni olib tashlash uchun ishlatiladi.
3 import java.util.List;
4 import java.util.Arrays;

16.16-rasm | HashSet qatorlar qatoridan takroriy qiymatlarni olib tashlash uchun ishlatiladi. (2-qismning 1-qismi.)

// sig'imning navbati 11
PriorityQueue navbat = yangi PriorityQueue<>();

// navbatga elementlarni kiritish


queue.offer(3.2);
queue.offer(9.8);
queue.offer(5.4);

queue.size()

queue.peek()

queue.poll();


712 16-bob Umumiy to'plamlar

Saralangan to'plamlar
To'plamlar ramkasi SortedSet interfeysini ham o'z ichiga oladi (To'plamni kengaytiradi).
o'z elementlarini tartiblangan tartibda saqlaydigan to'plamlar - elementlarning tabiiy tartibi (masalan,
raqamlar o'sish tartibida) yoki solishtiruvchi tomonidan belgilangan tartib. Class TreeSet im-
SortedSet-ni to'ldiradi. 16.17-rasmdagi dastur Stringlarni TreeSetga joylashtiradi. The
Satrlar TreeSetga qo'shilganidek saralanadi. Ushbu misol, shuningdek, diapazonni ko'rsatadi -
ko'rish usullari, bu dasturga to'plamning bir qismini ko'rish imkonini beradi.
14-qator massiv ranglari elementlarini o'z ichiga olgan TreeSet ni yaratadi, so'ngra
yangi TreeSet ni SortedSet o‘zgaruvchilar daraxtiga tayinlaydi. 17-qator chiqishi
printSet usulidan foydalangan holda satrlarning dastlabki to'plami (33-39-qatorlar), biz ularni muhokama qilamiz.
tariqa. 31-qator TreeSet-ning pastki to'plamini olish uchun TreeSet usuli eshitish vositasini chaqiradi, bunda har biri

5 import java.util.HashSet;


6 import java.util.Set;
7 import java.util.Collection;
8
9 ommaviy sinf SetTest
10 {
11 ta umumiy statik bekor asosiy(String[] args)
12 {
13 // Ro'yxat yaratish va ko'rsatish
14 qator [] ranglar = {"qizil", "oq", "ko'k", "yashil", "kulrang",
15 "apelsin", "to'ng'iz", "oq", "ko'k", "shaftoli", "kulrang", "apelsin"};
16
17 System.out.printf("Ro'yxat: %s%n", ro'yxat);
18
19 // dublikatlarni yo'q qiling, keyin noyob qiymatlarni chop eting
20 printNonDuplicates(ro'yxat);
21 }
22
23 // dublikatlarni yo'q qilish uchun to'plamdan to'plam yarating
24 ta shaxsiy statik bekor chop etishNonDuplicates( )
25 {
26 // HashSet yarating
27
28
29 System.out.printf("%nNonduplicates: ");
30
31 uchun (String qiymati: belgilangan)
32 System.out.printf("%s ", qiymat);
33
34 System.out.println();
35 }
36 } // yakuniy sinf SetTest

Roʻyxat: [qizil, oq, koʻk, yashil, kulrang, toʻq sariq, sargʻish, oq, zangori, shaftoli, kulrang,


apelsin]
Takrorlanmaganlar: to'q sariq yashil oq shaftoli kulrang zangori qizil ko'k tan

16.16-rasm | HashSet qatorlar qatoridan takroriy qiymatlarni olib tashlash uchun ishlatiladi. (2-qismning 2-qismi.)

List list = Arrays.asList(ranglar);

Collection qiymatlari

Set set = new HashSet<>(qiymatlar);

16.10 713-to'plamlar

element "apelsin" dan kamroq. Eshitish vositasidan qaytarilgan ko'rinish keyin bilan chiqariladi
chop etish to'plami. Agar quyi to'plamga biron-bir o'zgartirish kiritilsa, ular asl nusxaga ham kiritiladi
TreeSet, chunki headset tomonidan qaytarilgan kichik to'plam TreeSet ko'rinishidir.
25-qator har bir element kattaroq bo'lgan kichik to'plamni olish uchun TreeSet tailSet usulini chaqiradi.
dan yoki "to'q sariq" ga teng, keyin natijani chiqaradi. orqali qilingan har qanday o'zgarishlar
tailSet ko'rinishi asl TreeSet uchun yaratilgan. 28–29 qatorlar SortedSet usullarini chaqiradi
birinchi va oxirgi, mos ravishda to'plamning eng kichik va eng katta elementlarini olish.
PrintSet usuli (33–39-qatorlar) SortedSet ni argument sifatida qabul qiladi va uni chop etadi.
35–36 qatorlar SortedSet ning har bir elementini kengaytirilgan for bayonoti yordamida chop etadi.

1 // 16.17-rasm: SortedSetTest.java


2 // SortedSets va TreeSets-dan foydalanish.
3 import java.util.Arrays;
4 import java.util.SortedSet;
5 import java.util.TreeSet;
6
7 ommaviy sinf SortedSetTest
8 {
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 // massiv ranglaridan TreeSet yarating
12 string[] ranglar = {"sariq", "yashil", "qora", "to'ng'iz", "kulrang",
13 "oq", "to'q sariq", "qizil", "yashil"};
14
15
16 System.out.print("saralangan to'plam: ");
17 printSet(daraxt);
18
19 // "apelsin" asosidagi eshitish vositasini oling
20 System.out.print("headset (\"to'q sariq\"): ");
21 printSet( );
22
23 // "apelsin" asosida tailSetni oling
24 System.out.print("tailSet (\"to'q sariq\"): ");
25 printSet( );
26
27 // birinchi va oxirgi elementlarni oling
28 System.out.printf("birinchi: %s%n", );
29 System.out.printf("oxirgi : %s%n", );
30 }
31
32 // kengaytirilgan for bayonotidan foydalanib SortedSet ni chiqaring
33 shaxsiy statik bekor chop etish to'plami (SortedSet to'plami)
34 {
35 uchun (String s : set)
36 System.out.printf("%s ", s);
37
38 System.out.println();
39 }
40 } // oxirgi sinf SortedSetTest

16.17-rasm | SortedSets va TreeSets-dan foydalanish. (2-qismning 1-qismi.)

SortedSet daraxti = yangi TreeSet<>(Arrays.asList(ranglar));

tree.headSet("to'q sariq")

tree.tailSet("apelsin")

tree.first()


tree.last()

714 16-bob Umumiy to'plamlar

16.11 Xaritalar
Xaritalar kalitlarni qiymatlar bilan bog'laydi. Xaritadagi kalitlar noyob bo'lishi kerak, lekin ular bilan bog'liq qiymatlar
bo'lishi shart emas. Agar Xaritada noyob kalitlar va noyob qiymatlar mavjud bo'lsa, u amalga oshiriladi
birma-bir xaritalash. Agar faqat kalitlar noyob bo'lsa, Xarita juda ko'p-
birga xaritalash - ko'p tugmalar bitta qiymatga mos kelishi mumkin.
Xaritalar toʻplamlardan farq qiladi, chunki Xaritalar kalitlar va qiymatlarni oʻz ichiga oladi, toʻplamlarda esa faqat
qiymatlar. Xarita interfeysini amalga oshiradigan bir nechta sinflardan uchtasi Hashtable, HashMap
va TreeMap. Hashtables va HashMaps elementlarni xesh jadvallarida, TreeMaps esa elementlarni saqlaydi
daraxtlardagi elementlar. Ushbu bo'limda xesh-jadvallar muhokama qilinadi va a dan foydalanadigan misol keltirilgan
Kalit-qiymat juftligini saqlash uchun HashMap. SortedMap interfeysi Xaritani kengaytiradi va uning kalitlarini saqlaydi
saralangan tartibda - elementlarning tabiiy tartibi yoki Comparator tomonidan belgilangan tartib.
Class TreeMap SortedMap-ni amalga oshiradi.

Xash jadvallari bilan xaritani amalga oshirish


Dastur ob'ektlarni yaratganda, ularni samarali saqlash va olish kerak bo'lishi mumkin. Saqlash
va massivlar bilan ma'lumot olish, agar ma'lumotlaringizning ba'zi jihatlari to'g'ridan-to'g'ri bo'lsa, samarali bo'ladi
raqamli kalit qiymatiga mos keladi va agar kalitlar noyob va mahkam o'ralgan bo'lsa. Agar bor bo'lsa
To'qqiz xonali ijtimoiy xavfsizlik raqamlariga ega bo'lgan 100 nafar xodim va siz saqlash va olishni xohlaysiz
ijtimoiy xavfsizlik raqamini kalit sifatida ishlatib, xodimlarning ma'lumotlari, vazifa massivni talab qiladi
800 milliondan ortiq elementlar bilan, chunki to'qqiz xonali ijtimoiy sug'urta raqamlari boshlanishi kerak
Ijtimoiy xavfsizlik ma'muriyatining veb-saytiga ko'ra 001–899 (666 dan tashqari) bilan

Bu ijtimoiy xavfsizlik raqamlarini kalit sifatida ishlatadigan deyarli barcha ilovalar uchun amaliy emas. A


katta massivga ega bo'lgan dastur saqlash uchun ham, yuqori ko'rsatkichlarga ham erisha oladi
oddiygina ijtimoiy xavfsizlik raqamini massiv indeksi sifatida ishlatish orqali xodimlarning yozuvlarini olish.
Ko'pgina ilovalarda bu muammo bor, ya'ni kalitlarning ikkalasi ham
noto'g'ri turdagi (masalan, massiv pastki belgisiga mos keladigan musbat butun sonlar emas) yoki ular
to'g'ri turdagi, lekin juda katta diapazonda kam tarqalgan. Buning uchun yuqori tezlik sxemasi kerak
ijtimoiy xavfsizlik raqamlari, inventar qismlari raqamlari va shunga o'xshash kalitlarni aylantirish
noyob massiv indekslari. Keyin, dastur biror narsani saqlashi kerak bo'lganda, sxema
ilova kalitini tezda indeksga aylantirishi va yozuvni saqlashi mumkin edi
massivdagi o'sha uyada. Qidiruv xuddi shu tarzda amalga oshiriladi: Ilova mavjud bo'lgandan keyin
Ma'lumotlar yozuvini olishni istagan kalit bo'lsa, dastur oddiygina shartni qo'llaydi.
kalit versiyasi - bu ma'lumotlar saqlanadigan va olinadigan massiv indeksini ishlab chiqaradi.
Biz bu erda tasvirlab beradigan sxema xashing deb ataladigan texnikaning asosidir. Nima uchun
nomi? Kalitni massiv indeksiga aylantirganimizda, biz bitlarni tom ma'noda aralashtirib, shakllantiramiz

saralangan to'plam: qora yashil kulrang to'q sariq qizil tan oq sariq


eshitish vositasi ("to'q sariq"): qora yashil kulrang
tailSet ("to'q sariq"): to'q sariq qizil tan oq sariq
birinchi: qora
oxirgi: sariq

http://www.socialsecurity.gov/employer/randomization.html

16.17-rasm | SortedSets va TreeSets-dan foydalanish. (2-qismning 2-qismi.)

16.11 Xaritalar 715

bir xil "mismashed" yoki hash, raqam. Bu raqam aslida hech qanday ahamiyatga ega emas
ma'lum bir ma'lumot yozuvini saqlash va olishda uning foydaliligidan tashqari.
Sxemadagi nosozlik to'qnashuv deb ataladi - bu ikki xil kalit "xesh" bo'lganda sodir bo'ladi.
massivdagi bir xil katakka (yoki elementga)” kiriting. Biz ikkita qiymatni bir xil joyda saqlay olmaymiz,
shuning uchun biz birinchi xeshdan tashqari barcha qiymatlar uchun muqobil uyni topishimiz kerak.
ular massivi indeksi. Buni amalga oshirish uchun ko'plab sxemalar mavjud. Ulardan biri "yana xeshlash" (ya'ni, to
da keyingi nomzod katakchasini ta'minlash uchun kalitga boshqa xeshlash transformatsiyasini qo'llang
massiv). Xeshlash jarayoni qiymatlarni jadval bo'ylab tarqatish uchun mo'ljallangan, shuning uchun
Mavjud hujayra bir nechta xesh bilan topiladi, deb taxmin qilinadi.
Boshqa sxema birinchi nomzod katakchani topish uchun bitta xeshni ishlatadi. Agar bu hujayra band bo'lsa,
mavjud hujayra topilmaguncha ketma-ket hujayralar tartibda qidiriladi. Qidiruv ishlaydi
Xuddi shu tarzda: Kalit dastlabki joylashuvni aniqlash va uning mavjudligini tekshirish uchun bir marta xeshlanadi
kerakli ma'lumotlarni o'z ichiga oladi. Agar shunday bo'lsa, qidiruv tugadi. Agar bunday bo'lmasa, ketma-ket hujayralar
kerakli ma'lumotlar topilmaguncha chiziqli izlanadi.
Xesh-jadval to'qnashuvining eng mashhur yechimi jadvalning har bir katagiga ega bo'lishdir
"chelak" xesh, odatda ushbu katakka xeshlangan barcha kalit-qiymat juftlarining bog'langan ro'yxati. Bu
Java Hashtable va HashMap sinflari (java.util paketidan) amalga oshiradigan yechimdir.
ment. Hashtable ham, HashMap ham Map interfeysini amalga oshiradi. Asosiy farqlar
Ular orasida HashMap sinxronlashtirilmagan (bir nechta iplar a.ni o'zgartirmasligi kerak).
HashMap bir vaqtning o'zida) va null kalitlarga va null qiymatlarga ruxsat beradi.
Xesh jadvalining yuk koeffitsienti xesh sxemalarining ishlashiga ta'sir qiladi. Yuk ko'rsatkichi
- xesh-jadvaldagi band qilingan hujayralar sonining umumiy hujayralar soniga nisbati
hash jadvalida. Bu nisbat 1,0 ga qanchalik yaqin bo'lsa, to'qnashuv ehtimoli shunchalik yuqori bo'ladi.

Kompyuter fanlari talabalari "Ma'lumotlar tuzilmalari" deb nomlangan kurslarda xesh sxemalarini o'rganadilar.


va "Algoritmlar". Hashtable va HashMap sinflari sizga xeshlashsiz foydalanish imkonini beradi
hash-jadval mexanizmlarini amalga oshirish kerak - qayta foydalanishning klassik namunasi. Bu tushuncha
ob'ektga yo'naltirilgan dasturlashni o'rganishda juda muhim. Quloqda muhokama qilinganidek -
lier boblar, sinflar murakkablikni qamrab oladi va yashiradi (ya'ni, amalga oshirish tafsilotlari) va
foydalanuvchilar uchun qulay interfeyslarni taklif qiladi. Bunday xatti-harakatlarni ko'rsatish uchun to'g'ri hunarmandchilik darslari biridir
ob'ektga yo'naltirilgan dasturlash sohasidagi eng qimmatli ko'nikmalar. 16.18-rasmda a ishlatiladi
Satrdagi har bir so'zning takrorlanish sonini hisoblash uchun HashMap.

Ishlash bo'yicha maslahat 16.2


Xesh-jadvaldagi yuklanish omili xotira maydoni/bajarish vaqtining klassik namunasidir
savdo-sotiq: Yuk koeffitsientini oshirish orqali biz xotiradan yaxshiroq foydalanishni olamiz, lekin dastur
Hashing to'qnashuvlarining kuchayishi tufayli sekinroq ishlaydi. Yuk koeffitsientini kamaytirish orqali biz yaxshilanamiz
Hashing to'qnashuvlari kamayganligi sababli dastur tezligi, lekin biz xotiradan yomonroq foydalanamiz
tion, chunki xesh jadvalining katta qismi bo'sh qoladi.

1 // 16.18-rasm: WordTypeCount.java


2 // Dastur Stringdagi har bir so'zning takrorlanish sonini hisoblaydi.
3 import java.util.Map;
4 import java.util.HashMap;
5 import java.util.Set;
6 import java.util.TreeSet;

16.18-rasm | Dastur Stringdagi har bir so'zning takrorlanish sonini hisoblaydi. (3-qismning 1-qismi.)


716 16-bob Umumiy to'plamlar

7 import java.util.Scanner;
8
9 umumiy sinf WordTypeCount
10 {
11 ta umumiy statik bekor asosiy(String[] args)
12 {
13
14
15
16 CreateMap(myMap); // foydalanuvchi kiritishi asosida xarita yaratish
17 displayMap(myMap); // xarita tarkibini ko'rsatish
18 }
19
20 // foydalanuvchi kiritishidan xarita yaratish
21 shaxsiy statik bo'shliqni yaratishMap(Map xaritasi)
22 {
23 Skaner skaneri = yangi Skaner(System.in); // skaner yaratish
24 System.out.println("Qatorni kiriting:"); // foydalanuvchi kiritish uchun so'rov
25 String kiritish = scanner.nextLine();
26
27 // kirishni belgilang
28 String[] tokenlari = input.split(" ");
29
30 // kiritilgan matnni qayta ishlash
31 uchun (String token: tokens)
32 {
33 String word = token.toLowerCase(); // kichik so'zni oling
34
35 // agar xaritada so'z bo'lsa
36 agar ( ) // xaritadagi so'z bo'lsa
37 {
38
39
40 }
yana 41
42
43 }
44 }
45
46 // xarita tarkibini ko'rsatish
47 shaxsiy statik bo'shliqni ko'rsatishMap(Map xaritasi)
48 {
49
50
51 // kalitlarni tartiblash
52 TreeSet sortedKeys = yangi TreeSet<>(tugmachalar);
53
54 System.out.printf("%nMap tarkibida:%nKey\t\tValue%n");
55
56 // xaritadagi har bir kalit uchun chiqish hosil qiling
57 uchun (String kaliti: sortedKeys)
58 System.out.printf("%-10s%10s%n", kalit, );
59

16.18-rasm | Dastur Stringdagi har bir so'zning takrorlanish sonini hisoblaydi. (3 qismning 2-qismi.)

// String kalitlari va Integer qiymatlarini saqlash uchun HashMap yarating
Map myMap = new HashMap<>();

map.containsKey(so'z)

int count = map.get(word); // joriy hisobni olish
map.put(so'z, sanash + 1); // o'sish soni

map.put(word, 1); // xaritaga 1 soni bilan yangi so'z qo'shing

Set tugmachalari = map.keySet(); // kalitlarni oling

map.get(kalit)


16.11 Xaritalar 717

14-qator sukut bo'yicha boshlang'ich sig'imi (16 element) va bo'sh HashMap yaratadi.
sukut bo'yicha yuk koeffitsienti (0,75) - bu standart qiymatlar HashMap dasturiga kiritilgan.
HashMap-dagi ishg'ol qilingan uyalar soni sig'imdan kattaroq bo'lganda
marta yuk koeffitsienti, sig'im avtomatik ravishda ikki barobar ortadi. HashMap - bu umumiy sinf
ikkita turdagi argumentlarni oladi - kalit turi (ya'ni, String) va qiymat turi (ya'ni,
Butun son). Eslatib o'tamiz, umumiy sinfga o'tkazilgan turdagi argumentlar mos yozuvlar turlari bo'lishi kerak,
shuning uchun ikkinchi turdagi argument int emas, balki butun sondir.
16-qator createMap usulini chaqiradi (21–44-qatorlar), bu raqamni saqlash uchun Xaritadan foydalanadi.
gapdagi har bir so'zning kelishi. 25-qator foydalanuvchi kiritishini oladi va 28-qator token-
qiladi. 31–43-qatorlar keyingi tokenni kichik harflarga aylantiradi (33-qator), keyin Xaritaga qo'ng'iroq qiling
so'zning xaritada mavjudligini aniqlash uchun kalit (36-satr) usuli mavjud (va shunday qilib
satrda ilgari sodir bo'lgan). Agar Xarita so'zni o'z ichiga olmasa, 42-satr Xaritadan foydalanadi
Kalit sifatida so'z va Integer ob'ekti bilan yangi yozuv yaratish uchun qo'yilgan usul.
qiymat sifatida 1 ni oladi. Avtobokslash dastur qo'yish usuliga butun son 1ni o'tkazganda sodir bo'ladi,
chunki xarita hodisalar sonini butun son sifatida saqlaydi. Agar so'z mavjud bo'lsa
xaritada, 38-qatorda kalitning tegishli qiymatini (hisobni) olish uchun Map get usulidan foydalanadi
xarita. 39-qator qiymatni oshiradi va kalitning bog'langan qiymatini almashtirish uchun putdan foydalanadi.
Metod put kalitning oldingi bog'langan qiymatini qaytaradi yoki agar kalit xaritada bo'lmasa null.

60 System.out.printf(


61 "% nsize: %d%nisEmpty: %b%n", , );
62 }
63 } // oxirgi sinf WordTypeCount

Qator kiriting:


bu bir nechta so'zlardan iborat namunali jumla, bu boshqa namunadir
turli xil so'zlardan iborat jumla
Xaritada quyidagilar mavjud:
Asosiy qiymat
a 1
yana 1
har xil 1
2 hisoblanadi
namuna 2
jumla 2
bir nechta 2
bu 2
2 bilan
so'zlar 2
hajmi: 10
isEmpty: noto'g'ri

Xatolarning oldini olish bo'yicha maslahat 16.2


Xarita bilan har doim o'zgarmas kalitlardan foydalaning. Kalit mos keladigan qiymatni aniqlaydi
joylashtiriladi. Agar kalit kiritish operatsiyasidan keyin o'zgargan bo'lsa, keyinroq urinib ko'rganingizda
bu qiymatni olish uchun u topilmasligi mumkin. Ushbu bobdagi misollarda biz Stringlardan foydalanamiz
chunki kalitlar va satrlar o'zgarmasdir.

16.18-rasm | Dastur Stringdagi har bir so'zning takrorlanish sonini hisoblaydi. (3 qismning 3-qismi.)

map.size() map.isEmpty()

718 16-bob Umumiy to'plamlar

DisplayMap usuli (47–62-qatorlar) xaritadagi barcha yozuvlarni aks ettiradi. U HashMap dan foydalanadi
kalitlar to'plamini olish uchun keySet usuli (49-qator). Tugmalar xaritada String turiga ega, shuning uchun
method keySet String sifatida belgilangan tur parametri bilan umumiy turdagi Setni qaytaradi.
52-qator kalitlar saralangan kalitlarning TreeSet-ni yaratadi. 57-qatordagi halqa
58 har bir kalitga va uning xaritadagi qiymatiga kiradi. 58-qatorda har bir kalit va uning qiymati ko'rsatiladi
har bir tugmachani chapga tekislash uchun format spetsifikatsiyasi -10s va har birini o'ngga tekislash uchun %10s format aniqlagichi
qiymat. Tugmalar ortib borayotgan tartibda ko'rsatiladi. 61-qator xarita usuli hajmini olish uchun chaqiradi
Xaritadagi kalit-qiymat juftliklari soni. 61-qator Map usulini ham chaqiradi isEmpty, qaysi
Xarita bo'sh yoki yo'qligini ko'rsatadigan mantiqiy qiymatni qaytaradi.
16.12 Xususiyatlar klassi
Xususiyatlar ob'ekti - bu Stringlarning kalit-qiymat juftlarini saqlaydigan doimiy Hashtable - taxmin -
Jadvalni boshqarish uchun emas, balki setProperty va getProperty usullaridan foydalanasiz
meros qilib olingan Hashtable usullari qo'yish va olish. "Doimiy" deganda biz Xususiyatlarni nazarda tutamiz
ob'ekt chiqish oqimiga (ehtimol faylga) yozilishi va kirish orqali qayta o'qilishi mumkin
oqim. Java-ning oldingi versiyalarida Xususiyatlar ob'ektlaridan umumiy foydalanish ilovalarni saqlash edi.
plication-konfiguratsiya ma'lumotlari yoki ilovalar uchun foydalanuvchi imtiyozlari. [Izoh: Preferences API
(java.util.prefs to'plami) Properties sinfining ushbu maxsus foydalanishini almashtirish uchun mo'ljallangan, ammo
bu kitobning doirasidan tashqarida. Qo'shimcha ma'lumot olish uchun http://bit.ly/JavaPreferences saytiga tashrif buyuring.]
Class xususiyatlari Hashtable sinfini kengaytiradi. 16.19-rasmda ko'rsatilgan
Xususiyatlar sinfining bir necha usullari.
13-qator standart xossalari bo'lmagan bo'sh Xususiyatlar jadvalini yaratadi. Sinf tayanchi -
erties, shuningdek, Xususiyatlar uchun havolani oladigan haddan tashqari yuklangan konstruktorni taqdim etadi
standart xususiyat qiymatlarini o'z ichiga olgan ob'ekt. 16 va 17-qatorlarning har biri Properties usulini chaqiradi
belgilangan kalit uchun qiymatni saqlash uchun setProperty. Agar kalit jadvalda mavjud bo'lmasa,
setProperty nullni qaytaradi; aks holda, u kalit uchun oldingi qiymatni qaytaradi.

1 // 16.19-rasm: PropertiesTest.java


2 // java.util paketining sinf xususiyatlarini ko'rsatadi.
3 import java.io.FileOutputStream;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6 import java.util.Properties;
7 import java.util.Set;
8
9 umumiy sinf PropertiesTest
10 {
11 ta umumiy statik bekor asosiy(String[] args)
12 {
13
14
15
16
17
18
19 System.out.println("Xususiyatlar o'rnatilgandan keyin");
20 ro'yxatXususiyatlar(jadval);

16.19-rasm | java.util paketining xossalar klassi. (3-qismning 1-qismi.)

Xususiyatlar jadvali = new Properties();

// xususiyatlarni o'rnatish


table.setProperty("rang", "ko'k");
table.setProperty("kenglik", "200");

16.12 Xususiyatlar klassi 719

21
22
23
24
25 System.out.println("Xususiyatlar almashtirilgandan keyin");
26 ro'yxatXususiyatlar(jadval);
27
28 saveProperties(jadval);
29
30
31
32 System.out.println("Xususiyatlar tozalangandan keyin");
33 ro'yxatXususiyatlar(jadval);
34
35 loadProperties(jadval);
36
37
38
39
40 // qiymat jadvalda mavjudligini tekshiring
41 agar (qiymat != null)
42 System.out.printf("Xususiyat rangining qiymati %s%n", qiymat);
yana 43
44 System.out.println("Xususiyatlar rangi jadvalda yo'q");
45 }
46
47 // xususiyatlarni faylga saqlang
48 xususiy statik bekor saqlashProperties(Xususiyatlar rekvizitlari)
49 {
50 // jadval mazmunini saqlash
51 urinib ko'ring
52 {
53 FileOutputStream chiqishi = yangi FileOutputStream("props.dat");
54
55 chiqdi.close();
56 System.out.println("Xususiyatlar saqlangandan keyin");
57 listProperties(rekvizitlar);
58 }
59 catch (IOException ioException)
60 {
61 ioException.printStackTrace();
62 }
63 }
64
65 // fayldan xususiyatlarni yuklash
66 shaxsiy statik bekor yuklanish xususiyatlari (Xususiyatlar rekvizitlari)
67 {
68 // jadval mazmunini yuklash
69 urinib ko'ring
70 {
71 FileInputStream kiritish = yangi FileInputStream("props.dat");
72
73 input.close();

16.19-rasm | java.util paketining xossalar klassi. (3 qismning 2-qismi.)

// xususiyat qiymatini almashtiring
table.setProperty("rang", "qizil");

table.clear(); // bo'sh jadval

// xususiyat rangi qiymatini oling
Ob'ekt qiymati = table.getProperty("rang");

props.store(chiqish, "Namunaviy xususiyatlar"); // xususiyatlarni saqlash

props.load(kirish); // yuklash xususiyatlari

720 16-bob Umumiy to‘plamlar

38-qator Xususiyatlar usulini getProperty bilan bog'langan qiymatni topish uchun chaqiradi
belgilangan kalit. Agar kalit ushbu Properties obyektida topilmasa, getProperty null qiymatini qaytaradi.
Ushbu usulning haddan tashqari yuklangan versiyasi standartni belgilaydigan ikkinchi argumentni oladi
getProperty kalitni topa olmasa, qaytariladigan qiymat.
54-qator Xususiyatlar ob'ekti tarkibini saqlash uchun Properties usuli do'konini chaqiradi
birinchi argument sifatida belgilangan OutputStream (bu holda FileOutputStream). The
ikkinchi argument, String faylga yozilgan tavsifdir. Xususiyatlar usuli
PrintStream argumentini oladigan ro'yxat xususiyatlar ro'yxatini ko'rsatish uchun foydalidir.

74 System.out.println("Xususiyatlar yuklangandan keyin");


75 ro'yxatXususiyatlar(rekvizitlar);
76 }
77 catch (IOException ioException)
78 {
79 ioException.printStackTrace();
80 }
81 }
82
83 // xossa qiymatlarini chiqarish
84 shaxsiy statik bekor ro'yxatiProperties (Xususiyatlar rekvizitlari)
85 {
86
87
88 // chiqish nomi/qiymat juftlari
89 uchun (Obyekt kaliti: tugmalar)
90 System.out.printf(
91 "%s\t%s%n", kalit, );
92
93 System.out.println();
94 }
95 } // oxirgi sinf PropertiesTest

Xususiyatlarni o'rnatgandan so'ng


ko'k rang
kengligi 200

Xususiyatlarni almashtirgandan so'ng


qizil rang
kengligi 200

Xususiyatlarni saqlagandan so'ng


qizil rang
kengligi 200

Xususiyatlarni tozalashdan keyin

Xususiyatlarni yuklagandan so'ng
qizil rang
kengligi 200

Mulk rangining qiymati qizil

16.19-rasm | java.util paketining xossalar klassi. (3 qismning 3-qismi.)

Set tugmalari = props.keySet(); // mulk nomlarini olish

props.getProperty((String) kaliti)

16.13 Sinxronlashtirilgan to'plamlar 721

72-qator Xususiyatlar mazmunini tiklash uchun Properties usuli yukini chaqiradi
birinchi argument sifatida ko'rsatilgan InputStream ob'ekti (bu holda FileInput-
Oqim). 86-qator xususiyat nomlari to'plamini olish uchun Xususiyatlar usuli keySetni chaqiradi.
Xususiyatlar sinfi o'z mazmunini Ob'ektlar sifatida saqlaganligi sababli, ob'ektga murojaatlar to'plami
qaytdi. 91-qator getProperty usuliga kalitni uzatish orqali xususiyat qiymatini oladi.
16.13 Sinxronlashtirilgan to'plamlar
23-bobda biz ko'p ish zarralarini muhokama qilamiz. Vektor va Hashtabledan tashqari, kollektsiya
To'plamlar tizimidagi elementlar sukut bo'yicha sinxronlashtirilmagan, shuning uchun ular samarali ishlashi mumkin.
Ko'p ish zarralarini o'tkazish kerak bo'lmaganda. Biroq, ular sinxronlashtirilmaganligi sababli,
To'plamga bir vaqtning o'zida bir nechta iplar tomonidan kirish noaniq natijalarga olib kelishi mumkin
yoki halokatli xatolar - biz 23-bobda ko'rsatganimizdek.
lems, sinxronizatsiya o'ramlari ko'p foydalanuvchi kirishi mumkin bo'lgan to'plamlar uchun ishlatiladi.
ko'p iplar. O'rash ob'ekti usul chaqiruvlarini qabul qiladi, ip sinxronizatsiyasini qo'shadi (
to'plamga bir vaqtning o'zida kirishni oldini oladi) va qo'ng'iroqlarni o'ralgan to'plamga topshiradi.
tsion ob'ekti. Collections API to'plamlarni o'rash uchun bir qator statik usullarni taqdim etadi.
sinxronlashtirilgan versiyalar sifatida. Sinxronizatsiya o'ramlari uchun usul sarlavhalari keltirilgan
16.20-rasmda. Ushbu usullar haqida batafsil ma'lumot http://docs.oracle.com/ saytida mavjud.
javase/7/docs/api/java/util/Collections.html. Bu usullarning barchasi umumiy qabul qilinadi
yozing va umumiy turdagi sinxronlashtirilgan ko'rinishni qaytaring. Masalan, quyidagi kod
String ob'ektlarini saqlaydigan sinxronlangan ro'yxatni (ro'yxat2) yaratadi:

16.14 O'zgartirilmaydigan to'plamlar


Collections klassi o'zgartirilmaydigan o'rashni yaratadigan statik usullar to'plamini taqdim etadi.
to'plamlar uchun shaxsiy. O'zgartirib bo'lmaydigan o'ramlar UnsupportedOperationExceptions agar bo'lsa tashlaydi
to'plamni o'zgartirishga harakat qilinadi. O'zgartirib bo'lmaydigan to'plamda havolalar
To'plamda saqlangan narsalarni o'zgartirish mumkin emas, lekin ular ko'rsatgan ob'ektlarni o'zgartirish mumkin bo'lmasa
ular String kabi o'zgarmas sinfga tegishli. Ushbu usullar uchun sarlavhalar ro'yxatda keltirilgan
16.21-rasm. Ushbu usullar haqida batafsil ma'lumot http://docs.oracle.com/ saytida mavjud.
javase/7/docs/api/java/util/Collections.html. Bu usullarning barchasi umumiy qabul qilinadi

List list1 = new ArrayList<>();


List list2 = Collections.synchronizedList(list1);

umumiy statik usul sarlavhalari



Collection synchronized Collection(To'plam c)
List synchronizedList(List aList)
Set synchronizedSet(Set s)
SortedSet sinxronlashtirilganSortedSet(SortedSet s)
Xarita sinxronlashtirilgan xarita(Xarita m)
SortedMap sinxronlanganSortedMap(SortedMap m)

16.20-rasm | Sinxronizatsiya o'rash usullari.


722 16-bob Umumiy to'plamlar

yozing va umumiy turning o'zgartirilmaydigan ko'rinishini qaytaring. Masalan, quyidagi kod
String ob'ektlarini saqlaydigan o'zgartirilmaydigan Ro'yxatni (ro'yxat2) yaratadi:

16.15 Referatni amalga oshirish


To'plamlar ramkasi To'plamning turli xil mavhum ilovalarini taqdim etadi.
sozlangan ilovalarni tezda "o'chirish" mumkin bo'lgan interfeyslar.
Ushbu mavhum amalga oshirishlar Ab- deb nomlangan nozik Collection ilovasini o'z ichiga oladi.
stractCollection, uning elementlariga massivga o'xshash kirish imkonini beruvchi Ro'yxat ilovasi
AbstractList deb ataladi, Xarita ilovasi AbstractMap deb ataladi, Ro'yxatni amalga oshiradi-
uning elementlariga (boshidan oxirigacha) ketma-ket kirish imkonini beruvchi tatsion
AbstractSequentialList, AbstractSet va Queue im- deb nomlanuvchi to'plam ilovasi.
AbstractQueue deb nomlangan qo'shimcha. Ushbu darslar haqida ko'proq bilib olishingiz mumkin http://
docs.oracle.com/javase/7/docs/api/java/util/package-summary.html. Yozish uchun a
maxsus amalga oshirish, siz o'zingizga eng mos keladigan mavhum dasturni kengaytirishingiz mumkin
kerak bo'lsa, sinfning mavhum usullarining har birini amalga oshiring va sinfning konkretini bekor qiling
kerak bo'lganda usullar.
16.16 Yakunlash
Ushbu bob Java to'plamlari ramkasini taqdim etdi. Siz to'plamni o'rgandingiz -
archy va to'plamlar bilan dasturlash uchun to'plamlar-ramka interfeyslaridan qanday foydalanish
polimorfik. Siz ikkalasini ham amalga oshiradigan ArrayList va LinkedList sinflaridan foydalangansiz
Ro'yxat interfeysi. Biz Java-ning o'rnatilgan interfeyslarini va steklarni boshqarish uchun sinflarni taqdim etdik
va navbatlar. To'plamlarni boshqarish uchun bir nechta oldindan belgilangan usullardan foydalangansiz. Siz
Tartibsiz to'plamni boshqarish uchun Set interfeysi va HashSet sinfidan qanday foydalanishni o'rgandim.
noyob qadriyatlarni shakllantirish. Biz to'plamlar taqdimotini SortedSet interfeysi bilan davom ettirdik

List list1 = new ArrayList<>();


List list2 = Collections.unmodifiableList(list1);
Dasturiy ta'minot muhandisligi kuzatuvi 16.6
Faqat o'qish uchun ruxsat beruvchi to'plam yaratish uchun o'zgartirilmaydigan o'ramdan foydalanishingiz mumkin
boshqalarga, o'zingizga o'qish-yozishga ruxsat berish. Siz buni shunchaki boshqalarga berish orqali qilasiz
o'zgartirilmaydigan o'ramga havola, o'zingiz uchun havolani saqlab qoling
original to'plam.

umumiy statik usul sarlavhalari



Collection unmodifiableCollection(To'plam c)
List unmodifiableList(List aList)
Set unmodifiableSet(Set s)
SortedSet unmodifiableSortedSet(SortedSet s)
Xarita o'zgartirilmaydigan Xarita(Xarita m)
SortedMap unmodifiableSortedMap(SortedMap m)

16.21-rasm | O'zgartirib bo'lmaydigan o'rash usullari.


Xulosa 723

va noyob qiymatlarning tartiblangan to'plamini boshqarish uchun TreeSet sinfi. Keyin o'rgandingiz
Java interfeyslari va kalit-qiymat juftlarini boshqarish uchun sinflar haqida - Map, SortedMap,
Hashtable, HashMap va TreeMap. Biz ma'lumotlar uchun ixtisoslashtirilgan xususiyatlar sinfini muhokama qildik.
faylga saqlanishi va fayldan olinishi mumkin bo'lgan kalit-qiymat juftligini nipulatsiya qilish.
Nihoyat, biz Collections sinfining o'zgarmasni olish uchun statik usullarini muhokama qildik
va to'plamlarning sinxronlashtirilgan ko'rinishlari. To'plamlar haqida qo'shimcha ma'lumot olish uchun
framework uchun http://docs.oracle.com/javase/7/docs/technotes/guides/col- tashrif buyuring
lektsiyalar. Java SE 8 Lambdas va Streams 17-bobida siz Java SE 8 ning yangi versiyasidan foydalanasiz.
yig'ish operatsiyalarini soddalashtirish uchun funktsional dasturlash imkoniyatlari. 23-bobda,
Bir vaqtning o'zida Java-dan foydalangan holda ko'p yadroli tizimlarda ishlashni qanday yaxshilashni o'rganasiz
bir vaqtning o'zida to'plamlar va parallel oqim operatsiyalari.

Xulosa
16.1-bo'lim Kirish


• Java to'plamlari ramkasi oldindan tuzilgan ma'lumotlar tuzilmalari va manipulyatsiya qilish usullarini taqdim etadi
ular.
16.2-bo'lim To'plamlar haqida umumiy ma'lumot
• To'plam boshqa ob'ektlarga havolalarni saqlashi mumkin bo'lgan ob'ektdir.
• Koleksiyonlar ramkasining sinflari va interfeyslari java.util paketida joylashgan.
16.3-bo'lim Tur-o'rash sinflari
• Turi-o‘rash sinflari (masalan, Integer, Double, Boolean) dasturchilarga primerlarni manipulyatsiya qilish imkonini beradi.
ob'ektlar sifatida itive tipidagi qiymatlar (687-bet). Ushbu sinflarning ob'ektlari to'plamlarda ishlatilishi mumkin.
16.4-bo'lim Autoboxing va Auto-Unboxing
• Boxing (687-bet) ibtidoiy qiymatni mos keladigan turdagi o'rash sinfidagi ob'ektga aylantiradi.
Unboxing (687-bet) turi-o‘rash obyektini mos keladigan ibtidoiy qiymatga o‘zgartiradi.
• Java boks konversiyalarini va qutidan chiqarishni avtomatik ravishda amalga oshiradi.
16.5-bo'lim Interfeyslar to'plami va sinflar to'plamlari
• Interfeyslar to‘plami va ro‘yxati to‘plamni kengaytiradi (686-bet), unda qo‘shish, tozalash,
yig'ish, solishtirish va ob'ektlarni to'plamda saqlash va usul iteratori (691-bet) olish uchun
to'plamning iteratori (687-bet).
• Class Collections (688-bet) to'plamlarni manipulyatsiya qilishning statik usullarini taqdim etadi.
16.6-bo'lim Ro'yxatlar
• Roʻyxat (694-bet) tartiblangan Toʻplam boʻlib, unda takroriy elementlar boʻlishi mumkin.
• Interfeyslar ro'yxati ArrayList, LinkedList va Vector sinflari tomonidan amalga oshiriladi. ArrayList (688-bet)
oʻlchami oʻzgartiriladigan massiv ilovasidir. LinkedList (688-bet) - ro'yxatning bog'langan ro'yxatini amalga oshirish.
• Java SE 7 e'lon qiluvchi va yaratuvchi bayonotlarda <> belgisi bilan turdagi xulosani qo'llab-quvvatlaydi.
umumiy turdagi o'zgaruvchilar va ob'ektlar.
• HasNext iterator usuli (691-bet) To‘plamda boshqa element mavjudligini aniqlaydi.
Keyingi usul To'plamdagi keyingi ob'ektga havolani qaytaradi va Iteratorni rivojlantiradi.
• Method sublist (694-bet) Ro‘yxatga ko‘rinishni qaytaradi. Ushbu ko'rinishga ham o'zgartirishlar kiritildi
Ro'yxatga.

724 16-bob Umumiy to'plamlar



• Aniqlash usuli (694-bet) Ro‘yxatdagi elementlarni olib tashlaydi.
• Method toArray (695-bet) to‘plam mazmunini massiv sifatida qaytaradi.
16.7-bo'lim To'plamlar usullari
• Algoritmlarni tartiblash (697-bet), binarySearch, teskari (702-bet), aralash (700-bet), to‘ldirish (702-bet),
nusxa ko'chirish, addAll (693-bet), chastota va ajratish Ro'yxatlarda ishlaydi. Algoritmlar min va maks
(703-bet) To'plamlar ustida ishlaydi.
• addAll algoritmi massivdagi barcha elementlarni to‘plamga qo‘shadi (706-bet), chastota
(706-bet) to'plamdagi nechta element belgilangan elementga teng ekanligini hisoblab chiqadi va
disjoint (706-bet) ikkita to'plamda umumiy elementlar mavjudligini aniqlaydi.
• min va max algoritmlari kolleksiyadagi eng kichik va eng katta elementlarni topadi.
• Comparator interfeysi (697-bet) To'plam elementlarini yoki-da saralash vositasini taqdim etadi.
ularning tabiiy tartibidan boshqa derlar.
• ReverseOrder to‘plamlar usuli (698-bet) bilan ishlatilishi mumkin bo‘lgan Comparator obyektini qaytaradi.
to'plam elementlarini teskari tartibda tartiblash uchun sort.
• Algoritmni aralashtirish (700-bet) Ro‘yxat elementlarini tasodifiy tartiblaydi.
• BinarySearch algoritmi (704-bet) tartiblangan Ro‘yxatdagi Obyektni topadi.
16.8-bo'lim java.util paketining stek klassi
• Class Stack (708-bet) Vektorni kengaytiradi. Stack usuli push (709-bet) o'z argumentini yuqoriga qo'shadi
to'plamdan. Pop usuli (710-bet) stekning yuqori elementini olib tashlaydi. Metod peek a qaytaradi
uni olib tashlamasdan yuqori elementga havola. Stack usuli isEmpty (710-bet) aniqlaydi
stek bo'shmi yoki yo'qmi.
16.9-bo'lim Class PriorityQueue va interfeys navbati
• Interfeys navbati (710-bet) interfeyslar to‘plamini kengaytiradi va kirish uchun qo‘shimcha operatsiyalarni ta’minlaydi.
navbatdagi elementlarni joylashtirish, olib tashlash va tekshirish.
• PriorityQueue (710-bet) navbat interfeysini qo'llaydi va elementlarni tabiiy tartibi bo'yicha buyurtma qiladi.
ing yoki konstruktorga taqdim etilgan Comparator ob'ekti tomonidan.
• PriorityQueue usuli taklifi (710-bet) elementni tegishli joyga kiritadi.
ustuvorlik tartibi. Usul so'rovi (710-bet) ustuvor navbatning eng yuqori ustuvor elementini olib tashlaydi.
Peek usuli (peek) ustuvor navbatning eng yuqori ustuvor elementiga havola oladi. Metod-
od clear (710-bet) ustuvor navbatdagi barcha elementlarni olib tashlaydi. Usul hajmi (710-bet) oladi
ustuvor navbatdagi elementlar soni.
16.10-bo'lim
• To‘plam (711-bet) tartibsiz To‘plam bo‘lib, unda takroriy elementlar mavjud emas. HashSet (711-bet)
uning elementlarini xesh-jadvalda saqlaydi. TreeSet (711-bet) o'z elementlarini daraxtda saqlaydi.
• SortedSet interfeysi (712-bet) to‘plamni kengaytiradi va uning elementlarini tartiblangan holda saqlaydigan to‘plamni ifodalaydi.
buyurtma. Class TreeSet SortedSet-ni amalga oshiradi.
• TreeSet usuli garniturasi (712-bet) birdan kichik bo‘lgan elementlarni o‘z ichiga olgan TreeSet ko‘rinishini oladi.
belgilangan element. tailSet usuli (713-bet) quyidagi elementlarni o'z ichiga olgan TreeSet ko'rinishini oladi.
belgilangan elementdan katta yoki unga teng. Ushbu ko'rinishlarga kiritilgan har qanday o'zgartirishlar
original TreeSet.
16.11 Xaritalar
• Xaritalar (714-bet) kalit-qiymat juftlarini saqlaydi va ikki nusxadagi kalitlarni o‘z ichiga olmaydi. HashMaps (714-bet) va
Hashtables (714-bet) elementlarni xesh-jadvalda, TreeMaps (714-bet) esa daraxtda saqlaydi.

O'z-o'zini tekshirish mashqlari 725



• HashMap ikki turdagi argumentlarni oladi — kalit turi va qiymat turi.
• Qo'yish HashMap usuli (717-bet) HashMap-ga kalit-qiymat juftligini qo'shadi. Get usuli (717-bet) manzilini aniqlaydi
belgilangan kalit bilan bog'langan qiymat. IsEmpty usuli (718-bet) xaritaning bo'shligini aniqlaydi.
• HashMap usuli keySet (718-bet) tugmalar to‘plamini qaytaradi. Xarita usuli hajmi (718-bet) qaytaradi
Xaritadagi kalit-qiymat juftliklari soni.
• SortedMap interfeysi (714-bet) Xaritani kengaytiradi va uning kalitlarini tartiblangan holda saqlaydigan xaritani ifodalaydi.
buyurtma. Class TreeMap SortedMap-ni amalga oshiradi.
16.12-bo'lim Xususiyatlar klassi
• Xususiyatlar obyekti (718-bet) Hashtablening doimiy quyi sinfidir.
• Properties no-argument konstruktori bo'sh Xususiyatlar jadvalini yaratadi. Haddan tashqari yuklangan
konstruktor standart xususiyat qiymatlarini o'z ichiga olgan Xususiyatlar ob'ektini oladi.
• Xususiyatlar usuli setProperty (718-bet) uning asosiy argumenti bilan bog'langan qiymatni belgilaydi.
getProperty usuli (718-bet) argument sifatida belgilangan kalitning qiymatini aniqlaydi. Usul
saqlash (720-bet) Xususiyatlar obyekti tarkibini belgilangan OutputStream-ga saqlaydi. Usul yuki
(721-bet) belgilangan InputStream-dan Xususiyatlar obyekti tarkibini tiklaydi.
16.13-bo'lim Sinxronlashtirilgan to'plamlar
• To'plamlar ramkasidan to'plamlar sinxronlashtirilmagan. Sinxronizatsiya o'ramlari
(721-bet) bir vaqtning o'zida bir nechta iplar orqali kirish mumkin bo'lgan to'plamlar uchun taqdim etilgan.
16.14-bo'lim O'zgartirilmaydigan to'plamlar
• O'zgartirib bo'lmaydigan to'plam o'ramlari (721-bet), agar bo'lsa, UnsupportedOperationExceptions (694-bet) chiqaradi.
to'plamni o'zgartirishga harakat qilinadi.
16.15-bo'lim Abstrakt amalga oshirish
• Koleksiyonlar ramkasi to'plam interfeyslarining turli xil mavhum amalga oshirilishini ta'minlaydi
Undan siz to'liq moslashtirilgan ilovalarni tezda amalga oshirishingiz mumkin.
O'z-o'zini tekshirish mashqlari
16.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) A(n) to'plamni takrorlash uchun ishlatiladi va elementlarni to'plamdan olib tashlashi mumkin
iteratsiya paytida yig'ish.
b) Ro'yxatdagi elementga element yordamida kirish mumkin.
c) myArray Double ob'ektlariga havolalarni o'z ichiga oladi deb faraz qilsak, qachon sodir bo'ladi
"myArray[0] = 1.25;" bayonoti amalga oshiradi.
d) Java sinflari va massivga o'xshash ma'lumotlar tuzilmalarining imkoniyatlarini ta'minlaydi
bu o'z o'lchamlarini dinamik ravishda o'zgartirishi mumkin.
e) Agar siz sig'im o'sishini belgilamasangiz, tizim Vec-ning o'lchamiga ega bo'ladi.
har safar qo'shimcha quvvat kerak bo'lganda.
f) Boshqalarga faqat o'qish uchun ruxsat beruvchi to'plam yaratish uchun a(n) dan foydalanishingiz mumkin.
o'zingizga o'qish-yozish ruxsatini beradi.
g) myArray Double ob'ektlariga havolalarni o'z ichiga oladi deb faraz qilsak, qachon sodir bo'ladi
"ikkita raqam = myArray[0];" amalga oshiradi.
h) To'plamlar algoritmi ikkita to'plamda umumiy elementlar mavjudligini aniqlaydi.
16.2 Har bir bayonot to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) ibtidoiy turlarning qiymatlari to'g'ridan-to'g'ri to'plamda saqlanishi mumkin.
b) To'plam ikki nusxadagi qiymatlarni o'z ichiga olishi mumkin.

726 16-bob Umumiy to'plamlar

c) Xarita ikki nusxadagi kalitlarni o'z ichiga olishi mumkin.
d) LinkedList ikki nusxadagi qiymatlarni o'z ichiga olishi mumkin.
e) To'plamlar interfeysdir.
f) Iteratorlar elementlarni olib tashlashi mumkin.
g) Hashing bilan, yuk koeffitsienti ortishi bilan to'qnashuv ehtimoli kamayadi.
h) PriorityQueue null elementlarga ruxsat beradi.
O'z-o'zini tekshirish mashqlariga javoblar
16.1 a) Iterator. b) indeks. c) avtoboks. d) ArrayList, Vektor. e) ikki barobar. f) o'zgartirib bo'lmaydigan
o'rash. g) avtomatik qutidan chiqarish. h) ajratilgan.
16.2 a) Noto'g'ri. Avtobokslash kollektsiyaga ibtidoiy tur qo'shganda sodir bo'ladi, ya'ni
ibtidoiy tip o'zining mos keladigan turi-o'rash sinfiga aylantiriladi.
b) yolg'on. To'plamda takroriy qiymatlar bo'lishi mumkin emas.
c) yolg'on. Xarita ikki nusxadagi kalitlarni o'z ichiga olmaydi.
d) To'g'ri.
e) yolg'on. To'plamlar - bu sinf; To'plam - bu interfeys.
f) To'g'ri.
g) yolg'on. Yuk koeffitsienti oshgani sayin, umumiy songa nisbatan kamroq uyalar mavjud
uyalar, shuning uchun to'qnashuv ehtimoli ortadi.
h) yolg'on. Null elementni kiritishga urinish NullPointerExceptionga olib keladi.
Mashqlar
16.3 Quyidagi atamalarning har birini aniqlang:
a) To'plam
b) To'plamlar
c) solishtiruvchi
d) ro'yxat
e) yuk koeffitsienti
f) to'qnashuv
g) xeshlashda makon/vaqt almashinuvi
h) HashMap
16.4 Vektor sinfining quyidagi usullarining har birining ishlashini qisqacha tushuntirib bering:
a) qo'shish
b) o'rnatish
c) olib tashlash
d) AllElementsni olib tashlash
e) RemoveElementAt
f) birinchi element
g) oxirgi element
h) o'z ichiga oladi
i) indeksOf
j) hajmi
k) sig'im
16.5 Nima uchun joriy o'lchami kichik bo'lgan Vektor ob'ektiga qo'shimcha elementlarni kiritish kerakligini tushuntiring
uning sig'imi nisbatan tez operatsiya va nima uchun Vektorga qo'shimcha elementlarni kiritish kerak
joriy hajmi quvvatga ega bo'lgan ob'ekt nisbatan sekin ishlaydi.
16.6 Vektor sinfini kengaytirish orqali Java dizaynerlari tezda Stack sinfini yaratishga muvaffaq bo'lishdi. Nima
merosdan foydalanishning salbiy tomonlari, ayniqsa Stack sinfi uchun?

Mashqlar 727



16.7 Quyidagi savollarga qisqacha javob bering:
a) To'plam va xarita o'rtasidagi asosiy farq nima?
b) To'plamga ibtidoiy turdagi (masalan, double) qiymat qo'shganda nima sodir bo'ladi?
c) To'plamdagi barcha elementlarni iteratordan foydalanmasdan chop qila olasizmi? Ha bo'lsa, qanday qilib?
16.8 Quyidagi Iterator bilan bog'liq usullarning har birining ishlashini qisqacha tushuntiring:
a) iterator
b) Keyingiga ega
c) keyingi
16.9 HashMap sinfining quyidagi usullarining har birining ishlashini qisqacha tushuntirib bering:
a) qo'yish
b) olish
c) bo'sh
d) kalitni o'z ichiga oladi
e) kalitlar to'plami
16.10 Quyidagi gaplarning har biri to'g'ri yoki noto'g'ri ekanligini aniqlang. Agar yolg'on bo'lsa, sababini tushuntiring.
a) To'plamdagi elementlar binarySearchdan oldin o'sish tartibida saralanishi kerak
bajarilsin.
b) Usul birinchi navbatda TreeSetdagi birinchi elementni oladi.
c) Arrays usuli bilan yaratilgan ro'yxat asList o'lchamini o'zgartirish mumkin.
16.11 Properties sinfining quyidagi usullarining har birining ishlashini tushuntiring:
a) yuk
b) saqlash
c) getProperty
d) ro'yxat
16.12 16.3-rasmdagi 16-25 qatorlarni asList usuli va
Collection argumentini oladigan LinkedList konstruktori.
16.13 (Dublicate Elimination) Birinchi ismlar qatorida o'qiladigan va ularni yo'q qiladigan dastur yozing.
ularni to'plamda saqlash orqali takrorlanadi. Foydalanuvchiga ismni qidirishga ruxsat bering.
16.14 (Harflarni sanash) Voqea sonini hisoblash uchun 16.18-rasm dasturini o'zgartiring.
har bir so'zdan emas, balki har bir harfdan. Masalan, "HELLO THE HER" qatori ikkita H, uchtadan iborat
Es, ikkita L, bitta O, bitta T va bitta R. Natijalarni ko'rsatish.
16.15 (Rangni tanlash vositasi) 13 ta oldingi sinfdan birini tanlash uchun qayta foydalanish mumkin boʻlgan sinf yaratish uchun HashMap dan foydalaning.
sinfda belgilangan ranglar Rang. Ranglarning nomlari kalit sifatida ishlatilishi kerak va oldindan belgilangan
Rangli ob'ektlar qiymat sifatida ishlatilishi kerak. Ushbu sinfni har qanday paketga import qilinadigan paketga joylashtiring
Java dasturi. Foydalanuvchiga rang tanlash va chizish imkonini beruvchi ilovada yangi sinfdan foydalaning
bu rangdagi shakl.
16.16 (Takror so'zlarni sanash) sonini aniqlaydigan va chop etuvchi dastur tuzing.
jumladagi takroriy so'zlar. Katta va kichik harflarga bir xil munosabatda bo'ling. Tinish belgilariga e'tibor bermang.
16.17 (Tartiblangan tartibda bog'langan ro'yxatga elementlarni kiritish) 25 ran-ni qo'shadigan dastur yozing.
dom 0 dan 100 gacha bo'lgan butun sonlarni LinkedList ob'ektiga kiriting. Dastur elementlarni saralashi kerak.
mentlar, so'ngra elementlarning yig'indisini va elementlarning suzuvchi nuqta o'rtacha qiymatini hisoblang.
16.18 (Bog'langan ro'yxatlarni nusxalash va teskari o'zgartirish) LinkedList obyektini yaratuvchi dasturni yozing.
10 ta belgidan iborat bo'lib, keyin birinchi ro'yxatning nusxasini o'z ichiga olgan ikkinchi LinkedList ob'ektini yaratadi, lekin qaytadan
oyat tartibi.
16.19 (tutq sonlar va tub faktorlar) Butun sonni kirituvchi dastur tuzing.
foydalanuvchidan va uning asosiy ekanligini aniqlaydi. Agar son tub bo'lmasa, uning yagona tub sonini ko'rsating

728 16-bob Umumiy to'plamlar

omillar. Esda tutingki, tub sonning omillari faqat 1 va tub sonning o'zi. Har
tub bo‘lmagan sonning yagona tub ko‘paytiruvchisi bor. Masalan, 54 raqamini ko'rib chiqing.
54 ning asosiy koeffitsientlari 2, 3, 3 va 3 dir. Qiymatlar bir-biriga ko'paytirilsa, natija 54 bo'ladi.
54 raqami uchun asosiy omillar chiqishi 2 va 3 bo'lishi kerak. Yechimning bir qismi sifatida Setlardan foydalaning.
16.20 (Daraxtlar majmuasi yordamida so'zlarni saralash) Quyidagiga bo'lingan String usulidan foydalanadigan dastur yozing.
foydalanuvchi tomonidan matn kiritish qatorini kenize qiling va har bir tokenni TreeSet-ga joylashtiring. ning elementlarini chop eting
Tree Set. [Izoh: Bu elementlarning o'sish tartibida chop etilishiga olib kelishi kerak.]
16.21 (PriorityQueue saralash tartibini o'zgartirish) 16.15-rasmning chiqishi Priority-
Navbat tartiblari Ikki elementlarni o'sish tartibida. 16.15-rasmni qayta yozing, shunda u Double ele-
kamayish tartibida (ya'ni, 9,8 3,2 emas, balki eng muhim element bo'lishi kerak).

17

Java SE 8 Lambda va


Oqimlar

Oh, men senga o'xshab oqsam bo'ladimi,


va oqimingni yarat
Mening buyuk namunam,
chunki bu mening mavzuim!
- Ser Jon Denham

Oh maqsadlar


Ushbu bobda siz:
■ Qaysi funksiya ekanligini bilib oling
dasturlash va u qanday
ob'ektga yo'naltirilganligini to'ldiradi
dasturlash.
■ Funktsional dasturlashdan foydalaning
dasturlashni soddalashtirish uchun
siz bajargan vazifalar
boshqa texnikalar.
■ Lambda ifodalarini yozing
funktsional amalga oshiradigan
interfeyslar.
■ Oqimlar nima ekanligini bilib oling va
oqim quvurlari qanday
oqim manbalaridan shakllangan,
oraliq operatsiyalar va
terminal operatsiyalari.
■ ustida amallarni bajaring
IntStreams, shu jumladan
har bir, hisob, min, maks,
yig'indi, o'rtacha, kamaytirish,
filtrlanadi va saralanadi.
■ ustida amallarni bajaring
Oqimlar, jumladan filtr,
xarita, tartiblash, to‘plash,
forEach, findFirst,
alohida, mapToDouble
va kamaytirish.
■ ifodalovchi oqimlarni yarating
int qiymatlari diapazonlari va
tasodifiy int qiymatlari.

730 17-bob Java SE 8 Lambdalar va oqimlar

17.1 Kirish
Java dasturlash haqidagi fikringiz tubdan o'zgaradi. Java-dan oldin
SE 8, Java uchta dasturlash paradigmalarini qo'llab-quvvatladi - protsessual dasturlash, ob'ekt-ori-
kiritilgan dasturlash va umumiy dasturlash. Java SE 8 funktsional dasturlashni qo'shadi. The
Ushbu paradigmani qo'llab-quvvatlaydigan yangi til va kutubxona imkoniyatlari Java-ga bir qism sifatida qo'shildi
Lambda loyihasi:

Ushbu bobda biz funktsional dasturlashni aniqlaymiz va uni yozish uchun qanday ishlatishni ko'rsatamiz


dasturlari oldingi dasturlarga qaraganda tezroq, qisqaroq va kamroq xatolarga ega
texnikalar. 23-bob, Parametrlar, siz funktsional dasturlarni bajarish osonroq ekanligini ko'rasiz
Parallellashtiring (ya'ni, bir vaqtning o'zida bir nechta operatsiyalarni bajaring), shunda dasturlaringiz mumkin
samaradorlikni oshirish uchun ko'p yadroli arxitekturadan foydalaning. Buni o'qishdan oldin
bobda Java SE 8 ning yangi interfeys funksiyasini taqdim etgan 10.10 bo'limni ko'rib chiqishingiz kerak.

17.1 Kirish


17.2 Funktsional dasturlash
Texnologiyalar haqida umumiy ma'lumot
17.2.1 Funktsional interfeyslar
17.2.2 Lambda ifodalari
17.2.3 Oqimlar
17.3 IntStream operatsiyalari
17.3.1 IntStream yaratish va
bilan uning qiymatlarini ko'rsatish
Har bir terminal operatsiyasi uchun
17.3.2 Terminal operatsiyalari soni, min,
maksimal, yig'indi va o'rtacha
17.3.3 Terminalning ishlashini qisqartirish
17.3.4 Oraliq operatsiyalar: Filtrlash va
IntStream qiymatlarini saralash
17.3.5 Oraliq operatsiya: xaritalash
17.3.6 Bilan ints oqimlarini yaratish
IntStream Methods diapazoni va
diapazon yopiq
17.4 Stream manipulyatsiyalari
17.4.1 Stream yaratish
17.4.2 Oqimni saralash va to'plash
Natijalar
17.4.3 Oqimni filtrlash va saqlash
Keyinchalik foydalanish uchun natijalar
17.4.4 Oqimni filtrlash va saralash va
Natijalarni yig'ish
17.4.5 Ilgari yig'ilgan natijalarni saralash
17.5 Stream manipulyatsiyalari
17.5.1 Satrlarni katta harflarga solishtirish
Usul ma'lumotnomasidan foydalanish

17.5.2 Satrlarni filtrlash, keyin ularni saralash


Katta-kichik harflarga sezgir bo'lmagan o'sish tartibida
17.5.3 Satrlarni filtrlash, keyin ularni saralash
Katta-kichik harflarni sezmaydigan kamayish tartibida
17.6 Stream manipulyatsiyasi
17.6.1 Yaratish va ko'rsatish a
Ro'yxat
17.6.2 Xodimlarni ish haqi bilan filtrlash a
Belgilangan diapazon
17.6.3 Xodimlarni bir nechta maydonlar bo'yicha saralash
17.6.4 Xodimlarni noyob oxirgiga solish
Nom satrlari
17.6.5 Xodimlarni bo'lim bo'yicha guruhlash
17.6.6 Xodimlar sonini hisoblash
Har bir bo'limda
17.6.7 Xodimlarni yig'ish va o'rtacha hisoblash
Maoshlar
17.7 a dan Stream yaratish
Fayl
17.8 Tasodifiy oqimlarni yaratish
Qiymatlar
17.9 Lambda hodisalari ishlov beruvchilari
17.10 Java SE 8 bo'yicha qo'shimcha eslatmalar
Interfeyslar
17.11 Java SE 8 va Funktsional
Dasturlash manbalari
17.12 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar

http://openjdk.java.net/projects/lambda

17.2 Funktsional dasturlash texnologiyalari haqida umumiy ma’lumot 731

tures (standart va statik usullarni o'z ichiga olish qobiliyati) va tushunchasini muhokama qildi
funktsional interfeyslar.
Ushbu bobda funktsional dasturlashning ko'plab misollari keltirilgan, ular ko'pincha
Oldingi boblarda dasturlashtirgan vazifalarni amalga oshirish usullarini ko'rib chiqing (17.1-rasm).

17.2 Funktsional dasturlash texnologiyalari haqida umumiy ma'lumot


Oldingi boblarda siz turli xil protsessual, ob'ektga yo'naltirilgan va umumiy narsalarni o'rgandingiz
dasturlash texnikasi. Garchi siz Java kutubxonasi sinflari va interfeyslarini tez-tez ishlatgan bo'lsangiz ham,
turli vazifalarni shakllantirsangiz, odatda vazifada nimaga erishmoqchi ekanligingizni aniqlaysiz
uni qanday amalga oshirishni aniq belgilab qo'ying. Masalan, siz nimani xohlaysiz deb faraz qilaylik
bajarish qiymatlar (ma'lumotlar manbai) deb nomlangan massivning elementlarini yig'ishdir. Siz mumkin
quyidagi koddan foydalaning:

Bu tsikl har bir massiv elementining qiymatini yig'indiga qanday qo'shishni xohlashimizni belgilaydi - for bilan


Har bir elementni bir vaqtning o'zida qayta ishlovchi, har bir elementning qiymatini qo'shadigan takrorlash bayonoti
summasiga. Ushbu takrorlash usuli tashqi iteratsiya sifatida tanilgan (chunki siz ko'rsatasiz
kutubxonani emas, qanday takrorlash kerak) va sizdan elementlarga ketma-ket kirishni talab qiladi

Pre-Java-SE-8 mavzulari Tegishli Java SE 8 muhokamalari va misollar

7-bob, massivlar va massivlar roʻyxati 17.3–17.4 boʻlimlari lambda va oqimlarning asosiy imkoniyatlarini taqdim etadi.
bir o'lchovli massivlarni qayta ishlovchi aloqalar.
10-bob, Ob'ektga yo'naltirilgan
Dasturlash: Polimorfizm
va interfeyslar

10.10-bo'lim yangi Java SE 8 interfeysi xususiyatlarini taqdim etdi


(standart usullar, statik usullar va funktsiya tushunchasi)
funktsional dasturlashni qo'llab-quvvatlaydigan tional interfeyslar).

12-bob, GUI komponentlari:


1-qism

17.9-bo'lim Swingni amalga oshirish uchun lambdadan qanday foydalanishni ko'rsatadi


voqea-tinglovchining funktsional interfeysi.

14-bob, Satrlar, belgilar


va Muntazam ifodalar

17.5-bo'lim qayta ishlash uchun lambdalar va oqimlardan qanday foydalanishni ko'rsatadi


String ob'ektlari to'plami.

15-bob, Fayllar, oqimlar va


Ob'ektni ketma-ketlashtirish

17.7-bo'lim qayta ishlash uchun lambdalar va oqimlardan qanday foydalanishni ko'rsatadi


fayldan matn satrlari.

22-bob, GUI komponentlari:


2-qism

Swing voqea-tinglovchisini amalga oshirish uchun lambdalardan foydalanishni muhokama qiladi


funktsional interfeyslar.
23-bob, Parallellik Funktsional dasturlarni parallellashtirish osonroq ekanligini ko'rsatadi
samaradorligini oshirish uchun ko'p yadroli arxitekturadan foydalanishi mumkin.
mans. Parallel oqimni qayta ishlashni ko'rsatadi. Buni ko'rsatadi
ParallelSort massivlar usuli ko'p qirrali qurilmalarda ish faoliyatini yaxshilaydi.
katta massivlarni saralashda asosiy arxitekturalar.
25-bob, JavaFX GUI: 1-qism JavaFX voqealar tinglovchisini amalga oshirish uchun lambdalardan foydalanishni muhokama qiladi
funktsional interfeyslar.

17.1-rasm | Java SE 8 lambdalari va oqimlari bo'yicha munozaralar va misollar.

int sum = 0;
for (int counter = 0; counter < values.length; counter++)
summa += qiymatlar [hisoblagich];

732 17-bob Java SE 8 Lambdalar va oqimlar

bajarishning bitta ipida tugaydigan boshlanish. Oldingi vazifani bajarish uchun siz ham
qayta-qayta mutatsiyaga uchragan ikkita o'zgaruvchini (sum va hisoblagich) yarating, ya'ni ularning qiymatlari
o'zgartirish - vazifa bajarilayotganda. Siz shunga o'xshash ko'plab massiv va to'plamni bajardingiz
massiv elementlarini ko'rsatish, bo'lgan o'lim yuzlarini umumlashtirish kabi vazifalar
6 000 000 marta aylanib, massiv elementlarining o'rtacha qiymatini va boshqalarni hisoblab chiqdi.

Tashqi iteratsiya xatoga moyil


Ko'pgina Java dasturchilari tashqi iteratsiya bilan qulay. Biroq, bir nechtasi bor
xato uchun imkoniyatlar. Misol uchun, siz o'zgaruvchan summani noto'g'ri ishga tushirishingiz, ishga tushirishingiz mumkin
o'zgaruvchini hisoblagichni noto'g'ri nazorat qilish, noto'g'ri tsiklni davom ettirish shartidan foydalanish, o'sish
nazorat o'zgaruvchisi hisoblagichini noto'g'ri yoki noto'g'ri yig'indiga massivdagi har bir qiymatni qo'shing.

Ichki takrorlash


Funktsional dasturlashda siz vazifada nimaga erishmoqchi ekanligingizni belgilaysiz, lekin emas
buni qanday amalga oshirish kerak. Ushbu bobda ko'rib turganingizdek, raqamli ma'lumotlar manbai elementlarini jamlash uchun
(massiv yoki to'plamdagilar kabi) siz Java SE 8 kutubxonasining yangi imkoniyatlaridan foydalanishingiz mumkin
“Mana maʼlumotlar manbai, uning elementlari yigʻindisini bering” deyishga ruxsat bering. Sizga kerak emas
elementlarni takrorlash yoki har qanday o'zgaruvchan o'zgaruvchilarni qanday e'lon qilish va ishlatishni belgilash.
Bu ichki iteratsiya sifatida tanilgan, chunki kutubxona hamma narsaga qanday kirishni aniqlaydi
vazifani bajarish uchun elementlar. Ichki iteratsiya bilan siz kutubxonaga buni osongina aytishingiz mumkin
kompyuteringizning afzalliklaridan foydalanish uchun ushbu vazifani parallel ishlov berish bilan bajarishni xohlaysiz
ko'p yadroli arxitektura - bu vazifaning ishlashini sezilarli darajada yaxshilashi mumkin. Siz xohlaganingizcha
23-bobda o'rganing, agar bu vazifalar bajarilsa, to'g'ri ishlaydigan parallel vazifalarni yaratish qiyin
dasturning holati ma'lumotlarini (ya'ni, uning o'zgaruvchan qiymatlarini) o'zgartirish. Shunday qilib, funktsional pro-
Bu erda o'rganadigan grammatika qobiliyatlari o'zgarmaslikka qaratilgan - o'zgartirishga emas
qayta ishlanayotgan ma'lumotlar manbai yoki boshqa dastur holati.

17.2.1 Funktsional interfeyslar


10.10-bo'limda Java SE 8 ning yangi interfeys xususiyatlari taqdim etilgan - standart usullar va
statik usullar - va funktsional interfeys tushunchasini muhokama qildi - bu interfeys
aniq bitta mavhum usulni o'z ichiga oladi (shuningdek, standart va statik usullarni ham o'z ichiga olishi mumkin)
ods). Bunday interfeyslar yagona mavhum usul (SAM) interfeyslari sifatida ham tanilgan. Funktsional
Interfeyslar funktsional dasturlashda keng qo'llaniladi, chunki ular ob'ekt sifatida ishlaydi.
funktsiya uchun yo'naltirilgan model.

java.util.function paketidagi funktsional interfeyslar


java.util.function paketi bir nechta funktsional interfeyslarni o'z ichiga oladi. 17.2-rasmda ko'rsatilgan
oltita asosiy umumiy funktsional interfeys. Jadvalda T va R umumiy tipdir
funktsional interfeys ishlaydigan ob'ekt turini ifodalovchi nomlar va
mos ravishda usulning qaytish turi. Boshqa ko'plab funktsional interfeyslar mavjud
17.2-rasmdagilarning ixtisoslashtirilgan versiyalari bo'lgan java.util.function paketi. Ko'pchilik
int, long va double ibtidoiy qiymatlari bilan foydalanish uchun, lekin umumiy xususiylashtirish ham mavjud.
Ikkilik operatsiyalar uchun iste'molchi, funktsiya va predikatlar - ya'ni usullar
ikkita dalil oling.

17.2 Funktsional dasturlash texnologiyalari haqida umumiy ma’lumot 733

17.2.2 Lambda ifodalari
Funktsional dasturlash lambda ifodalari bilan amalga oshiriladi. Lambda ifodasi
anonim usulni ifodalaydi - funktsional in'omni amalga oshirish uchun stenografiya
anonim ichki sinfga o'xshash interfeys (12.11-bo'lim). Lambda turini ifodalaydi
sion - lambda ifodasi amalga oshiradigan funktsional interfeys turi. Lambda
ifodalar funktsional interfeyslar kutilgan har qanday joyda ishlatilishi mumkin. Shu nuqtadan boshlab -
palatada, biz lambda iboralariga oddiygina lambdalar deb murojaat qilamiz. Biz asosiy lambda sintaksisini ko'rsatamiz
ushbu bo'limda va qo'shimcha lambda xususiyatlarini muhokama qiling, chunki biz ulardan bu va
keyingi boblar.
Lambda sintaksisi
Lambda parametrlar roʻyxatidan soʻng oʻq belgisi (->) va tanadan iborat boʻladi, masalan:

Quyidagi lambda ikkita ints oladi va ularning summasini qaytaradi:

Bunday holda, tana bir yoki bir nechta bayonotni o'z ichiga olishi mumkin bo'lgan bayonot blokidir
jingalak qavs ichida. Ushbu sintaksisning bir nechta o'zgarishlari mavjud. Masalan, parametr
turlari odatda chiqarib tashlanishi mumkin, masalan:

Interfeys tavsifi

BinaryOperator Ikkita T argumentini oladigan, amalni bajaradigan application usulini o'z ichiga oladi
Ularda (masalan, hisoblash) va T tipidagi qiymatni qaytaradi. Siz bir nechtasini ko'rasiz
17.3-bo'limda boshlangan BinaryOperators misollari.
Consumer T argumentini qabul qiluvchi va void qaytaruvchi qabul usulini o'z ichiga oladi. Ijro qiladi
T argumenti bo'lgan vazifa, masalan, ob'ektni chiqarish, usulni chaqirish
ob'ektning va boshqalar. Siz iste'molchilarning bir nechta misollarini ko'rasiz
17.3-bo'lim.
Function T argumentini qabul qiluvchi va turdagi qiymatni qaytaruvchi qo'llash usulini o'z ichiga oladi
R. T argumentida usulni chaqiradi va bu usulning natijasini qaytaradi. Siz
17.5-bo'limda boshlangan funksiyalarning bir nechta misollariga qarang.
Predicate T argumentini qabul qiluvchi va mantiqiy qiymatni qaytaruvchi usul testini o'z ichiga oladi. Testlar
T argumenti shartni qanoatlantiradimi. Siz bir nechta misollarni ko'rasiz
17.3-bo'limda boshlangan predikatlar.
Supplier Argumentlarni talab qilmaydigan va turdagi qiymatni ishlab chiqaradigan get usulini o'z ichiga oladi
T. Ko'pincha oqim operatsiyasi bo'lgan yig'ish ob'ektini yaratish uchun ishlatiladi
natijalar joylashtiriladi. Ta'minotchilarning bir nechta misollarini ko'rasiz
17.7-bo'lim.
UnaryOperator Argumentlarni talab qilmaydigan va T tipidagi qiymatni qaytaradigan get usulini o'z ichiga oladi.
Siz 17.3-bo'limda boshlangan UnaryOperatorsning bir nechta misollarini ko'rasiz.

17.2-rasm | java.util.function paketidagi oltita asosiy umumiy funktsional interfeys.

(parameterList) -> {bayonotlar}

(int x, int y) -> {qaytish x + y;}

(x, y) -> {qaytish x + y;}

734 17-bob Java SE 8 Lambdalar va oqimlar

u holda kompilyator lambdalar orqali parametr va qaytish turlarini aniqlaydi
kontekst - bu haqda keyinroq gapiramiz.
Agar tanada faqat bitta ifoda bo'lsa, return kalit so'zi va jingalak qavslar
o'tkazib yuborilishi mumkin, masalan:

bu holda ifodaning qiymati bilvosita qaytariladi. Parametrlar ro'yxatida mavjud bo'lganda


faqat bitta parametr, qavslar olib tashlanishi mumkin, masalan:

Lambdani bo'sh parametrlar ro'yxati bilan belgilash uchun parametrlar ro'yxatini bo'sh deb belgilang


strelka belgisining chap tomonidagi qavslar (->), quyidagi kabi:

Bundan tashqari, oldingi lambda sintaksisiga ixtisoslashgan qisqartma shakllari mavjud


Biz 17.5.1-bo'limda tanishtiradigan usul havolalari sifatida tanilgan lambdalar.

17.2.3 Oqimlar


Java SE 8 siz o'rgangan iteratorlarga o'xshash oqimlar tushunchasini taqdim etadi
16-bobda. Oqimlar - bu Stream interfeysini amalga oshiradigan sinflar ob'ektlari (
java.util.stream paketi) yoki rangni qayta ishlash uchun maxsus oqim interfeyslaridan biri.
int, long yoki double qiymatlari (biz 17.3-bo'limda kiritamiz). Birga
lambdalar bilan oqimlar sizga elementlar to'plamidagi vazifalarni bajarishga imkon beradi - ko'pincha
massiv yoki to'plam ob'ekti.

Oqim quvurlari


Oqimlar elementlarni ketma-ket ishlov berish bosqichlari orqali o'tkazadi - oqim trubkasi deb nomlanadi.
qator - ma'lumotlar manbai bilan boshlanadigan (masalan, massiv yoki to'plam), turli xil in-
ma'lumotlar manbai elementlari bo'yicha oraliq operatsiyalar va terminal operatsiyasi bilan tugaydi. A
oqim quvur liniyasi zanjirli usul chaqiruvlari orqali hosil bo'ladi. To'plamlardan farqli o'laroq, oqimlar mavjud emas
o'zlarining saqlash joylari - oqim qayta ishlangach, uni qayta ishlatib bo'lmaydi, chunki u yo'q
asl ma'lumotlar manbasining nusxasini saqlang.

Oraliq va terminal operatsiyalari


Oraliq operatsiya oqim elementlarida va har doim bajarilishi kerak bo'lgan vazifalarni belgilaydi
Natijada yangi oqim paydo bo'ladi. Oraliq operatsiyalar dangasa - ular agacha bajarilmaydi
terminal ishi chaqiriladi. Bu kutubxona ishlab chiquvchilariga oqim jarayonini optimallashtirish imkonini beradi
ishlash. Misol uchun, agar sizda 1 000 000 Shaxs ob'ektlari to'plami bo'lsa va
siz "Jons" familiyasi bilan birinchisini qidiryapsiz, oqimni qayta ishlash to'xtatilishi mumkin.
birinchi shunday Shaxs ob'ekti topilishi bilanoq nate.
Terminal operatsiyasi oqim quvurining oraliq operatsiyasini qayta ishlashni boshlaydi.
qiladi va natija beradi. Terminal operatsiyalari g'ayratli - ular so'ralganni bajaradilar
chaqirilganda operatsiya. Biz dangasa va g'ayratli operatsiyalar haqida ko'proq gapiramiz
bob davomida ularga duch keling va dangasa operatsiyalar qanday yaxshilanishini ko'rasiz
ishlash. 17.3-rasmda ba'zi umumiy oraliq operatsiyalar ko'rsatilgan. 17.4-rasm
ba'zi umumiy terminal operatsiyalarini ko'rsatadi.

(x, y) -> x + y

qiymat -> System.out.printf("%d ", qiymat)

() -> System.out.println("Lambdalarga xush kelibsiz!")


17.2 Funktsional dasturlash texnologiyalari haqida umumiy ma’lumot 735

Fayllarni qayta ishlashdagi oqim va funktsional dasturlashdagi oqim
Ushbu bob davomida biz oqim atamasidan funktsional dastur kontekstida foydalanamiz.
ming - bu biz 15-bob, "Fayllar" da muhokama qilgan kiritish-chiqarish oqimlari bilan bir xil tushuncha emas.

Intermediate Stream operatsiyalari

filtri Natijalar faqat shartni qondiradigan elementlarni o'z ichiga olgan oqim hosil qiladi.
faqat noyob elementlarni o'z ichiga olgan oqimdagi natijalar.
limiti boshidan ko'rsatilgan elementlar soniga ega oqimdagi natijalar
asl oqimdan.
map. Natijalar asl oqimning har bir elementi bilan taqqoslanadi
yangi qiymat (ehtimol boshqa turdagi) - masalan, raqamli qiymatlarni xaritalash
raqamli qiymatlarning kvadratlari. Yangi oqim bir xil songa ega
elementlar asl oqim sifatida.
tartiblangan Elementlar tartiblangan tartibda joylashgan oqimdagi natijalar. Yangi oqim
original oqim bilan bir xil miqdordagi elementlarga ega.

17.3-rasm | Umumiy oraliq oqim operatsiyalari.

Terminal oqimi operatsiyalari

forEach Oqimdagi har bir elementga ishlov berishni amalga oshiradi (masalan, har bir elementni ko'rsatish).


Qisqartirish operatsiyalari - oqimdagi barcha qiymatlarni oling va bitta qiymatni qaytaring
o'rtacha Raqamli oqimdagi elementlarning o'rtacha qiymatini hisoblaydi.
count Oqimdagi elementlar sonini qaytaradi.
max Raqamli oqimdagi eng katta qiymatni aniqlaydi.
min Raqamli oqimdagi eng kichik qiymatni aniqlaydi.
kamaytirish Assotsiativ jamg'arma yordamida to'plam elementlarini bitta qiymatga qisqartiradi.
latsiya funktsiyasi (masalan, ikkita elementni qo'shadigan lambda).
O'zgaruvchan qisqartirish operatsiyalari - konteyner yaratish (masalan, to'plam yoki StringBuilder)
yig'ish Oqimning oldingi natijalarini o'z ichiga olgan yangi elementlar to'plamini yaratadi
operatsiyalar.
toArray Oqimning oldingi operatsiyalari natijalarini o'z ichiga olgan massiv yaratadi.
Qidiruv operatsiyalari
findFirst Avvalgi oraliq operatsiyalar asosida birinchi oqim elementini topadi; zudlik bilan
Bunday element topilgandan so'ng oqim quvurini qayta ishlashni to'xtatadi.
findAny Oldingi oraliq operatsiyalar asosida istalgan oqim elementini topadi; darhol
bunday element topilgandan keyin oqim quvurini qayta ishlashni tugatadi.
anyMatch Har qanday oqim elementlari belgilangan shartga mos kelishini aniqlaydi; zudlik bilan
Agar element mos kelsa, oqim quvurini qayta ishlashni to'xtatadi.
allMatch Oqimdagi barcha elementlar belgilangan shartga mos kelishini aniqlaydi.

17.4-rasm | Umumiy terminal oqimi operatsiyalari.


736 17-bob Java SE 8 Lambdalar va oqimlar

Oqimlar va ob'ektni ketma-ketlashtirish, bunda dastur fayldan baytlar oqimini o'qiydi
yoki faylga baytlar oqimini chiqaradi. 17.7-bo'limda ko'rib turganingizdek, func-dan ham foydalanishingiz mumkin.
fayl mazmunini boshqarish uchun milliy dasturlash.

17.3 IntStream operatsiyalari


[Ushbu bo'lim dasturlashni soddalashtirish uchun lambdalar va oqimlardan qanday foydalanish mumkinligini ko'rsatadi
7-bob, Massivlar va massivlar roʻyxatida oʻrgangan vazifalaringiz.]
17.5-rasmda IntStream (java.util.stream to'plami)dagi operatsiyalar ko'rsatilgan - a
int qiymatlarini manipulyatsiya qilish uchun maxsus oqim. Ushbu misolda ko'rsatilgan texnikalar ham
LongStreams va DoubleStreams uchun mos ravishda long va double qiymatlari uchun amal qiladi.

1 // 17.5-rasm: IntStreamOperations.java


2 // IntStream operatsiyalarini namoyish qilish.
3 import java.util.Arrays;
4
5
6 ommaviy sinf IntStreamOperations
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 ta int[] qiymatlari = {3, 10, 6, 1, 4, 8, 2, 5, 9, 7};
11
12 // asl qiymatlarni ko'rsatish
13 System.out.print("Asl qiymatlar: ");
14
15
16 System.out.println();
17
18 // qiymatlarni hisoblash, min, maks, yig'indisi va o'rtachasi
19 System.out.printf("%nCount: %d%n", );
20 System.out.printf("Min: %d%n",
21);
22 System.out.printf("Maks: %d%n",
23);
24 System.out.printf("Yig'indi: %d%n", );
25 System.out.printf("O'rtacha: %.2f%n",
26);
27
28 // kamaytirish usuli bilan qiymatlar yig'indisi
29 System.out.printf("Kamaytirish usuli orqali %nSum: %d%n",
30
31);
32
33 // kamaytirish usuli bilan qiymatlar kvadratlari yig'indisi
34 System.out.printf("Kamaytirish usuli bo'yicha kvadratlar yig'indisi: %d%n",
35
36);

17.5-rasm | IntStream operatsiyalarini namoyish qilish. (2-qismning 1-qismi.)

import java.util.stream.IntStream;

IntStream.of(qiymatlar)


.forEach(qiymat -> System.out.printf("%d ", qiymat));

IntStream.of(qiymatlar).count()

IntStream.of(qiymatlar).min().getAsInt()

IntStream.of(qiymatlar).max().getAsInt()


IntStream.of(qiymatlar).sum()

IntStream.of(qiymatlar).average().getAsDouble()

IntStream.of(qiymatlar)
.reduce(0, (x, y) -> x + y)

IntStream.of(qiymatlar)


.reduce(0, (x, y) -> x + y * y)

17.3 IntStream operatsiyalari 737

37
38 // kamaytirish usuli bilan qiymatlar mahsuloti
39 System.out.printf("Mahsulotni qisqartirish usuli orqali: %d%n",
40
41);
42
43 // juft qiymatlar tartiblangan tartibda ko'rsatiladi
44 System.out.printf("%nEven qiymatlar tartiblangan tartibda ko'rsatiladi: ");
45
46
47
48
49 System.out.println();
50
51 // toq qiymatlar 10 ga ko'paytiriladi va tartiblangan tartibda ko'rsatiladi
52 System.out.printf(
53 "10 ga ko'paytirilgan g'alati qiymatlar tartiblangan tartibda ko'rsatiladi: ");
54
55
56
57
58
59 System.out.println();
60
61 // 1 dan 10 gacha bo'lgan butun sonlar yig'indisi, eksklyuziv
62 System.out.printf("%n1 dan 9 gacha butun sonlar yig'indisi: %d%n",
63);
64
65 // 1 dan 10 gacha bo'lgan butun sonlar yig'indisi
66 System.out.printf("1 dan 10 gacha butun sonlar yig'indisi: %d%n",
67);
68 }
69 } // IntStreamOperations oxirgi sinfi

Asl qiymatlar: 3 10 6 1 4 8 2 5 9 7

Hisob: 10
Min: 1
Maksimal: 10
Jami: 55
O'rtacha: 5,50

Kamaytirish usuli bo'yicha yig'indi: 55


Kamaytirish usuli yordamida kvadratlar yig'indisi: 385
Qisqartirish usuli orqali mahsulot: 3628800

Juft qiymatlar tartiblangan tartibda ko'rsatiladi: 2 4 6 8 10


10 ga ko'paytirilgan toq qiymatlar tartiblangan tartibda ko'rsatiladi: 10 30 50 70 90

1 dan 9 gacha bo‘lgan butun sonlar yig‘indisi: 45


1 dan 10 gacha bo‘lgan butun sonlar yig‘indisi: 55

17.5-rasm | IntStream operatsiyalarini namoyish qilish. (2-qismning 2-qismi.)

IntStream.of(qiymatlar)
.reduce(1, (x, y) -> x * y)

IntStream.of(qiymatlar)


.filtr(qiymat -> qiymat % 2 == 0)
.sorted()
.forEach(qiymat -> System.out.printf("%d ", qiymat));

IntStream.of(qiymatlar)


.filtr(qiymat -> qiymat % 2 != 0)
.map(qiymat -> qiymat * 10)
.sorted()
.forEach(qiymat -> System.out.printf("%d ", qiymat));

IntStream.range(1, 10).sum()

IntStream.rangeClosed(1, 10).sum()

738 17-bob Java SE 8 Lambdalar va oqimlar

17.3.1 IntStream yaratish va uning qiymatlarini
Har bir terminal operatsiyasi uchun
IntStream statik usuli (14-qator) argument sifatida int massivini oladi va qaytaradi
massiv qiymatlarini qayta ishlash uchun IntStream. Oqim yaratganingizdan so'ng, zanjirlashingiz mumkin
birgalikda oqim quvurini yaratish uchun bir nechta usul chaqiruvlari. 14-15-qatorlardagi bayonot
qiymatlar massivi uchun IntStream ni yaratadi, keyin Each uchun IntStream usulidan foydalanadi (a
terminal operatsiyasi) har bir oqim elementida vazifani bajarish uchun. Har bir qabul qilish usuli
Argument sifatida IntConsumer funktsional interfeysini amalga oshiradigan ob'ekt (paket
java.util.function) - bu umumiy iste'molchi funktsiyasining o'ziga xos versiyasidir.
interfeys. Ushbu interfeysning qabul qilish usuli bitta int qiymatini oladi va vazifani bajaradi
u - bu holda, qiymat va bo'sh joy ko'rsatiladi. Java SE 8 dan oldin siz odatda
IntConsumer interfeysi anonim ichki sinfdan foydalanadi, masalan:

lekin Java SE 8 da siz shunchaki lambda yozasiz

Qabul qilish usulining parametr nomi (qiymati) lambda parametriga aylanadi va
accept usulining tana bayonoti lambda ifodasining tanasiga aylanadi. Ko'rib turganingizdek,
lambda sintaksisi anonim ichki sinfga qaraganda aniqroq va ixchamroq.
Xulosa turi va Lambda maqsad turi
Java kompilyatori odatda lambda parametrlarining turlarini va qayta turini aniqlashi mumkin.
lambda ishlatilgan kontekstdan lambda tomonidan aylantirilgan. Bu tomonidan belgilanadi
lambdaning maqsadli turi - lambda joylashgan joyda kutilayotgan funktsional interfeys turi
kodda paydo bo'ladi. 15-qatorda maqsadli tur IntConsumer hisoblanadi. Bunday holda, lambda
parametr turi int deb hisoblanadi, chunki interfeys IntConsumerning qabul qilish usuli ex-
int olish uchun. Siz quyidagi kabi parametr turini aniq e'lon qilishingiz mumkin:

Buni amalga oshirishda lambda parametrlari ro'yxati qavs ichiga olinishi kerak. Biz umuman


kompilyator bizning misollarimizda lambda parametrining turini chiqarsin.
Yakuniy mahalliy o'zgaruvchilar, samarali yakuniy mahalliy o'zgaruvchilar va lambdalarni olish
Java SE 8 dan oldin, anonim ichki sinfni amalga oshirishda siz mahalliy o'zgarishlardan foydalanishingiz mumkin.
qo'shish usulidan (leksik doira sifatida tanilgan), lekin sizdan talab qilingan
ushbu mahalliy o'zgaruvchilarni yakuniy deb e'lon qiling. Lambdalar yakuniy mahalliy o'zgaruvchilardan ham foydalanishi mumkin. Java SE da
8, anonim ichki sinflar va lambdalar yakuniy mahalliy o'zgaruvchilardan ham samarali foydalanishi mumkin - bu
ya'ni, dastlab e'lon qilingan va ishga tushirilgandan keyin o'zgartirilmaydigan mahalliy o'zgaruvchilar. Qo'zi -
leksik doiradagi mahalliy o‘zgaruvchiga ishora qiluvchi da tutuvchi qo‘zi- deb nomlanadi.
da. Kompilyator mahalliy o'zgaruvchining qiymatini oladi va qiymatdan foydalanish mumkinligini ta'minlaydi
lambda oxir-oqibat bajarilganda, bu uning lug'aviy doirasi endi mavjud bo'lmaganidan keyin bo'lishi mumkin.

yangi IntConsumer()


{
ommaviy bekor qabul qilish (int qiymati)
{
System.out.printf("%d ", qiymat);
}
}

qiymat -> System.out.printf("%d ", qiymat)

(int qiymati) -> System.out.printf("%d ", qiymat)

17.3 IntStream operatsiyalari 739

Buni misol usulida paydo bo'ladigan Lambdada ishlatish
Anonim ichki sinfda bo'lgani kabi, lambda tashqi sinfning ushbu havolasidan foydalanishi mumkin. Bir yilda
anonim ichki sinf uchun siz OuterClassName.this sintaksisidan foydalanishingiz kerak, aks holda
bu havola anonim ichki sinf ob'ektiga ishora qiladi. Lambdada siz murojaat qilasiz
tashqi sinf ob'ektiga, shunchaki bu kabi.
Lambdadagi parametr va o'zgaruvchilar nomlari
Lambdalarda ishlatadigan parametr nomlari va o'zgaruvchilar nomlari bilan bir xil bo'lishi mumkin emas
lambda leksik doirasidagi boshqa har qanday mahalliy o'zgaruvchilar; aks holda kompilyatsiya xatosi yuzaga keladi.
17.3.2 Terminal operatsiyalari soni, min, maks, yig'indisi va o'rtacha
Class IntStream umumiy oqimlarni qisqartirish uchun turli terminal operatsiyalarini taqdim etadi
int qiymatlari oqimlari. Terminal operatsiyalari g'ayratli - ular darhol narsalarni qayta ishlaydi
oqimda. IntStreams uchun umumiy qisqartirish operatsiyalari quyidagilarni o'z ichiga oladi:
• count (19-satr) oqimdagi elementlar sonini qaytaradi.
• min (21-satr) oqimdagi eng kichik intni qaytaradi.
• max (23-satr) oqimdagi eng katta intni qaytaradi.
• sum (24-satr) oqimdagi barcha ints yig'indisini qaytaradi.
• o'rtacha (26-satr) o'z ichiga OptionalDouble (java.util paketi)ni qaytaradi.
double turidagi qiymat sifatida oqimdagi intslarning o'rtachasi. Har qanday oqim uchun,
oqimda hech qanday elementlar bo'lmasligi mumkin. OptionalDouble qaytarilmoqda
Agar oqimda kamida bitta boʻlsa, oʻrtacha qiymatni qaytarish uchun oʻrtacha usulga imkon beradi
element. Ushbu misolda biz oqim 10 ta elementga ega ekanligini bilamiz, shuning uchun biz sinfni chaqiramiz
O'rtachani olish uchun OptionalDouble ning getAsDouble usuli. Agar yo'q bo'lsa
elementlar bo'lsa, OptionalDouble o'rtacha va getAsDoubleni o'z ichiga olmaydi
NoSuchElementException ni tashlaydi. Ushbu istisnoning oldini olish uchun siz quyidagilarni kiritishingiz mumkin:
Agar mavjud bo'lsa, OptionalDouble qiymatini qaytaradigan stead call usuli orElse
biri yoki siz orElse ga o'tadigan qiymat, aks holda.
Class IntStream shuningdek, hisoblash, min,
IntStream elementlarining bir marta o'tishida maksimal, yig'indi va o'rtacha operatsiyalar va qaytaradi
natijalar IntSummaryStatistics ob'ekti sifatida (java.util paketi). Bu muhim ahamiyatga ega
Har bir alohida operatsiya uchun IntStream-ni qayta-qayta qayta ishlash orqali unumdorlikni oshirib bo'lmaydi.
eratsiya. Ushbu ob'ektda har bir natijani olish usullari va toString usuli mavjud
barcha natijalarni umumlashtiradi. Masalan, bayonot:

ishlab chiqaradi:

17.5-rasmdagi massiv qiymatlari uchun.
17.3.3 Terminalning ishlashini qisqartirish
Siz IntStream uchun o'zingizning qisqartirishlaringizni uning kamaytirish usulini chaqirib belgilashingiz mumkin
17.5-rasmning 29-31-qatorlarida ko'rsatilgan. 17.3.2-bo'limdagi terminal operatsiyalarining har biri a

System.out.println(IntStream.of(qiymatlar).summaryStatistics());

IntSummaryStatistics{hisob=10, summa=55, min=1, oʻrtacha=5.500000,
maksimal=10}

740 17-bob Java SE 8 Lambdalar va oqimlar

kamaytirishning ixtisoslashtirilgan amalga oshirilishi. Masalan, 31-satrda Int-ni qanday yig'ish kerakligi ko'rsatilgan.
Steamning qiymatlari summani emas, balki kamaytirish. Birinchi argument (0) yordam beradigan qiymatdir
siz qisqartirish operatsiyasini boshlaysiz va ikkinchi argument amalga oshiradigan ob'ektdir
IntBinaryOperator funktsional interfeysi (java.util.function paketi). Lambda:

interfeysning applyAsInt usulini amalga oshiradi, u ikkita int qiymatini oladi (vakillik-


ikkilik operatorning chap va o'ng operandlarini ing) va bilan hisoblashni amalga oshiradi
qiymatlar - bu holda qiymatlarni qo'shish. Ikki yoki undan ortiq parametrga ega lambda
ularni qavs ichida yoping. Kamaytirishni baholash quyidagicha davom etadi:
• Kamaytirish uchun birinchi chaqiruvda lambda parametri x qiymati identifikatsiya qiymati (0)
va lambda parametri y qiymati oqimdagi birinchi int (3) ni hosil qiladi
yig'indisi 3 (0 + 3).
• Kamaytirish uchun keyingi chaqiruvda lambda parametri x qiymati birinchisining natijasidir
hisoblash (3) va lambda parametri y ning qiymati oqimdagi ikkinchi int
(10), yig'indisi 13 (3 + 10) hosil bo'ladi.
• Kamaytirish uchun keyingi chaqiruvda lambda parametri x ning qiymati oldingi qiymatning natijasidir.
ous hisoblash (13) va lambda parametri y qiymati oqimdagi uchinchi int
(6), yig'indisi 19 (13 + 6).
Bu jarayon IntSteam qiymatlarining umumiy yig'indisini ishlab chiqarishni davom ettiradi, ular hammasi tugaguncha
ishlatilgan, bunda yakuniy summa qaytariladi.
Identifikatsiya qiymati argumentini kamaytirish usuli
Metodu kamaytirishning birinchi argumenti rasmiy ravishda identifikatsiya qiymati deb ataladi - bu qiymat, qachon
IntBinaryOperator yordamida har qanday oqim elementi bilan birgalikda ushbu elementni ishlab chiqaradi
asl qiymati. Masalan, elementlarni yig'ishda identifikatsiya qiymati 0 (har qanday int
0 ga qo'shilgan qiymat asl qiymatga olib keladi) va elementlarning mahsulotini olishda
identifikatsiya qiymati 1 (har qanday int qiymati 1 ga ko'paytirilsa, asl qiymat hosil bo'ladi).
Qiymatlarning kvadratlarini kamaytirish usuli bilan yig'ish
17.5-rasmning 34-36-qatorlari kvadratlarning yig'indisini hisoblash uchun kamaytirish usulidan foydalaniladi.
IntSteam qiymatlari. Bu holda lambda joriy qiymatning kvadratini ishga tushirishga qo'shadi.
jami. Kamaytirishni baholash quyidagicha davom etadi:
• Kamaytirish uchun birinchi chaqiruvda lambda parametri x qiymati identifikatsiya qiymati (0)
va lambda parametri y qiymati oqimdagi birinchi int (3) ni hosil qiladi
qiymat 9 (0 + 32).
• Kamaytirish uchun keyingi chaqiruvda lambda parametri x qiymati birinchisining natijasidir
hisoblash (9) va lambda parametri y ning qiymati oqimdagi ikkinchi int
(10), yig'indisi 109 (9 + 102).
• Kamaytirish uchun keyingi chaqiruvda lambda parametri x ning qiymati oldingi qiymatning natijasidir.
ous hisoblash (109) va lambda parametri y qiymati uchinchi int hisoblanadi.
oqim (6), yig'indisi 145 (109 + 62) hosil qiladi.
Bu jarayon IntSteam qiymatlarining umumiy kvadratlarini ishlab chiqarishda davom etadi
ularning barchasi ishlatilmaguncha, yakuniy summa qaytariladi.

(x, y) -> x + y


17.3 IntStream operatsiyalari 741

Qiymatlar mahsulotini kamaytirish usuli bilan hisoblash
17.5-rasmning 39–41-qatorlari IntSteam mahsulotini hisoblash uchun qisqartirish usulidan foydalaniladi.
qiymatlar. Bunday holda, lambda o'zining ikkita argumentini ko'paytiradi. Chunki biz ishlab chiqaramiz
mahsulot, biz bu holda identifikatsiya qiymati 1 bilan boshlaymiz. Kamaytirish pro-
quyidagicha ifodalanadi:
• Kamaytirish uchun birinchi chaqiruvda lambda parametri x qiymati identifikatsiya qiymati (1)
va lambda parametri y qiymati oqimdagi birinchi int (3) ni hosil qiladi
qiymat 3 (1 * 3).
• Kamaytirish uchun keyingi chaqiruvda lambda parametri x qiymati birinchisining natijasidir
hisoblash (3) va lambda parametri y ning qiymati oqimdagi ikkinchi int
(10), yig'indisi 30 (3 * 10) hosil qiladi.
• Kamaytirish uchun keyingi chaqiruvda lambda parametri x ning qiymati oldingi qiymatning natijasidir.
ous hisoblash (30) va lambda parametri y qiymati oqimdagi uchinchi int
(6), yig'indisi 180 (30 * 6).
Bu jarayon IntSteam qiymatlarining amaldagi mahsulotini ishlab chiqarishda davom etadi
hammasi ishlatilgan, bunda yakuniy mahsulot qaytariladi.

17.3.4 Oraliq operatsiyalar: IntStreamni filtrlash va saralash


Qiymatlar
17.5-rasmning 45-48-qatorlari Int-da juft butun sonlarni joylashtirgan oqim quvurini yaratadi.
Stream, ularni o'sish tartibida tartiblaydi va har bir qiymatdan keyin bo'sh joyni ko'rsatadi.
Intermediate Operation filter
Shartga mos keladigan oraliq natijalar oqimini yaratish uchun elementlarni filtrlaysiz—
predikat sifatida tanilgan. IntStream usuli filtri (46-qator) amalga oshiradigan ob'ektni oladi:
IntPredicate funktsional interfeysi (java.util.function paketi). Qo'zi -
46-qatorda:

interfeysning test usulini amalga oshiradi, u int oladi va mantiqiy ko'rsatkichni qaytaradi.


int predikatga mos keladimi yoki yo'qligini aniqlash - bu holda IntPredicate haqiqatni qaytaradi
agar u qabul qilgan qiymat 2 ga bo'linadigan bo'lsa. Filtrga qo'ng'iroqlar va boshqa oraliq oqimlar
dangasa - ular terminal operatsiyasi bajarilmaguncha baholanmaydi (bu ishtiyoqli) va pro-
elementlarning yangi oqimini keltirib chiqaradi. 45–48-qatorlarda bu forEach chaqirilganda sodir bo'ladi (48-qator).
Oraliq operatsiya tartiblangan
IntStream usuli saralangan oqim elementlarini ortib boruvchi tartibda tartibga soladi. Kabi
filtr, tartiblangan - dangasa operatsiya; ammo, saralash oxirida amalga oshirilganda, barcha
oqim quvuridagi oldingi oraliq operatsiyalar to'liq bo'lishi kerak, shuning uchun bu usul
sorted qaysi elementlarni saralashni biladi.
Oqim quvur liniyasini qayta ishlash va fuqaroligi bo'lmagan va davlatga oid oraliq operatsiyalar
ForEach chaqirilganda, oqim quvur liniyasi qayta ishlanadi. 46-qator oraliq ishlab chiqaradi.
Faqat juft sonlarni o'z ichiga olgan IntStream ni yeb, keyin 47-qator ularni tartiblaydi va 48-qatorni ajratadi.
har bir elementni o'ynaydi.

qiymat -> qiymat % 2 == 0


742 17-bob Java SE 8 Lambdalar va oqimlar

Usul filtri fuqaroligi bo'lmagan oraliq operatsiya bo'lib, u hech qanday ma'lumotni talab qilmaydi.
joriy element mavjudligini tekshirish uchun oqimdagi boshqa elementlar haqida ma'lumot
predikatni qanoatlantiradi. Xuddi shunday usul xaritasi (qisqacha muhokama qilinadi) davlatsiz oraliq hisoblanadi
operatsiya. Tartiblangan usul - bu ma'lumot talab qiladigan statistik oraliq operatsiya
ularni saralash uchun oqimdagi barcha boshqa elementlar haqida. Xuddi shunday usul dis-
tinct - bu holat oraliq operatsiya. Har bir oraliq uchun onlayn hujjatlar
diate oqim operatsiyasi uning fuqaroligi yo'q yoki statistik operatsiya ekanligini aniqlaydi.

IntPredicate funktsional interfeysining boshqa usullari


Interface IntPredicate shuningdek, uchta standart usulni o'z ichiga oladi:
• va— qisqa tutashuvni baholash bilan mantiqiy VA ni bajaradi (5.9-bo'lim).
u chaqirilgan IntPredicate va u ar- sifatida qabul qilingan IntPredicate
gument.
• inkor qilish — IntPredicate ning mantiqiy qiymatini o'zgartiradi.
• yoki—IntPredi- o'rtasida qisqa tutashuvni baholash bilan mantiqiy OR ni bajaradi.
u chaqirilgan cate va IntPredicate argument sifatida qabul qilinadi.

Lambda ifodalarini yaratish


Siz murakkabroq shartlarni yaratish uchun ushbu usullardan va IntPredicate ob'ektlaridan foydalanishingiz mumkin.
lar. Misol uchun, quyidagi ikkita IntPredicatesni ko'rib chiqing:

5 dan katta bo'lgan barcha juft sonlarni topish uchun 46-qatordagi lambdani quyidagi bilan almashtirishingiz mumkin.


IntPredicate

17.3.5 Oraliq operatsiya: xaritalash


17.5-rasmning 54–58-qatorlari Int-da toq butun sonlarni joylashtirgan oqim quvurini yaratadi.
Oqim, har bir toq sonni 10 ga ko‘paytiradi, qiymatlarni o‘sish tartibida tartiblaydi va ko‘rsatadi
Har bir qiymatdan keyin bo'sh joy.

O'rta operatsion xaritasi


Bu erdagi yangi xususiyat - har bir qiymatni qabul qiladigan va uni ko'paytiradigan xaritalash operatsiyasi
10. Xaritalash oqim elementlarini yangi qiymatlarga aylantiruvchi oraliq amaldir
va hosil bo'lgan elementlarni o'z ichiga olgan oqim hosil qiladi. Ba'zan bular har xil bo'ladi
original oqim elementlaridan turlar.
IntStream usuli xaritasi (56-qator) IntUnary-ni amalga oshiradigan ob'ektni oladi.
Operatorning funksional interfeysi (java.util.function paketi). 55-qatordagi lambda:

interfeysning applyAsInt usulini amalga oshiradi, u int ni oladi va uni a bilan taqqoslaydi


yangi int qiymati. Xaritaga qo'ng'iroqlar dangasa. Metod xaritasi - fuqaroligi bo'lmagan oqim operatsiyasi.

IntPredicate even = qiymat -> qiymat % 2 == 0;


IntPredicate greaterThan5 = qiymat -> qiymat > 5;

teng.va(5dan katta)

qiymat -> qiymat * 10

17.4 Stream manipulyatsiyalari 743

Oqim quvur liniyasini qayta ishlash
ForEach chaqirilganda (58-qator), oqim quvur liniyasi qayta ishlanadi. Birinchidan, 55-qator ishlab chiqaradi
faqat toq qiymatlarni o'z ichiga olgan oraliq IntStream. Keyinchalik, 56-qator har birini ko'paytiradi
10 ga toq butun son. Keyin 57-satr qiymatlarni tartiblaydi va 58-satr har bir elementni ko'rsatadi.

17.3.6 IntStream Methods diapazoni bilan ints oqimlarini yaratish va


diapazon yopiq
Agar sizga int qiymatlarining tartiblangan ketma-ketligi kerak bo'lsa, ularni o'z ichiga olgan IntStream yaratishingiz mumkin
IntStream usullari diapazoni (17.5-rasmning 63-satri) va rangeClosed (67-qator) bilan qiymatlar.
Ikkala usul ham qiymatlar oralig'ini ifodalovchi ikkita int argumentini oladi. Usul diapazoni
birinchi argumentidan tortib to ikkinchisiga qadar qiymatlar ketma-ketligini hosil qiladi, lekin ikkinchisini hisobga olmaganda
dalil. Metod rangeClosed ikkala argumentini o'z ichiga olgan qiymatlar ketma-ketligini hosil qiladi.
mentlar. 63 va 67 qatorlar int qiymatlari ketma-ketligini ishlab chiqarish uchun ushbu usullarni namoyish etadi
mos ravishda 1–9 va 1–10. IntStream usullarining to'liq ro'yxati uchun tashrif buyuring:

17.4 Stream manipulyatsiyalari


[Ushbu bo'lim dasturlashni soddalashtirish uchun lambdalar va oqimlardan qanday foydalanish mumkinligini ko'rsatadi
7-bob, Massivlar va massivlar roʻyxatida oʻrgangan vazifalaringiz.]
IntStream klassining usuli bir qator intslardan IntStream yaratishi mumkin bo'lganidek, sinf
Massivning oqim usuli bir qator ob'ektlardan Stream yaratish uchun ishlatilishi mumkin.
17.6-rasm xuddi shu texnologiyadan foydalangan holda Stream da filtrlash va saralashni amalga oshiradi.
17.3-bo'limda o'rgangan xususiyatlaringiz. Dastur a natijalarini qanday yig'ishni ham ko'rsatadi
quvur liniyasi operatsiyalarini keyingi holatda qayta ishlashingiz mumkin bo'lgan yangi to'plamga o'tkazing
mentlar. Ushbu misol davomida biz boshlang'ich bo'lgan Integer massiv qiymatlaridan foydalanamiz (12-qator).
int qiymatlari bilan ajratilgan - kompilyator har bir intni Integer ob'ektiga joylashtiradi. 15-qator ko'rsatiladi
har qanday oqimni qayta ishlashdan oldin qiymatlar tarkibi.

http://download.java.net/jdk8/docs/api/java/util/stream/


IntStream.html

1 // 17.6-rasm: ArraysAndStreams.java


2 // Butun sonlar massivi bilan lambdalar va oqimlarni namoyish qilish.
3 import java.util.Arrays;
4 i
5 import java.util.List;
6
7
8 ommaviy sinf ArraysAndStreams
9 {
10 ta umumiy statik bekor asosiy (String [] args)
11 {
12 Integer[] qiymatlari = {2, 9, 5, 0, 3, 7, 1, 4, 8, 6};
13
14 // asl qiymatlarni ko'rsatish
15 System.out.printf("Asl qiymatlar: %s%n", Arrays.asList(qiymatlar));

17.6-rasm | Butun sonlar massivi bilan lambdalar va oqimlarni namoyish qilish. (2-qismning 1-qismi.)

mpport java.util.Comparator;

java.util.stream.Kollektorlarni import qilish;


744 17-bob Java SE 8 Lambdalar va oqimlar

17.4.1 Stream yaratish
Arrays sinfining statik usul oqimiga ob'ektlar massivini o'tkazganingizda, usul
tegishli turdagi Streamni qaytaradi, masalan, 19-satr quyidagidan Stream hosil qiladi.
Integer massivi. Interface Stream (java.util.stream paketi) umumiy interfeysdir
har qanday primitiv bo'lmagan turdagi oqim operatsiyalarini bajarish. Yordamchi ob'ektlarning turlari
Oqim manbasi tomonidan belgilanadi.
Sinf massivlari, shuningdek, Int-ni yaratish uchun usullar oqimining haddan tashqari yuklangan versiyalarini taqdim etadi.
Butun int, uzun va juft massivlardan oqimlar, LongStreams va DoubleStreams yoki
massivlardagi elementlar diapazonidan. Ixtisoslashgan IntStream, LongStream va Dou-
bleStream sinflari raqamli oqimlarda umumiy operatsiyalar uchun turli usullarni taqdim etadi,
17.3-bo'limda bilib olganingizdek.

16
17 // qiymatlarni oqimlar bilan o'sish tartibida tartiblang


18 System.out.printf("Tartiblangan qiymatlar: %s%n",
19
20
21);
22
23 // qiymatlar 4 dan katta
24
25
26
27
28 System.out.printf("Qiymatlar 4 dan katta: %s%n", greaterThan4);
29
30 // filtr qiymatlari 4 dan katta, keyin natijalarni tartiblang
31 System.out.printf("4 dan katta saralangan qiymatlar: %s%n",
32
33
34
35);
36
37 // greaterThan4 Oqimlar bilan tartiblangan roʻyxat
38 System.out.printf(
39 "Qiymatlar 4 dan katta (oqimlar bilan ortib boruvchi): %s%n",
40
41
42);
43 }
44 } // oxirgi sinf ArraysAndStreams

Asl qiymatlar: [2, 9, 5, 0, 3, 7, 1, 4, 8, 6]


Saralangan qiymatlar: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4 dan katta qiymatlar: [9, 5, 7, 8, 6]
4 dan katta saralangan qiymatlar: [5, 6, 7, 8, 9]
4 dan katta qiymatlar (oqimlar bilan ortib boruvchi): [5, 6, 7, 8, 9]

17.6-rasm | Butun sonlar massivi bilan lambdalar va oqimlarni namoyish qilish. (2-qismning 2-qismi.)

Arrays.stream(qiymatlar)
.sorted()
.collect(Collectors.toList())

Ro'yxat greaterThan4 =


Arrays.stream(qiymatlar)
.filtr(qiymat -> qiymat > 4)
.collect(Collectors.toList());

Arrays.stream(qiymatlar)


.filtr(qiymat -> qiymat > 4)
.sorted()
.collect(Collectors.toList())

greaterThan4.stream()


.sorted()
.collect(Collectors.toList())

17.4 Stream manipulyatsiyalari 745

17.4.2 Oqimni saralash va natijalarni yig'ish
7.15-bo'limda siz massivlarni tartiblash va parallelSort statik bilan qanday saralashni o'rgandingiz
Massivlar sinfining usullari. Siz tez-tez oqim operatsiyalari natijalarini 18-qatorda tartiblaysiz.
21 biz oqim texnikasidan foydalangan holda qiymatlar massivini saralaymiz va tartiblangan qiymatlarni ko'rsatamiz. Birinchidan,
19-qator qiymatlardan Stream hosil qiladi. Keyinchalik, 20-qator Stream usulini saralaydi-
Elementlarni saralaydigan ed - buning natijasida oraliq Stream bilan
qiymatlar ortib boruvchi tartibda.
Saralangan natijalarni ko'rsatish uchun biz har bir qiymatni Stream terminal operatsiyasidan foydalanib chiqarishimiz mumkin.
ation forEach (17.5-rasmning 15-qatoridagi kabi). Biroq, oqimlarni qayta ishlashda siz tez-tez
qo'shimcha operatsiyalarni bajarishingiz uchun natijalarni o'z ichiga olgan yangi to'plamlarni yarating
ular ustida. To'plamni yaratish uchun siz Stream usulidan foydalanishingiz mumkin yig'ish (17.6-rasm, 21-qator),
bu terminal operatsiyasi. Oqim quvur liniyasi qayta ishlanayotganda, yig'ish usuli amalga oshiriladi
natijalarni keyinchalik mumkin bo'lgan ob'ektga joylashtiradigan o'zgaruvchan qisqartirish operatsiyasi
o'zgartirilishi mumkin - ko'pincha ro'yxat, xarita yoki to'plam kabi to'plam. Yig'ish usulining versiyasi
21-satrda argument sifatida Kollektor interfeysini (paket
java.util.stream), bu o'zgaruvchan qisqartirishni qanday amalga oshirishni belgilaydi. Sinflar to'plami -
tors (java.util.stream paketi) oldindan belgilangan Col-ni qaytaradigan statik usullarni taqdim etadi.
lektorni amalga oshirish. Misol uchun, Collectors usuli toList (21-satr) o'zgartiradi
Stream ni List to'plamiga kiriting. 18-21 qatorlarda, natijada
List keyin uning toString usuliga yashirin chaqiruv bilan ko'rsatiladi.
Biz 17.6-bo'limda yig'ish usulining boshqa versiyasini ko'rsatamiz. Ko'proq ma'lumot uchun
Sinf kollektorlari haqida ma'lumot, tashrif buyuring:

17.4.3 Oqimni filtrlash va natijalarni keyinroq ishlatish uchun saqlash


17.6-rasmning 24–27 qatorlari Stream hosil qiladi, Stream usuli filtrini chaqiradi (qaysi
4 dan katta barcha qiymatlarni topish va natijalarni a ga yig'ish uchun Predikat oladi
Ro'yxat. IntPredicate (17.3.4-bo'lim) singari Predicate ham funktsional interfeysga ega
argument shartni qondiradimi yoki yo'qligini ko'rsatuvchi mantiqiy qiymatni qaytaradigan test usuli.
tion, shuningdek usullar va, inkor et va yoki.
Biz oqim quvurining natijaviy List ni greaterThan4 o'zgaruvchisiga tayinlaymiz,
28-qatorda 4 dan katta qiymatlarni ko'rsatish uchun ishlatiladi va 40-42 qatorlarda yana ishlatiladi
faqat 4 dan katta qiymatlar ustida qo'shimcha amallarni bajarish.

17.4.4 Oqimni filtrlash va saralash va natijalarni yig'ish


31–35 qatorlar tartiblangan tartibda 4 dan katta qiymatlarni aks ettiradi. Birinchidan, 32-qator a hosil qiladi
Stream. Keyin 33-qator barcha qiymatlarni aniqlash uchun elementlarni filtrlaydi
4. Keyingi 34-qator natijalarni tartiblashtirishni xohlayotganimizni bildiradi. Nihoyat, 35-qator yig'iladi
natijalari Listga aylanadi, u keyinchalik String sifatida ko'rsatiladi.

17.4.5 Ilgari yig'ilgan natijalarni saralash


40–42 qatorlar reklamani koʻrsatish uchun 24–27 qatorlarda yaratilgan greaterThan4 toʻplamidan foydalanadi.
oldingi oqim quvurining natijalarini o'z ichiga olgan to'plamda ditional ishlov berish. Bunda

http://download.java.net/jdk8/docs/api/java/util/stream/


Collectors.html

746 17-bob Java SE 8 Lambdalar va oqimlar

bo'lsa, biz kattaThan4 qiymatlarini saralash uchun oqimlardan foydalanamiz, natijalarni yangisiga yig'amiz
ro'yxatini kiriting va tartiblangan qiymatlarni ko'rsating.
17.5 Stream manipulyatsiyalari
[Ushbu bo'lim dasturlashni soddalashtirish uchun lambdalar va oqimlardan qanday foydalanish mumkinligini ko'rsatadi
14-bobda o'rgangan vazifalaringiz, satrlar, belgilar va oddiy iboralar.]
17.7-rasmda siz 17.3– bo'limlarida o'rgangan bir xil oqim operatsiyalarining ba'zilari bajariladi.
17.4 lekin Stream da. Bundan tashqari, biz katta-kichik harflarga sezgir bo'lmagan saralashni ko'rsatamiz va
kamayish tartibida saralash. Ushbu misol davomida biz String massiv satrlaridan foydalanamiz
(11–12-qatorlar) rang nomlari bilan ishga tushirilgan - ba'zilari bosh harf bilan.
15-qator har qanday oqimni qayta ishlashdan oldin satrlar tarkibini ko'rsatadi.

1 // 17.7-rasm: ArraysAndStreams2.java


2 // Stringlar massivi bilan lambdalar va oqimlarni namoyish qilish.
3 import java.util.Arrays;
4 import java.util.Comparator;
5
6
7 ommaviy sinf ArraysAndStreams2
8 {
9 ta umumiy statik bekor asosiy(String[] args)
10 {
11 String[] satrlari =
12 {"Qizil", "to'q sariq", "sariq", "yashil", "ko'k", "indigo", "binafsha"};
13
14 // asl satrlarni ko'rsatish
15 System.out.printf("Asl satrlar: %s%n", Arrays.asList(strings));
16
17 // katta harfdagi satrlar
18 System.out.printf("katta harfdagi satrlar: %s%n",
19 Arrays.stream(satrlar)
20
21 .to‘plash(Kollektorlar.toList()));
22
23 // "n" dan kichik satrlar (katta harflar sezilmaydi) o'sish bo'yicha tartiblangan
24 System.out.printf("m dan katta satrlar o'sish bo'yicha tartiblangan: %s%n",
25 Arrays.stream (satrlar)
26 .filtr(lar -> s.compareToIgnoreCase("n") < 0)
27
28 .to‘plash(Kollektorlar.toList()));
29
30 // "n" dan kichik satrlar (katta harflar sezilmaydi) kamayish bo'yicha tartiblangan
31 System.out.printf("m dan katta satrlar kamayish bo'yicha tartiblangan: %s%n",
32 Arrays.stream(satrlar)
33 .filtr(lar -> s.compareToIgnoreCase("n") < 0)
34
35 .collect(Kollektorlar.toList()));
36 }
37 } // tugatish sinfi ArraysAndStreams2

17.7-rasm | Lambdalar va oqimlarni qatorlar qatori bilan namoyish qilish. (2-qismning 1-qismi.)

java.util.stream.Kollektorlarni import qilish;

.map(String::toUpperCase)

.sorted(String.CASE_INSENSITIVE_ORDER)

.sorted(String.CASE_INSENSITIVE_ORDER.reversed())


17.5 Stream manipulyatsiyalari 747

17.5.1 Usul ma'lumotnomasi yordamida satrlarni bosh harfga solish
18–21-qatorlar satrlarni katta harflar bilan aks ettiradi. Buning uchun 19-qator a hosil qiladi
Massiv satrlaridan oqim, keyin 20-satr xaritaga oqim usuli xaritasini chaqiradi
String misol usulini toUpperCase deb chaqirish orqali har bir Stringni katta harflar versiyasiga o'tkazing.
String::toUpperCase metodga havola sifatida tanilgan va a uchun stenografiya hisoblanadi
lambda ifodasi - bu holda, lambda ifodasi uchun:

yoki


String::toUpperCase - bu toUpperCase String misol usuli uchun usulga havola.
17.8-rasmda to'rtta usul mos yozuvlar turlari ko'rsatilgan.

Oqim usuli xaritasi argument sifatida funktsiyani amalga oshiradigan ob'ektni oladi


interfeysi Funktsiya - misol usuli havolasi String::toUpperCase sifatida qabul qilinadi
interfeys funktsiyasini amalga oshiradigan lambda. Ushbu interfeysning amal qilish usuli bitta qabul qiladi
parametr va natijani qaytaradi - bu holda qo'llash usuli Stringni oladi va qaytaradi
String ning katta harfli versiyasi. 21-qator natijalarni ro'yxatiga to'playdi
biz String sifatida chiqaramiz.

Asl torlar: [Qizil, to'q sariq, sariq, yashil, ko'k, indigo, binafsha]


bosh harfdagi satrlar: [QIZIL, ARANGE, SARIQ, YASIL, KO'K, INDIGO, VIOLET]
m dan katta satrlar o'sish bo'yicha tartiblangan: [to'q sariq, qizil, binafsha, sariq]
m dan katta satrlar kamayish bo'yicha tartiblangan: [Sariq, binafsha, qizil, to'q sariq]

(String s) -> {return s.toUpperCase();}

s -> s.toUpperCase()

Lambda tavsifi

Sinfning misol usuli uchun String::toUpperCase metodiga havola. Bittasini yaratadi -
lambda-da misol usulini chaqiradigan lambda parametri
argument va usul natijasini qaytaradi. 17.7-rasmda ishlatilgan.
System.out::println Spesifikatorda chaqirilishi kerak bo'lgan misol usuli uchun usul havolasi
sifik ob'ekt. Misolni chaqiradigan bir parametrli lambda yaratadi
Belgilangan ob'ektdagi usul - lambda argumentini ga o'tkazish
misol usuli - va usul natijasini qaytaradi. 17.10-rasmda ishlatilgan.
Math::sqrt Sinfning statik usuli uchun metodga havola. Bitta parametr hosil qiladi -
lambda argumenti belgilangan a ga uzatiladigan ter lambda
statik usul va lambda usul natijasini qaytaradi.
TreeMap::yangi Konstruktor ma'lumotnomasi. No-argumentni chaqiruvchi lambda hosil qiladi
yangi ob'ektni yaratish va ishga tushirish uchun belgilangan sinfning konstruktori
o'sha sinf. 17.17-rasmda ishlatilgan.

17.8-rasm | Usul havolalarining turlari.

17.7-rasm | Lambdalar va oqimlarni qatorlar qatori bilan namoyish qilish. (2-qismning 2-qismi.)

748 17-bob Java SE 8 Lambdalar va oqimlar

17.5.2 Satrlarni filtrlash, keyin ularni katta-kichik harflar bilan tartiblash
O'sish tartibi
24–28-qatorlar satrlarni filtrlang va tartiblang. 25-qator massivdan Stream hosil qiladi
strings, so'ngra 26-qator barcha kattaroq satrlarni topish uchun Stream usuli filtrini chaqiradi
"m" dan ko'ra, Predicate lambda'da katta-kichik harflarga sezgir bo'lmagan taqqoslash yordamida. 27-qator saralanadi
natijalar va 28-satr ularni biz String sifatida chiqaradigan Listga to'playdi. Bunda
holatda, 27-satr Comparator sifatida qabul qilingan Stream usulining tartiblangan versiyasini chaqiradi
argument. 16.7.1-bo'limda bilib olganingizdek, Comparator solishtirish usulini belgilaydi
Agar solishtirilayotgan birinchi qiymat ikkinchisidan kichik bo'lsa, bu salbiy qiymatni qaytaradi, agar 0 bo'lsa
Agar birinchi qiymat ikkinchisidan katta bo'lsa, ular teng va ijobiy qiymatdir. Avvalboshdan,
tartiblangan usul tur uchun tabiiy tartibdan foydalanadi - Strings uchun tabiiy tartib - bu holat
sezgir, ya'ni "Z" "a" dan kichik. Oldindan belgilangan Comparatordan o'tish
String.CASE_INSENSITIVE_ORDER katta-kichik harflarsiz tartiblashni amalga oshiradi.
17.5.3 Satrlarni filtrlash, keyin ularni katta-kichik harflar bilan tartiblash
Kamayish tartibi
31–35-qatorlar 24–28-qatorlar bilan bir xil vazifalarni bajaradi, lekin satrlarni kamayish tartibida tartiblaydi.
Funktsional interfeys Comparator teskari standart usulni o'z ichiga oladi.
isting Comparatorning buyurtmasi. String.CASE_INSENSITIVE_ORDER uchun qo'llanilganda,
Satrlar kamayish tartibida tartiblangan.
17.6 Stream manipulyatsiyasi
Shakldagi misol. 17.9–17.16 turli lambda va oqim imkoniyatlaridan foydalanishni namoyish etadi
a Stream. Sinf xodimi (17.9-rasm) ismli xodimni ifodalaydi,
familiyasi, ish haqi va bo'limi va ushbu qadriyatlarni manipulyatsiya qilish usullarini taqdim etadi. Reklamada -
dition uchun sinf getName usulini (69–72-qatorlar) taqdim etadi, bu birinchi va birlashtirilgan qiymatlarni qaytaradi.
String sifatida familiya va formatlangan Stringni qaytaruvchi toString usuli (75–80-qatorlar)
xodimning ismi, familiyasi, ish haqi va bo'limini o'z ichiga oladi.

1 // 17.9-rasm: Employee.java


2 // Xodimlar sinfi.
3 davlat toifasidagi xodim
4 {
5 xususiy String firstName;
6 shaxsiy String familiyasi;
7 shaxsiy ikki barobar ish haqi;
8 ta xususiy String bo'limi;
9
10 // konstruktor
11 davlat xodimi (String firstName, String familiyasi,
12 ikki baravar ish haqi, String bo'limi)
13 {
14 this.firstName = firstName;
15 this.lastName = familiya;

17.9-rasm | Shaklda foydalanish uchun xodimlar sinfi. 17.10–17.16. (3-qismning 1-qismi.)


17.6 Stream manipulyatsiyalari 749

16 bu.ish haqi = ish haqi;
17 bu.bo'lim = bo'lim;
18 }
19
20 // birinchi ismni belgilang
21 ommaviy bekor setFirstName(String firstName)
22 {
23 this.firstName = firstName;
24 }
25
26 // birinchi ismni oling
27 ommaviy satr getFirstName()
28 {
29 nomini qaytaring;
30 }
31
32 // familiyani belgilang
33 umumiy bekor setLastName(String familiyasi)
34 {
35 this.lastName = familiya;
36 }
37
38 // familiyani oling
39 ommaviy string getLastName()
40 {
41 familiyasini qaytarish;
42 }
43
44 // ish haqini belgilash
45 davlat bekor to'plamiIsh haqi (ikki martalik ish haqi)
46 {
47 bu.ish haqi = ish haqi;
48 }
49
50 // ish haqi olish
51 umumiy ikki marta getSalary()
52 {
53 qaytish ish haqi;
54 }
55
56 // bo'lim to'plami
57 ommaviy bekor to'plamiDepartment (String bo'limi)
58 {
59 bu.bo‘lim = bo‘lim;
60 }
61
62 // bo'lim olish
63 ommaviy string getDepartment()
64 {
65 qaytish bo'limi;
66 }
67

17.9-rasm | Shaklda foydalanish uchun xodimlar sinfi. 17.10–17.16. (3 qismning 2-qismi.)


750 17-bob Java SE 8 Lambdalar va oqimlar

17.6.1 Ro'yxatni yaratish va ko'rsatish
Class ProcessingEmployees (17.10–17.16-rasmlar) bir nechta raqamlarga bo'lingan, shuning uchun biz
sizga lambda va oqimlarni mos keladigan chiqishlari bilan ko'rsating.
17.10-rasmda Xodimlar massivi (17–24-qatorlar) yaratiladi va uning Ro‘yxat ko‘rinishi (27-qator) olinadi.

68 // Xodimning ismini va familiyasini birlashtirgan holda qaytarish


69 ommaviy string getName()
70 {
71 return String.format("%s %s", getFirstName(), getLastName());
72 }
73
74 // Xodimning ma'lumotlarini o'z ichiga olgan qatorni qaytaring
75 @Bekor qilish
76 umumiy string toString()
77 {
78 return String.format("%-8s -8s %8,2f %s",
79 getFirstName(), getLastName(), getSalary(), getDepartment());
80 } // tugatish usuli toString
81 } // oxirgi sinf xodimi

1 // 17.10-rasm: ProcessingEmployees.java


2 // Xodimlar ob'ektlarining oqimlarini qayta ishlash.
3 import java.util.Arrays;
4 import java.util.Comparator;
5 import java.util.List;
6
7
8
9
10
11
12 umumiy sinf ProcessingEmployees
13 {
14 ta umumiy statik bekor asosiy (String [] args)
15 {
16 // Xodimlar qatorini ishga tushiring
17 ta xodim[] ishchi = {
18 ta yangi xodim("Jason", "Red", 5000, "IT"),
19 ta yangi xodim ("Eshli", "Yashil", 7600, "IT"),
20 ta yangi xodim("Metyu", "Indigo", 3587.5, "Sotish"),
21 ta yangi xodim("Jeyms", "Indigo", 4700.77, "Marketing"),
22 ta yangi xodim("Luka", "Indigo", 6200, "IT"),
23 ta yangi xodim("Jason", "Blue", 3200, "Sotish"),
24 ta yangi xodim("Vendi", "Braun", 4236.4, "Marketing")};
25
26 // Xodimlar ro'yxatini oling
27 Ro'yxat ro'yxati = Arrays.asList(xodimlar);

17.10-rasm | Xodimlar massivini yaratish, uni Ro'yxatga aylantirish va Ro'yxatni ko'rsatish.


(2-qismning 1-qismi.)

17.9-rasm | Shaklda foydalanish uchun xodimlar sinfi. 17.10–17.16. (3 qismning 3-qismi.)

import java.util.Map;
import java.util.TreeMap;
import java.util.function.Function;
import java.util.function.Predicate;
java.util.stream.Kollektorlarni import qilish;

17.6 Stream manipulyatsiyalari 751

31-qator Stream ni yaratadi, so'ngra har birini ko'rsatish uchun Stream usuli forEach dan foydalanadi.
Xodimning string tasviri. Namuna usuli System.out::println hisoblanadi
kompilyator tomonidan Iste'molchi funktsional interfeysini amalga oshiradigan ob'ektga aylantiriladi.
Ushbu interfeysning qabul qilish usuli bitta argumentni oladi va bekor qiladi. Ushbu misolda,
qabul qilish usuli har bir Xodimni System.out ob'ektining println misol usuliga o'tkazadi,
String ko'rinishini olish uchun sinf xodimining toString usulini bilvosita chaqiradi.
17.10-rasm oxiridagi chiqish barcha Xodimlarni ko'rsatish natijalarini ko'rsatadi.

17.6.2 Belgilangan diapazondagi ish haqi bilan xodimlarni filtrlash


17.11-rasmda xodimlarni funktsiyani amalga oshiradigan ob'ekt bilan filtrlash ko'rsatilgan.
34–35-qatorlarda lambda bilan belgilangan Predicate tional interfeysi.
Lambdalarni shu tarzda belgilash, biz qilganimizdek, ularni bir necha marta qayta ishlatishga imkon beradi
42 va 49 qatorlar. 41-44 qatorlar 4000-6000 oralig'ida ish haqi bo'lgan xodimlarni ko'rsatadi.
ish haqi bo'yicha quyidagicha tartiblangan:
• 41-qator Ro‘yxatdan Streamni yaratadi.
• 42-qator fourToSixThousand nomli Predikat yordamida oqimni filtrlaydi.
• 43-qator oqimda qolgan Xodimlarni ish haqi bo'yicha tartiblaydi. Kompozitsiyani belgilash uchun
Ish haqi uchun biz Comparator interfeysining statik taqqoslash usulidan foydalanamiz.
ing. Usul argument sifatida berilgan Employee::getSalary ga murojaat qiladi
kompilyator tomonidan Funktsiyani amalga oshiradigan ob'ektga aylantiriladi.
yuz. Ushbu funktsiya oqimdagi ob'ektdan foydalanish uchun qiymatni chiqarish uchun ishlatiladi
taqqoslashda. Taqqoslash usuli get-ni chaqiruvchi Comparator obyektini qaytaradi.
Ikkita Xodim ob'ektining har birida ish haqi, agar birinchi bo'lsa, salbiy qiymatni qaytaradi
Xodimning ish haqi ikkinchidan kamroq, agar ular teng bo'lsa 0 va ijobiy qiymat bo'lsa
birinchi Xodimning maoshi ikkinchisidan kattaroq.
• Nihoyat, 44-qator har bir operatsiya uchun terminalni bajaradi
oqim quvuri va ish haqi bo'yicha tartiblangan Xodimlarni chiqaradi.

28
29 // barcha xodimlarni ko'rsatish


30 System.out.println("To'liq xodimlar ro'yxati:");
31
32

Xodimlarning to'liq ro'yxati:


Jeyson Red 5000.00 IT
Eshli Green 7600.00 IT
Metyu Indigo 3587.50 Sotish
Jeyms Indigo 4700.77 Marketing
Luqo Indigo 6200.00 IT
Jeyson Blue 3200.00 Sotish
Vendi Braun 4236.40 Marketing

17.10-rasm | Xodimlar massivini yaratish, uni Ro'yxatga aylantirish va Ro'yxatni ko'rsatish.


(2-qismning 2-qismi.)

list.stream().forEach(System.out::println);


752 17-bob Java SE 8 Lambdalar va oqimlar

Qisqa tutashuvli oqim quvurlarini qayta ishlash
5.9-bo'limda siz mantiqiy VA (&&) va mantiqiy bilan qisqa tutashuvni baholashni o'rgandingiz
OR (||) operatorlari. Dangasa baholashning yaxshi ishlash xususiyatlaridan biri bu qobiliyatdir
qisqa tutashuvni baholashni amalga oshirish - ya'ni oqim quvurini qayta ishlashni tezda to'xtatish
chunki kerakli natija mavjud. 50-qatorda Stream usuli findFirst-a ko'rsatilgan
Oqim quvurini qayta ishlovchi va oqimni to'xtatuvchi qisqa tutashuv terminalining ishlashi.
oqim quvuridan birinchi ob'ekt topilishi bilanoq to'xtatiladi. Asl nusxaga asoslangan
Xodimlar ro'yxati, 48-51-qatorlardagi oqimni qayta ishlash - bu xodimlarni filtrlaydi
4000-6000 AQSh dollari oralig'idagi ish haqi bilan - quyidagicha ishlaydi: Predikat to'rtta-
SixThousand birinchi Xodimga (Jeyson Red) qo'llaniladi. Uning maoshi ($5000.00) 2000 yilda
$4000–$6000 oralig'ida, shuning uchun Predikat haqiqatni qaytaradi va oqim muddatini qayta ishlaydi.
oqimdagi sakkiz ob'ektdan faqat bittasini qayta ishlagandan so'ng darhol paydo bo'ladi. Usul
findFirst keyin ixtiyoriy (bu holda ixtiyoriy)ni qaytaradi
topilgan ob'ekt, agar mavjud bo'lsa. Ixtiyoriy get usuliga qo'ng'iroq (51-qator) ni qaytaradi
Ushbu misolda mos keladigan xodim ob'ekti. Agar oqimda millionlab em-
ploye ob'ektlari bo'lsa, filtr operatsiyasi faqat moslik topilmaguncha amalga oshiriladi.
17.6.3 Xodimlarni bir nechta maydonlar bo'yicha saralash
17.12-rasmda ob'ektlarni bir nechta maydonlar bo'yicha saralash uchun oqimlardan qanday foydalanish ko'rsatilgan. Bu misolda,
biz Xodimlarni familiyasi bo'yicha saralaymiz, keyin bir xil familiyaga ega bo'lgan xodimlar uchun biz ham tartiblaymiz

33 // 4000-6000 dollar oralig'idagi ish haqi uchun to'g'ri keladigan predikat


34
35
36
37 // 4000-6000 AQSh dollari oralig'ida ish haqi bo'lgan xodimlarni ko'rsatish
38 // ish haqi bo'yicha o'sish tartibida tartiblangan
39 System.out.printf(
40 "%nOyiga $4000-$6000 maosh oladigan xodimlar ish haqi boʻyicha tartiblangan:%n");
41
42
43
44
45
46 // 4000-6000 dollar oralig'ida ish haqi bo'lgan birinchi xodimni ko'rsatish
47 System.out.printf("%n4000-6000$ maosh oladigan birinchi xodim:%n%s%n",
48 list.stream()
49 .filtr (to'rtta olti ming)
50
51);
52

Oyiga 4000-6000 AQSh dollari oladigan xodimlar ish haqi bo'yicha:


Vendi Braun 4236.40 Marketing
Jeyms Indigo 4700.77 Marketing
Jeyson Red 5000.00 IT
4000-6000 dollar maosh oladigan birinchi xodim:
Jeyson Red 5000.00 IT

17.11-rasm | 4000-6000 AQSh dollari oralig'ida ish haqi bo'lgan xodimlarni filtrlash.

Predicate fourToSixMhousand =
e -> (e.getSalary() >= 4000 && e.getSalary() <= 6000);

list.stream()


.filtr (to'rtta olti ming)
.sorted(Comparator.comparing(Xodim::getSalary))
.forEach(System.out::println);

.findFirst()


.get()

17.6 Stream manipulyatsiyalari 753

ularni ismi bilan. Buning uchun biz har biri qabul qiluvchi ikkita funktsiyani yaratishdan boshlaymiz
Xodim va Stringni qaytaring:
• byFirstName (54-qator) xodim misoli uchun usul havolasi tayinlangan
getFirstName usuli
• byLastName (55-satr) Xodim namunasi uchun usul havolasi tayinlangan.
od getLastName
Keyinchalik, biz ushbu funksiyalardan Comparator yaratish uchun foydalanamiz (lastThenFirst; 58–59-qatorlar).
avval ikkita Xodimni familiyasi bo'yicha solishtiradi, so'ngra ularni ismi bo'yicha solishtiradi. Biz foydalanamiz
Function byLastName ni chaqiruvchi Comparator yaratish uchun taqqoslash usuli
Xodimning familiyasini olish uchun. Olingan Comparatorda biz Comparatorni chaqiramiz
Xodimlarni familiyasi bo'yicha birinchi taqqoslaydigan Comparator yaratish uchun keyin solishtirish usuli
va agar familiyalar teng bo'lsa, ularni ism bilan taqqoslaydi. 64–65-qatorlarda bundan foydalaniladi
Yangi lastThenFirst Comparator Xodimlarni o'sish tartibida saralash uchun, so'ngra
natijalar. Biz 71-73-qatorlarda solishtirgichni qayta ishlatamiz, lekin ko'rsatish uchun uning teskari usulini chaqiramiz
Xodimlar familiyasi, keyin ismi bo'yicha kamayish tartibida tartiblanishi kerak.

53 // Xodimdan ism va familiya olish funksiyalari


54
55
56
57 // Xodimlarni ismlari va familiyalari bilan solishtirish uchun komparator
58
59
60
61 // xodimlarni familiyasi, keyin ismi bo'yicha tartiblang
62 System.out.printf(
63 "%nXodimlar familiyasi bo'yicha o'sish tartibida keyin birinchi:%n");
64 list.stream()
65
66 .forEach(System.out::println);
67
68 // xodimlarni familiyasi, keyin ismi bo'yicha kamayish tartibida tartiblang
69 System.out.printf(
70 "%nXodimlar familiyasi bo'yicha, keyin birinchisi:%n");
71 list.stream()
72 .saralangan( )
73 .forEach(System.out::println);
74

Xodimlar familiyasi bo'yicha, keyin birinchi navbatda o'sish tartibida:


Jeyson Blue 3200.00 Sotish
Vendi Braun 4236.40 Marketing
Eshli Green 7600.00 IT
Jeyms Indigo 4700.77 Marketing
Luqo Indigo 6200.00 IT
Metyu Indigo 3587.50 Sotish
Jeyson Red 5000.00 IT

17.12-rasm | Xodimlarni familiyasi va ismi bo'yicha saralash. (2-qismning 1-qismi.)

Function byFirstName = Employee::getFirstName;
Function byLastName = Employee::getLastName;

Comparator lastThenFirst =


Taqqoslovchi.taqqoslash(familiya bo'yicha).keyin solishtirish(FirstName);

.sorted(lastThenFirst)

lastThenFirst.reversed()

754 17-bob Java SE 8 Lambdalar va oqimlar

17.6.4 Xodimlarni noyob familiya qatorlariga solish
Ilgari siz int qiymatlari bo'yicha hisob-kitoblarni bajarish va konvertatsiya qilish uchun xarita operatsiyalaridan foydalangansiz
Katta harflar uchun satrlar. Ikkala holatda ham, natijada paydo bo'lgan oqimlar bir xil qiymatlarni o'z ichiga olgan
original oqimlar sifatida turlari. 17.13-rasmda bir turdagi ob'ektlarni xaritalash usuli ko'rsatilgan (Xodim)
boshqa turdagi ob'ektlarga (String). 77-81 qatorlar quyidagi vazifalarni bajaradi:
• 77-qator Streamni yaratadi.
• 78-qatorda Ishchilarning familiyalari misol usulidan foydalangan holda ko'rsatiladi.
ence Employee::getName metod xaritasining Funktsiya argumenti sifatida. Natijada a
Oqim.
• 79-qator har qanday narsani yo'q qilish uchun Stream-da Stream usulini alohida chaqiradi.
Stream dagi String ob'ektlarini takrorlash.
• 80-qator noyob familiyalarni tartiblaydi.
• Nihoyat, 81-qator oqimni qayta ishlovchi Har bir operatsiya uchun terminalni bajaradi
quvur liniyasi va noyob familiyalarni tartiblangan tartibda chiqaradi.
86–89 qatorlar Xodimlarni familiya, keyin ism bo'yicha tartiblaydi, so'ngra Xodimlarni
GetName (88-satr) va tartiblangan nomlarni ko'rsatadigan xodimlar misol usuli bilan satrlar
Har bir operatsiya uchun terminalda.

Xodimlar familiyasidan keyin kamayish tartibida:


Jeyson Red 5000.00 IT
Metyu Indigo 3587.50 Sotish
Luqo Indigo 6200.00 IT
Jeyms Indigo 4700.77 Marketing
Eshli Green 7600.00 IT
Vendi Braun 4236.40 Marketing
Jeyson Blue 3200.00 Sotish

75 // tartiblangan xodimlarning noyob familiyalarini ko'rsatish


76 System.out.printf("%nUnique xodim familiyalari:%n");
77 list.stream()
78
79
80 .sorted()
81 .forEach(System.out::println);
82
83 // faqat ism va familiyalarni ko'rsatish
84 System.out.printf(
85 "%nXodimlarning ismlari familiyasi bo'yicha, keyin ismi:%n");
86 list.stream()
87 .saralangan(oxirgidan keyinBirinchi)
88
89 .forEach(System.out::println);
90

17.13-rasm | Xodimlar ob'ektlarini familiyalar va to'liq ismlar bilan taqqoslash. (2-qismning 1-qismi.)

17.12-rasm | Xodimlarni familiyasi va ismi bo'yicha saralash. (2-qismning 2-qismi.)

.map(Xodim::getLastName)


.distinct()

.map(Xodim::getName)


17.6 Stream manipulyatsiyalari 755

17.6.5 Xodimlarni bo'lim bo'yicha guruhlash
17.14-rasmda Xodimlarni bo'lim bo'yicha guruhlash uchun Stream yig'ish (95-qator) usuli qo'llaniladi.
Usul yig'ish argumenti ma'lumotlarni qanday umumlashtirishni ko'rsatadigan Kollektordir
foydali shakl. Bunday holda, biz Collectors statik usuli bilan qaytarilgan Kollektordan foydalanamiz
groupingBy, bu oqimdagi ob'ektlarni - qiymatlarni tasniflaydigan funktsiyani oladi
bu funksiya tomonidan qaytarilganlar Xaritada kalit sifatida ishlatiladi. Tegishli qiymatlar, de-
xato, ma'lum toifadagi oqim elementlarini o'z ichiga olgan ro'yxatlardir. Qachon usul col-
lect ushbu Kollektor bilan ishlatiladi, natijada Map> hosil bo'ladi.
Har bir String kaliti bo'limdir va har bir Ro'yxat undagi Xodimlarni o'z ichiga oladi
Bo'lim. Biz ushbu Xaritani satrlarda ishlatiladigan groupedByDepartment o'zgaruvchisiga tayinlaymiz
Bo'lim bo'yicha guruhlangan xodimlarni ko'rsatish uchun 96–103. Map metodi forEach bajaradi
Xaritaning har bir kalit-qiymat juftligi ustidagi operatsiya. Usulning argumenti ob-
BiConsumer funktsional interfeysini amalga oshiradigan ject. Ushbu interfeysning qabul qilish usuli mavjud
ikkita parametr. Xaritalar uchun birinchi parametr kalitni, ikkinchisi esa ifodalaydi
mos keladigan qiymat.

Xodimlarning noyob familiyalari:


Moviy
jigarrang
Yashil
Indigo
Qizil

Xodimlarning ismlari familiyasi va ismi bo'yicha tartibda:


Jeyson Blue
Vendi Braun
Eshli Grin
Jeyms Indigo
Luqo Indigo
Metyu Indigo
Jeyson Red

91 // Xodimlarni bo'lim bo'yicha guruhlash


92 System.out.printf("Bo'lim bo'yicha %nXodimlar:%n");
93
94
95
96 groupedByDepartment.forEach(
97
98
99
100
101
102
103);
104

17.14-rasm | Xodimlarni bo'limlar bo'yicha guruhlash. (2-qismning 1-qismi.)

17.13-rasm | Xodimlar ob'ektlarini familiyalar va to'liq ismlar bilan taqqoslash. (2-qismning 2-qismi.)

Xarita> groupedByDepartment =


list.stream()
.collect(Collectors.groupingBy(Xodim::getDepartment));

(bo'lim, Bo'limda xodimlar) ->


{
System.out.println(bo'lim);
staffInDepartment.forEach(
xodim -> System.out.printf(" %s%n", xodim));
}

756 17-bob Java SE 8 Lambdalar va oqimlar

17.6.6 Har bir bo'limdagi xodimlar sonini hisoblash
17.15-rasm yana bir bor Stream usulini yig'ish va Kollektorlarning statikligini namoyish etadi
usuli groupingBy, lekin bu holda biz har bir bo'limdagi Xodimlar sonini hisoblaymiz-
ment. 107–110-qatorlar Map ni hosil qiladi, unda har bir String kaliti ajratiladi.
ment nomi va tegishli Long qiymati undagi Xodimlar soni
Bo'lim. Bunday holda, biz Kollektorlarning statik usulini groupingBy versiyasidan foydalanamiz
ikkita argumentni oladi - birinchisi oqimdagi ob'ektlarni tasniflaydigan Funktsiya va
ikkinchisi boshqa Kollektor (pastki oqim kollektori sifatida tanilgan). Bunday holda, biz
Kollektorlarga qo'ng'iroqni ikkinchi argument sifatida hisoblashning statik usulidan foydalaning. Bu usul
emas, balki berilgan tasnifdagi ob'ektlar sonini hisoblaydigan Kollektorni qaytaradi
ularni ro'yxatga yig'ish. 111–113 qatorlar, keyin kalit-qiymat juftlarini qaytadan chiqaradi.
Xarita.

17.6.7 Xodimlarning ish haqini yig'ish va o'rtacha hisoblash


17.16-rasmda mapToDouble oqim usuli (119, 126 va 132-qatorlar) ko'rsatilgan.
ob'ektlarni ikkita qiymatga moslashtiradi va DoubleStreamni qaytaradi. Bunday holda, biz Xodimni xaritaga kiritamiz

Bo'lim bo'yicha xodimlar:


Sotish
Metyu Indigo 3587.50 Sotish
Jeyson Blue 3200.00 Sotish
IT
Jeyson Red 5000.00 IT
Eshli Green 7600.00 IT
Luqo Indigo 6200.00 IT
Marketing
Jeyms Indigo 4700.77 Marketing
Vendi Braun 4236.40 Marketing

105 // har bir bo'limdagi xodimlar sonini hisoblash


106 System.out.printf("%nBo'lim bo'yicha xodimlar soni:%n");
107
108
109
110
111 ta xodimCountByDepartment.forEach(
112 (bo'lim, hisob) -> System.out.printf(
113 "%sda %d nafar xodim(lar)%n bor", bo'lim, hisob));
114

Bo'lim bo'yicha xodimlar soni:


ITda 3 ta xodim mavjud
Marketingda 2 nafar xodim bor
Savdoda 2 nafar xodim bor

17.15-rasm | Har bir bo'limdagi xodimlar sonini hisoblash.

17.14-rasm | Xodimlarni bo'limlar bo'yicha guruhlash. (2-qismning 2-qismi.)

Map staffeCountByDepartment =


list.stream()
.collect(Collectors.groupingBy(Xodim::getDepartment,
Collectors.counting()));

17.6 Stream manipulyatsiyalari 757

ularning ish haqiga e'tiroz bildiramiz, shunda biz summani va o'rtachani hisoblashimiz mumkin. mapToDouble usuli
ToDoubleFunction funktsional interfeysini amalga oshiradigan ob'ektni oladi (paket
java.util.function). Ushbu interfeysning applyAsDouble usuli misol usulini chaqiradi.
ob'ektda od va ikki barobar qiymatni qaytaradi. 119, 126 va 132-qatorlarning har biri o'tadi
mapToDouble Employee ::getSalary ga qayta ishlovchi misol usuli havolasi.
joriy Xodimning ish haqini ikki baravarga aylantiradi. Kompilyator ushbu usulni o'zgartiradi -
ToDoubleFunction funktsional interfeysini amalga oshiradigan ob'ektga aylantiring.

118–120 qatorlar Stream ni yaratadi, uni DoubleStream bilan taqqoslang, so'ngra chaqiring


Xodimlarning ish haqi summasini hisoblash uchun DoubleStream usuli summasi. 125–127 qatorlar
Shuningdek, xodimlarning ish haqini yig'ing, lekin buni DoubleStream usulidan foydalanib, aksincha, kamaytiring
summadan ko'ra - biz IntStreams bilan 17.3-bo'limda qisqartirish usulini kiritdik. Nihoyat, chiziqlar
131–134 DoubleStream usuli yordamida xodimlarning oʻrtacha ish haqini hisoblang
o'rtacha, agar DoubleStream tarkibida bo'lmasa, OptionalDouble qaytaradi
har qanday elementlar. Bunday holda, biz oqimning elementlari borligini bilamiz, shuning uchun biz shunchaki usulni chaqiramiz
Natijani olish uchun OptionalDouble usuli getAsDouble. Eslatib o'tamiz, siz ham foydalanishingiz mumkin
usuli yokiElse o'rtacha usul chaqirilgan bo'lsa ishlatilishi kerak bo'lgan qiymatni belgilash uchun
bo'sh DoubleStream, va shuning uchun o'rtacha hisoblab bo'lmadi.

115 // DoubleStream yig'indisi usuli bilan xodimlarning ish haqi summasi


116 System.out.printf(
117 "%nXodimlar ish haqi summasi (summa usuli bo'yicha): %.2f%n",
118 list.stream()
119
120 .sum());
121
122 // Stream kamaytirish usuli bilan xodimlarning ish haqi summasini hisoblang
123 System.out.printf(
124 "Xodimlarning ish haqi yig'indisi (kamaytirish usuli bo'yicha): %.2f%n",
125 list.stream()
126 .mapToDouble(Xodim::getSalary)
127);
128
129 // DoubleStream o'rtacha usuli bilan xodimlarning o'rtacha ish haqi
130 System.out.printf("Xodimlarning o'rtacha ish haqi: %.2f%n",
131 list.stream()
132 .mapToDouble(Xodim::getSalary)
133
134 .getAsDouble());
135 } // asosiyni tugating
136 } // oxirgi sinf ProcessingEmployees

Xodimlarning ish haqi summasi (summa usuli bo'yicha): 34524,67


Xodimlarning ish haqi summasi (pastlash usuli bo'yicha): 34525,67
Xodimlarning o'rtacha ish haqi: 4932,10

17.16-rasm | Xodimlarning ish haqini yig'ish va o'rtacha hisoblash.

.mapToDouble(Xodim::getSalary)

.reduce(0, (qiymat1, qiymat2) -> qiymat1 + qiymat2)

.average()

758 17-bob Java SE 8 Lambdalar va oqimlar

17.7 Fayldan Stream yaratish
17.17-rasmda lambdalar va oqimlardan har birining takrorlanish sonini umumlashtirish uchun foydalaniladi.
fayldagi so'z, so'ngra boshlanish bo'yicha guruhlangan alifbo tartibida so'zlarning qisqacha mazmunini ko'rsatadi.
ing xat. Bu odatda konkordans deb ataladi (http://en.wikipedia.org/wiki/
Muvofiqlik_(nashr qilish)). Konkordanslar ko'pincha nashr etilgan asarlarni tahlil qilish uchun ishlatiladi.
Masalan, Uilyam Shekspir va Kristofer Marlou asarlarining konkordanslari
Ular bir xil shaxs ekanligiga shubha qilish uchun ishlatilgan. 17.18-rasmda pro-
gramm chiqishi. 17.17-rasmning 16-qatori biz ishlatadigan Pattern oddiy ifodasini yaratadi.
matn satrlarini alohida so'zlarga bo'lish. Ushbu naqsh bir yoki bir nechta ketma-ketlikni ifodalaydi
utive bo'sh joy belgilari. (Biz 14.7-bo'limda muntazam iboralarni kiritdik.)

1 // 17.17-rasm: StreamOfLines.java


2 // Matnli fayldagi so'zlarni sanash.
3 import java.io.IOException;
4 import java.nio.file.Files;
5 import java.nio.file.Paths;
6 import java.util.Map;
7 import java.util.TreeMap;
8 import java.util.regex.Pattern;
9 import java.util.stream.Kollektorlar;
10
11 ommaviy sinf StreamOfLines
12 {
13 ommaviy statik void main(String[] args) IOExceptionni tashlaydi
14 {
15 // Bir yoki bir nechta ketma-ket bo'shliq belgilariga mos keladigan Regex
16 Naqsh naqsh = Pattern.compile("\\s+");
17
18 // Stream dagi har bir soʻzning soʻz boʻyicha tartiblanganligini sanash
19
20
21
22
23
24
25
26 // bosh harf bo'yicha guruhlangan so'zlarni ko'rsatish
27
28
29
30
31
32
33
34
35
36
37
38 }
39 } // oxirgi sinf StreamOfLines

17.17-rasm | Matnli fayldagi so'zlarni sanash.

Map wordCounts =
Files.lines(Paths.get("Chapter2Paragraph.txt"))
.map(line -> line.replaceAll("(?!')\\p{P}", ""))
.flatMap(chiziq -> pattern.splitAsStream(satr))
.collect(Collectors.groupingBy(String::toLowerCase,
TreeMap::new, Collectors.counting()));

wordCounts.entrySet()


.oqim()
.collect(
Collectors.groupingBy(entry -> entry.getKey().charAt(0),
TreeMap::new, Collectors.toList()))
.forEach((harf, wordList) ->
{
System.out.printf("%n%C%n", harf);
wordList.stream().forEach(word -> System.out.printf()
"%13s: %d%n", word.getKey(), word.getValue()));
});

17.7 759-fayldan Stream yaratish

Fayldagi har bir so'zning sodir bo'lishini umumlashtirish
19–24 qatorlar "Chapter2Paragraph.txt" matn faylining mazmunini jamlaydi (bu past-
Misol bilan papkada joylashgan) Map ga kiriting, unda har bir String tugmachasi mavjud
fayldagi so'z bo'lib, tegishli Long qiymati uning takrorlanish sonidir
so'z. Bayonot quyidagi vazifalarni bajaradi:
• 20-qator o'qish uchun Stream yaratish uchun Files usuli qatorlaridan foydalanadi
fayldan matn satrlari. Sinf fayllari (java.nio.file to'plami) ko'pchilikdan biridir
Oqimlarni qo'llab-quvvatlash uchun yaxshilangan Java API-lar bo'ylab sinflar.
• 21-qator apostro-dan tashqari barcha tinish belgilarini olib tashlash uchun Stream usuli xaritasidan foydalanadi.
phes, matn satrlarida. Lambda argumenti quyidagi funktsiyani ifodalaydi:
vokes String usuli replaceAll ni String argumentida. Bu usul qabul qiladi
ikkita argument—birinchisi muntazam ifodadir String to match va ikkinchisi
har bir moslik almashtiriladigan satrdir. Muntazam ifodada,

A
a: 2


va: 3
ilova: 2
arifmetik: 1

B
boshlang: 1

C
hisoblaydi: 1
hisob-kitoblar: 1
bob: 1
boblar: 1
buyruq qatori: 1
taqqoslaydi: 1
taqqoslash: 1
kompilyatsiya: 1
kompyuter: 1
D
qarorlar: 1
ko'rsatadi: 1
ko'rsatish: 1
ko'rsatadi: 2

E
misol: 1


misollar: 1

F
uchun: 1


dan: 1

H
qanday: 2

I
Kirishlar: 1
buyurmoq: 1
tanishtiradi: 1

J
java: 1


jdk: 1

L
oxirgi: 1


keyinroq: 1
o'rganing: 1

M
qilish: 1


xabarlar: 2

N
raqamlar: 2

O
oladi: 1
ning: 1
kuni: 1
chiqish: 1

P
bajaring: 1


hozir: 1
dastur: 1
dasturlash: 1
dasturlari: 2

R
natija: 1


natijalar: 2
yugurish: 1

S
saqlash: 1


ekran: 1
ko'rsatish: 1
yig'indisi: 1

T
bu: 3


: 7
ularning: 2
keyin: 2
bu: 2
uchun: 4
asboblar: 1
ikki: 2

U
foydalanish: 2


foydalanuvchi: 1

V
biz: 2


bilan: 1

Y
siz: 2

17.18-rasm | 17.17-rasmdagi dastur uchun chiqish uchta ustunda joylashgan.

760 17-bob Java SE 8 Lambdalar va oqimlar

"(?!')" qolgan muntazam iboralar apostri-ni e'tiborsiz qoldirishi kerakligini bildiradi.
phes (masalan, qisqarishda, masalan, "siz") va "\\p{P}" har qanday nuqtaga mos keladi-
tarbiya xarakteri. Har qanday moslik uchun, replaceAll chaqiruvi o'chiriladi
tinish belgilarini bo'sh String bilan almashtiring. 21-qatorning natijasi in-
tinish belgilarisiz qatorlarni o'z ichiga olgan oxirgi Stream.
• 22-qator matnning har bir qatorini alohida qismlarga ajratish uchun FlatMap Stream usulidan foydalanadi
so'zlar. FlatMap usuli ob'ektni oqimiga moslashtiradigan funktsiyani oladi
elementlar. Bunday holda, ob'ekt so'zlarni o'z ichiga olgan String bo'lib, natija bo'ladi
alohida so'zlar uchun boshqa oraliq Stream. Lambda ichkarida
22-satr matn satrini ifodalovchi Stringni Pattern usuli bo'linishiga o'tkazadi.
AsStream (Java SE 8 da yangi), unda ko'rsatilgan muntazam ifoda ishlatiladi
Stringni alohida so'zlarga aylantirish uchun naqsh (16-qator).
• 23–24-qatorlarda har bir so'zning chastotasini hisoblash uchun Stream to'plash usuli qo'llaniladi
va so'zlarni va ularning sonlarini TreeMap ga joylashtiring. Mana, biz
Kollektorlar usuli groupingBy versiyasidan foydalaning, u uchta argumentni oladi -
tasniflagich, Xarita zavodi va quyi oqim kollektori. Klassifikator Func-
natijada olingan Xaritada kalit sifatida foydalanish uchun ob'ektlarni qaytaradigan tion - usulga murojaat qilish
ence String::toLowerCase Stream-dagi har bir so'zni ga o'zgartiradi
kichik harf. Xarita zavodi ta'minotchi interfeysini amalga oshiradigan ob'ekt va
yangi Xarita to'plamini qaytaradi - konstruktor havolasi TreeMap::new a ni qaytaradi
TreeMap kalitlarini tartiblangan tartibda saqlaydi. Collectors.counting() bu
Har bir kalitning takrorlanish sonini aniqlaydigan quyi oqim kollektori
oqimda.

Bosh harf bo'yicha guruhlangan xulosani ko'rsatish


Keyin, 27–37 qatorlar Map wordCounts’dagi kalit-qiymat juftlarini kalitlarning birinchi harfi bo‘yicha guruhlaydi.
Bu har bir kalit bir belgi bo'lgan va mos keladigan qiymat bo'lgan yangi Xarita hosil qiladi
WordCounts-dagi kalit-qiymat juftliklari roʻyxati, unda kalit Belgidan boshlanadi.
Bayonot quyidagi vazifalarni bajaradi:
• Avval wordCounts-da kalit-qiymat juftliklarini qayta ishlash uchun Streamni olishimiz kerak.
Interfeys xaritasida oqimlarni qaytaruvchi usullar mavjud emas. Shunday qilib, 27-qator qo'ng'iroqlar
Map.Entry ob'ektlari to'plamini olish uchun wordCounts-da xarita usuli entrySet
wordCounts dan bitta kalit-qiymat juftligini o'z ichiga oladi. Bu turdagi ob'ektni ishlab chiqaradi
O'rnating>.
• 28-qator qo'ng'iroqlar Stream> olish uchun usul oqimini o'rnating.
• 29–31-qatorlarni chaqirish Stream usuli uchta argument bilan to'planadi - tasniflagich, a
Xarita zavodi va quyi oqim kollektori. Bu holda klassifikator Funktsiya
kalitni Map.Entry dan oladi, keyin kalitni olish uchun charAt String usulidan foydalanadi
birinchi belgi - bu hosil bo'lgan Xaritada Belgilar kalitiga aylanadi. Yana bir bor,
yaratish uchun TreeMap::new konstruktor havolasidan Map zavodi sifatida foydalanamiz
TreeMap kalitlarini tartiblangan tartibda saqlaydi. Pastki oqim kollektori
(Collectors.toList()) Map.Entry obyektlarini List kolleksiyasiga joylashtiradi. The
yig'ish natijasi Map>> bo'ladi.

17.8 Tasodifiy qiymatlar oqimlarini yaratish 761

• Nihoyat, so'zlarning qisqacha mazmunini va ularning sonini harflar bo'yicha ko'rsatish uchun (ya'ni
muvofiqlik), 32-37-qatorlar lambdani Map metodi uchun har biriga o'tkazadi. Lambda (a
BiConsumer) ikkita parametrni oladi - harf va wordList ni ifodalaydi
Xaritadagi har bir kalit-qiymat juftligi uchun mos ravishda belgilar kaliti va Roʻyxat qiymati
oldingi yig'ish operatsiyasi tomonidan ishlab chiqarilgan. Ushbu lambdaning tanasi ikkitadan iborat
bayonotlar, shuning uchun u jingalak qavslar ichiga olinishi kerak. 34-qatordagi bayonotda
Belgilar tugmachasini o'z satrida o'ynaydi. 35-36 qatorlardagi bayonot a ni oladi
wordList dan Stream> ni tanlang, so'ngra Stream meth-ni chaqiradi.
Har bir Map.Entry obyektidan kalit va qiymatni ko‘rsatish uchun od forEach.
17.8 Tasodifiy qiymatlar oqimlarini yaratish
6.7-rasmda biz olti qirrali matritsani 6 000 000 marta aylantirishni ko'rsatdik va natijani umumlashtirdik.
har bir yuzning chastotalari tashqi iteratsiya (a for loop) va switch bayonoti yordamida
qaysi hisoblagichni oshirishni aniqladi. Keyin biz natijalarni alohida-alohida ko'rsatdik
tashqi iteratsiyani amalga oshirgan bayonotlar. 7.7-rasmda biz 6.7-rasmni qayta tikladik.
butun switch iborasini hisoblagichlarni ko'paytiruvchi bitta bayonot bilan joylashtirish
massiv - bu matritsani aylantirish versiyasi hali ham ishlab chiqarish va yig'ish uchun tashqi iteratsiyadan foydalangan.
6 000 000 tasodifiy rulonni marize qiling va yakuniy natijalarni ko'rsatish uchun. Buning oldingi ikkala versiyasi
Misol uchun, tashqi iteratsiyani boshqarish va takroriy xulosani umumlashtirish uchun o'zgaruvchan o'zgaruvchilardan foydalanilgan.
natijalar. 17.19-rasm ushbu dasturlarni barchasini bajaradigan bitta bayonot bilan to'ldiradi, biz-
lambdalar, oqimlar, ichki iteratsiya va 6 000 000 ga aylantirish uchun o'zgaruvchan o'zgaruvchilar yo'q
marta, chastotalarni hisoblang va natijalarni ko'rsating.

1 // 17.19-rasm: RandomIntStream.java


2 // Qatlamni oqimlar bilan 6 000 000 marta aylantirish
3 import java.security.SecureRandom;
4 import java.util.Map;
5 import java.util.function.Function;
6 import java.util.stream.IntStream;
7 import java.util.stream.Kollektorlar;
8
9 umumiy sinf RandomIntStream
10 {
11 ta umumiy statik bekor asosiy(String[] args)
12 {
13 SecureRandom tasodif = yangi SecureRandom();
14
15 // qolipni 6 000 000 marta aylantiring va natijalarni umumlashtiring
16 System.out.printf("%-6s%s%n", "Yuz", "Chastota");
17 tasodifiy.ints(6_000_000, 1, 7)
18
19 .collect(Collectors.groupingBy( ,
20 kollektor.hisoblash()))
21 .forEach((yuz, chastota) ->
22 System.out.printf("%-6d%d%n", yuz, chastota));
23 }
24 } // yakuniy sinf RandomIntStream

17.19-rasm | Oqimlar bilan matritsani 6 000 000 marta aylantirish. (2-qismning 1-qismi.)

.boxed()

Function.identity()


762 17-bob Java SE 8 Lambdalar va oqimlar

Tasodifiy qiymatlarning IntStreamini yaratish
Java SE 8 da SecureRandom klassi haddan tashqari yuklangan ints, long va double usullariga ega.
u Random sinfidan (java.util paketi) meros bo'lib o'tadi. Ushbu usullar IntStream, Long-ni qaytaradi.
Tasodifiy sonlar oqimini ifodalovchi mos ravishda Stream va DoubleStream. Har biri
usulda to'rtta ortiqcha yuk mavjud. Biz bu erda haddan tashqari yuklanishlarni tasvirlaymiz - usullar uzun va ikki-
bles mos ravishda uzun va juft qiymatli oqimlar uchun bir xil vazifalarni bajaradi:
• ints() — cheksiz tasodifiy ints oqimi uchun IntStreamni yaratadi. Cheksiz
oqim noma'lum sonli elementlarga ega - siz qisqa tutashuv terminalidan foydalanasiz
cheksiz oqimda ishlov berishni yakunlash uchun operatsiya. Biz cheksizdan foydalanamiz
Eratosfen elak bilan tub sonlarni topish uchun 23-bobdagi oqim.
• ints(long) — belgilangan tasodifiy ints soni bilan IntStream ni yaratadi.
• ints(int, int)—tasodifiy int qiymatlarining cheksiz oqimi uchun IntStreamni yaratadi.
birinchi argumentdan boshlab va gacha bo'lgan oraliqda, lekin shu jumladan emas
ikkinchi dalil.
• ints(long, int, int) — belgilangan miqdordagi yugurishlar bilan IntStreamni yaratadi.
dom int qiymatlari diapazondagi birinchi argumentdan boshlab va gacha, lekin emas
shu jumladan, ikkinchi dalil.
17-qator 6 000 000 dan iborat IntStreamni yaratish uchun ints ning oxirgi haddan tashqari yuklangan versiyasidan foydalanadi.
dom butun son qiymatlari 1–6 oralig'ida.
IntStream-ni Streamga aylantirish
Biz ushbu misoldagi aylanish chastotalarini ularni MapLong> bunda har bir Integer tugmasi matritsaning bir tomoni va har bir Long qiymati chastotasi hisoblanadi
o'sha tomon. Afsuski, Java to'plamlarda ibtidoiy qiymatlarga ruxsat bermaydi, shuning uchun xulosa qilish uchun
Xaritadagi natijalarni olish uchun biz avval IntStreamni Stream ga aylantirishimiz kerak. Biz buni qilamiz
IntStream usulini qutiga chaqirish orqali.
Die chastotalarini sarhisob qilish
19–20-qatorlar natijalarni MapUzoq>. Kollektorlar groupingBy usulining birinchi argumenti (19-satr) statikni chaqiradi
interfeysi Funktsiyadan usul identifikatori, bu oddiygina qaytariladigan Funktsiyani yaratadi
uning argumenti. Bu haqiqiy tasodifiy qiymatlarni Xaritaning kalitlari sifatida ishlatish imkonini beradi. Ikkinchisi
groupingBy usuliga argument har bir kalitning takrorlanish sonini hisoblaydi.
Natijalarni ko'rsatish
21–22 qatorlar natijalar xulosasini ko'rsatish uchun hosil bo'lgan Map's forEach usulini chaqiradi.
Ushbu usul BiConsumer funktsional interfeysini amalga oshiradigan ob'ektni oladi

Yuz chastotasi


1 999339
2 999937
3 1000302
4 999323
5 1000183
6 1000916

17.19-rasm | Oqimlar bilan matritsani 6 000 000 marta aylantirish. (2-qismning 2-qismi.)


17.9 Lambda hodisalari ishlov beruvchilari 763

dalil. Eslatib o'tamiz, Xaritalar uchun birinchi parametr kalitni, ikkinchisi esa rep-
mos keladigan qiymatdan norozi. 21–22-qatorlardagi lambda kalit sifatida parametr yuzidan foydalanadi
va chastota qiymat sifatida va yuz va chastotani ko'rsatadi.
17.9 Lambda hodisalari ishlov beruvchilari
12.11-bo'limda siz anonimdan foydalangan holda voqea ishlov beruvchisini qanday amalga oshirishni o'rgandingiz
ichki sinf. ActionListener va ItemListener kabi ba'zi hodisalarni tinglovchi interfeyslari
funksional interfeyslardir. Bunday interfeyslar uchun siz voqea ishlov beruvchilarini amalga oshirishingiz mumkin
lambdalar. Masalan, 12.21-rasmdagi quyidagi bayonot:

JComboBox uchun hodisa ishlov beruvchisini ro'yxatdan o'tkazadigan, qisqaroq qilib amalga oshirilishi mumkin

Bu kabi oddiy hodisa ishlov beruvchisi uchun lambda kod miqdorini sezilarli darajada kamaytiradi
yozishingiz kerak.
17.10 Java SE 8 interfeyslari bo'yicha qo'shimcha eslatmalar
Java SE 8 interfeyslari usullarni amalga oshirishni meros qilib olishga imkon beradi
Funktsional interfeyslar faqat bitta mavhum usulni o'z ichiga olishi kerak, lekin o'z ichiga olishi mumkin
standart usullar va interfeys deklaratsiyasida to'liq amalga oshirilgan statik usullar
ratsion. Masalan, Function interfeysi - bu funktsional pro-da keng qo'llaniladi.
grammatika - qo'llaniladigan (abstrakt), tuzish (standart) va Keyin (standart) va usullari mavjud
identifikatsiya (statik).
Sinf standart usullar bilan interfeysni amalga oshirsa va bekor qilmasa
ular uchun sinf standart usullarning amalga oshirilishini meros qilib oladi. Interfeys dizayneri
endi yangi standart va statik usullarni qo'shish orqali interfeysni rivojlantirishi mumkin
interfeysni amalga oshiradigan mavjud kodni buzish. Masalan, interfeys solishtiruvchisi
(16.7.1-bo'lim) endi ko'plab standart va statik usullarni o'z ichiga oladi, ammo eski sinflar
Ushbu interfeysni amalga oshirish hali ham Java SE 8 da to'g'ri kompilyatsiya qilinadi va ishlaydi.
Agar bitta sinf ikkita bog'lanmagan interfeysdan bir xil standart usulni meros qilib olsa, sinf
bu usulni bekor qilishi kerak; aks holda kompilyator qaysi usuldan foydalanishni bilmaydi,
shuning uchun u kompilyatsiya xatosini keltirib chiqaradi.

imagesJComboBox.addItemListener(


new ItemListener() // anonim ichki sinf
{
// JComboBox hodisasini boshqarish
@Override
public void itemStateChanged (ItemEvent hodisasi)
{
// element tanlangan yoki yo'qligini aniqlang
agar (event.getStateChange() == ItemEvent.SELECTED)
label.setIcon(belgilar[
imagesJComboBox.getSelectedIndex()]);
}
} // anonim ichki sinfni tugatish
); // addItemListener-ga qo'ng'iroqni tugatish

imagesJComboBox.addItemListener (voqea -> {


agar (event.getStateChange() == ItemEvent.SELECTED)
label.setIcon(belgilar[imagesJComboBox.getSelectedIndex()]);
});

764 17-bob Java SE 8 Lambdalar va oqimlar

Java SE 8: @FunctionalInterface Annotatsiyasi
Har birida faqat bitta bo'lishini ta'minlash orqali o'zingizning funktsional interfeyslaringizni yaratishingiz mumkin
mavhum usul va nol yoki undan ortiq standart yoki statik usullar. Garchi talab qilinmasa ham,
interfeysning funktsional interfeys ekanligini uning oldiga @Func- belgisini qo'yish orqali e'lon qilishingiz mumkin.
tional Interface izohi. Keyin kompilyator interfeysning mavjudligiga ishonch hosil qiladi
faqat bitta mavhum usul; aks holda, kompilyatsiya xatosini keltirib chiqaradi.
17.11 Java SE 8 va Funktsional dasturlash manbalari
Kitobning veb-sahifasini ko'ring

Java How yozayotganimizda biz yaratgan onlayn Deitel Resurs Markazlariga havolalar uchun


Dasturga, 10/e.
17.12 Yakunlash
Ushbu bobda siz Java SE 8 ning yangi funktsional dasturlash imkoniyatlari haqida bilib oldingiz.
Biz ko'p misollar keltirdik, ko'pincha siz topshirgan vazifalarni bajarishning oddiy usullarini ko'rsatamiz
oldingi boblarda dasturlashtirilgan.
Biz asosiy funktsional dasturlash texnologiyalarini ko'rib chiqdik - funktsional interfeyslar,
lambdalar va oqimlar. IntStream-da elementlarni qanday qayta ishlashni o'rgandingiz - oqim
int qiymatlari. Siz ints massividan IntStream yaratdingiz, keyin oraliq va
natijani keltirib chiqaradigan oqim quvur liniyasini yaratish va qayta ishlash uchun terminal oqimi operatsiyalari.
Funktsional interfeyslarni amalga oshiruvchi anonim usullarni yaratish uchun lambdalardan foydalangansiz.
Biz har birida operatsiyani bajarish uchun forEach terminal operatsiyasidan qanday foydalanishni ko'rsatdik
oqim elementi. Oqim elementlari sonini hisoblash uchun biz qisqartirish operatsiyalaridan foydalandik,
minimal va maksimal qiymatlarni aniqlang va qiymatlarni yig'indi va o'rtacha. Sen ham
o'z kamaytirish operatsiyalarini yaratish uchun kamaytirish usulidan qanday foydalanishni o'rgandi.
Siz predikat va xaritaga mos keladigan elementlarni filtrlash uchun oraliq operatsiyalardan foydalangansiz
elementlarni yangi qiymatlarga o'tkazish - har bir holatda bu operatsiyalar oraliq oqimlarni ishlab chiqaradi
qo'shimcha ishlov berishingiz mumkin. Shuningdek, siz elementlarni qanday saralashni o'rgandingiz
o'sish va kamayish tartibi va ob'ektlarni bir nechta maydonlar bo'yicha qanday saralash.
Biz oqim quvurining natijalarini to'plamga qanday saqlashni ko'rsatdik
keyinroq foydalanish. Buning uchun siz turli xil oldindan belgilangan Kollektor ilovalaridan foydalandingiz
sinf kollektorlari tomonidan taqdim etilgan. Shuningdek, siz elementlarni guruhlash uchun Kollektordan qanday foydalanishni o'rgandingiz
toifalarga bo'linadi.
Turli Java SE 8 sinflari funksionallikni qo‘llab-quvvatlash uchun takomillashtirilganligini bilib oldingiz
dasturlash. Keyin siz o'qiladigan Stream ni olish uchun Files usuli qatorlaridan foydalangansiz
fayldan matn satrlari va IntStreamni olish uchun SecureRandom usuli ints dan foydalanilgan
tasodifiy qiymatlar. Siz IntStreamni Stream ga qanday aylantirishni ham o'rgandingiz
(qutilangan usul orqali), shuning uchun siz fre-zengni umumlashtirish uchun Stream to'plamidan foydalanishingiz mumkin.
Integer qiymatlari miqdorini oling va natijalarni Xaritada saqlang.
Keyinchalik, a. yordamida hodisalarni boshqarish funktsional interfeysini qanday amalga oshirishni o'rgandingiz
lambda. Va nihoyat, biz Java SE 8 interfeyslari haqida qo'shimcha ma'lumotlarni taqdim etdik va
oqimlar. Keyingi bobda biz usullar chaqiriladigan rekursiv dasturlashni muhokama qilamiz
o'zlarini bevosita yoki bilvosita.

http://www.deitel.com/books/jhtp10


Xulosa 765



Xulosa
17.1-bo'lim Kirish
• Java SE 8 dan oldin Java uchta dasturlash paradigmalarini qo'llab-quvvatlagan - protsessual dasturlash, ob-
ob'ektga yo'naltirilgan dasturlash va umumiy dasturlash. Java SE 8 funktsional dasturlashni qo'shadi.
• Funktsional dasturlashni qo'llab-quvvatlaydigan yangi til va kutubxona imkoniyatlari qo'shildi
Lambda loyihasining bir qismi sifatida Java.
17.2-bo'lim Funktsional dasturlash texnologiyalari haqida umumiy ma'lumot
• Funktsional dasturlashdan oldin siz odatda nimaga erishmoqchi ekanligingizni aniqladingiz,
keyin ushbu vazifani bajarish uchun aniq qadamlarni belgilab qo'ying.
• Elementlar to‘plamini takrorlash uchun tsikldan foydalanish tashqi iteratsiya (731-bet) deb nomlanadi va
elementlarga ketma-ket kirishni talab qiladi. Bunday iteratsiya o'zgaruvchan o'zgaruvchilarni ham talab qiladi.
• Funktsional dasturlashda (732-bet) siz topshiriqda nimaga erishmoqchi ekanligingizni belgilaysiz, lekin emas
buni qanday amalga oshirish kerak.
• Kutubxonaga elementlar to'plamini qanday takrorlashni aniqlashiga ruxsat berish ichki deb nomlanadi
takrorlash (732-bet). Ichki iteratsiyani parallellashtirish osonroq.
• Funktsional dasturlash o'zgarmaslikka qaratilgan (732-bet) - ma'lumotlar manbasini o'zgartirmaslik -
qayta ishlangan yoki boshqa dastur holati.
17.2.1-bo'lim Funktsional interfeyslar
• Funktsional interfeyslar yagona mavhum usul (SAM) interfeyslari sifatida ham tanilgan.
• java.util.function to'plami oltita asosiy funktsional interfeyslarni o'z ichiga oladi BinaryOperator, Consumer,
Funktsiya, Predikat, Yetkazib beruvchi va UnaryOperator.
• int, long bilan foydalanish uchun oltita asosiy funktsional interfeyslarning ko'plab maxsus versiyalari mavjud
va ikkilamchi ibtidoiy qiymatlar. Shuningdek, iste'molchi, funktsiya va umumiy moslashuvlar mavjud
Ikkilik operatsiyalar uchun predikat, ya'ni ikkita argumentni qabul qiladigan usullar.
17.2.2-bo'lim Lambda ifodalari
• Lambda ifodasi (733-bet) anonim usulni ifodalaydi - im-ning qisqartmasi.
funktsional interfeysni to'ldirish.
• Lambda turi - bu lambda amalga oshiradigan funktsional interfeys turi.
• Lambda ifodalari funktsional interfeyslar kutilgan har qanday joyda ishlatilishi mumkin.
• Lambda parametrlar roʻyxatidan soʻng oʻq belgisi (->, 733-bet) va quyidagi kabi tanadan iborat:
(parameterList) -> {bayonotlar}
Masalan, quyidagi lambda ikkita int oladi va ularning summasini qaytaradi:
(int x, int y) -> {qaytish x + y;}
Ushbu lambda tanasi bayonot bloki bo'lib, u ichiga bir yoki bir nechta bayonotni o'z ichiga olishi mumkin
jingalak qavslar.
• Lambda parametrlari turlari kiritilmasligi mumkin, masalan:
(x, y) -> {qaytish x + y;}
u holda parametr va qaytish turlari lambda konteksti bilan aniqlanadi.
• Bir ifodali tanasiga ega lambda quyidagicha yozilishi mumkin:
(x, y) -> x + y
Bunday holda, ifodaning qiymati bevosita qaytariladi.

766 17-bob Java SE 8 Lambdalar va oqimlar



• Parametrlar ro'yxatida faqat bitta parametr mavjud bo'lsa, qavslar olib tashlanishi mumkin, masalan:
qiymat -> System.out.printf("%d ", qiymat)
• Boʻsh parametrlar roʻyxatiga ega boʻlgan lambda strelka belgisining chap tomonida () (->) bilan belgilanadi, bu quyidagi kabi:
() -> System.out.println("Lambdalarga xush kelibsiz!")
• Shuningdek, lambdalarning ixtisoslashtirilgan qisqartma shakllari mavjud bo'lib, ular usul havolalari sifatida tanilgan.
17.2.3 Oqimlar
• Oqimlar (734-bet) - Stream interfeysini amalga oshiradigan obyektlar (java.util.stream paketidan)
va funktsional dasturlash vazifalarini bajarishga imkon beradi. Shuningdek, ixtisoslashgan oqimlar mavjud
int, long yoki double qiymatlarini qayta ishlash uchun yuzlar.
• Oqimlar elementlarni qayta ishlash bosqichlari ketma-ketligi bo‘ylab harakatlantiradi — oqim quvuri deb nomlanadi—
ma'lumotlar manbai bilan boshlanadi, ma'lumotlar manbasining elementida turli xil oraliq operatsiyalarni bajaradi.
terminal operatsiyasi bilan tugaydi va tugaydi. Oqim quvur liniyasi zanjirli usul chaqiruvlari orqali hosil bo'ladi.
• To‘plamlardan farqli o‘laroq, oqimlarning o‘z xotirasi yo‘q — oqim qayta ishlansa, u mumkin emas
qayta foydalanish mumkin, chunki u asl ma'lumot manbasining nusxasini saqlamaydi.
• Oraliq operatsiya (734-bet) oqim elementlarida bajarilishi kerak bo'lgan vazifalarni belgilaydi.
yo'llar yangi oqimga olib keladi.
• Oraliq operatsiyalar dangasa (734-bet) — terminal operatsiyasi tugamaguncha bajarilmaydi.
chaqirilgan. Bu kutubxona ishlab chiquvchilariga oqimlarni qayta ishlash samaradorligini optimallashtirish imkonini beradi.
• Terminal operatsiyasi (734-bet) oqim quvurining oraliq operatsiyalarini qayta ishlashni boshlaydi.
va natija beradi. Terminal operatsiyalari g'ayratli (734-bet) - ular so'ralgan operatsiyani bajaradilar.
ular chaqirilganda.
17.3-bo'lim IntStream operatsiyalari
• IntStream (java.util.stream paketi) int qiymatlarini manipulyatsiya qilish uchun maxsus oqimdir.
17.3.1-bo'lim IntStream yaratish va uning qiymatlarini forEach bilan ko'rsatish
Terminalning ishlashi
• IntStream statik usuli (738-bet) argument sifatida int massivini oladi va Int-massivni qaytaradi.
Massiv qiymatlarini qayta ishlash uchun oqim.
• IntStream usuli forEach (terminal operatsiyasi; 738-bet) o‘z argumenti sifatida shunday obyektni oladi
IntConsumer funktsional interfeysini amalga oshiradi (java.util.function paketi). Bu inter-
face's accept usuli bitta int qiymatini oladi va u bilan vazifani bajaradi.
• Java kompilyatori lambda parametrlarining turlarini va lambda tomonidan qaytarilgan turni aniqlashi mumkin.
lambda ishlatilgan kontekstdan. Bu lambdaning maqsad turi bilan belgilanadi
(738-bet) - kodda lambda ko'rinadigan joyda kutilayotgan funktsional interfeys turi.
• Lambdalar yakuniy mahalliy o'zgaruvchilardan yoki samarali yakuniy (738-bet) mahalliy o'zgaruvchilardan foydalanishi mumkin.
• Qo'shimcha leksik doirada mahalliy o'zgaruvchiga ishora qiluvchi lambda tutuvchi lambda deb nomlanadi.
• Lambda tashqi sinfning ushbu havolasidan uni tashqi sinf nomi bilan kvalifikatsiya qilmasdan foydalanishi mumkin.
• Lambdalarda ishlatadigan parametr nomlari va oʻzgaruvchilar nomlari boshqa parametrlar bilan bir xil boʻlishi mumkin emas.
er lambdaning leksik doirasidagi mahalliy o'zgaruvchilar; aks holda kompilyatsiya xatosi yuzaga keladi.
17.3.2 Terminal operatsiyalari soni, min, maks, yig'indisi va o'rtacha
• Class IntStream umumiy oqimlarni qisqartirish uchun terminal operatsiyalarini taqdim etadi—hisoblash (739-bet)
elementlar sonini qaytaradi, min eng kichik intni, max eng katta intni, summani qaytaradi
barcha intlarning yig'indisini aylantiradi va o'rtacha OptionalDouble (java.util paketi) ni qaytaradi.
intlarning o'rtacha qiymati double turining qiymati sifatida olinadi.

Xulosa 767



• Class OptionalDouble ning getAsDouble usuli ob'ektdagi dublni qaytaradi yoki
NoSuchElementException. Ushbu istisnoning oldini olish uchun siz qaytaradigan yoki Else usulini chaqirishingiz mumkin
Agar mavjud bo'lsa OptionalDouble qiymati yoki siz orElse ga o'tadigan qiymat, aks holda.
• IntStream usuli summaryStatistics hisob, min, maks, yig‘indi va o‘rtacha operasiyalarni bajaradi.
IntStream elementlarining bir o'tishida ishlaydi va natijalarni IntSummaryStatistics sifatida qaytaradi
ob'ekt (java.util to'plami).
17.3.3-bo'lim Terminalning ishlashini qisqartirish
• IntStream uchun o'z kamaytirishlaringizni uning kamaytirish usulini chaqirish orqali belgilashingiz mumkin. Birinchi
argument - bu qisqartirish operatsiyasini boshlashga yordam beradigan qiymat va ikkinchi argument - a
IntBinaryOperator (740-bet) funktsional interfeysini amalga oshiradigan ob'ekt.
• Metodu kamaytirishning birinchi argumenti rasmiy ravishda identifikatsiya qiymati deb ataladi (740-bet) - bu qiymat
IntBinaryOperator yordamida har qanday oqim elementi bilan bog'langan ushbu elementning asl qiymatini hosil qiladi.
17.3.4 Oraliq operatsiyalar: IntStream qiymatlarini filtrlash va saralash
• Predikatga mos keladigan oraliq natijalar oqimini yaratish uchun elementlarni filtrlaysiz. IntStream
usul filtri (741-bet) IntPredicate funktsional inter-diskni amalga oshiradigan ob'ektni oladi.
yuz (java.util.function paketi).
• IntStream usuli saralangan (dangasa operatsiya) oqim elementlarini o‘sish tartibiga belgilaydi
buyurtma (sukut bo'yicha). Oqim quvuridagi barcha oldingi oraliq operatsiyalar shunday bajarilishi kerak
saralangan usul qaysi elementlarni saralashni biladi.
• Fuqaroligi bo'lmagan oraliq operatsiyani filtrlash usuli — u haqida hech qanday ma'lumot talab qilmaydi
joriy element predikatga mos kelishini tekshirish uchun oqimdagi boshqa elementlar.
• Tartiblangan usul - bu barcha boshqa ma'lumotlar haqida ma'lumot talab qiladigan statistik oraliq operatsiya.
er elementlarni saralash uchun oqimdagi.
• Interface IntPredicate standart usuli va (741-bet) mantiqiy VA operatsiyasini qisqa
u chaqirilgan IntPredicate va uning IntPredicate argumenti o'rtasidagi sxemani baholash.
• IntPredicate interfeysining standart inkor qilish usuli (741-bet) Int-ning mantiqiy qiymatini o'zgartiradi.
Qaysi sababga ko'ra atalganligini belgilang.
• Interfeys IntPredicate standart usuli yoki (741-bet) mantiqiy YOKI amalni qisqa
u chaqirilgan IntPredicate va uning IntPredicate argumenti o'rtasidagi sxemani baholash.
• Murakkabroq shartlarni yaratish uchun IntPredicate interfeysining standart usullaridan foydalanishingiz mumkin.
17.3.5-bo'lim Oraliq operatsiya: xaritalash
• Xaritalash - bu oqim elementlarini yangi qiymatlarga va pro-
hosil bo'lgan (ehtimol, boshqa turdagi) elementlarni o'z ichiga olgan oqimni chiqaradi.
• IntStream usuli xaritasi (shtatsiz oraliq operatsiya; 742-bet) amalga oshiradigan ob'ektni oladi.
IntUnaryOperator funktsional interfeysi (java.util.function paketi).
17.3.6-bo'lim IntStream Methods diapazoni bilan ints oqimlarini yaratish va
diapazon yopiq
• IntStream usullari diapazoni (743-bet) va oralig‘iClosed har biri tartiblangan int ketma-ketligini hosil qiladi.
qiymatlar. Ikkala usul ham qiymatlar oralig'ini ifodalovchi ikkita int argumentini oladi. Usul diapazoni
birinchi argumentdan ikkinchi argumentgacha bo'lgan qiymatlar ketma-ketligini hosil qiladi, lekin shu jumladan emas.
ment. rangeClosed usuli har ikkala argumentni o'z ichiga olgan qiymatlar ketma-ketligini hosil qiladi.
17.4-bo'lim Stream Manipulyatsiyalar
• Ob'ektlar massividan Stream yaratish uchun Class Array ning oqim usulidan foydalaniladi.

768 17-bob Java SE 8 Lambdalar va oqimlar



17.4.1-bo'lim Stream yaratish
• Interfeys Stream (java.util.stream paketi; 744-bet) oqimni amalga oshirish uchun umumiy interfeysdir.
ob'ektlar ustida operatsiyalar. Qayta ishlangan ob'ektlarning turlari Oqim manbai tomonidan belgilanadi.
• Class Arrays IntStreams, LongStreams va yaratish uchun haddan tashqari yuklangan oqim usullarini taqdim etadi
DoubleStreams int, long va double massivlardan yoki massivlardagi elementlar diapazonidan.
17.4.2-bo'lim Oqimni saralash va natijalarni yig'ish
• Tartiblangan oqim usuli (745-bet) sukut bo'yicha oqim elementlarini o'sish tartibida tartiblaydi.
• Oqim quvurlari natijalarini o'z ichiga olgan to'plam yaratish uchun siz Oqim usulini to'plashdan foydalanishingiz mumkin
(terminal operatsiyasi). Oqim quvur liniyasi qayta ishlanayotganda, yig'ish usuli o'zgaruvchanlikni amalga oshiradi
natijalarni ro'yxat, xarita yoki to'plam kabi ob'ektga joylashtiradigan qisqartirish operatsiyasi.
• Bir argument bilan yig'ish usuli kollektor interfeysini amalga oshiradigan ob'ektni oladi
(java.util.stream paketi), bu o'zgaruvchan qisqartirishni qanday amalga oshirishni belgilaydi.
• Class Collectors (java.util.stream paketi) oldindan belgilangan qaytaruvchi statik usullarni taqdim etadi.
Kollektor ilovalari.
• Collectors usuli toList Stream ni List to'plamiga aylantiradi.
17.4.3 Oqimni filtrlash va natijalarni keyinroq ishlatish uchun saqlash
• Oqim usuli filtri (745-bet) Predikat oladi va natijada mos keladigan ob'ektlar oqimi paydo bo'ladi.
Predikat. Predikat usuli testi mantiqiy qiymatni qaytaradi, bu argumentning mos kelishini ko'rsatadi.
shartni belgilaydi. Interfeys Predicate shuningdek, va, inkor etish va yoki usullariga ega.
17.4.5-bo'lim Oldindan to'plangan natijalarni saralash
• Oqim quvurining natijalarini to'plamga joylashtirganingizdan so'ng, siz yangi oqim yaratishingiz mumkin
oldingi natijalar bo'yicha qo'shimcha oqim operatsiyalarini bajarish uchun to'plamdan.
17.5.1-bo'lim. Usul ma'lumotnomasi yordamida satrlarni katta harflarga solishtirish
• Oqim usuli xaritasi (747-bet) har bir elementni yangi qiymatga moslashtiradi va yangi oqim hosil qiladi.
dastlabki oqim bilan bir xil miqdordagi elementlar.
• Usul ma'lumotnomasi (747-bet) - lambda ifodasi uchun stenografiya.
• ClassName::instanceMethodName a ning misol usuli uchun usul havolasini ifodalaydi
sinf. Lambda argu-misolidagi misol usulini chaqiruvchi bir parametrli lambda yaratadi.
ment va usul natijasini qaytaradi.
• objectName::instanceMethodName misol usuli uchun usul havolasini ifodalaydi
ma'lum bir ob'ektda chaqirilishi kerak. Misolni chaqiradigan bir parametrli lambda yaratadi
ko'rsatilgan ob'ektdagi usul - lambda argumentini misol usuliga o'tkazish - va
usul natijasini qaytaradi.
• ClassName::staticMethodName sinfning statik usuli uchun usul havolasini ifodalaydi.
Bir parametrli lambda yaratadi, unda lambda argumenti belgilangan a ga uzatiladi.
statik usul va lambda usul natijasini qaytaradi.
• ClassName::new konstruktor havolasini ifodalaydi. No-argu-ni chaqiruvchi lambda hosil qiladi.
Ushbu sinfning yangi ob'ektini yaratish va ishga tushirish uchun belgilangan sinfning ment konstruktori.
17.5.2-bo'lim Satrlarni filtrlash, keyin ularni katta-kichik harflarga sezgir bo'lmagan o'sish tartibida tartiblash
Buyurtma
• Tartiblangan oqim usuli (748-bet) Comparatorni argument sifatida qabul qilishi mumkin.
saralash uchun oqim elementlarini pare.
• Odatiy bo'lib, tartiblangan usul oqim elementi turi uchun tabiiy tartibdan foydalanadi.

Xulosa 769



• Strings uchun natural tartib katta-kichik harflarga sezgir, ya'ni "Z" "a" dan kichik. dan o'tish
oldindan belgilangan Comparator String.CASE_INSENSITIVE_ORDER katta-kichik harflarni sezmaydigan tartiblashni amalga oshiradi.
17.5.3-bo'lim Satrlarni filtrlash, keyin ularni katta-kichik harflarga sezgir bo'lmagan kamayish bo'yicha tartiblash
Buyurtma
• Funktsional interfeys Comparatorning standart usuli teskari (748-bet) mavjud Kom-
paratorning buyurtmasi.
Bo'lim 17.6.1 Ro'yxatni yaratish va ko'rsatish
• System.out::println havolasi misol usuli forEach uchun Stream usuliga uzatilsa,
u kompilyator tomonidan Iste'molchi funktsional interfeysini amalga oshiradigan ob'ektga aylantiriladi.
Ushbu interfeysning qabul qilish usuli bitta argumentni oladi va bekor qiladi. Bunday holda, qabul qilinadi
usul argumentni System.out ob'ektining println misol usuliga o'tkazadi.
17.6.2-bo'lim Xodimlarni ma'lum diapazonda ish haqi bilan filtrlash
• Lambdani qayta ishlatish uchun siz uni tegishli funktsional interfeys turidagi o'zgaruvchiga belgilashingiz mumkin.
• Comparator interfeysining taqqoslashning statik usuli (753-bet) quyidagi funksiyalarni oladi.
taqqoslashda foydalanish uchun oqimdagi ob'ektdan qiymat chiqaradi va Comparator ob'ektini qaytaradi.
• Dangasa baholashning yaxshi ishlash xususiyati qisqa tutashuvni baholash qobiliyatidir—
ya'ni kerakli natija mavjud bo'lishi bilanoq oqim quvurini qayta ishlashni to'xtatish.
• Oqim usuli findFirst qisqa tutashuv terminali operatsiyasi bo‘lib, oqim trubkasi-
liniyasi va oqim quvuridan birinchi ob'ekt topilishi bilanoq ishlov berishni tugatadi. The
usul, agar mavjud bo'lsa, topilgan ob'ektni o'z ichiga olgan ixtiyoriyni qaytaradi.
17.6.3-bo'lim Xodimlarni bir nechta maydonlar bo'yicha saralash
• Ob'ektlarni ikkita maydon bo'yicha saralash uchun siz ikkita Funktsiyadan foydalanadigan Comparator yaratasiz. Avval siz qo'ng'iroq qilasiz -
birinchi Funktsiya bilan solishtiruvchi yaratish uchun solishtiruvchi parator usuli. Olingan kom-
parator, siz ikkinchi Funktsiya bilan solishtirish usulini chaqirasiz. Olingan taqqoslash
birinchi Funktsiya yordamida ob'ektlarni solishtiradi, keyin teng bo'lgan ob'ektlar uchun ularni taqqoslaydi
ikkinchi funksiya.
17.6.4-bo'lim Xodimlarni noyob familiya satrlari bilan taqqoslash
• Xuddi shu raqamga ega boshqa oqim yaratish uchun oqimdagi ob'ektlarni turli turlarga xaritalash mumkin.
asl oqim sifatida elementlarning ber.
• Oqim usuli alohida (754-bet) oqimdagi takroriy ob'ektlarni yo'q qiladi.
17.6.5-bo'lim Xodimlarni bo'lim bo'yicha guruhlash
• Kollektorlarning statik usuli groupingBy (755-bet) bitta argumentga ega bo‘lgan Funksiyani oladi.
oqimdagi ob'ektlarni filtrlaydi - bu funksiya tomonidan qaytarilgan qiymatlar Xaritadagi kalitlar sifatida ishlatiladi. The
mos keladigan qiymatlar, sukut bo'yicha, ma'lum toifadagi oqim elementlarini o'z ichiga olgan Ro'yxatlardir.
• Xarita usuli forEach har bir kalit-qiymat juftligi ustida amalni bajaradi. Usul ob'ektni oladi
BiConsumer funktsional interfeysini amalga oshiradigan ject. Ushbu interfeysning qabul qilish usuli ikkitadan iborat
parametrlari. Xaritalar uchun birinchisi kalitni, ikkinchisi esa mos keladigan qiymatni bildiradi.
17.6.6-bo'lim Har bir bo'limda xodimlar sonini hisoblash
• Ikki argumentga ega bo'lgan kollektorlarning statik usuli groupingBy tasniflaydigan Funktsiyani oladi
oqimdagi ob'ektlar va boshqa Kollektor (pastki oqim kollektori sifatida tanilgan; 756-bet).
• Kollektorlarni statik hisoblash usuli ob'ektlar sonini hisoblaydigan Kollektorni qaytaradi
ularni ro'yxatga yig'ish o'rniga, berilgan tasnif.

770 17-bob Java SE 8 Lambdalar va oqimlar



17.6.7-bo'lim Xodimlarning ish haqini yig'ish va o'rtacha hisoblash
• Oqim usuli mapToDouble (756-bet) ob'ektlarni ikkilamchi qiymatlarga moslashtiradi va DoubleStreamni qaytaradi.
Usul ToDoubleFunction funktsional interfeysini amalga oshiradigan ob'ektni oladi
(java.util.function paketi). Ushbu interfeysning applyAsDouble usuli misolni chaqiradi
ob'ektdagi usul va ikki tomonlama qiymatni qaytaradi.
17.7-bo'lim Fayldan oqim yaratish
• Files usuli satrlari fayldan matn satrlarini o'qish uchun Stream ni yaratadi.
• FlatMap (760-bet) oqim usuli ob'ektni oqimga xaritalash funksiyasini oladi, masalan,
matn qatorini so'zlarga aylantiradi.
• SplitAsStream naqsh usuli (760-bet) Stringni tokenlash uchun muntazam ifodadan foydalanadi.
• Kollektorlar usuli guruhlashBy uchta argument bilan tasniflagich, Xarita zavodi va a oladi
quyi oqim kollektori. Tasniflagich - bu kalit sifatida ishlatiladigan ob'ektlarni qaytaradigan funksiya
olingan xarita. Xarita zavodi ta'minotchi interfeysini amalga oshiradigan va yangisini qaytaradigan ob'ektdir
Xarita to'plami. Pastki oqim kollektori har bir guruh elementlarini qanday yig'ish kerakligini aniqlaydi.
• Map usuli entrySet Xaritaning kalit-qiymat juftliklarini o'z ichiga olgan Map.Entry ob'ektlari to'plamini qaytaradi.
• Set usuli oqimi to‘plam elementlarini qayta ishlash uchun oqimni qaytaradi.
17.8-bo'lim Tasodifiy qiymatlar oqimini yaratish
• SecureRandom sinfining ints usullari (762-bet), longs va doubles (Random sinfidan meros)
tasodifiy sonlar oqimi uchun mos ravishda IntStream, LongStream va DoubleStreamni qaytaring.
• Argumentsiz ints usuli cheksiz tasodifiy oqim (762-bet) uchun IntStreamni yaratadi.
int qiymatlari. Cheksiz oqim - bu noma'lum sonli elementlarga ega oqim - siz a dan foydalanasiz
cheksiz oqimda ishlov berishni yakunlash uchun qisqa tutashuv terminali ishlashi.
• Uzoq argumentli ints usuli belgilangan tasodifiy sonli IntStreamni yaratadi
int qiymatlari.
• Ikki int argumentli ints usuli cheksiz tasodifiy int oqimi uchun IntStreamni yaratadi
diapazondagi qiymatlar birinchi argumentdan boshlanib, ikkinchisiga qadar, lekin shu jumladan emas.
• Uzun va ikkita int argumentli ints usuli belgilangan raqam bilan IntStreamni yaratadi
birinchi argumentdan boshlab va gacha bo'lgan diapazondagi tasodifiy int qiymatlari, lekin shu jumladan emas:
ikkinchisi.
• IntStreamni Stream ga aylantirish uchun IntStream usulini qutiga qo'ng'iroq qiling.
• Funktsiyaning statik usuli identifikatori oddiygina argumentini qaytaradigan Funktsiyani yaratadi.
17.9-bo'lim Lambda hodisalarini ishlovchilar
• Ba'zi hodisalarni tinglovchi interfeyslari funktsional interfeyslardir (763-bet). Bunday interfeyslar uchun siz im-
voqea ishlovchilarni lambdalar bilan to'ldiring. Oddiy hodisa ishlov beruvchisi uchun lambda sezilarli darajada kamayadi
yozishingiz kerak bo'lgan kod miqdori.
17.10-bo'lim Java SE 8 interfeyslari bo'yicha qo'shimcha eslatmalar
• Funktsional interfeyslar faqat bitta mavhum usulni o'z ichiga olishi kerak, lekin sukut bo'yicha ham bo'lishi mumkin
interfeys deklaratsiyasida to'liq amalga oshirilgan usullar va statik usullar.
• Agar sinf standart usullar bilan interfeysni amalga oshirsa va ularni bekor qilmasa,
sinf standart usullarni amalga oshirishni meros qilib oladi. Interfeys dizayneri endi uni rivojlantirishi mumkin
Mavjud kodni buzmasdan yangi standart va statik usullarni qo'shish orqali interfeys.
interfeysni to'ldiradi.

O'z-o'zini tekshirish mashqlari 771



• Agar bitta sinf ikkita interfeysdan bir xil standart usulni meros qilib olsa, sinf buni bekor qilishi kerak
usul; aks holda kompilyator kompilyatsiya xatosini yaratadi.
• Har birida faqat bitta abstrakt bo'lishini ta'minlash orqali o'zingizning funktsional interfeyslaringizni yaratishingiz mumkin
usul va nol yoki undan ortiq standart yoki statik usullar.
• Interfeys funktsional interfeys ekanligini uning oldiga @Functional- belgisini qo'yish orqali e'lon qilishingiz mumkin.
Interfeys izohi. Keyin kompilyator interfeys faqat bittadan iborat bo'lishini ta'minlaydi
mavhum usul; aks holda, kompilyatsiya xatosini keltirib chiqaradi.
O'z-o'zini tekshirish mashqlari
17.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Lambda ifodalari amalga oshiriladi.
b) Funktsional dasturlarni bajarish osonroq (ya'ni, bir vaqtning o'zida bir nechta operatsiyalarni bajarish).
dasturlaringiz ko'p yadroli arxitekturadan foydalanishi uchun
samaradorligini oshirish.
c) Iteratsiya bilan kutubxona barcha elementlarga qanday kirishni aniqlaydi.
vazifani bajarish uchun dars.
d) Funktsional interfeys ikkita T argumentini qabul qiladigan qo'llash usulini o'z ichiga oladi,
ular ustida amal (masalan, hisoblash) bajaradi va T tipidagi qiymatni qaytaradi.
e) Funktsional interfeysda T argumentini oladigan va test usuli mavjud
mantiqiy qiymatni qaytaradi va T argumenti shartni qanoatlantirishini tekshiradi.
f) A(n) anonim usulni ifodalaydi - imple-
funktsional interfeysni eslatib o'tamiz.
g) Oraliq oqim operatsiyalari - ular terminalgacha bajarilmaydi
operatsiya chaqiriladi.
h) Terminal oqimi operatsiyasi a dagi har bir elementga ishlov beradi
oqim.
i) lambdalar mahalliy oʻzgaruvchilarni qoʻshib olgan leksik doiradan foydalanadi.
j) dangasa baholashning o'ziga xos xususiyati - baholashni amalga oshirish qobiliyati -
ya'ni kerakli natija mavjud bo'lishi bilanoq oqim quvurini qayta ishlashni to'xtatish.
k) Xaritalar uchun BiConsumerning birinchi parametri uning ikkinchi parametrini ifodalaydi.
tegishli yuboradi.
17.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Lambda ifodalari funktsional interfeyslar kutilgan har qanday joyda ishlatilishi mumkin.
b) Terminal operatsiyalari dangasa - ular so'ralgan operatsiyani ular mavjud bo'lganda bajaradilar
chaqirdi.
c) Metod kamaytirishning birinchi argumenti rasmiy ravishda identifikatsiya qiymati deb ataladi - bu qiymat, qachon
IntBinaryOperator-dan foydalangan holda oqim elementi bilan birlashtirilgan oqimni ishlab chiqaradi
elementning asl qiymati. Misol uchun, elementlarni yig'ishda identifikatsiya qiymati hisoblanadi
1 va elementlarning mahsulotini olishda identifikatsiya qiymati 0 ga teng.
d) Oqim usuli findFirst qisqa tutashuv terminali operatsiyasi bo'lib, uni qayta ishlaydi
oqim quvuri, lekin ob'ekt topilishi bilanoq ishlov berishni tugatadi.
e) FlatMap oqim usuli oqimni ob'ektga xaritalash funksiyasini oladi. sobiq uchun -
etarli bo'lsa, ob'ekt so'zlarni o'z ichiga olgan String bo'lishi mumkin va natija boshqa bo'lishi mumkin
alohida so'zlar uchun oraliq Stream.
f) Agar sinf standart usullar bilan interfeysni amalga oshirsa va ularni bekor qilsa,
sinf standart usullarni amalga oshirishni meros qilib oladi. Endi interfeys dizayneri mumkin
eskisini buzmasdan yangi standart va statik usullarni qo'shish orqali interfeysni rivojlantiring.
interfeysni amalga oshiradigan isting kodi.

772 17-bob Java SE 8 Lambdalar va oqimlar

17.3 Quyidagi vazifalarning har biri uchun lambda yoki usul havolasini yozing:
a) Quyidagi anonim ichki sinf o‘rniga ishlatilishi mumkin bo‘lgan lambda yozing:
yangi IntConsumer()
{
ommaviy bekor qabul qilish (int qiymati)
{
System.out.printf("%d ", qiymat);
}
}
b) Quyidagi lambda o'rniga ishlatilishi mumkin bo'lgan usul havolasini yozing:
(String s) -> {return s.toUpperCase();}
c) “Welcome to lambdas!” qatorini bilvosita qaytaradigan argumentsiz lambda yozing.
d) Matematik metod sqrt uchun metod havolasini yozing.
e) Argument kubini qaytaruvchi bir parametrli lambda yarating.

O'z-o'zini tekshirish mashqlariga javoblar


17.1 a) funksional interfeyslar. b) parallellashtirish. c) ichki. d) BinaryOperator. e) Predikat.
f) lambda ifodasi. g) dangasa. h) har biri uchun. i) qo'lga olish. j) qisqa tutashuv. k) kalit, qiymat.
17.2 a) To'g'ri. b) yolg'on. Terminal operatsiyalari g'ayratli - ular so'ralgan operatsiyani bajaradilar
ular chaqirilganda. c) yolg'on. Elementlarni yig'ishda identifikatsiya qiymati 0 ga teng va olinganda
elementlarning hosilasi identifikatsiya qiymati 1 ga teng. d) To'g'ri. e) yolg'on. Oqim usuli flatMap qayta
ob'ektni oqimga aylantiruvchi funktsiyani oladi. f) yolg'on. Aytish kerak: “... ularni bekor qilmaydi,
…” o‘rniga “ularni bekor qiladi”.
17.3 a) qiymat -> System.out.printf("%d ", qiymat)
b) String::toUpperCase
c) () -> "Lambdalarga xush kelibsiz!"
d) Matematika::sqrt
e) qiymat -> qiymat * qiymat * qiymat

Mashqlar
17.4 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:


a) Oqim oqim manbalaridan, oraliq operatsiyalardan va terminaldan hosil bo'ladi
operatsiyalar.
b) Quyidagi kod iteratsiya texnikasidan foydalanadi:
int sum = 0;
for (int counter = 0; counter < values.length; counter++)
summa += qiymatlar [hisoblagich];
c) Funktsional dasturlash imkoniyatlari ma'lumotlarni o'zgartirmaslikka qaratilgan
qayta ishlanayotgan manba yoki boshqa dastur holati.
d) Funktsional interfeys T argumentini qabul qiluvchi qabul usulini o'z ichiga oladi va
bekor qiladi; accept o'zining T argumenti bilan vazifani bajaradi, masalan, ob'ektni chiqarish,
ob'ektning usulini chaqirish va boshqalar.
e) Funktsional interfeys argumentlarni talab qilmaydigan get usulini o'z ichiga oladi
T tipidagi qiymat hosil qiladi - bu ko'pincha a bo'lgan yig'ish ob'ektini yaratish uchun ishlatiladi
oqim operatsiyasi natijalari joylashtiriladi.

773-mashqlar



f) Streamlar - bu Stream interfeysini amalga oshiradigan va sizga funktsiyalarni bajarishga imkon beradigan ob'ektlar.
elementlar bo'yicha milliy dasturlash vazifalari.
g) Oraliq oqimning ishlashi natijasida faqat el-
shartni qondiradigan elementlar.
h) oqim quvur liniyasini qayta ishlash natijalarini a kabi kollektsiyaga joylashtiring
Roʻyxat, oʻrnatish yoki xarita.
i) Filtrlash uchun qo‘ng‘iroqlar va boshqa oraliq oqimlar dangasa bo‘ladi — ular bir muddatgacha baholanmaydi.
ishtiyoqli operatsiya amalga oshiriladi.
j) Pattern usuli (Java SE 8 da yangi) a tokenizatsiya qilish uchun muntazam ifodadan foydalanadi
String.
k) Funktsional interfeyslar faqat bitta usulni o'z ichiga olishi kerak, lekin o'z ichiga olishi ham mumkin
interfeysda to'liq amalga oshirilgan usullar va statik usullar
laratsiyalar.
17.5 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Oraliq operatsiya oqim elementlarida bajariladigan vazifalarni belgilaydi; bu
samarali, chunki u yangi oqim yaratishdan qochadi.
b) Reduksiya operatsiyalari oqimdagi barcha qiymatlarni oladi va ularni yangi oqimga aylantiradi.
c) Agar sizga int qiymatlarining tartiblangan ketma-ketligi kerak bo'lsa, o'z ichiga olgan IntStream yaratishingiz mumkin
IntStream usullari oralig'i va rangeClosed bilan bunday qiymatlar. Ikkala usul ham ikkitadan oladi
qiymatlar oralig'ini ifodalovchi int argumentlari. Metod rangeClosed se-
birinchi argumentdan ikkinchi argumentgacha bo'lgan qiymatlar soni, lekin shu jumladan emas.
Usul diapazoni ikkala argumentni o'z ichiga olgan qiymatlar ketma-ketligini hosil qiladi.
d) Sinf fayllari (java.nio.file to'plami) Java API-dagi ko'plab sinflardan biridir.
Streamsni qo'llab-quvvatlash uchun yaxshilangan.
e) Interfeys xaritasida oqimlarni qaytaruvchi usullar mavjud emas.
f) Funktsional dasturda keng qo'llaniladigan Funksional funktsional interfeys -
ming - qo'llaniladigan (mavhum), tuzish (mavhum) vaThen (standart) va usullariga ega
identifikatsiya (statik).
g) Agar bitta sinf ikkita interfeysdan bir xil standart usulni meros qilib olsa, sinf o'z-o'zidan oshib ketishi kerak.
bu usulda yuring; aks holda, kompilyator qaysi usuldan foydalanishni bilmaydi, shuning uchun
kompilyatsiya xatosini keltirib chiqaradi.
17.6 Quyidagi vazifalarning har biri uchun lambda yoki usul havolasini yozing:
a) Ikki juft a va b parametrlarini qabul qiluvchi va ularning qiymatini qaytaruvchi lambda ifodasini yozing
mahsulot. Har bir parametr turini aniq ko'rsatadigan lambda shaklidan foydalaning.
b) (a) qismdagi lambda ifodasini roʻyxatga kiritilmagan lambda shaklidan foydalanib qayta yozing.
har bir parametr turi.
c) (b) qismdagi lambda ifodasini bilvosita qaytaradigan lambda shaklidan foydalanib qayta yozing.
lambda tanasi ifodasining qiymati.
d) “Welcome to lambdas!” qatorini bilvosita qaytaradigan argumentsiz lambda yozing.
e) ArrayList sinfi uchun konstruktor havolasini yozing.
f) Hodisa ishlov beruvchisi sifatida lambda yordamida quyidagi iborani qayta ishlating:
button.addActionListener(
yangi ActionListener()
{
public void actionPerformed(ActionEvent hodisasi)
{
JOptionPane.showMessageDialog(ParentFrame.this,
"JButton voqea ishlovchisi");
}
}
);

774 17-bob Java SE 8 Lambdalar va oqimlar

17.7 Ushbu ro'yxatni List deb faraz qilib, oqim quvurini batafsil tushuntiring:
list.stream()
.filtr(qiymat -> qiymat % 2 != 0)
.sum()
17.8 Tasodifiy SecureRandom obyekti deb faraz qilib, oqim quvurini batafsil tushuntiring:
tasodifiy.ints(1000000, 1, 3)
.boxed()
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()))
.forEach((yon, chastota) ->
System.out.printf("%-6d%d%n", yon, chastota));
17.9 (Fayldagi belgilarni umumlashtirish) Xulosa qilish uchun 17.17-rasmdagi dasturni o'zgartiring.
fayldagi har bir belgining takrorlanish soni.
17.10 (Katalogdagi fayl turlarini umumlashtirish) 15.3-bo'limda qanday ma'lumot olish mumkinligi ko'rsatilgan.
diskdagi fayllar va kataloglar haqida ma'lumot. Bundan tashqari, siz ko'rsatish uchun DirectoryStream dan foydalangansiz
katalog tarkibi. Interface DirectoryStream endi standart usul yozuvlarini o'z ichiga oladi
Streamni qaytaradi. 15.3-bo'lim, DirectoryStream usuli yozuvlaridagi usullardan foydalaning, qo'zichoq-
das va oqimlar belgilangan katalogdagi fayllar turlarini umumlashtirish uchun.
17.11 (Oqimni boshqarish) Mashqlar papkasida taqdim etilgan Invoice sinfidan foydalaning
Invoice ob'ektlari qatorini yaratish uchun ushbu bobning misollari bilan. Ko'rsatilgan namuna ma'lumotlaridan foydalaning
17.20-rasm. Class Invoice to'rtta xususiyatni o'z ichiga oladi - PartNumber (int turi), PartDescription
(String turi), sotib olinayotgan buyumning miqdori (int turi) va Narx (turi double). Per-
Invoice ob'ektlari massivida quyidagi so'rovlarni shakllantiring va natijalarni ko'rsating:
a) Invoys ob'ektlarini PartDescription bo'yicha saralash uchun lambdalar va oqimlardan foydalaning, so'ngra ko'rsating
natijalar.
b) Invoys ob'ektlarini Narx bo'yicha saralash uchun lambdalar va oqimlardan foydalaning, so'ngra natijalarni ko'rsating.
c) Har bir schyot-fakturani uning qismi tavsifi va miqdori bilan taqqoslash uchun lambdalar va oqimlardan foydalaning,
natijalarni Miqdor bo'yicha tartiblang, so'ngra natijalarni ko'rsating.
d) Har bir Invoysni uning PartDescription va qiymatiga moslashtirish uchun lambdalar va oqimlardan foydalaning
hisob-faktura (ya'ni, Miqdor * Narx). Natijalarni hisob-faktura qiymati bo'yicha buyurtma qiling.
e) 200 dan 500 AQSH dollari oralig'ida hisob-faktura qiymatlarini tanlash uchun (d) qismini o'zgartiring.

17.12 (Dublikat so'zni o'chirish) Foydalanuvchidan gap kiritadigan dastur yozing (taxmin qilaylik).


tinish belgilari yo'q), keyin alifbo tartibida noyob so'zlarni aniqlaydi va ko'rsatadi. Davolanish -
kichik va kichik harflar bir xil.

Qism raqami Qism tavsifi Miqdor Narxi

83 Elektr silliqlash mashinasi 7 57,98
24 Power arra 18 99,99
7 Balyoz bolg'a 11 21.50
77 Bolg'a 76 11.99
39 Maysazor 3 79,50
68 Tornavida 106 6.99
56 Jig arra 21 11.00
3 Kalit 34 7.50

17.20-rasm | 17.11-mashq uchun namuna ma'lumotlari.


775-mashqlar

17.13 (Harflarni saralash va dublikatlarni olib tashlash) 30 ta tasodifiy harf kiritadigan dastur yozing.
Ro'yxatga. Quyidagi operatsiyalarni bajaring va natijalaringizni ko'rsating:
a) Ro'yxatni o'sish tartibida tartiblang.
b) Ro'yxatni kamayish tartibida tartiblang.
c) Ro'yxatni dublikatlari olib tashlangan holda o'sish tartibida ko'rsating.
17.14 (Paralellashtirish uchun IntStreamni xaritalash, keyin qisqartirish) Siz o'tadigan lambda
oqimni kamaytirish usuli assotsiativ bo'lishi kerak, ya'ni uning pastki ifodasi qanday tartibda bo'lishidan qat'i nazar -
sionlar baholanadi, natija bir xil bo'lishi kerak. 17.5-rasmning 34-36-qatorlaridagi lambda ifodasi
assotsiativ emas. Agar siz ushbu lambda bilan parallel oqimlardan foydalansangiz (23-bob, bir vaqtda),
Kvadratchalar yig'indisi uchun noto'g'ri natijalar olishingiz mumkin, bu pastki qismning tartibiga qarab.
ifodalar baholanadi. 34-36 qatorlarni amalga oshirishning to'g'ri yo'li birinchi navbatda har bir intni xaritalashdir
qiymatini ushbu qiymatning kvadratiga, so'ngra oqimni kvadratlar yig'indisiga kamaytirish uchun. O'zgartirish
34-36 qatorlarni shu tarzda amalga oshirish uchun 17.5-rasm.

18 Rekursiya


O! sizda la'nat bor
iteratsiya va san'at, albatta, qodir
azizni buzadi.
- Uilyam Shekspir
Bu xotiraning yomon turi
faqat orqaga qarab ishlaydi.
- Lyuis Kerroll
Hayotni faqat tushunish mumkin
orqaga; lekin yashash kerak
oldinga.
- Soren Kierkegaard

Oh maqsadlar


Ushbu bobda siz:
■ tushunchasini o'rganing
rekursiya.
■ Rekursivni yozing va ishlating
usullari.
■ Asosiy holatni aniqlang va
rekursivdagi rekursiya qadami
algoritm.
■ Rekursiv usul qandayligini bilib oling
qo'ng'iroqlar tomonidan amalga oshiriladi
tizimi.
■ orasidagi farqlarni bilib oling
rekursiya va iteratsiya, va
har birini qachon ishlatish kerak.
■ Fraktallar nima ekanligini bilib oling va
yordamida ularni qanday chizish mumkin
rekursiya.
■ Rekursiv nima ekanligini bilib oling
orqaga qaytish va bu nima uchun
samarali muammoni hal qilish
texnikasi.

18.1 Kirish 777

18.1 Kirish
Biz hozirgacha muhokama qilgan dasturlar odatda bir-birini chaqiradigan usullar sifatida tuzilgan.
boshqasi ierarxik tarzda. Ba'zi muammolar uchun usulni o'zi chaqirish foydalidir.
Buni amalga oshiradigan usul rekursiv usul deb nomlanadi. Rekursiv usul o'zini chaqirishi mumkin
to'g'ridan-to'g'ri yoki bilvosita boshqa usul orqali. Rekursiya muhim mavzu
yuqori darajadagi informatika kurslarida uzoq vaqt la'natlangan. Ushbu bobda biz qayta ko'rib chiqamiz
konseptual ravishda kurssiya qiling, keyin rekursiv usullarni o'z ichiga olgan bir nechta dasturlarni taqdim eting.
18.1-rasmda ushbu kitobdagi rekursiya misollari va mashqlar jamlangan.

18.1 Kirish


18.2 Rekursiya tushunchalari
18.3 Rekursiyadan foydalanishga misol: faktoriallar
18.4 Sinfni qayta tiklash
Faktorial kalkulyatordan foydalanish
BigInteger sinfi
18.5 Rekursiyadan foydalanishga misol: Fibonachchi
Seriya
18.6 Rekursiya va Metod-Call Stack

18.7 Rekursiya va takrorlash


18.8 Xanoy minoralari
18.9 Fraktallar
18.9.1 Koch egri fraktal
18.9.2 (ixtiyoriy) Case Study: Lo Feather
Fraktal
18.10 Rekursiv orqaga qaytish
18.11 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar

Ushbu kitobdagi rekursiya misollari va mashqlari

18 Faktorial usul (18.3 va 18.4-rasmlar)


Fibonachchi usuli (18.5-rasm)
Xanoy minoralari (18.11-rasm)
Fraktallar (18.18 va 18.19-rasmlar)
Ushbu kod nima qiladi? (18.7-mashq, 18.12-mashq va 18.13-mashq)
Quyidagi koddagi xatoni toping (18.8-mashq)
Butun sonni butun son darajaga ko‘tarish (18.9-mashq)
Rekursiyani vizualizatsiya qilish (18.10-mashq)
Eng katta umumiy boʻluvchi (18.11-mashq)
Satrning palindrom ekanligini aniqlang (18.14-mashq)
Sakkiz malika (18.15-mashq)
Massivni chop etish (18.16-mashq)
Massivni orqaga qarab chop etish (18.17-mashq)
Massivdagi minimal qiymat (18.18-mashq)
Yulduzli fraktal (18.19-mashq)
Rekursiv orqaga kuzatish yordamida labirintni o'tkazish (18.20-mashq)
Labirintlarni tasodifiy yaratish (18.21-mashq)
Har qanday o'lchamdagi labirintlar (18.22-mashq)
Fibonachchi raqamini hisoblash vaqti (18.23-mashq)

18.1-rasm | Ushbu matndagi rekursiya misollari va mashqlarning qisqacha mazmuni. (2-qismning 1-qismi.)


778 18-bob Rekursiya

18.2 Rekursiya tushunchalari
Muammoni hal qilishning rekursiv yondashuvlari bir qator umumiy elementlarga ega. Qachon a
Rekursiv usul muammoni hal qilish uchun chaqiriladi, u aslida faqat sim-
plest case(lar) yoki asosiy holat(lar). Agar usul asosiy registr bilan chaqirilsa, u natijani qaytaradi. Agar
Usul murakkabroq masala bilan chaqiriladi, u muammoni ikki qismga ajratadi:
ceptual bo'laklar - bu usul qanday qilishni biladi va u bilmaydigan qism
qanday qilishni bilish. Rekursiyani amalga oshirish uchun oxirgi qism asl nusxaga o'xshash bo'lishi kerak
muammo, lekin uning biroz soddaroq yoki kichikroq versiyasi bo'lishi kerak. Chunki bu yangi muammo yana
asl muammoga o'xshaydi, usul kichikroq ustida ishlash uchun o'zining yangi nusxasini chaqiradi
muammo - bu rekursiv chaqiruv deb ataladi va rekursiya bosqichi deb ham ataladi. The
rekursiya bosqichi odatda qaytish bayonotini o'z ichiga oladi, chunki uning natijasi birlashtiriladi
muammoning bir qismi bilan usul bo'ladigan natijani shakllantirish uchun qanday hal qilishni bilardi
asl qo'ng'iroq qiluvchiga qaytariladi. Muammoni ikkiga bo'lish tushunchasi
kichikroq qismlar 6-bobda kiritilgan bo'l va zabt et yondashuvining bir shaklidir.
Rekursiya bosqichi asl usul chaqiruvi hali ham faol bo'lganda amalga oshiriladi (ya'ni, u faol emas
bajarish tugallangan). U ko'proq rekursiv qo'ng'iroqlarga olib kelishi mumkin, chunki usul har birini ajratadi
yangi kichik muammoni ikkita kontseptual qismga bo'lish. Rekursiya oxir-oqibat tugashi uchun,
har safar usul o'zini asl muammoning oddiyroq versiyasi bilan chaqiradi
kichikroq va kichikroq masalalar ketma-ketligi asosiy holatda yaqinlashishi kerak. Qachon usul
asosiy holatni taniydi, natijani usulning oldingi nusxasiga qaytaradi. Bir qator
Qaytishlar soni asl usul chaqiruvi yakuniy natijani qo'ng'iroq qiluvchiga qaytarmaguncha davom etadi. Biz qilamiz
bu jarayonni 18.3-bo'limdagi aniq misol bilan tasvirlab bering.
Rekursiv usul boshqa usulni chaqirishi mumkin, bu esa o'z navbatida qayta qo'ng'iroq qilishi mumkin
rekursiv usul. Bu bilvosita rekursiv chaqiruv yoki bilvosita rekursiya sifatida tanilgan. Uchun
Masalan, A usuli B usulini chaqiradi, bu esa A usuliga qayta qo'ng'iroq qiladi. Bu hali ham takrorlanadi.
sion, chunki A usuliga ikkinchi chaqiruv A usuliga birinchi chaqiruv amalga oshiriladi
faol - ya'ni A usuliga birinchi qo'ng'iroq hali bajarilishini tugatmagan (chunki u
natijani qaytarish uchun B usulini kutish) va A usulining asl nusxasiga qaytmagan
qo'ng'iroq qiluvchi.

19 Birlashtirish saralash (19.6-rasm)


Chiziqli qidiruv (19.8-mashq)
Ikkilik qidiruv (19.9-mashq)
Tez tartiblash (19.10-mashq)
21 Ikkilik daraxt qo'shish (21.17-rasm)
Ikkilik daraxtni oldindan buyurtma qilish (21.17-rasm)
Ikkilik daraxtning tartibsiz o'tishi (21.17-rasm)
Ikkilik daraxtning postorder traversi (21.17-rasm)
Bog'langan ro'yxatni orqaga chop etish (21.20-mashq)
Bog'langan ro'yxatni qidirish (21.21-mashq)

Ushbu kitobdagi rekursiya misollari va mashqlari

18.1-rasm | Ushbu matndagi rekursiya misollari va mashqlarning qisqacha mazmuni. (2-qismning 2-qismi.)

18.3 Rekursiyadan foydalanishga misol: faktoriallar 779

Rekursiya tushunchasini yaxshiroq tushunish uchun keling, bu juda to'g'ri bo'lgan misolni ko'rib chiqaylik
kompyuter foydalanuvchilari uchun tanish - fayl tizimi katalogining rekursiv ta'rifi.
puter. Kompyuter odatda tegishli fayllarni katalogda saqlaydi. Katalog bo'sh bo'lishi mumkin,
fayllarni o'z ichiga olishi va/yoki boshqa kataloglarni o'z ichiga olishi mumkin (odatda pastki kataloglar deb ataladi).
Ushbu kichik kataloglarning har biri, o'z navbatida, fayllar va kataloglarni ham o'z ichiga olishi mumkin. Agar biz
katalogdagi har bir faylni ro'yxatga olishni xohlasangiz (shu jumladan katalogning pastki kataloglaridagi barcha fayllar),
biz avval boshlang'ich katalog fayllarini ro'yxatlaydigan, so'ngra rekursiv qiladigan usul yaratishimiz kerak
ushbu katalogning har bir pastki katalogidagi fayllarni ro'yxatga olish uchun chaqiradi. Asosiy holat a
hech qanday pastki katalogga ega bo'lmagan katalogga erishildi. Shu nuqtada, barcha fayllar
asl katalog ro'yxatga olingan va boshqa rekursiya kerak emas.
18.3 Rekursiyadan foydalanishga misol: faktoriallar
Ommabop matematik hisobni bajarish uchun rekursiv dastur yozamiz. O'ylab ko'ring
n bilan yozilgan musbat butun sonning faktoriali! (“n faktorial” deb talaffuz qilinadi), bu
mahsulot

1 bilan! 1 va 0 ga teng! 1 deb belgilangan. Masalan, 5! mahsulot 5 · 4 · 3 · 2 · 1,


bu 120 ga teng.
Butun sonning faktorialini (bu erda raqam ≥ 0) iterativ tarzda hisoblash mumkin.
rekursiv) quyidagi kabi for iborasidan foydalaning:

1 dan katta butun sonlar uchun faktorial hisoblashning rekursiv deklaratsiyasi keldi.


quyidagi munosabatni kuzatish orqali:

Masalan, 5! aniq 5 · 4! ga teng, quyidagi tenglamalar bilan ko'rsatilgan:

Baholash 5! 18.2-rasmda ko'rsatilganidek davom etadi. 18.2 (a) rasmda qanday qilib ko'rsatilgan
rekursiv qo'ng'iroqlar ketma-ketligi 1 gacha davom etadi! (asosiy holat) 1 deb baholanadi, qaysi
rekursiyani tugatadi. 18.2 (b)-rasmda har bir rekursiv chaqiruvdan qaytarilgan qiymatlar ko'rsatilgan
yakuniy qiymat hisoblab chiqilmaguncha va qaytarilmaguncha qo'ng'iroq qiluvchiga.
18.3-rasmda 0 butun sonlarning faktoriallarini hisoblash va chop etish uchun rekursiya qo‘llaniladi
orqali 21. Rekursiv usuli faktorial (satrlar 7-13) aniqlash uchun birinchi sinovlari
tugatish sharti (9-satr) to'g'ri. Agar raqam 1 dan kichik yoki teng bo'lsa (asosiy registr),
faktorial 1 ni qaytaradi, boshqa rekursiya kerak emas va usul qaytadi. (oldindan ogohlantirish -
Ushbu misolda faktorial usulni chaqirish tartibi shundan iboratki, uning argumenti noaniq bo'lishi kerak.
ative.) Agar raqam 1 dan katta bo'lsa, 12-satr masala sonning ko'paytmasi sifatida ifodalanadi
va faktorialga rekursiv chaqiruv - 1 sonining faktorialini baholaydi, bu biroz
Asl hisobdan kichikroq muammo, faktorial (raqam).

n · (n – 1) · (n – 2) · … · 1

faktorial = 1;
uchun (int hisoblagich = raqam; hisoblagich >= 1; hisoblagich--)
faktorial *= hisoblagich;

n! = n · (n – 1)!

5! = 5 · 4 · 3 · 2 · 1
5! = 5 · (4 · 3 · 2 · 1)
5! = 5 · (4!)

780 18-bob Rekursiya

18.2-rasm | Rekursiv baholash 5!.

1 // 18.3-rasm: FactorialCalculator.java


2 // Rekursiv faktorial usul.
3
4 umumiy sinf Faktorial Kalkulyator
5 {
6
7
8
9
10
11
12
13
14
15 // 0-21 qiymatlar uchun faktoriallarni chiqarish
16 ta umumiy statik bekor asosiy(String[] args)
17 {
18 // 0 dan 21 gacha faktoriallarni hisoblang
19 uchun (int counter = 0; counter <= 21; counter++)
20 System.out.printf("%d! = %d%n", hisoblagich, );
21 }
22 } // oxirgi sinf FactorialCalculator
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120

18.3-rasm | Rekursiv faktorial usul. (2-qismning 1-qismi.)

(a) Rekursiv chaqiruvlar ketma-ketligi

5 * 4!


4 * 3!

3*2!


2 * 1!

5!

1



(b) Har bir rekursiv chaqiruvdan qaytarilgan qiymatlar

Yakuniy qiymat = 120

5! = 5 * 24 = 120 qaytariladi

4! = 4 * 6 = 24 qaytariladi

3! = 3 * 2 = 6 qaytariladi

2! = 2 * 1 = 2 qaytariladi

1 qaytdi

5 * 4!


4 * 3!

3*2!


2 * 1!

5!

1



// rekursiv usul faktorial (uning parametri >= 0 deb faraz qilinadi)
umumiy statik uzun faktorial (uzun raqam)
{
agar (raqam <= 1) // asosiy holat uchun test
qaytish 1; // asosiy holatlar: 0! = 1 va 1! = 1
else // rekursiya bosqichi
Qaytish raqami * faktoriy(raqam - 1);
}

faktoriy (hisoblagich)


18.4 BigInteger 781 sinfidan foydalangan holda faktorial kalkulyator

Asosiy usul (16–21-qatorlar) 0–21 faktoriallarini koʻrsatadi. Faktorialga qo'ng'iroq
usul 20-satrda uchraydi. Metod faktorial long va tipidagi parametrni oladi
long tipidagi natijani qaytaradi. Dasturning natijasi faktorial qiymatlar bo'lishini ko'rsatadi
tez katta. Biz long turidan foydalanamiz (nisbatan katta butun sonlarni ifodalashi mumkin), shuning uchun pro-
gramm 12 dan katta faktoriallarni hisoblay oladi! Afsuski, faktorial usul pro-
katta qiymatlarni shunchalik tez o'zgartiradiki, biz harakat qilganimizda eng katta uzun qiymatdan oshib ketamiz
21 ni hisoblang!, dasturning chiqishining oxirgi satrida ko'rishingiz mumkin.
Integral turlarining cheklovlari tufayli float yoki double o'zgaruvchilar oxir-oqibat bo'lishi mumkin
kattaroq sonli faktoriallarni hisoblash uchun zarur. Bu ba'zi pro-rektorlarning zaifligini ko'rsatadi.
grammatika tillari, ya'ni ularni yangi turlar bilan osonlikcha kengaytirib bo'lmaydi
noyob dastur talablari. 9-bobda ko'rganimizdek, Java kengaytiriladigan tildir
agar xohlasak, o'zboshimchalik bilan katta butun sonlarni yaratishga imkon beradi. Aslida java.math pro- paketi
ixtiyoriy aniqlikdagi hisoblar uchun BigInteger va BigDecimal sinflarini aniq ko'rsatadi.
ibtidoiy turlar bilan bajarib bo'lmaydi. Ushbu darslar haqida ko'proq bilib olishingiz mumkin

18.4 Faktorial-kalkulyator sinfini qayta tiklash


BigInteger sinfidan foydalanish
18.4-rasmda BigInteger o'zgaruvchilari yordamida FactorialCalculator klassi qayta ishlanadi. Kimga
uzoq o'zgaruvchilar saqlashi mumkin bo'lgan qiymatlardan kattaroq qiymatlarni ko'rsating, biz faktoriallarni hisoblaymiz
0 dan 50 gacha raqamlar. 3-qator java.math paketidan BigInteger sinfini import qiladi. Yangi
faktorial usul (8-15-qatorlar) argument sifatida BigIntegerni oladi va a qaytaradi
BigInteger.

...
12! = 479001600


...
20! = 2432902008176640000
21! = -4249290049419214848

Umumiy dasturlash xatosi 18.1


Yoki asosiy registrni o'tkazib yuborish yoki rekursiya bosqichini noto'g'ri yozish, bu shunday bo'lmasligi kerak
Asosiy holatda konversiya cheksiz rekursiya deb nomlanuvchi mantiqiy xatoga olib kelishi mumkin.
kursiv qo'ng'iroqlar doimiy ravishda xotira tugagunga qadar yoki metod-chaqiruv stekiga qadar amalga oshiriladi
toshib ketadi. Bu xato iterativdagi cheksiz sikl muammosiga o'xshaydi (bo'lmagan).
rekursiv) yechim.

docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html


docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

1 // 18.4-rasm: FactorialCalculator.java


2 // Rekursiv faktorial usul.
3
4

18.4-rasm | Rekursiv usul bilan faktoriy hisoblar. (2-qismning 1-qismi.)

18.3-rasm | Rekursiv faktorial usul. (2-qismning 2-qismi.)

12! int o'zgaruvchilar uchun to'lib ketishiga olib keladi

21! uzoq o'zgaruvchilar uchun to'lib ketishiga olib keladi

import java.math.BigInteger;


782 18-bob Rekursiya

BigInteger ibtidoiy tur emasligi sababli biz arifmetik, relyatsion va
BigIntegers bilan tenglik operatorlari; Buning o'rniga biz BigInteger usullaridan foydalanishimiz kerak
bu vazifalarni bajaring. 10-qator BigInteger solishtirish usuli yordamida asosiy holat uchun sinovlar.
Bu usul usulni chaqiradigan BigInteger raqamini metod bilan solishtiradi
BigInteger argumenti. Agar usulni chaqiruvchi BigInteger bo'lsa, usul -1 ni qaytaradi
argumentdan kamroq, agar ular teng bo'lsa 0 yoki usulni chaqiruvchi BigInteger bo'lsa 1
argumentdan kattaroqdir. 10-qator BigInteger raqamini BigInteger bilan taqqoslaydi
doimiy ONE, bu butun son qiymatini ifodalaydi 1. Agar compareTo -1 yoki 0 ni qaytarsa, u holda
raqam 1 dan kichik yoki teng (asosiy holat) va usul doimiyni qaytaradi
BigInteger.ONE. Aks holda, 13–14 qatorlar BigInteger yordamida rekursiya bosqichini bajaradi
ko'paytirish uchun zarur bo'lgan hisob-kitoblarni amalga oshirish uchun ko'paytirish va ayirish usullari
son faktoriali bo'yicha raqam - 1. Dasturning chiqishi BigInteger han-
faktorial hisoblash natijasida hosil bo'lgan katta qiymatlarni o'z ichiga oladi.

5 umumiy sinf Faktorial Kalkulyator


6 {
7
8
9
10
11
12
13
14
15
16
17 // 0-50 qiymatlari uchun faktoriallarni chiqarish
18 ta umumiy statik bekor asosiy(String[] args)
19 {
20 // 0 dan 50 gacha faktoriallarni hisoblang
21 uchun (int counter = 0; counter <= 50; counter++)
22 System.out.printf("%d! = %d%n", hisoblagich,
23);
24 }
25 } // oxirgi sinf Faktorial Kalkulyator

0! = 1
1! = 1


2! = 2
3! = 6
...
21! = 51090942171709440000
22! = 1124000727777607680000
...
47! = 2586232415111681806429643515361197996919763238912000000000
48! = 1241391559253607267086228904737337503852148635467776000000000
49! = 608281864034267560872252163321295376887552831379210240000000000
50! = 30414093201713378043612608166064768844377641568960512000000000000
18.4-rasm | Rekursiv usul bilan faktoriy hisoblar. (2-qismning 2-qismi.)

// rekursiv usul faktorial (uning parametri >= 0 deb faraz qilinadi)


umumiy statik BigInteger faktorial (BigInteger raqami)
{
agar (number.compareTo(BigInteger.ONE) <= 0) // testning asosiy holati
BigInteger.ONEni qaytarish; // asosiy holatlar: 0! = 1 va 1! = 1
else // rekursiya bosqichi
raqamni qaytarish. ko'paytirish (
faktoriy(son.ayirish(BigInteger.ONE)));
}

faktoriy(BigInteger.valueOf(hisoblagich))

21! va kattaroq qiymatlar endi toshib ketishiga olib kelmaydi

18.5 Rekursiyadan foydalanishga misol: Fibonachchi seriyasi 783

18.5 Rekursiyadan foydalanishga misol: Fibonachchi seriyasi
Fibonachchi seriyasi,

0 va 1 dan boshlanadi va har bir keyingi Fibonachchi raqamiga xos xususiyatga ega


oldingi ikkitasining yig'indisi. Bu seriya tabiatda uchraydi va spiral shaklini tasvirlaydi. The
ketma-ket Fibonachchi raqamlarining nisbati 1,618… doimiy qiymatga yaqinlashadi, bu raqam
Bu oltin nisbat yoki oltin o'rtacha deb ataladi. Odamlar oltinni topishga moyil
estetik jihatdan yoqimli degan ma'noni anglatadi. Arxitektorlar ko'pincha derazalar, xonalar va binolarni loyihalashtiradilar
uzunlik va kenglik oltin o'rtacha nisbatda. Pochta kartalari ko'pincha a bilan yaratilgan
oltin o'rtacha uzunlik va kenglik nisbati.
Fibonachchi seriyasini rekursiv ravishda quyidagicha aniqlash mumkin:

Fibonachchini hisoblash uchun ikkita asosiy holat mavjud: fibonachchi (0) 0 deb belgilangan va


fibonachchi(1) 1 bo'lishi kerak. 18.5-rasmdagi dastur i-Fibonachchi sonini qayta hisoblab chiqadi.
kursiv tarzda, Fibonachchi usuli yordamida (10-18-qatorlar). Asosiy usul (21-26-qatorlar) fibo-
nacci, 0-40 Fibonachchi qiymatlarini ko'rsatadi. for ichida yaratilgan o'zgaruvchi hisoblagich
sarlavha (23-satr) har bir iteratsiya uchun qaysi Fibonachchi raqamini hisoblash kerakligini ko'rsatadi
halqa. Fibonachchi raqamlari tezda katta bo'ladi (garchi fabrikadagi kabi tez emas).
boshqalar). Shuning uchun biz BigInteger turini parametr turi va qaytariladigan usul sifatida ishlatamiz.
od Fibonachchi.

0, 1, 1, 2, 3, 5, 8, 13, 21, …

fibonachchi (0) = 0
fibonachchi (1) = 1
fibonachchi(n) = fibonachchi(n – 1) + fibonachchi(n – 2)

1 // 18.5-rasm: FibonacciCalculator.java


2 // Rekursiv Fibonachchi usuli.
3 import java.math.BigInteger;
4
5 ommaviy sinf Fibonachci Calculator
6 {
7 shaxsiy statik BigInteger TWO = BigInteger.valueOf(2);
8
9
10
11
12
13
14
15
16
17
18
19
20 // Fibonachchi qiymatlarini 0 dan 40 gacha ko'rsatadi
21 ta umumiy statik bekor asosiy(String[] args)
22 {

18.5-rasm | Rekursiv Fibonachchi usuli. (2-qismning 1-qismi.)

// Fibonachchi usulining rekursiv deklaratsiyasi
ommaviy statik BigInteger fibonachchi (BigInteger raqami)
{
agar (son. teng(BigInteger.ZERO) ||
raqam.equals(BigInteger.ONE)) // asosiy holatlar
qaytish raqami;
else // rekursiya bosqichi
fibonachchini qaytaring(raqam.ayirish(BigInteger.ONE)).qo'shish(
fibonachchi(raqam.ayirish(ikki)));
}

784 18-bob Rekursiya

Asosiydan Fibonachchi usuliga qo'ng'iroq (25-qator) rekursiv chaqiruv emas, balki barcha sub-
18.5-rasmning 16-17-qatorlaridan bajarilgan fibonachchiga navbatdagi qo'ng'iroqlar rekursivdir, chunki
o'sha paytda qo'ng'iroqlar Fibonachchi usuli bilan boshlanadi. Har safar Fibonachchi
deb nomlangan bo'lsa, u darhol asosiy holatlarni sinab ko'radi - 0 ga teng raqam yoki 1 ga teng son (satr
12–13). 0 va 1 qiymatlarini ifodalash uchun biz BigInteger konstantalaridan ZERO va ONE dan foydalanamiz,
mos ravishda. Agar 12-13-qatorlardagi shart to'g'ri bo'lsa, Fibonachchi shunchaki raqamni qaytaradi,
chunki fibonachchi(0) 0 va fibonachchi(1) 1. Qizig'i shundaki, agar raqam dan katta bo'lsa
1, rekursiya bosqichi ikkita rekursiv qo'ng'iroqni hosil qiladi (16-17-qatorlar), har biri biroz kichikroq
Fibonachchiga asl qo'ng'iroqdan ko'ra muammo. 16-17 qatorlarda BigInteger qo'shish usullari qo'llaniladi
va rekursiv qadamni amalga oshirishga yordam berish uchun ayirish. Biz turning doimiysidan ham foydalanamiz
BigInteger biz 7-qatorda aniqlagan TWO deb nomlandi.
Fibonachchi usuliga qo'ng'iroqlarni tahlil qilish
18.6-rasmda fibonachchi usuli fibonachchini qanday baholashi ko'rsatilgan (3). Pastki qismida
bizda 1, 0 va 1 qiymatlari qoladi - asosiy holatlarni baholash natijalari. The
dastlabki ikkita qaytarish qiymati (chapdan o'ngga), 1 va 0 qo'ng'iroqlar uchun qiymat sifatida qaytariladi
fibonachchi (1) va fibonachchi (0). 1 plyus 0 summasi fibonak qiymati sifatida qaytariladi.
ci(2). Bu Fibonachchiga (1) qo'ng'iroqning natijasiga (1) qo'shilib, 2 qiymatini hosil qiladi.
Keyinchalik bu yakuniy qiymat Fibonachchi (3) qiymati sifatida qaytariladi.
18.6-rasmda Java kompilyatorlarini baholash tartibi haqida ba'zi qiziqarli masalalar ko'rsatilgan.
operatorlarning operandlarini ishlating. Bu tartib operatorlar bo'lganidan farq qiladi
ularning operandlariga nisbatan qo'llaniladi, ya'ni operator ustuvorligi qoidalari bilan belgilanadigan tartib.
18.6-rasmdan ko'rinib turibdiki, Fibonachchi(3) baholanayotganda ikkita rekursiv
qo'ng'iroqlar amalga oshiriladi - Fibonachchi (2) va Fibonachchi (1). Lekin ular qanday tartibda bo'ladi

23 uchun (int counter = 0; counter <= 40; counter++)


24 System.out.printf("Fibonachchi ning %d: %d%n", hisoblagich,
25);
26 }
27 } // oxirgi sinf FibonacciCalculator
Fibonachchi 0 ga teng: 0
Fibonachchi 1 ga teng: 1
Fibonachchi 2: 1
Fibonachchi 3: 2
Fibonachchi 4: 3
Fibonachchi 5 ga teng: 5
6 ning Fibonachchi soni: 8
Fibonachchi 7 ga teng: 13
Fibonachchi 8 ga teng: 21
9ning Fibonachchi soni: 34
10 ning Fibonachchi soni: 55
...
37 ning Fibonachchi soni: 24157817
Fibonachchi 38: 39088169
Fibonachchi 39: 63245986
Fibonachchi 40: 102334155
18.5-rasm | Rekursiv Fibonachchi usuli. (2-qismning 2-qismi.)

fibonachchi(BigInteger.valueOf(hisoblagich))


18.5 Rekursiyadan foydalanishga misol: Fibonachchi seriyasi 785

qilingan? Java tili operandlarni baholash tartibi chapdan yo'nalishda ekanligini ko'rsatadi
to'g'ri. Shunday qilib, birinchi navbatda fibonachchi (2) chaqiruvi, ikkinchidan esa fibonachchi (1) chaqiruvi amalga oshiriladi.
Biz bu yerda ishlatadigan rekursiv dasturlar haqida ehtiyot bo'lish kerak
Fibonachchi raqamlarini yaratish. Fibonachchi usulining har bir chaqiruvi bunday qilmaydi
asosiy holatlardan biriga (0 yoki 1) mos kelsa, fibonachchiga yana ikkita rekursiv qo'ng'iroqlar keladi
usul. Shunday qilib, bu rekursiv qo'ng'iroqlar to'plami tezda qo'ldan chiqib ketadi. Fibo-ni hisoblash
18.5-rasmdagi dastur bilan 20 nacci qiymati fibonachchiga 21 891 ta qo'ng'iroqni talab qiladi.
usul; 30 ning Fibonachchi qiymatini hisoblash uchun 2,692,537 ta qo'ng'iroq kerak bo'ladi! Siz qo'ng'iroq qilmoqchi bo'lganingizda -
kattaroq Fibonachchi qiymatlarini hisoblab chiqsangiz, har bir Fibonachchi ketma-ket sizni raqamlashini sezasiz
Hisoblash vaqtini sezilarli darajada oshirish va natijalarni hisoblash uchun ilovadan foydalaning
fibonachchi usuliga qo'ng'iroqlar soni. Masalan, Fibonachchi qiymati 31 ga teng
4,356,617 ta qo'ng'iroqni talab qiladi va 32 ning Fibonachchi qiymati 7,049,155 ta qo'ng'iroqni talab qiladi! Siz kabi
ko'rish mumkin, Fibonachchiga qo'ng'iroqlar soni tez ortib bormoqda - 1,664,080 qo'shimcha qo'ng'iroqlar
Fibonachchi qiymatlari o'rtasida 30 va 31 va Fibonachchi o'rtasida 2,692,538 qo'shimcha qo'ng'iroqlar
31 va 32 qiymatlari! Fibonachchi qiymatlari o'rtasida qilingan qo'ng'iroqlar sonidagi farq
31 va 32 raqamlari Fibonachchi uchun qo'ng'iroqlar sonidagi farqdan 1,5 baravar ko'pdir.
30 dan 31 gacha bo'lgan qiymatlar.
zerikarli kompyuterlar. [Izoh: Murakkablik nazariyasi sohasida kompyuter olimlari qanday qilib o'rganadilar
qiyin algoritmlar o'z vazifalarini bajarish uchun ishlaydi. Murakkablik masalalari batafsil muhokama qilinadi
Yuqori darajadagi kompyuter fanlari bo'yicha o'quv kursi odatda "Algoritmlar" deb ataladi. Biz
19-bobda, Qidiruv, Saralash va Katta O.da turli xil murakkablik masalalarini tanishtiring.] Bunda
bobning mashqlarida sizdan 18.5-rasmdagi Fibonachchi dasturini yaxshilash so'raladi, shunda
u hisoblashni amalga oshirish uchun zarur bo'lgan taxminiy vaqtni hisoblab chiqadi. Buning uchun
Buning uchun siz statik tizim usulini currentTimeMillis deb nomlaysiz, bu hech qanday argument talab qilmaydi.
kompyuterning joriy vaqtini millisekundlarda qaytaradi.

18.6-rasm | Fibonachchi (3) uchun rekursiv qo'ng'iroqlar to'plami.

Ishlash bo'yicha maslahat 18.1
Fibonachchi uslubidagi rekursiv dasturlardan saqlaning, chunki ular eksponent "eksport" ga olib keladi.
sion” usuli chaqiruvlari.

+

fibonachchi( 3 )



Fibonachchi( 2 ) + fibonachchi ( 1 ) ni qaytaring

fibonachchi( 1 ) fibonachchi ( 0 ) 1 ni qaytaradi

1 qaytaring 0 qaytaring

qaytish

786 18-bob Rekursiya

18.6 Rekursiya va Metod-Call Stack


6-bobda qanday tushunish kontekstida stek ma'lumotlar strukturasi kiritilgan
Java usul chaqiruvlarini bajaradi. Biz metod-chaqiruv stekini ham, stek ramkalarini ham muhokama qildik. In
Ushbu bo'limda biz ushbu tushunchalardan dasturning qanday bajarilishini ko'rsatish uchun foydalanamiz
rekursiv usul chaqiruvlarini boshqaradi.
Keling, Fibonachchi misoliga qaytishdan boshlaylik, xususan, fibo-ni chaqirish usuli.
18.6-rasmdagi kabi 3 qiymati bilan nacci. Usul stekni chaqirish tartibini ko'rsatish uchun
ramkalar stekga joylashtiriladi, biz 18.7-rasmda usul chaqiruvlarini harf bilan yozdik.

Birinchi usul chaqiruvi (A) amalga oshirilganda, mahalliy qiymatni o'z ichiga olgan stek ramkasi


o'zgaruvchining raqami (bu holda 3) dasturni bajarish stekiga suriladi. Bu to'plam,
shu jumladan A usuli chaqiruvi uchun stek ramkasi 18.8-rasmning (a) qismida tasvirlangan. [Eslatma:
Bu erda biz soddalashtirilgan stekdan foydalanamiz. Haqiqiy dasturni bajaruvchi stek va uning stek freymlari
18.8-rasmdagiga qaraganda murakkabroq bo'ladi, bu erda bunday ma'lumotlar mavjud
usul chaqiruvi bajarilishni tugatgandan keyin qaytishdir.]

18.7-rasm | Fibonachchi (3) qo'ng'irog'i ichida qilingan usul chaqiruvlari.

18.8-rasm | Usul dasturni bajaruvchi stekni chaqiradi.

Fibonachchi (3)

B fibonachchi( 2 ) E fibonachchi ( 1 )

C fibonachchi( 1 ) D fibonachchi ( 0 )

1 qaytaring 0 qaytaring

qaytish 1

Stack tepasi

(d)


Usul chaqiruvi: E
raqam = 1
Usul chaqiruvi: A
raqam = 3

Stack tepasi

(c)

Usul chaqiruvi: D


raqam = 0
Usul chaqiruvi: B
raqam = 2
Usul chaqiruvi: A
raqam = 3

Stack tepasi

(b)

Usul chaqiruvi: C


raqam = 1
Usul chaqiruvi: B
raqam = 2
Usul chaqiruvi: A
raqam = 3

Stack tepasi

(a)

Usul chaqiruvi: A


raqam = 3

18.7 Rekursiya va takrorlash 787



A usul chaqiruvi doirasida B va E usul chaqiruvlari amalga oshiriladi. Asl usul chaqiruvi mavjud
hali tugallanmagan, shuning uchun uning stek ramkasi stekda qoladi. Birinchi usul bo'lishni chaqiradi
A ichidan yaratilgan B usul chaqiruvi, shuning uchun B usuli chaqiruvi uchun stek ramkasi ustiga suriladi
A usuli chaqiruvi uchun stekning tepasida joylashgan. B usuli chaqiruvi bajarilishi va yakunlanishi kerak
E usuli chaqirilishidan oldin. B usul chaqiruvi doirasida C va D usul chaqiruvlari amalga oshiriladi.
Avval C usuli chaqiriladi va uning stek ramkasi stekga [(b) qismiga suriladi.
18.8-rasm]. B usuli chaqiruvi hali tugamagan va uning stek ramkasi hali ham usulda -
qo'ng'iroqlar to'plami. C usuli chaqiruvi bajarilganda, u boshqa usul chaqiruvlarini qilmaydi, lekin oddiygina
1 qiymatini qaytaradi. Ushbu usul qaytarilganda, uning stek ramkasi yuqori qismidan chiqariladi
stack. Stackning yuqori qismidagi usul chaqiruvi endi B bo'lib, u har bir tomonidan bajarilishini davom ettiradi.
shakllantirish usuli chaqiruvi D. Usul chaqiruvi uchun stek ramkasi stekga [qismga suriladi
(c) 18.8-rasm]. D usuli chaqiruvi boshqa hech qanday usul chaqiruvini qilmasdan yakunlanadi va
0 qiymatini qaytaradi. Ushbu usul chaqiruvi uchun stek ramkasi keyin stekdan chiqariladi. Endi,
B usuli chaqiruvidan qilingan ikkala usul chaqiruvi ham qaytarildi. B usuli chaqiruvi davom etmoqda
bajarish, qiymatni qaytarish 1. B usuli chaqiruvi tugallanadi va uning stek ramkasi ochiladi
stekdan. Bu vaqtda A usuli chaqiruvi uchun stek ramkasi stekning yuqori qismida va
usul o'z bajarilishini davom ettiradi. Bu usul stek ramkasi E usulini chaqiradi
endi stekga suriladi [18.8-rasmning (d) qismi]. E usuli chaqiruvi tugallanadi va qaytariladi
qiymat 1. Ushbu usul chaqiruvi uchun stek ramkasi stekdan chiqariladi va yana bir marta
A usul chaqiruvi bajarishda davom etadi. Bu vaqtda A usuli chaqiruvi hech qanday natija bermaydi
boshqa usul chaqiradi va uning bajarilishini tugatishi mumkin, A ning chaqiruvchisiga 2 qiymatini qaytaradi (fibo-
nacci(3) = 2). A ning stek ramkasi stekdan chiqariladi. Amalga oshirish usuli har doim
stek ramkasi stekning yuqori qismida joylashgan va bu usul uchun stek ramkasi
o'zining mahalliy o'zgaruvchilari qiymatlarini saqlaydi.
18.7 Rekursiya va takrorlash
Biz faktorial va fibonachchi usullarini o'rganib chiqdik, ularni osongina amalga oshirish mumkin.
u rekursiv yoki iterativ tarzda. Ushbu bo'limda biz ikkita yondashuvni taqqoslaymiz va muhokama qilamiz
nima uchun muayyan vaziyatda bir yondashuvni boshqasidan ko'ra tanlashingiz mumkin.
Iteratsiya ham, rekursiya ham boshqaruv bayonotiga asoslanadi: Takrorlash takrorlashdan foydalanadi
bayonot (masalan, for, while yoki do… while), rekursiya esa tanlash iborasidan foydalanadi
(masalan, agar, agar, agar ... boshqacha yoki almashtirish). Iteratsiya ham, rekursiya ham takrorlashni o'z ichiga oladi: Iteratsiya
takrorlash iborasini aniq ishlatadi, rekursiya esa takrorlashni amalga oshiradi
takroriy usul chaqiruvlari. Iteratsiya va rekursiyaning har biri tugatish testini o'z ichiga oladi:
sikl davom etish sharti bajarilmasa minates, rekursiya esa a bilan tugaydi
asosiy holatga erishildi. Qarama-qarshi boshqariladigan takrorlash va rekursiya bilan takrorlash.
Odatda tugatishga yaqinlashish: Takrorlash hisoblagich qabul qilmaguncha hisoblagichni o'zgartirishni davom ettiradi
tsiklni davom ettirish sharti muvaffaqiyatsizlikka uchragan qiymat, rekursiya esa pro-
asosiy holatga erishilgunga qadar asl muammoning kichikroq versiyalarini yaratish. Ikkala itera-
tion va rekursiya cheksiz sodir bo'lishi mumkin: Cheksiz sikl iteratsiya bilan sodir bo'ladi, agar tsikl -
davomiy test hech qachon yolg'on bo'lmaydi, rekursiya bo'lsa cheksiz rekursiya sodir bo'ladi
qadam muammoni har safar asosiy holatga yaqinlashadigan tarzda kamaytirmaydi,
yoki asosiy korpus sinovdan o'tkazilmagan bo'lsa.
Iteratsiya va rekursiya o'rtasidagi farqni ko'rsatish uchun iterativni ko'rib chiqamiz
faktoriy masala yechimi (18.9-rasm). Takrorlash iborasi ishlatiladi (12–13-qatorlar)
rekursiv yechimning tanlov bayonoti emas (18.3-rasmning 9-12-qatorlari). Ikkalasi ham

788 18-bob Rekursiya

yechimlar tugatish testidan foydalanadi. Rekursiv yechimda (18.3-rasm) 9-qator baza uchun sinovdan o'tadi
hol. Takroriy yechimda 18.9-rasmning 12-qatorida tsikl davom etish sharti tekshiriladi—agar
sinov muvaffaqiyatsiz tugadi, tsikl tugaydi. Nihoyat, asl nusxaning kichikroq versiyalarini ishlab chiqarish o'rniga
Muammoni hal qilishda iterativ yechim halqa davom etguncha o'zgartiriladigan hisoblagichdan foydalanadi.
sharti noto'g'ri bo'ladi.

Rekursiya ko'plab salbiy tomonlarga ega. Bu mexanizmni qayta-qayta chaqiradi va natijada


qo'shimcha xarajatlar, usul chaqiruvlari. Ushbu takrorlash ikkala protsessor uchun ham qimmat bo'lishi mumkin
vaqt va xotira maydoni. Har bir rekursiv chaqiruv usulning boshqa nusxasini keltirib chiqaradi (aslida,
faqat stek ramkasida saqlangan usul o'zgaruvchilari) yaratilishi kerak - bu nusxalar to'plami
katta xotira maydonini iste'mol qiladi. Iteratsiya usuli ichida sodir bo'lgani uchun, takrorlanadi
usul chaqiruvlari va qo'shimcha xotira tayinlashdan qoching.

1 // 18.9-rasm: FactorialCalculator.java


2 // Takrorlanuvchi faktoriy usul.
3
4 umumiy sinf Faktorial Kalkulyator
5 {
6 // faktorial usulning rekursiv deklaratsiyasi
7 umumiy uzun faktorial (uzun raqam)
8 {
9 uzun natija = 1;
10
11 // faktorial usulning iterativ deklaratsiyasi
12
13
14
15 qaytish natijasi;
16 }
17
18 // 0-10 qiymatlar uchun faktoriallarni chiqarish
19 ta umumiy statik bekor asosiy(String[] args)
20 {
21 // 0 dan 10 gacha faktoriallarni hisoblang
22 uchun (int counter = 0; counter <= 10; counter++)
23 System.out.printf("%d! = %d%n", hisoblagich, faktoriy(hisoblagich));
24 }
25 } // oxirgi sinf Faktorial Kalkulyator
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
18.9-rasm | Takroriy faktorial usul.

uchun (uzun i = raqam; i >= 1; i--)


natija *= i;

18.8 Xanoy minoralari 789

18.8 Xanoy minoralari
Ushbu bobning boshida biz ikkala rekursiv tarzda osonlik bilan amalga oshirilishi mumkin bo'lgan usullarni o'rganib chiqdik
va iterativ tarzda. Endi biz rekursiv yechimi el-
rekursiya egaligi va uning iterativ yechimi unchalik aniq bo'lmasligi mumkin.
Xanoy minoralari har bir yangi kompyuter olimining klassik muammolaridan biridir
bilan kurashish kerak. Afsonaga ko'ra, Uzoq Sharqdagi ma'badda ruhoniylar bunga harakat qilishadi
oltin disklar to'plamini bir olmos qoziqdan boshqasiga o'tkazing (18.10-rasm). Boshlang'ich
stekda bitta qoziqqa o'rnatilgan 64 ta disk mavjud va ularni kamaytirish orqali pastdan yuqoriga joylashtirilgan.
hajmi. Ruhoniylar qoziq ostidagi qoziqni bir qoziqdan boshqasiga o'tkazishga harakat qilmoqdalar.
bir vaqtning o'zida aynan bitta diskni ko'chirish va hech qanday vaqtda kattaroq diskni joylashtirish mumkin emas
kichikroq disk ustida. Uchta qoziq taqdim etiladi, ulardan biri vaqtincha ushlab turish uchun ishlatiladi
disklar. Taxminlarga ko'ra, ruhoniylar o'z vazifalarini bajarganlarida dunyo tugaydi, shuning uchun kam narsa bor
ularning sa'y-harakatlarini engillashtirish uchun bizni rag'batlantiradi.
Faraz qilaylik, ruhoniylar disklarni 1-qoziqdan 3-qoziqqa oʻtkazishga harakat qilishyapti.
diskdan qoziqqa uzatishning aniq ketma-ketligini chop etuvchi algoritmni ishlab chiqmoqchi.

Dasturiy ta'minot muhandisligi kuzatuvi 18.1


Rekursiv echilishi mumkin bo'lgan har qanday muammoni iterativ tarzda ham hal qilish mumkin. Rekursiv
Rekursiv yondashuv ko'proq bo'lsa, iterativ yondashuvdan ko'ra yondashuv odatda afzaldir
muammoni tabiiy ravishda aks ettiradi va tushunish osonroq bo'lgan dasturga olib keladi va
disk raskadrovka. Rekursiv yondashuv ko'pincha kamroq kod satrlari bilan amalga oshirilishi mumkin. Boshqa
Rekursiv yondashuvni tanlashning sababi shundaki, iterativ yondashuv aniq bo'lmasligi mumkin.

Ishlash bo'yicha maslahat 18.2


Yuqori samaradorlikni talab qiladigan holatlarda rekursiyadan foydalanishdan saqlaning. Rekursiv qo'ng'iroqlar vaqt talab etadi
va qo'shimcha xotirani iste'mol qiladi.

Umumiy dasturlash xatosi 18.2


Tasodifan norekursiv usulga ega bo'lish o'zini bevosita yoki bilvosita orqali chaqiradi
boshqa usul cheksiz rekursiyaga olib kelishi mumkin.

18.10-rasm | To'rt diskli korpus uchun Xanoy minoralari.

qoziq 1 qoziq 2 qoziq 3

790 18-bob Rekursiya

Agar biz iterativ yechim topishga harakat qilsak, ehtimol o'zimizni umidsiz "tugun" deb topamiz
yuqoriga” disklarni boshqarishda. Buning o'rniga, bu muammoga rekursiv ravishda hujum qilish tezda a beradi
yechim. Harakatlanuvchi n ta diskni faqat n – 1 diskning harakatlanishi nuqtai nazaridan ko'rish mumkin (shuning uchun
rekursiya) quyidagicha:
1. Vaqtinchalik ushlab turish joyi sifatida 3-qoziqdan foydalanib, n – 1 diskni 1-qoziqdan 2-qoziqqa oʻtkazing.
2. Oxirgi diskni (eng katta) 1-qoziqdan 3-qoziqqa o'tkazing.
3. 1-qoziqni vaqtincha ushlab turish joyi sifatida ishlatib, n – 1 diskni 2-qoziqdan 3-qoziqqa oʻtkazing.
Jarayon oxirgi vazifa n = 1 diskni (ya'ni, asosiy korpus) ko'chirishni o'z ichiga olganida tugaydi.
Ushbu vazifa diskni vaqtincha ushlab turish joyidan foydalanmasdan harakatlantirish orqali amalga oshiriladi.
18.11-rasmda “sol Towers” usuli (6–25-qatorlar) berilgan Xanoy minoralarini hal qiladi.
disklarning umumiy soni (bu holda 3), boshlang'ich qoziq, yakunlovchi qoziq va temp
parametrlar sifatida kamdan-kam ushlab turuvchi qoziq. Asosiy holat (10-14-qatorlar) faqat bitta diskda sodir bo'ladi
boshlang'ich qoziqdan oxirgi qoziqqa ko'chirish kerak. Rekursiya bosqichida (18-qatorlar)
24), 18-qator disklarni siljitadi - 1 disk birinchi qoziqdan (sourcePeg) vaqtinchalik
ushlab turgan qoziq (tempPeg). Disklarning biridan boshqasi vaqtinchalik diskka ko'chirilganda
qoziq, 21-qator eng katta diskni boshlang'ich qoziqdan maqsad qoziqqa o'tkazadi. 24-qator fin-
disklarni rekursiv ko'chirish uchun solTowers usulini chaqirish orqali qolgan harakatlarni amalga oshiradi -
Vaqtinchalik qoziqdan (tempPeg) maqsad qoziqqa (destinationPeg) 1 disk, bu
birinchi qoziqdan (sourcePeg) vaqtinchalik qoziq sifatida foydalanish vaqti. Asosiy 35-qator takroriy qo'ng'iroqlarni amalga oshiradi.
sive solTowers usuli, bu buyruq satriga qadamlarni chiqaradi.

1 // 18.11-rasm: TowersOfXanoi.java


2 // Xanoy yechimining minoralari rekursiv usul bilan.
3 jamoat sinfi TowersOfXanoi
4 {
5 // disklarni minoralar o'rtasida rekursiv harakatlantirish
6
7
8 {
9 // asosiy holat -- ko'chirish uchun faqat bitta disk
10 agar (disklar == 1)
11 {
12 System.out.printf("%n%d --> %d", sourcePeg, destinationPeg);
13 qaytish;
14 }
15
16 // rekursiya bosqichi -- disklarni sourcePeg-dan ko'chirish (disk - 1).
17 // destinationPeg yordamida tempPegga
18
19
20 // oxirgi diskni sourcePeg dan destinationPegga ko'chiring
21 System.out.printf("%n%d --> %d", sourcePeg, destinationPeg);
22
23 // (disklar - 1) disklarni tempPeg dan destinationPegga ko'chiring
24
25 }
26

18.11-rasm | Rekursiv usul bilan Xanoy yechimi minoralari. (2-qismning 1-qismi.)

umumiy statik bekor hal qilish minoralari (int disklar, int sourcePeg,
int destinationPeg, int tempPeg)

hal Towers(disklar - 1, sourcePeg, tempPeg, destinationPeg);

hal Towers(disklar - 1, tempPeg, destinationPeg, sourcePeg);

18.9 Fraktallar 791

18.9 Fraktallar
Fraktal - bu rekursiv ravishda takrorlanadigan naqshdan yaratilishi mumkin bo'lgan geometrik figura
(18.12-rasm). Shakl har bir segmentga naqshni rekursiv qo'llash orqali o'zgartiriladi
asl raqam. Garchi bunday raqamlar 20-asrdan oldin o'rganilgan bo'lsa-da, shunday edi
1970-yillarda "fraktal" atamasini kiritgan matematik Benua Mandelbrot
fraktalning qanday yaratilganligi va fraktallarning amaliy qo'llanilishining o'ziga xos xususiyatlari bilan birga.
Mandelbrotning fraktal geometriyasi ko'plab murakkab shakllar uchun matematik modellarni taqdim etadi
tabiatda, masalan, tog'larda, bulutlarda va qirg'oqlarda uchraydi. Fraktallar juda ko'p qo'llaniladi
matematika va fan. Ular tizimlar yoki naqshlarni yaxshiroq tushunish uchun ishlatilishi mumkin
tabiatda (masalan, ekotizimlarda), inson tanasida (masalan, miya burmalarida) paydo bo'ladi yoki
koinotda (masalan, galaktika klasterlari). Hamma fraktallar tabiatdagi ob'ektlarga o'xshamaydi. Chizma
fraktallar mashhur san'at turiga aylandi. Fraktallar o'ziga o'xshash xususiyatga ega - sub-
qismlarga bo'lingan, har biri butunning kichraytirilgan nusxasiga o'xshaydi. Ko'pgina fraktallar a hosil qiladi
Fraktalning bir qismi kattalashtirilganda asl nusxaning aniq nusxasi - bunday fraktal deyiladi
qat'iy o'ziga o'xshash bo'lish.
18.9.1 Koch egri fraktal
Misol tariqasida, qat'iy o'ziga o'xshash Koch Curve fraktalini ko'rib chiqaylik (18.12-rasm). Bu
chizmadagi har bir chiziqning oʻrta uchdan bir qismini olib tashlash va uning oʻrniga ikkitasini qoʻyish orqali hosil boʻladi
nuqtani tashkil etuvchi chiziqlar, agar asl chiziqning o'rta uchdan bir qismi qolsa, teng
lateral uchburchak hosil bo'ladi. Fraktallarni yaratish uchun formulalar ko'pincha barchasini olib tashlashni o'z ichiga oladi
yoki oldingi fraktal tasvirning bir qismi. Buning uchun bu naqsh allaqachon aniqlangan
fraktal - bu erda biz ushbu formulalarni rekursiv yechimda qanday ishlatishga e'tibor qaratamiz.

27 ta umumiy statik bekor asosiy(String[] args)


28 {
29 int startPeg = 1; // 1-qiymat chiqishda startPegni ko'rsatish uchun ishlatiladi
30 int endPeg = 3; // 3-qiymat chiqishda endPegni ko'rsatish uchun ishlatiladi
31 int tempPeg = 2; // 2-qiymat chiqishda tempPegni ko'rsatish uchun ishlatiladi
32 int totalDisk = 3; // disklar soni
33
34 // dastlabki rekursiv qo'ng'iroq: barcha disklarni ko'chirish.
35 ta hal minoralari (totalDisks, startPeg, endPeg, tempPeg);
36 }
37 } // oxirgi sinf TowersOfXanoi
1 -> 3
1 -> 2
3 -> 2
1 -> 3
2 -> 1
2 -> 3
1 -> 3
18.11-rasm | Rekursiv usul bilan Xanoy yechimi minoralari. (2-qismning 2-qismi.)

792 18-bob Rekursiya

Biz tekis chiziqdan boshlaymiz (18.12 (a)-rasm) va naqshni qo'llaymiz, uchburchak hosil qilamiz.
o'rta uchdan (18.12 (b)-rasm). Keyin har bir tekisda naqshni yana qo'llaymiz
chiziq, natijada 18.12 (c) rasm. Har safar naqsh qo'llanilganda, biz fraktal ekanligini aytamiz
yangi bosqichda yoki chuqurlikda (ba'zida tartib atamasi ham ishlatiladi). Fraktallarni ko'rsatish mumkin
ko'p darajalarda - masalan, 3-darajali fraktal naqshning uchta takrorlanishiga ega
qo'llaniladi (18.12 (d)-rasm). Bir necha iteratsiyadan so'ng, bu fraktal qismga o'xshay boshlaydi
qor parchasi (18.12-rasm (e va f)). Bu qat'iy o'ziga o'xshash fraktal bo'lgani uchun, har bir qism
uning fraktalning aniq nusxasini o'z ichiga oladi. Masalan, 18.12(f)-rasmda biz ta'kidladik
kesilgan quti bilan fraktalning bir qismi. Agar ushbu qutidagi rasm kattalashtirilgan bo'lsa,
u (f) qismning butun fraktaliga o'xshaydi.
Shunga o'xshash fraktal, Koch qor parchasi, Koch egri chizig'iga o'xshaydi, lekin u bilan boshlanadi.
chiziq emas, balki uchburchak. Xuddi shu naqsh uchburchakning har bir tomoniga qo'llaniladi, natijada
yopiq qor parchasiga o'xshash tasvirda. Oddiylik uchun biz diqqatni jamlashni tanladik
Koch egri chizig'ida.
18.9.2 (ixtiyoriy) Case Study: Lo Feather Fractal
Endi biz fraktallarni yaratish uchun dastur yozish orqali rekursiyadan foydalanishni ko'rsatamiz
qat'iy o'ziga o'xshash fraktal. Biz buni Sin Xan Lo sharafiga nomlangan "Lo pat fraktal" deb ataymiz.
uni yaratgan itel & Associates hamkasbi. Fraktal oxir-oqibat a ning yarmiga o'xshaydi
tuklar (18.19-rasmdagi chiqishlarga qarang). Asosiy holat yoki 0 ning fraktal darajasi chiziq sifatida boshlanadi
ikki nuqta, A va B o'rtasida (18.13-rasm). Keyingi yuqori darajani yaratish uchun biz o'rtasini topamiz
chiziqning (C) nuqtasi. C nuqtasining joylashishini hisoblash uchun quyidagi formuladan foydalaning:

18.12-rasm | Koch egri fraktal.

xC = (xA + xB) / 2;
yC = (yA + yB) / 2;

(a) 0-daraja (b) 1-daraja

(c) 2-daraja (d) 3-daraja

(e) 4-daraja (f) 5-daraja


18.9 Fraktallar 793

[Izoh: Har bir harfning chap tomonidagi x va y harflari x-koordinata va y-koordinatalarini bildiradi.
mos ravishda bu nuqta. Masalan, xA A nuqtaning x-koordinatasini bildiradi, yC esa qayta-
C nuqtaning y-koordinatasini belgilaymiz. Diagrammalarimizda nuqtani uning harfi bilan belgilaymiz.
x va y koordinatalarini ifodalovchi ikkita raqam bilan tushiriladi.]

Ushbu fraktalni yaratish uchun biz AC segmentining chap tomonida joylashgan D nuqtasini ham topishimiz kerak.


ADC teng yonli to'g'ri burchakli uchburchakni egallaydi. D nuqtasining joylashishini hisoblash uchun quyidagilardan foydalaning:
mulas:

Endi biz 0-darajadan 1-darajaga quyidagi tarzda o'tamiz: Birinchidan, C va D nuqtalarini qo'shing (masalan


18.14-rasm). Keyin asl qatorni olib tashlang va DA, DC va DB segmentlarini qo'shing. The
qolgan chiziqlar burchak ostida egilib, fraktalimiz patga o'xshaydi. Uchun
fraktalning keyingi darajasida ushbu algoritm 1-darajali uchta satrning har birida takrorlanadi.
Har bir satrda yuqoridagi formulalar qo'llaniladi, bu erda avvalgi D nuqtasi endi ko'rib chiqiladi
A nuqta bo'lsin, har bir chiziqning ikkinchi uchi esa B nuqtasi hisoblanadi. 18.15-rasm.
0-darajadan (hozir kesilgan chiziq) chiziqni va 1-darajadan uchta qo'shilgan chiziqni ajratadi.
Biz D nuqtasini A nuqtasiga, A, C va B nuqtalarini esa B1, B2 va B3 ga almashtirdik.
mos ravishda. Oldingi formulalar yangi C va D nuqtalarini topish uchun ishlatilgan
har bir qator. Qaysi nuqta bog'langanligini kuzatish uchun ushbu nuqtalar 1-3 gacha raqamlangan
har bir qator bilan. Masalan, C1 va D1 nuqtalari C va D nuqtalarini ifodalaydi
A nuqtadan B1 gacha hosil qilingan chiziq bilan. 2-darajaga erishish uchun 18.15-rasmdagi uchta chiziq
olib tashlanadi va yangi qo'shilgan C va D nuqtalaridan yangi chiziqlar bilan almashtiriladi. 18.16-rasm
yangi satrlarni ko'rsatadi (2-darajadagi chiziqlar sizning konferentsiyangiz uchun kesilgan chiziqlar sifatida ko'rsatilgan.
yaxshilik). 18.17-rasmda 2-daraja 1-darajadan kesilgan chiziqlarsiz ko'rsatilgan.
cess bir necha marta takrorlangan bo'lsa, yaratilgan fraktal yarmining yarmiga o'xshay boshlaydi
18.19-rasmning chiqishida ko'rsatilganidek, pat. Biz ushbu ilova uchun kodni taqdim etamiz
qisqa vaqt ichida.

18.13-rasm | 0-darajada "Lo tuklar fraktal".

xD = xA + (xC - xA) / 2 - (yC - yA) / 2;
yD = yA + (yC - yA) / 2 + (xC - xA) / 2;

Kelib chiqishi (0, 0)

A (6, 5) B (30, 5)

794 18-bob Rekursiya

18.14-rasm | “Lo tukli fraktal”ning 1-darajasi uchun C va D nuqtalarini aniqlash.

18.15-rasm | 2-daraja uchun C va D nuqtalari aniqlangan 1-darajada “Lo pat fraktal”. [Eslatma:


0-darajali fraktal chiziq qayerda joylashganligi haqida eslatma sifatida kesilgan chiziq sifatida kiritilgan
joriy fraktalga munosabat.]

18.16-rasm | 2-darajada “Lo pat fraktal” 1-darajadan boshlab kesilgan chiziqlar bilan.

Kelib chiqishi (0, 0)

A (6, 5)


D (12, 11)

C (18, 5) B (30, 5)

D3 (18, 14)

D2 (15, 11)

C2 (15, 8)

Kelib chiqishi (0, 0)

C1 (9, 8) C3 (21, 8)

A (12, 11)

D1 (12, 8)

B1 (6, 5) B2 (18, 5) B3 (30, 5)

Kelib chiqishi (0, 0)

18.9 Fraktallar 795

18.18-rasmdagi dastur ushbu fraktalni chizish uchun foydalanuvchi interfeysini belgilaydi (ko'rsatilgan
18.19-rasm oxirida). Interfeys uchta tugmadan iborat bo'lib, ulardan biri foydalanuvchi o'zgartirishi mumkin
fraktalning rangi, biri rekursiya darajasini oshirish uchun, ikkinchisi esa darajasini pasaytirish uchun
rekursiya. JLabel qo'ng'iroq qilish orqali o'zgartiriladigan joriy rekursiya darajasini kuzatib boradi
setLevel usuli, yaqinda muhokama qilinadi. 15–16 qatorlar WIDTH va HEIGHT konstantalarini belgilaydi
JFrame o'lchami uchun mos ravishda 400 va 480 bo'lishi kerak. Foydalanuvchi ActionEventni ishga tushiradi
Rang tugmasini bosish orqali. Ushbu tugma uchun hodisa ishlov beruvchisi 37–54-qatorlarda qayd etilgan.
ActionPerformed usuli JColorChooser ni ko'rsatadi. Ushbu dialog oynasi tanlanganni qaytaradi
Rangli ob'ekt yoki ko'k (agar foydalanuvchi Bekor qilish tugmasini bossa yoki OK tugmasini bosmasdan dialog oynasini yopsa). Chiziq
51 rangni yangilash uchun FractalJPanel sinfidagi setColor usulini chaqiradi.

18.17-rasm | 2-darajada "Lo tuklar fraktal".

1 // 18.18-rasm: Fractal.java
2 // Fraktal foydalanuvchi interfeysi.
3 import java.awt.Color;
4 import java.awt.FlowLayout;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import javax.swing.JFrame;
8 import javax.swing.JButton;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JColorChooser;
12
13 ommaviy sinf Fraktal JFrame-ni kengaytiradi
14 {
15 xususiy statik yakuniy int WIDTH = 400; // GUI kengligini aniqlang
16 xususiy statik yakuniy int HEIGHT = 480; // GUI balandligini aniqlang
17 xususiy statik yakuniy int MIN_LEVEL = 0;
18 xususiy statik yakuniy int MAX_LEVEL = 15;
19
20 // GUI-ni o'rnating
21 umumiy fraktal()
22 {

18.18-rasm | Fraktal foydalanuvchi interfeysi. (3-qismning 1-qismi.)

Kelib chiqishi (0, 0)

796 18-bob Rekursiya

23 super("Fraktal");
24
25 // controlJPanel-ga qo'shish uchun levelJLabel-ni o'rnating
26 yakuniy JLabel darajasiJLabel = yangi JLabel("Daraja: 0");
27
28 yakuniy FractalJPanel drawSpace = yangi FractalJPanel(0);
29
30 // boshqaruv panelini sozlash
31 yakuniy JPanel controlJPanel = new JPanel();
32 controlJPanel.setLayout(yangi FlowLayout());
33
34 // rangli tugmani o'rnating va tinglovchini ro'yxatdan o'tkazing
35 yakuniy JButton changeColorJButton = yangi JButton("Rang");
36 controlJPanel.add(changeColorJButton);
37 changeColorJButton.addActionListener(
38 ta yangi ActionListener() // anonim ichki sinf
39 {
40 // jarayonni o'zgartirishColorJButton hodisasi
41 @Bekor qilish
42 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
43 {
44 Rang rangi = JColorChooser.showDialog(
45 Fractal.this, "Rangni tanlang", Rang.BLUE);
46
47 // hech qanday rang qaytarilmasa, standart rangni o'rnating
48 agar (rang == null)
49 rang = Rang.MOV;
50
51 drawSpace.setColor(rang);
52 }
53 } // anonim ichki sinfni tugatish
54); // addActionListener-ni tugatish
55
56 // Boshqarish paneliga qo'shish uchun pasaytirish tugmachasini o'rnating va
57 // tinglovchini ro'yxatdan o'tkazing
58 yakuniy JButton kamaytirishLevelJButton = yangi JButton("Darajani pasaytirish");
59 controlJPanel.add(decreaseLevelJButton);
60 kamaytirishLevelJButton.addActionListener(
61 yangi ActionListener() // anonim ichki sinf
62 {
63 // jarayonni kamaytirishLevelJButton hodisasi
64 @Bekor qilish
65 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
66 {
67
68
69
70 // iloji bo'lsa darajani o'zgartiring
71 agar ((daraja >= MIN_LEVEL)) &&
72 (daraja <= MAX_LEVEL))
73 {
74

18.18-rasm | Fraktal foydalanuvchi interfeysi. (3 qismning 2-qismi.)

int darajasi = drawSpace.getLevel();
--Daraja;

levelJLabel.setText("Daraja: " + daraja);


18.9 Fraktallar 797

75
76
77 }
78 }
79 } // anonim ichki sinfni tugatish
80); // addActionListener-ni tugatish
81
82 // Boshqarish paneliga qo'shish uchun darajani oshirish tugmasini o'rnating
83 // va tinglovchini ro'yxatdan o'tkazing
84 yakuniy JButton oshirishLevelJButton = yangi JButton("Darajani oshirish");
85 controlJPanel.add(increaseLevelJButton);
86 oshirishLevelJButton.addActionListener(
87 yangi ActionListener() // anonim ichki sinf
88 {
89 // jarayonni oshirishLevelJButton hodisasi
90 @Bekor qilish
91 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
92 {
93
94
95
96 // iloji bo'lsa darajani o'zgartiring
97 agar ((daraja >= MIN_LEVEL)) &&
98 (daraja <= MAX_LEVEL))
99 {
100
101
102
103 }
104 }
105 } // anonim ichki sinfni tugatish
106); // addActionListener-ni tugatish
107
108 controlJPanel.add(levelJLabel);
109
110 // controlJPanel va drawSpace-ni o'z ichiga olish uchun mainJPanel-ni yarating
111 yakuniy JPanel mainJPanel = yangi JPanel();
112 mainJPanel.add(controlJPanel);
113 mainJPanel.add(drawSpace);
114
115 qo'shish (mainJPanel); // JPanel-ni JFrame-ga qo'shing
116
117 to'plamO'lchami(KENGLIK, BO'LIK); // JFrame hajmini belgilang
118 setVisible(to'g'ri); // JFrame-ni ko'rsatish
119 } // end Fraktal konstruktor
120
121 umumiy statik bekor asosiy(String[] args)
122 {
123 Fraktal demo = yangi Fraktal();
124 demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
125 }
126 } // oxirgi sinf Fraktal

18.18-rasm | Fraktal foydalanuvchi interfeysi. (3 qismning 3-qismi.)

drawSpace.setLevel(daraja);
qayta bo'yash ();

int darajasi = drawSpace.getLevel();


++daraja;

levelJLabel.setText("Daraja: " + daraja);


drawSpace.setLevel(daraja);
qayta bo'yash ();

798 18-bob Rekursiya

Darajani pasaytirish tugmasi hodisa ishlovchisi 60–80 qatorlarda qayd etilgan. Usul
actionPerformed rekursiyaning joriy darajasini oladi va uni 1 ga kamaytiradi (67-qatorlar).
68). 71–72-qatorlar daraja MIN_LEVEL dan katta yoki unga teng va undan kichik ekanligini taʼminlaydi
yoki MAX_LEVEL ga teng — fraktal MIN_LEVEL dan kichik rekursiya darajalari uchun aniqlanmagan
va MAX_LEVELdan yuqoriroq qoʻshimcha maʼlumotlarni koʻra olmaysiz. Siz xohlagan istalgan joyga o'tishingiz mumkin
darajada, lekin taxminan 10 va undan yuqori darajalarda fraktal ko'rsatish tafsilotlar tufayli sekinlashadi
chiziladi. 74-76 qatorlar o'zgarishlarni aks ettirish uchun daraja yorlig'ini tiklaydi - yangi daraja o'rnatiladi
va repaint usuli fraktalni yangi darajada ko'rsatish uchun tasvirni yangilash uchun chaqiriladi.
Darajani oshirish JButton Darajani pasaytirish JButton kabi ishlaydi, lekin daraja
fraktalning batafsil ma'lumotlarini ko'rsatish uchun kamaytirish o'rniga oshirilgan (93-94 qatorlar).
Ilova birinchi marta bajarilganda, daraja 0 ga o'rnatiladi, bu ko'k rangni ko'rsatadi
FractalJPanel sinfida ko'rsatilgan ikkita nuqta orasidagi chiziq.
FractalJPanel klassi (18.19-rasm) JPanel chizmasining o'lchamlarini 400 deb belgilaydi
tomonidan 400 (13-14-qatorlar). FractalJPanel konstruktori (18–24-qatorlar) joriy darajani oladi
parametr sifatida va uni misol o'zgaruvchan darajasiga tayinlaydi. Namuna o'zgaruvchan rangi o'rnatildi
sukut bo'yicha ko'k rangga. 22-23 qatorlar JPanel fon rangini oq rangga o'zgartiradi (shuning uchun
fraktalni ko'rish oson) va chizilgan FractalJPanel o'lchamlarini o'rnating.

1 // 18.19-rasm: FractalJPanel.java


2 // Rekursiya yordamida "Lo pat fraktalini" chizish.
3 import java.awt.Graphics;
4 import java.awt.Color;
5 import java.awt.Dimension;
6 import javax.swing.JPanel;
7
8 ommaviy sinf FractalJPanel JPanel-ni kengaytiradi
9 {
10 shaxsiy rang rangi; // fraktalni chizish uchun ishlatiladigan rangni saqlaydi
11 xususiy int darajasi; // fraktalning joriy darajasini saqlaydi
12
13 xususiy statik yakuniy int WIDTH = 400; // JPanel kengligini aniqlaydi
14 xususiy statik yakuniy int HEIGHT = 400; // JPanel balandligini belgilaydi
15
16 // boshlang'ich fraktal darajasini belgilangan qiymatga o'rnating
17 // va JPanel spetsifikatsiyalarini o'rnating
18 ommaviy FractalJPanel(int currentLevel)
19 {
20 rang = Rang.KOV; // chizma rangini ko'k rangga ishga tushiring
21 daraja = joriy daraja; // boshlang'ich fraktal darajasini belgilang
22 to'plamFafon(Rang.OQ);
23 setPreferredSize(yangi oʻlcham(KENG, BOYLIK));
24 }
25
26
27
28
29

18.19-rasm | Rekursiya yordamida “Lo tuklar fraktalini” chizish. (4-qismning 1-qismi.)

// fraktalni rekursiv chizish
public void drawFractal(int darajasi, int xA, int yA, int xB,
int yB, Grafik g)
{

18.9 Fraktallar 799

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 // fraktal chizishni boshlang
53 @Bekor qilish
54 umumiy bekor bo'yoq Komponenti (Grafika g)
55 {
56 super.paintComponent(g);
57
58 // fraktal naqsh chizish
59 g.setColor(rang);
60
61 }
62
63 // chizma rangini c ga o'rnating
64 umumiy boʻshliq toʻplamiRang(Rang c)
65 {
66 rang = c;
67 }
68
69 // rekursiyaning yangi darajasini belgilang
70 umumiy bekor setLevel(int currentLevel)
71 {
72 daraja = joriy daraja;
73 }
74
75 // rekursiya darajasini qaytaradi
76 public int getLevel()
77 {
78 qaytish darajasi;
79 }
80 } // oxirgi sinf FractalJPanel

18.19-rasm | Rekursiya yordamida “Lo tuklar fraktalini” chizish. (4 qismning 2-qismi.)

// asosiy holat: berilgan ikkita nuqtani tutashtiruvchi chiziq chizish
agar (daraja == 0)
g.drawLine(xA, yA, xB, yB);
else // rekursiya bosqichi: yangi nuqtalarni aniqlash, keyingi darajani chizish
{
// (xA, yA) va (xB, yB) orasidagi o'rta nuqtani hisoblash
int xC = (xA + xB) / 2;
int yC = (yA + yB) / 2;
// ni tashkil etuvchi to'rtinchi nuqtani (xD, yD) hisoblang
// (xA, yA) va (xC, yC) orasidagi teng yonli to'g'ri burchakli uchburchak
// to'g'ri burchak qayerda (xD, yD)
int xD = xA + (xC - xA) / 2 - (yC - yA) / 2;
int yD = yA + (yC - yA) / 2 + (xC - xA) / 2;
// Fraktalni rekursiv chizish
drawFractal(daraja - 1, xD, yD, xA, yA, g);
drawFractal(daraja - 1, xD, yD, xC, yC, g);
drawFractal(daraja - 1, xD, yD, xB, yB, g);
}
}

drawFractal(daraja, 100, 90, 290, 200, g);


800 18-bob Rekursiya

18.19-rasm | Rekursiya yordamida “Lo tuklar fraktalini” chizish. (4 qismning 3-qismi.)

18.10 Rekursiv orqaga qaytish 801

27-50 qatorlar fraktalni yaratuvchi rekursiv usulni belgilaydi. Bu usul oladi
oltita parametr: daraja, ikkita nuqtaning x va y koordinatalarini belgilaydigan to'rtta butun son,
va Grafik obyekti g. Ushbu usul uchun asosiy holat (31-qator) daraja bo'lganda sodir bo'ladi
0 ga teng, bu vaqtda parametr sifatida berilgan ikkita nuqta orasiga chiziq chiziladi.
36–43 qatorlar (xC, yC), (xA, yA) va (xB, yB) va (xD, yD) orasidagi o'rta nuqtani hisoblaydi,
(xA, yA) va (xC, yC) bilan to'g'ri teng yonli uchburchak hosil qiluvchi nuqta. 46-48 qatorlar
uch xil nuqtalar to'plamida uchta rekursiv qo'ng'iroqlar.
PaintComponent usulida 60-satr drawFractal to usuliga birinchi chaqiruvni amalga oshiradi
chizishni boshlang. Ushbu usul chaqiruvi rekursiv emas, lekin chizish uchun keyingi barcha qo'ng'iroqlar -
Chizma tanasidan bajariladigan fraktallar Fraktal hisoblanadi. Chunki chiziqlar chizilmaydi
asosiy holatga erishilgunga qadar, har bir rekursivda ikki nuqta orasidagi masofa kamayadi
qo'ng'iroq qiling. Rekursiya darajasi oshgani sayin fraktal silliqroq va batafsilroq bo'ladi.
Bu fraktalning shakli daraja 11 ga yaqinlashganda barqarorlashadi. Fraktallar diff-
ularning shakli va hajmiga qarab turli darajalar.
18.19-rasmda fraktalning 0 dan 6 darajagacha rivojlanishi ko'rsatilgan.
oxirgi rasm 11-darajali fraktalning aniqlovchi shaklini ko'rsatadi. Agar biz qo'llardan biriga e'tibor qaratsak
bu fraktalning butun tasviri bilan bir xil bo'ladi. Bu xususiyat fraktalni aniqlaydi
qat'iy o'ziga o'xshash bo'ling.
18.10 Rekursiv orqaga qaytish
Bizning rekursiv usullarimizning barchasi o'xshash arxitekturaga ega - agar asosiy holatga erishilsa, a ni qaytaring
natija; bo'lmasa, bir yoki bir nechta rekursiv qo'ng'iroqlarni amalga oshiring. Ushbu bo'lim yanada murakkab qayta ishlashni o'rganadi.
labirintdan o'tish yo'lini topadigan kursiv usul, agar iloji bo'lsa, haqiqatga qaytadi.
lyusiya. Yechim labirint bo'ylab bir vaqtning o'zida harakatlanadigan joyda harakat qilishni o'z ichiga oladi
pastga, o'ngga, yuqoriga yoki chapga tushish orqali amalga oshirilishi mumkin (diagonal harakatlarga ruxsat berilmaydi). Kimdan
labirintdagi joriy joylashuv (kirish nuqtasidan boshlab), quyidagi qadamlar qo'yiladi:
uz: Har bir mumkin bo'lgan yo'nalish uchun harakat shu yo'nalishda amalga oshiriladi va rekursiv chaqiruv
labirintning qolgan qismini yangi joydan hal qilish uchun qilingan. O'lik nuqta bo'lganda

18.19-rasm | Rekursiya yordamida “Lo tuklar fraktalini” chizish. (4 qismning 4-qismi.)


802 18-bob Rekursiya



yetdi (ya'ni, devorga urmasdan oldinga qadam tashlay olmaymiz), orqaga qaytamiz
oldingi joyga o'ting va boshqa yo'nalishda borishga harakat qiling. Agar boshqa yo'nalish bo'lmasa
olingan, biz yana zaxira qilamiz. Bu jarayon labirintda nuqta topgunimizcha davom etadi
harakat boshqa yo'nalishda amalga oshirilishi mumkin. Bunday joy topilgach, biz ichkariga o'tamiz
yangi yo'nalish va labirintning qolgan qismini hal qilish uchun boshqa rekursiv chaqiruv bilan davom eting.
Labirintdagi oldingi manzilga zaxiralash uchun bizning rekursiv usulimiz shunchaki qaytadi
noto'g'ri, usul qo'ng'iroqlari zanjirini oldingi rekursiv chaqiruvga o'tkazish (bu
labirintdagi oldingi joylashuvi). Avvalgi qaror nuqtasiga qaytish uchun rekursiyadan foydalanish
rekursiv orqaga qaytish sifatida tanilgan. Agar rekursiv qo'ng'iroqlarning bir to'plami yechimga olib kelmasa
muammoga, dastur oldingi qaror nuqtasiga zaxira qiladi va boshqacha qiladi
qaror, ko'pincha boshqa rekursiv qo'ng'iroqlar to'plamiga olib keladi. Ushbu misolda oldingi qaror
sion nuqtasi labirintning oldingi joylashuvi va qabul qilinadigan qaror yo'nalishdir
keyingi harakat qilish kerak. Bir yo'nalish boshi berk ko'chaga olib keldi, shuning uchun qidiruv davom etmoqda.
boshqa yo'nalishda davom etadi. Labirint muammosiga rekursiv orqaga qaytish yechimi
Usul chaqiruv zanjirining faqat bir qismiga qaytish uchun rekursiyadan foydalanadi, so'ngra boshqa yo'nalishni sinab ko'ring.
tion. Agar orqaga qaytish labirintning kirish joyiga va barcha yo'nalishdagi yo'llarga etib borsa.
urinishlar qilingan, labirintda yechim yo'q.
Mashqlar sizdan labirintga rekursiv orqaga qaytish yechimlarini amalga oshirishingizni so'raydi
muammosi (18.20-18.22-mashqlar) va Sakkiz qirolicha muammosi (18.15-mashq)
malika bo'lmasligi uchun sakkizta malikani bo'sh shaxmat taxtasiga joylashtirish yo'lini topishga harakat qiladi.
har qanday boshqasiga "hujum" qilish (ya'ni, ikkita malika bir qatorda, bitta ustunda yoki
bir xil diagonal bo'ylab).
18.11 Yakunlash
Ushbu bobda siz rekursiv usullarni, ya'ni chaqiruvchi usullarni yaratishni o'rgandingiz
o'zlari. Siz rekursiv usullar odatda muammoni ikki qismga ajratishini bilib oldingiz.
ceptual bo'laklar - bu usul qanday qilishni biladigan qism (asosiy holat) va bir parcha
usul qanday qilishni bilmaydi (rekursiya bosqichi). Rekursiya bosqichi bir oz
asl muammoning kichikroq versiyasi va rekursiv usul chaqiruvi bilan amalga oshiriladi. Siz
Ba'zi mashhur rekursiya misollarini, jumladan faktoriallarni hisoblash va qiymatlarni ishlab chiqarishni ko'rdi.
Fibonachchi seriyasida qo'llaniladi. Keyin siz rekursiya qanday ishlashini "kaput ostida" o'rgandingiz.
rekursiv usul chaqiruvlarini yoqish yoki o'chirish tartibini o'z ichiga oladi
dasturni bajaruvchi stek. Keyin rekursiv va iterativ yondashuvlarni solishtirdingiz. Siz
murakkabroq masalalarni yechishda rekursiyadan foydalanishni oʻrgandi — Xanoy minoralari va
fraktallarni ko'rsatish. Bob rekursiv orqaga qaytishga kirish bilan yakunlandi,
sinash uchun rekursiv qo'ng'iroqlar orqali zaxiralashni o'z ichiga olgan muammolarni hal qilish usuli
mumkin bo'lgan turli xil echimlar. Keyingi bobda siz saralashning ko'plab usullarini o'rganasiz.
ma'lumotlar ro'yxatini kiriting va ma'lumotlar ro'yxatidagi elementni qidiring va siz vaziyatni o'rganasiz.
har bir qidirish va saralash texnikasidan foydalanish kerak bo'lgan pozitsiyalar.

Xulosa
18.1-bo'lim Kirish


• Rekursiv usul (777-bet) o'zini boshqa usul orqali bevosita yoki bilvosita chaqiradi.

Xulosa 803



18.2-bo'lim Rekursiya tushunchalari
• Muammoni hal qilish uchun rekursiv usul chaqirilganda (778-bet) u faqat eng oddiyini hal qila oladi.
ish(lar) yoki asosiy holat(lar). Agar asosiy harf bilan chaqirilsa (778-bet), usul natijani qaytaradi.
• Agar rekursiv usul asosiy holatga qaraganda murakkabroq masala bilan chaqirilsa, u odatda bo'linadi
muammoni ikkita kontseptual qismga bo'ling - usul qanday qilishni biladigan qism va bo'lak
qanday qilishni bilmasligini.
• Rekursiyani amalga oshirish uchun usul qanday qilishni bilmaydigan qism o'xshash bo'lishi kerak
asl muammo, lekin uning biroz soddaroq yoki kichikroq versiyasi bo'lishi kerak. Chunki bu yangi muammo
asl muammoga o'xshaydi, usul kichikroq ustida ishlash uchun o'zining yangi nusxasini chaqiradi
muammo — bu rekursiya bosqichi deb ataladi (778-bet).
• Rekursiya oxir-oqibat tugatilishi uchun har safar usul o'zini oddiyroq versiyasi bilan chaqirganda
Asl muammo, kichikroq va kichikroq muammolar ketma-ketligi asosiy holatda yaqinlashishi kerak.
Qachonki, usul asosiy holatni tan olsa, u natijani usulning oldingi nusxasiga qaytaradi.
• Rekursiv qo'ng'iroq boshqa usulga qo'ng'iroq bo'lishi mumkin, bu esa o'z navbatida asl nusxaga qayta qo'ng'iroq qiladi
usul. Bunday jarayon hali ham asl usulga rekursiv chaqiruvga olib keladi. Bu sifatida tanilgan
bilvosita rekursiv chaqiruv yoki bilvosita rekursiya (778-bet).
18.3-bo'lim Rekursiyadan foydalanishga misol: faktoriallar
• Yoki asosiy rekursiyani tashlab qo'yish yoki rekursiya qadamini bir-biriga yaqinlashmasligi uchun noto'g'ri yozish
asosiy holatda cheksiz rekursiyaga olib kelishi mumkin (781-bet), natijada xotirani charchatadi. Bu xato
iterativ (rekursiv bo'lmagan) yechimdagi cheksiz sikl masalasiga o'xshashdir.
18.5-bo'lim Rekursiyadan foydalanishga misol: Fibonachchi seriyasi
• Fibonachchi seriyasi (783-bet) 0 va 1 bilan boshlanadi va har bir keyingi Fi-
Bonachchi soni oldingi ikkitasining yig'indisidir.
• Ketma-ket Fibonachchi raqamlarining nisbati 1,618… doimiy qiymatga yaqinlashadi, bu raqam
Bu oltin nisbat yoki oltin o'rtacha deb ataladi (783-bet).
• Fibonachchi kabi ba'zi rekursiv echimlar usul chaqiruvlarining "portlashiga" olib keladi.
18.6-bo'lim Rekursiya va Metod-Call Stack
• Bajarish usuli har doim stek ramkasi stekning yuqori qismida joylashgan va stek
Ushbu usul uchun ramka mahalliy o'zgaruvchilarning qiymatlarini o'z ichiga oladi.
18.7-bo'lim Rekursiya va takrorlash
• Iteratsiya ham, rekursiya ham boshqaruv bayonotiga asoslanadi: Iteratsiya takrorlanish holatidan foydalanadi-
ment, rekursiya tanlash bayonoti.
• Iteratsiya ham, rekursiya ham takrorlashni o‘z ichiga oladi: iteratsiya aniq takrorlash bayonotidan foydalanadi,
Rekursiya esa takroriy usul chaqiruvlari orqali takrorlanishga erishadi.
• Iteratsiya va rekursiyaning har biri tugatish testini o'z ichiga oladi: takrorlash sikl-con-
davom etish sharti bajarilmaydi, asosiy holat tan olinganda rekursiya.
• Qarama-qarshi boshqariladigan takrorlash va rekursiya bilan takrorlash har bir bosqichga bosqichma-bosqich yaqinlashadi:
Takrorlash hisoblagichni o'zgartirishni davom ettiradi, toki hisoblagich loop-cons-ni amalga oshiradigan qiymatni oladi.
davom etish sharti bajarilmaydi, rekursiya esa asl muammoning soddaroq versiyalarini ishlab chiqarishda davom etadi.
lem asosiy holatga yetguncha.
• Iteratsiya ham, rekursiya ham cheksiz sodir bo‘lishi mumkin: Cheksiz sikl iteratsiya bilan yuzaga keladi, agar
Loop-davomi testi hech qachon noto'g'ri bo'lmaydi, rekursiya bosqichi bo'lsa cheksiz rekursiya sodir bo'ladi.
muammoni har safar asosiy holatga yaqinlashadigan tarzda kamaytirmaydi.

804 18-bob Rekursiya

• Rekursiya qayta-qayta usul chaqiruvi mexanizmini va shunga mos ravishda qo'shimcha xarajatlarni chaqiradi.
• Rekursiv yechish mumkin bo'lgan har qanday muammoni iterativ tarzda ham yechish mumkin.
• Rekursiv yondashuv odatda takrorlanuvchi yondashuvdan ko'ra afzalroq bo'lsa, u tabiiy ravishda aks ettiriladi.
muammoni hal qiladi va tushunish va disk raskadrovka qilish osonroq bo'lgan dasturga olib keladi.
• Rekursiv yondashuv ko'pincha bir nechta kod qatorlari bilan amalga oshirilishi mumkin, lekin unga mos keladigan -
erativ yondashuv katta miqdordagi kodni talab qilishi mumkin. Rekursiv yechimni tanlashning yana bir sababi
Bu iterativ yechim aniq bo'lmasligi mumkin.

18.9-bo'lim Fraktallar


• Fraktal (791-bet) geometrik figura bo‘lib, rekursiv ravishda takrorlanuvchi naqshdan hosil bo‘ladi.
cheksiz ko'p marta.
• Fraktallar o'ziga o'xshash xususiyatga ega (791-bet) — kichik qismlar butunning kichraytirilgan o'lchamdagi nusxalari.

18.10-bo'lim Rekursiv orqaga qaytish


• Rekursiv orqaga kuzatishda (802-bet), agar rekursiv qo'ng'iroqlarning bir to'plami muammoni hal qilishga olib kelmasa
muammo yuzaga kelganda, dastur oldingi qaror nuqtasiga zaxiralanadi va boshqa qaror qabul qiladi,
ko'pincha boshqa rekursiv qo'ng'iroqlar to'plamiga olib keladi.

O'z-o'zini tekshirish mashqlari


18.1 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) O'zini bilvosita chaqiradigan usul rekursiyaga misol bo'la olmaydi.
b) Rekursiya xotiradan foydalanishning kamayishi tufayli hisoblashda samarali bo'lishi mumkin.
c) Muammoni hal qilish uchun rekursiv usul chaqirilsa, u haqiqatda hal qilishga qodir
faqat eng oddiy hol(lar) yoki asosiy holat(lar).
d) Rekursiyani amalga oshirish uchun rekursiv yechimdagi rekursiya qadami ga o'xshash bo'lishi kerak
asl muammo, lekin uning biroz kattaroq versiyasi bo'lishi kerak.
18.2 A rekursiyani tugatish uchun kerak.
a) rekursiya bosqichi
b) break bayonoti
c) bekor qaytarish turi
d) asosiy holat
18.3 Rekursiv usulni chaqirish uchun birinchi chaqiruv .
a) rekursiv emas
b) rekursiv
c) rekursiya bosqichi
d) yuqoridagilarning hech biri
18.4 Har safar fraktal naqsh qo'llanilganda, fraktal yangi nuqtada deyiladi.
a) kenglik
b) balandlik
c) daraja
d) hajm
18.5 Iteratsiya va rekursiyaning har biri .
a) takrorlash bayoni
b) tugatish testi
c) hisoblagich o'zgaruvchisi
d) yuqoridagilarning hech biri

O'z-o'zini tekshirish mashqlariga javoblar 805

18.6 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Fibonachchining ketma-ket raqamlari nisbati 1,618… doimiy qiymatga yaqinlashadi, a
yoki deb nomlangan raqam.
b) Iteratsiya odatda takrorlash iborasidan foydalanadi, rekursiya esa a(n) dan foydalanadi.
bayonot.
c) Fraktallar a(n) xususiyatga ega - qismlarga bo'linganda ularning har biri kamaytirilgan bo'ladi-
butunning o'lchamdagi nusxasi.
O'z-o'zini tekshirish mashqlariga javoblar
18.1 a) noto'g'ri. O'zini shu tarzda chaqiradigan usul bilvosita rekursiyaga misoldir.
b) yolg'on. Rekursiya bir nechta usul chaqiruvlari va eslatmalar tufayli hisoblashda samarasiz bo'lishi mumkin.
ry-bo'sh joydan foydalanish. c) To'g'ri. d) yolg'on. Rekursiyani amalga oshirish uchun rekursiv yechimdagi rekursiya qadami.
Asl muammoga o'xshash bo'lishi kerak, lekin uning biroz kichikroq versiyasi bo'lishi kerak.
18.2 d
18.3 a
18.4 c
18,5 b
18.6 a) oltin nisbat, oltin o'rtacha. b) tanlash. c) o'ziga o'xshash.
Mashqlar
18.7 Quyidagi kod nima qiladi?

18.8 Quyidagi rekursiv usulda xato(lar)ni toping va uni qanday tuzatish kerakligini tushuntiring (ularni).


Bu usul 0 dan n gacha bo'lgan qiymatlar yig'indisini topishi kerak.

18.9 (Rekursiv quvvat usuli) Rekursiv quvvat usulini yozing (asosiy, ko'rsatkich).


chaqiradi, qaytaradi
asosiy ko'rsatkich
Misol uchun, power(3,4) = 3 * 3 * 3 * 3. Ko'rsatkich dan katta yoki teng butun son deb faraz qilaylik.
ga 1. Maslahat: Rekursiya bosqichi munosabatlardan foydalanishi kerak

1 ommaviy int sir (int a, int b)


2 {
3 agar (b == 1)
4 qaytish a;
yana 5
6 a + sirni qaytarish (a, b - 1);
7 }

1 umumiy int summasi (int n)


2 {
3 agar (n == 0)
4 qaytish 0;
yana 5
6 qaytish n + summa(n);
7 }

806 18-bob Rekursiya

asosiy ko'rsatkich = asos · asosiy ko'rsatkich - 1
va tugatish sharti ko'rsatkich 1 ga teng bo'lganda yuzaga keladi, chunki
tayanch1 = asos
Ushbu usulni foydalanuvchiga baza va eksponentni kiritish imkonini beruvchi dasturga kiriting.
18.10 (Rekursiyani vizualizatsiya qilish) Rekursiyani “harakatda” tomosha qilish qiziq. Faktorialni o'zgartiring
uning mahalliy o'zgaruvchisi va rekursiv chaqiruv parametrini chop etish uchun 18.3-rasmdagi usul. Har bir rekursiv qo'ng'iroq uchun,
chiqishlarni alohida satrda ko'rsatish va chekinish darajasini qo'shish. qilish uchun qo'lingizdan kelganini qiling
chiqishlar aniq, qiziqarli va mazmunli. Bu erda sizning maqsadingiz - mahsulot ishlab chiqish va amalga oshirishdir:
rekursiyani tushunishni osonlashtiradigan mat. Siz bunday ko'rsatish imkoniyatlarini qo'shishingiz mumkin
matn davomida boshqa rekursiya misollari va mashqlari.
18.11 (Eng katta umumiy boʻluvchi) x va y butun sonlarning eng katta umumiy boʻluvchisi eng kattasidir.
x va y ga teng bo'linadigan butun son. Eng kattasini qaytaradigan gcd rekursiv usulini yozing
x va y ning umumiy bo'luvchisi. x va y ning gcd lari rekursiv tarzda quyidagicha aniqlanadi: Agar y 0 ga teng bo'lsa,
u holda gcd(x, y) x bo'ladi; aks holda, gcd(x, y) gcd(y, x % y), bu yerda % qolgan operator. Foydalanish
bu usul 6.27-mashq ilovasida yozganingizni almashtirish uchun.
18.12 Quyidagi dastur nima qiladi?

18.13 Quyidagi dastur nima qiladi?

1 // 18.12-mashq Yechim: MysteryClass.java
2 ommaviy sinf MysteryClass
3 {
4 ta umumiy statik int sir (int[] array2, int hajmi)
5 {
6 agar (hajmi == 1)
7 qaytariladigan massiv2[0];
yana 8
9 qaytish massivi2[hajmi - 1] + sir(massiv2, o'lcham - 1);
10 }
11
12 ta umumiy statik bekor asosiy(String[] args)
13 {
14 int[] massivi = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
15
16 int natija = sir (massiv, massiv.uzunlik);
17 System.out.printf("Natija: %d%n", natija);
18 } // tugatish usuli asosiy
19 } // yakuniy sinf MysteryClass

1 // 18.13-mashq Yechim: SomeClass.java


2 ommaviy sinf SomeClass
3 {
4 ta umumiy statik String someMethod(int[] array2, int x)
5 {
6 agar (x < massiv2.uzunlik)
7 qaytish String.format(
8 "%s%d ", someMethod(massiv2, x + 1), massiv2[x]);
yana 9
10 qaytarish "";
11 }
12

807-mashqlar

18.14 (Palindromlar) Palindrom - oldinga va orqaga bir xil yoziladigan qator.
Palindromlarning ba'zi misollari: "radar", "elbani ko'rgan edim" va (agar bo'shliqlar e'tiborga olinmasa) "a"
Panama kanalini rejalashtirish. Boolean qiymatini qaytaruvchi testPalindrome rekursiv usulini yozing
agar massivda saqlangan satr palindrom bo'lsa true, aks holda noto'g'ri. Usul e'tibordan chetda qolishi kerak
qatordagi boʻshliqlar va tinish belgilari.
18.15 (Sakkiz qirolicha) Shaxmat ishqibozlari uchun boshqotirma “Sakkiz qirolicha” muammosi bo‘lib, u shunday savol beradi:
Hech bir malika boshqasiga “hujum qilmasligi” uchun sakkizta malikani bo'sh shaxmat taxtasiga qo'yish mumkin (ya'ni,
ikkita malika bir qatorda, bir ustunda yoki bir xil diagonal bo'ylab yo'q)? Masalan; misol uchun,
Agar malika taxtaning yuqori chap burchagiga o'rnatilgan bo'lsa, boshqa malikalarni birortasiga qo'yib bo'lmaydi.
18.20-rasmda ko'rsatilgan belgilangan kvadratlar. Muammoni rekursiv hal qiling. [Maslahat: Sizning yechimingiz kerak
birinchi ustundan boshlang va o'sha ustunda malika qo'yilishi mumkin bo'lgan joyni qidiring -
dastlab, malikani birinchi qatorga qo'ying. Yechim qolganlarni rekursiv ravishda qidirishi kerak
ustunlar. Birinchi bir nechta ustunlarda malika joylashtirilishi mumkin bo'lgan bir nechta joylar bo'ladi. Oling
birinchi mavjud joy. Agar ustunga malika uchun mumkin bo'lmagan joylashuvga erishilsa, dastur
oldingi ustunga qaytishi va ushbu ustundagi malikani yangi qatorga o'tkazishi kerak. Bu kon-
doimiy zaxira nusxasini yaratish va yangi muqobillarni sinab ko'rish rekursiv orqaga qaytishga misoldir.]
18.16 (Masivni chop etish) Barcha elementlarni aks ettiruvchi printArray rekursiv usulini yozing.
bo'shliqlar bilan ajratilgan butun sonlar massivi.

18.17 (Masivni orqaga qarab chop etish) Belgini qabul qiluvchi stringReverse rekursiv usulini yozing


argument sifatida satrni o'z ichiga olgan massiv va satrni orqaga bosib chiqaradi. [Maslahat: String usulidan foydalaning
Stringdagi belgilarni o'z ichiga olgan char massivini olish uchun hech qanday argument talab qilmaydigan toCharArray.]
18.18 (Masivdagi minimal qiymatni toping) Rekursiv Minimum rekursiv usulni yozing
butun sonlar massividagi eng kichik elementni aniqlaydi. Usul qabul qilinganda qaytishi kerak
bir elementdan iborat massiv.
18.19 (Fraktallar) Yulduz hosil qilish uchun 18.9-bo'limdagi fraktal naqshni takrorlang. Besh qatordan boshlang (qarang
18.21-rasm) bitta o'rniga, bu erda har bir chiziq yulduzning boshqa qo'li. “Lo feather frac-”ni qo'llang
tal” naqshini yulduzning har bir qo'liga.

13 ta umumiy statik bekor asosiy(String[] args)


14 {
15 int[] massivi = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
16 String natijalari = someMethod(massiv, 0);
17 System.out.println(natijalar);
18 }
19 } // so'nggi sinf SomeClass

18.20-rasm | Kvadratchalar shaxmat taxtasining yuqori chap burchagiga malika qo'yish orqali yo'q qilinadi.

* * * * * *
* *
* *
* *
* *
* *
*
*

*

*



*

*


808 18-bob Rekursiya

18.20 (Rekursiv orqaga kuzatish yordamida labirintni o'tkazish) 18.22-rasmdagi #lar va nuqtalar (.) to'ri


labirintning ikki o‘lchovli massiv tasviri. #lar labirintning devorlarini ifodalaydi va
nuqtalar labirint orqali mumkin bo'lgan yo'llardagi joylarni ifodalaydi. Harakat faqat past tomonga amalga oshirilishi mumkin.
nuqtani o'z ichiga olgan massivdagi kation.

18.22-rasmdagi kabi labirintlar bo'ylab yurishning rekursiv usulini (mazeTraversal) yozing.


Usul argumentlar sifatida labirint va labirintni ifodalovchi 12x12 belgilar qatorini olishi kerak.
labirintdagi joriy joy (bu usul birinchi marta chaqirilganda, joriy joylashuv
labirintning kirish nuqtasi). MazeTraversal chiqish joyini aniqlashga urinayotganda, u belgini joylashtirishi kerak.
yo'lning har bir kvadratida ter x. Labirintda yurishning oddiy algoritmi bor
antees chiqish yo'lini topmoqda (chiqish bor deb faraz qilgan holda). Agar chiqish yo'q bo'lsa, siz boshlang'ichga etib borasiz
yana joylashuv. Algoritm quyidagicha: labirintdagi joriy joydan birini siljitishga harakat qiling
mumkin bo'lgan har qanday yo'nalishda bo'sh joy (pastga, o'ngga, yuqoriga yoki chapga). Hech bo'lmaganda ko'chib o'tish mumkin bo'lsa
bir yoʻnalishda labirintdagi yangi joyni joriy nuqta sifatida oʻtkazib, mazeTraversalni rekursiv chaqiring.

18.21-rasm | 18.19-mashq uchun namuna natijalari.

18.22-rasm | Labirintning ikki o‘lchovli massiv tasviri.

# # # # # # # # # # #


#. . . #. . . . . . #
. . #. #. ####. #
###. #. . . . #. #
#. . . . ###. #. .
####. #. #. #. #
#. . #. #. #. #. #
##. #. #. #. #. #
#. . . . . . . . #. #
# # # # # #. ###. #
#. . . . . . #. . . #
# # # # # # # # # # #

809-mashqlar

Agar biron-bir yo'nalishda borishning iloji bo'lmasa, labirintning oldingi joyiga "zaxira nusxasini" oling va yangisini sinab ko'ring.
o'sha joy uchun yo'nalish (bu rekursiv orqaga qaytishga misol). Usulni dasturlash
labirintni har bir harakatdan keyin ko'rsating, shunda foydalanuvchi labirintning echilishini tomosha qilishi mumkin. ning yakuniy chiqishi
labirint faqat labirintni hal qilish uchun zarur bo'lgan yo'lni ko'rsatishi kerak - agar ma'lum bir yo'nalishda ketayotgan bo'lsa
Agar o'lik nuqtaga olib kelsa, x ning bu yo'nalishda ketayotgani ko'rsatilmasligi kerak. [Maslahat: Faqat ko'rsatish uchun
oxirgi yo'l, boshqa belgi bilan boshi berk ko'chaga olib keladigan dog'larni belgilash foydali bo'lishi mumkin
(masalan, "0").]
18.21 (Tasodifiy labirintlarni yaratish) Argument sifatida a mazeGenerator usulini yozing.
ikki o'lchovli 12 ga 12 belgilar qatori va tasodifiy labirint hosil qiladi. Usul ham bo'lishi kerak
labirintning boshlanish va tugash joylarini taqdim eting. MazeTraversal dan usulingizni sinab ko'ring
Bir nechta tasodifiy yaratilgan labirintlardan foydalangan holda 18.20-mashq.
18.22 (Har qanday o'lchamdagi labirintlar) MazeTraversal va mazeGenerator usullarini umumlashtirish.
Har qanday kenglik va balandlikdagi labirintlarni qayta ishlash uchun 18.20-mashq va 18.21-mashq.
18.23 (Fibonachchi raqamlarini hisoblash vaqti) 18.5-rasmdagi Fibonachchi dasturini yaxshilang.
u hisoblashni amalga oshirish uchun zarur bo'lgan taxminiy vaqtni hisoblab chiqadi va sonini
rekursiv usulga qilingan qo'ng'iroqlar soni. Buning uchun joriy statik tizim usulini chaqiring.
TimeMillis, u hech qanday argumentni qabul qilmaydi va kompyuterning joriy vaqtini millisekundlarda qaytaradi.
Ushbu usulni ikki marta chaqiring - bir marta Fibonachchiga qo'ng'iroq qilishdan oldin va bir marta. Har bir qiymatni saqlang va hisob-
bajarish uchun qancha millisekund kerakligini aniqlash uchun vaqtlar farqini hisoblang
hisoblash. Keyin, FibonacciCalculator sinfiga o'zgaruvchini qo'shing va bu o'zgaruvchidan
Fibonachchi usuliga qilingan qo'ng'iroqlar sonini aniqlang. Natijalaringizni ko'rsating.

19 Qidiruv, saralash va katta O


Yig'i va ko'z yoshlari bilan
u hal qildi
Eng katta o'lchamdagilar ...
- Lyuis Kerroll
Oxirigacha harakat qiling va hech qachon
shubha qilish;
Hech narsa qiyin emas, lekin qidiring
bilib oladi.
- Robert Xerrik
Xotiramda qulflangan,
Va o'zingiz saqlaysiz
uning kaliti.
- Uilyam Shekspir
Bu o'zgarmas qonun
so'zlar so'z bo'lgan biznes,
tushuntirishlar tushuntirishlar,
va'dalar va'dalar - lekin
faqat ishlash haqiqatdir.
- Harold S. Green

Oh maqsadlar


Ushbu bobda siz:
■ a ichida berilgan qiymatni qidiring
chiziqli qidiruv yordamida massiv va
ikkilik qidiruv.
■ Iterativ yordamida massivlarni tartiblang
tanlash va kiritish tartibi
algoritmlar.
■ Rekursiv yordamida massivlarni tartiblang
birlashtirish tartiblash algoritmi.
■ samaradorligini aniqlang
qidirish va saralash
algoritmlar.
■ uchun Big O belgisini kiriting
samaradorligini solishtirish
algoritmlar.

19.1 Kirish 811

19.1 Kirish
Ma'lumotlarni qidirish qiymat (qidiruv kaliti deb ataladi) bosilganligini aniqlashni o'z ichiga oladi.
ma'lumotlarga kiriting va agar shunday bo'lsa, uning joylashgan joyini toping. Ikki mashhur qidiruv algoritmi sim-
ple linear qidiruv va tezroq, ammo murakkabroq ikkilik qidiruv. Joylarni saralash
bir yoki bir nechta tartiblash tugmalari asosida o'sish yoki kamayish tartibi. Ismlar ro'yxati bo'lishi mumkin
alifbo tartibida tartiblangan, bank hisoblari hisob raqami, xodimlarning ish haqi bo'yicha tartiblanishi mumkin edi
yozuvlar ijtimoiy xavfsizlik raqami bo'yicha tartiblanishi mumkin va hokazo. Ushbu bob ikkitasini taqdim etadi
oddiy tartiblash algoritmlari, tanlash va qo'shish tartiblari va boshqalar
samarali, ammo murakkabroq birlashma turi. 19.1-rasmda qidirish va saralash jamlangan
Ushbu kitobning misollari va mashqlarida muhokama qilingan algoritmlar.

19.1 Kirish


19.2 Chiziqli qidiruv
19.3 Katta O belgisi
19.3.1 O(1) algoritmlari
19.3.2 O(n) algoritmlari
19.3.3 O(n2) algoritmlari
19.3.4 Chiziqli qidiruvning katta O
19.4 Ikkilik qidiruv
19.4.1 Ikkilik qidiruvni amalga oshirish
19.4.2 Ikkilik qidiruvning samaradorligi
19.5 Saralash algoritmlari
19.6 Tanlash tartibi
19.6.1 Tanlash tartibini amalga oshirish
19.6.2 Tanlashning samaradorligi

19.7 Qo'shish tartibi


19.7.1 Qo'shishni saralashni amalga oshirish
19.7.2 Qo'shish tartibining samaradorligi
19.8 Birlashtirish tartibi
19.8.1 Birlashtirish tartibini amalga oshirish
19.8.2 Birlashtirish tartibining samaradorligi
19.9 Ushbu bob uchun katta xulosa
Qidiruv va saralash algoritmlari
19.10 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar

Dasturiy ta'minot muhandisligi kuzatuvi 19.1
Qidiruv va saralashni talab qiladigan ilovalarda Java-ning oldindan belgilangan imkoniyatlaridan foydalaning
Collections API (16-bob). Ushbu bobda keltirilgan texnikalar taqdim etiladi
talabalarni qidirish va saralash algoritmlari - yuqori darajadagi tushunchalar bilan tanishtirish
informatika kurslari odatda bunday algoritmlarni batafsil muhokama qiladi.

Bo'lim algoritmining joylashuvi

Qidiruv algoritmlari:
Sinfning 16 binarySearch usuli
To'plamlar

16.12-rasm

19 Chiziqli qidiruv
Ikkilik qidiruv
Rekursiv chiziqli qidiruv
Rekursiv ikkilik qidiruv

19.2-bo'lim


19.4-bo'lim
19.8-mashq
19.9-mashq

19.1-rasm | Ushbu matnda ko'rib chiqilgan qidiruv va saralash algoritmlari. (2-qismning 1-qismi.)


812 19-bob Qidiruv, saralash va katta O

19.2 Chiziqli qidiruv
Telefon raqamini qidirish, qidiruv tizimi orqali veb-saytni topish va def-ni tekshirish
lug'atda so'zning boshlanishi katta hajmdagi ma'lumotlarni qidirishni o'z ichiga oladi. Ushbu bo'lim
va 19.4-bo'lim ikkita umumiy qidiruv algoritmini muhokama qiladi - ulardan biri hali dasturlash oson
nisbatan samarasiz (chiziqli qidiruv) va nisbatan samarali, ammo murakkabroq
dastur (ikkilik qidiruv).
Chiziqli qidiruv algoritmi
Chiziqli qidiruv algoritmi massivdagi har bir elementni ketma-ket qidiradi. Agar qidiruv bo'lsa
kalit massivdagi elementga mos kelmasa, algoritm har bir elementni tekshiradi va qachon
massivning oxiriga yetganda, foydalanuvchiga qidiruv kaliti mavjud emasligi haqida xabar beradi. Agar
Qidiruv kaliti massivda bo'lsa, algoritm mos keladigan elementni topmaguncha har bir elementni sinab ko'radi
qidiruv kaliti va ushbu elementning indeksini qaytaradi.
Misol tariqasida quyidagi qiymatlarni o'z ichiga olgan massivni ko'rib chiqing

va 51 ni qidirayotgan dastur. Chiziqli qidiruv algoritmidan foydalanib, birinchi navbatda dastur


34 qidiruv kalitiga mos kelishini tekshiradi. Bu yo'q, shuning uchun algoritm yoki yo'qligini tekshiradi
56 qidiruv kalitiga mos keladi. Dastur qator bo'ylab ketma-ket harakat qilishni davom ettiradi,
test 2, keyin 10, keyin 77. Dastur qidiruv tugmasiga mos keladigan 51 ni sinab ko'rganda,
dastur 5 indeksini qaytaradi, bu massivdagi 51 ning joylashuvi. Agar tekshirilgandan keyin
Har bir massiv elementida dastur qidiruv kaliti hech qanday elementga mos kelmasligini aniqlaydi.
massivdagi ment, u sentinel qiymatni qaytaradi (masalan, -1).
Chiziqli qidiruvni amalga oshirish
Class LinearSearchTest (19.2-rasm) bajarish uchun linearSearch statik usulini o'z ichiga oladi.
linearSearchni sinash uchun int massivi va main qidiruvlarini amalga oshirish.

21 Roʻyxatni chiziqli qidirish


Ikkilik daraxt qidirish

21.21-mashq


21.23-mashq

Saralash algoritmlari:


To'plamlar sinfining 16 tartiblash usuli
SortedSet to'plami

Anjir. 16,6–16,9


16.17-rasm

19 Tanlash tartibi


Kiritish tartibi
Rekursiv birlashma tartibi
Pufakcha tartiblash
Paqir turi
Rekursiv tezkor tartiblash

19.6-bo'lim


19.7-bo'lim
19.8-bo'lim
19.5 va 19.6 mashqlari
19.7-mashq
19.10-mashq
21 Ikkilik daraxt tartiblash 21.7-bo'lim

34 56 2 10 77 51 93 30 5 52

Bo'lim algoritmining joylashuvi

19.1-rasm | Ushbu matnda ko'rib chiqilgan qidiruv va saralash algoritmlari. (2-qismning 2-qismi.)


19.2 Chiziqli qidiruv 813

1 // 19.2-rasm: LinearSearchTest.java
2 // Element uchun massivni ketma-ket qidirish.
3 import java.security.SecureRandom;
4 import java.util.Arrays;
5 import java.util.Scanner;
6
7 umumiy sinf LinearSearchTest
8 {
9
10
11
12
13
14
15
16
17
18
19
20 ta umumiy statik bekor asosiy (String [] args)
21 {
22 Skaner kiritish = yangi Skaner(System.in);
23 SecureRandom generator = yangi SecureRandom();
24
25 int[] ma'lumotlar = new int[10]; // massiv yaratish
26
27 uchun (int i = 0; i < data.length; i++) // massivni toʻldirish
28 ma'lumot[i] = 10 + generator.nextInt(90);
29
30 System.out.printf("%s%n%n", ); // massivni ko'rsatish
31
32 // foydalanuvchidan ma'lumot olish
33 System.out.print("Iltimos, butun son qiymatini kiriting (chiqish uchun -1): ");
34 int searchInt = input.nextInt();
35
36 // butun sonni qayta-qayta kiritish; -1 dasturni tugatadi
37 vaqt (searchInt != -1)
38 {
39 int pozitsiyasi = ; // qidiruvni amalga oshiring
40
41 agar (pozitsiya == -1) // topilmadi
42 System.out.printf("%d topilmadi%n%n", searchInt);
Yana 43 ta // topildi
44 System.out.printf("%d%d%n%n pozitsiyasida topildi",
45 searchInt, pozitsiya);
46
47 // foydalanuvchidan ma'lumot olish
48 System.out.print("Iltimos, butun son qiymatini kiriting (chiqish uchun -1): ");
49 searchInt = input.nextInt();
50 }
51 } // asosiyni tugatish
52 } // oxirgi sinf LinearSearchTest

19.2-rasm | Element uchun massivni ketma-ket qidirish. (2-qismning 1-qismi.)

// ma'lumotlar bo'yicha chiziqli qidiruvni amalga oshirish
umumiy statik int linearSearch(int data[], int searchKey)
{
// massiv bo'ylab ketma-ket aylanish
uchun (int indeks = 0; indeks < data.length; indeks++)
agar (ma'lumotlar [indeks] == qidiruv kaliti)
qaytish indeksi; // butun sonni qaytarish indeksi
qaytish -1; // butun son topilmadi
} // tugatish usuli linearSearch

Arrays.toString(ma'lumotlar)

linearSearch(ma'lumotlar, searchInt)

814 19-bob Qidiruv, saralash va katta O

LinearSearch usuli
LinearSearch usuli (10–18-qatorlar) chiziqli qidiruvni amalga oshiradi. Usul sifatida qabul qilinadi
qidirish uchun massiv (ma'lumotlar) va qidiruv kaliti parametrlari. 13-15 qatorlar orqali pastadir
massiv ma'lumotlaridagi elementlar. 14-qator har birini searchKey bilan taqqoslaydi. Agar qiymatlar teng bo'lsa,
15-satr element indeksini qaytaradi. Agar massivda takroriy qiymatlar mavjud bo'lsa, chiziqli
qidiruv qidiruv kalitiga mos keladigan massivdagi birinchi elementning indeksini qaytaradi. Agar
sikl qiymat topilmasdan tugaydi, 17-satr -1 ni qaytaradi.
Asosiy usul
Asosiy usul (20–51-qator) foydalanuvchiga massivni qidirish imkonini beradi. 25–28 qatorlar massiv hosil qiladi
10 ints va uni 10-99 oralig'idagi tasodifiy intslar bilan to'ldiring. Keyin 30-qator massivni ko'rsatadi
String ko'rinishini qaytaradigan toString statik usuli yordamida tarkibni
massivning elementlari kvadrat qavs ([va]) ichidagi va vergul bilan ajratilgan.
33–34-qatorlar foydalanuvchini qidirish kalitini qidirishni va saqlashni taklif qiladi. 39-qator qo'ng'iroqlar usuli lin-
searchInt massiv ma'lumotlarida mavjudligini aniqlash uchun earSearch. Agar shunday bo'lmasa, linearSearch
-1 ni qaytaradi va dastur foydalanuvchini xabardor qiladi (41–42-qatorlar). Agar searchInt massivda bo'lsa,
linearSearch elementning o'rnini qaytaradi, dastur 44-qatorda chiqaradi.
45. 48–49 qatorlar foydalanuvchidan keyingi qidiruv kalitini oladi.
19.3 Katta O notation
Qidiruv algoritmlari barchasi bir xil maqsadga erishadi - elementni (yoki elementlarni) topish
berilgan qidiruv kalitiga mos keladi, agar bunday element haqiqatda mavjud bo'lsa. Biroq, a
qidiruv algoritmlarini bir-biridan ajratib turadigan narsalar soni. Asosiy farq -
ence - qidiruvni yakunlash uchun zarur bo'lgan harakat miqdori. Bu harakatni tasvirlashning bir usuli
Big O yozuvi bilan, bu algoritm hal qilish uchun qanchalik qiyin ishlashi kerakligini ko'rsatadi
muammo. Algoritmlarni qidirish va saralash uchun bu, ayniqsa, ularning soniga bog'liq
ma'lumotlar elementlari mavjud. Ushbu bobda biz eng yomon ish vaqtlarini tasvirlash uchun Big O dan foydalanamiz
turli xil qidirish va saralash algoritmlari uchun.
19.3.1 O(1) algoritmlari
Algoritm massivning birinchi elementi teng yoki yo‘qligini tekshirish uchun mo‘ljallangan deylik
ikkinchisi. Agar massiv 10 ta elementga ega bo'lsa, bu algoritm bitta taqqoslashni talab qiladi. Agar
massiv 1000 ta elementga ega, u hali ham bitta taqqoslashni talab qiladi. Aslida, algoritm umumiydir.
massivdagi elementlar sonidan mutlaqo mustaqil. Bu algoritmga ega deb aytiladi

[59, 97, 34, 90, 79, 56, 24, 51, 30, 69]


Iltimos, butun sonni kiriting (chiqish uchun -1): 79
4-pozitsiyada 79 topildi
Iltimos, butun sonni kiriting (chiqish uchun -1): 61
61 topilmadi
Iltimos, butun sonni kiriting (chiqish uchun -1): 51
7-pozitsiyada 51 topildi
Iltimos, butun sonni kiriting (chiqish uchun -1): -1

19.2-rasm | Element uchun massivni ketma-ket qidirish. (2-qismning 2-qismi.)


19.3 Big O notation 815



doimiy ish vaqti, u Big O yozuvida O(1) sifatida ifodalanadi va shunday talaffuz qilinadi
"Biriga buyurtma bering." O (1) bo'lgan algoritm faqat bitta taqqoslashni talab qilmaydi.
O (1) shunchaki taqqoslashlar soni doimiy ekanligini anglatadi - u o'lcham sifatida o'smaydi
massiv ortib boradi. Massivning birinchi elementi teng yoki yo‘qligini tekshiradigan algoritm
keyingi uchta elementdan birortasi uchun uchta taqqoslash kerak bo'lsa ham, hali ham O (1) dir.
19.3.2 O(n) algoritmlari
Birinchi massiv elementi boshqa massivlardan biriga teng yoki yo‘qligini tekshiradigan algoritm
elementlar eng ko'p n - 1 ta taqqoslashni talab qiladi, bu erda n - massiv elementlari soni.
Agar massiv 10 ta elementga ega bo'lsa, bu algoritm to'qqiztagacha taqqoslashni talab qiladi. Agar massiv
1000 ta elementga ega, u 999 tagacha taqqoslashni talab qiladi. n kattalashgan sari, ning n qismi
"hukmronlik qiladi" iborasi va bittasini ayirish ahamiyatsiz bo'lib qoladi. Big O ishlab chiqilgan
bu dominant atamalarni ajratib ko'rsatish va n o'sishi bilan ahamiyatsiz bo'lib qolgan atamalarga e'tibor bermaslik.
Shu sababli, jami n – 1 ta taqqoslashni talab qiladigan algoritm (masalan, bitta
Yuqorida tavsiflangan) O(n) deyiladi. O(n) algoritmi chiziqli deb ataladi
ishlash vaqti. O(n) odatda “n tartibida” yoki oddiygina “n tartibida” talaffuz qilinadi.
19.3.3 O(n2) algoritmlari
Endi sizda massivning har qanday elementi ikkilamchi ekanligini tekshiradigan algoritm bor deylik.
massivning boshqa joyida joylashgan. Birinchi elementni har bir boshqa element bilan solishtirish kerak
massivda. Ikkinchi elementni boshqa barcha elementlar bilan solishtirish kerak
birinchi (bu allaqachon birinchi bilan taqqoslangan). Uchinchi elementni har biri bilan solishtirish kerak
birinchi ikkitadan tashqari boshqa element. Oxir-oqibat, bu algoritm (n - 1) hosil qiladi.
+ (n – 2) + … + 2 + 1 yoki n2/2 – n/2 taqqoslash. n ortishi bilan n2 hadi ustunlik qiladi
va n a'zosi ahamiyatsiz bo'ladi. Yana Big O belgisi n2 atamasini ta'kidlaydi,
tark etish n/2. Ammo, tez orada ko'rib chiqamizki, Big O belgisida doimiy omillar hisobga olinmaydi.
Big O algoritmning ishlash vaqti raqamga nisbatan qanday o'sishi bilan bog'liq
qayta ishlangan narsalar soni. Faraz qilaylik, algoritm n2 ni solishtirishni talab qiladi. To'rt element bilan,
algoritm 16 ta taqqoslashni talab qiladi; sakkiz element bilan, 64 taqqoslash. Bu bilan
algoritm, elementlar sonini ikki baravar oshirish taqqoslash sonini to'rt baravar oshiradi. Con-
n2/2 taqqoslashni talab qiladigan shunga o'xshash algoritmni ishlating. To'rt element bilan, algoritm
sakkizta taqqoslashni talab qiladi; sakkiz element bilan, 32 taqqoslash. Yana ikki baravar oshirish
elementlar soni taqqoslashlar sonini to'rt baravar oshiradi. Bu ikkala algoritm ham o'sadi
n ning kvadrati sifatida Big O doimiyni e'tiborsiz qoldiradi va ikkala algoritm ham shunday deb hisoblanadi
O(n2), bu kvadratik ish vaqti deb ataladi va “n- tartibida” talaffuz qilinadi.
kvadrat” yoki oddiyroq “n-kvadrat tartibi”.
Agar n kichik bo'lsa, O(n2) algoritmlari (hozirgi kompyuterlarda ishlaydi) sezilarli bo'lmaydi.
ishlashga ta'sir qiladi. Ammo n o'sishi bilan siz ishlashning pasayishini seza boshlaysiz. An
Million elementli massivda ishlaydigan O(n2) algoritmi trillion “operatsiya”ni talab qiladi.
(bu erda har biri aslida bajarish uchun bir nechta mashina ko'rsatmalarini talab qilishi mumkin). Bu mumkin
bir necha soat talab qiladi. Bir milliard elementli massiv kvintilion operatsiyalarni talab qiladi, a
raqam shunchalik kattaki, algoritm o'nlab yillar talab qilishi mumkin! O(n2) algoritmlari, afsuski,
yozish oson, buni ushbu bobda ko'rasiz. Bundan tashqari, yanada qulayroq algoritmlarni ko'rasiz
Katta O o'lchovlari. Ushbu samarali algoritmlar ko'pincha bir oz ko'proq aql talab qiladi va ishlaydi
yaratish, lekin ularning ustun ishlashi, ayniqsa, n sifatida qo'shimcha harakat, yaxshi loyiq bo'lishi mumkin
katta bo'ladi va algoritmlar kattaroq dasturlarga birlashtiriladi.

816 19-bob Qidiruv, saralash va katta O

19.3.4 Chiziqli qidiruvning katta O
Chiziqli qidiruv algoritmi O(n) vaqtida ishlaydi. Bu algoritmdagi eng yomon holat bu ev-
Qidiruv elementi massivda mavjudligini aniqlash uchun elementni tekshirish kerak. Agar
massivning o'lchami ikki baravar ko'payadi, algoritm bajarishi kerak bo'lgan taqqoslashlar soni
shakli ham ikki baravar ko'payadi. Chiziqli qidiruv element bo'lsa, ajoyib ishlashni ta'minlashi mumkin
Qidiruv kalitiga mos keladigan joy massivning old tomonida yoki yaqinida bo'ladi. Ammo biz algo-
Ritmlar barcha qidiruvlar boʻyicha oʻrtacha yaxshi ishlaydi, shu jumladan, qidiruv tizimi
Qidiruv kalitiga mos keladigan ment massivning oxiriga yaqin joylashgan.
Chiziqli qidiruvni dasturlash oson, lekin boshqa qidiruv algoritmlariga qaraganda sekin bo'lishi mumkin.
ritmlar. Agar dastur katta massivlarda ko'p qidiruvlarni amalga oshirishi kerak bo'lsa, buni amalga oshirish yaxshiroqdir
Biz keyingi taqdim etadigan ikkilik qidiruv kabi samaraliroq algoritmni yarating.

19.4 Ikkilik qidiruv


Ikkilik qidiruv algoritmi chiziqli qidiruvga qaraganda samaraliroqdir, lekin u shuni talab qiladi
massiv tartiblanadi. Ushbu algoritmning birinchi iteratsiyasi massivdagi o'rta elementni sinab ko'radi.
Agar bu qidiruv kalitiga mos kelsa, algoritm tugaydi. Massiv o'sish bo'yicha tartiblangan deb faraz qilsak -
Agar qidiruv kaliti o'rta elementdan kichik bo'lsa, u hech qanday elementga mos kelmaydi.
massivning ikkinchi yarmida va algoritm faqat birinchi yarmida davom etadi
massivning (ya'ni, o'rta elementgacha bo'lgan birinchi element, lekin shu jumladan emas). Agar
qidiruv kaliti o'rta elementdan kattaroqdir, u birinchi yarmida hech qanday elementga mos kelmaydi
massiv va algoritm faqat ikkinchi yarmi bilan davom etadi (ya'ni, keyingi element
oxirgi element orqali o'rta element). Har bir iteratsiya ning o'rta qiymatini tekshiradi
massivning qolgan qismi. Qidiruv kaliti elementga mos kelmasa, algo-
ritm qolgan elementlarning yarmini yo'q qiladi. Algoritm ni topish bilan tugaydi
Qidiruv tugmachasiga mos keladigan yoki pastki qatorni nolga tushiradigan element.
Misol
Misol sifatida tartiblangan 15 elementli massivni ko'rib chiqing

va qidiruv kaliti 65. Ikkilik qidiruv algoritmini amalga oshiradigan dastur birinchi navbatda bo'ladi


51 qidiruv kaliti ekanligini tekshiring (chunki 51 massivning o'rta elementi). The
Qidiruv kaliti (65) 51 dan katta, shuning uchun 51 qatorning birinchi yarmi bilan birga e'tiborga olinmaydi (barchasi
51 dan kichik elementlar), qoldirib ketish

Keyinchalik, algoritm 81 (qolgan elementning o'rta elementi) mavjudligini tekshiradi


massiv) qidiruv kalitiga mos keladi. Qidiruv kaliti (65) 81 dan kichik, shuning uchun 81 o'chiriladi
81 dan katta elementlar bilan birga. Faqat ikkita sinovdan so'ng, algoritm toraydi
tekshirish uchun qiymatlar soni faqat uchta (56, 65 va 77). Keyin 65 ni tekshiradi (bu
Haqiqatan ham qidiruv kalitiga mos keladi) va 65 ni o'z ichiga olgan massiv elementining indeksini qaytaradi.

Ishlash bo'yicha maslahat 19.1


Ba'zan eng oddiy algoritmlar yomon ishlaydi. Ularning fazilati shundaki, ularni qo'llab-quvvatlash oson.
gramm, sinov va disk raskadrovka. Ba'zan maksimal natijaga erishish uchun murakkabroq algoritmlar talab qilinadi.
onaning ishlashi.

2 3 5 10 27 30 34 51 56 65 77 81 82 93 99

56 65 77 81 82 93 99

19.4 Ikkilik qidiruv 817

Ushbu algoritm qidiruv kaliti yoki yo'qligini aniqlash uchun faqat uchta taqqoslashni talab qildi
massiv elementiga mos keldi. Chiziqli qidiruv algoritmidan foydalanish 10 ni talab qiladi
taqqoslashlar. [Izoh: Ushbu misolda biz 15 ta elementdan iborat massivdan foydalanishni tanladik
massivda har doim aniq o'rta element bo'ladi. Juft sonli ele-
mentlar, massivning o'rtasi ikkita element orasida joylashgan. Biz algoritmni amalga oshiramiz
bu ikki elementdan eng yuqorisini tanlang.]
19.4.1 Ikkilik qidiruvni amalga oshirish
BinarySearchTest klassi (19.3-rasm) quyidagilarni o'z ichiga oladi:
• belgilangan kalit uchun int massividan qidirish uchun binarySearch statik usuli
• ar-da qolgan elementlarni ko'rsatish uchun qolgan elementlarning statik usuli
izlanayotgan nur va
• binarySearch test usuliga asosiy.
Asosiy usul (57-90-qatorlar) 19.2-rasmdagi asosiy usul bilan deyarli bir xil. Ushbu dasturda,
biz 15 elementli massiv yaratamiz (62-qator) va 67-qator Arrays sinfining statik usulini chaqiradi.
massivdagi massiv ma'lumotlarining elementlarini ortib borish tartibida saralash uchun tartiblash (sukut bo'yicha). Eslab qoling
ikkilik qidiruv algoritmi faqat tartiblangan massivda ishlaydi. Chiqishning birinchi qatori
bu dasturdan ints larning tartiblangan massivini ko'rsatadi. Foydalanuvchi dasturga ko'rsatma berganida
18 ni qidiring, dastur birinchi navbatda o'rta elementni sinab ko'radi, bu 57 (* bilan ko'rsatilgandek).
Qidiruv kaliti 57 dan kam, shuning uchun dastur massivning ikkinchi yarmini yo'q qiladi va
birinchi yarmidan boshlab o'rta elementni sinab ko'radi. Qidiruv kaliti 36 dan kichik, shuning uchun pro-
gramm massivning ikkinchi yarmini yo'q qiladi va faqat uchta elementni qoldiradi. Nihoyat, pro-
gramm 18 ni tekshiradi (qidiruv kalitiga mos keladi) va indeks 1ni qaytaradi.

1 // 19.3-rasm: BinarySearchTest.java


2 // Massivdagi elementni topish uchun ikkilik qidiruvdan foydalaning.
3 import java.security.SecureRandom;
4 import java.util.Arrays;
5 import java.util.Scanner;
6
7 umumiy sinf BinarySearchTest
8 {
9 // ma'lumotlar bo'yicha ikkilik qidiruvni amalga oshiring
10
11 {
12
13
14
15 int joylashuvi = -1; // qaytariladigan qiymat; -1 topilmasa
16
17
18 {
19 // massivning qolgan elementlarini chop etish
20 System.out.print(qolgan elementlar (ma'lumotlar, past, yuqori));
21

19.3-rasm | Massivdagi elementni topish uchun ikkilik qidiruvdan foydalaning (chiqishdagi * belgisi o'rtani belgilaydi


element). (3-qismning 1-qismi.)

umumiy statik int binarySearch(int[] ma'lumotlari, int kaliti)

int past = 0; // qidiruv maydonining pastki qismi
int yuqori = data.length - 1; // qidiruv maydonining yuqori qismi
int o'rta = (past + yuqori + 1) / 2; // o'rta element

elementni qidirish uchun do // tsikli


818 19-bob Qidiruv, saralash va katta O

22 // tekislash uchun chiqish joylari
23 uchun (int i = 0; i < o'rtada; i++)
24 System.out.print(" ");
25 System.out.println(" * "); // joriy o'rtani ko'rsating
26
27
28
29
30
31
32
33
34
35
36
37
38 qaytish joyi; // qidiruv kalitining manzilini qaytaring
39 } // tugatish usuli binarySearch
40
41 // massivdagi ma'lum qiymatlarni chiqarish usuli
42 ta shaxsiy statik String qolgan elementlar(int[] maʼlumotlari, int low, int high)
43 {
44 StringBuilder vaqtinchalik = yangi StringBuilder();
45
46 // tekislash uchun bo'shliqlar qo'shing
47 uchun (int i = 0; i < past; i++)
48 temporary.append(" ");
49
50 // massivda qolgan elementlarni qo'shish
51 uchun (int i = past; i <= yuqori; i++)
52 temporary.append(data[i] + " ");
53
54 return String.format("%s%n", vaqtinchalik);
55 } // qolgan elementlarni tugatish usuli
56
57 umumiy statik bekor asosiy (String [] args)
58 {
59 Skaner kiritish = yangi Skaner(System.in);
60 SecureRandom generator = yangi SecureRandom();
61
62 int[] data = new int[15]; // massiv yaratish
63
64 uchun (int i = 0; i < data.length; i++) // massivni toʻldirish
65 ma'lumot[i] = 10 + generator.nextInt(90);
66
67
68 System.out.printf("%s%n%n", ); // massivni ko'rsatish
69
70 // foydalanuvchidan ma'lumot olish
71 System.out.print("Iltimos, butun son qiymatini kiriting (chiqish uchun -1): ");
72 int searchInt = input.nextInt();
73
19.3-rasm | Massivdagi elementni topish uchun ikkilik qidiruvdan foydalaning (chiqishdagi * belgisi o'rtani belgilaydi
element). (3 qismning 2-qismi.)

// agar element o'rtada topilsa


agar (kalit == ma'lumotlar [o'rta])
joylashuv = o'rta; // joylashuv - joriy o'rta
else if (key yuqori = o'rta - 1; // yuqori yarmini yo'q qiling
else // o'rta element juda past
past = o'rta + 1; // pastki yarmini yo'q qiling

o'rta = (past + yuqori + 1) / 2; // o'rtani qayta hisoblang


} while ((past <= baland) && (joy == -1));

Arrays.sort(ma'lumotlar); // binarySearch tartiblangan massivni talab qiladi


Arrays.toString(ma'lumotlar)

19.4 Ikkilik qidiruv 819

74 // butun sonni qayta-qayta kiritish; -1 dasturni tugatadi
75 vaqt (searchInt != -1)
76 {
77 // qidiruvni amalga oshiring
78 int joy = binarySearch(ma'lumotlar, searchInt);
79
80 agar (joylashuv == -1) // topilmadi
81 System.out.printf("%d topilmadi%n%n", searchInt);
Yana 82 ta // topildi
83 System.out.printf("%d%d%n%n pozitsiyasida topildi",
84 searchInt, joylashuv);
85
86 // foydalanuvchidan ma'lumot olish
87 System.out.print("Iltimos, butun son qiymatini kiriting (chiqish uchun -1): ");
88 searchInt = input.nextInt();
89 }
90 } // asosiyni tugatish
91 } // oxirgi sinf BinarySearchTest

[13, 18, 29, 36, 42, 47, 56, 57, 63, 68, 80, 81, 82, 88, 88]

Iltimos, butun sonni kiriting (chiqish uchun -1): 18
13 18 29 36 42 47 56 57 63 68 80 81 82 88 88
*
13 18 29 36 42 47 56
*
13 18 29
*
18 1-pozitsiyada topildi

Iltimos, butun sonni kiriting (chiqish uchun -1): 82


13 18 29 36 42 47 56 57 63 68 80 81 82 88 88
*
63 68 80 81 82 88 88
*
82 88 88
*
82
*
12-pozitsiyada 82 topildi

Iltimos, butun sonni kiriting (chiqish uchun -1): 69


13 18 29 36 42 47 56 57 63 68 80 81 82 88 88
*
63 68 80 81 82 88 88
*
63 68 80
*
80
*
69 topilmadi

Iltimos, butun sonni kiriting (chiqish uchun -1): -1

19.3-rasm | Massivdagi elementni topish uchun ikkilik qidiruvdan foydalaning (chiqishdagi * belgisi o'rtani belgilaydi
element). (3 qismning 3-qismi.)

820 19-bob Qidiruv, saralash va katta O



10–39 qatorlar massivni parametr sifatida qabul qiluvchi binarySearch usulini eʼlon qiladi.
qidirish (ma'lumotlar) va qidiruv tugmasi (kalit). 12-14-qatorlar past darajadagi indeksni, yuqori darajani hisoblab chiqadi
dastur hozirda izlayotgan massiv qismining indeksi va o‘rta indeksi.
Usulning boshida pastki uchi 0 ga teng, yuqori uchi massiv uzunligi
minus 1 va o'rtasi bu ikki qiymatning o'rtachasidir. 15-qator joylashuvni ishga tushiradi
elementning -1 ga - kalit topilmasa, qaytariladigan qiymat. 17–36 qatorlar
past darajasi yuqoridan kattaroq (bu kalit topilmaganda sodir bo'ladi) yoki joylashuvga qadar pastadir
-1 ga teng emas (kalit topilganligini bildiradi). 28-qator qiymatning ichida yoki yo'qligini tekshiradi
o'rta element kalitga teng. Agar shunday bo'lsa, 29-qator o'rtani joylashuvga, pastadirga tayinlaydi
tugatiladi va manzil qo'ng'iroq qiluvchiga qaytariladi. Loopning har bir iteratsiyasi bittasini tekshiradi
qiymat (28-satr) va massivdagi qolgan qiymatlarning yarmini (31 yoki 33-qator) yo'q qiladi, agar
qiymat kalit emas.
19.4.2 Ikkilik qidiruvning samaradorligi
Eng yomon stsenariyda 1023 ta elementdan iborat tartiblangan massivni qidirish uchun atigi 10 ta taqqoslash kerak bo'ladi.
ikkilik qidiruvdan foydalanganda isonlar. 1023 ni qayta-qayta 2 ga bo'lish (chunki har bir raqamdan keyin
parison biz massivning yarmini yo'q qilishimiz mumkin) va yaxlitlash (chunki biz ham olib tashlaymiz
o'rta element) 511, 255, 127, 63, 31, 15, 7, 3, 1 va 0 qiymatlarini beradi. Raqam
0 qiymatini olish uchun 1023 (210 - 1) 2 ga faqat 10 marta bo'linadi, bu borligini ko'rsatadi.
sinov uchun boshqa elementlar yo'q. 2 ga bo'lish binarda bitta taqqoslashga teng
qidiruv algoritmi. Shunday qilib, 1 048 575 (220 - 1) elementdan iborat massiv maksimal 20 tani oladi.
kalitni topish uchun taqqoslash va bir milliarddan ortiq elementlardan iborat massiv maksimal miqdorni oladi
Kalitni topish uchun 30 ta taqqoslash. Bu ishlashda sezilarli yaxshilanishdir
chiziqli qidiruv. Bir milliard elementli massiv uchun bu o'rtacha qiymat o'rtasidagi farq
chiziqli qidiruv uchun 500 million taqqoslash va ko'pi bilan 30 ta taqqoslash
ikkilik qidiruv uchun! Ikkilik qidiruv uchun maksimal taqqoslashlar soni
har qanday tartiblangan massivning soni 2 ning birinchi darajasining ko'rsatkichi sonidan kattadir
log2 n sifatida ifodalangan massivdagi elementlar. Barcha logarifmlar taxminan o'sadi
bir xil stavka, shuning uchun katta O belgisida bazani o'tkazib yuborish mumkin. Buning natijasida O ning katta O (log
n) logarifmik ish vaqti deb ham ataladigan va shunday talaffuz qilinadigan ikkilik qidiruv uchun
“buyurtma jurnali n.”
19.5 Saralash algoritmlari
Ma'lumotlarni saralash (ya'ni, ma'lumotlarni o'sish yoki pasayish kabi ma'lum bir tartibda joylashtirish
scending) eng muhim hisoblash ilovalaridan biridir. Bank barcha cheklarni saralaydi
hisob raqami, shunda u har birining oxirida alohida bank ko'chirmalarini tayyorlashi mumkin
oy. Telefon kompaniyalari o'z hisoblari ro'yxatini familiyasi bo'yicha, keyin esa birinchi bo'yicha tartiblaydilar
telefon raqamlarini topishni osonlashtirish uchun nom. Deyarli har bir tashkilot bir oz saralashi kerak
ma'lumotlar va ko'pincha uning katta miqdori. Ma'lumotlarni saralash qiziqarli, kompyuterni talab qiladi
qizg'in tadqiqot harakatlariga sabab bo'lgan muammo.
Saralash haqida tushunish kerak bo'lgan muhim narsa - bu yakuniy natija - tartiblangan
massiv - massivni saralash uchun qaysi algoritmdan foydalansangiz ham bir xil bo'ladi. Tanlov
Algoritm faqat dasturning ishlash vaqti va xotirasidan foydalanishga ta'sir qiladi. Buning qolganlari
bobda uchta umumiy tartiblash algoritmlari keltirilgan. Birinchi ikkita - tanlash tartiblash va
kiritish tartibi - dasturlash oson, lekin samarasiz. Oxirgi algoritm - birlashtirish tartibi -

19.6 Tanlash tartibi 821

saralash va qo'shishni saralashdan ko'ra tezroq, lekin dasturlash qiyinroq. Biz e'tiborni qaratamiz
ibtidoiy turdagi ma'lumotlar massivlarini saralash, ya'ni ints. Sinf obyektlarining massivlarini saralash mumkin
shuningdek, biz 16.7.1-bo'limda o'rnatilgan saralash imkoniyatlaridan foydalangan holda ko'rsatdik.
Collections API.
19.6 Tanlash tartibi
Tanlash tartibi oddiy, ammo samarasiz, tartiblash algoritmidir. Agar ortib saralayotgan bo'lsangiz
tartib, uning birinchi iteratsiyasi massivdagi eng kichik elementni tanlaydi va uni birinchisi bilan almashtiradi
element. Ikkinchi iteratsiya ikkinchi eng kichik elementni (eng kichik element) tanlaydi
qolgan elementlardan) va uni ikkinchi element bilan almashtiradi. Algoritm davom etadi
Oxirgi iteratsiya ikkinchi eng katta elementni tanlamaguncha va uni ikkinchi elementga almashtirguncha.
oxirgi indeks, oxirgi indeksdagi eng katta elementni qoldirib. I-iteratsiyadan keyin eng kichigi
massivning i elementlari massivning birinchi i elementlarida ortib boruvchi tartibda tartiblanadi.
Misol sifatida, massivni ko'rib chiqing

Tanlovni saralashni amalga oshiradigan dastur birinchi navbatda uning eng kichik elementini (4) aniqlaydi


2-indeksda joylashgan massiv. Dastur 4 ni 34 ga almashtiradi, natijada

Keyin dastur qolgan elementlarning eng kichik qiymatini aniqlaydi (barcha elementlar


4 bundan mustasno), bu 5, indeks 8da joylashgan. Dastur 5 ni 56 ga almashtiradi, natijada

Uchinchi iteratsiyada dastur keyingi eng kichik qiymatni (10) aniqlaydi va uni almashtiradi


34 bilan.

Jarayon massiv to'liq saralanmaguncha davom etadi.

Birinchi iteratsiyadan keyin eng kichik element birinchi holatda. Ikkinchi takrorlashdan keyin -
ion, ikkita eng kichik element birinchi ikkita pozitsiyada tartibda. Uchinchidan keyin -
eratsiya, uchta eng kichik element birinchi uchta pozitsiyada joylashgan.
19.6.1 Tanlash tartibini amalga oshirish
Class SelectionSortTest (19.4-rasm) quyidagilarni o'z ichiga oladi:
• statik usul tanlash. Int massivini saralash algoritmi yordamida saralash.
ritm
• massivning ikkita elementi qiymatlarini almashtirish uchun statik usul almashtirish
• har bir o'tishdan keyin massiv tarkibini ko'rsatish uchun printPass statik usuli va
• asosiydan test usulini tanlashga saralash.
Qidiruv misollarida bo'lgani kabi, main (57-72 qatorlar) ma'lumotlar va deb nomlangan ints qatorini yaratadi.
uni 10-99 oralig'ida tasodifiy ints bilan to'ldiradi. 68-qator test usulini tanlashSort.

34 56 4 10 77 51 93 30 5 52

4 56 34 10 77 51 93 30 5 52

4 5 34 10 77 51 93 30 56 52

4 5 10 34 77 51 93 30 56 52

4 5 10 30 34 51 52 56 77 93


822 19-bob Qidiruv, saralash va katta O

1 // 19.4-rasm: SelectionSortTest.java
2 // massivni saralash bilan saralash.
3 import java.security.SecureRandom;
4 import java.util.Arrays;
5
6 ommaviy sinf SelectionSortTest
7 {
8 // massivni saralash orqali saralash
9
10 {
11 // data.length ustidan sikl - 1 element
12 uchun (int i = 0; i < data.length - 1; i++)
13 {
14 int eng kichik = i; // qolgan massivning birinchi indeksi
15
16 // eng kichik element indeksini topish uchun tsikl
17 uchun (int indeks = i + 1; indeks < data.length; indeks++)
18 agar (ma'lumotlar[indeks] 19 eng kichik = indeks;
20
21
22 printPass(i + 1, eng kichik); // algoritmning chiqishi
23 }
24 } // tugatish usulini tanlashSort
25
26 // ikki elementdagi qiymatlarni almashtirish uchun yordamchi usul
27
28 {
29 int temporary = data[birinchi]; // birinchi navbatda vaqtincha saqlash
30 ma'lumot[birinchi] = ma'lumotlar[ikkinchi]; // birinchisini ikkinchisiga almashtiring
31 ma'lumot[soniya] = vaqtinchalik; // vaqtinchalik ikkinchi o'ringa qo'ying
32 }
33
34 // algoritmning o'tishini chop etish
35 shaxsiy statik bekor printPass (int[] ma'lumotlari, int pass, int indeksi)
36 {
37 System.out.printf("%2d o'tgandan keyin: ", o'tish);
38
39 // tanlangan elementgacha chiqadigan elementlar
40 uchun (int i = 0; i < indeks; i++)
41 System.out.printf("%d ", ma'lumotlar[i]);
42
43 System.out.printf("%d* ", ma'lumotlar[indeks]); // almashtirishni ko'rsating
44
45 // massivni chiqarishni tugatish
46 uchun (int i = indeks + 1; i < data.length; i++)
47 System.out.printf("%d ", ma'lumotlar[i]);
48
49 System.out.printf("%n "); // moslashtirish uchun
50
51 // tartiblangan massiv miqdorini bildiradi
52 uchun (int j = 0; j < pass; j++)
53 System.out.print("-- ");

19.4-rasm | Tanlangan saralash bilan massivni saralash. (2-qismning 1-qismi.)

umumiy statik bekor tanloviSort(int[] maʼlumotlari)

almashtirish (ma'lumotlar, i, eng kichik); // eng kichik elementni joyiga almashtiring

xususiy statik bekor almashtirish (int[] ma'lumotlar, int birinchi, int soniya)

19.6 Tanlash tartibi 823

Usullarni tanlash Saralash va almashtirish
9–24 qatorlar tanlashSort usulini e'lon qiladi. 12-23 qatorlar halqa ma'lumotlari.uzunligi - 1 marta.
14-qator eng kichik o'zgaruvchini e'lon qiladi va ishga tushiradi (joriy indeks i ga)
qolgan massivdagi eng kichik element indeksi. 17-19-qatorlar qaytadan o'raladi.
massivdagi asosiy elementlar. Ushbu elementlarning har biri uchun 18-qator uning qiymatini taqqoslaydi
eng kichik elementning qiymati. Agar joriy element eng kichik elementdan kichik bo'lsa,
ment, 19-qator joriy element indeksini eng kichigiga belgilaydi. Ushbu tsikl tugagach,

54 System.out.println();


55 }
56
57 umumiy statik bekor asosiy (String [] args)
58 {
59 SecureRandom generator = yangi SecureRandom();
60
61 int[] data = new int[10]; // massiv yaratish
62
63 uchun (int i = 0; i < data.length; i++) // massivni toʻldirish
64 ma'lumot[i] = 10 + generator.nextInt(90);
65
66 System.out.printf("Tartiblanmagan massiv:%n%s%n%n",
67 Arrays.toString(ma'lumotlar)); // massivni ko'rsatish
68
69
70 System.out.printf("Tartiblangan massiv:%n%s%n%n",
71 Arrays.toString(ma'lumotlar)); // massivni ko'rsatish
72 }
73 } // yakuniy sinf SelectionSortTest

Saralanmagan massiv:


[40, 60, 59, 46, 98, 82, 23, 51, 31, 36]

1-o'tishdan keyin: 23 60 59 46 98 82 40* 51 31 36


--
2-o‘tishdan keyin: 23 31 59 46 98 82 40 51 60* 36
-- --
3-o'tishdan keyin: 23 31 36 46 98 82 40 51 60 59*
-- -- --
4-o'tishdan keyin: 23 31 36 40 98 82 46* 51 60 59
-- -- -- --
5-o'tishdan keyin: 23 31 36 40 46 82 98* 51 60 59
-- -- -- -- --
6-o'tishdan keyin: 23 31 36 40 46 51 98 82* 60 59
-- -- -- -- -- --
7-o'tishdan keyin: 23 31 36 40 46 51 59 82 60 98*
-- -- -- -- -- -- --
8-o‘tgandan keyin: 23 31 36 40 46 51 59 60 82* 98
-- -- -- -- -- -- -- --
9 o'tgandan keyin: 23 31 36 40 46 51 59 60 82* 98
-- -- -- -- -- -- -- -- --
Saralangan massiv:
[23, 31, 36, 40, 46, 51, 59, 60, 82, 98]

19.4-rasm | Tanlangan saralash bilan massivni saralash. (2-qismning 2-qismi.)

tanlashSort(ma'lumotlar); // massivni tartiblash

824 19-bob Qidiruv, saralash va katta O

eng kichiki qolgan massivdagi eng kichik element indeksini o'z ichiga oladi. 21-qator
Qolgan eng kichik elementni keyingi yoki-ga joylashtirish uchun almashtirish usulini chaqiradi (27-32-qatorlar).
massivdagi dered nuqta.
PrintPass usullari
PrintPass usulining chiqishi tirelardan (52–53-qatorlar) foydalanadi.
har bir o'tishdan keyin tartiblangan massiv. Yulduzcha elementning joylashuvi yonida joylashgan
bu dovondagi eng kichik element bilan almashtirildi. Har bir o'tishda keyingi element
yulduzcha (43-satrda ko'rsatilgan) va eng o'ngdagi chiziqchalar to'plamining ustidagi element
almashtirildi.
19.6.2 Tanlashning samaradorligi
Tanlovni saralash algoritmi O(n2) vaqtida ishlaydi. Usul tanlashSart (9–24-qatorlar)
ikkita for loopni o'z ichiga oladi. Tashqi qismi (12–23-qatorlar) birinchi n – 1 element ustida takrorlanadi
massivda qolgan eng kichik elementni tartiblangan joyiga almashtirish. Ichki halqa
(17–19-qatorlar) qolgan massivdagi har bir elementni takrorlaydi va eng kichik elementni qidiradi.
ment. Bu tsikl tashqi tsiklning birinchi iteratsiyasida n – 1 marta bajariladi, n – 2
marta ikkinchi takrorlashda, keyin n – 3, …, 3, 2, 1. Bu ichki tsikl jami takrorlanadi.
n(n – 1)/2 yoki (n2 – n)/2. Big O notatsiyasida kichikroq atamalar tushib ketadi va doimiylar bo'ladi
e'tiborsiz qoldirib, O(n2) ning Katta O ni qoldirdi.
19.7 Qo'shish tartibi
Qo'shishni saralash yana bir oddiy, ammo samarasiz tartiblash algoritmidir. Buning birinchi iteratsiyasi
algoritm massivdagi ikkinchi elementni oladi va agar u birinchi elementdan kichik bo'lsa, almashtiriladi
u birinchi element bilan. Ikkinchi iteratsiya uchinchi elementga qaraydi va uni kiritadi
birinchi ikkitasiga nisbatan to'g'ri pozitsiya, shuning uchun barcha uchta element tartibda. Da
Ushbu algoritmning birinchi iteratsiyasida asl massivdagi birinchi i elementlar tartiblanadi.
Misol sifatida quyidagi massivni ko'rib chiqaylik, u bilan bir xil
saralash va birlashtirish bo'yicha muhokamalar.

Qo'shishni tartiblash algoritmini amalga oshiradigan dastur birinchi navbatda dastlabki ikkita elementni ko'rib chiqadi.


massivning mentlari, 34 va 56. Ular allaqachon tartibda, shuning uchun dastur davom etadi. (Agar
ular ishlamay qolgan edi, dastur ularni almashtiradi.)
Keyingi iteratsiyada dastur uchinchi qiymatga qaraydi, 4. Bu qiymat kichikroq
56, shuning uchun dastur 4 ni vaqtinchalik o'zgaruvchida saqlaydi va 56 bitta elementni o'ngga siljitadi.
Keyin dastur tekshiradi va 4 ning 34 dan kichik ekanligini aniqlaydi, shuning uchun u 34 ta elementni harakatga keltiradi
O'ngga. Dastur endi massivning boshiga yetdi, shuning uchun u 4 ni qo'yadi
nolinchi element. Massiv hozir

Keyingi iteratsiyada dastur 10 ni vaqtinchalik o'zgaruvchida saqlaydi. Keyin 10 ni taqqoslaydi


56 ga va 56 ni bitta elementni o'ngga siljitadi, chunki u 10 dan katta. Keyin dastur
10 ni 34 ga solishtiradi, 34 ta o'ngga bitta elementni siljitadi. Dastur 10 dan 4 gacha taqqoslaganda,
u 10 ning 4 dan katta ekanligini va 10 ni 1 elementga qo'yishini kuzatadi. Endi massiv

34 56 4 10 77 51 93 30 5 52

4 34 56 10 77 51 93 30 5 52

4 10 34 56 77 51 93 30 5 52


19.7 Qo'shish tartibi 825

Ushbu algoritmdan foydalanib, i-iteratsiyada asl massivning birinchi i elementlari saralanadi,
lekin ular oxirgi joylarida bo'lmasligi mumkin - kichikroq qiymatlar keyinchalik massivda joylashgan bo'lishi mumkin.
19.7.1 Qo'shishni saralashni amalga oshirish
Class InsertionSortTest (19.5-rasm) quyidagilarni o'z ichiga oladi:
• statik usul insertionSort qo'shishni tartiblash algoritmi yordamida intlarni saralash
• har bir o'tishdan keyin massiv tarkibini ko'rsatish uchun printPass statik usuli va
• insertionSort test usuliga asosiy.
Asosiy usul (53–68-qatorlar) 19.4-rasmdagi asosiy bilan bir xil, bundan tashqari 64-qatorni chaqirish usuli
insertionSort.

1 // 19.5-rasm: InsertionSortTest.java


2 // Kiritilgan saralash bilan massivni saralash.
3 import java.security.SecureRandom;
4 import java.util.Arrays;
5
6 ommaviy sinf InsertionSortTest
7 {
8 // qo'shish tartibidan foydalanib massivni tartiblash
9
10 {
11 // data.length ustidan sikl - 1 element
12
13 {
14
15
16
17
18
19
20
21
22
23
24
25
26 printPass (ma'lumotlar, keyingi, ko'chirish elementi); // algoritmning chiqishi
27 }
28 }
29
30 // algoritmning o'tishini chop eting
31 ommaviy statik bekor printPass(int[] maʼlumotlari, int pass, int indeksi)
32 {
33 System.out.printf("%2d o'tgandan keyin: ", o'tish);
34
35 // almashtirilgan elementgacha chiqadigan elementlar
36 uchun (int i = 0; i < indeks; i++)
37 System.out.printf("%d ", ma'lumotlar[i]);

19.5-rasm | Kiritilgan tartib bilan massivni saralash. (3-qismning 1-qismi.)

umumiy statik bekor kiritishSort(int[] maʼlumotlari)

uchun (int keyingi = 1; keyingi < data.length; keyingi++)

int insert = data[keyingi]; // kiritish uchun qiymat
int moveItem = keyingi; // elementni joylashtirish uchun joy

// joriy elementni qo'yish joyini qidiring


esa (moveItem > 0 && data[moveItem - 1] > qo‘shish)
{
// elementni o'ngga bir uyaga siljitish
data[moveItem] = data[moveItem - 1];
ko'chirish--;
}

data[moveItem] = kiritish; // kiritilgan elementni joylashtiring


826 19-bob Qidiruv, saralash va katta O

38
39 System.out.printf("%d* ", ma'lumotlar[indeks]); // almashtirishni ko'rsating
40
41 // massivni chiqarishni tugatish
42 uchun (int i = indeks + 1; i < data.length; i++)
43 System.out.printf("%d ", ma'lumotlar[i]);
44
45 System.out.printf("%n "); // moslashtirish uchun
46
47 // tartiblangan massiv miqdorini ko'rsatadi
48 for(int i = 0; i <= pass; i++)
49 System.out.print("-- ");
50 System.out.println();
51 }
52
53 ta umumiy statik bekor asosiy(String[] args)
54 {
55 SecureRandom generator = yangi SecureRandom();
56
57 int[] data = new int[10]; // massiv yaratish
58
59 uchun (int i = 0; i < data.length; i++) // massivni toʻldirish
60 ma'lumot[i] = 10 + generator.nextInt(90);
61
62 System.out.printf("Tartiblanmagan massiv:%n%s%n%n",
63 Arrays.toString(ma'lumotlar)); // massivni ko'rsatish
64
65
66 System.out.printf("Tartiblangan massiv:%n%s%n%n",
67 Arrays.toString(ma'lumotlar)); // massivni ko'rsatish
68 }
69 } // oxirgi sinf InsertionSortTest

Saralanmagan massiv:


[34, 96, 12, 87, 40, 80, 16, 50, 30, 45]

1-o'tishdan keyin: 34 96* 12 87 40 80 16 50 30 45


-- --
2-o'tishdan keyin: 12* 34 96 87 40 80 16 50 30 45
-- -- --
3-o'tishdan keyin: 12 34 87* 96 40 80 16 50 30 45
-- -- -- --
4-o'tishdan keyin: 12 34 40* 87 96 80 16 50 30 45
-- -- -- -- --
5-o'tishdan keyin: 12 34 40 80* 87 96 16 50 30 45
-- -- -- -- -- --
6-o'tishdan keyin: 12 16* 34 40 80 87 96 50 30 45
-- -- -- -- -- -- --
7 o'tgandan keyin: 12 16 34 40 50* 80 87 96 30 45
-- -- -- -- -- -- -- --
8-o'tishdan keyin: 12 16 30* 34 40 50 80 87 96 45
-- -- -- -- -- -- -- -- --

19.5-rasm | Kiritilgan tartib bilan massivni saralash. (3 qismning 2-qismi.)

insertionSort(ma'lumotlar); // massivni tartiblash

19.8 827 ni birlashtirish



Tartibga kiritish usuli
9–28 qatorlar insertionSort usulini e'lon qiladi. 12–27 satrlar maʼlumotlar boʻylab aylanish. uzunlik - 1
massivdagi elementlar. Har bir iteratsiyada 14-satr o'zgarmaydigan qo'shishni e'lon qiladi va ishga tushiradi
massivning tartiblangan qismiga kiritiladigan element qiymatini saqlaydi.
15-qator qayerga qo'yish kerakligini kuzatib boradigan moveItem o'zgaruvchisini e'lon qiladi va ishga tushiradi.
element. Element bo'lishi kerak bo'lgan to'g'ri pozitsiyani aniqlash uchun 18-23 qatorlar pastadir
kiritilgan. Dastur massivning old qismiga etib kelganida ham tsikl tugaydi
yoki u kiritiladigan qiymatdan kichikroq elementga yetganda. 21-qator a harakat qiladi
massivning o'ng tomonidagi element va 22-satr qo'shiladigan joyni pasaytiradi
keyingi element. Loop tugagandan so'ng, 25-qator elementni joyiga qo'yadi.
PrintPass usuli
PrintPass usulining chiqishi (31–51-qatorlar) qismni koʻrsatish uchun tirelardan foydalanadi.
har bir o'tishdan keyin tartiblangan massiv. Yulduzcha kiritilgan elementning yoniga qo'yiladi -
o'sha dovonda o'z joyiga qo'yildi.
19.7.2 Qo'shish tartibining samaradorligi
Qo'shishni tartiblash algoritmi O(n2) vaqtida ham ishlaydi. Tanlov kabi, amalga oshirish-
kiritish tartibi (9–28-qatorlar) ikkita halqadan iborat. For tsikli (12–27-qatorlar) takrorlanadi
data.length - 1 marta, elementlardagi tegishli joyga elementni kiritish
hozirgacha tartiblangan. Ushbu ilova maqsadlari uchun data.length - 1 n – 1 ga ekvivalentdir
(ma'lumotlar.length massivning o'lchami sifatida). while tsikli (18–23-qatorlar) ustida takrorlanadi
massivdagi oldingi elementlar. Eng yomon holatda, bu while sikli uchun n – 1 kom-
parizonlar. Har bir alohida tsikl O(n) vaqtida ishlaydi. Big O notatsiyasida ichki o'rnatilgan halqalar ma'nosini anglatadi
taqqoslash sonini ko'paytirish kerak. Tashqi halqaning har bir iteratsiyasi uchun,
ichki pastadirning ma'lum miqdordagi iteratsiyasi bo'ladi. Ushbu algoritmda har biri uchun
Tashqi halqaning O(n) iteratsiyasi, ichki halqaning O(n) iteratsiyasi bo'ladi. Ko'paytirish -
Bu qiymatlar O(n2) ning Katta O ga olib keladi.
19.8 Birlashtirish tartibi
Birlashtirish saralash samarali saralash algoritmidir, lekin konseptual jihatdan tanlashga qaraganda murakkabroq
saralash va kiritish tartibi. Birlashtirish tartiblash algoritmi massivni ikkiga bo'lish orqali tartiblaydi
teng o'lchamdagi pastki qatorlar, har bir pastki qatorlarni saralash, keyin ularni bitta katta massivga birlashtirish. Bilan
toq sonli elementlar bo'lsa, algoritm ikkita pastki qatorni shunday yaratadiki, bittasi bitta bo'ladi
boshqasiga qaraganda ko'proq element.
Ushbu misolda birlashtirish tartibini amalga oshirish rekursivdir. Asosiy holat - bu
bir elementli massiv, albatta, tartiblangan, shuning uchun birlashma tartiblash darhol qaytadi
Ushbu holatda. Rekursiya bosqichi massivni taxminan ikkita teng bo'lakka bo'ladi, takrorlash -
ularni asta-sekin saralaydi, so'ngra ikkita tartiblangan massivni bitta kattaroq, tartiblangan massivga birlashtiradi.

9-o'tishdan keyin: 12 16 30 34 40 45* 50 80 87 96


-- -- -- -- -- -- -- -- -- --
Saralangan massiv:
[12, 16, 30, 34, 40, 45, 50, 80, 87, 96]

19.5-rasm | Kiritilgan tartib bilan massivni saralash. (3 qismning 3-qismi.)


828 19-bob Qidiruv, saralash va katta O

Aytaylik, algoritm kichikroq massivlarni birlashtirib, tartiblangan A massivlarini yaratdi:

va B:


Birlashtirish tartibi bu ikki massivni bitta kattaroq, tartiblangan massivga birlashtiradi. Eng kichik element
A da 4 (A ning nolinchi indeksida joylashgan). B dagi eng kichik element 5 ga teng (
B ning nolinchi indeksi). Katta massivdagi eng kichik elementni aniqlash uchun al-
goritm 4 va 5 ni taqqoslaydi. A dan qiymat kichikroq, shuning uchun 4 birinchi elementga aylanadi.
birlashtirilgan massiv. Algoritm 10 ni (A ning ikkinchi elementi) bilan solishtirish orqali davom etadi
5 (B ning birinchi elementi). B dan qiymat kichikroq, shuning uchun 5 ikkinchi elementga aylanadi
katta massivda. Algoritm 10 ga 30 ni solishtirishda davom etadi, 10 ga aylanadi
massivdagi uchinchi element va boshqalar.
19.8.1 Birlashtirish tartibini amalga oshirish
19.6-rasmda MergeSortTest klassi e'lon qilinadi, unda quyidagilar mavjud:
• birlashtirish yordamida int massivini saralashni boshlash uchun mergeSort statik usuli
tartiblash algoritmi
• rekursiv birlashma tartiblash algoritmini bajarish uchun sortArray statik usuli—bu
mergeSort usuli bilan chaqiriladi
• ikkita tartiblangan pastki qatorni bitta tartiblangan pastki qatorga birlashtirish uchun statik usul birlashtirish
• subarrayString statik usuli uchun pastki qatorning String tasvirini olish
chiqish maqsadlari va
• main to test usuli mergeSort.
Asosiy usul (101–116-qatorlar) shakldagi asosiy bilan bir xil. 112-qatordan tashqari 19.4–19.5
qo'ng'iroqlar usuli mergeSort. Ushbu dasturning chiqishi har biriga bo'linish va birlashmalarni ko'rsatadi.
algoritmning har bir bosqichida tartiblash jarayonini ko'rsatuvchi birlashtirib tartiblash orqali hosil qilingan. Bu
Ushbu oqlangan saralashni to'liq tushunish uchun ushbu natijalarni ko'rib chiqishga vaqt ajratishga arziydi
algoritm.

4 10 34 56 77

5 30 51 52 93

1 // 19.6-rasm: MergeSortTest.java


2 // massivni birlashtirish bilan tartiblash.
3 import java.security.SecureRandom;
4 import java.util.Arrays;
5
6 ommaviy sinf MergeSortTest
7 {
8 // birlashtirishni saralashni boshlash uchun rekursiv ajratish usulini chaqiradi
9 umumiy statik bekor birlashmaSort(int[] maʼlumotlari)
10 {
11 sortArray(ma'lumotlar, 0, ma'lumotlar.uzunligi - 1); // butun massivni tartiblash
12 } // tugatish usuli saralash
13

19.6-rasm | Birlashtirish tartibi bilan massivni saralash. (5-qismning 1-qismi.)


19.8 Saralash 829 ni birlashtirish

14 // massivni ajratadi, pastki massivlarni saralaydi va pastki massivlarni tartiblangan massivga birlashtiradi
15 ta xususiy statik bekor sortArray(int[] ma'lumotlar, int past, int yuqori)
16 {
17 // test bazasi; massiv hajmi 1 ga teng
18 agar ((yuqori - past) >= 1) // asosiy registr bo'lmasa
19 {
20 int middle1 = (past + yuqori) / 2; // massivning o'rtasini hisoblash
21 int o'rta2 = o'rta1 + 1; // keyingi elementni hisoblang
22
23 // chiqishni ajratish bosqichi
24 System.out.printf("bo'lingan: %s%n",
25 subarrayString(ma'lumotlar, past, yuqori));
26 System.out.printf("%s%n",
27 subarrayString(ma'lumotlar, past, o'rta1));
28 System.out.printf("%s%n%n",
29 subarrayString(ma'lumotlar, o'rta2, yuqori));
30
31 // massivni yarmiga bo'lish; har bir yarmini tartiblash (rekursiv qo'ng'iroqlar)
32 sortArray(ma'lumotlar, past, o'rta1); // massivning birinchi yarmi
33 sortArray(ma'lumotlar, o'rta2, yuqori); // massivning ikkinchi yarmi
34
35 // ajratilgan qo'ng'iroqlar qaytgandan so'ng ikkita tartiblangan massivni birlashtiring
36 birlashtirish (ma'lumotlar, past, o'rta1, o'rta2, yuqori);
37 } // tugatish agar
38 } // end usuli sortArray
39
40 // ikkita tartiblangan pastki qatorni bitta tartiblangan pastki qatorga birlashtiring
41 shaxsiy statik bekor birlashma (int[] ma'lumotlar, int chap, int middle1,
42 int middle2, int o'ng)
43 {
44 int leftIndex = chap; // chap pastki qatorga indeks
45 int rightIndex = Middle2; // o'ng pastki qatorga indeks
46 int CombinedIndex = chap; // vaqtinchalik ishchi massivga indeks
47 int[] birlashtirilgan = new int[data.length]; // ishchi massiv
48
49 // birlashtirishdan oldin ikkita pastki qatorni chiqaring
50 System.out.printf("birlashtirish: %s%n",
51 subarrayString(ma'lumotlar, chap, o'rta1));
52 System.out.printf("%s%n",
53 subarrayString(ma'lumotlar, o'rta2, o'ng));
54
55 // massivlarni ikkalasining oxirigacha birlashtiring
56 esa (leftIndex <= middle1 && rightIndex <= o'ng)
57 {
58 // natijaga ikkita joriy elementdan kichigini qo'ying
59 // va massivlardagi keyingi bo'sh joyga o'ting
60 agar (ma'lumotlar[leftIndex] <= ma'lumotlar[rightIndex])
61 birlashtirilgan[combinedIndex++] = data[leftIndex++];
yana 62
63 birlashtirilgan[combinedIndex++] = data[rightIndex++];
64 }
65

19.6-rasm | Birlashtirish tartibi bilan massivni saralash. (5-qismning 2-qismi.)


830 19-bob Qidiruv, saralash va katta O

66 // agar chap massiv bo'sh bo'lsa
67 agar (leftIndex == Middle2)
68 // o'ng qatorning qolgan qismiga nusxalash
69 esa (o'ng indeks <= o'ngda)
70 birlashtirilgan[combinedIndex++] = data[rightIndex++];
71 else // o'ng qator bo'sh
72 // chap massivning qolgan qismiga nusxalash
73 esa (leftIndex <= middle1)
74 birlashtirilgan[combinedIndex++] = data[leftIndex++];
75
76 // qiymatlarni asl massivga nusxalash
77 uchun (int i = chap; i <= o'ng; i++)
78 ma'lumotlar[i] = birlashtirilgan[i];
79
80 // birlashtirilgan massivni chiqarish
81 System.out.printf(" %s%n%n",
82 subarrayString(ma'lumotlar, chap, o'ng));
83 } // tugatish usulini birlashtirish
84
85 // massivdagi ma'lum qiymatlarni chiqarish usuli
86 xususiy statik String subarrayString(int[] maʼlumotlari, int low, int high)
87 {
88 StringBuilder vaqtinchalik = yangi StringBuilder();
89
90 // tekislash uchun chiqish joylari
91 uchun (int i = 0; i < past; i++)
92 temporary.append(" ");
93
94 // massivda qolgan chiqish elementlari
95 uchun (int i = past; i <= yuqori; i++)
96 temporary.append(" " + data[i]);
97
98 qaytish temporary.toString();
99 }
100
101 umumiy statik bekor asosiy(String[] args)
102 {
103 SecureRandom generator = yangi SecureRandom();
104
105 int[] ma'lumotlar = new int[10]; // massiv yaratish
106
107 uchun (int i = 0; i < data.length; i++) // massivni toʻldirish
108 ma'lumot[i] = 10 + generator.nextInt(90);
109
110 System.out.printf("Tartiblanmagan massiv:%n%s%n%n",
111 Arrays.toString(ma'lumotlar)); // massivni ko'rsatish
112
113
114 System.out.printf("Tartiblangan massiv:%n%s%n%n",
115 Arrays.toString(ma'lumotlar)); // massivni ko'rsatish
116 }
117 } // tugatish sinfi MergeSortTest

19.6-rasm | Birlashtirish tartibi bilan massivni saralash. (5-qismning 3-qismi.)

mergeSort(ma'lumotlar); // massivni tartiblash

19.8 831 ni birlashtirish

Saralanmagan massiv:
[75, 56, 85, 90, 49, 26, 12, 48, 40, 47]
ajratilgan: 75 56 85 90 49 26 12 48 40 47
75 56 85 90 49
26 12 48 40 47
bo'linish: 75 56 85 90 49
75 56 85
90 49
bo'linish: 75 56 85
75 56
85
bo'linish: 75 56
75
56
Birlashtirish: 75
56
56 75
birlashma: 56 75
85
56 75 85
bo'linish: 90 49
90
49
Birlashtirish: 90
49
49 90
birlashtirish: 56 75 85
49 90
49 56 75 85 90
bo'linish: 26 12 48 40 47
26 12 48
40 47
bo'linish: 26 12 48
26 12
48
bo'linish: 26 12
26
12
Birlashtirish: 26
12
12 26
birlashtirish: 12 26
48
12 26 48
bo'linish: 40 47
40
47

19.6-rasm | Birlashtirish tartibi bilan massivni saralash. (5-qismning 4-qismi.)


832 19-bob Qidiruv, saralash va katta O

Birlashtirish usuli.Sort
19.6-rasmning 9-12-qatorlari mergeSort usulini e'lon qiladi. 11-qator sortArray usulini chaqiradi
0 va data.length - 1 argument sifatida - boshi va oxiriga mos keladi-
navbati bilan tartiblanadigan massiv indekslari. Bu qiymatlar sortArray usulini aytadi
butun massivda ishlash.
SortArray usuli
SortArray rekursiv usuli (15–38-qatorlar) rekursiv birlashma tartiblash algoritmini bajaradi.
18-qator asosiy holatni sinab ko'radi. Agar massivning o'lchami 1 bo'lsa, massiv allaqachon tartiblangan, shuning uchun
usul darhol qaytadi. Agar massivning o'lchami 1 dan katta bo'lsa, usul ikkiga bo'linadi
massiv ikkiga bo'lib, ikkita pastki qatorni saralash uchun sortArray usulini rekursiv chaqiradi, so'ngra birlashtiradi
ular. 32-qator massivning birinchi yarmida sortArray usulini va qatorni rekursiv chaqiradi.
33 ikkinchi yarmida sortArray usulini rekursiv chaqiradi. Bu ikki usul chaqirilganda
qaytish, massivning har bir yarmi tartiblangan. 36-qator qo'ng'iroqlarni birlashtirish usuli (41-83-qatorlar)
ikkita tartiblangan massivni bitta kattaroq tartiblangan massivga birlashtirish uchun massivning ikki yarmida.
Birlashtirish usuli
41-83 qatorlar birlashish usulini e'lon qiladi. 56–64 qatorlar birlashma tsiklidagi har ikkala pastki qismning oxirigacha
massivga erishildi. 60-qator massivlar boshida qaysi element kichikroq ekanligini tekshiradi. Agar
chap massivdagi element kichikroq, 61-satr uni birlashtirilgan massivdagi joyiga qo'yadi.
Agar o'ng massivdagi element kichikroq bo'lsa, 63-qator uni birlashtirilgan joyga qo'yadi
massiv. while tsikli tugagach, bitta butun pastki qator qo'shiladi.
bog'langan massiv, lekin boshqa pastki qator hali ham ma'lumotlarni o'z ichiga oladi. 67-qator chap massivni tekshiradi
oxiriga yetdi. Agar shunday bo'lsa, 69-70 qatorlar birlashtirilgan massivni elementlari bilan to'ldiradi
o'ng qator. Agar chap massiv oxiriga yetmagan bo'lsa, o'ng massiv yetib kelgan bo'lishi kerak
oxiri va 73-74 qatorlar birlashtirilgan massivni chap massivning elementlari bilan to'ldiradi. Nihoyat,
77-78 qatorlar birlashtirilgan massivni asl massivga ko'chiradi.
19.8.2 Birlashtirish tartibining samaradorligi
Birlashtirish saralash qo'shish yoki tanlashga qaraganda ancha samarali. Birinchisini ko'rib chiqing (bo'lmagan
rekursiv) sortArray ga qo'ng'iroq qiling. Bu submassivlar bilan sortArray uchun ikkita rekursiv chaqiruvga olib keladi
har biri asl massiv hajmining taxminan yarmi va birlashtirish uchun bitta chaqiruv, bu esa at
eng yomoni, n – O(n) bo‘lgan asl massivni to‘ldirish uchun 1 ta taqqoslash. (Esingizda bo'lsin, har bir massiv ele-
Har bir kichik massivdan bitta elementni solishtirish orqali tanlash mumkin.) Saralash uchun ikkita chaqiruv-

Birlashtirish: 40


47
40 47
birlashtirish: 12 26 48
40 47
12 26 40 47 48
birlashtirish: 49 56 75 85 90
12 26 40 47 48
12 26 40 47 48 49 56 75 85 90
Saralangan massiv:
[12, 26, 40, 47, 48, 49, 56, 75, 85, 90]

19.6-rasm | Birlashtirish tartibi bilan massivni saralash. (5-qismning 5-qismi.)


19.9 Ushbu bobning Qidiruv va saralash algoritmlari uchun katta xulosa 833

Massiv natijasida yana to'rtta rekursiv sortArray qo'ng'iroqlari paydo bo'ladi, ularning har biri taxminan a pastki qatorga ega
Asl massiv hajmining chorak qismi, birlashtirish uchun ikkita chaqiruv bilan birga, har biri, eng yomoni,
n/2 – 1 ta taqqoslash, O(n) ning umumiy taqqoslashlari uchun. Bu jarayon davom etadi,
Har bir sortArray qo'ng'irog'i ikkita qo'shimcha sortArray qo'ng'irog'ini va birlashma qo'ng'irog'ini hosil qiladi.
goritm massivni bir elementli pastki massivlarga ajratdi. Har bir darajada O(n) taqqoslashlar mavjud
pastki qatorlarni birlashtirish uchun talab qilinadi. Har bir daraja massivlarni ikkiga bo'ladi, shuning uchun massiv ikki barobar ko'payadi
hajmi yana bir darajani talab qiladi. Massiv hajmini to'rt barobar oshirish uchun yana ikkita daraja kerak bo'ladi. Bu pat-
tern logarifmik bo'lib, log2 n darajaga olib keladi. Bu O(n log n) ning umumiy samaradorligiga olib keladi.
19.9 Ushbu bobning Qidiruvi uchun Katta O Xulosa va
Saralash algoritmlari
19.7-rasmda ushbu bobda yoritilgan qidirish va saralash algoritmlari jamlangan
har biri uchun katta O. 19.8-rasmda biz ushbu bobda muhokama qilgan Big O qiymatlari keltirilgan
o'sish sur'atlaridagi farqlarni ta'kidlash uchun n uchun bir qator qiymatlar bilan.

Algoritm joylashuvi Katta O

Qidiruv algoritmlari:
Chiziqli qidiruv 19.2-bo'lim O(n)
Ikkilik qidiruv 19.4-bo'lim O(log n)
Rekursiv chiziqli qidiruv 19.8-mashq O(n)
Rekursiv ikkilik qidiruv 19.9-mashq O(log n)
Saralash algoritmlari:
Tanlash tartibi 19.6-bo'lim O(n2)
Qo‘shish tartibi 19.7-bo‘lim O(n2)
Birlashtirish saralash 19.8-bo'lim O(n log n)
Pufakcha tartiblash 19,5 va 19,6 mashqlar O(n2)
19.7-rasm | Big O qiymatlari bilan algoritmlarni qidirish va saralash.

n = O(log n) O(n) O(n log n) O(n2)


1 0 1 0 1
2 1 2 2 4
3 1 3 3 9
4 1 4 4 16
5 1 5 5 25
10 1 10 10 100
100 2 100 200 10 000
1000 3 1000 3000 106
1 000 000 6 1 000 000 6 000 000 1012
1.000.000.000 9 1.000.000.000 9.000.000.000 1018
19.8-rasm | Umumiy Big O belgilari uchun taqqoslashlar soni.

834 19-bob Qidiruv, saralash va katta O

19.10 Yakunlash
Ushbu bob qidiruv va saralashni joriy qildi. Biz ikkita qidiruv algoritmini muhokama qildik - lin-
quloqlarni qidirish va ikkilik qidiruv - va uchta saralash algoritmi - tanlashni saralash, kiritish tartibi
va birlashtirish tartibi. Biz Big O notatsiyasini taqdim etdik, bu sizga anʼning samaradorligini tahlil qilishga yordam beradi
algoritm. Keyingi ikki bobda dinamik ma'lumotlar tuzilmalari haqidagi muhokamamiz davom etadi
bajarilish vaqtida o'sishi yoki qisqarishi mumkin. 20-bob Java generiklaridan qanday foydalanishni ko'rsatadi
umumiy usullar va sinflarni amalga oshirish imkoniyatlari. 21-bob tafsilotlarni muhokama qiladi
umumiy ma'lumotlar tuzilmalarini amalga oshirish. Ushbu bobdagi algoritmlarning har biri “yagona
torli”— 23-bobda, bir vaqtning o‘zida ko‘p qirrali va u qanday yordam berishi mumkinligini ko‘rib chiqamiz.
siz bugungi ko'p yadroli tizimlarda yaxshiroq ishlash uchun dastur yaratasiz.

Xulosa
19.1-bo'lim Kirish


• Qidirish (811-bet) ma'lumotlarda qidiruv kaliti bor yoki yo'qligini aniqlash va agar mavjud bo'lsa, uning joylashgan joyini topishni o'z ichiga oladi.
• Saralash (811-bet) ma’lumotlarni tartibda tartibga solishni o‘z ichiga oladi.
19.2-bo'lim Chiziqli qidiruv
• Chiziqli qidiruv algoritmi (812-bet) massivdagi har bir elementni topguncha ketma-ket qidiradi.
to'g'ri elementni yoki elementni topmasdan massivning oxiriga yetguncha.
19.3-bo'lim Katta O notatsiyasi
• Qidiruv algoritmlarining asosiy farqi ular talab qiladigan harakat miqdoridir.
• Big O belgisi (814-bet) algoritmning samaradorligini hal qilish uchun zarur bo'lgan ish nuqtai nazaridan tavsiflaydi.
muammo. Algoritmlarni qidirish va saralash odatda elementlar soniga bog'liq
ma'lumotlarda.
• O(1) bo'lgan algoritm faqat bitta taqqoslashni talab qilmaydi (815-bet). Shunchaki
massiv hajmi ortib borishi bilan taqqoslashlar soni o'smasligini bildiradi.
• O(n) algoritmi chiziqli ish vaqtiga ega deb ataladi (815-bet).
• Big O dominant omillarni ta'kidlaydi va yuqori n qiymatlari bilan ahamiyatsiz bo'lib qolgan atamalarni e'tiborsiz qoldiradi.
• Big O belgisi algoritmning ishlash vaqtlarining o'sish tezligi bilan bog'liq, shuning uchun doimiylar e'tiborga olinmaydi.
• Chiziqli qidiruv algoritmi O(n) vaqtida ishlaydi.
• Chiziqli qidiruvdagi eng yomon holat shundaki, har bir element tekshirilishi kerak
qidiruv tugmasi (816-bet) mavjud bo'lib, u qidiruv tugmasi massivning oxirgi elementi bo'lsa yoki mavjud bo'lmasa paydo bo'ladi.
19.4-bo'lim Ikkilik qidiruv
• Ikkilik qidiruv (816-bet) chiziqli qidiruvga qaraganda samaraliroq, lekin u massivni tartiblashni talab qiladi.
• Ikkilik qidiruvning birinchi iteratsiyasi massivdagi o'rta elementni sinab ko'radi. Agar bu qidiruv kaliti bo'lsa,
algoritm uning joylashuvini qaytaradi. Qidiruv kaliti o'rta elementdan kichik bo'lsa, qidiruv
massivning birinchi yarmi bilan davom etadi. Qidiruv kaliti o'rta elementdan kattaroq bo'lsa,
qidiruv massivning ikkinchi yarmi bilan davom etadi. Har bir iteratsiya ning o'rta qiymatini tekshiradi
qolgan massiv va agar element topilmasa, qolgan elementlarning yarmini yo'q qiladi.
• Ikkilik qidiruv chiziqli qidiruvga qaraganda samaraliroq qidiruv algoritmidir, chunki har bir taqqoslash
massivdagi elementlarning yarmini hisobga olishdan chiqarib tashlaydi.

O'z-o'zini tekshirish mashqlari 835



• Ikkilik qidiruv O(log n) vaqtida ishlaydi, chunki har bir qadam qolgan elementlarning yarmini olib tashlaydi;
bu logarifmik ish vaqti deb ham ataladi (820-bet).
• Agar massiv o'lchami ikki baravar oshirilsa, ikkilik qidiruv faqat bitta qo'shimcha taqqoslashni talab qiladi.
19.6-bo'lim Tanlash saralash
• Tanlash tartibi (821-bet) oddiy, ammo samarasiz, tartiblash algoritmidir.
• Saralash eng kichik elementni tanlashdan boshlanadi va uni birinchi element bilan almashtiradi. Ikkinchi takror -
Ikkinchi eng kichik elementni (eng kichik qolgan element) tanlaydi va uni element bilan almashtiradi.
ikkinchi element. Saralash oxirgi iteratsiya ikkinchi eng katta elementni tanlamaguncha davom etadi va
eng katta elementni oxirgi indeksda qoldirib, ikkinchidan oxirgi elementga almashtiradi. Ichida
saralashning takrorlanishi, butun massivning eng kichik i elementlari birinchi i indekslariga saralanadi.
• Tanlovni saralash algoritmi O(n2) vaqtida ishlaydi (824-bet).
19.7-bo'lim Qo'shishni saralash
• Kiritish tartibining birinchi iteratsiyasi (824-bet) massivdagi ikkinchi elementni oladi va agar u kamroq bo‘lsa
birinchi elementga qaraganda, uni birinchi element bilan almashtiradi. Ikkinchi iteratsiya uchinchisiga qaraydi
elementni o'rnatadi va uni dastlabki ikkita elementga nisbatan to'g'ri joyga qo'yadi. Ithdan keyin
kiritish tartiblashning iteratsiyasi, asl massivdagi birinchi i elementlar tartiblanadi.
• Qo'shishni tartiblash algoritmi O(n2) vaqtida ishlaydi (827-bet).
19.8-bo'lim Birlashtirish saralash
• Birlashtirish saralash (827-bet) – bu saralash algoritmiga qaraganda tezroq, lekin amalga oshirish murakkabroq.
lektsiyani saralash va qo'shish tartibi. Birlashtirish tartiblash algoritmi massivni ikkita teng qismga bo'lish orqali tartiblaydi.
o'lchamli pastki massivlar, har bir pastki qatorlarni rekursiv saralash va kichik massivlarni bitta katta massivga birlashtirish.
• Birlashtirish tartibining asosiy registrlari bitta elementli massivdir. Bir elementli massiv allaqachon tartiblangan, shuning uchun
birlashma sort bir elementli massiv bilan chaqirilganda darhol qaytadi. ning birlashuvchi qismi
birlashma tartiblash ikkita tartiblangan massivni oladi va ularni bitta kattaroq tartiblangan massivga birlashtiradi.
• Birlashtirish tartibi har bir massivning birinchi elementiga qarab birlashtirishni amalga oshiradi, bu ham
massivdagi eng kichik element. Birlashtirish tartibi ulardan eng kichigini oladi va uni birinchi qatorga joylashtiradi.
kattaroq massivning menti. Agar pastki qatorda hali ham elementlar mavjud bo'lsa, birlashma tartiblash ikkinchisiga qaraydi
ulardan (hozir qolgan eng kichik element) va uni birinchi element bilan solishtiradi
boshqa pastki qator. Birlashtirish saralash bu jarayonni kattaroq massiv to'lguncha davom ettiradi.
• Eng yomon holatda, tartiblash uchun birinchi qo‘ng‘iroq n ta o‘rinni to‘ldirish uchun O(n) taqqoslashini amalga oshirishi kerak.
yakuniy massiv.
• Birlashtirish tartiblash algoritmining birlashma qismi har biri taxminan boʻlgan ikkita pastki massivda bajariladi.
aniq o'lcham n/2. Ushbu kichik massivlarning har birini yaratish uchun har bir kichik massiv uchun n /2 - 1 taqqoslash kerak,
yoki O(n) taqqoslashlar jami. Ushbu naqsh davom etadi, chunki har bir daraja ikki barobar ko'p massivlarda ishlaydi,
lekin har biri oldingi massivning yarmiga teng.
• Ikkilik qidiruvga o'xshab, bu ikkiga bo'linish O(n log n) umumiy samaradorlik uchun log n darajaga olib keladi (833-bet).
O'z-o'zini tekshirish mashqlari
19.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Tanlovni saralash ilovasini ishga tushirish uchun taxminan bir necha marta vaqt ketadi
128 elementli massivda 32 elementli massivdagi kabi.
b) Birlashtirishning samaradorligi .
19.2 Ikkilik qidiruv va birlashma tartiblashning qaysi asosiy jihati logarifmikni hisobga oladi
ularning tegishli Big Os qismi?

836 19-bob Qidiruv, saralash va katta O

19.3 Qaysi ma'noda qo'shish tartibi birlashma turdan ustundir? Qaysi ma'noda birlashma turi
kiritish turidan ustunmi?
19.4 Matnda biz aytamizki, birlashtirish tartiblash massivni ikkita pastki qatorga ajratgandan so'ng, so'ngra tartiblaydi
bu ikki pastki qator va ularni birlashtiradi. Nima uchun kimdir bizning “bu
keyin bu ikki pastki qatorlarni tartiblaydi"?

O'z-o'zini tekshirish mashqlariga javoblar


19.1 a) 16, chunki O(n2) algoritmi toʻrt marta koʻp maʼlumotni saralash uchun 16 marta koʻproq vaqt oladi.
mation. b) O(n log n).
19.2 Ushbu algoritmlarning ikkalasi ham "yarimga bo'lish" ni o'z ichiga oladi - qandaydir tarzda biror narsani yarmiga qisqartiradi.
Ikkilik qidiruv har bir taqqoslashdan keyin massivning yarmini ko'rib chiqishdan chiqarib tashlaydi. The
birlashma tartiblash massivni har chaqirilganda yarmiga bo'ladi.
19.3 Qo'shish tartibini tushunish va dasturlash birlashma tartibiga qaraganda osonroq. Birlashish
saralash [O(n log n)] qoʻshish tartibidan [O(n2)] ancha samaraliroq.
19.4 Qaysidir ma'noda, bu ikki pastki qatorni saralamaydi. Bu shunchaki asl nusxani bo'lishda davom etadi
massiv, albatta, tartiblangan bir elementli pastki qatorni ta'minlamaguncha yarmiga bo'linadi. Keyin u quriladi
Bu bir elementli massivlarni birlashtirib, kattaroq kichik massivlarni hosil qilish orqali asl ikkita pastki massivni yarating.
keyin birlashtirildi va hokazo.

Mashqlar
19.5 (Bubble Sort) Pufakcha saralashni amalga oshiring — yana bir oddiy, ammo samarasiz saralash texnikasi. Bu


qabariqli saralash yoki cho'kuvchi saralash deb ataladi, chunki kichikroq qiymatlar asta-sekin yuqoriga qarab "qabariq" qiladi.
massiv (ya'ni, birinchi element tomon) suvda ko'tarilgan havo pufakchalari kabi, kattaroq qiymatlar esa cho'kib ketadi.
massivning pastki qismiga (oxiriga). Texnika bir nechta o'tishlarni amalga oshirish uchun ichki o'ralgan halqalardan foydalanadi
massiv. Har bir o'tish elementning ketma-ket juftlarini taqqoslaydi. Agar juftlik ortib borayotgan tartibda bo'lsa (yoki
qiymatlar teng), qabariq tartiblash qiymatlarni o'z holicha qoldiradi. Agar juftlik kamayib borayotgan tartibda bo'lsa,
qabariq sort ularning qiymatlarini massivda almashtiradi. Birinchi o'tish massivning dastlabki ikki elementini taqqoslaydi
va agar kerak bo'lsa, ularning qiymatlarini almashtiradi. Keyin massivdagi ikkinchi va uchinchi elementlarni solishtiradi. The
Ushbu passning oxiri massivdagi oxirgi ikki elementni taqqoslaydi va kerak bo'lganda ularni almashtiradi. Biridan keyin
pass, eng katta element oxirgi indeksda bo'ladi. Ikki o'tishdan so'ng, eng katta ikkita element bo'ladi
oxirgi ikki indeksda. Nima uchun qabariqli tartiblash O(n2) algoritmi ekanligini tushuntiring.
19.6 (Kengaytirilgan pufakchali saralash) Ishlashni yaxshilash uchun quyidagi oddiy o'zgartirishlarni kiriting.
19.5-mashqda siz ishlab chiqqan qabariq turi:
a) Birinchi o'tishdan keyin eng katta raqam eng yuqori raqamlangan massivda bo'lishi kafolatlanadi
element; ikkinchi o'tishdan keyin ikkita eng yuqori raqam "o'z joyida"; va hokazo. In-
o'n elementli massiv uchun har bir o'tishda to'qqizta taqqoslash o'rniga, o'zgartiring
qabariq sort ikkinchi o'tish sakkiz solishtirish qilish uchun, uchinchi o'tishda etti, va
hokazo.
b) Massivdagi ma'lumotlar allaqachon to'g'ri yoki deyarli to'g'ri tartibda bo'lishi mumkin, shuning uchun nima uchun to'qqizta qilish kerak
o'tadi, agar kamroq etarli bo'ladi? Har bir o'tish oxirida bor yoki yo'qligini tekshirish uchun tartibni o'zgartiring
almashinuvlar amalga oshirildi. Agar yo'q bo'lsa, ma'lumotlar allaqachon tartiblangan bo'lishi kerak, shuning uchun pro-
gramm tugashi kerak. Agar almashtirish amalga oshirilgan bo'lsa, kamida yana bitta o'tish kerak.
19.7 (Paqirni saralash) Chelakni saralash bir o‘lchovli musbat sonlar massividan boshlanadi.
0 dan 9 gacha indekslangan qatorlar va indekslangan ustunlar bilan tartiblangan va ikki o'lchovli butun sonlar massivi
0 dan n gacha - 1, bu erda n - tartiblanadigan qiymatlar soni. Ikki o'lchovli massivning har bir qatori

837-mashqlar



chelak deb ataladi. Sort that op- deb nomlangan usulni o'z ichiga olgan BucketSort nomli sinfni yozing.
quyidagicha ifodalanadi:
a) Bir o'lchovli massivning har bir qiymatini chelak massivining qatoriga joylashtiring.
qiymatning "birlik" (eng o'ngdagi) raqami. Masalan, 7-qatorda 97, 3-da joylashgan
3-qator va 100-qator 0-qatorga joylashtiriladi. Ushbu protsedura tarqatish passi deb ataladi.
b) Paqir massivini qatorma-qator aylantiring va qiymatlarni asl nusxasiga ko'chiring.
nur. Ushbu protsedura yig'ilish o'tkazmasi deb ataladi. Oldingi qiymatlarning yangi tartibi
bir o'lchovli massiv 100, 3 va 97 ga teng.
c) Ushbu jarayonni har bir keyingi raqam pozitsiyasi uchun takrorlang (o'nlik, yuzlik, minglik va boshqalar).
Ikkinchi (o'nlik raqam) o'tishda 100 0 qatorga, 3 0 qatorga qo'yiladi (chunki 3
o'nlik raqami yo'q) va 97 raqami 9-qatorga qo'yiladi. Yig'ilish o'tish joyidan keyin
bir o'lchovli massivdagi qiymatlar 100, 3 va 97. Uchinchisida (yuzlik raqam)
pass, 100 1-qatorga, 3-qatorga 0-ga va 97-qatorga 0-qatorga (3-dan keyin) joylashtiriladi.
Ushbu so'nggi yig'ish o'tkazmasidan so'ng, asl massiv tartiblangan tartibda bo'ladi.
Ikki o'lchovli chelaklar massivi butun son massivning uzunligidan 10 baravar katta.
saralanmoqda. Ushbu saralash usuli pufakchali saralashdan ko'ra yaxshiroq ishlashni ta'minlaydi,
lekin ko'proq xotira talab qiladi - pufakchani tartiblash faqat bitta qo'shimcha uchun joy talab qiladi.
ma'lumotlarning asosiy elementi. Bu taqqoslash makon/vaqt almashinuviga misoldir: The
paqirli saralash pufakchali tartiblashdan ko'ra ko'proq xotiradan foydalanadi, lekin yaxshiroq ishlaydi. Ushbu versiya
chelak turida har bir o'tishda barcha ma'lumotlarni asl massivga qaytarishni talab qiladi.
Yana bir imkoniyat - ikkinchi ikki o'lchovli chelak massivini va qayta-qayta yaratish
ikki paqir massivlari o'rtasida ma'lumotlarni almashtirish.
19.8 (Rekursiv chiziqli qidiruv) rekursiv Lin- rekursiv usulidan foydalanish uchun 19.2-rasmni o'zgartiring.
massivni chiziqli qidirishni amalga oshirish uchun earSearch. Usul qidiruv kalitini olishi kerak va
argument sifatida boshlang'ich indeks. Agar qidiruv kaliti topilsa, uning indeksini massivga qaytaring; aks holda, qaytaring
–1. Rekursiv usulga har bir chaqiruv massivdagi bitta indeksni tekshirishi kerak.
19.9 (Recursive Binary Search) Rekursiv Binary- rekursiv usulidan foydalanish uchun 19.3-rasmni o'zgartiring.
Massivda ikkilik qidiruvni amalga oshirish uchun qidiruv. Usul boshlab qidiruv kalitini olishi kerak
argument sifatida indeks va tugatish indeksi. Agar qidiruv kaliti topilsa, uning indeksini massivga qaytaring. Agar
Qidiruv kaliti topilmadi, qaytar -1.
19.10 (Quicksort) Quicksort deb nomlangan rekursiv saralash texnikasi quyidagi asosiy algoritmlardan foydalanadi:
Bir o'lchovli qiymatlar qatori uchun ritm:
a) Bo'limga bo'lish bosqichi: tartiblanmagan massivning birinchi elementini oling va uning yakuniy qismini aniqlang.
tartiblangan massivdagi kation (ya'ni, massivdagi elementning chap tomonidagi barcha qiymatlar kamroq
elementdan va massivdagi elementning o'ng tomonidagi barcha qiymatlar dan katta
element - buni qanday qilishni quyida ko'rsatamiz). Endi bizda bitta element mavjud
joylashuv va ikkita tartiblanmagan pastki qator.
b) Rekursiv qadam: Har bir tartiblanmagan kichik massivda 1-bosqichni bajaring. Har safar 1-bosqich bajariladi
pastki qatorda boshqa element tartiblangan massivning oxirgi joyiga joylashtiriladi va ikkita
tartiblanmagan pastki massivlar yaratiladi. Agar pastki qator bitta elementdan iborat bo'lsa, u element
oxirgi joylashuvida (chunki bir elementli massiv allaqachon tartiblangan).
Asosiy algoritm juda oddiy ko'rinadi, ammo yakuniy pozitsiyani qanday aniqlash mumkin?
Har bir kichik massivning birinchi elementi? Misol tariqasida quyidagi to'plamni ko'rib chiqing
qiymatlar (qalin chizilgan element bo'linish elementidir - u yakuniy qismga joylashtiriladi
tartiblangan massivdagi joylashuvi):
37 2 6 4 89 8 10 12 68 45
Massivning eng o'ng elementidan boshlab, har bir elementni 37 bilan solishtiring
37 dan kichik element topilgan; keyin 37 va bu elementni almashtiring. Birinchi element kamroq
37 dan 12 ga teng, shuning uchun 37 va 12 almashtiriladi. Yangi massiv

838 19-bob Qidiruv, saralash va katta O

12 2 6 4 89 8 10 37 68 45
12-element kursiv bilan 37 ga almashtirilganligini bildiradi.
Massivning chap qismidan boshlab, lekin 12 dan keyingi elementdan boshlab, com-
37 dan katta element topilmaguncha har bir elementni 37 ga ajrating, keyin 37 ni almashtiring
va bu element. 37 dan katta birinchi element 89 ga teng, shuning uchun 37 va 89 almashtiriladi.
Yangi massiv
12 2 6 4 37 8 10 89 68 45
O'ngdan boshlab, lekin 89 dan oldingi elementdan boshlab, har bir elementni solishtiring.
37 dan kichik element topilmaguncha 37 ni qo'ying - keyin 37 va shu elementni almashtiring.
37 dan kichik bo'lgan birinchi element 10 ga teng, shuning uchun 37 va 10 almashtiriladi. Yangi massiv
12 2 6 4 10 8 37 89 68 45
Chapdan boshlab, lekin 10 dan keyingi elementdan boshlab, har bir elementni solishtiring
37 dan katta element topilmaguncha 37 bilan - keyin 37 va shu elementni almashtiring.
37 dan kattaroq elementlar yo'q, shuning uchun biz 37 ni o'zi bilan solishtirganda, biz
37 tartiblangan massivdagi oxirgi joyiga joylashtirilganligini biling. Har bir qiymat
37 ning chap tomoni undan kichikroq va 37 ning o'ng tomonidagi har bir qiymat undan kattaroqdir.
Bo'lim oldingi massivda qo'llanilgandan so'ng, ikkita tartiblanmagan bo'ladi
pastki massivlar. Qiymatlari 37 dan kichik bo'lgan pastki qator 12, 2, 6, 4, 10 va 8 ni o'z ichiga oladi.
Qiymatlari 37 dan katta bo'lgan pastki qator 89, 68 va 45 ni o'z ichiga oladi. Saralash takroriy davom etadi.
har ikkala pastki massiv ham asl massiv bilan bir xil tarzda bo'lingan holda.
Oldingi muhokamaga asoslanib, QuickSortHelper rekursiv usulini yozing
bir o'lchovli butun sonli massivni tartiblash. Usul argument sifatida boshlanishi kerak
ing indeksi va saralanayotgan asl massivdagi tugatish indeksi.

20

Umumiy sinflar va


Usullari

…bizning alohida individualligimiz, kabi


bizning umumiyimizdan ajralib turadi
insoniyat.
- Oliver Vendell Xolms, Sr.
Bir qonun ostida, boshqa qonun ostida tug'ilgan
bog'langan.
— Lord Bruk

Oh maqsadlar


Ushbu bobda siz:
■ Umumiy usullarni yarating
ustida bir xil vazifalarni bajarish
har xil turdagi argumentlar.
■ Umumiy Stack sinfini yarating
saqlash uchun ishlatilishi mumkin
har qanday sinf ob'ektlari yoki
interfeys turi.
■ Kompilyatsiya vaqtini tushunish
umumiy tarjima
usullari va sinflari.
■ Qanday qilib ortiqcha yuklashni tushuning
bilan umumiy usullar
umumiy bo'lmagan usullar yoki boshqalar
umumiy usullar.
■ Xom turlarini tushuning.
■ Aniq bo'lganda joker belgilardan foydalaning
a haqida ma'lumot yozing
parametr talab qilinmaydi
usul tanasi.

840 20-bob Umumiy sinflar va usullar

20.1 Kirish
Siz 7 va 16-boblarda mavjud umumiy usullar va sinflardan foydalangansiz. Ushbu bobda,
o'zingiz yozishni o'rganasiz.
Elementlarni saralash uchun bitta tartiblash usulini yozsak yaxshi bo'lardi
Integer massivi, String massivi yoki tartiblashni qo'llab-quvvatlaydigan har qanday turdagi massiv (ya'ni, uning ele-
solishtirish mumkin). Agar biz bitta Stack sinfini yozsak yaxshi bo'lardi
butun sonlar to'plami, suzuvchi nuqtali raqamlar to'plami, satrlar to'plami sifatida foydalanish mumkin
yoki boshqa turdagi stek. Turlarning mos kelmasligini aniqlay olsak, yanada yaxshi bo'lardi
kompilyatsiya vaqti - kompilyatsiya vaqti turi xavfsizligi sifatida tanilgan. Misol uchun, agar Stack saqlashi kerak bo'lsa
faqat butun sonlar bo'lsa, Stringni ushbu Stackga surish urinish kompilyatsiya xatosini berishi kerak.
Ushbu bobda generiklar, xususan, umumiy usullar va umumiy sinflar muhokama qilinadi
yuqorida aytib o'tilgan turdagi xavfsiz umumiy modellarni yaratish vositalarini taqdim eting.
20.2 Umumiy usullar uchun motivatsiya
Haddan tashqari yuklangan usullar ko'pincha har xil turdagi o'xshash operatsiyalarni bajarish uchun ishlatiladi
ma'lumotlar. Umumiy usullarni rag'batlantirish uchun, keling, o'z ichiga olgan misol (20.1-rasm) bilan boshlaylik
Stringni chop etuvchi haddan tashqari yuklangan printArray usullari (22–29, 32–39 va 42–49 qatorlar)
Integer massivi, Double massivi va Belgilar massivi elementlarining tasvirlari,
mos ravishda. Biz int, double va char ibtidoiy tipdagi massivlardan foydalanishimiz mumkin edi. Biz
bizning umumiy usul misolimizni o'rnatish uchun type-wrapper sinflarining massivlaridan foydalanish, chunki faqat
mos yozuvlar turlari umumiy usullar va sinflarda umumiy turlarni belgilash uchun ishlatilishi mumkin.

20.1 Kirish


20.2 Umumiy usullar uchun motivatsiya
20.3 Umumiy usullar: amalga oshirish
va Compile-time Translation
20.4 Qo'shimcha kompilyatsiya vaqti tarjimasi
Muammolar: Turni ishlatadigan usullar
Qaytish turi sifatida parametr

20.5 Umumiy usullarni ortiqcha yuklash


20.6 Umumiy sinflar
20.7 Xom turlari
20.8 Qabul qilinadigan usullardagi joker belgilar
Parametrlar turi
20.9 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar

1 // 20.1-rasm: OverloadedMethods.java
2 // Ortiqcha yuklangan usullar yordamida massiv elementlarini chop etish.
3
4 ommaviy sinf OverloadedMethods
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // Integer, Double va Character massivlarini yarating
9 Integer[] integerArray = {1, 2, 3, 4, 5, 6};
10 Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
11 Belgi [] characterArray = {'H', 'E', 'L', 'L', 'O'};

20.1-rasm | Ortiqcha yuklangan usullar yordamida massiv elementlarini chop etish. (2-qismning 1-qismi.)


20.2 Umumiy usullar uchun motivatsiya 841

Dastur uchta massivni e'lon qilish va ishga tushirish bilan boshlanadi - olti elementli Integer
massiv integerArray (9-qator), etti elementli Double-array doubleArray (10-qator) va besh-
element Belgilar massivi characterArray (11-qator). Keyin 13-18-satrlar konfiguratsiyani ko'rsatadi.
har bir massivning chodirlari.

12
13 System.out.printf("Array integerArray tarkibida:%n");


14
15 System.out.printf("%nArray doubleArray tarkibida:%n");
16
17 System.out.printg("%nArray characterArray tarkibida:%n");
18
19 }
20
21 // Integer massivini chop etish uchun printArray usuli
22
23 {
24 // massiv elementlarini ko'rsatish
25 uchun (element: inputArray)
26 System.out.printf("%s ", element);
27
28 System.out.println();
29 }
30
31 // Chop etish uchun printArray usuli Double massiv
32
33 {
34 // massiv elementlarini ko'rsatish
35 uchun (element: inputArray)
36 System.out.printf("%s ", element);
37
38 System.out.println();
39 }
40
41 // Belgilar massivini chop etish uchun printArray usuli
42
43 {
44 // massiv elementlarini ko'rsatish
45 uchun (element: inputArray)
46 System.out.printf("%s ", element);
47
48 System.out.println();
49 }
50 } // oxirgi sinf OverloadedMethods

IntegerArray massivi quyidagilarni o'z ichiga oladi:


1 2 3 4 5 6
DoubleArray massivi quyidagilarni o'z ichiga oladi:
1,1 2,2 3,3 4,4 5,5 6,6 7,7
characterArray massivi quyidagilarni o'z ichiga oladi:
SALOM

20.1-rasm | Ortiqcha yuklangan usullar yordamida massiv elementlarini chop etish. (2-qismning 2-qismi.)

printArray(integerArray); // Integer massivini o'tkazing

printArray(doubleArray); // Double massivni o'tkazing

printArray(characterArray); // Belgilar massivini o'tkazish

umumiy statik void printArray(Integer[] inputArray)

Butun son

umumiy statik void printArray(Double[] inputArray)

Ikki marta

umumiy statik void printArray(Character[] inputArray)

Xarakter

842 20-bob Umumiy sinflar va usullar

Kompilyator usul chaqiruviga duch kelganda, u e'lon qilingan usulni topishga harakat qiladi.
bir xil nomli va qo'ng'iroqdagi argument turlariga mos keladigan parametrlar bilan.
Ushbu misolda har bir printArray chaqiruvi printArray deklaratsiya usulidan biriga mos keladi.
lar. Masalan, 14-qator argument sifatida integerArray bilan printArray ni chaqiradi. The
kompilyator argument turini (ya'ni, Integer []) aniqlaydi va chop etishni topishga harakat qiladi.
Integer[] parametrini (22–29-qatorlar) belgilaydigan massiv usuli, so‘ngra qo‘ng‘iroqni o‘rnatadi.
bu usul. Xuddi shunday, kompilyator 16-qatorda qo'ng'iroqqa duch kelganda, u aniqlaydi
argument turi (ya'ni Double[]), so'ngra o'ziga xos bo'lgan printArray usulini topishga harakat qiladi.
Double[] parametrini (32–39-qatorlar) o'rnatadi, so'ngra ushbu usulga qo'ng'iroqni o'rnatadi. Nihoyat, qachon
kompilyator 18-qatorda chaqiruvga duch keladi, u argument turini aniqlaydi (ya'ni Char-
acter[]), keyin Belgini [] belgilaydigan printArray usulini topishga harakat qiladi.
parametr (42–49-qatorlar), keyin ushbu usulga qo'ng'iroqni o'rnatadi.
Haddan tashqari yuklangan printArray usullaridagi umumiy xususiyatlar
Har bir printArray usulini o'rganing. Massiv elementi turi har bir usulning sarlavhasida ko'rinadi
(22, 32 va 42-qatorlar) va for-statement sarlavhasi (25, 35 va 45-qatorlar). Agar biz almashtirsak
element turlari har bir usulda umumiy nomga ega bo'ladi - konventsiya bo'yicha T - keyin uchtasi
usullar 20.2-rasmdagi kabi ko'rinadi. Ko'rinib turibdiki, agar biz qatorni almashtira olsak
bitta umumiy turga ega bo'lgan uchta usulning har birida element turi, keyin biz qila olishimiz kerak
elementlarning String tasvirlarini ko'rsatishi mumkin bo'lgan bitta printArray usulini e'lon qilish.
ob'ektlarni o'z ichiga olgan har qanday massivning mentlari. 20.2-rasmdagi usul umumiy usulga o'xshaydi
printArray usuli deklaratsiyasini 20.3-bo'limda ko'rasiz. Bu erda ko'rsatilgan bo'lmaydi
kompilyatsiya - biz buni oddiygina 20.1-rasmdagi uchta printArray usuli ekanligini ko'rsatish uchun ishlatamiz
ular qayta ishlanadigan turlardan tashqari bir xil.

20.3 Umumiy usullar: Amalga oshirish va kompilyatsiya qilish


Vaqt tarjimasi
Agar bir nechta ortiqcha yuklangan usullar bilan bajarilgan operatsiyalar har bir argument uchun bir xil bo'lsa
turi bo'lsa, ortiqcha yuklangan usullar umumiy usul yordamida yanada qulayroq kodlanishi mumkin.
Argumentlari bilan chaqirilishi mumkin bo'lgan yagona umumiy usul deklaratsiyasini yozishingiz mumkin
turli xil turlari. Umumiy usulga o'tkaziladigan argumentlar turlariga asoslanib,
kompilyator har bir usul chaqiruvini mos ravishda boshqaradi. Kompilyatsiya vaqtida kompilyator en-
kodingiz turi xavfsizligini ta'minlaydi va ko'plab ish vaqtidagi xatolarni oldini oladi.
20.3-rasm 20.1-rasmni umumiy printArray usulidan foydalangan holda qayta tiklaydi (22–29-qatorlar).
20.3-rasm). 14, 16 va 18-qatorlardagi printArray qo'ng'iroqlari quyidaginiki bilan bir xil.

1 ommaviy statik bekor printArray( [] inputArray)


2 {
3 // massiv elementlarini ko'rsatish
4 uchun (element: inputArray)
5 System.out.printf("%s ", element);
6
7 System.out.println();
8 }

20.2-rasm | printArray usuli, bunda haqiqiy tur nomlari umumiy turga almashtiriladi


ism (bu holda T).

T

T


20.3 Umumiy usullar: Amalga oshirish va kompilyatsiya vaqti tarjimasi 843

20.1-rasm (14, 16 va 18-qatorlar) va ikkita dasturning chiqishlari bir xil. Bu
generiklarning ifodali kuchini namoyish etadi.

Umumiy usulning parametr bo'limini yozing


22-qator printArray deklaratsiyasi usulini boshlaydi. Barcha umumiy usul deklaratsiyasi mavjud
turi-parametr bo'limi (bu misolda) oldingi burchakli qavslar bilan ajratilgan
usulning qaytish turi. Har bir turdagi parametr bo'limi bir yoki bir nechta turdagi parametrlarni o'z ichiga oladi.
eters, vergul bilan ajratilgan. Tur parametri, shuningdek, turdagi o'zgaruvchi sifatida ham tanilgan, identifikatordir.
umumiy tip nomini bildiruvchi fier. Tur parametrlarini e'lon qilish uchun foydalanish mumkin
Umumiy usul deklaratsiyasida qaytish turi, parametr turlari va mahalliy o'zgaruvchilar turlari va

1 // 20.3-rasm: GenericMethodTest.java


2 // PrintArray umumiy usuli yordamida massiv elementlarini chop etish.
3
4 umumiy sinf GenericMethodTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 // Integer, Double va Character massivlarini yarating
9 Integer[] intArray = {1, 2, 3, 4, 5};
10 Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
11 Belgi[] charArray = {'H', 'E', 'L', 'L', 'O'};
12
13 System.out.printf("Array integerArray tarkibida:%n");
14
15 System.out.printf("%nArray doubleArray tarkibida:%n");
16
17 System.out.printf("%nArray characterArray tarkibida:%n");
18
19 }
20
21
22
23 {
24
25
26
27
28 System.out.println();
29 }
30 } // yakuniy sinf GenericMethodTest

IntegerArray massivi quyidagilarni o'z ichiga oladi:


1 2 3 4 5 6

DoubleArray massivi quyidagilarni o'z ichiga oladi:


1,1 2,2 3,3 4,4 5,5 6,6 7,7

characterArray massivi quyidagilarni o'z ichiga oladi:


SALOM

20.3-rasm | PrintArray umumiy usuli yordamida massiv elementlarini chop etish.

printArray(integerArray); // Integer massivini o'tkazing

printArray(doubleArray); // Double massivni o'tkazing

printArray(characterArray); // Belgilar massivini o'tkazish

// printArray umumiy usuli


umumiy statik void printArray(T[] inputArray)

// massiv elementlarini ko'rsatish


uchun (T elementi: inputArray)
System.out.printf("%s ", element);

844 20-bob Umumiy sinflar va usullar

ular umumiy usulga o'tgan argumentlar turlari uchun to'ldiruvchi vazifasini bajaradi
haqiqiy turdagi argumentlar sifatida tanilgan. Umumiy usulning tanasi har qanday usul kabi e'lon qilinadi
boshqa usul. Tur parametrlari ibtidoiy turlarni emas, faqat mos yozuvlar turlarini ifodalashi mumkin (masalan
int, double va char). Shuni ham yodda tutingki, tip-parametr butun usulda nomlanadi
deklaratsiya turi parametr bo'limida e'lon qilinganlarga mos kelishi kerak. Masalan, 25-qator
elementni 22-satrda e'lon qilingan tip parametriga (T) mos keladigan T turi sifatida e'lon qiladi. Shuningdek,
tip parametri turi-parametr qismida faqat bir marta e'lon qilinishi mumkin, lekin paydo bo'lishi mumkin
usul parametrlari ro'yxatida bir necha marta. Masalan, tip-parametr nomi T
quyidagi usulning parametrlar ro'yxatida ikki marta paydo bo'ladi:

Tur parametrlari nomlari turli umumiy usullar orasida yagona bo'lishi shart emas. Usulda


printArray, T haddan tashqari yuklangan printArray usuli bilan bir xil ikkita joyda paydo bo'ladi.
20.1-rasmdagi koeffitsientlar massiv elementi turi sifatida Integer, Double yoki Character ko'rsatilgan. The
printArray ning qolgan qismi 20.1-rasmda keltirilgan versiyalar bilan bir xil.

Umumiy printArray usulini sinab ko'rish


20.1-rasmdagidek, 20.3-rasmdagi dastur oltita elementni e’lon qilish va ishga tushirishdan boshlanadi.
Integer massivi integerArray (9-qator), etti elementli Double array doubleArray (10-qator)
va besh elementli Belgilar massivi characterArray (11-qator). Keyin har bir massiv tomonidan chiqariladi
printArray ni chaqirish (14, 16 va 18-qatorlar) - bir marta integerArray argumenti bilan, bir marta bilan
doubleArray argumenti va bir marta characterArray argumenti bilan.
Kompilyator 14-qatorga duch kelganida, u birinchi navbatda integerArray argumentini aniqlaydi.
yozing (ya'ni, Integer[]) va a ni belgilaydigan printArray nomli usulni topishga harakat qiladi
yagona Integer[] parametri. Ushbu misolda bunday usul yo'q. Keyingi, kompilyator
singlni belgilaydigan printArray nomli umumiy usul mavjudligini aniqlaydi
massiv parametri va massiv elementi turini ifodalash uchun tip parametridan foydalanadi. kom-
piler printArray (22–29-qatorlar) mos kelishini aniqlaydi va usulga qo'ng'iroqni o'rnatadi.
Xuddi shu jarayon 16 va 18-qatorlarda printArray usuliga qo'ng'iroqlar uchun takrorlanadi.

Usul chaqiruvlarini o'rnatishdan tashqari, kompilyator ham


usul tanasidagi operatsiyalar massivda saqlangan turdagi elementlarga qo'llanilishi mumkin

umumiy statik T maksimal (T qiymati1, T qiymati2)

Yaxshi dasturlash amaliyoti 20.1
T ("turi" uchun), E ("element" uchun), K ("kalit" uchun) va V ("qiymat" uchun) harflari odatda
tip parametrlari sifatida ishlatiladi. Boshqa keng tarqalganlari uchun http://docs.oracle.com/javase/ ga qarang.
tutorial/java/generics/types.html.

Umumiy dasturlash xatosi 20.1


Agar kompilyator usul chaqiruvini umumiy bo'lmagan yoki umumiy usul deklaratsiyasiga moslashtira olmasa -
tion, kompilyatsiya xatosi yuz beradi.

Umumiy dasturlash xatosi 20.2


Agar kompilyator usul chaqiruviga to'liq mos keladigan usul deklaratsiyasini topmasa, lekin
usul chaqiruvini qondira oladigan ikki yoki undan ortiq usullarni topsa, kompilyatsiya xatosi yuzaga keladi.
Haddan tashqari yuklangan va umumiy usullarga qo'ng'iroqlarni hal qilish bo'yicha to'liq ma'lumot uchun http:// ga qarang.
docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.

20.4 Qaytish turi 845 sifatida tur parametrini ishlatadigan usullar

dalil. Ushbu misoldagi massiv elementlarida bajariladigan yagona operatsiya to
ularning String tasvirini chiqarish. 26-qator har birida yashirin toString chaqiruvini amalga oshiradi
element. Jeneriklar bilan ishlash uchun massivning har bir elementi sinf yoki inter-sinf ob'ekti bo'lishi kerak.
yuz turi. Barcha ob'ektlar toString usuliga ega bo'lganligi sababli, kompilyator 26-qatorni qondiradi
printArray massivi argumentidagi har qanday ob'ekt uchun haqiqiy amalni bajaradi. toString
Integer, Double va Character sinflarining usullari String tasvirini qaytaradi
mos ravishda int, double yoki char qiymati.
Kompilyatsiya vaqtida o'chirish
Kompilyator printArray umumiy usulini Java bayt kodlariga tarjima qilganda, u olib tashlaydi
tip-parametr bo'limi va tur parametrlarini haqiqiy turlar bilan almashtiradi. Bu jarayon
yo'q qilish deb nomlanadi. Odatiy bo'lib, barcha umumiy turlar Ob'ekt turi bilan almashtiriladi. Shunday qilib, kom-
printArray usulining qoziqli versiyasi 20.4-rasmda ko'rsatilganidek ko'rinadi — faqat bitta nusxa mavjud
misoldagi barcha printArray chaqiruvlari uchun ishlatiladigan ushbu kodning. Bu butunlay boshqacha
C++ shablonlari kabi boshqa dasturlash tillaridagi o'xshash mexanizmlardan
sifatida qabul qilingan har bir tur uchun manba kodining alohida nusxasi yaratiladi va kompilyatsiya qilinadi
usulga dalil. 20.4-bo'limda ko'rib turganingizdek, tarjima va kompilyatsiya
generics haqida biz ushbu bo'limda muhokama qilganimizdan ko'ra bir oz ko'proq ishtirok etadi.
20.3-rasmda printArray ni umumiy usul sifatida e’lon qilib, biz zaruratni bartaraf etdik.
20.1-rasmdagi haddan tashqari yuklangan usullar va chiqarish mumkin bo'lgan qayta ishlatiladigan usul yaratildi
Ob'ektlarni o'z ichiga olgan har qanday massivdagi elementlarning satrli ko'rinishlari. Biroq, bu
muayyan misol oddiygina printArray usulini ko'rsatilganidek e'lon qilishi mumkin edi
20.4-rasm, Ob'ekt massividan parametr sifatida foydalanish. Bu ham xuddi shunday natija bergan bo'lardi
natijalar, chunki har qanday Ob'ektni String sifatida chiqarish mumkin. Umumiy usulda, foyda
Agar siz tur parametrlariga cheklovlar qo'yganingizda aniqroq bo'ladi, chunki biz demon-
keyingi bo'limda strategiya.

20.4 Kompilyatsiya vaqtidagi qo‘shimcha tarjima muammolari:


Qaytish turi sifatida tur parametridan foydalanadigan usullar
Qaytish turida va ichida tip parametrlari qo'llaniladigan umumiy usulni ko'rib chiqaylik
parametrlar ro'yxati (20.5-rasm). Ilova aniqlash uchun maksimal umumiy usuldan foydalanadi
va bir xil turdagi uchta argumentning eng kattasini qaytaring. Afsuski, munosabatlar
operator > mos yozuvlar turlari bilan foydalanilmaydi. Biroq, ikkita ob'ektni solishtirish mumkin
Agar bu sinf Comparable umumiy interfeysini amalga oshirsa (paketdan
java.lang). Ibtidoiy turlar uchun barcha turdagi o'rash sinflari ushbu interfeysni amalga oshiradi.

1 ommaviy statik bekor printArray( [] inputArray)


2 {
3 // massiv elementlarini ko'rsatish
4 uchun (element: inputArray)
5 System.out.printf("%s ", element);
6
7 System.out.println();
8 }

20.4-rasm | PrintArray umumiy usuli kompilyator o'chirishni amalga oshirgandan so'ng.

Ob'ekt

Ob'ekt



846 20-bob Umumiy sinflar va usullar

Umumiy interfeyslar sizga bitta interfeys deklaratsiyasi bilan bog'liq bo'lganlar to'plamini belgilash imkonini beradi


turlari. Comparable obyektlarida compareTo usuli mavjud. Misol uchun, agar bizda ikkita In-
teger ob'ektlari, integer1 va integer2, ularni ifoda bilan solishtirish mumkin:

Comparable ni amalga oshiradigan sinfni e'lon qilganingizda, usulni amalga oshirishingiz kerak


compareTo shundayki, u o'sha sinfning ikkita ob'ekti mazmunini solishtiradi va qaytaradi
taqqoslash natijalari. Comparable interfeysi hujjatlarida ko'rsatilganidek, solishtiring
ob'ektlar teng bo'lsa 0 ni, agar ob'ekt1 ob'ekt2 dan kichik bo'lsa yoki manfiy butun sonni qaytarishi kerak
musbat butun son, agar ob'ekt1 ob'ekt2 dan katta bo'lsa. Masalan, Integer sinfining kompa-
reTo usuli ikkita Integer obyektida saqlangan int qiymatlarini solishtiradi. Amalga oshirishning foydasi -
Comparable interfeysi - Comparable ob'ektlari bilan foydalanish mumkin
Collections sinfini saralash va qidirish usullari (java.util paketi). Biz muhokama qildik
Ushbu usullar 16-bobda
eng katta qiymatni aniqlashga yordam beradigan maksimal.

integer1.compareTo(integer2)

1 // 20.5-rasm: MaximumTest.java
2 // Umumiy usul maksimal uchta ob'ektning eng kattasini qaytaradi.
3
4 ommaviy sinf MaksimumTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 System.out.printf("%d, %d va %d ning maksimali %d%n%n", 3, 4, 5,
9 ta maksimal(3, 4, 5));
10 System.out.printf("Maksimal %.1f, %.1f va %.1f - %.1f%n%n",
11 6,6, 8,8, 7,7, maksimal (6,6, 8,8, 7,7));
12 System.out.printf("Maksimal %s, %s va %s - %s%n", "nok",
13 "olma", "apelsin", maksimal("nok", "olma", "apelsin"));
14 }
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 } // oxirgi sinf MaximumTest

Maksimal 3, 4 va 5 - 5


6,6, 8,8 va 7,7 maksimal 8,8 ni tashkil qiladi
Armut, olma va apelsinning maksimali nokdir

20.5-rasm | Umumiy usul maksimal, uning turi parametrining yuqori chegarasi.

// uchta taqqoslanadigan ob'ektning eng kattasini aniqlaydi
umumiy statik >ni kengaytiradi T maksimal (T x, T y, T z)
{
T max = x; // faraz qilaylik, x dastlab eng katta
agar (y.qiyoslash(maks) > 0)
max = y; // y hozirgacha eng kattasi
agar (z.compareTo(max) > 0)
max = z; // z eng kattasi
maksimal qaytish; // eng katta ob'ektni qaytaradi
}

20.4 Qaytish turi sifatida tur parametrini ishlatadigan usullar 847

Umumiy usul maksimal va tur parametrining yuqori chegarasini belgilash
Maksimal umumiy usul (17–28-qatorlar) qaytish turi sifatida T turi parametridan foydalanadi
usul (17-satr), usul parametrlari x, y va z (17-qator) va turi sifatida
mahalliy o'zgaruvchining max (19-qator). Type-parameter bo'limi T ning kengaytirilishini bildiradi
Comparable—faqat Comparable interfeysini amalga oshiradigan sinf ob'ektlari bo'lishi mumkin
bu usul bilan ishlatiladi. Comparable turi parametrining yuqori chegarasi sifatida tanilgan. tomonidan
sukut bo'yicha, Ob'ekt yuqori chegara bo'lib, har qanday turdagi ob'ektdan foydalanish mumkinligini anglatadi. Turi-
Parametrni bog'laydigan parametr e'lonlari har doim kengaytmali kalit so'zdan qat'i nazar foydalanadi
turi parametri sinfni kengaytiradimi yoki interfeysni amalga oshiradimi. Yuqori
bog'langan, vergul bilan ajratilgan ro'yxat bo'lishi mumkin, unda nol yoki bitta sinf va nol yoki undan ko'p -
interfeyslar.
Maksimal usulning turi parametri chop etish uchun ko'rsatilganidan ko'ra ko'proq cheklangan.
Har qanday turdagi ob'ektni o'z ichiga olgan massivlarni chiqarishga qodir bo'lgan 20.3-rasmdagi massiv. The
Comparable cheklash muhim, chunki hamma ob'ektlarni solishtirib bo'lmaydi. Qanaqasiga-
har doim Comparable ob'ektlari uchun compareTo usuli kafolatlanadi.
Maksimal usul aniqlash uchun biz 6.4-bo'limda ishlatgan algoritmdan foydalanadi
uchta argumentning eng kattasi. Usul uning birinchi argumenti (x) ni nazarda tutadi
eng katta va uni mahalliy o'zgaruvchiga max (19-satr) tayinlaydi. Keyinchalik, 21-22 qatorlardagi if ifodasi
y ning max dan katta ekanligini aniqlaydi. Shart y ning compareTo usulini chaqiradi
y.compareTo(max) ifodasi bilan manfiy butun son, 0 yoki musbat qaytaradi
butun son, y ning max ga munosabatini aniqlash. Agar compareTo ning qaytish qiymati kattaroq bo'lsa
0 dan katta bo'lsa, y kattaroq va max o'zgaruvchisiga tayinlanadi. Xuddi shunday, satrlardagi if ifodasi
24–25 z ning maks.dan katta ekanligini aniqlaydi. Agar shunday bo'lsa, 25-qator z ni max ga belgilaydi. Keyin chiziq
27 qo'ng'iroq qiluvchiga maksimal qaytaradi.

Qo'ng'iroq qilish usuli maksimal


Asosiy (6–14-qatorlar) 9-qatorda 3, 4 va 5 butun sonlar bilan maksimal chaqiriladi. Kompilyator qachon
ushbu chaqiruvga duch kelganda, u birinchi navbatda uchta turdagi argumentni oladigan maksimal usulni qidiradi
int. Bunday usul yo'q, shuning uchun kompilyator foydalanish mumkin bo'lgan umumiy usulni qidiradi
va maksimal umumiy usulni topadi. Biroq, esda tutingki, umumiy uslubga argumentlar
od mos yozuvlar turi bo'lishi kerak. Shunday qilib, kompilyator uchta int qiymatini Integer sifatida avtomatik qutiga qo'yadi
ob'ektlar va uchta Integer ob'ekti maksimal darajaga o'tkazilishini bildiradi. Sinf inter-
ger (java.lang paketi) Comparable interfeysini amalga oshiradi, shunday qilib meth-
od compareTo ikkita Integer obyektidagi int qiymatlarini solishtiradi. Shuning uchun butun sonlar
maksimal usul uchun haqiqiy argumentlar. Maksimalni ifodalovchi butun son qayta tiklanganda
o'girilib, biz uni int primer-ni chiqaradigan %d format spetsifikatsiyasi bilan chiqarishga harakat qilamiz.
itive tipidagi qiymat. Shunday qilib, maksimalning qaytish qiymati int qiymati sifatida chiqariladi.
Shunga o'xshash jarayon 11-qatorda maksimal darajaga o'tkazilgan uchta qo'sh argument uchun sodir bo'ladi.
Har bir dubl Double ob'ekt sifatida autoboxed qilinadi va maksimal darajaga o'tkaziladi. Shunga qaramay, bunga ruxsat beriladi
chunki Double klassi (java.lang paketi) Comparable interfeysini amalga oshiradi.
Maksimal qaytarilgan Double %.1f format aniqlagich bilan chiqariladi, u chiqadi
ikkilamchi primitiv turdagi qiymat. Shunday qilib, maksimalning qaytish qiymati avtomatik ravishda ochiladi va a sifatida chiqariladi
ikki barobar. 13-qatordagi maksimal qo'ng'iroq uchta satrni oladi, ular ham Compa-
rable ob'ektlari. Biz ataylab eng katta qiymatni boshqa pozitsiyaga joylashtirdik
har bir usul chaqiruvi (9, 11 va 13-qatorlar) umumiy usul har doim topilganligini ko'rsatish uchun.
argumentlar ro'yxatidagi o'rnidan qat'i nazar, maksimal qiymat.

848 20-bob Umumiy sinflar va usullar

Oʻchirish va tur parametrining yuqori chegarasi
Kompilyator maksimal usulni bayt-kodlarga tarjima qilganda, uni almashtirish uchun o'chirishdan foydalanadi
haqiqiy turlar bilan tip parametrlari. 20.3-rasmda barcha umumiy turlar Ob- turiga almashtirildi.
ob'ekt. Aslida, barcha turdagi parametrlar tur parametrining yuqori chegarasi bilan almashtiriladi,
turi-parametr bo'limida ko'rsatilgan. 20.6-rasmda usulning o'chirilishi taqlid qilingan
type-parametr bo'limidan keyin usulning manba kodini ko'rsatish orqali maksimal turlari
o'chirildi va T tipi parametri yuqori chegara bilan almashtiriladi, solishtirma, bo'ylab
usul deklaratsiyasi. Comparable ning o'chirilishi shunchaki solishtirish mumkin.

O'chirishdan so'ng, maksimal usul uning solishtiriladigan turini qaytarishini bildiradi. Biroq,


qo'ng'iroq qilish usuli solishtirma qabul qilishni kutmaydi. U ob'ektni olishni kutadi
argument sifatida maksimalga uzatilgan bir xil turdagi - Integer, Double yoki String
bu misolda. Kompilyator tip-parametr ma'lumotlarini bilan almashtirganda
Usul deklaratsiyasida yuqori chegara turi, shuningdek, oldinga aniq cast operatsiyalarini kiritadi
Qaytarilgan qiymat qo'ng'iroq qiluvchi tomonidan kutilgan turdagi bo'lishini ta'minlash uchun har bir usul chaqiruvi.
Shunday qilib, 9-qatorda (20.5-rasm) maksimalga qo'ng'iroq qilishdan oldin Integer cast bo'ladi, xuddi shunday

11-qatordagi maksimalga qo'ng'iroqdan oldin, quyidagi kabi Double cast bilan amalga oshiriladi

va 13-qatordagi maksimalga qo'ng'iroqdan oldin, quyidagi kabi String cast bilan amalga oshiriladi

Har bir holatda, qaytariladigan qiymat uchun quyma turi meth-ning turlaridan kelib chiqadi.


Muayyan usul chaqiruvidagi od argumentlari, chunki usul deklaratsiyasiga ko'ra,
qaytish turi va argument turlari mos keladi. Jeneriklarsiz siz javobgar bo'lasiz
quyish operatsiyasini amalga oshirish.
20.5 Umumiy usullarni ortiqcha yuklash
Umumiy usul boshqa har qanday usul kabi ortiqcha yuklanishi mumkin. Bir sinf ikkita yoki undan ko'pni taqdim etishi mumkin
bir xil usul nomini, lekin boshqa usul parametrlarini belgilaydigan umumiy usullar. Uchun
Masalan, 20.3-rasmdagi printArray umumiy usuli boshqasi bilan ortiqcha yuklanishi mumkin

1 umumiy statik maksimal (x, y, z)


2 {
3 max = x; // faraz qilaylik, x dastlab eng katta
4
5 agar (y.qiyoslash(maks) > 0)
6 max = y; // y hozirgacha eng kattasi
7
8 agar (z.qiyoslash(maks) > 0)
9 max = z; // z eng kattasi
10
Maksimal qaytish 11; // eng katta ob'ektni qaytaradi
12 }

20.6-rasm | O'chirishdan keyin maksimal umumiy usul kompilyator tomonidan amalga oshiriladi.

(Butun) maksimal(3, 4, 5)

(Ikki marta) maksimal (6,6, 8,8, 7,7)

(String) maksimal("nok", "olma", "apelsin")

Taqqoslanadigan solishtiriladigan solishtiriladigan solishtiriladigan

Taqqoslash mumkin

20.6 Umumiy sinflar 849



printArray umumiy usuli lowSubscript va highSub- qo'shimcha parametrlari bilan.
massivning chiqish qismini belgilash uchun skript (20.5-mashqga qarang).
Umumiy usulni umumiy bo'lmagan usullar bilan ham ortiqcha yuklash mumkin. Qachon kompilyator
usul chaqiruviga duch kelsa, u eng mos keladigan usul deklaratsiyasini qidiradi
usul nomi va qo'ng'iroqda ko'rsatilgan argument turlari - agar ikkita yoki undan ko'p bo'lsa, xatolik yuzaga keladi
haddan tashqari yuklangan usullarning ikkalasi ham eng yaxshi mos deb hisoblanishi mumkin. Masalan, umumiy usul
20.3-rasmdagi printArray stringsga xos versiya bilan haddan tashqari yuklanishi mumkin,
Bu Stringlarni aniq, jadvalli formatda chiqaradi (20.6-mashqga qarang).
20.6 Umumiy sinflar
Ma'lumotlar strukturasi tushunchasi, masalan, stek, boshqa ma'lumotlardan mustaqil ravishda tushunilishi mumkin.
u manipulyatsiya qiladi. Umumiy sinflar a tushunchasini tavsiflash uchun vositani taqdim etadi
stack (yoki boshqa har qanday sinf) turiga bog'liq bo'lmagan tarzda. Keyin biz o'ziga xos turni yaratishimiz mumkin
umumiy sinf ob'ektlari. Generics dasturiy ta'minotni qayta ishlatish uchun yaxshi imkoniyat beradi.
Umumiy sinfga ega bo'lganingizdan so'ng, uni ko'rsatish uchun oddiy, ixcham belgidan foydalanishingiz mumkin
sinf turi parametr(lar)i oʻrniga ishlatilishi kerak boʻlgan tur(lar). Kompilyatsiya vaqtida,
kompilyator kodingiz turi xavfsizligini ta'minlaydi va tasvirlangan o'chirish usullaridan foydalanadi
20.3–20.4 bo'limlarida mijoz kodingizni umumiy sinf bilan o'zaro ta'sir qilish imkonini beradi.
Masalan, bitta umumiy Stack klassi ko'plab mantiqiy narsalarni yaratish uchun asos bo'lishi mumkin
Stack sinflari (masalan, "Stack of Double", "Stack of Integer", "Stack of characters", "Stack"
Xodimlar"). Bu sinflar parametrlashtirilgan sinflar yoki parametrlashtirilgan turlar deb nomlanadi
chunki ular bir yoki bir nechta turdagi parametrlarni qabul qiladi. Esda tutingki, bu turdagi parametrlar
faqat mos yozuvlar turlari, ya'ni Stack umumiy klassi primer bilan yaratilmaydi.
tirnash xususiyati beruvchi turlari. Biroq, biz Java-ning o'ramidagi ob'ektlarni saqlaydigan Stackni yaratishimiz mumkin
sinflar va Java-ga ibtidoiy qiymatlarni ob'ektlarga aylantirish uchun autoboxingdan foydalanishga ruxsat bering. Eslab qoling
Avtobokslash ibtidoiy turdagi qiymat (masalan, int) stekga surilganda sodir bo'ladi.
o'rash sinfidagi ob'ektlarni o'z ichiga oladi (masalan, Integer). Avtomatik qutidan chiqarish ob'ekt qachon sodir bo'ladi
o'rash sinfining bir qismi Stackdan chiqariladi va ibtidoiy turdagi o'zgaruvchiga tayinlanadi.
Umumiy stack sinfini amalga oshirish
20.7-rasmda namoyish qilish uchun umumiy Stack sinfi e'lon qilingan - java.util
paket allaqachon umumiy Stack sinfini o'z ichiga oladi. Umumiy sinf deklaratsiyasi bo'lmaganga o'xshaydi.
umumiy, lekin sinf nomidan keyin tip-parametr bo'limi (5-qator) keladi. Ushbu holatda,
type parametri T Stack boshqaradigan element turini ifodalaydi. Umumiy kabi
usullarda, umumiy sinfning tip-parametr bo'limi bir yoki bir nechta turdagi parametrlarga ega bo'lishi mumkin.
eterlar vergul bilan ajratiladi. (Siz ikkita turdagi parametrlarga ega umumiy sinf yaratasiz
20.8-mashq.) T tipi parametri Stack klassi deklaratsiyasida takrorlash uchun ishlatiladi.
element turini yubordi. Ushbu misol Stackni ArrayList sifatida amalga oshiradi.
Class Stack o'zgaruvchi elementlarni ArrayList sifatida e'lon qiladi (7-qator). Ushbu ArrayList
Stack elementlarini saqlaydi. Ma'lumki, ArrayList dinamik ravishda o'sishi mumkin
Stack sinfimiz ob'ektlari ham dinamik ravishda o'sishi mumkin. Stack sinfining argumentsiz kelishuvi
struktor (10–13-qatorlar) yaratish uchun bitta argumentli konstruktorni (16–20-qatorlar) chaqiradi.
Asosiy ArrayList 10 ta element sig'imiga ega bo'lgan stek. bitta-argu-
ment konstruktori ko'rsatilgan boshlang'ich bilan Stack yaratish uchun to'g'ridan-to'g'ri chaqirilishi mumkin
sig'im. 18-qator konstruktor argumentini tasdiqlaydi. 19-qator ArrayList ni yaratadi
belgilangan quvvat (yoki sig'im yaroqsiz bo'lsa 10).

850 20-bob Umumiy sinflar va usullar

Push usuli (23–26-qatorlar) surilgan elementni qo'shish uchun ArrayList qo'shish usulidan foydalanadi
ArrayList elementlarining oxirigacha. ArrayListdagi oxirgi element ni ifodalaydi
to'plamning yuqori qismi.
Pop usuli (29–36-qatorlar) birinchi navbatda pop qilishga urinish yoki yo'qligini aniqlaydi
bo'sh stackdagi element. Agar shunday bo'lsa, 32-qator EmptyStackException ni chiqaradi (e'lon qilingan
20.8-rasmda). Aks holda, 20.7-rasmdagi 35-satr Stack by ning yuqori elementini qaytaradi
asosiy ArrayListdagi oxirgi elementni olib tashlash.
EmptyStackException klassi (20.8-rasm) argumentsiz konstruktor va
bir argumentli konstruktor. Argumentsiz konstruktor standart xato xabarini o'rnatadi,
va bitta argumentli konstruktor maxsus xato xabarini o'rnatadi.
Umumiy usullarda bo'lgani kabi, umumiy sinf tuzilganda, kompilyator era-ni bajaradi.
sinf turi parametrlariga ishonch hosil qiladi va ularni yuqori chegaralari bilan almashtiradi. Sinf uchun

1 // 20.7-rasm: Stack.java


2 // Stack umumiy sinf deklaratsiyasi.
3 import java.util.ArrayList;
4
5 umumiy sinf Stack
6 {
7
8
9 // argumentsiz konstruktor standart o'lchamdagi stekni yaratadi
10 ta umumiy stack()
11 {
12 bu(10); // standart stek hajmi
13 }
14
15 // konstruktor belgilangan miqdordagi elementlardan iborat stekni yaratadi
16 ommaviy stek (int sig'imi)
17 {
18 int initCapacity = sig'im> 0? sig'imi: 10; // tasdiqlang
19
20 }
21
22 // elementni stekga suring
23
24 {
25
26 }
27
28 // agar bo'sh bo'lmasa, yuqori elementni qaytaring; boshqa EmptyStackException ni tashlang
29 ommaviy T pop()
30 {
31 if (elements.isEmpty()) // agar stek bo'sh bo'lsa
32 yangi EmptyStackException ("Stack bo'sh, ochilib bo'lmaydi");
33
34 // Stackning yuqori elementini olib tashlang va qaytaring
35 qaytarish elements.remove(element.size() - 1);
36 }
37 } // oxirgi sinf Stack

20.7-rasm | Stack umumiy sinf deklaratsiyasi.

xususiy yakuniy ArrayList elementlari; // ArrayList stek elementlarini saqlaydi

elementlar = yangi ArrayList(initCapacity); // ArrayList yarating

public void push (T pushValue)

elements.add(pushValue); // pushValue-ni Stack-ga joylashtiring


20.6 Umumiy sinflar 851

Stack (20.7-rasm), yuqori chegara belgilanmagan, shuning uchun standart yuqori chegara Ob'ekt hisoblanadi.
ishlatilgan. Umumiy sinf turi parametrining doirasi butun sinfdir. Biroq, yozing
parametrlarni sinfning statik o'zgaruvchilar deklaratsiyasida ishlatib bo'lmaydi.

20.7-rasmdagi umumiy stek sinfini sinovdan o'tkazish


Endi, Stack umumiy sinfidan foydalanadigan dasturni (20.9-rasm) ko'rib chiqamiz (20.7-rasm).
20.9-rasmdagi 12-13 qatorlar Stack tipidagi o'zgaruvchilarni yaratadi va ishga tushiradi (pro-
"Stack of Double") va Stack ("Stack of Integer" deb o'qiladi). The
Double va Integer turlari Stack turi argumentlari sifatida tanilgan. Kompilyator foydalanadi
ularni tip parametrlarini almashtirish uchun, u tipni tekshirish va quyma qo'shishni amalga oshirishi mumkin
kerak bo'lganda operatsiyalar. Tez orada aktyorlik operatsiyalari haqida batafsilroq gaplashamiz. 12-qatorlar
5 ta sig‘imga ega 13 instant doubleStack va 10 ta sig‘imli integerStack
(standart). 16–17 va 20–21-qatorlar testPushDouble chaqiruv usullari (25–36-qatorlar),
testPopDouble (39–59-qatorlar), testPushInteger (62–73-qatorlar) va testPopInteger
(76–96-qatorlar), mos ravishda ushbu misolda ikkita Stackni ko'rsatish uchun.

1 // 20.8-rasm: EmptyStackException.java


2 // EmptyStackException sinf deklaratsiyasi.
3 umumiy sinf EmptyStackException RuntimeException-ni kengaytiradi
4 {
5 // argumentsiz konstruktor
6 ommaviy EmptyStackException()
7 {
8 this("Stack bo'sh");
9 }
10
11 // bitta argumentli konstruktor
12 ommaviy EmptyStackException (String xabari)
13 {
14 super(xabar);
15 }
16 } // oxirgi sinf EmptyStackException

20.8-rasm | EmptyStackException sinf deklaratsiyasi.

1 // 20.9-rasm: StackTest.java
2 // Stack umumiy sinf test dasturi.
3
4 umumiy sinf StackTest
5 {
6 ta umumiy statik bekor asosiy(String[] args)
7 {
8 ta double[] doubleElements = {1.1, 2.2, 3.3, 4.4, 5.5};
9 int[] integerElements = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
10
11
12
13
14

20.9-rasm | Stack umumiy sinf sinov dasturi. (3-qismning 1-qismi.)

// Stack va Stack yarating
Stack doubleStack = new Stack<>(5);
Stack integerStack = new Stack<>();

852 20-bob Umumiy sinflar va usullar

15 // doubleElements elementlarini doubleStack-ga suring
16 testPushDouble(doubleStack, doubleElements);
17 testPopDouble(doubleStack); // doubleStack-dan oching
18
19 // integerElements elementlarini integerStack-ga surish
20 testPushInteger(integerStack, integerElements);
21 testPopInteger(integerStack); // integerStack dan ochiladi
22 }
23
24 // juft stek bilan surish usulini sinab ko'ring
25 ta shaxsiy statik bekor testPushDouble(
26 Stack stek, double[] qiymatlari)
27 {
28 System.out.printf("%nElementlarni doubleStack%n ga surish");
29
30 // elementlarni Stackga suring
31 uchun (ikki marta qiymat: qiymatlar)
32 {
33 System.out.printf("%.1f ", qiymat);
34
35 }
36 }
37
38 // ikkita stek bilan pop usulini sinab ko'ring
39 shaxsiy statik bekor testPopDouble(Stack stek)
40 {
41 // stekdan ochilgan elementlar
42 urinib ko'ring
43 {
44 System.out.printf("%nDoubleStack%n dan ochilgan elementlar");
45 ikki barobar popValue; // stekdan olib tashlangan elementni saqlash
46
47 // Stackdan barcha elementlarni olib tashlang
48 vaqt (to'g'ri)
49 {
50
51 System.out.printf("%.1f ", popValue);
52 }
53 }
54 ta tutish (EmptyStackException emptyStackException)
55 {
56 System.err.println();
57 emptyStackException.printStackTrace();
58 }
59 }
60
61 // butun sonlar to'plami bilan surish usulini sinab ko'ring
62 shaxsiy statik bekor testPushInteger(
63 Stack stek, int[] qiymatlari)
64 {
65 System.out.printf("%nElementlarni integerStack%n ga surish");
66

20.9-rasm | Stack umumiy sinf sinov dasturi. (3 qismning 2-qismi.)

stack.push(qiymat); // doubleStack-ga suring

popValue = stack.pop(); // doubleStack-dan oching


20.6 Umumiy sinflar 853

testPushDouble va testPopDouble usullari
testPushDouble usuli (25–36-qatorlar) juftlikni joylashtirish uchun push usulini (34-qator) chaqiradi.
doubleElements massividan doubleStack-ga 1.1, 2.2, 3.3, 4.4 va 5.5 qiymatlari. Autobox-

67 // elementlarni Stackga surish


68 uchun (int qiymati: qiymatlar)
69 {
70 System.out.printf("%d ", qiymat);
71
72 }
73 }
74
75 // butun sonli stek bilan pop usulini sinab ko'ring
76 shaxsiy statik bekor testPopInteger(Stack stek)
77 {
78 // stekdan ochilgan elementlar
79 urinib ko'ring
80 {
81 System.out.printf("integerStack%n dan%nPopping elementlar");
82 int popValue; // stekdan olib tashlangan elementni saqlash
83
84 // Stackdan barcha elementlarni olib tashlang
85 vaqt (to'g'ri)
86 {
87
88 System.out.printf("%d ", popValue);
89 }
90 }
91 ta tutish (EmptyStackException emptyStackException)
92 {
93 System.err.println();
94 emptyStackException.printStackTrace();
95 }
96 }
97 } // oxirgi sinf StackTest

Elementlarni doubleStack-ga surish


1,1 2,2 3,3 4,4 5,5
DoubleStack-dan ochiladigan elementlar
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest.testPopDouble da (StackTest.java:50)
StackTest.main da (StackTest.java: 17)
IntegerStack-ga elementlarni surish
1 2 3 4 5 6 7 8 9 10
integerStack dan elementlarni ochish
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest.testPopInteger da (StackTest.java:87)
StackTest.main da (StackTest.java: 21)

20.9-rasm | Stack umumiy sinf sinov dasturi. (3 qismning 3-qismi.)

stack.push(qiymat); // integerStack-ga suring

popValue = stack.pop(); // intStack-dan oching


854 20-bob Umumiy sinflar va usullar

ing 34-qatorda dastur ibtidoiy ikkilamchi qiymatni bosishga harakat qilganda sodir bo'ladi
doubleStack, bu faqat Double ob'ektlariga havolalarni saqlaydi.
testPopDouble usuli (39–59-qatorlar) Stack usuli pop-ni (50-qator) chaqiradi.
stekdan barcha qiymatlarni olib tashlash uchun cheksiz pastadir (48-52 qatorlar). Chiqish shuni ko'rsatadi
qiymatlar, albatta, oxirgi kelgan, birinchi chiqish tartibida ochiladi (steklarning belgilovchi xususiyati).
Loop oltinchi qiymatni ochishga harakat qilganda, doubleStack bo'sh, shuning uchun ochiladi
EmptyStackException, bu dasturning catch blokiga o'tishiga olib keladi (liniyalar
54–58). Stack izi sodir bo'lgan istisnoni ko'rsatadi va bu usulni ko'rsatadi
Stack.java faylining 32-qatorida istisno hosil qildi (20.7-rasm). Iz ham ko'rsatadi
bu pop Stack-ning 50-qatorida (20.9-rasm) StackTest testPopDouble usuli bilan chaqirilgan.
Test.java va bu usul testPopDouble 17-qatordagi main usulidan chaqirildi
StackTest.java. Ushbu ma'lumotlar sizga yoqilgan usullarni aniqlash imkonini beradi
istisno sodir bo'lgan paytdagi usul-chaqiriqlar to'plami. Chunki dastur
istisnoni ushlaydi, istisno ishlov berilgan deb hisoblanadi va dastur
bajarishni davom ettirishi mumkin.
Avtomatik ochish 50-qatorda dastur ochilgan Double ob'ektini tayinlaganda sodir bo'ladi
stekdan ikkita ibtidoiy o'zgaruvchiga. 20.4-bo'limdan kompilyator ekanligini eslang
to'g'ri turlarning umumiy usullardan qaytarilishini ta'minlash uchun qo'shimchalar kiritadi. davrdan keyin -
Albatta, Stack usuli pop turi Ob'ektni qaytaradi, lekin testPopDouble'dagi mijoz kodi kutadi
pop usuli qaytganida double olish uchun. Shunday qilib, kompilyator quyidagi kabi Double castni qo'shadi

PopValue ga tayinlangan qiymat pop tomonidan qaytarilgan Double ob'ektidan chiqariladi.

testPushInteger va testPopInteger usullari
testPushInteger usuli (62–73-qatorlar) qiymatlarni joylashtirish uchun Stack usuli push-ni chaqiradi.
integerStack to'liq bo'lguncha. testPopInteger usuli (76–96-qatorlar) Stack usulini chaqiradi
integerStack-dan qiymatlarni olib tashlash uchun od pop. Yana bir bor, qiymatlar oxirgi marta ochiladi -
birinchi chiqish tartibi. O'chirish vaqtida kompilyator mijoz kodini usulda ekanligini tan oladi
testPopInteger usuli pop qaytarilganda int olishni kutadi. Shunday qilib, kompilyator -
kabi Integer castni kiritadi

popValue ga tayinlangan qiymat pop tomonidan qaytarilgan Integer obyektidan qutidan chiqariladi.

Sinf stekini sinash uchun umumiy usullarni yaratish
testPushDouble va testPushInteger usullaridagi kod push- uchun deyarli bir xil.
qiymatlarni mos ravishda Stack yoki Stack ga va kodga kiriting.
testPopDouble va testPopInteger usullari qiymatlarni ochish uchun deyarli bir xil
mos ravishda Stack yoki Stack. Bu yana bir imkoniyatdir
umumiy usullardan foydalaning. 20.10-rasmda testPush umumiy usuli (24–35-qatorlar) ko'rsatilgan.
20.9-rasmdagi testPushDouble va testPushInteger bilan bir xil vazifalarni hosil qiling, ya'ni push.
qiymatlarni Stack ga kiriting. Xuddi shunday, testPop umumiy usuli (20.10-rasm, 38-58-qatorlar) per-
20.9-rasmdagi testPopDouble va testPopInteger bilan bir xil vazifalarni hosil qiladi, ya'ni pop.
Stack-dan tashqari qiymatlar. 20.10-rasmdagi chiqish 20.9-rasmdagiga to'liq mos keladi.

popValue = (Ikki) stack.pop();

popValue = (Integer) stack.pop();

20.6 Umumiy sinflar 855

1 // 20.10-rasm: StackTest2.java
2 // Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish.
3 umumiy sinf StackTest2
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7 [] doubleElements = {1.1, 2.2, 3.3, 4.4, 5.5};
8 [] integerElements = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
9
10 // Stack va Stack yarating
11 Stack doubleStack = yangi Stack<>(5);
12 Stack integerStack = new Stack<>();
13
14
15
16
17
18
19
20
21 }
22
23 // testPush umumiy usuli elementlarni Stackga suradi
24
25
26 {
27 System.out.printf("%nElementlarni %s%n ga surish", nomi);
28
29 // elementlarni Stackga suring
( ) uchun 30
31 {
32 System.out.printf("%s ", element);
33 stack.push(element); // elementni stekga surish
34 }
35 }
36
37 // umumiy usul testPop stackdan elementlarni chiqaradi
38
39 {
40 // stekdan ochilgan elementlar
41 urinib ko'ring
42 {
43 System.out.printf("%s%n dan%nPopping elementlar", nomi);
44
45
46 // Stack-dan barcha elementlarni olib tashlang
47 vaqt (to'g'ri)
48 {
49 popValue = stack.pop();
50 System.out.printf("%s ", popValue);
51 }
52 }

20.10-rasm | Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish. (2-qismning 1-qismi.)

Ikki marta
Butun son

// doubleElements elementlarini doubleStack-ga surish


testPush("doubleStack", doubleStack, doubleElements);
testPop ("doubleStack", doubleStack); // doubleStack-dan oching

// integerElements elementlarini integerStack-ga surish


testPush("integerStack", integerStack, integerElements);
testPop("integerStack", integerStack); // integerStack dan ochiladi

umumiy statik void testPush(String nomi, Stack stek,


T[] elementlar)

T elementi: elementlar

umumiy statik bekor testPop(String nomi, Stack stek)

T popValue; // stekdan olib tashlangan elementni saqlash


856 20-bob Umumiy sinflar va usullar

11–12 qatorlar mos ravishda Stack va Stack obyektlarini yaratadi.
15–16 va 19–20 qatorlar Stackni sinash uchun testPush va testPop umumiy usullarini chaqiradi.
ob'ektlar. Chunki tip parametrlari massivlarni o'tkazish imkoniyatiga ega bo'lish uchun faqat mos yozuvlar turlarini ifodalashi mumkin
doubleElements va integerElements testPush umumiy usuliga, massivlarda e'lon qilingan
7-8 qatorlar Double va Integer o'rash turlari bilan e'lon qilinishi kerak. Qachon bu massivlar
ibtidoiy qiymatlar bilan ishga tushiriladi, kompilyator har bir primitiv qiymatni avtomatik qutilarga joylashtiradi.
Umumiy testPush usuli (24–35-qatorlar) T tipi parametridan foydalanadi (24-satrda ko'rsatilgan)
Stack da saqlangan ma'lumotlar turini ifodalash uchun. Umumiy usul uchta argumentni oladi.
ments—chiqarish maqsadida Stack obyekti nomini ifodalovchi satr, a
Stack tipidagi ob'ektga va T tipidagi massivga havola - elementlarning turi
Stack ga suriladi. Kompilyator turi o'rtasidagi muvofiqlikni ta'minlaydi
Stack va surish chaqirilganda Stackga suriladigan elementlar
umumiy usul chaqiruvining haqiqiy qiymati. TestPop umumiy usuli (38–58-qatorlar) oladi
ikkita argument - chiqish uchun Stack ob'ektining nomini ifodalovchi satr.
pozalar va Stack tipidagi ob'ektga havola.
20.7 Xom turlari
20.6-bo'limdagi umumiy sinf Stack uchun sinov dasturlari ar-turi bilan Stacklarni yaratadi.
guments Double va Integer. Bundan tashqari, umumiy sinf Stackni yaratish mumkin
argument turini quyidagicha belgilash:

53 catch (EmptyStackException emptyStackException)


54 {
55 System.out.println();
56 emptyStackException.printStackTrace();
57 }
58 }
59 } // oxirgi sinf StackTest2

Elementlarni doubleStack-ga surish


1,1 2,2 3,3 4,4 5,5
DoubleStack-dan ochiladigan elementlar
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest2.testPop da (StackTest2.java:50)
StackTest2.main da (StackTest2.java:17)

IntegerStack-ga elementlarni surish


1 2 3 4 5 6 7 8 9 10
integerStack dan elementlarni ochish
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
StackTest2.testPop da (StackTest2.java:50)
StackTest2.main da (StackTest2.java:21

Stack objectStack = new Stack(5); // hech qanday turdagi argument belgilanmagan

20.10-rasm | Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish. (2-qismning 2-qismi.)

20.7 Xom turlari 857

Bunday holda, objectStack xom turiga ega - kompilyator ob'ekt turini bilvosita ishlatadi.
har bir turdagi argument uchun umumiy sinf bo'ylab. Shunday qilib, oldingi bayonot a hosil qiladi
Har qanday turdagi ob'ektlarni saqlashi mumkin bo'lgan stek. Bu orqaga qarab muvofiqligi uchun muhimdir
oldingi Java versiyalari. Masalan, Java Collections Framework ma'lumotlar tuzilmalari
(16-bob) Ob'ektlarga barcha saqlangan havolalar, ammo endi umumiy turlar sifatida amalga oshirilmoqda.
Xom-turdagi Stack o'zgaruvchisiga turdagi argumentni belgilaydigan Stack tayinlanishi mumkin, masalan
Stack obyekti sifatida quyidagicha:

chunki Double turi Ob'ektning pastki sinfidir. Ushbu topshiriqga ruxsat beriladi, chunki ele-


Stack dagi mentlar (ya'ni, Double ob'ektlar) albatta ob'ektlardir - Double sinfi - bu
Ob'ektning bilvosita kichik sinfi.
Xuddi shunday, o'z deklaratsiyasida turdagi argumentni belgilaydigan Stack o'zgaruvchisi bo'lishi mumkin
quyidagi kabi xom turdagi Stack ob'ektini tayinladi:

Bu topshiriqga ruxsat berilgan boʻlsa-da, bu xavfli, chunki xom turdagi stek saqlashi mumkin


Integerdan boshqa turlar. Bunday holda, kompilyator ogohlantiruvchi xabarni chiqaradi.
xavfli topshiriqni belgilaydi.
Umumiy sinf stack bilan xom turlaridan foydalanish
20.11-rasmdagi test dasturi xom turdagi tushunchasidan foydalanadi. 11-qator umumiy sinfni yaratadi
RawTypeStack1 har qanday turdagi ob'ektlarni saqlashi mumkinligini ko'rsatadigan xom turdagi stack. Chiziq
14 rawTypeStack2 o'zgaruvchisiga Stack ni tayinlaydi, bu raw to'plami sifatida e'lon qilinadi.
turi. 17-qator Stack o'zgaruvchisiga xom turdagi Stackni tayinlaydi, bu qonuniy, lekin
kompilyatorning potentsial xavfli ekanligini ko'rsatuvchi ogohlantirish xabarini chiqarishiga sabab bo'ladi (20.12-rasm).
imzolash - yana, bu xom turdagi Stack Inte-dan boshqa turlarni saqlashi mumkinligi sababli sodir bo'ladi.
uy. Shuningdek, 19–22-qatorlardagi testPush va testPop umumiy usullariga qo‘ng‘iroqlar natijasida
kompilyatorning ogohlantirish xabarlari (20.12-rasm). Bular rawTypeStack1 va
rawTypeStack2 xom turdagi steklar sifatida e'lon qilinadi, ammo testPush va testPop usullari har biri
Muayyan turdagi argumentga ega Stack bo'lgan ikkinchi argumentni kuting. Ogohlantirishlar hind-
kompilyator steklar tomonidan boshqariladigan turlarning to'g'riligiga kafolat bera olmaydi
turlari, chunki biz tip argumenti bilan e'lon qilingan o'zgaruvchini taqdim etmadik. TestPush usullari
(20.11-rasm, 28-39-qatorlar) va testPop (42-62-qatorlar) 20.10-rasmdagi bilan bir xil.

Stack rawTypeStack2 = yangi Stack(5);

Stack integerStack = new Stack(10);

1 // 20.11-rasm: RawTypeTest.java


2 // Xom turdagi test dasturi.
3 umumiy sinf RawTypeTest
4 {
5 ta umumiy statik bekor asosiy(String[] args)
6 {
7 Double[] doubleElements = {1.1, 2.2, 3.3, 4.4, 5.5};
8 Integer[] integerElements = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
9
10
11

20.11-rasm | Xom turdagi test dasturi. (3-qismning 1-qismi.)

// Xom turdagi stek o'zgaruvchiga tayinlangan xom turdagi stek
Stack rawTypeStack1 = yangi Stack(5);

858 20-bob Umumiy sinflar va usullar

12
13
14
15
16
17
18
19 testPush("rawTypeStack1", rawTypeStack1, doubleElements);
20 testPop("rawTypeStack1", rawTypeStack1);
21 testPush("rawTypeStack2", rawTypeStack2, doubleElements);
22 testPop("rawTypeStack2", rawTypeStack2);
23 testPush("integerStack", integerStack, integerElements);
24 testPop("integerStack", integerStack);
25 }
26
27 // umumiy usul elementlarni stekga suradi
28 umumiy statik void testPush(String nomi, Stack stek,
29 T[] element)
30 {
31 System.out.printf("%nElementlarni %s%n ga surish", nomi);
32
33 // elementlarni Stackga suring
34 uchun (T element: elementlar)
35 {
36 System.out.printf("%s ", element);
37 stack.push(element); // elementni stekga surish
38 }
39 }
40
41 // testPop umumiy usuli stekdan elementlarni chiqaradi
42 umumiy statik bekor testPop (String nomi, Stack stek)
43 {
44 // stekdan ochilgan elementlar
45 urinib ko'ring
46 {
47 System.out.printf("%s%n dan%nPopping elementlar", nomi);
48 T popValue; // stekdan olib tashlangan elementni saqlash
49
50 // Stack-dan elementlarni olib tashlang
51 vaqt (to'g'ri)
52 {
53 popValue = stack.pop(); // stekdan ochiladi
54 System.out.printf("%s ", popValue);
55 }
56 } // urinishni tugatish
57 catch (EmptyStackException emptyStackException)
58 {
59 System.out.println();
60 ta emptyStackException.printStackTrace();
61 }
62 }
63 } // oxirgi sinf RawTypeTest

20.11-rasm | Xom turdagi test dasturi. (3 qismning 2-qismi.)

// Stack o'zgaruvchining xom turdagi stackiga tayinlangan
Stack rawTypeStack2 = yangi Stack(5);

// Stack o'zgaruvchisiga tayinlangan xom turdagi stek


Stack integerStack = new Stack(10);

20.7 Xom turlari 859

Kompilyator haqida ogohlantirishlar
20.12-rasmda Raw- fayli ochilganda kompilyator tomonidan yaratilgan ogohlantirish xabarlari ko'rsatilgan.
TypeTest.java (20.11-rasm) -Xlint:checked varianti bilan kompilyatsiya qilingan, qaysi
generiklardan foydalanadigan koddagi potentsial xavfli operatsiyalar haqida ko'proq ma'lumot beradi. The
20.11-rasmdagi birinchi ogohlantirish 17-qator uchun ishlab chiqariladi, bu esa xom-turdagi Stackni tayinlaydi.
Stack o'zgaruvchisi - kompilyator Stackdagi barcha ob'ektlar bo'lishini ta'minlay olmaydi
Butun sonli obyektlar. Keyingi ogohlantirish 19-satrda sodir bo'ladi. Kompilyator usulni belgilaydi
Double massividan testPush turi argumenti uchinchi argument sifatida o'tdi, chunki
ikkinchi usul argumenti xom-turdagi Stack o'zgaruvchisidir. Bunday holda, Double - bu tur
argument, shuning uchun kompilyator ikkinchi argument sifatida Stack ni kutadi. Ogohlantirish
kompilyator xom-turdagi Stackda faqat Doublelarni o'z ichiga olishiga ishonch hosil qila olmasligi sababli yuzaga keladi.
21-qatordagi ogohlantirish xuddi shu sababga ko'ra sodir bo'ladi, garchi haqiqiy Stack bu
rawTypeStack2 havolalari Stack hisoblanadi. Kompilyator kafolat bera olmaydi
o'zgaruvchi har doim bir xil Stack ob'ektiga murojaat qiladi, shuning uchun u o'zgaruvchining e'lon qilinganidan foydalanishi kerak
barcha turdagi tekshirishni amalga oshirish uchun yozing. 20 va 22-qatorlar har biri ogohlantirishlarni yaratadi, chunki usul
testPop argument sifatida turdagi argument ko'rsatilgan Stackni kutadi.
Biroq, testPop-ga har bir qo'ng'iroqda biz xom turdagi Stack o'zgaruvchisini o'tkazamiz. Shunday qilib, kompilyator
ogohlantirishni bildiradi, chunki u usul tanasida ishlatiladigan turlarni tekshira olmaydi. In
Umuman olganda, siz xom turlarini ishlatishdan qochishingiz kerak.

Elementlarni rawTypeStack1 ga surish


1,1 2,2 3,3 4,4 5,5
rawTypeStack1 dan ochiladigan elementlar
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
RawTypeTest.testPop da (RawTypeTest.java:53)
RawTypeTest.main da (RawTypeTest.java:20)

Elementlarni rawTypeStack2 ga surish


1,1 2,2 3,3 4,4 5,5
rawTypeStack2 dan elementlarni ochish
5,5 4,4 3,3 2,2 1,1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
RawTypeTest.testPop da (RawTypeTest.java:53)
RawTypeTest.main da (RawTypeTest.java:22)

IntegerStack-ga elementlarni surish


1 2 3 4 5 6 7 8 9 10
integerStack dan elementlarni ochish
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack bo'sh, ochilib bo'lmaydi
Stack.pop da (Stack.java:32)
RawTypeTest.testPop da (RawTypeTest.java:53)
RawTypeTest.main da (RawTypeTest.java:24)

20.11-rasm | Xom turdagi test dasturi. (3 qismning 3-qismi.)


860 20-bob Umumiy sinflar va usullar

20.8 Turni qabul qiluvchi usullardagi joker belgilar
Parametrlar
Ushbu bo'limda biz joker belgilar deb nomlanuvchi kuchli generik tushunchani taqdim etamiz. Keling, keling -
joker belgilarni rag'batlantiradigan misol. Aytaylik, siz genericni amalga oshirmoqchisiz
ArrayList kabi to'plamdagi raqamlarni jamlovchi usul summasi. Siz boshlaysiz

RawTypeTest.java: 17: ogohlantirish: [belgilanmagan] tekshirilmagan konvertatsiya


topildi: Stack
talab qilinadi: Stack
Stack integerStack = new Stack(10);
^
RawTypeTest.java: 19: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPush("rawTypeStack1", rawTypeStack1, doubleElements);
^
RawTypeTest.java:19: ogohlantirish: [checked] belgilanmagan usulni chaqirish:
testPush(java.lang.String,Stack,T[]) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack,java.lang.Double[])
testPush("rawTypeStack1", rawTypeStack1, doubleElements);
^
RawTypeTest.java: 20: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPop("rawTypeStack1", rawTypeStack1);
^
RawTypeTest.java:20: ogohlantirish: [belgilanmagan] belgilanmagan usulni chaqirish:
testPop(java.lang.String,Stack) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack)
testPop("rawTypeStack1", rawTypeStack1);
^
RawTypeTest.java: 21: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPush("rawTypeStack2", rawTypeStack2, doubleElements);
^
RawTypeTest.java:21: ogohlantirish: [checked] belgilanmagan usulni chaqirish:
testPush(java.lang.String,Stack,T[]) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack,java.lang.Double[])
testPush("rawTypeStack2", rawTypeStack2, doubleElements);
^
RawTypeTest.java: 22: ogohlantirish: [checked] tekshirilmagan konvertatsiya
topildi: Stack
talab qilinadi: Stack
testPop("rawTypeStack2", rawTypeStack2);
^
RawTypeTest.java:22: ogohlantirish: [checked] Tekshirilmagan usulni chaqirish:
testPop(java.lang.String,Stack) RawTypeTest-da qo'llaniladi
(java.lang.String,Stack)
testPop("rawTypeStack2", rawTypeStack2);
^
9 ta ogohlantirish

20.12-rasm | Kompilyatordan ogohlantirish xabarlari.


20.8 Tur parametrlarini qabul qiluvchi usullardagi joker belgilar 861

raqamlarni to'plamga kiritish. Chunki umumiy sinflar faqat sinf bilan ishlatilishi mumkin
yoki interfeys turlari bo'lsa, raqamlar turi o'rash sinflari ob'ektlari sifatida avtomatik qutiga joylashtiriladi.
Misol uchun, har qanday int qiymati Integer ob'ekti sifatida avtomatik qutiga joylashtiriladi va har qanday ikki tomonlama qiymat -
ue Double ob'ekt sifatida autoboxed bo'ladi. Biz barcha raqamlarni jamlashni xohlaymiz
turlaridan qat'iy nazar ArrayList. Shu sababli, biz ArrayList bilan e'lon qilamiz
Integer va Doublening yuqori sinfi bo'lgan raqam turi argumenti. Bundan tashqari -
tion, usul summasi ArrayList tipidagi parametrni oladi va uning jami
mentlar. 20.13-rasmda Raqamlar qatori ro'yxatining elementlari jami ko'rsatilgan.

11-qator Raqamlar massivini e'lon qiladi va ishga tushiradi. Initsializatorlar oddiy bo'lgani uchun


itive qiymatlari, Java har bir ibtidoiy qiymatni mos keladigan o'ramning ob'ekti sifatida avtomatik qutilarga joylashtiradi
turi. 1 va 3 int qiymatlari Integer ob'ektlari sifatida avtomatik qutiga joylashtirilgan va qo'sh qiymatlar 2.4

1 // 20.13-rasm: TotalNumbers.java


2 // ArrayListdagi sonlarni jamlash.
3 import java.util.ArrayList;
4
5 umumiy sinf Jami sonlar
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // o'z ichiga olgan Raqamlar ArrayListini yaratish, ishga tushirish va chiqarish
10 // Integers va Doubles, so'ngra elementlarning umumiy sonini ko'rsatadi
11
12
13
14 uchun (Raqam elementi: raqamlar)
15
16
17 System.out.printf("numberList tarkibida: %s%n", );
18 System.out.printf("Raqamlar ro'yxatidagi elementlarning jami: %.1f%n",
19);
20 }
21
22 // ArrayList elementlarining umumiy sonini hisoblang
23 umumiy statik ikki tomonlama summa (roʻyxat)
24 {
25 juft jami = 0; // jami ishga tushirish
26
27 // summani hisoblang
28
29
30
Jami 31 daromad;
32 }
33 } // yakuniy sinf TotalNumbers

numberList tarkibiga quyidagilar kiradi: [1, 2.4, 3, 4.1]


Raqamlar ro'yxatidagi elementlarning umumiy soni: 10.5

20.13-rasm | ArrayListdagi sonlarni jamlash.

Raqam[] raqamlar = {1, 2.4, 3, 4.1}; // Butun sonlar va juftliklar
ArrayList numberList = new ArrayList<>();

numberList.add(element); // har bir raqamni raqamlar ro'yxatiga joylashtiring

raqamlar ro'yxati

yig'indisi (raqamlar ro'yxati)

ArrayList

uchun (raqamli element: ro'yxat)


jami += element.doubleValue();

862 20-bob Umumiy sinflar va usullar

va 4.1 Double ob'ektlar sifatida autoboxed qilingan. 12-qator ArrayList obyektini e'lon qiladi va yaratadi
u raqamlarni saqlaydi va uni numberList o'zgaruvchisiga tayinlaydi.
14-15 qatorlar massiv raqamlarini o'tkazing va har bir elementni numberList-ga joylashtiring. 17-qator
ArrayList tarkibini String sifatida chiqaradi. Bu bayonot bilvosita chaqiradi
ArrayListning toString usuli, bu “[elementlar]” shaklidagi satrni qaytaradi.
elementlar vergul bilan ajratilgan elementlar roʻyxatidir. 18–19 qatorlar
sum usuliga chaqiruv orqali qaytariladigan elementlar yig'indisini ko'rsatish.
Usul yig'indisi (23–32-qatorlar) Raqamlar qatori ro'yxatini oladi va umumiy miqdorni hisoblaydi
to'plamdagi raqamlardan. Usul hisob-kitoblarni amalga oshirish uchun ikki tomonlama qiymatlardan foydalanadi.
qiladi va natijani dubl sifatida qaytaradi. 28–29 qatorlar kengaytirilgan for bayonotidan foydalanadi,
massivlar va Collections Frame to'plamlari bilan ishlash uchun mo'ljallangan.
ish, ArrayList elementlarini jamlash uchun. for bayonoti har bir raqamni belgilaydi
ArrayList-ni o'zgaruvchi elementga kiriting, so'ngra ni olish uchun DoubleValue Number usulidan foydalanadi
Raqamning asosiy ibtidoiy qiymati ikki tomonlama qiymat sifatida. Natija jamiga qo'shiladi. Qachon
tsikl tugaydi, usul jami qaytaradi.
Uning parametrida joker belgilar turi argumenti bilan usul summasini amalga oshirish
Eslatib o'tamiz, 20.13-rasmdagi usul summasining maqsadi saqlangan har qanday turdagi raqamlarni jamlash edi.
ArrayList ichida. Biz Integer va ikkalasini o'z ichiga olgan Raqamlar ArrayListini yaratdik
Ikki tomonlama ob'ektlar. 20.13-rasmdagi ma'lumotlar yig'indisi usul to'g'ri ishlaganligini ko'rsatadi.
Usul yig'indisi Raqamlar qatori ro'yxatining elementlarini jamlashi mumkinligini hisobga olsak, siz quyidagilarni qilishingiz mumkin:
Usul faqat bitta elementni o'z ichiga olgan ArrayLists uchun ham ishlaydi
raqamli tip, masalan, ArrayList. Shunday qilib, biz yaratish uchun TotalNumbers sinfini o'zgartirdik
Butun sonlar ArrayList va uni sum usuliga o'tkazing. Dasturni kompilyatsiya qilganimizda,
kompilyator quyidagi xato xabarini chiqaradi:

Raqam butun sonning yuqori sinfi bo'lsa-da, kompilyator Array- turini hisobga olmaydi.


Ro'yxat ArrayList ning yuqori sinfi bo'lishi uchun. Agar shunday bo'lsa, unda har bir operatsiya biz
ArrayList da ishlashi mumkin, ArrayListda ham ishlaydi. Con-
ArrayList ga Double ob'ektini qo'shishingiz mumkinligini yodda tuting, chunki Double
Bu raqam, lekin siz ArrayList ga Double ob'ektini qo'sha olmaysiz, chunki Dou-
ble butun son emas. Shunday qilib, subtip munosabatlari bajarilmaydi.
Elementlarni jamlay oladigan summa usulining yanada moslashuvchan versiyasini qanday yaratamiz
Raqamning har qanday kichik sinfining elementlarini o'z ichiga olgan har qanday ArrayListning? Bu erda joker belgi
turdagi argumentlar muhim ahamiyatga ega. Joker belgilar usul parametrlarini belgilash, qaytarish imkonini beradi
qiymatlar, o'zgaruvchilar yoki maydonlar va boshqalar, ular parametrlangan turlarning supertiplari yoki pastki turlari sifatida ishlaydi.
20.14-rasmda usul summasining parametri 50-satrda quyidagi tur bilan e'lon qilinadi:

Joker tipdagi argument savol belgisi (?) bilan belgilanadi, bu oʻz-oʻzidan anni ifodalaydi


"noma'lum tur." Bunday holda, joker belgi sinf raqamini kengaytiradi, ya'ni yovvoyi belgilar
karta Raqamning yuqori chegarasiga ega. Shunday qilib, noma'lum turdagi argument yoki raqam bo'lishi kerak.
ber yoki Raqamning kichik sinfi. Bu erda ko'rsatilgan parametr turi bilan usul summasini olish mumkin
ArrayList (satr) kabi har qanday son turini o'z ichiga olgan ArrayList argumenti
20), ArrayList (33-qator) yoki ArrayList (46-qator).

sum(java.util.ArrayList) TotalNumbersErrors ichida


(java.util.ArrayList) ga qoʻllash mumkin emas.

ArrayList


20.8 Tur parametrlarini qabul qiluvchi usullardagi joker belgilar 863

1 // 20.14-rasm: WildcardTest.java
2 // Wildcard test dasturi.
3 import java.util.ArrayList;
4
5 umumiy sinf Wildcard Testi
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 // Butun sonlar ArrayListini yarating, ishga tushiring va chiqaring
10 // elementlarning umumiy miqdorini ko'rsatish
11 Integer[] butun sonlar = {1, 2, 3, 4, 5};
12
13
14 // integerList-ga elementlarni kiriting
15 uchun (Integer element: integers)
16 integerList.add(element);
17
18 System.out.printf("integerList tarkibida: %s%n", integerList);
19 System.out.printf("IntegerListdagi elementlarning jami: %.0f%n%n",
20);
21
22 // ArrayList of Doubles ni yarating, ishga tushiring va chiqaring, keyin
23 // elementlarning umumiyligini ko'rsatish
24 Double[] ikki barobar = {1.1, 3.3, 5.5};
25
26
27 // doubleList-ga elementlarni kiriting
28 uchun (Ikki element: ikki barobar)
29 doubleList.add(element);
30
31 System.out.printf("doubleList tarkibida: %s%n", doubleList);
32 System.out.printf("DoubleListdagi elementlarning umumiy soni: %.1f%n%n",
33);
34
35 // o'z ichiga olgan Raqamlar ArrayListini yarating, ishga tushiring va chiqaring
36 // Integers ham, Doubles ham, so'ngra elementlarning umumiy sonini ko'rsatadi
37 raqam[] raqamlari = {1, 2.4, 3, 4.1}; // Butun sonlar va juftliklar
38
39
40 // numberList-ga elementlarni kiriting
41 uchun (Raqam elementi: raqamlar)
42 numberList.add(element);
43
44 System.out.printf("numberList tarkibida: %s%n", numberList);
45 System.out.printf("Raqamlar ro'yxatidagi elementlarning jami: %.1f%n",
46);
47 } // asosiyni tugatish
48
49 // elementlarning umumiy soni; ArrayList parametrida joker belgidan foydalanish
50 umumiy statik ikki tomonlama summa (roʻyxat)
51 {
52 juft jami = 0; // jami ishga tushirish
53

20.14-rasm | Joker belgilar test dasturi. (2-qismning 1-qismi.)

ArrayList integerList = new ArrayList<>();

summa (integerList)

ArrayList doubleList = new ArrayList<>();

summa (doublelist)

ArrayList numberList = new ArrayList<>();

yig'indisi (raqamlar ro'yxati)

ArrayList

864 20-bob Umumiy sinflar va usullar

11–20 qatorlar ArrayList ni yaratadi va ishga tushiradi, uning elementlarini chiqaradi va
sumni chaqirish usuli bo'yicha ularni jami (20-satr). 24–33 qatorlar xuddi shu amallarni bajaradi
ArrayList. 37–46 qatorlar massiv uchun bir xil amallarni bajaradi.
Butun sonlar va juftlarni o'z ichiga olgan ro'yxati.
Usul summasida (50–59-qatorlar), garchi ArrayList argumentining element turlari
usuli bilan to'g'ridan-to'g'ri ma'lum emas, ular hech bo'lmaganda Number turiga ma'lum, chunki
joker belgi yuqori chegara Raqam bilan ko'rsatilgan. Shuning uchun 56-qatorga ruxsat beriladi,
chunki barcha Number obyektlarida doubleValue usuli mavjud.
Parametrlashtirilgan turlarni usulga o'tkazishda joker belgilar moslashuvchanlikni ta'minlasa ham,
ularning kamchiliklari ham bor. Chunki usul sarlavhasidagi joker belgi (?) (satr
50) tip-parametr nomini belgilamaydi, siz uni butun tur nomi sifatida ishlata olmaysiz
usul tanasi (ya'ni, siz 55-qatordagi Raqamni ? bilan almashtira olmaysiz). Biroq, mumkin edi
usul summasini quyidagicha e'lon qiling:

Bu usul har qanday raqamning elementlarini o'z ichiga olgan ArrayListni olish imkonini beradi


kichik sinf. Keyin butun usul tanasida T turi parametridan foydalanishingiz mumkin.
Agar joker belgi yuqori chegarasiz ko'rsatilgan bo'lsa, u holda faqat tiplash usullari
Ob'ekt joker belgilar turidagi qiymatlarda chaqirilishi mumkin. Shuningdek, joker belgilarni ishlatadigan usullar
ularning parametr turi argumentlaridan havola qilingan to'plamga elementlar qo'shish uchun foydalanilmaydi
parametr bo'yicha.

20.9 Yakunlash


Ushbu bobda generiklar kiritilgan. Siz umumiy usullar va sinflarni qanday e'lon qilishni o'rgandingiz
tip-parametr bo'limlarida ko'rsatilgan turdagi parametrlar bilan. Siz qanday qilib belgilashni ham o'rgandingiz

54 // summani hisoblang


55 uchun (Raqam elementi: ro'yxat)
56 jami += element.doubleValue();
57
Jami 58 daromad;
59 }
60 } // yakuniy sinf WildcardTest

integerList tarkibiga quyidagilar kiradi: [1, 2, 3, 4, 5]


IntegerListdagi elementlarning umumiy soni: 15

doubleList tarkibiga quyidagilar kiradi: [1.1, 3.3, 5.5]


DoubleListdagi elementlarning umumiy soni: 9.9

numberList tarkibiga quyidagilar kiradi: [1, 2.4, 3, 4.1]


Raqamlar ro'yxatidagi elementlarning umumiy soni: 10.5

umumiy statik ikkilangan yig'indi (ArrayList ro'yxati)

Umumiy dasturlash xatosi 20.3
Usulning tip-parametr qismida joker belgidan foydalanish yoki aniq belgi sifatida joker belgidan foydalanish
usul tanasidagi o'zgaruvchining turi sintaksis xatosidir.

20.14-rasm | Joker belgilar test dasturi. (2-qismning 2-qismi.)


Xulosa 865

tip parametrining yuqori chegarasi va Java kompilyatori oʻchirish va oʻchirishni qanday ishlatishi
umumiy usullar va sinflar bilan bir nechta turlarni qo'llab-quvvatlash. Biz qanchalik orqada qolganimizni muhokama qildik
muvofiqlik xom turlari orqali erishiladi. Shuningdek, siz umumiy belgilarda joker belgilardan qanday foydalanishni o'rgandingiz
usul yoki umumiy sinf.
21-bobda siz o'zingizning shaxsiy dinamik ma'lumotlar tuzilmangizni qanday amalga oshirishni o'rganasiz.
bajarilish vaqtida o'sishi yoki qisqarishi mumkin bo'lgan turlar. Xususan, siz ushbu ma'lumotlarni amalga oshirasiz
Ushbu bobda o'rgangan umumiy imkoniyatlardan foydalangan holda tuzilmalar.

Xulosa
20.1-bo'lim Kirish


• Umumiy usullar sizga bitta usul deklaratsiyasi bilan bog'liq usullar to'plamini belgilash imkonini beradi.
• Umumiy sinflar va interfeyslar sizga tegishli turlar to'plamini belgilash imkonini beradi.
20.2-bo'lim Umumiy usullar uchun motivatsiya
• Har xil turdagi ma'lumotlarga o'xshash operatsiyalarni bajarish uchun ko'pincha ortiqcha yuklangan usullar qo'llaniladi.
• Kompilyator usul chaqiruviga duch kelganda, u usul deklaratsiyasini a bilan topishga harakat qiladi
usul chaqiruvidagi argument turlariga mos keladigan nom va parametrlar.
20.3-bo'lim Umumiy usullar: Amalga oshirish va kompilyatsiya vaqti tarjimasi
• Agar bir nechta haddan tashqari yuklangan usullar bilan bajariladigan amallar har bir argument turi uchun bir xil bo'lsa,
ular umumiy usul yordamida yanada ixcham va qulayroq kodlanishi mumkin. Yagona umumiy
usul deklaratsiyasini har xil turdagi ma'lumotlarning argumentlari bilan chaqirish mumkin. Turlari asosida
argumentlar umumiy usulga o'tgan bo'lsa, kompilyator har bir usul chaqiruvini mos ravishda boshqaradi.
• Barcha umumiy usul deklaratsiyasi burchakli qavs bilan ajratilgan tip-parametr qismiga ega (843-bet).
ets (< va >) usulning qaytish turidan oldin (843-bet).
• Tur-parametr bo'limi vergul bilan ajratilgan bir yoki bir nechta turdagi parametrlarni o'z ichiga oladi.
• Tur parametri (843-bet) umumiy tur nomini bildiruvchi identifikatordir. Tip parametrlari mumkin
umumiy usulda qaytarish turi, parametr turlari va mahalliy o'zgaruvchilar turlari sifatida ishlatilishi mumkin.
tion va ular umumiy usulga o'tgan argumentlar turlari uchun o'rinbosar vazifasini bajaradi,
haqiqiy turdagi argumentlar sifatida tanilgan (844-bet). Tur parametrlari faqat havolani ifodalashi mumkin
turlari.
• Usul deklaratsiyasida foydalaniladigan tip-parametr nomlari e'lon qilinganlarga mos kelishi kerak
tip-parametr bo'limi. Tip-parametr nomi faqat bir marta tip-parametrda e'lon qilinishi mumkin
bo'limi, lekin usul parametrlari ro'yxatida bir necha marta paydo bo'lishi mumkin.
• Kompilyator usul chaqiruviga duch kelganda, u argument turlarini va urinishlarini aniqlaydi
argument turlariga mos keladigan bir xil nom va parametrlarga ega usulni toping. Agar bor bo'lsa
Bunday usul bo'lmasa, kompilyator bir xil nom va mos parametrlarga ega usullarni qidiradi.
eters va mos keladigan umumiy usullar uchun.
• Umumiy interfeysni amalga oshiradigan sinf ob'ektlari Comparable (Comparable) solishtirish mumkin
Agar ob'ektlar teng bo'lsa, 0, manfiy butun sonni qaytaradigan compareTo usuli bilan (846-bet)
birinchi ob'ekt ikkinchidan kichik yoki birinchi ob'ekt dan katta bo'lsa musbat butun son
ikkinchi.
• Primitiv turlar uchun barcha turdagi o'rash sinflari Comparable ni amalga oshiradi.
• Taqqoslanadigan obyektlardan Collections sinfining saralash va qidirish usullari bilan foydalanish mumkin.

866 20-bob Umumiy sinflar va usullar



20.4-bo'lim Kompilyatsiya vaqtidagi qo'shimcha tarjima muammolari: Turdan foydalanadigan usullar
Qaytish turi sifatida parametr
• Umumiy usul kompilyatsiya qilinganda, kompilyator turini olib tashlash uchun o'chirishni amalga oshiradi (848-bet).
parametr bo'limi va turdagi parametrlarni haqiqiy turlar bilan almashtiring. Odatiy bo'lib, har bir turdagi parametr-
eter o'zining yuqori chegarasi bilan almashtiriladi (848-bet), agar boshqacha ko'rsatilmagan bo'lsa, bu Ob'ekt.
• Oʻchirish turi oʻzgaruvchini qaytaruvchi usulda amalga oshirilganda (848-bet), aniq translatsiyalar amalga oshiriladi.
Qaytarilgan qiymat kutilgan turga ega bo'lishini ta'minlash uchun har bir usul chaqiruvi oldiga kiritilgan
qo'ng'iroq qiluvchi.
20.5-bo'lim Umumiy usullarni ortiqcha yuklash
• Umumiy usul boshqa umumiy usullar yoki umumiy bo'lmagan usullar bilan ortiqcha yuklanishi mumkin.
20.6-bo'lim Umumiy sinflar
• Umumiy sinflar sinfni turga bog'liq bo'lmagan tarzda tavsiflash uchun vositani taqdim etadi. Biz qila olamiz
keyin umumiy sinfning turiga xos ob'ektlarni yarating.
• Umumiy sinf deklaratsiyasi umumiy bo‘lmagan sinf deklaratsiyasiga o‘xshaydi, bundan tashqari sinf nomi
keyin tip-parametr bo'limi. Umumiy sinfning tip-parametr bo'limi bitta bo'lishi mumkin
yoki bir nechta turdagi parametrlar vergul bilan ajratilgan.
• Umumiy sinf kompilyatsiya qilinganda, kompilyator sinf turi parametrlarida o'chirishni amalga oshiradi.
va ularni yuqori chegaralari bilan almashtiradi.
• Tur parametrlarini sinfning statik e'lonlarida ishlatib bo'lmaydi.
• Umumiy sinf ob'ektini instantsiyalashda sinfdan keyin burchakli qavslarda ko'rsatilgan turlar
nomi turdagi argumentlar sifatida tanilgan (851-bet). Kompilyator ulardan parametr turini almashtirish uchun foydalanadi.
eters turini tekshirishni amalga oshirishi va kerak bo'lganda translatsiya operatsiyalarini kiritishi mumkin.
20.7-bo'lim Xom turlari
• Tur argumentini ko'rsatmasdan umumiy sinfni yaratish mumkin. Bunday holda, yangi
sinf ob'ekti xom turiga ega deyiladi (857-bet) - kompilyator ob'ekt turini bilvosita ishlatadi
(yoki turdagi parametrning yuqori chegarasi) har bir turdagi argument uchun umumiy sinf bo'ylab.
20.8-bo'lim Tur parametrlarini qabul qiluvchi usullardagi joker belgilar
• Class Number ham Integer, ham Doublening yuqori sinfidir.
• doubleValue raqam usuli (862-bet) raqamning asosiy ibtidoiy qiymatini ikki barobar sifatida oladi
qiymat.
• Joker belgilar turi argumentlari usul parametrlarini, qaytariladigan qiymatlarni, oʻzgaruvchilarni va
Shunday qilib, ular parametrlangan turlarning supertiplari sifatida ishlaydi. Joker belgilar tipidagi argument bilan belgilanadi?
(862-bet), bu “noma’lum tur”ni ifodalaydi. Joker belgining yuqori chegarasi ham bo'lishi mumkin.
• Joker belgi (?) tip-parametr nomi emasligi sababli, siz uni butun tur nomi sifatida ishlata olmaysiz
usul tanasi.
• Agar joker belgi yuqori chegarasiz ko'rsatilgan bo'lsa, u holda faqat Object tipidagi usullar bo'lishi mumkin
joker belgilar turi qiymatlarida chaqiriladi.
• Tur argumentlari sifatida joker belgilardan foydalanadigan usullardan (862-bet) ustunga elementlar qo‘shish uchun ishlatib bo‘lmaydi.
parametr bilan havola qilingan dars.
O'z-o'zini tekshirish mashqlari
20.1 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Umumiy usul umumiy bo'lmagan usul bilan bir xil usul nomiga ega bo'lishi mumkin emas.

O'z-o'zini tekshirish mashqlariga javoblar 867

b) Barcha umumiy usul deklaratsiyasida darhol oldindan belgilab qo'yiladigan turdagi parametrlar bo'limi mavjud.
usul nomini beradi.
c) Umumiy usul xuddi shu usul bilan boshqa umumiy usul bilan ortiqcha yuklanishi mumkin
nomi, lekin boshqa usul parametrlari.
d) Tip parametri turi parametr qismida faqat bir marta e'lon qilinishi mumkin, lekin
nok usul parametrlari ro'yxatida bir necha marta.
e) Turli xil umumiy usullar orasidagi tip-parametr nomlari yagona bo'lishi kerak.
f) Umumiy sinf turi parametrining doirasi uning statik xotirasidan tashqari butun sinfdir.
bers.
20.2 Quyidagilarning har biridagi bo'sh joylarni to'ldiring:
a) va sizga bitta usul deklaratsiyasi bilan bir qatorni belgilash imkonini beradi
tegishli usullar yoki bitta sinf deklaratsiyasi bilan, mos ravishda tegishli turlar to'plami.
b) Tur-parametr kesimi bilan chegaralangan.
c) Usulning argument turlarini aniqlash uchun umumiy usuldan foydalanish mumkin
usulning qaytish turini belgilang va usul ichidagi o'zgaruvchilarni e'lon qiling.
d) "Stack objectStack = new Stack();" bayonoti. objectStack saqlashini bildiradi

.

e) Umumiy sinf deklaratsiyasida sinf nomidan keyin a(n) .


f) Sintaksis joker belgining yuqori chegarasi T turi ekanligini bildiradi.

O'z-o'zini tekshirish mashqlariga javoblar


20.1 a) Noto'g'ri. Umumiy va umumiy bo'lmagan usullar bir xil usul nomiga ega bo'lishi mumkin. Umumiy
usul bir xil usul nomiga ega, ammo boshqa usul bilan boshqa umumiy usulni ortiqcha yuklashi mumkin
parametrlari. Umumiy usulni umumiy bo'lmagan usullar bilan ta'minlash orqali ham ortiqcha yuklash mumkin
bir xil usul nomi va argumentlar soni. b) yolg'on. Barcha umumiy usul deklaratsiyasi mavjud
usulning qaytish turidan darhol oldin bo'lgan type-parameter bo'limi. c) To'g'ri. d) To'g'ri.
e) yolg'on. Turli xil umumiy usullar orasidagi parametr nomlari yagona bo'lishi shart emas. f) To'g'ri.
20.2 a) Umumiy usullar, umumiy sinflar. b) burchakli qavslar (< va >). c) tip parametrlari. d) a
xom turi. e) tip-parametr bo'limi. f) ? T.ni kengaytiradi.

Mashqlar
20.3 (Notatsiyani tushuntiring) Java dasturida quyidagi yozuvlardan foydalanishni tushuntiring:


umumiy sinf Array {}
20.4 (Umumiy usul tanlashSort) Umumiy usul tanlashni yozing.
19.4-rasmning tartiblash dasturi. Integer massivini kirituvchi, tartiblovchi va chiqaradigan test dasturini yozing va
Float massivi. [Maslahat: Se-metod uchun tip-parametrlar qismida > dan foydalaning.
lectionSort dan foydalaning, shunda T ni aks ettiruvchi turdagi ob'ektlarni solishtirish uchun compareTo usulidan foydalanishingiz mumkin.
norozi.]
20.5 (Oddiy yuklangan umumiy usul printArray) Haddan tashqari yuklangan umumiy usul printArray of
20.3-rasm, shuning uchun u ikkita qo'shimcha butun son argumentlarini oladi, lowSubscript va highSubscript. Qo'ng'iroq
bu usulda massivning faqat belgilangan qismini chop etadi. LowSubscript va highSub-ni tasdiqlang
skript. Agar ulardan biri diapazondan tashqarida bo'lsa, ortiqcha yuklangan printArray usuli InvalidSub-ni chiqarishi kerak.
scriptException; aks holda printArray chop etilgan elementlar sonini qaytarishi kerak. Keyin
integerArray, doubleArray va massivlarda printArray ning ikkala versiyasini ishlatish uchun main ni o'zgartiring
characterArray. PrintArray ning ikkala versiyasining barcha imkoniyatlarini sinab ko'ring.

868 20-bob Umumiy sinflar va usullar

20.6 (Umumiy usulni umumiy bo'lmagan usul bilan ortiqcha yuklash)) Haddan tashqari yuklash umumiy usul
20.3-rasmdagi printArray umumiy bo'lmagan versiyaga ega bo'lib, u Stringlar massivini aniq chop etadi,
quyidagi namunaviy chiqishda ko'rsatilganidek, jadval formati:

20.7 (Umumiy isEqualTo usuli) isEqualTo usulining oddiy umumiy versiyasini yozing


uning ikkita argumentini teng usuli bilan solishtiradi va agar ular teng va noto'g'ri bo'lsa, true qiymatini qaytaradi
aks holda. Ushbu umumiy usuldan turli xil o'rnatilgan turlar bilan isEqualTo ni chaqiradigan dasturda foydalaning,
Ob'ekt yoki butun son kabi. Ushbu dasturni ishga tushirishga harakat qilganingizda qanday natijaga erishasiz?
20.8 (Umumiy sinf juftligi) Ikki turdagi parametrlarga ega bo'lgan umumiy sinf juftligini yozing - F va S -
har biri mos ravishda juftlikning birinchi va ikkinchi elementining turini ifodalaydi. Get va sozlashni qo'shing
juftlikning birinchi va ikkinchi elementlari uchun usullar. [Maslahat: Sinf sarlavhasi ommaviy bo'lishi kerak
sinf juftligi.]
20.9 (Umumiy usullarni ortiqcha yuklash) Umumiy usullarni qanday qilib ortiqcha yuklash mumkin?
20.10 (Haddan tashqari yuklanish ruxsati) Kompilyator qaysi birini aniqlash uchun mos keladigan jarayonni amalga oshiradi
usul chaqirilganda chaqiriladigan usul. Qanday sharoitlarda a qilishga urinish
mos keladigan natija kompilyatsiya vaqtida xatolikka olib keladimi?
20.11 (Ushbu bayonot nima qiladi?) Nima uchun Java dasturi ushbu bayonotdan foydalanishi mumkinligini tushuntiring.
ArrayList workerList = new ArrayList<>();

stringArray massivi tarkibiga quyidagilar kiradi:


Bir, ikki, uch, to'rt
besh olti etti sakkiz

21

Shaxsiy umumiy maʼlumotlar


Tuzilmalar

Men bog'laganim ko'p,


Men ozod qila olmadim;
Men ozod qilganimning ko'pini
menga qaytdi.
- Li Uilson Dodd
Yuqorida har doim joy bor.
- Daniel Webster
Men hech qachon ko'rmayman deb o'ylayman
Daraxtdek yoqimli she'r.
- Joys Kilmer

Oh maqsadlar


Ushbu bobda siz quyidagilarni bilib olasiz:
■ Bog'langan ma'lumotlar tuzilmalarini shakllantirish
ma'lumotnomalardan foydalanish, o'z-o'zini
referent sinflar, rekursiya
va generiklar.
■ Yaratish va manipulyatsiya qilish
dinamik ma'lumotlar tuzilmalari,
bog'langan ro'yxatlar, navbatlar,
steklar va ikkilik daraxtlar.
■ Har xil muhim
bog'langan ma'lumotlarning ilovalari
tuzilmalar.
■ Qayta foydalanish mumkin bo'lgan ma'lumotlarni qanday yaratish mumkin
sinflarga ega tuzilmalar,
meros va tarkibi.
■ Darslarni tashkil qilish
qayta foydalanishni rag'batlantirish uchun paketlar.

870 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

21.1 Kirish
Ushbu bobda o'sadigan va qisqaradigan dinamik ma'lumotlar tuzilmalarini qanday yaratish kerakligi ko'rsatilgan.
vaqt. Bog'langan ro'yxatlar "zanjirda bog'langan" ma'lumotlar to'plamidir - qo'shimchalar va
oʻchirishlar bogʻlangan roʻyxatning istalgan joyida amalga oshirilishi mumkin. Steklar kompilyatorlar va operatsion tizimlarda muhim ahamiyatga ega.
baholash tizimlari; qo'shish va o'chirishlar stekning faqat bir uchida, ya'ni yuqori qismida amalga oshiriladi.
Navbatlar kutish qatorlarini ifodalaydi; qo'shimchalar orqa tomondan amalga oshiriladi (shuningdek, quyruq deb ham ataladi)
navbat va o'chirishlar old tomondan amalga oshiriladi (bosh deb ham ataladi). Ikkilik daraxtlar
yuqori tezlikda ma'lumotlarni qidirish va saralashni osonlashtirish, takroriy ma'lumotlar ob'ektlarini samarali yo'q qilish.
fayl tizimi kataloglarini ifodalash, iboralarni mashina tiliga kompilyatsiya qilish
va boshqa ko'plab qiziqarli ilovalar.
Biz ushbu asosiy ma'lumotlar strukturasi turlarining har birini muhokama qilamiz va dasturlarni amalga oshiramiz
ularni yaratish va boshqarish. Biz ularni yaratish uchun sinflar, meros va kompozitsiyadan foydalanamiz
qayta foydalanish va texnik xizmat ko'rsatish uchun. Shuningdek, biz darslarni o'zingiz uchun qanday tashkil qilishni tushuntiramiz
qayta foydalanishni rag'batlantirish uchun paketlar. Biz ushbu bobni kompyuter fanlari va kompyuter fanlari uchun kiritamiz.
bog'langan ma'lumotlar tuzilmalarini qanday qurishni bilishi kerak bo'lgan muhandislik talabalari.

Majburiy emas onlayn "O'z kompilyatoringizni yaratish" loyihasi


Agar siz o'zingizni shuhratparast his qilsangiz, maxsus maqolada tasvirlangan yirik loyihani sinab ko'rishingiz mumkin
"O'z kompilyatoringizni yaratish" bo'limi, biz uni http:// saytida e'lon qildik.
www.deitel.com/books/jhtp10. Siz Java-ni tarjima qilish uchun Java kompilyatoridan foydalanyapsiz
dasturlarni bayt-kodlarga aylantiring, shunda siz ushbu dasturlarni bajarishingiz mumkin. Ushbu loyihada siz quyidagilarni bajarasiz:
o'z kompilyatoringizni yarating. U oddiy, ammo kuchli tarzda yozilgan bayonotlarni o'qiydi
mashhur BASIC va tarjima tilining dastlabki versiyalariga o'xshash yuqori darajadagi til
Ushbu bayonotlar Simpletron Machine Language (SML) ko'rsatmalariga kiritilgan - SML bu lan-
7-bobning shaxsiy kompyuteringizni yaratish maxsus bo'limida o'rgangan tilingizni. Sizning
Simpletron Simulator dasturi keyin siz tomonidan ishlab chiqarilgan SML dasturini bajaradi
kompilyator! Ob'ektga yo'naltirilgan yondashuvdan foydalangan holda ushbu loyihani amalga oshirish sizga beradi
Ushbu kitobda o'rgangan narsalaringizning ko'pini mashq qilish imkoniyati. Maxsus bo'lim
sizni yuqori darajadagi tilning texnik xususiyatlari bilan diqqat bilan tanishtiradi va tavsiflaydi

21.1 Kirish


21.2 O'z-o'zini yo'naltiruvchi darslar
21.3 Dinamik xotirani taqsimlash
21.4 Bog'langan ro'yxatlar
21.4.1 Yagona bog'langan ro'yxatlar
21.4.2 Umumiy ro'yxat sinfini amalga oshirish
21.4.3 Umumiy sinflar ListNode va List
21.4.4 Sinflar ro'yxati testi
21.4.5 InsertAtFront ro'yxati usuli

21.4.6 Ro'yxat usuli insertAtBack


21.4.7 List Method removeFromFront
21.4.8 Ro'yxat usuli removeFromBack
21.4.9 Ro'yxat usulini chop etish
21.4.10 O'z paketlaringizni yaratish
21.5 Staklar
21.6 Navbatlar
21.7 Daraxtlar
21.8 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar |


Maxsus bo'lim: O'z kompilyatoringizni yaratish

Dasturiy ta'minot muhandisligi kuzatuvi 21.1


Dasturiy ta'minot ishlab chiqaruvchilarining aksariyati oldindan belgilangan umumiy to'plam sinflaridan foydalanishlari kerak
Biz moslashtirilgan bog'langan ma'lumotlar tuzilmalarini ishlab chiqish o'rniga, 16-bobda muhokama qildik.

21.2 O'z-o'zidan ma'lumot olish sinflari 871

algoritmlar uchun har bir yuqori darajadagi til bayonotini machine-lan-ga aylantirishingiz kerak bo'ladi.
til ko'rsatmalari. Agar siz sinovdan zavqlansangiz, yaxshilanishlarni sinab ko'rishingiz mumkin
kompilyatorga ham, mashqlarda tavsiya etilgan Simpletron Simulyatoriga ham.
21.2 O'z-o'zini yo'naltiruvchi darslar
O'z-o'ziga havola qiladigan sinf boshqa ob'ektga ishora qiluvchi misol o'zgaruvchisini o'z ichiga oladi
bir xil sinf turi. Masalan, umumiy Node sinf deklaratsiyasi

ikkita xususiy misol o'zgaruvchisiga ega - ma'lumotlar (umumiy turdagi T) va Node o'zgaruvchisi


keyingi tugun. NextNode o'zgaruvchisi Node ob'ektiga murojaat qiladi, bir xil sinf ob'ekti
Bu erda e'lon qilingan - shuning uchun "o'z-o'ziga murojaat qiluvchi sinf" atamasi. Field nextNode - bu havola - u "bog'lanadi"
Node tipidagi ob'ektni bir xil turdagi boshqa ob'ektga. Node turi ham beshtaga ega
usullar: ma'lumotlarni ishga tushirish uchun qiymatni qabul qiluvchi konstruktor, sozlash uchun setData usuli
ma'lumotlar qiymati, ma'lumotlar qiymatini qaytarish uchun getData usuli, sozlash uchun setNext usuli
nextNode qiymati va keyingi tugunga havolani qaytarish uchun getNext usuli.
Dasturlar bunday foydali ma'lumotlar tuzilmalarini yaratish uchun o'z-o'ziga havola qiluvchi ob'ektlarni bir-biriga bog'lashi mumkin
ro'yxatlar, navbatlar, stacks va daraxtlar sifatida. 21.1-rasmda bog'langan ikkita o'z-o'ziga havola qilingan ob'ektlar tasvirlangan
ro'yxatini shakllantirish uchun birgalikda. Bog'lanishda teskari chiziq - null havolani ifodalovchi - joylashtirilgan
ikkinchi oʻz-oʻziga havola qiluvchi obʼyektning aʼzosi bogʻlanishning tegishli emasligini bildiradi
boshqa ob'ekt. Teskari chiziq tasviriydir; u teskari chiziq belgisiga mos kelmaydi
Java tilidagi aktyor. An'anaga ko'ra, kodda biz a ning oxirini ko'rsatish uchun null havolasidan foydalanamiz
ma'lumotlar tuzilishi.

21.3 Dinamik xotirani taqsimlash


Dinamik ma'lumotlar tuzilmalarini yaratish va saqlash dinamik xotirani taqsimlashni talab qiladi.
tion - dasturga bajarilish vaqtida yangisini saqlash uchun ko'proq xotira maydoni olish imkonini beradi
tugunlari va bo'sh joy bo'shatish uchun endi kerak emas. Esda tutingki, Java sizdan talab qilmaydi
dinamik ravishda ajratilgan xotirani aniq bo'shatish. Aksincha, Java avtomatik axlatni amalga oshiradi
dasturda endi havola qilinmagan ob'ektlar to'plami.
Dinamik xotirani ajratish chegarasi mavjud bo'lgan hajmga teng bo'lishi mumkin
kompyuterdagi jismoniy xotira yoki virtual diskdagi mavjud bo'sh joy miqdori.

sinf Node


{
shaxsiy T ma'lumotlari;
xususiy tugun keyingi tugun; // keyingi bog'langan tugunga havola
umumiy tugun (T ma'lumotlari) { /* konstruktor tanasi */ }
public void setData(T data) { /* metod tanasi */ }
umumiy T getData() { /* usul tanasi */ }
public void setNext(tugun keyingi) { /* usul tanasi */ }
umumiy tugun getNext() { /* usul tanasi */ }
}

21.1-rasm | Bir-biriga bog'langan o'z-o'zidan mos yozuvlar sinfi ob'ektlari.

15 10

872 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

xotira tizimi. Ko'pincha cheklovlar juda kichikroq, chunki kompyuter mavjud
xotira ko'p ilovalar orasida bo'lishi kerak.
Deklaratsiya va sinf misolini yaratish ifodasi

Node ob'ektini ajratadi va tugunga tayinlangan unga havolani qaytaradi.


Qo'shmoq. Agar xotira yetarli bo'lmasa, oldingi ifoda OutOfMemory-ni chiqaradi.
Xato. Keyingi bo'limlar ro'yxatlar, steklar, navbatlar va daraxtlarni muhokama qiladi - bularning barchasi ishlatiladi
dinamik xotirani taqsimlash va dinamik ma'lumotlar tuzilmalarini yaratish uchun o'z-o'zidan mos yozuvlar sinflari.
21.4 Bog'langan ro'yxatlar
Bog'langan ro'yxat - bu o'z-o'zidan mos yozuvlar sinfidagi ob'ektlarning chiziqli to'plami (ya'ni, ketma-ketlik)
mos yozuvlar havolalari bilan bog'langan tugunlar - shuning uchun "bog'langan" ro'yxat atamasi. Odatda, dastur
bog'langan ro'yxatga uning birinchi tuguniga havola orqali kiradi. Dastur har bir keyingisiga kiradi
oldingi tugunda saqlangan havola havolasi orqali tugun. An'anaga ko'ra, havola havolasi
ro'yxatning oxirgi tugunida "ro'yxat oxiri" ni ko'rsatish uchun null o'rnatiladi. Ma'lumotlar saqlanadi va qayta
bog'langan ro'yxatlardan dinamik ravishda ko'chiriladi - dastur kerak bo'lganda tugunlarni yaratadi va o'chiradi.
Staklar va navbatlar ham chiziqli ma'lumotlar tuzilmalari bo'lib, biz ko'rib turganimizdek, cheklangan versiyalardir.
bog'langan ro'yxatlar. Daraxtlar - chiziqli bo'lmagan ma'lumotlar tuzilmalari.
Ma'lumotlar ro'yxati an'anaviy Java massivlarida saqlanishi mumkin, ammo bog'langan ro'yxatlar bir nechtasini beradi
afzalliklari. Bog'langan ro'yxat ma'lumotlar elementlari soni ko'rsatilganda mos keladi.
ma'lumotlar tuzilmasida yuborilganini oldindan aytib bo'lmaydi. Bog'langan ro'yxatlar dinamik, shuning uchun ro'yxat uzunligi
kerak bo'lganda kattalashishi yoki kamayishi mumkin, an'anaviy Java massivining hajmi esa mumkin emas
o'zgartirilishi mumkin - bu dastur massivni yaratganda tuzatiladi. [Albatta, ArrayLists o'sishi mumkin
va kichraytiring.] An'anaviy massivlar to'lib ketishi mumkin. Bog'langan ro'yxatlar faqat bo'lganda to'la bo'ladi
Tizimda dinamik saqlashni ajratish so'rovlarini qondirish uchun etarli xotira mavjud emas. Paket
java.util ilovasida amalga oshirish uchun LinkedList (16-bobda muhokama qilingan) sinfi mavjud
dasturni bajarish jarayonida o'sadigan va qisqaradigan bog'langan ro'yxatlarni manipulyatsiya qilish.

Bog'langan ro'yxatlar har bir yangi elementni kiritish orqali tartiblangan tartibda saqlanishi mumkin


ro'yxatning to'g'ri nuqtasida. (To'g'ri kiritishni topish uchun, albatta, vaqt kerak bo'ladi
nuqta.) Mavjud ro'yxat elementlarini ko'chirish kerak emas.

21.4.1 Yagona bog'langan ro'yxatlar


Bog'langan ro'yxat tugunlari odatda xotirada ketma-ket saqlanmaydi. Aksincha, ular mantiqiy
tutash. 21.2-rasmda bir nechta tugunlar bilan bog'langan ro'yxat tasvirlangan. Ushbu diagramma ko'rsatilgan
yakka bog'langan ro'yxat - har bir tugun ro'yxatdagi keyingi tugunga bitta havolani o'z ichiga oladi. Ko'pincha,

// 10 - nodeToAdd ma'lumotlari


Node nodeToAdd = new Node(10);

Ishlash bo'yicha maslahat 21.1


Bog'langan ro'yxatga kiritish tez - faqat ikkita havolani o'zgartirish kerak (joylashganidan keyin
kiritish nuqtasi). Barcha mavjud tugun ob'ektlari xotirada joriy joylarida qoladi.

Ishlash bo'yicha maslahat 21.2


Saralangan massivga qo'shish va o'chirish ko'p vaqt talab qilishi mumkin - keyin barcha elementlar
kiritilgan yoki o'chirilgan elementni mos ravishda siljitish kerak.

21.4 Bog'langan ro'yxatlar 873

bog'langan ro'yxatlar ikki marta bog'langan ro'yxatlar sifatida amalga oshiriladi - har bir tugunga havola mavjud
ro'yxatdagi keyingi tugun va oldingisiga havola.

21.4.2 Umumiy ro'yxat sinfini amalga oshirish


Shakllar dasturi. 21.3–21.5 bizning umumiy List sinfimiz ob'ektidan foydalanib, manipulyatsiya qiladi.
turli xil ob'ektlar ro'yxati. Dastur to'rtta sinfdan iborat - ListNode (21.3-rasm,
6-37 qatorlar), Ro'yxat (21.3-rasm, 40-147-qatorlar), EmptyListException (21.4-rasm) va List-
Sinov (21.5-rasm). Har bir List ob'ektida inkapsullangan ListNode ob'ektlari bog'langan ro'yxati.
[Izoh: List, ListNode va EmptyListException sinflari paketga joylashtirilgan.
com.deitel.datastructures, ular ushbu bob davomida qayta ishlatilishi mumkin. In
21.4.10 bo'limida biz paket bayonotini muhokama qilamiz (21.3 va 21.4-rasmlarning 3-qatori) va
O'z paketlaringizda sinflardan foydalanadigan dasturlarni qanday kompilyatsiya qilish va ishga tushirishni ko'rsating.]

Ishlash bo'yicha maslahat 21.3


Massiv elementlari xotirada yonma-yon joylashgan. Bu har qandayiga darhol kirish imkonini beradi
massiv elementi, chunki uning manzili to'g'ridan-to'g'ri boshidan ofset sifatida hisoblanishi mumkin
massivdan. Bog'langan ro'yxatlar bunday darhol kirishni ta'minlamaydi - elementga kirish mumkin
faqat ro'yxatni old tomondan (yoki ikki marta bog'langan ro'yxatda orqa tomondan) kesib o'tish orqali.

21.2-rasm | Bog'langan ro'yxatning grafik tasviri.

1 // 21.3-rasm: List.java
2 // ListNode va List sinf deklaratsiyasi.
3
4
5 // ro'yxatdagi bitta tugunni ifodalash uchun sinf
6
7 {
8 // paketga kirish a'zolari; Ro'yxat ularga to'g'ridan-to'g'ri kirishi mumkin
9 T ma'lumotlari; // ushbu tugun uchun ma'lumotlar
10
11
12 // konstruktor obyektga ishora qiluvchi ListNode ni yaratadi
13 ListNode (T ob'ekti)
14 {
15 this(ob'ekt, null);
16 }
17

21.3-rasm | ListNode va List sinf deklaratsiyasi. (4-qismning 1-qismi.)

HDQ

birinchi tugun oxirgi tugun



...

com.deitel.datastructures paketi;

sinf ListNode

ListNode keyingi tugun; // ro'yxatdagi keyingi tugunga havola


874 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

18 // konstruktor ko'rsatilganlarga ishora qiluvchi ListNode ni yaratadi
19 // obyekt va keyingi ListNode-ga
20 ListNode(T ob'ekt, ListNode tugun)
21 {
22 ma'lumotlar = ob'ekt;
23 keyingi tugun = tugun;
24 }
25
26 // tugundagi ma'lumotlarga havolani qaytarish
27 T getData()
28 {
29 qaytish ma'lumotlari;
30 }
31
32 // ro'yxatdagi keyingi tugunga havolani qaytarish
33 ListNode getNext()
34 {
35 keyingi tugunni qaytarish;
36 }
37 } // oxirgi sinf ListNode
38
39 // sinf Ro'yxat ta'rifi
40
41 {
42
43
44 shaxsiy string nomi; // chop etishda ishlatiladigan "list" kabi qator
45
46 // konstruktor nomi sifatida "ro'yxat" bilan bo'sh Ro'yxat yaratadi
47 umumiy roʻyxat()
48 {
49 this("ro'yxat");
50 }
51
52 // konstruktor nomi bilan bo'sh Ro'yxat yaratadi
53 umumiy roʻyxat (String roʻyxatiName)
54 {
55 nom = ro'yxatName;
56 birinchi tugun = oxirgi tugun = null;
57 }
58
59 // Ro'yxat oldiga elementni qo'ying
60
61 {
62 if (isEmpty()) // firstNode va lastNode bir xil obyektga ishora qiladi
63 firstNode = lastNode = new ListNode(insertItem);
64 else // firstNode yangi tugunga ishora qiladi
65 firstNode = new ListNode(insertItem, firstNode);
66 }
67
68 // Ro'yxat oxiriga element qo'shing
69
70 {

21.3-rasm | ListNode va List sinf deklaratsiyasi. (4 qismning 2-qismi.)

umumiy sinf ro'yxati

xususiy ListNode birinchi tugun;


xususiy ListNode lastNode;

public void insertAtFront(T insertItem)

public void insertAtBack(T insertItem)

21.4 Bog'langan ro'yxatlar 875

71 if (isEmpty()) // firstNode va lastNode bir xil obyektga ishora qiladi
72 firstNode = lastNode = new ListNode(insertItem);
73 else // lastNode-ning keyingi tugunlari yangi tugunga ishora qiladi
74 lastNode = lastNode.nextNode = new ListNode(insertItem);
75 }
76
77 // Ro'yxatdan birinchi tugunni olib tashlang
78
79 {
80 if (isEmpty()) // Ro'yxat bo'sh bo'lsa, istisno qiling
81 yangi EmptyListException (nomi) otish;
82
83 T olib tashlandiItem = firstNode.data; // o'chirilayotgan ma'lumotlarni olish
84
85 // firstNode va lastNode havolalarini yangilang
86 agar (birinchi tugun == oxirgi tugun)
87 birinchi tugun = oxirgi tugun = null;
yana 88
89 firstNode = firstNode.nextNode;
90
91 qaytarildi. // o'chirilgan tugun ma'lumotlarini qaytaring
92 }
93
94 // Ro'yxatdan oxirgi tugunni olib tashlang
95
96 {
97 if (isEmpty()) // Ro'yxat bo'sh bo'lsa, istisno qiling
98 yangi EmptyListException (nomi) otish;
99
100 T o'chirildiItem = lastNode.data; // o'chirilayotgan ma'lumotlarni olish
101
102 // firstNode va lastNode havolalarini yangilang
103 agar (birinchi tugun == oxirgi tugun)
104 birinchi tugun = oxirgi tugun = null;
105 else // yangi oxirgi tugunni toping
106 {
107 ListNode joriy = birinchi tugun;
108
109 // halqa, joriy tugun lastNode ga ishora qilmaydi
110 esa (current.nextNode != lastNode)
111 joriy = current.nextNode;
112
113 lastNode = joriy; // joriy yangi lastNode
114 current.nextNode = null;
115 }
116
117 qaytarilgan element; // o'chirilgan tugun ma'lumotlarini qaytaring
118 }
119

21.3-rasm | ListNode va List sinf deklaratsiyasi. (4 qismning 3-qismi.)

public T removeFromFront() EmptyListExceptionni tashlaydi

public T removeFromBack() EmptyListException-ni tashlaydi


876 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

120 // ro'yxat bo'sh yoki yo'qligini aniqlang
121
122 {
123 birinchi tugunni qaytaring == null; // ro'yxat bo'sh bo'lsa, true qiymatini qaytaring
124 }
125
126 // ro'yxat tarkibini chiqarish
127
128 {
129 agar (isEmpty())
130 {
131 System.out.printf("Bo'sh %s%n", nomi);
132 qaytish;
133 }
134
135 System.out.printf("%s: ", nomi);
136 ListNode joriy = birinchi tugun;
137
138 // ro'yxat oxirida bo'lmasa, joriy tugun ma'lumotlarini chiqaring
139 while (joriy != null)
140 {
141 System.out.printf("%s ", joriy.data);
142 joriy = joriy.nextNode;
143 }
144
145 System.out.println();
146 }
147 } // oxirgi sinf List

1 // 21.4-rasm: EmptyListException.java


2 // Class EmptyListException deklaratsiyasi.
3 ta paket com.deitel.datastructures;
4
5 umumiy sinf EmptyListException RuntimeException-ni kengaytiradi
6 {
7 // konstruktor
8 ommaviy EmptyListException()
9 {
10 this("Ro'yxat"); // boshqa EmptyListException konstruktorini chaqiring
11 }
12
13 // konstruktor
14 ochiq EmptyListException (String nomi)
15 {
16 super(ism + "bo'sh"); // superklass konstruktorini chaqirish
17 }
18 } // yakuniy sinf EmptyListException

21.4-rasm | Class EmptyListException deklaratsiyasi.

21.3-rasm | ListNode va List sinf deklaratsiyasi. (4 qismning 4-qismi.)

ommaviy mantiqiy isEmpty()

ommaviy bekor chop etish()

21.4 Bog'langan ro'yxatlar 877

1 // 21.5-rasm: ListTest.java
2 // List imkoniyatlarini namoyish qilish uchun ListTest klassi.
3 import com.deitel.datastructures.List;
4 import com.deitel.datastructures.EmptyListException;
5
6 umumiy sinf ListTest
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10
11
12
13
14
15
16
17
18
19
20
21
22 // ob'ektlarni ro'yxatdan o'chirish; har bir olib tashlashdan keyin chop eting
23 urinib ko'ring
24 {
25
26 System.out.printf("%n%d o'chirildi%n", o'chirildi);
27 list.print();
28
29
30 System.out.printf("%n%d o'chirildi%n", o'chirildi);
31 list.print();
32
33
34 System.out.printf("%n%d o'chirildi%n", o'chirildi);
35 list.print();
36
37
38 System.out.printf("%n%d o'chirildi%n", o'chirildi);
39 list.print();
40 }
41 catch (EmptyListException emptyListException)
42 {
43 emptyListException.printStackTrace();
44 }
45 }
46 } // yakuniy sinf ListTest

Ro'yxat: -1


Ro'yxat: 0 -1
Ro'yxat: 0 -1 1
Ro'yxat: 0 -1 1 5

21.5-rasm | List imkoniyatlarini namoyish qilish uchun ListTest klassi. (2-qismning 1-qismi.)

List list = new List<>();

// ro'yxatga butun sonlarni kiriting


list.insertAtFront(-1);
list.print();
list.insertAtFront(0);
list.print();
list.insertAtBack(1);
list.print();
list.insertAtBack(5);
list.print();

int removeItem = list.removeFromFront();

RemoveItem = list.removeFromFront();

RemoveItem = list.removeFromBack();

RemoveItem = list.removeFromBack();

878 21-bob Maxsus umumiy ma'lumotlar tuzilmalari



21.4.3 Umumiy sinflar ListNode va List
ListNode umumiy klassi (21.3-rasm, 6–37-qatorlar) paketga kirish maydonlari maʼlumotlarini eʼlon qiladi va
keyingi tugun. Ma'lumotlar maydoni T tipidagi ma'lumotnomadir, shuning uchun uning turi qachon aniqlanadi
mijoz kodi tegishli List obyektini yaratadi. NextNode oʻzgaruvchisi havolani saqlaydi
bog'langan ro'yxatdagi keyingi ListNode ob'ekti (yoki tugun ro'yxatdagi oxirgi bo'lsa null).
Sinf ro'yxatining 42-43-qatorlari (21.3-rasm, 40-47-qatorlar) birinchi va
Ro'yxatdagi oxirgi ListNodelar (mos ravishda birinchi tugun va oxirgi tugun). Konstruktorlar (chiziqlar
47–50 va 53–57) ikkala havolani null ga ishga tushiring. Sinfning eng muhim usullari
Roʻyxat: insertAtFront (60–66-qatorlar), insertAtBack (69–75-qatorlar), removeFromFront
(78-92-qatorlar) va removeFromBack (95-118-qatorlar). Metod isEmpty (121–124-qatorlar) a
ro'yxat bo'sh yoki yo'qligini aniqlaydigan predikat usuli (ya'ni, birinchisiga havola
ro'yxatning tuguni null). Predikativ usullar odatda shartni tekshiradi va o'zgartirmaydi
ular chaqirilgan ob'ekt. Agar ro'yxat bo'sh bo'lsa, isEmpty usuli "true" ni qaytaradi; boshqa-
aks holda, u noto'g'ri qaytaradi. Chop etish usuli (127–146-qatorlar) roʻyxat mazmunini koʻrsatadi. Biz
ListTest sinfini muhokama qilganimizdan so'ng, sinf List usullarini batafsil muhokama qiling.
21.4.4 Sinflar ro'yxati testi
ListTest sinfining asosiy usuli (21.5-rasm) List ob'ektini yaratadi (10-satr), keyin
insertAtFront usuli yordamida roʻyxat boshiga obʼyektlarni kiritadi, at
insertAtBack usuli yordamida ro'yxatning oxiri ro'yxatning old qismidagi ob'ektlarni o'chiradi
removeFromFront usuli yordamida va usul yordamida ro'yxat oxiridagi ob'ektlarni o'chiradi
removeFromBack. Har bir qo'shish va olib tashlash operatsiyasidan so'ng ListTest Ro'yxat usulini chaqiradi
joriy roʻyxat mazmunini koʻrsatish uchun chop eting. Agar biror narsani o'chirishga harakat qilinsa
bo'sh ro'yxat, EmptyListException (21.4-rasm) tashlanadi, shuning uchun usul qayta chaqiradi.
moveFromFront va removeFromBack sinab ko'rish blokiga joylashtiriladi, undan keyin ilova keladi.
tegishli istisno ishlovchisi. 13, 15, 17 va 19-satrlarga e'tibor bering (21.5-rasm)
Ilova ibtidoiy int qiymatlarini insertAtFront va insertAt- usullariga uzatadi.
Orqaga. Ushbu usullarning har biri umumiy T tipidagi parametr bilan e'lon qilingan
(21.3-rasm, 60 va 69-qatorlar). Ushbu misol Listni manipulyatsiya qilganligi sababli, T turi
Integer turini o'rash sinfini ifodalaydi. Bunday holda, JVM har bir harfni avtomatik qutilarga joylashtiradi.
ue Integer ob'ektida va bu ob'ekt haqiqatda ro'yxatga kiritilgan.
21.4.5 InsertAtFront ro'yxati usuli
Endi biz sinf Ro'yxatining har bir usulini (21.3-rasm) batafsil muhokama qilamiz va diagrammalarni taqdim etamiz
insertAtFront, insertAt- usullari bilan bajariladigan mos yozuvlar manipulyatsiyalarini ko'rsatish

0 o'chirildi


Ro'yxat: -1 15
-1 olib tashlandi
Ro'yxat: 15
5 olib tashlandi
Ro'yxat: 1
1 olib tashlandi
Bo'sh ro'yxat

21.5-rasm | List imkoniyatlarini namoyish qilish uchun ListTest klassi. (2-qismning 2-qismi.)


21.4 Bog'langan ro'yxatlar 879

Orqaga, removeFromFront va removeFromBack. InsertAtFront usuli (60–66 qatorlar).
21.3-rasm) ro'yxatning old qismiga yangi tugunni joylashtiradi. Qadamlar quyidagilar:
1. Ro‘yxat bo‘sh yoki yo‘qligini aniqlash uchun isEmpty ga qo‘ng‘iroq qiling (62-qator).
2. Agar roʻyxat boʻsh boʻlsa, firstNode va lastNode-ga yangi ListNode-ni tayinlang.
insertItem bilan ishga tushirilgan (63-qator). (Esingizda bo'lsin, tayinlash operatorlari baholaydilar
o'ngdan chapga.) 13-16 qatorlardagi ListNode konstruktori ListNode konstruktorini chaqiradi.
insertItem ga murojaat qilish uchun misol o'zgaruvchisi ma'lumotlarini o'rnatish uchun 20-24 qatorlardagi instruktor
argument sifatida qabul qilindi va keyingiNode havolasini nullga o'rnatdi, chunki bu
ro'yxatdagi birinchi va oxirgi tugun.
3. Agar roʻyxat boʻsh boʻlmasa, birinchi tugunni oʻrnatish orqali yangi tugun roʻyxatga “bogʻlanadi”.
yangi ListNode obyektiga va ushbu ob'ektni insertItem va bilan ishga tushiring
birinchi tugun (65-qator). ListNode konstruktori (20–24-qatorlar) bajarilganda, u
argument sifatida berilgan insertItemga murojaat qilish uchun misol o'zgaruvchisi ma'lumotlarini o'rnatadi va
yangi tugunning keyingi tugun havolasini o'rnatish orqali kiritishni amalga oshiradi
ListNode argument sifatida qabul qilindi, u ilgari birinchi tugun edi.
21.6-rasmda (a) qism insertAtFront operatsiyasi vaqtida ro'yxat va yangi tugunni ko'rsatadi.
va dastur yangi tugunni ro'yxatga ulashdan oldin. (b) qismidagi nuqtali strelkalar illus-
trate insertAtFront operatsiyasining 3-bosqichi 12 dan iborat tugunni ishga tushiradi
ro'yxatdagi yangi birinchi tugunga aylaning.

21.4.6 Ro'yxat usuli insertAtBack


insertAtBack usuli (21.3-rasmning 69-75-qatorlari) yangi tugunni ro'yxatning orqa tomoniga joylashtiradi.
Qadamlar quyidagilar:
1. Ro‘yxat bo‘sh yoki yo‘qligini aniqlash uchun isEmpty ga qo‘ng‘iroq qiling (71-qator).
2. Agar roʻyxat boʻsh boʻlsa, firstNode va lastNode-ga yangi ListNode-ni tayinlang.
insertItem bilan ishga tushirilgan (72-qator). 13–16-qatorlardagi ListNode konstruktori

21.6-rasm | insertAtFront operatsiyasining grafik tasviri.

7 11

(a) birinchi tugun



(b)

12

yangi ListNode



7 11

birinchi tugun

12

yangi ListNode


880 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

20-24-qatorlardagi konstruktorni chaqiradi, o'zgaruvchining misol ma'lumotlariga murojaat qiladi
insertItem argument sifatida qabul qilindi va keyingiNode havolasini nullga o'rnatish uchun.
3. Agar roʻyxat boʻsh boʻlmasa, 74-qator yangi tugunni roʻyxatga tayinlash orqali bogʻlaydi.
lastNode va lastNode.nextNode yangi ListNode-ga havola
insertItem bilan ishga tushirildi. ListNode konstruktori (13–16-qatorlar) misolni o'rnatadi
argument sifatida qabul qilingan insertItemga murojaat qilish uchun o'zgaruvchan ma'lumotlar va mos yozuvlar
nextNode dan nullgacha, chunki bu ro'yxatdagi oxirgi tugun.
21.7-rasmda (a) qism insertAtBack operatsiyasi vaqtida ro'yxat va yangi tugunni ko'rsatadi.
va yangi tugunni ro'yxatga ulashdan oldin. (b) qismidagi nuqtali o'qlar qadamni ko'rsatadi
bo'sh bo'lmagan ro'yxat oxiriga yangi tugunni qo'shadigan insertAtBack usulining 3.

21.4.7 List Method removeFromFront


removeFromFront usuli (21.3-rasmning 78-92-qatorlari) ro'yxatning birinchi tugunini olib tashlaydi va
olib tashlangan ma'lumotlarga havolani qaytaradi. Agar dastur buni chaqirganda ro'yxat bo'sh bo'lsa
usulda, usul EmptyListException ni chiqaradi (80–81-qatorlar). Aks holda, met-
od o'chirilgan ma'lumotlarga havolani qaytaradi. Qadamlar quyidagilar:
1. FirstNode.data (o'chirilayotgan ma'lumotlar) ni o'chirilgan elementga (83-qator) tayinlang.
2. Agar firstNode va lastNode bir xil ob'ektga (86-satr) tegishli bo'lsa, ro'yxat faqat bittaga ega
bu vaqtda element. Shunday qilib, usul firstNode va lastNode ni null (line
87) tugunni ro'yxatdan olib tashlash (ro'yxatni bo'sh qoldirish).
3. Agar ro'yxatda bir nechta tugun bo'lsa, u holda usul lastNode havolasini shunday qoldiradi
bo'ladi va firstNode.nextNode qiymatini firstNode ga belgilaydi (89-qator). Shunday qilib,
firstNode avval ro'yxatdagi ikkinchi tugun bo'lgan tugunga murojaat qiladi.
4. O'chirilgan element ma'lumotnomasini qaytaring (91-qator).
21.8-rasmda (a) qism olib tashlash operatsiyasidan oldingi ro'yxatni ko'rsatadi. Kesilgan chiziqlar
va (b) qismidagi o'qlar mos yozuvlar manipulyatsiyalarini ko'rsatadi.

21.7-rasm | insertAtBack operatsiyasining grafik tasviri.

12 7 11 5

lastNode yangi Listnode

12 7 11 5

lastNode yangi Listnode

(a) birinchi tugun

(b) birinchi tugun


21.4 Bog'langan ro'yxatlar 881

21.4.8 Ro'yxat usuli removeFromBack
RemoveFromBack usuli (21.3-rasmning 95–118-qatorlari) roʻyxatning oxirgi tugunini olib tashlaydi va
olib tashlangan ma'lumotlarga havolani qaytaradi. Usul EmptyListException ni chiqaradi
(97–98-qatorlar), agar dastur ushbu usulni chaqirganda ro'yxat bo'sh bo'lsa. Qadamlar quyidagilar:
1. LastNode.data (o'chirilayotgan ma'lumotlar) ni olib tashlangan elementga (100-qator) tayinlang.
2. Agar firstNode va lastNode bir xil ob'ektga tegishli bo'lsa (103-satr), ro'yxatda mavjud
bu vaqtda faqat bitta element. Shunday qilib, 104-satr firstNode va lastNode-ni nullga o'rnatadi
ushbu tugunni ro'yxatdan olib tashlash uchun (ro'yxatni bo'sh qoldirib).
3. Agar ro'yxatda bir nechta tugun bo'lsa, ListNode mos yozuvlar oqimini yarating va quyidagicha:
avval uni imzolang. Tugun (107-qator).
4. Endi oxirgi tugundan oldingi tugunga murojaat qilmaguncha joriy bilan “roʻyxat boʻylab yuring”.
while tsikli (110–111-qatorlar) joriy.nextNode ni joriyga tayinlaydi.
current.nextNode (roʻyxatdagi keyingi tugun) lastNode emas.
5. Ikkinchidan oxirgigacha bo'lgan tugunni aniqlagandan so'ng, oqimni lastNode (113-qator) ga tayinlang.
ro'yxatda qaysi tugun oxirgi ekanligini yangilang.
6. Oxirgi tugunni olib tashlash uchun current.nextNode ni null (114-satr) ga o'rnating.
ro'yxatga kiriting va ro'yxatni joriy tugunda tugating.
7. O'chirilgan element ma'lumotnomasini qaytaring (117-qator).
21.9-rasmda (a) qism olib tashlash operatsiyasidan oldingi ro'yxatni ko'rsatadi. Kesilgan chiziqlar
va (b) qismidagi o'qlar mos yozuvlar manipulyatsiyalarini ko'rsatadi. [Roʻyxatni kiritishni cheklab qoʻydik

21.8-rasm | removeFromFront operatsiyasining grafik tasviri.

12 7 11 5

oxirgi tugun

12 7 11 5

elementni olib tashlang

oxirgi tugun

(a) birinchi tugun

(b) birinchi tugun

882 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

va ro'yxatning old va orqa tomoniga olib tashlash operatsiyalari. 21.26-mashqda siz
Roʻyxatning istalgan joyiga qoʻshish va oʻchirishni yoqish uchun List sinfini yaxshilang.]
21.4.9 Ro'yxat usulini chop etish
Chop etish usuli (21.3-rasmning 127-146-satrlari) birinchi navbatda ro'yxatning bo'sh yoki yo'qligini aniqlaydi (satrlar).
129–133). Agar shunday bo'lsa, chop etish ro'yxat bo'shligini bildiruvchi xabarni ko'rsatadi va boshqaruvni qaytaradi
qo'ng'iroq qilish usuliga. Aks holda, chop etish ro'yxat ma'lumotlarini chiqaradi. 136-qator ListNode-ni yaratadi
joriy va uni firstNode bilan ishga tushiradi. Joriy null bo'lmasa-da, ko'proq elementlar mavjud
ro'yxatda. Shuning uchun 141-satr joriy.data ning satrli tasvirini chiqaradi. 142-qator
mos yozuvlar joriy.nextNode qiymatini belgilash orqali roʻyxatning keyingi tuguniga oʻtadi
joriy. Ushbu bosib chiqarish algoritmi bog'langan ro'yxatlar, steklar va navbatlar uchun bir xil.
21.4.10 O'z paketlaringizni yaratish
Ma'lumki, Java API turlari (sinflar, interfeyslar va raqamlar) shunday paketlarda tashkil etilgan
guruhga oid turlar. Paketlar dasturlarni import qilish imkonini berish orqali dasturiy ta'minotdan qayta foydalanishni osonlashtiradi.
sinflarni ularni ishlatadigan har bir dasturning papkalariga nusxalash o'rniga. Pro-
grammatikachilar, ayniqsa, katta dasturlarda dastur komponentlarini tartibga solish uchun paketlardan foydalanadilar. Uchun
Misol uchun, sizda dasturingizning turlarini o'z ichiga olgan bitta paket bo'lishi mumkin
grafik foydalanuvchi interfeysi, boshqasi ilovangiz maʼlumotlarini boshqaradigan turlar uchun
tarmoq orqali serverlar bilan aloqa qiladigan turlar uchun boshqa. Bundan tashqari, paketlar yordam beradi
siz e'lon qilgan har bir tur uchun noyob nomlarni belgilaysiz, bu (biz muhokama qilganimizdek) oldini olishga yordam beradi
sinf nomlari to'qnashuvi. Ushbu bo'lim o'z paketlaringizni qanday yaratish va ulardan foydalanishni tanishtiradi.
Bu erda muhokama qiladigan narsalarning aksariyati siz uchun NetBeans, Eclipse va In- kabi IDElar tomonidan hal qilinadi.
IDEA. Biz JDK buyruq qatori vositalari bilan paketlarni yaratish va ulardan foydalanishga e'tibor qaratamiz.

21.9-rasm | removeFromBack operatsiyasining grafik tasviri.

12 7 11 5

oxirgi tugun

12 7 11 5

elementni olib tashlang

joriy oxirgi tugun

(a) birinchi tugun

(b) birinchi tugun

21.4 Bog'langan ro'yxatlar 883

Qayta foydalanish mumkin bo'lgan sinfni e'lon qilish bosqichlari
Sinfni bir nechta dasturlarga import qilishdan oldin uni paketga joylashtirish kerak
uni qayta foydalanishga yaroqli holga keltiring. Qayta foydalanish mumkin bo'lgan sinfni yaratish bosqichlari:
1. Bir yoki bir nechta ommaviy turlarni (sinflar, interfeyslar va enumlar) e'lon qiling. Faqat ommaviy
turlari ular e'lon qilingan paketdan tashqarida qayta ishlatilishi mumkin.
2. Noyob paket nomini tanlang va manba kodiga paket deklaratsiyasini qo'shing
paketning bir qismi bo'lishi kerak bo'lgan har bir qayta foydalanish mumkin bo'lgan turdagi fayl.
3. Turlarni tegishli paket katalogiga joylashtirish uchun kompilyatsiya qiling.
4. Qayta foydalanish mumkin bo'lgan turlarni dasturga import qiling va ulardan foydalaning.
Endi biz ushbu bosqichlarning har birini batafsilroq muhokama qilamiz.
1-qadam: Qayta foydalanish uchun umumiy turlarni yaratish
1-qadam uchun siz paketga joylashtiriladigan turlarni, shu jumladan, ikkalasini ham e'lon qilasiz.
foydalanish mumkin bo'lgan turlar va har qanday qo'llab-quvvatlovchi turlar. 21.3-rasmda sinflar ro'yxati ommaviydir, shuning uchun uni qayta ishlatish mumkin
uning paketidan tashqarida. Class ListNode umumiy emas, shuning uchun u faqat sinf tomonidan ishlatilishi mumkin
Ro'yxat va bir xil paketda e'lon qilingan boshqa har qanday turlar. 21.4-rasmda EmptyListEx- klassi
qabul qilish ommaviydir, shuning uchun u ham qayta foydalanish mumkin. Agar manba kodi faylida bir nechta tur bo'lsa,
fayl kompilyatsiya qilinganda fayldagi barcha turlar bir paketga joylashtiriladi.
2-qadam: Paket bayonotlarini qo'shish
2-qadam uchun siz paket nomini o'z ichiga olgan paket deklaratsiyasini taqdim etasiz. Hamma manba -
bir xil paketning bir qismi bo'lishi kerak bo'lgan turlarni o'z ichiga olgan kod fayllari bir xil bo'lishi kerak
paket deklaratsiyasi. 21.3 va 21.4-rasmlarda quyidagilar mavjud:

bu fayllarda e'lon qilingan barcha turlar - 21.3-rasmdagi ListNode va List va


21.4-rasmdagi EmptyListException - com.deitel.datastructures paketining bir qismi.
Har bir Java manba kodi fayli faqat bitta paket deklaratsiyasini o'z ichiga olishi mumkin va u oldindan tayyorlanishi kerak.
boshqa barcha deklaratsiyalar va bayonotlardan voz kechish. Agar Java-da paket bayonoti berilmasa
manba kodi faylida, ushbu faylda e'lon qilingan turlar standart paket deb ataladigan paketga joylashtiriladi
va faqat bir xilda joylashgan standart paketdagi boshqa sinflarga kirish mumkin
katalog. Ushbu kitobdagi barcha oldingi dasturlar ushbu standart paketdan foydalangan.
Paket nomlash konventsiyalari
Paket nomining qismlari nuqta (.) bilan ajratiladi va odatda ikki yoki undan ortiq qismlar mavjud.
Noyob paket nomlarini ta'minlash uchun siz odatda nomni muassasangizning yoki bilan boshlaysiz
kompaniyaning Internet domen nomi teskari tartibda, masalan, bizning domen nomimiz deitel.com,
shuning uchun biz paket nomlarimizni com.deitel bilan boshlaymiz. yourcollege.edu domen nomi uchun,
paket nomini edu.yourcollege bilan boshlaysiz.
Teskari domen nomidan keyin siz paket nomida qo'shimcha qismlarni belgilashingiz mumkin.
Agar siz ko'plab maktablarga ega bo'lgan universitet yoki ko'plab bo'limlarga ega kompaniyaning bir qismi bo'lsangiz, shunday qilishingiz mumkin
paket nomining keyingi qismi sifatida maktab yoki bo'linma nomidan foydalaning. Xuddi shunday, agar turlar
ma'lum bir loyiha uchun bo'lsa, loyiha nomini paket nomining bir qismi sifatida kiritishingiz mumkin.
Biz ushbu sinflarni ko'rsatish uchun paket nomidagi keyingi qism sifatida ma'lumotlar tuzilmalarini tanladik
ListNode, List va EmptyListException ushbu ma'lumotlar tuzilmalari bo'limidan olingan.

com.deitel.datastructures paketi;


884 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

To'liq malakali ismlar
Paket nomi to'liq malakali tur nomining bir qismidir, shuning uchun sinf Ro'yxati nomi
aslida com.deitel.datastructures.List. Siz ushbu to'liq malakali ismni o'z sahifangizda ishlatishingiz mumkin
dasturlari yoki siz sinfni import qilishingiz va uning oddiy nomidan foydalanishingiz mumkin (sinf nomining o'zi -
Ro'yxat) dasturda. Agar boshqa paketda List sinfi ham bo'lsa, to'liq malakali sinf
nomlar dasturdagi sinflarni farqlash va nomni oldini olish uchun ishlatilishi mumkin
ziddiyat (shuningdek, nom to'qnashuvi deb ataladi).

3-qadam: Paketlangan turlarni kompilyatsiya qilish


3-bosqich - sinfni tegishli paketda saqlash uchun kompilyatsiya qilish. Java qachon
paket deklaratsiyasini o'z ichiga olgan fayl kompilyatsiya qilinadi, natijada olingan sinf fayli ikki qatorga joylashtiriladi.
deklaratsiyada ko'rsatilgan rektorlik. com.deitel.datastructures paketidagi sinflar
katalogga joylashtiriladi

Paket deklaratsiyasidagi nomlar paket sinflarining aniq joylashuvini ko'rsatadi.


Javac buyruq qatori varianti -d kompilyatorga kataloglarni yaratishga olib keladi
paket deklaratsiyasiga asoslanadi. Variant shuningdek, yuqori darajadagi katalogni ham belgilaydi
paket nomi tizimingizda joylashtirilishi kerak - siz nisbiy yoki qo'shimchasini ko'rsatishingiz mumkin.
bu joyga to'liq yo'l. Masalan, buyruq

paketimiz nomidagi birinchi katalog (com) joriyda joylashtirilishi kerakligini bildiradi


katalog. Oldingi buyruqdagi -d dan keyingi davr (.) joriy yo'nalishni bildiradi.
Windows, UNIX, Linux va Mac OS X operatsion tizimlarida (va boshqa bir qancha
shuningdek). Xuddi shunday, buyruq

paketimiz nomidagi birinchi katalog (com) ota-onaga joylashtirilishi kerakligini bildiradi


katalog - biz buni ushbu bobdagi barcha qayta foydalanish mumkin bo'lgan sinflar uchun qildik. Bilan kompilyatsiya qilganingizdan keyin
-d opsiyasi, paketning ma'lumotlar tuzilmalari katalogida ListNode.class fayllari mavjud,
List.class va EmptyListException.class.

4-qadam: Paketingizdan turlarni import qilish


Turlar paketga kompilyatsiya qilingandan so'ng, ularni import qilish mumkin (4-qadam). Sinflar ro'yxati testi
(21.5-rasm) standart paketda, chunki uning .java faylida dec- paketi mavjud emas.
laratsiya. Chunki ListTest klassi List va EmptyListExcep-dan boshqa paketda joylashgan.
ListTest klassi ulardan foydalanishi uchun siz ushbu sinflarni import qilishingiz kerak (3–4-qatorlar).
21.5-rasm) yoki siz List va EmptyListException nomlarini to'liq moslashtirishingiz kerak.
Bu erda ular ListTest sinfida ishlatiladi. Misol uchun, 21.5-rasmning 10-qatori mumkin
quyidagicha yozilgan:

com
deitel


ma'lumotlar tuzilmalari

javac -d. List.java EmptyListException.java

javac -d .. List.java EmptyListException.java

com.deitel.datastructures.List list =


new com.deitel.datastructures.List<>();

21.4 Bog'langan ro'yxatlar 885

Yagona turdagi import va talab bo'yicha import deklaratsiyasi
21.5-rasmning 3-4-qatorlari bitta turdagi import deklaratsiyasidir - ularning har biri bitta sinfni belgilaydi.
Import. Agar manba kodi fayli paketdagi bir nechta sinflardan foydalansa, ularni import qilishingiz mumkin
shaklning aa turi-import-on-demand deklaratsiyasi bilan sinflar

U oxiridagi yulduzcha (*) yordamida kompilyatorga barcha umumiy sinflar


paket nomi paketi importni o'z ichiga olgan faylda ishlatilishi mumkin. Faqat o'sha sinflar
foydalaniladi, bajarilish vaqtida yuklanadi. Oldingi import oddiydan foydalanishga imkon beradi
paket nomi paketidagi har qanday turdagi nom. Ushbu kitob davomida biz taqdim etamiz
Yagona turdagi import deklaratsiyasi sizga qaysi birini aniq ko'rsatish uchun hujjat shakli sifatida
turlari har bir dasturda ishlatiladi.

Dasturni kompilyatsiya qilishda sinf yo'lini ko'rsatish


ListTest-ni kompilyatsiya qilishda javac List va Emp- sinflari uchun .class fayllarini topishi kerak.
ListTest sinfi ulardan to'g'ri foydalanishini ta'minlash uchun tyListException. Kompilyator a dan foydalanadi
kerakli sinflarni topish uchun sinf yuklovchisi deb ataladigan maxsus ob'ekt. Sinf yuklagichi tomonidan boshlanadi
JDK bilan birlashtirilgan standart Java sinflarini qidirish. Keyin u op-ni qidiradi
milliy paketlar. Java yangi (ixtiyoriy) paketlarni ishga tushirish imkonini beruvchi kengaytma mexanizmini taqdim etadi.
ishlab chiqish va bajarish uchun Java-ga qo'shiladigan yosh. Agar sinf topilmasa
standart Java sinflarida yoki kengaytma sinflarida sinf yuklovchisi sinfni qidiradi.
yo'l - qayta foydalanish mumkin bo'lgan turlarni o'z ichiga olgan kataloglar yoki arxiv fayllari ro'yxati. Har bir katalog yoki ar-
chive fayli keyingisidan katalog ajratuvchi - Windows tizimida nuqta-vergul (;) bilan ajratiladi
yoki UNIX/Linux/Mac OS X da ikki nuqta (:). Arxiv fayllari alohida fayllar bo'lib, ularda ikki xil
boshqa fayllarning rektorlari, odatda siqilgan formatda. Masalan, standart sinflar
bilan o'rnatilgan rt.jar arxiv faylida sizning dasturlaringiz tomonidan foydalaniladi
JDK. Arxiv fayllari odatda .jar yoki .zip fayl nomi kengaytmalari bilan tugaydi.
Odatiy bo'lib, sinf yo'li faqat joriy katalogdan iborat. Biroq, sinf yo'li
tomonidan o'zgartirilishi mumkin
1. javac kompilyatoriga -classpath listOfDirectories opsiyasini taqdim etish yoki
2. CLASSPATH muhit o'zgaruvchisini o'rnatish (siz aniqlagan maxsus o'zgaruvchi
va operatsion tizim dasturlarning sinflarni izlashi uchun xizmat qiladi
belgilangan joylar).
Agar siz ListTest.java-ni -classpath variantini ko'rsatmasdan kompilyatsiya qilsangiz, masalan

sinf yuklovchisi ListTest dasturi tomonidan ishlatiladigan qo'shimcha paket(lar) ni nazarda tutadi


joriy katalogda. Yuqorida aytib o'tganimizdek, biz paketimizni asosiy katalogga joylashtirdik

import paket nomi.*;

Umumiy dasturlash xatosi 21.1
Import deklaratsiyasidan foydalanish import java.*; kompilyatsiya xatosini keltirib chiqaradi. Siz belgilashingiz kerak -
sinflarni import qilmoqchi bo'lgan to'liq paket nomini ko'rsating.

Xatolarning oldini olish bo'yicha maslahat 21.1


Yagona turdagi import deklaratsiyasidan foydalanish faqatgina import qilish orqali nomlash ziddiyatlarini oldini olishga yordam beradi
kodingizda aslida foydalanadigan turlar.

javac ListTest.java


886 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

ushbu bobdagi boshqa dasturlar tomonidan ishlatilishi mumkin. ListTest.java kompilyatsiya qilish uchun foydalaning
buyruq

Windows yoki buyruqda

UNIX/Linux/Mac OS X da. The . sinf yo'lida sinf yuklovchisiga List-ni topishga imkon beradi.
Joriy katalogda sinab ko'ring. .. sinf yuklovchisiga paketning mazmunini aniqlash imkonini beradi.
yoshi com.deitel.datastructures ota-katalogda.

Dasturni bajarishda sinf yo'lini ko'rsatish


Dasturni ishga tushirganingizda, JVM pro-format uchun .class fayllarni topa olishi kerak.
gramm sinflari. Kompilyator singari, java buyrug'i ham sinf yuklagichidan foydalanadi
avval standart sinflar va kengaytma sinflari, so'ngra sinf yo'lini qidiradi (joriy yo'nalish
sukut bo'yicha). Sinf yo'lini bir xil usullardan foydalangan holda aniq belgilash mumkin.
kompilyator uchun la'natlangan. Kompilyatorda bo'lgani kabi, individual dasturni ko'rsatish yaxshiroqdir
buyruq qatori JVM variantlari orqali sinf yo'li. Siz java com-da sinf yo'lini belgilashingiz mumkin.
mand -classpath yoki -cp buyruq qatori opsiyalari, so'ngra kataloglar ro'yxati
yoki arxiv fayllari. Shunga qaramay, agar sinflar joriy katalogdan yuklanishi kerak bo'lsa, quyidagilarni unutmang:
joriy katalogni belgilash uchun sinf yo'liga nuqta (.) qo'ying. ListTestni bajarish uchun
dastur uchun quyidagi buyruqdan foydalaning:

Ushbu bobning qolgan har bir qismi uchun shunga o'xshash javac va java buyruqlaridan foydalanishingiz kerak bo'ladi


misollar. Sinf yo'li haqida qo'shimcha ma'lumot olish uchun docs.oracle.com/javase/7/ saytiga tashrif buyuring.
docs/technotes/tools/index.html#general.

21.5 Staklar


Stack - bu ro'yxatning cheklangan versiyasi - a ga yangi tugunlarni qo'shish va undan olib tashlash mumkin
faqat tepada to'plang. Shu sababli, stek oxirgi kiruvchi, birinchi chiquvchi (LIFO) ma'lumotlari deb ataladi

javac -classpath .;.. ListTest.java

javac -classpath .:.. ListTest.java

Umumiy dasturlash xatosi 21.2


Aniq sinf yo'lini belgilash joriy katalogni sinf yo'lidan olib tashlaydi. Bu
joriy katalogdagi sinflarni (jumladan joriy katalogdagi paketlarni) oldini oladi
to'g'ri yuklash. Agar sinflar joriy katalogdan yuklanishi kerak bo'lsa, ichiga nuqta (.) qo'ying
joriy katalogni belgilash uchun sinf yo'li.

Dasturiy ta'minot muhandisligi kuzatuvi 21.2


Umuman olganda, kompilyatorning emas, balki -classpath variantidan foydalanish yaxshidir
CLASSPATH muhit o'zgaruvchisi, dastur uchun sinf yo'lini belgilash uchun. Bu imkon beradi
Har bir dastur o'z sinf yo'liga ega bo'lishi kerak.

Xatolarning oldini olish bo'yicha maslahat 21.2


CLASSPATH muhit o'zgaruvchisi bilan sinf yo'lini belgilash nozik va
bir xil paketning turli versiyalarini ishlatadigan dasturlarda topish qiyin bo'lgan xatolar.

java -classpath .:.. ListTest


21.5 Stak 887



tuzilishi. Pastki tugundagi havola a'zosi pastki qismini ko'rsatish uchun nullga o'rnatiladi
to'plam. Stackni bog'langan ro'yxat sifatida amalga oshirish shart emas - u ham amalga oshirilishi mumkin
massiv yordamida aytilgan.
Stackni manipulyatsiya qilishning asosiy usullari bu yangisini qo'shadigan push va pop
stekning yuqori qismiga tugun qo'ying va mos ravishda stekning yuqori qismidan tugunni olib tashlang.
Pop usuli, shuningdek, ochilgan tugundan ma'lumotlarni qaytaradi.
Staklarda juda ko'p qiziqarli ilovalar mavjud. Masalan, dastur a chaqirganda
usul, chaqirilgan usul o'z qo'ng'iroq qiluvchiga qanday qaytishni bilishi kerak, shuning uchun qaytish manzili
chaqiruv usuli dasturni bajaruvchi stekga suriladi (6.6-bo'limda muhokama qilinadi).
Agar bir qator usul qo'ng'iroqlari sodir bo'lsa, ketma-ket qaytish manzillari stekga suriladi
har bir usul o'z qo'ng'iroq qiluvchiga qaytishi uchun oxirgi kirish, birinchi chiqish tartibida. Stacks takrorlashni qo'llab-quvvatlaydi -
sive usul an'anaviy rekursiv bo'lmagan usul chaqiruvlari kabi qo'ng'iroq qiladi.
Dasturni bajaruvchi stek har birida mahalliy o'zgaruvchilar uchun xotirani ham o'z ichiga oladi
dasturni bajarish jarayonida usulni chaqirish. Usul o'ziga qaytganda
qo'ng'iroq qilganda, ushbu usulning mahalliy o'zgaruvchilari uchun xotira stekdan chiqariladi va bu o'zgaruvchilar
qobiliyatlar endi dasturga ma'lum emas. Mahalliy o'zgaruvchi mos yozuvlar va ob'ekt bo'lsa
Unga havola qilingan boshqa o'zgaruvchilarga ega bo'lmasa, ob'ekt axlat bo'lishi mumkin.
tanlangan.
Kompilyatorlar arifmetik ifodalarni baholash va machine-lan-ni yaratish uchun steklardan foydalanadilar.
ularni qayta ishlash uchun kod. Ushbu bobdagi mashqlar bir nechta ilovalarni o'rganadi
steklar, shu jumladan to'liq ishlaydigan kompilyatorni ishlab chiqish uchun ulardan foydalanish. Shuningdek, paket
java.util ilovasida amalga oshirish va manipulyatsiya qilish uchun Stack sinfi mavjud (16-bobga qarang).
dasturni bajarish jarayonida o'sishi va qisqarishi mumkin bo'lgan steklar.
Ushbu bo'limda biz ro'yxatlar va steklar o'rtasidagi yaqin munosabatlardan foydalanamiz
21.3-rasmdagi List sinfidan qayta foydalanish orqali stek sinfini amalga oshirish. Biz ikkita farqni ko'rsatamiz
qayta foydalanishning turli shakllari. Birinchidan, biz sinflar ro'yxatini kengaytirish orqali stek sinfini amalga oshiramiz.
Keyin kompozitsiya orqali bir xil ishlaydigan stek sinfini amalga oshiramiz
shaxsiy misol o'zgaruvchisi sifatida List ob'ektiga havolani o'z ichiga oladi. Ro'yxat, stack va
Ushbu bobdagi navbatdagi ma'lumotlar tuzilmalari har qanday ob'ektga havolalarni saqlash uchun amalga oshiriladi
qayta foydalanishni rag'batlantirish uchun yozing.
List dan meros bo'lgan stek klassi
21.10 va 21.11-rasmlar List sinfini kengaytiruvchi stek sinfini yaratadi va boshqaradi.
21.3-rasm. Biz stekda push, pop, isEmpty va chop etish usullari bo'lishini xohlaymiz. Muhim -
ly, bular List insertAtFront, removeFromFront, isEmpty va chop etish usullari.
Albatta, List sinfida boshqa usullar mavjud (masalan, insertAtBack va removeFrom-
Orqaga) biz umumiy interfeys orqali stekga kirishni xohlamaymiz
sinf. Shuni yodda tutish kerakki, List umumiy interfeys sinfidagi barcha usullar ham
StackInheritance kichik sinfining ommaviy usullaridir (21.10-rasm). Har bir usul
StackInheritance tegishli List usulini chaqiradi, masalan, surish usuli
insertAtFront qo'ng'iroqlari va pop qo'ng'iroqlari removeFromFront usuli. StackInheritance cli-
ents isEmpty usullarini chaqirishi va chop etishi mumkin, chunki ular List dan meros qilib olingan. Sinf
StackInheritance qayta tiklash uchun com.deitel.datastructures paketida (3-qator) e'lon qilingan.
foydalanish. StackInheritance List-ni import qilmaydi - sinflar bir xil paketda.
Class StackInheritanceTestning asosiy usuli (21.11-rasm) sinf ob'ektini yaratadi.
StackInheritance stek deb ataladi (10-qator). Dastur butun sonlarni stekga suradi
(13, 15, 17 va 19-qatorlar). Bu yerda maʼlumotlarga Integer obʼyektlarini kiritish uchun avtoboks qoʻllaniladi

888 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

tuzilishi. 27–32 qatorlar ob'ektlarni stekdan cheksiz while tsiklida chiqaradi. Agar usul
pop bo'sh stekda chaqiriladi, usul EmptyListException ni chiqaradi. Bunda
Bunday holda, dastur istisnolarning stek izini ko'rsatadi, bu esa usullarni ko'rsatadi
istisno sodir bo'lgan vaqtda dasturni bajarish stekasi. Dastur usuldan foydalanadi
stek tarkibini chiqarish uchun chop etish (Ro'yxatdan meros bo'lib qolgan).

1 // 21.10-rasm: StackInheritance.java


2 // StackInheritance sinflar ro'yxatini kengaytiradi.
3 ta paket com.deitel.datastructures;
4
5 umumiy sinf StackInheritance
6 {
7 // konstruktor
8 umumiy StackInheritance()
9 {
10 super("stek");
11 }
12
13 // stekga ob'ekt qo'shish
14
15 {
16
17 }
18
19 // obyektni stekdan olib tashlash
20
21 {
22
23 }
24 } // oxirgi sinf StackInheritance
21.10-rasm | StackInheritance sinflar ro'yxatini kengaytiradi.

1 // 21.11-rasm: StackInheritanceTest.java


2 // Stackni manipulyatsiya qilish dasturi.
3 import com.deitel.datastructures.StackInheritance;
4 import com.deitel.datastructures.EmptyListException;
5
6 umumiy sinf StackInheritanceTest
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10
11
12
13
14
15
16
17

21.11-rasm | Stack manipulyatsiyasi dasturi. (2-qismning 1-qismi.)

Ro'yxatni kengaytiradi

public void push (T ob'ekti)

insertAtFront(ob'ekt);

public T pop() EmptyListException ni chiqaradi

removeFromFront();

StackInheritance stek = yangi StackInheritance<>();

// surish usulidan foydalaning
stack.push(-1);
stack.print();
stack.push(0);
stack.print();
stack.push(1);

21.5 Stacks 889

Merosdan ko'ra kompozitsiya orqali stek sinfini shakllantirish
Stack sinfini amalga oshirishning eng yaxshi usuli - kompozitsiya orqali ro'yxat sinfini qayta ishlatishdir.
21.12-rasmda StackComposition klassi deklaratsiyasida shaxsiy List (7-qator) ishlatiladi.
Tarkibi bizga stekda bo'lmasligi kerak bo'lgan List usullarini yashirish imkonini beradi
umumiy interfeys. Biz faqat talab qilinadiganlardan foydalanadigan umumiy interfeys usullarini taqdim etamiz
usullarini ro'yxatlash. Har bir stek usulini List usuliga chaqiruv sifatida amalga oshirish deyiladi

18
19


20
21
22 // elementlarni stekdan olib tashlash
23 urinib ko'ring
24 {
25 int o'chirilgan element;
26
27 vaqt (to'g'ri)
28 {
29
30 System.out.printf("%n%d popped%n", o'chirildi);
31
32 }
33 }
34 ta tutish (EmptyListException emptyListException)
35 {
36 emptyListException.printStackTrace();
37 }
38 }
39 } // oxirgi sinf StackInheritanceTest

Stack: -1


Stack: 0 -1

Stack: 1 0 -1


Stack: 5 1 0 -1

5 chiqdi
Stack: 1 0 -1

1 ochildi
Stack: 0 -1

0 chiqdi
Stack: -1

-1 ochildi
Bo'sh to'plam
com.deitel.datastructures.EmptyListException: stek bo'sh
com.deitel.datastructures.List.removeFromFront manzilida(List.java:81)
com.deitel.datastructures.StackInheritance.pop(
StackInheritance.java: 22)
StackInheritanceTest.main da (StackInheritanceTest.java:29)

21.11-rasm | Stack manipulyatsiyasi dasturi. (2-qismning 2-qismi.)

stack.print();
stack.push(5);
stack.print();

RemoveItem = stack.pop(); // pop usulidan foydalaning

stack.print();

890 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

delegatsiya - chaqirilgan stek usuli qo'ng'iroqni tegishli List ga topshiradi
usul. Xususan, StackComposition qo'ng'iroqlarni List usullariga qo'shib qo'yadi.
AtFront, removeFromFront, isEmpty va chop eting. Ushbu misolda biz sinfni ko'rsatmaymiz
StackCompositionTest, chunki yagona farq shundaki, biz stek turini o'zgartiramiz
StackInheritance-dan StackComposition-ga (21.11-rasmning 3 va 10-qatorlari).

21.6 Navbatlar


Yana bir keng tarqalgan ishlatiladigan ma'lumotlar strukturasi navbatdir. Navbat kassa chizig'iga o'xshaydi
supermarketda - kassir birinchi navbatda chiziq boshida turgan odamga xizmat ko'rsatadi. Boshqa
mijozlar liniyaga faqat oxirida kiradilar va xizmatni kutadilar. Navbat tugunlari faqat olib tashlanadi
navbatning boshidan (yoki old qismidan) va faqat quyruqda (yoki oxirida) kiritiladi. Shu sababli,

1 // 21.12-rasm: StackComposition.java


2 // StackComposition tuzilgan List obyektidan foydalanadi.
3 ta paket com.deitel.datastructures;
4
5 umumiy sinf StackComposition
6 {
7
8
9 // konstruktor
10
11 {
12
13 }
14
15 // stekga ob'ekt qo'shish
16
17 {
18
19 }
20
21 // obyektni stekdan olib tashlash
22
23 {
24
25 }
26
27 // stek bo'sh yoki yo'qligini aniqlang
28
29 {
30
31 }
32
33 // stek tarkibini chiqarish
34
35 {
36
37 }
38 } // oxirgi sinf StackComposition
21.12-rasm | StackComposition tuzilgan List obyektidan foydalanadi.

xususiy ro'yxat stackList;

umumiy StackComposition()

stackList = new List("stek");

public void push (T ob'ekti)

stackList.insertAtFront(ob'ekt);

public T pop() EmptyListException ni chiqaradi

stackList.removeFromFront();

ommaviy mantiqiy isEmpty()

stackList.isEmpty();

ommaviy bekor chop etish()

stackList.print();


21.6 Navbatlar 891

navbat - bu birinchi kiruvchi, birinchi chiqadi (FIFO) ma'lumotlar tuzilmasi. Qo'shish va olib tashlash operatsiyalari
enqueue va dequeue deb nomlanadi.
Navbatlar kompyuter tizimlarida juda ko'p qo'llaniladi. Kompyuterdagi har bir protsessor xizmat ko'rsatishi mumkin
bir vaqtning o'zida faqat bitta dastur. Protsessor vaqtini talab qiladigan har bir dastur a ichiga joylashtiriladi
navbat. Navbatning oldingi qismidagi ilova xizmatni olish uchun navbatdagi hisoblanadi. Har bir ilova-
Kation xizmat ko'rsatishdan oldin ilovalar sifatida asta-sekin old tomonga o'tadi.
Navbatlar, shuningdek, chop etishni birlashtirishni qo'llab-quvvatlash uchun ham ishlatiladi. Masalan, bitta printer bo'lishi mumkin
tarmoqning barcha foydalanuvchilari tomonidan baham ko'riladi. Ko'pgina foydalanuvchilar chop etish ishlarini printerga yuborishi mumkin
printer allaqachon band bo'lganda. Ushbu chop etish ishlari printerga qadar navbatga joylashtiriladi
mavjud bo'ladi. Spooler deb nomlangan dastur navbatni boshqaradi, har birida bo'lgani kabi
chop etish ishi tugaydi, keyingisi printerga yuboriladi.
Axborot paketlari ham kompyuter tarmoqlarida navbatda turadi. Har safar paket
tarmoq tuguniga yetib borsa, u paketga boradigan yo'l bo'ylab keyingi tugunga yo'naltirilishi kerak
oxirgi manzil, oxirgi to'xtash joyi. Marshrutlash tugunlari bir vaqtning o'zida bitta paketni yo'naltiradi, shuning uchun qo'shimcha paketlar
marshrutizator ularni yo'naltira olmaguncha navbatga qo'yiladi.
Kompyuter tarmog'idagi fayl serveri ko'plab mijozlarning fayllarga kirish so'rovlarini bajaradi
butun tarmoq bo'ylab. Serverlar mijozlarning so'rovlariga xizmat ko'rsatish uchun cheklangan imkoniyatlarga ega.
Bu sig'imdan oshib ketganda, mijoz so'rovlari navbatda kutishadi.
21.13-rasmda List (21.3-rasm) ob'ektini o'z ichiga olgan Queue sinfi yaratilgan va
enqueue, dequeue, isEmpty va chop etish usullarini taqdim etadi. Sinflar ro'yxati ba'zilarini o'z ichiga oladi
biz kirishni xohlamaydigan usullar (masalan, insertAtFront va removeFromBack).
Queue umumiy interfeysi orqali. Kompozitsiyadan foydalanish bizga sinfni yashirish imkonini beradi
Queue sinfi mijozlaridan ning boshqa umumiy usullarini sanab o'ting. Har bir Queue usuli
Tegishli List usulini chaqiradi - usulni navbatga qo'yishni chaqiradi List usulini insertAt-
Orqaga, chaqiruvlarni navbatdan chiqarish List usuli removeFromFront, usuli isEmpty qo'ng'iroqlari
List usuli isEmpty va usulni chop etish chaqiruvlari List usulini chop etish. Qayta foydalanish uchun, sinf
Queue com.deitel.datastructures paketida e'lon qilingan.

1 // 21.13-rasm: Queue.java


2 // Navbat ro'yxati sinfdan foydalanadi.
3 ta paket com.deitel.datastructures;
4
5 ommaviy sinf Navbat
6 {
7
8
9 // konstruktor
10 ta umumiy navbat()
11 {
12
13 }
14
15 // ob'ektni navbatga qo'shish
16
17 {
18
19 }

21.13-rasm | Navbat sinflar roʻyxatidan foydalanadi. (2-qismning 1-qismi.)

xususiy ro'yxat queueList;

queueList = yangi ro'yxat("navbat");

umumiy bekor navbati (T ob'ekti)

queueList.insertAtBack(ob'ekt);


892 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

Class QueueTest (21.14-rasm) asosiy usuli Queue o'zgaruvchisini yaratadi va ishga tushiradi.
navbat (10-qator). 13, 15, 17 va 19-qatorlar avtomatik rejimdan foydalangan holda to'rtta butun sonni qo'yadi.
Integer obyektlarini navbatga kiritish uchun boks. 27-32 qatorlar cheksiz tsikldan foydalanadi
ob'ektlarni birinchi kiruvchi, birinchi chiqadigan tartibda ajratib oling. Navbat bo'sh bo'lsa, navbatni bekor qilish usuli
EmptyListException ni chiqaradi va dastur istisno stek izini ko'rsatadi.

20
21 // obyektni navbatdan olib tashlash


22
23 {
24
25 }
26
27 // navbat bo'sh yoki yo'qligini aniqlang
28
29 {
30
31 }
32
33 // chiqish navbati tarkibi
34
35 {
36
37 }
38 } // oxirgi sinf navbati

1 // 21.14-rasm: QueueTest.java


2 // Class QueueTest.
3 import com.deitel.datastructures.Queue;
4 import com.deitel.datastructures.EmptyListException;
5
6 ommaviy sinf QueueTest
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10
11
12
13
14
15
16
17
18
19
20
21

21.14-rasm | Navbatni qayta ishlash dasturi. (2-qismning 1-qismi.)

21.13-rasm | Navbatda sinflar roʻyxati ishlatiladi. (2-qismning 2-qismi.)

public T dequeue() EmptyListExceptionni tashlaydi

qaytish queueList.removeFromFront();

ommaviy mantiqiy isEmpty()

qaytish queueList.isEmpty();

ommaviy bekor chop etish()

queueList.print();

Queue queue = new Queue<>();

// navbat usulidan foydalaning
queue.enqueue(-1);
queue.print();
queue.enqueue(0);
queue.print();
queue.enqueue(1);
queue.print();
queue.enqueue(5);
queue.print();

21.7 Daraxtlar 893

21.7 Daraxtlar
Ro'yxatlar, steklar va navbatlar ma'lumotlarning chiziqli tuzilmalari (ya'ni, ketma-ketliklar). Daraxt chiziqli bo'lmagan, ikki-
maxsus xususiyatlarga ega o'lchovli ma'lumotlar tuzilishi. Daraxt tugunlarida ikki yoki undan ortiq havolalar mavjud.
Ushbu bo'limda ikkilik daraxtlar (21.15-rasm) - tugunlari har birida ikkita havola bo'lgan daraxtlar muhokama qilinadi.
(ulardan biri yoki ikkalasi null bo'lishi mumkin). Ildiz tugun daraxtning birinchi tugunidir. Har bir havola
ildiz tugun bolaga ishora qiladi. Chap bola chap pastki daraxtdagi birinchi tugundir (shuningdek, ma'lum
chap pastki daraxtning ildiz tuguni sifatida) va o'ng pastki o'ng pastki daraxtning birinchi tugunidir
(shuningdek, o'ng pastki daraxtning ildiz tuguni sifatida ham tanilgan). Muayyan tugunning bolalari chaqiriladi
aka-ukalar. Bolalarsiz tugun barg tugunlari deyiladi. Kompyuter olimlari odatda chizadi
daraxtlar ildiz tugunidan pastga - ko'pchilik daraxtlarning tabiatda o'sishiga qarama-qarshi.

22 // ob'ektlarni navbatdan olib tashlash


23 urinib ko'ring
24 {
25 int o'chirilgan element;
26
27 vaqt (to'g'ri)
28 {
29
30 System.out.printf("%n%d dequeued%n", o'chirildi);
31
32 }
33 }
34 ta tutish (EmptyListException emptyListException)
35 {
36 emptyListException.printStackTrace();
37 }
38 }
39 } // oxirgi sinf QueueTest

Navbat: -1


Navbat: -1 0
Navbat: -1 0 1
Navbat: -1 0 1 5

-1 navbatdan chiqarilgan


Navbat: 0 1 5

0 navbatdan chiqarilgan


Navbat: 15

1 ta navbatsiz


Navbat: 5

5 navbatdan chiqarilgan


Bo'sh navbat
com.deitel.datastructures.EmptyListException: navbat bo'sh
com.deitel.datastructures.List.removeFromFront manzilida(List.java:81)
com.deitel.datastructures.Queue.dequeue manzilida(Queue.java:24)
QueueTest.main da (QueueTest.java:29)

21.14-rasm | Navbatni qayta ishlash dasturi. (2-qismning 2-qismi.)

RemoveItem = queue.dequeue(); // dequeue usulidan foydalaning

queue.print();


894 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

Bizning misolimizda biz ikkilik qidiruv daraxti deb ataladigan maxsus ikkilik daraxtni yaratamiz. Ikkilik
Qidiruv daraxti (tugun qiymatlari takrorlanmasdan) har qanday chapdagi qiymatlar xususiyatiga ega
pastki daraxt ushbu pastki daraxtning asosiy tugunidagi qiymatdan va har qanday huquqdagi qiymatlardan kichikroq
pastki daraxt ushbu pastki daraxtning asosiy tugunidagi qiymatdan kattaroqdir. 21.16-rasmda a tasvirlangan
12 ta butun qiymatli ikkilik qidiruv daraxti. Ikkilik qidiruv daraxtining shakli
ma'lumotlar to'plamiga sponds qiymatlarni kiritish tartibiga qarab farq qilishi mumkin
daraxtga.

21.17 va 21.18-rasmlar umumiy ikkilik qidiruv daraxti sinfini yaratadi va uni boshqarish uchun foydalaning.


butun sonlar daraxtini yarating. 21.18-rasmdagi dastur daraxtni kesib o'tadi (ya'ni, o'tadi
uning barcha tugunlari) uchta yo'l bilan - rekursiv tartib, oldindan va keyingi tartib o'tishlaridan (daraxtlar) foydalanish
deyarli har doim rekursiv qayta ishlanadi). Dastur 10 ta tasodifiy sonni hosil qiladi va
har birini daraxtga kiritadi. Class Tree com.deitel.datastruc- paketida e'lon qilingan.
qayta foydalanish uchun turlar.

21.15-rasm | Ikkilik daraxtning grafik tasviri.

21.16-rasm | 12 ta qiymatdan iborat ikkilik qidiruv daraxti.

1 // 21.17-rasm: Tree.java


2 // Ikkilik qidiruv daraxti uchun TreeNode va Tree sinf deklaratsiyasi.
3 ta paket com.deitel.datastructures;
4
21.17-rasm | Ikkilik qidiruv daraxti uchun TreeNode va Tree sinf deklaratsiyasi. (4-qismning 1-qismi.)

B

AD



C

47

25



11 43 65 93

77

7 17 31 44 68


21.7 Daraxtlar 895

5 // sinf TreeNode ta'rifi
6
7 {
8 // paketga kirish a'zolari
9
10 T ma'lumot; // tugun qiymati
11
12
13 // konstruktor ma'lumotlarni ishga tushiradi va uni barg tuguniga aylantiradi
14 umumiy TreeNode (T nodeData)
15 {
16 ma'lumot = nodeData;
17 leftNode = rightNode = null; // tugunning bolalari yo'q
18 }
19
20 // kiritish nuqtasini toping va yangi tugunni kiriting; takroriy qiymatlarni e'tiborsiz qoldiring
21
22 {
23 // chap pastki daraxtga kiriting
24 agar (insertValue.compareTo(ma'lumotlar) < 0)
25 {
26 // yangi TreeNode qo'shing
27 agar (leftNode == null)
28 leftNode = new TreeNode(insertValue);
29 else // chap pastki daraxtni rekursiv ravishda aylanib o'tishni davom eting
30 leftNode.insert(insertValue);
31 }
32 // o'ng pastki daraxtga kiriting
33 boshqa agar (insertValue.compareTo(data) > 0)
34 {
35 // yangi TreeNode qo'shing
36 agar (rightNode == null)
37 rightNode = yangi TreeNode(insertValue);
38 else // o'ng pastki daraxt bo'ylab rekursiv harakatni davom ettiring
39 rightNode.insert(insertValue);
40 }
41 }
42 } // oxirgi sinf TreeNode
43
44 // sinf Daraxt ta'rifi
45
46 {
47
48
49 // konstruktor bo'sh butun sonlar daraxtini ishga tushiradi
50 umumiy daraxt()
51 {
52 ildiz = null;
53 }
54
55 // ikkilik qidiruv daraxtiga yangi tugun qo'shing
56
57 {
21.17-rasm | Ikkilik qidiruv daraxti uchun TreeNode va Tree sinf deklaratsiyasi. (4 qismning 2-qismi.)

klassi TreeNode>ni kengaytiradi

TreeNode leftNode;

TreeNode rightNode;

umumiy bekor kiritish (T insertValue)

umumiy sinf Tree>ni kengaytiradi

xususiy TreeNode ildizi;

public void insertNode (T insertValue)


896 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

58 agar (ildiz == null)
59
yana 60
61
62 }
63
64 // oldindan buyurtma o'tishni boshlash
65
66 {
67 preorderHelper(root);
68 }
69
70 // oldindan buyurtma bo'yicha o'tishni amalga oshirish uchun rekursiv usul
71
72 {
73 agar (tugun == null)
74 qaytish;
75
76 System.out.printf("%s ", node.data); // tugun ma'lumotlarini chiqarish
77
78
79 }
80
81 // tartib o'tishni boshlash
82
83 {
84 inorderHelper(root);
85 }
86
87 // tartibli o'tishni amalga oshirish uchun rekursiv usul
88
89 {
90 agar (tugun == null)
91 qaytish;
92
93
94 System.out.printf("%s ", node.data); // tugun ma'lumotlarini chiqarish
95
96 }
97
98 // buyurtmadan keyingi harakatni boshlash
99
100 {
101 postorderHelper(root);
102 }
103
104 // postorder traversiyasini bajarish uchun rekursiv usul
105
106 {
107 agar (tugun == null)
108 qaytish;
109
21.17-rasm | Ikkilik qidiruv daraxti uchun TreeNode va Tree sinf deklaratsiyasi. (4 qismning 3-qismi.)

root = yangi TreeNode(insertValue); // ildiz tugunini yarating

root.insert(insertValue); // kiritish usulini chaqiring

public void preorderTraversal()

private void preorderHelper(TreeNode tugun)

preorderHelper(node.leftNode); // chap pastki daraxtni aylantiring


preorderHelper(node.rightNode); // o'ng pastki daraxtni aylantiring

public void inorderTraversal()

xususiy void inorderHelper(TreeNode tugun)

inorderHelper(node.leftNode); // chap pastki daraxtni aylantiring

inorderHelper(node.rightNode); // o'ng pastki daraxtni aylantiring

public void postorderTraversal()

xususiy bekor postorderHelper(TreeNode tugun)

21.7 Daraxtlar 897

110
111
112 System.out.printf("%s ", node.data); // tugun ma'lumotlarini chiqarish
113 }
114 } // oxirgi sinf daraxti

1 // 21.18-rasm: TreeTest.java


2 // Ikkilik daraxt test dasturi.
3 import java.security.SecureRandom;
4 import com.deitel.datastructures.Tree;
5
6 ommaviy sinf TreeTest
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10
11 SecureRandom randomNumber = yangi SecureRandom();
12
13 System.out.println("Quyidagi qiymatlarni kiritish: ");
14
15 // daraxtga 0 dan 99 gacha bo'lgan 10 ta tasodifiy butun sonni kiriting
16 uchun (int i = 1; i <= 10; i++)
17 {
18 int qiymati = randomNumber.nextInt(100);
19 System.out.printf("%d ", qiymat);
20
21 }
22
23 System.out.printf("%n%nPreorder traversal%n");
24
25
26 System.out.printf("%n%nInorder traversal%n");
27
28
29 System.out.printf("%n%nPostorder traversal%n");
30
31 System.out.println();
32 }
33 } // TreeTest sinfini yakunlash

Quyidagi qiymatlarni kiritish:


49 64 14 34 85 64 46 14 37 55
Oldindan buyurtma berish
49 14 34 46 37 64 55 85
Tartibni o'tkazish
14 34 37 46 49 55 64 85
Buyurtmadan keyingi sayohat
37 46 34 14 55 85 64 49

21.18-rasm | Ikkilik daraxt test dasturi.

21.17-rasm | Ikkilik qidiruv daraxti uchun TreeNode va Tree sinf deklaratsiyasi. (4 qismning 4-qismi.)

postorderHelper(node.leftNode); // chap pastki daraxtni aylantiring


postorderHelper(node.rightNode); // o'ng pastki daraxtni aylantiring

Tree daraxt = new Tree();

tree.insertNode(qiymat);

tree.preorderTraversal();

tree.inorderTraversal();

tree.postorderTraversal();


898 21-bob Maxsus umumiy ma'lumotlar tuzilmalari



Keling, ikkilik daraxt dasturini ko'rib chiqaylik. TreeTest sinfining asosiy usuli
(21.18-rasm) bo'sh Tree ob'ektini instantsiyalash va unga havolani belgilash bilan boshlanadi.
o'zgaruvchan daraxtga (10-qator). 16-21 qatorlar tasodifiy 10 ta butun son hosil qiladi, ularning har biri
insertNode usulini chaqirish orqali ikkilik daraxtga kiritiladi (20-qator). Keyin dastur
ning oldindan, tartibli va keyingi oʻtishlarini amalga oshiradi (bular qisqa vaqt ichida tushuntiriladi).
daraxt (mos ravishda 24, 27 va 30-qatorlar).
Sinf daraxtining umumiy ko'rinishi
Sinf daraxti (21.17-rasm, 45-114-qatorlar) interfeysni amalga oshirish uchun uning turi argumentini talab qiladi.
Taqqoslash mumkin, shuning uchun daraxtga kiritilgan har bir qiymat mavjud qiymatlar bilan taqqoslanishi mumkin
kiritish nuqtasini topish uchun. Sinf shaxsiy maydon ildiziga ega (47-qator) - TreeNode havolasi
daraxtning ildiz tuguniga. Daraxt konstruktori (50–53-qatorlar) ildizni nullgacha ishga tushiradi
daraxt bo'sh ekanligini ko'rsatish uchun. Sinfda insertNode (56–62-qatorlar) usuli mavjud
daraxtga yangi tugun qo'shing va oldindan buyurtma berish usullari (65-68-qatorlar), tartib-
O'tishni boshlash uchun o'tish (82-85-qatorlar) va postorderTraversal (99-102-qatorlar)
daraxt. Ushbu usullarning har biri o'tish operatsiyasini bajarish uchun rekursiv yordam usulini chaqiradi.
daraxtning ichki tasviri bo'yicha eratsiyalar.
InsertNode daraxt usuli
Daraxt sinfining insertNode usuli (56–62-qatorlar) birinchi navbatda daraxtning bo‘shligini aniqlaydi.
Agar shunday bo'lsa, 59-qator yangi TreeNode-ni ajratadi, kiritilgan qiymat bilan tugunni ishga tushiradi
daraxtda va yangi tugunni mos yozuvlar ildiziga tayinlaydi. Agar daraxt bo'sh bo'lmasa, 61-qator qo'ng'iroq qiladi
TreeNode usulini qo'shish (21-41 qatorlar). Bu usul rekursiyani aniqlash uchun foydalanadi.
daraxtdagi yangi tugun uchun kation va tugunni shu joyga kiritadi. Tugun bo'lishi mumkin
ikkilik qidiruv daraxtiga faqat barg tugunlari sifatida kiritiladi.
TreeNode usulini kiritish
TreeNode usuli qo'shish qo'shiladigan qiymatni ildizdagi ma'lumotlar qiymati bilan solishtiradi
tugun. Agar qo'shish qiymati ildiz tugun ma'lumotlaridan (24-satr) kichik bo'lsa, dastur aniqlaydi
chap pastki daraxt bo'sh yoki yo'qmi (27-qator). Agar shunday bo'lsa, 28-qator yangi TreeNode-ni ajratadi, boshlang'ich-
uni kiritilayotgan qiymat bilan moslashtiradi va yangi tugunni leftNode havolasiga tayinlaydi. Boshqa-
Aks holda, 30-qator qiymatni chapga kiritish uchun chap pastki daraxt uchun insertni rekursiv chaqiradi.
pastki daraxt. Agar qo'shish qiymati ildiz tugun ma'lumotlaridan (33-qator) katta bo'lsa, dastur
o'ng pastki daraxt bo'sh yoki yo'qligini minalar (36-qator). Agar shunday bo'lsa, 37-qator yangi TreeNode-ni ajratadi,
uni kiritilgan qiymat bilan ishga tushiradi va yangi tugunni mos yozuvlar o'ngiga tayinlaydi -
Tugun. Aks holda, 39-qator qiymatni kiritish uchun o'ng pastki daraxt uchun rekursiv ravishda insertni chaqiradi.
o'ng pastki daraxt. Agar insertValue allaqachon daraxtda bo'lsa, u e'tiborga olinmaydi.
Tree Methods inorderTraversal, preorderTraversal and postorderTraversal
Traversal qo‘ng‘iroqlar daraxtini tartiblash usullari
inorderHelper (88–96-qatorlar), preorderHelper (71–79-qatorlar) va keyingi yordamchi usullar
daraxt bo'ylab o'tish va tugun qiymatlarini chop etish uchun navbati bilan orderHelper (105–113 qatorlar).
Daraxt sinfidagi yordamchi usullar sizga o'tmasdan o'tishni boshlash imkonini beradi
usulga ildiz tugun. Yo'naltiruvchi ildiz - bu dasturchi tomonidan amalga oshirish tafsilotlari
kirish imkoniga ega bo'lmasligi kerak. Usullari inorderTraversal, preorderTraversal va
postorderTraversal shunchaki shaxsiy ildiz ma'lumotnomasini oling va uni tegishli joyga o'tkazing
daraxtning o'tishini boshlash uchun yordamchi usul. Har bir yordamchi usul uchun asosiy holat
qabul qilingan ma'lumotnoma null yoki yo'qligini tugatadi va agar shunday bo'lsa, darhol qaytadi.

21.7 Daraxtlar 899

inorderHelper usuli (88–96-qatorlar) tartibni o'tish bosqichlarini belgilaydi:
1. InorderHelper (93-qator) ga qo'ng'iroq qilib, chap pastki daraxtni aylantiring.
2. Tugundagi qiymatni qayta ishlash (94-qator).
3. InorderHelper-ga qo'ng'iroq qilib, o'ng pastki daraxtni aylantiring (95-qator).
Tartibni kesib o'tish tugundagi qiymatni shu tugunning chap pastki qismidagi qiymatlargacha qayta ishlamaydi.
daraxt qayta ishlanadi. 21.19-rasmdagi daraxtning tartibli o'tishi

Ikkilik qidiruv daraxtining tartibli o'tishi tugun qiymatlarini o'sish tartibida chop etadi.


Ikkilik qidiruv daraxtini yaratish jarayoni aslida ma'lumotlarni saralaydi; shunday qilib, u deyiladi
ikkilik daraxt turi.
PreorderHelper usuli (71–79-qatorlar) oldindan buyurtma boʻyicha oʻtish bosqichlarini belgilaydi:
1. Tugundagi qiymatni qayta ishlash (76-qator).
2. PreorderHelper (77-qator) ga qo'ng'iroq qilib, chap pastki daraxtni aylantiring.
3. PreorderHelper-ga qo'ng'iroq qilib, o'ng pastki daraxtni aylantiring (78-qator).
Oldindan buyurtma bo'yicha o'tish tugunga tashrif buyurilganda har bir tugundagi qiymatni qayta ishlaydi. Qayta ishlashdan keyin
ma'lum bir tugundagi qiymat, u chap pastki daraxtdagi qiymatlarni qayta ishlaydi, so'ngra uni qayta ishlaydi
o'ng pastki daraxtdagi qiymatlar. 21.19-rasmdagi daraxtning oldindan buyurtma bo'ylab o'tishi

PostorderHelper usuli (105–113-qatorlar) buyurtmadan keyingi oʻtish bosqichlarini belgilaydi:


1. PostorderHelper (110-qator) ga qo'ng'iroq qilib, chap pastki daraxtni aylantiring.
2. PostorderHelper (111-qator) ga qo'ng'iroq qilib, o'ng pastki daraxtdan o'ting.
3. Tugundagi qiymatni qayta ishlash (112-qator).
Buyurtmadan keyingi o'tish har bir tugundagi qiymatni ushbu tugunning barcha bolalari qiymatlaridan keyin qayta ishlaydi
qayta ishlanadi. 21.19-rasmdagi daraxtning postorderTraversal bu

Ikkilik qidiruv daraxti dublikatlarni yo'q qilishni osonlashtiradi. Daraxt qurishda,


kiritish operatsiyasi takroriy qiymat kiritishga urinishlarni taniydi, chunki takroriy fol-
har bir taqqoslash bo'yicha bir xil "chapga o'tish" yoki "o'ngga o'tish" qarorlarini asl qiymat sifatida pasaytiradi
qildi. Shunday qilib, kiritish operatsiyasi oxir-oqibat dublikatni tugun konturi bilan taqqoslaydi.
bir xil qiymatga ega. Ushbu nuqtada, kiritish operatsiyasi o'chirishga qaror qilishi mumkin
takroriy qiymat (bu misolda qilganimiz kabi).

6 13 17 27 33 42 48

21.19-rasm | Etti qiymatli ikkilik qidiruv daraxti.

27 13 6 17 42 33 48

6 17 13 33 48 42 27

27

13



6 17 33 48

42


900 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

Kalit qiymatga mos keladigan qiymat uchun ikkilik daraxtni qidirish tezdir, ayniqsa qat'iy


qadoqlangan (yoki muvozanatli) daraxtlar. Qattiq o'ralgan daraxtda har bir daraja taxminan ikki barobar ko'p bo'ladi
oldingi daraja kabi ko'plab elementlar. 21.19-rasm - mahkam o'ralgan ikkilik daraxt. A qattiq
n ta elementli qadoqlangan ikkilik qidiruv daraxti log2n darajalariga ega. Shunday qilib, ko'pi bilan log2n solishtiring
o'g'illar o'yinni topishlari yoki mos kelmasligini aniqlashlari kerak. Qidiruv a
(qattiq o'ralgan) 1000 elementli ikkilik qidiruv daraxti ko'pi bilan 10 ta taqqoslashni talab qiladi, chunki
210 > 1000. 1 000 000 elementli ikkilik qidiruv daraxtini (qattiq qadoqlangan) qidirish quyidagi manzilni talab qiladi:
eng ko'p 20 ta taqqoslash, chunki 220 > 1 000 000.
Mashqlar bo'limida bir nechta boshqa ikkilik daraxt operatsiyalari uchun algoritmlar keltirilgan
ikkilik daraxtdan elementni o'chirish, ikki o'lchovli daraxtda ikkilik daraxtni chop etish kabi
formatlash va ikkilik daraxtning daraja-tartib o'tishini bajarish. Darajali tartib o'tish
ildiz tugun darajasidan boshlab daraxtning tugunlariga qatorga tashrif buyuradi. Har bir darajada
daraxt, daraja-tartib o'tish chapdan o'ngga tugunlarga tashrif buyuradi. Boshqa ikkilik daraxt mashqlari
Ikkilik qidiruv daraxtiga ikki nusxadagi qiymatlarni o'z ichiga olishiga ruxsat berish, qator qiymatlarini kiritish kiradi
ikkilik daraxt va ikkilik daraxtda qancha daraja borligini aniqlash.
21.8 Yakunlash
Ushbu bob ma'lumotlar tuzilmalari taqdimotimizni yakunlaydi. Biz 16-bobdan boshladik
Java Collections Framework-ning o'rnatilgan to'plamlari va davomi bilan tanishish.
20-bobda umumiy usullar va to'plamlarni qanday amalga oshirishni ko'rsatib o'tilgan. In
Ushbu bobda siz o'sadigan va qisqaradigan umumiy dinamik ma'lumotlar tuzilmalarini yaratishni o'rgandingiz
bajarilish vaqti. Bog'langan ro'yxatlar "bog'langan" ma'lumotlar to'plami ekanligini bilib oldingiz
zanjirda yuqoriga." Ilova qo'shish va o'chirishni amalga oshirishi mumkinligini ham ko'rdingiz
bog'langan ro'yxatning boshi va oxiri. Siz stek va navbat ma'lumotlar tuzilmalarini bilib oldingiz
ro'yxatlarning cheklangan versiyalari. Staklar uchun siz qo'shish va o'chirish amalga oshirilganini ko'rdingiz
faqat tepada. Kutish qatorlarini ifodalovchi navbatlar uchun siz kiritishlar amalga oshirilganini ko'rdingiz
quyruqda va boshdan o'chirishlar amalga oshiriladi. Ikkilik daraxt ma'lumotlarini ham o'rgandingiz
tuzilishi. Siz yuqori tezlikda qidirish va saralashni osonlashtiradigan ikkilik qidiruv daraxtini ko'rdingiz
ma'lumotlar va takroriy ma'lumotlar elementlarini samarali ravishda yo'q qilish. Bob davomida siz o'rgandingiz
qayta foydalanish va saqlab turish uchun ushbu ma'lumotlar tuzilmalarini qanday yaratish va paketlash.
Keyingi bobda siz Swing GUI kontseptsiyalarini o'rganishni davom ettirasiz
12-bobda oʻrgangan texnikalar. 25-bobda biz JavaFX GUI va
onlayn bo'limlarda JavaFX GUI, grafik va multimediyaning chuqur muolajalarini o'z ichiga oladi.

Xulosa
21.1-bo'lim Kirish


• Dinamik ma'lumotlar tuzilmalari (870-bet) bajarilish vaqtida o'sishi va qisqarishi mumkin.
• Bog'langan ro'yxatlar (870-bet) - "zanjirda bog'langan" ma'lumotlar to'plami - qo'shish va o'chirish
bog'langan ro'yxatning istalgan joyida amalga oshirilishi mumkin.
• Stacks (870-bet) kompilyatorlar va operatsion tizimlarda muhim ahamiyatga ega — qo‘shish va o‘chirish
stekning faqat yuqori qismida (870-bet) qilingan.
• Navbatda kiritishlar dum qismida (870-bet) va boshdan olib tashlashlar (870-bet) amalga oshiriladi.
• Ikkilik daraxtlar (870-bet) yuqori tezlikda qidirish va saralashni osonlashtiradi, takroriy ma'lumotlar elementlarini yo'q qiladi
samarali, fayl tizimi kataloglarini ifodalash va iboralarni mashina tiliga kompilyatsiya qilish.

Xulosa 901



21.2-bo'lim O'z-o'ziga havola qilingan sinflar
• O'z-o'ziga havola qiluvchi sinf (871-bet) xuddi shu sinfning boshqa ob'ektiga havolani o'z ichiga oladi.
turi. O'z-o'ziga havola qiluvchi ob'ektlar dinamik ma'lumotlar tuzilmalarini yaratish uchun bir-biriga bog'lanishi mumkin.
21.3-bo'lim Dinamik xotirani ajratish
• Dinamik xotirani ajratish chegarasi (871-bet) mavjud jismoniy xotiraga teng bo'lishi mumkin.
kompyuterda yoki virtual xotira tizimidagi mavjud disk maydoni. Ko'pincha chegaralar mavjud
ancha kichikroq, chunki kompyuterning mavjud xotirasi ko'p foydalanuvchilar o'rtasida taqsimlanishi kerak.
• Agar xotira mavjud bo'lmasa, OutOfMemoryError paydo bo'ladi.
21.4-bo'lim Bog'langan ro'yxatlar
• Bog'langan ro'yxatga kirish ro'yxatning birinchi tuguniga havola orqali amalga oshiriladi. Har bir keyingi tugun a-
oldingi tugunda saqlangan havola-ma'lumotnoma a'zosi orqali o'chirildi.
• An'anaga ko'ra, ro'yxatning oxirgi tugunidagi havola havolasi ro'yxat oxirini belgilash uchun null qiymatiga o'rnatiladi.
• Tugun har qanday turdagi ma'lumotlarni, shu jumladan boshqa sinf ob'ektlarini ham o'z ichiga olishi mumkin.
• Saqlanishi kerak bo'lgan ma'lumotlar elementlari soni oldindan aytib bo'lmaydigan bo'lsa, bog'langan ro'yxat mos keladi.
Bog'langan ro'yxatlar dinamikdir, shuning uchun ro'yxat uzunligi kerak bo'lganda ko'payishi yoki kamayishi mumkin.
• “Anʼanaviy” Java massivining oʻlchamini oʻzgartirib boʻlmaydi — u yaratish vaqtida belgilanadi.
• Ro'yxat tugunlari odatda qo'shni xotirada saqlanmaydi. Aksincha, ular mantiqan bir-biriga yaqin.
• Paketlar dastur komponentlarini boshqarishga yordam beradi va dasturiy ta'minotdan qayta foydalanishni osonlashtiradi.
• Paketlar nomlash ziddiyatlarining oldini olishga yordam beradigan noyob tur nomlari uchun konventsiyani taqdim etadi (884-bet).
• Turni bir nechta dasturlarga import qilishdan oldin u paketga joylashtirilishi kerak. Bo'lishi mumkin
har bir Java manba kodi faylida faqat bitta paket deklaratsiyasi (883-bet) bo'lishi kerak va u barchadan oldin bo'lishi kerak.
fayldagi boshqa deklaratsiyalar va bayonotlar.
• Har bir paket nomi teskari tartibda Internet domen nomingizdan boshlanishi kerak. qilgandan keyin -
asosiy nom teskari bo'lsa, siz paketingiz uchun xohlagan boshqa nomlarni tanlashingiz mumkin.
• Paketdagi turlarni kompilyatsiya qilishda javac buyruq qatori varianti -d (884-bet) qayerga borishni belgilaydi.
paketni saqlang va agar ular mavjud bo'lmasa, kompilyator paketning kataloglarini yaratishga majbur qiladi.
• Paket nomi to'liq malakali tur nomining bir qismidir (884-bet).
• Yagona turdagi import deklaratsiyasi (885-bet) import qilinadigan bitta sinfni belgilaydi. Talab bo'yicha import turi
deklaratsiya (885-bet) faqat dastur muayyan paketdan foydalanadigan sinflarni import qiladi.
• Kompilyator o'ziga kerak bo'lgan sinflarni sinf yo'lida topish uchun sinf yuklagichidan (885-bet) foydalanadi. Sinf yo'li
kataloglar yoki arxiv fayllari roʻyxatidan iborat boʻlib, ularning har biri katalog ajratuvchi bilan ajratilgan (885-bet).
• Kompilyator va JVM uchun sinf yo'li -classpath opsiyasini taqdim etish orqali belgilanishi mumkin
(886-bet) javac yoki java buyrug'iga yoki CLASSPATH muhit o'zgaruvchisini o'rnatish orqali. Agar
sinflar joriy katalogdan yuklanishi kerak, sinf yo'liga nuqta (.) qo'shing.
21.5-bo'lim Stacks
• Stek oxirgi kiruvchi, birinchi chiquvchi (LIFO) ma'lumotlar strukturasidir (886-bet). Buning uchun ishlatiladigan asosiy usullar
stekning yuqori qismiga yangi tugun qo'shadigan push (887-bet) va pop (887-bet) tugmalari stekni nipulatsiya qiladi.
navbati bilan yuqoridan tugunni olib tashlang. Pop usuli o'chirilgan tugun ma'lumotlarini qaytaradi.
• Usul chaqiruvi amalga oshirilganda, chaqirilgan usul o'z chaqiruvchisiga qanday qaytishni bilishi kerak, shuning uchun
Qaytish manzili dasturni bajarish stekiga suriladi. Agar bir qator usul chaqiruvlari yuzaga kelsa,
ketma-ket qaytish qiymatlari stekga oxirgi kirish, birinchi chiqish tartibida suriladi.
• Dasturni bajaruvchi stek har bir chaqiruvda mahalliy o'zgaruvchilar uchun yaratilgan bo'sh joyni o'z ichiga oladi
bir usul. Usul o'z chaqiruvchisiga qaytganida, ushbu usulning mahalliy o'zgaruvchilari uchun bo'sh joy bo'ladi
stekdan chiqib ketdi va bu o'zgaruvchilar endi dasturda mavjud emas.

902 21-bob Maxsus umumiy ma'lumotlar tuzilmalari



• Stacks kompilyatorlar tomonidan arifmetik ifodalarni baholash va mashina tilini yaratish uchun ishlatiladi.
ifodalarni qayta ishlash uchun kod.
• Har bir stek usulini List usuliga chaqiruv sifatida amalga oshirish texnikasi delegatsiya deb ataladi.
tion — stek usuli delegatlarni (890-bet) tegishli List usuliga chaqirishni chaqirdi.
21.6-bo'lim Navbatlar
• Navbat (890-bet) supermarketdagi kassa qatoriga o‘xshaydi — birinchi navbatda turgan odamga xizmat ko‘rsatiladi.
birinchi bo'lib, boshqa mijozlar esa liniyaga faqat oxirida kiradilar va xizmat ko'rsatishni kutadilar.
• Navbat tugunlari faqat navbatning boshidan (890-bet) chiqariladi va faqat navbatga kiritiladi.
quyruq. Shu sababli, navbat birinchi kelgan, birinchi bo'lib chiqadigan FIFOaaaa ma'lumotlar strukturasi deb ataladi.
• Navbatni qo'shish va olib tashlash operatsiyalari navbat (891-bet) va navbatdan chiqarish (891-bet) deb nomlanadi.
• Navbatlar kompyuter tizimlarida ko'p qo'llaniladi. Ko'pgina kompyuterlarda faqat bitta protsessor mavjud, shuning uchun
bir vaqtning o'zida faqat bitta ilovaga xizmat ko'rsatish mumkin. Boshqa ilovalar uchun arizalar a ichiga joylashtirilgan
navbat. Navbatning oldingi qismidagi kirish xizmatni olish uchun keyingi hisoblanadi. Har bir yozuv asta-sekin
ilovalar xizmat olayotganda navbatning old qismiga o'tadi.
21.7-bo'lim Daraxtlar
• Daraxt - bu chiziqli bo'lmagan, ikki o'lchovli ma'lumotlar strukturasi. Daraxt tugunlarida ikki yoki undan ortiq havolalar mavjud.
• Ikkilik daraxt (893-bet) tugunlarining barchasi ikkita bo'g'inni o'z ichiga olgan daraxtdir. Ildiz tugun (893-bet) - bu
daraxtdagi birinchi tugun.
• Ildiz tugunidagi har bir havola bolaga ishora qiladi (893-bet). Chap bola (893-bet) birinchi tugundir
chap pastki daraxt (893-bet) va o'ng pastki daraxt (893-bet) o'ng pastki daraxtning birinchi tugunidir (893-bet).
• Tugunning bolalari aka-uka deb ataladi (893-bet). Bolalarsiz tugun barg tugunidir (893-bet).
• Ikkilik qiymatlarsiz ikkilik qidiruv daraxtida (894-bet) har qanday chap pastki daraxtdagi qiymatlar dan kichikroq.
pastki daraxtning asosiy tugunidagi qiymat va har qanday o'ng pastki daraxtdagi qiymatlar qiymatdan kattaroqdir
pastki daraxtning asosiy tugunida. Tugun ikkilik qidiruv daraxtiga faqat barg tugun sifatida kiritilishi mumkin.
• Ikkilik qidiruv daraxtining tartibli o'tishi (894-bet) tugun qiymatlarini o'sish tartibida qayta ishlaydi.
• Oldindan buyurtma o'tkazishda (894-bet) tugunga tashrif buyurilganda har bir tugundagi qiymat qayta ishlanadi. Keyin
chap pastki daraxtdagi qiymatlar, keyin o'ng pastki daraxtdagi qiymatlar qayta ishlanadi.
• Buyurtmadan keyingi o'tishda (894-bet) har bir tugundagi qiymat uning bolalar qiymatlaridan keyin qayta ishlanadi.
• Ikkilik qidiruv daraxti dublikatlarni yo'q qilishni osonlashtiradi (899-bet). Daraxt yaratilganidek, harakat qiladi
dublikat qiymatini kiritish tan olinadi, chunki dublikat bir xil "chapga o'tish" yoki "o'ngga o'tish" dan keyin keladi.
har bir taqqoslash bo'yicha qarorlar asl qiymati kabi. Shunday qilib, dublikat oxir-oqibat taqqoslanadi
bir xil qiymatni o'z ichiga olgan tugun bilan. Ushbu nuqtada takroriy qiymat o'chirilishi mumkin.
• Qattiq o‘ralgan daraxtda (900-bet) har bir daraja oldingisiga qaraganda ikki baravar ko‘p elementlarni o‘z ichiga oladi.
bitta. Shunday qilib, n ta elementdan iborat mahkam o'ralgan ikkilik qidiruv daraxti log2 n darajaga ega va shuning uchun eng ko'p log2
Moslikni topish yoki mos kelmasligini aniqlash uchun n ta taqqoslash kerak bo'ladi.
st. 1000 elementdan iborat ikkilik qidiruv daraxtini qidirish uchun (qattiq o'ralgan) ko'pi bilan 10 ta taqqoslash kerak bo'ladi.
o'g'illar, chunki 210 > 1000. 1 000 000 elementli ikkilik qidiruv daraxtini qidirish
ko'pi bilan 20 ta taqqoslashni talab qiladi, chunki 220 > 1 000 000.
O'z-o'zini tekshirish mashqlari
21.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) O'z-o'zidan sinf o'sishi va qisqarishi mumkin bo'lgan dinamik ma'lumotlar tuzilmalarini yaratish uchun ishlatiladi
ijro vaqtida.

O'z-o'zini tekshirish mashqlari 903

b) A(n) - tugunlarni kiritish mumkin bo'lgan bog'langan ro'yxatning cheklangan versiyasi
va faqat ro'yxatning boshidan o'chiriladi.
c) Bog'langan ro'yxatni o'zgartirmaydigan, balki uni aniqlash uchun unga qaraydigan usul
u bo'sh, a(n) usuli deb ataladi.
d) Navbat a(n) ma'lumotlar strukturasi deb ataladi, chunki birinchi tugunlar kiritilgan
birinchilar olib tashlanadi.
e) Bog'langan ro'yxatdagi keyingi tugunga havola a(n) deb ataladi.
f) Java-da dinamik ravishda ajratilgan xotirani avtomatik ravishda qayta tiklash deyiladi.
g) A(n) - tugunlarni kiritish mumkin bo'lgan bog'langan ro'yxatning cheklangan versiyasi
faqat ro'yxat oxirida va faqat ro'yxat boshidan o'chiriladi.
h) A(n) - chiziqli bo'lmagan, ikki o'lchovli ma'lumotlar strukturasi bo'lib, u bilan tugunlarni o'z ichiga oladi
ikki yoki undan ortiq havolalar.
i) stek (n) ma'lumotlar strukturasi deb ataladi, chunki oxirgi kiritilgan tugun
birinchi tugun olib tashlandi.
j) a(n) daraxt tugunlari ikkita bog‘lovchi a’zodan iborat.
k) Daraxtning birinchi tuguni tugundir.
l) Daraxt tugunidagi har bir bog'lanish a(n) yoki shu tugunga tegishli.
m) Bolalari bo'lmagan daraxt tuguniga (n) tugun deyiladi.
n) Ikkilik qidiruv daraxtlari uchun biz matnda aytib o'tgan uchta o'tish algoritmlari
, va .
o) Paketdagi turlarni kompilyatsiya qilishda javac buyruq qatori variantini belgilaydi
paketni qayerda saqlash kerak va kompilyator agar paket kataloglarini yaratishga sabab bo'ladi
ular mavjud emas.
p) kompilyator o'ziga kerak bo'lgan sinflarni sinf yo'lida topish uchun a(n) dan foydalanadi.
q) kompilyator va JVM uchun sinf yo'lini to varianti bilan belgilash mumkin
javac yoki java buyrug'i yoki muhit o'zgaruvchisini o'rnatish orqali.
r) Java manba kodi faylida faqat bitta bo'lishi mumkin va u barcha boshqalaridan oldin bo'lishi kerak
fayldagi deklaratsiyalar va bayonotlar.
21.2 Bog'langan ro'yxat va stek o'rtasidagi farq nima?
21.3 Stack va navbat o'rtasidagi farqlar nimada?
21.4 Quyidagi ob'ektlar yoki tushunchalarning har biri qayta foydalanishga qanday hissa qo'shishi haqida fikr bildiring
ma'lumotlar tuzilmalari:
a) sinflar
b) meros
c) kompozitsiya
21.5 Ikkilik qidiruv daraxtining tartib, oldindan va keyingi o'tishlarini taqdim eting.
21.20-rasm.

21.20-rasm | 15 tugunli ikkilik qidiruv daraxti.

49

28

18 40 71 97



83

11 19 32 44 69 72 92 99


904 21-bob Maxsus umumiy ma'lumotlar tuzilmalari

O'z-o'zini tekshirish mashqlariga javoblar
21.1 a) ma'lumotnoma. b) stack. c) predikat. d) birinchi kiruvchi, birinchi chiqadi (FIFO). e) havola. f) axlat qutisi
dars. g) navbat. h) daraxt i) oxirgi kiruvchi, birinchi chiquvchi (LIFO). j) ikkilik. k) ildiz. l) bola yoki pastki daraxt.
m) barg. n) tartib, oldindan buyurtma, keyingi tartib. o) -d. p) sinf yuklagichi. q) -sinf yo‘li, KLASSPATH. r) paket
deklaratsiya.
21.2 Bog'langan ro'yxatning istalgan joyiga tugunni kiritish va istalgan joydan tugunni olib tashlash mumkin.
bog'langan ro'yxat. Stackdagi tugunlar faqat stekning yuqori qismiga kiritilishi va faqat undan olib tashlanishi mumkin
yuqori.
21.3 Navbat - bu FIFO ma'lumotlar tuzilmasi bo'lib, uning boshiga ham, dumiga ham havolalar mavjud.
tugunlar dumga kiritilishi va boshidan o'chirilishi mumkin. Stack - bu LIFO ma'lumotlar tuzilmasi
stekning yuqori qismiga bitta havolaga ega bo'lib, bu erda tugunlarni kiritish va o'chirish amalga oshiriladi.
21.4 a) Sinflar bizga xohlagancha ma'lumotlar strukturasi ob'ektlarini yaratishga imkon beradi.
b) Meros quyi sinfga yuqori sinf funksiyasidan qayta foydalanish imkonini beradi. Ommaviy va
himoyalangan superklass usullariga dublikatni yo'q qilish uchun pastki sinf orqali kirish mumkin
mantiq.
c) Kompozitsiya sinfga an-ning misoliga havolani saqlash orqali kodni qayta ishlatish imkonini beradi.
sohadagi boshqa sinf. Instantsiyaning ommaviy usullarini dagi usullar bilan chaqirish mumkin
havolani o'z ichiga olgan sinf.
21.5 Tartibni kesib o'tish
11 18 19 28 32 40 44 49 69 71 72 83 92 97 99
Oldindan buyurtma bo'yicha o'tish
49 28 18 11 19 40 32 44 83 71 69 72 97 92 99
Buyurtmadan keyingi o'tish
11 19 18 32 44 40 28 69 72 71 92 99 97 83 49

Mashqlar
21.6 (Ro‘yxatlarni birlashtiruvchi) Belgilarning ikkita bog‘langan ro‘yxat ob’ektlarini birlashtiruvchi dastur tuzing.


ters. Class ListConcatenate havolalarni oladigan statik usul birikmasini o'z ichiga olishi kerak
ikkalasi ham ob'ektlarni argument sifatida ro'yxatga oladi va ikkinchi ro'yxatni birinchi ro'yxatga birlashtiradi.
21.7 (Tartibli roʻyxatga kiritish) 0 dan 25 ta tasodifiy butun son qoʻyadigan dastur tuzing.
Bog'langan ro'yxat ob'ektiga tartibda 100. Ushbu mashq uchun List sinfini o'zgartirishingiz kerak bo'ladi
(21.3-rasm) tartiblangan ro'yxatni saqlash uchun. SortedList sinfining yangi versiyasiga nom bering.
21.8 (Tartibli roʻyxatlarni birlashtirish) 21.7-mashqdagi SortedList sinfini birlashtirishni qoʻshish uchun oʻzgartiring.
Argument sifatida qabul qilingan SortedListni SortedList bilan birlashtira oladigan usul.
usul. Sinov usullarini birlashtirish uchun ariza yozing.
21.9 (Ro‘yxatni orqaga nusxalash) List ni quyidagi tarzda qabul qiluvchi reverseCopy statik usulini yozing
argument va o'sha Ro'yxatning nusxasini qaytaradi elementlari teskari. Ushbu usulni an
ilova.
21.10 (Stek yordamida gapni teskari yo‘nalishda chop etish) Matn qatorini kirituvchi dastur tuzing.
va satr so'zlarini teskari tartibda ko'rsatish uchun stekdan foydalanadi.
21.11 (Palindrom tester) Satrning stek ekanligini aniqlash uchun dastur yozing.
palindrom (ya'ni, satr bir xil tarzda oldinga va orqaga yoziladi). Dastur e'tibordan chetda qolishi kerak
bo'shliqlar va tinish belgilari.

905-mashqlar



21.12 (Infix-to-Postfix Converter) steklardan kompilyatorlar baholash jarayonida yordam berish uchun foydalaniladi.
ifodalar va mashina tili kodini yaratish. Ushbu va keyingi mashqda biz buni qanday qilishni o'rganamiz
kompilyatorlar faqat doimiylar, operatorlar va qavslardan tashkil topgan arifmetik ifodalarni baholaydilar.
Odamlar odatda 3 + 4 va 7/9 kabi iboralarni yozadilar, unda operator (+ yoki / bu erda) bo'ladi.
uning operandlari orasiga yoziladi - bu infiks belgisi deyiladi. Kompyuterlar postfiks belgisini "afzal" qiladi
operator ikki operandning o'ng tomoniga yoziladi. Oldingi infix ifodalari
postfiks belgisida mos ravishda 3 4 + va 7 9 / sifatida paydo bo'ladi.
Murakkab infix ifodasini baholash uchun kompilyator avval ifodani post-ga o'zgartiradi.
yozuvni tuzating va postfiks versiyasini baholang. Ushbu algoritmlarning har biri faqat bitta chapdan-to-
ifodaning to'g'ri o'tishi. Har bir algoritm o'z ishini qo'llab-quvvatlash uchun stek ob'ektidan foydalanadi, lekin har biri
stekni boshqa maqsadda ishlatadi.
Ushbu mashqda siz infixdan postfixga aylantirish algoritmining Java versiyasini yozasiz. In
keyingi mashqda siz postfiks ifodasini baholash algoritmining Java versiyasini yozasiz. Keyinchalik
mashq qilsangiz, ushbu mashqda yozgan kodingiz to'liq bajarishingizga yordam berishi mumkinligini bilib olasiz
ishlaydigan kompilyator.
Oddiy infix arifmetik ifodasini aylantirish uchun InfixToPostfixConverter sinfini yozing
kabi bir xonali butun sonlar bilan (to'g'ri ifoda kiritilgan deb hisoblang).
(6 + 2) * 5 - 8/4
postfiks ifodasiga. Ushbu infiks ifodasining postfiks versiyasi (qavslar kerak emas).
6 2 + 5 * 8 4 / -
Dastur ifodani StringBuffer infix-ga o'qishi va stek sinflaridan birini ishlatishi kerak
StringBuffer postfiksida postfiks ifodasini yaratishga yordam berish uchun ushbu bobda amalga oshirilgan. The
postfiks ifodasini yaratish algoritmi quyidagicha:
a) “(” chap qavsni stekga suring.
b) Infiks oxiriga o'ng qavs ')' qo'shing.
c) Stack bo'sh bo'lmasa, infiksni chapdan o'ngga o'qing va quyidagilarni bajaring:
Agar infixdagi joriy belgi raqam bo'lsa, uni postfiksga qo'shing.
Agar infixdagi joriy belgi chap qavs bo'lsa, uni stekga suring.
Agar infixdagi joriy belgi operator bo'lsa:
Pop operatorlari (agar mavjud bo'lsa) stekning yuqori qismida, ular teng bo'lsa
yoki joriy operatordan yuqoriroq ustunlikka ega bo'ling va ochilganni qo'shing
postfiks uchun operatorlar.
Infiksdagi joriy belgini stekga suring.
Agar infixdagi joriy belgi o'ng qavs bo'lsa:
Operatorlarni stekning yuqori qismidan olib tashlang va ularni postfiksga qadar qo'shing
chap qavs stekning yuqori qismida joylashgan.
Chap qavsni stekdan olib tashlang (va tashlang).
Ifodada quyidagi arifmetik amallarga ruxsat beriladi:
+ qo'shimcha
- ayirish
* ko'paytirish
/ bo'lim
^ darajali ko‘rsatkich
% qolgan
Stack har birida misol o'zgaruvchisi va a bo'lgan stek tugunlari bilan saqlanishi kerak
keyingi stek tuguniga havola. Siz taqdim qilmoqchi bo'lgan ba'zi usullar quyidagilardir:
a) Infiks ifodasini postfiks belgisiga aylantiruvchi convertToPostfix usuli.
b) c ning operator ekanligini aniqlaydigan isOperator usuli.

906 21-bob Maxsus umumiy ma'lumotlar tuzilmalari



c) Usul ustunligi, bu operator1 (dan
infix ifodasi) operator2 dan kichik, teng yoki undan katta (stekdan).
Agar operator1 operator 2 dan pastroq ustunlikka ega bo'lsa, usul true ni qaytaradi. Boshqa -
dono, yolg'on qaytariladi.
d) Metod peek (bu stek sinfiga qo'shilishi kerak), bu ning yuqori qiymatini qaytaradi
stekni ochmasdan.
21.13 (Postfix Evaluator) kabi postfiks ifodasini baholovchi PostfixEvaluator sinfini yozing.
6 2 + 5 * 8 4 / -
Dastur raqamlar va operatorlardan iborat postfiks ifodasini StringBuf-ga o'qishi kerak.
fer. Ushbu bobda ilgari amalga oshirilgan stek usullarining o'zgartirilgan versiyalaridan foydalangan holda, pro-
gramm ifodani skanerlashi va uni baholashi kerak (u haqiqiy deb hisoblang). Algoritm quyidagicha:
a) Postfiks ifodasi oxiriga o'ng qavs ')' qo'shing. Qachon o'ng -
qavs belgisiga duch keldi, boshqa ishlov berish shart emas.
b) O'ng qavsga duch kelmaguncha, ifodani chapdan o'ngga o'qing.
Agar joriy belgi raqam bo'lsa, quyidagilarni bajaring:
Uning butun qiymatini stekga suring (raqamli belgining butun qiymati uning
Unicode belgilar to'plamidagi qiymat minus Unicode'dagi "0" qiymati).
Aks holda, joriy belgi operator bo'lsa:
Stackning ikkita yuqori elementini x va y o'zgaruvchilarga aylantiring.
y operatori x ni hisoblang.
Hisoblash natijasini stekga suring.
c) Ifodada o'ng qavs topilsa, ning yuqori qiymatini oching
stack. Bu postfiks ifodasining natijasidir.
[Izoh: b) yuqoridagi (ushbu mashqning boshidagi namunaviy ifoda asosida), agar operator
'/' bo'lsa, stekning yuqori qismi 4 va stekdagi keyingi element 40, keyin x ichiga 4, pop 40.
y ichiga 40/4 ni baholang va natijani 10 ni stekga qaytaring. Ushbu eslatma operatorga ham tegishli
'-'.] Ifodada ruxsat etilgan arifmetik amallar: + (qo'shish), - (ayirish), * (mul-
tiplication), / (bo'linish), ^ (ko'rsatkich) va % (qolgan).
Stack ushbu bobda keltirilgan stek sinflaridan biri bilan saqlanishi kerak. Siz
quyidagi usullarni taqdim etishni xohlashi mumkin:
a) Postfiks ifodasini baholovchi evaluatePostfixExpression usuli.
b) op1 operator op2 ifodasini baholovchi hisoblash usuli.
21.14 (Postfix Evaluator modifikatsiyasi) 21.13-mashqning postfiks baholovchi dasturini o'zgartiring
Shunday qilib, u 9 dan katta butun operandlarni qayta ishlay oladi.
21.15 (Supermarket simulyatsiyasi) Supermarketdagi kassa liniyasini simulyatsiya qiluvchi dastur yozing.
Chiziq navbat obyektidir. Mijozlar (ya'ni, mijoz ob'ektlari) tasodifiy butun son oralig'ida keladi
1 dan 4 minutgacha. Shuningdek, har bir mijozga 1 dan 4 minutgacha bo'lgan tasodifiy tamsayılar oralig'ida xizmat ko'rsatiladi.
utes. Shubhasiz, tariflar muvozanatli bo'lishi kerak. Agar o'rtacha kelish darajasi o'rtacha ko'rsatkichdan katta bo'lsa
xizmat ko'rsatish tezligi, navbat cheksiz o'sadi. Hatto "muvozanatlangan" stavkalarda ham tasodifiylik hali ham sabab bo'lishi mumkin
uzun chiziqlar. Supermarket simulyatsiyasini 12 soatlik kun davomida (720 daqiqa) ishga tushiring
algoritm:
a) Birinchi bo'lgan daqiqani aniqlash uchun 1 dan 4 gacha bo'lgan tasodifiy butun sonni tanlang
mijoz keladi.
b) Birinchi mijoz kelgan vaqtda quyidagilarni bajaring:
Mijozning xizmat ko'rsatish vaqtini aniqlang (1 dan 4 gacha tasodifiy butun son).
Xaridorga xizmat ko'rsatishni boshlang.
Keyingi mijozning kelish vaqtini rejalashtiring (joriy vaqtga 1 dan 4 gacha tasodifiy butun son qo'shiladi).

907-mashqlar



c) Kunning har bir simulyatsiya qilingan daqiqasi uchun quyidagilarni ko'rib chiqing:
Agar keyingi mijoz kelsa, quyidagilarni bajaring:
Shunday deng.
Mijozni navbatga qo'ying.
Keyingi mijozning kelish vaqtini belgilang.
Agar xizmat oxirgi mijoz uchun bajarilgan bo'lsa, quyidagilarni bajaring:
Shunday deng.
Keyingi mijozga xizmat ko'rsatish uchun navbatga qo'ying.
Mijozning xizmat ko'rsatish muddatini aniqlang (1 dan 4 gacha tasodifiy butun son
joriy vaqtga qo'shiladi).
Endi simulyatsiyangizni 720 daqiqa davomida bajaring va quyidagi savollarga javob bering:
a) Istalgan vaqtda navbatda turgan mijozlarning maksimal soni qancha?
b) Har qanday mijoz boshdan kechiradigan eng uzoq kutish vaqti qancha?
v) Agar kelish oralig'i 1 daqiqadan 4 minutgacha 1 minutdan 3 minutgacha o'zgartirilsa nima bo'ladi?
21.16 (Ikkilik daraxtda dublikatlarga ruxsat berish) Shakllarni o'zgartiring. Ikkilik ruxsat berish uchun 21.17 va 21.18
dublikatlarni o'z ichiga olgan daraxt.
21.17 (Stringlarning ikkilik qidiruv daraxtini qayta ishlash) Dasturi asosida dastur tuzing.
Anjir. 21.17 va 21.18 matn qatorini kiritadi, uni alohida so'zlarga ajratadi, so'zlarni kiritadi
ikkilik qidiruv daraxtida va daraxtning tartib, oldindan va keyingi tartib oʻtishlarini chop etadi.
21.18 (Dublikatni yo'q qilish) Ushbu bobda biz takroriy yo'q qilish oson ekanligini ko'rdik.
ikkilik qidiruv daraxtini yaratishda palata. Qachon takroriy yo'q qilishni qanday amalga oshirishingizni tasvirlab bering
faqat bir o'lchovli massivdan foydalanish. Massiv asosidagi dublikatlarni bartaraf etish samaradorligini solishtiring
ikkilik qidiruv daraxtiga asoslangan dublikatni yo'q qilish ishlashi bilan.
21.19 (Ikkilik daraxtning chuqurligi) Shakllarni o'zgartiring. 21.17 va 21.18, shuning uchun Tree klassi usulni taqdim etadi
getDepth daraxtda qancha daraja borligini aniqlaydi. Usulni ilovada sinab ko'ring
Daraxtga 20 ta tasodifiy butun sonni kiritadi.
21.20 (Roʻyxatni orqaga rekursiv chop etish) 21.3-rasmdagi List klassini oʻzgartiring.
Bog'langan ro'yxat ob'ektidagi elementlarni teskari tartibda rekursiv chiqaradigan printListBackward.
Butun sonlar ro‘yxatini yaratuvchi va ro‘yxatni teskari tartibda chop etuvchi test dasturini yozing.
21.21 (Ro‘yxatni rekursiv izlash) 21.3-rasmdagi List sinfini qidirish usulini kiritish uchun o‘zgartiring.
belgilangan qiymat uchun bog'langan ro'yxat ob'ektini rekursiv izlaydi. Usul havolani qaytarishi kerak
agar topilgan bo'lsa, qiymatga; aks holda, u nullni qaytarishi kerak. Sinov dasturida usulingizdan foydalaning
bu butun sonlar ro'yxatini yaratadi. Dastur foydalanuvchidan qiymatni ro'yxatda topishni so'rashi kerak.
21.22 (Ikkilik daraxtini o'chirish) Ushbu mashqda biz ikkilik qidiruv daraxtlaridan elementlarni o'chirishni muhokama qilamiz. The
o'chirish algoritmi kiritish algoritmi kabi oddiy emas. Uchta holatga duch keladi
ob'ektni o'chirishda - element barg tugunida (ya'ni, uning bolalari yo'q) yoki tugunda joylashgan.
bitta bolali yoki ikkita bolali tugundagi.
Agar o'chiriladigan element barg tugunida bo'lsa, tugun o'chiriladi va havola kiradi
asosiy tugun nolga o'rnatiladi.
Agar o'chirilishi kerak bo'lgan element bitta bolali tugunda bo'lsa, ota-onadagi havola
tugun bola tuguniga murojaat qilish uchun o'rnatiladi va ma'lumotlar elementini o'z ichiga olgan tugun o'chiriladi. Bu sabab bo'ladi
daraxtdagi o'chirilgan tugun o'rnini egallash uchun bola tugun.
Oxirgi holat eng qiyin. Ikki bolali tugun o'chirilsa, boshqa tugun kiradi
daraxt o'z o'rnini egallashi kerak. Biroq, asosiy tugundagi havolani oddiygina tayinlab bo'lmaydi
o'chiriladigan tugunning bolalaridan biriga murojaat qiling. Ko'pgina hollarda, natijada ikkilik qidiruv

908 21-bob Maxsus umumiy ma'lumotlar tuzilmalari



daraxt ikkilik qidiruv daraxtlarining quyidagi xususiyatlarini o'zida mujassam etmaydi (dublikatsiz
ues): Har qanday chap pastki daraxtdagi qiymatlar asosiy tugundagi qiymatdan kichikroq va istalgan o'ngdagi qiymatlar
pastki daraxt asosiy tugundagi qiymatdan kattaroqdir.
Qaysi tugun bu xususiyatni saqlab qolish uchun almashtirish tugunlari sifatida ishlatiladi? Bu yoki tugun
daraxtdagi eng katta qiymat o'chirilayotgan tugun yoki tugundagi qiymatdan kamroq bo'lgan
o'chirilayotgan tugundagi qiymatdan kattaroq daraxtdagi eng kichik qiymatni o'z ichiga oladi. Keling, keling -
kichikroq qiymatga ega bo'lgan tugunni yoqing. Ikkilik qidiruv daraxtida eng katta qiymat ota-onadan kichik
qiymat asosiy tugunning chap pastki daraxtida joylashgan va o'ngda bo'lishi kafolatlangan.
pastki daraxtning ko'p tugunlari. Ushbu tugun chap pastki daraxtdan o'ngga qadar pastga yurish orqali joylashgan
joriy tugunning o'ng bolasiga havola null. Endi biz almashtirishga murojaat qilamiz
tugun, bu barg tugun yoki chap tomonida bitta bolali tugun. Agar almashtirish tugun a bo'lsa
Barg tugunini o'chirish uchun quyidagi bosqichlar bajariladi:
a) O'chiriladigan tugunga havolani vaqtinchalik mos yozuvlar o'zgaruvchisida saqlang.
b) O'zgartirishga havola qilish uchun o'chirilayotgan tugunning ota-onasiga havolani o'rnating
tugun.
c) O'zgartirish tugunining asosiy qismidagi havolani nolga o'rnating.
d) O'ng pastki daraxtga havola qilish uchun almashtirish tugunidagi o'ng pastki daraxtga havolani o'rnating.
o'chiriladigan tugun daraxti.
e) Chap pastki daraxtga havola qilish uchun almashtirish tugunidagi chap pastki daraxtga havolani o'rnating
o'chirilishi kerak bo'lgan tugun.
Chap bola bilan almashtirilgan tugunni o'chirish bosqichlari almashtirishga o'xshaydi.
Bolalarsiz tugun, lekin algoritm ham bolani almashtirishga o'tkazishi kerak
tugunning daraxtdagi joylashuvi. O'zgartirish tugunlari chap bolali tugun bo'lsa, bajarilishi kerak bo'lgan qadamlar
o'chirish quyidagicha:
a) O'chiriladigan tugunga havolani vaqtinchalik mos yozuvlar o'zgaruvchisida saqlang.
b) O'chirilayotgan tugunning ota-onasidagi havolani almashtirishga murojaat qilish uchun o'rnating
tugun.
c) Chap bolaga havola qilish uchun almashtirish tugunining ota-onasiga havolani o'rnating
almashtirish tugun.
d) O'ng pastki daraxtga havola qilish uchun almashtirish tugunidagi o'ng pastki daraxtga havolani o'rnating.
o'chiriladigan tugun daraxti.
e) Chap pastki daraxtga havola qilish uchun almashtirish tugunidagi chap pastki daraxtga havolani o'rnating
o'chirilishi kerak bo'lgan tugun.
DeleteNode usulini yozing, u o'z argumenti sifatida o'chirish uchun qiymatni oladi. O'chirish usuli -
Tugun daraxtda o'chirish va algoritmlarni ishlatish uchun qiymatni o'z ichiga olgan tugunni topishi kerak.
tugunni o'chirish uchun bu yerda cussed. Agar qiymat daraxtda topilmasa, usul a ko'rsatishi kerak
shunday degan xabar. Rasmdagi dasturni o'zgartiring. Ushbu usuldan foydalanish uchun 21.17 va 21.18. O'chirishdan keyin
elementni tanlash uchun inorderTraversal, preorderTraversal va postorderTraversal usullarini chaqiring.
o'chirish operatsiyasi to'g'ri bajarilganligiga ishonch hosil qiling.
21.23 (Binary Tree Search) 21.17-rasmdagi Daraxt sinfini o'zgartiring, bu usulni o'z ichiga oladi.
ikkilik qidiruv daraxti ob'ektida belgilangan qiymatni topishga harakat qiladi. Usul ar-
topish uchun qidiruv tugmachasini bosing. Qidiruv kalitini o'z ichiga olgan tugun topilsa, usul kerak
ushbu tugun ma'lumotlariga havolani qaytarish; aks holda, u nullni qaytarishi kerak.
21.24 (Darajaviy-tartibli ikkilik daraxtning o'tishi) Shakl dasturi. 21.17 va 21.18 tasvirlangan
Ikkilik daraxtni kesib o'tishning uchta rekursiv usuli - tartib, oldindan tartib va keyingi tartib. Bu
Mashq ikkilik daraxtning daraja-tartib o'tishini taqdim etadi, unda tugun qiymatlari darajasida chop etiladi
daraja bo'yicha, ildiz tugun darajasidan boshlab. Har bir darajadagi tugunlar chapdan o'ngga chop etiladi. The
darajadagi tartib o'tish rekursiv algoritm emas. Chiqishni boshqarish uchun navbat obyektidan foydalanadi
tugunlar. Algoritm quyidagicha:
a) Ildiz tugunini navbatga kiriting.

909-mashqlar

b) Navbatda tugunlar qolsa, quyidagilarni bajaring:
Navbatdagi keyingi tugunni oling.
Tugun qiymatini chop eting.
Agar tugunning chap bolasiga havola null bo'lmasa:
Navbatga chap bola tugunini kiriting.
Agar tugunning o'ng bolasiga havola null bo'lmasa:
Navbatga o'ng bola tugunini kiriting.
Ikkilik daraxt ob'ektining daraja-tartib o'tishini amalga oshirish uchun levelOrder usulini yozing. O'zgartirish
Shakllar dasturi. Ushbu usuldan foydalanish uchun 21.17 va 21.18. [Eslatma: Siz navbatdan ham foydalanishingiz kerak bo'ladi-
Ushbu dasturda 21.13-rasmdagi ishlov berish usullari.]
21.25 (Daraxtlarni chop etish) Rekursiv chiqish daraxti usulini kiritish uchun 21.17-rasmdagi daraxt sinfini o'zgartiring.
ikkilik daraxt ob'ektini ko'rsatish uchun. Usul daraxtning yuqori qismi bilan qator qatorda chiqishi kerak
ekranning chap tomonidagi daraxt va o'ng tomonidagi daraxtning pastki qismi. Har bir qator chiqadigan verti-
chaqiriq. Masalan, 21.20-rasmda ko'rsatilgan ikkilik daraxt 21.21-rasmda ko'rsatilganidek chiqariladi.
Eng o'ngdagi barg tugunlari chiqishning yuqori qismida eng o'ng ustunda va
ildiz tugun chiqishning chap tomonida paydo bo'ladi. Har bir ustun oldingi ustunning o'ng tomonida beshta bo'sh joyni boshlaydi.
teskari ustun. outputTree usuli ni ifodalovchi totalSpaces argumentini olishi kerak
chiqarilishi kerak bo'lgan qiymatdan oldingi bo'shliqlar soni. (Ushbu o'zgaruvchi noldan boshlanishi kerak, shunda
Ildiz tugun ekranning chap tomonida chiqariladi.) Usul tashqariga chiqish uchun o'zgartirilgan tartib o'tishdan foydalanadi.
daraxtni qo'ying - u daraxtning eng o'ng tugunidan boshlanadi va yana chapga ishlaydi. Algoritm shunday
quyida bayon qilinganidek:

Joriy tugunga havola null bo'lmasa ham, quyidagilarni bajaring:


Joriy tugunning o'ng pastki daraxti bilan rekursiv ravishda outputTree ni chaqiring va
totalSpaces + 5.
1 dan totalSpaces va chiqish bo'shliqlarini hisoblash uchun for iborasidan foydalaning.
Joriy tugundagi qiymatni chiqaring.
Joriy tugunning chap pastki daraxtiga murojaat qilish uchun joriy tugunga havolani o'rnating.
TotalSpacesni 5 ga oshiring.
21.26 (Bog'langan ro'yxatning istalgan joyiga qo'shish/o'chirish) Bizning bog'langan ro'yxat sinfimiz qo'shish va o'chirishga ruxsat berdi.
bog'langan ro'yxatning faqat old va orqa tomonida joylashgan. Bu imkoniyatlar biz uchun qachon qulay edi
Biz stek sinfini va minimal kodli navbat sinfini yaratish uchun meros yoki kompozitsiyadan foydalandik
ro'yxat sinfini qayta ishlatish orqali. Bog'langan ro'yxatlar odatda biz taqdim etganlarga qaraganda umumiyroqdir. Mod-
Istalgan joyda qo'shish va o'chirishni boshqarish uchun ushbu bobda biz ishlab chiqqan bog'langan ro'yxat sinfini belgilang
ro'yxat. Shakl bilan taqqoslanadigan diagrammalarni yarating. 21,6 (insertAtFront), 21,7 (insertAtBack), 21,8

99

97



92

83

72



71

69

49



44

40

32



28

19

18



11

21.21-rasm | outputTree rekursiv usulining namunaviy chiqishi.


910 21-bob Maxsus umumiy ma'lumotlar tuzilmalari



(removeFromFront) va 21.9 (removeFromBack) o'rtasiga yangi tugunni qanday kiritishni ko'rsatadi.
bog'langan ro'yxat va mavjud tugunni bog'langan ro'yxatning o'rtasidan qanday olib tashlash.
21.27 (Roʻyxatlar va navbatlar boʻlmagan navbatlar) Bizning bogʻlangan roʻyxatni amalga oshirishimiz (21.3-rasm) ishlatilgan
ham birinchi tugun, ham oxirgi tugun. LastNode insertAtBack va removeFrom uchun foydali bo'lgan.
List sinfining orqaga qaytish usullari. insertAtBack usuli navbatdagi usuliga mos keladi
Queue klassi. List sinfini lastNode ishlatmasligi uchun qayta yozing. Shunday qilib, har qanday operatsiyalar
ro'yxatning dumi ro'yxatni old tomondan qidirishni boshlashi kerak. Bu bizning amalga oshirishimizga ta'sir qiladimi?
Queue klassi (21.13-rasm)?
21.28 (Ikkilik daraxtni saralash va qidirishning ishlashi) Ikkilik daraxtni saralash bilan bog'liq bitta muammo
ma'lumotlarning kiritilish tartibi daraxtning shakliga ta'sir qiladi - xuddi shu to'plam uchun
ma'lumotlarning turli tartiblari keskin turli xil shakldagi ikkilik daraxtlarni berishi mumkin. Ishlash
ikkilik daraxtni saralash va qidirish algoritmlari ikkilik daraxtning shakliga sezgir. Nima
Agar uning ma'lumotlari ortib borayotgan tartibda kiritilsa, ikkilik daraxt shakliga ega bo'larmidi? kamayish tartibida?
Maksimal qidiruv samaradorligiga erishish uchun daraxt qanday shaklga ega bo'lishi kerak?
21.29 (Indekslangan ro'yxatlar) Matnda ko'rsatilganidek, bog'langan ro'yxatlarni ketma-ket qidirish kerak. Katta uchun
ro'yxatlar, bu yomon ishlashga olib kelishi mumkin. Ro'yxatni qidirishni yaxshilashning umumiy usuli
mans - ro'yxat indeksini yaratish va saqlash. Indeks - bu asosiy joylarga havolalar to'plami
ro'yxat. Misol uchun, nomlarning katta ro'yxatini qidiradigan dastur ish faoliyatini yaxshilashi mumkin
26 ta yozuvdan iborat indeks yaratish orqali - alifboning har bir harfi uchun bittadan. A.ga nisbatan qidiruv operatsiyasi
"Y" bilan boshlangan familiya, keyin "Y" yozuvlari qayerda ekanligini aniqlash uchun indeksni qidiradi
boshlandi, keyin o'sha nuqtada ro'yxatga "sakrab o'ting" va kerakli nom topilmaguncha chiziqli izlang.
Bu bog'langan ro'yxatni boshidan qidirishdan ko'ra tezroq bo'ladi. List sinfidan foydalaning
IndexedList sinfining asosi sifatida 21.3-rasm. ning ishlashini ko'rsatadigan dastur yozing
indekslangan ro'yxatlar. InsertInIndexedList, searchIndexedList va o'chirish usullarini qo'shganingizga ishonch hosil qiling.
FromIndexedList.
21.30 (Roʻyxat sinfidan meros boʻlgan navbat klassi) 21.5-boʻlimda biz stek sinfini yaratdik.
sinf Ro'yxat meros bilan (21.10-rasm) va tarkibi bilan (21.12-rasm). 21.6-bo'limda biz yaratamiz -
sinfdan navbat sinfini tarkibi bilan ro'yxatga oldi (21.13-rasm). Meroslash orqali navbat sinfini yarating
sinflar ro'yxatidan. Bu sinf va biz kompozitsion bilan yaratganimiz o'rtasidagi farqlar nimada?
tion?
Maxsus bo'lim: O'z kompilyatoringizni yaratish
7.36–7.38 mashqlarida biz Simpletron mashina tilini (SML) joriy qildik va siz
SML dasturlarini bajarish uchun Simpletron kompyuter simulyatorini eslatib o'tdi. 21.31-21.35 mashqlarida biz
yuqori darajali dasturlash tilida yozilgan dasturlarni SML ga aylantiruvchi kompilyator yaratish.
Ushbu bo'lim butun dasturlash jarayonini "bog'laydi". Siz bu yangi dasturda dasturlar yozasiz
yuqori darajadagi til, ularni siz yaratgan kompilyatorda kompilyatsiya qiling va ularni simulyatorda ishga tushiring
7.37-mashqda qurilgan. Siz kompilyatoringizni ob'ekt-ori-da amalga oshirish uchun barcha sa'y-harakatlaringizni qilishingiz kerak.
kiritilgan tarzda. [Izoh: 21.31–21.35 mashqlari tavsiflari hajmi tufayli biz ularni joylashtirdik.
ularni www.deitel.com/books/jhtp10/ manzilida joylashgan PDF hujjatida.]

GUI komponentlari: 2-qism 22


... hodisalarning kuchi uyg'onadi
uyquchan iste'dodlar.
- Edvard Xogland
Siz va men ko'proq narsani ko'ramiz
qiziqarli fotografiya, agar ular
tashvishlanishni to'xtatadi va
o'rniga ot ma'nosini qo'llang
ko'rinishni yozib olish muammosi
va o'z davrini his qiladi.
- Jessi Tarbox Bials

Oh maqsadlar


Ushbu bobda siz:
■ Yarating va boshqaring
slayderlar, menyular, qalqib chiquvchi oyna
menyular va oynalar.
■ Dasturiy ravishda o'zgartiring
a GUI qarash-va-hissi, yordamida
Swingning o'rnatilgan ko'rinishi va-
his qilish.
■ Bir nechta hujjat yarating
bilan interfeys
JDesktopPane va
JInternalFrame.
■ Qo'shimcha tartibdan foydalaning
menejerlari BoxLayout va
GridBagLayout.

912 22-bob GUI komponentlari: 2-qism



22.1 Kirish
Ushbu bobda biz Swing GUI-larni o'rganishni davom ettiramiz. Biz qo'shimcha komponentlarni muhokama qilamiz
va tartib menejerlari va yanada murakkab grafik interfeyslarni yaratish uchun asos yaratadi. Biz boshlaymiz
bir qator butun son qiymatlari orasidan tanlash uchun slayderlar bilan, so'ngra qo'shimcha tafsilotlarni muhokama qiling
derazalar. Keyinchalik, dastur buyruqlarini tartibga solish uchun menyulardan foydalanasiz.
Swing GUI-ning ko'rinishi va hissi Java bo'lgan barcha platformalarda bir xil bo'lishi mumkin
dastur bajariladi yoki GUI Swing-ning ulanadigan ko'rinishi va-dan foydalanib sozlanishi mumkin.
his qilish (PLAF). Biz Swing-ni qanday o'zgartirishni ko'rsatadigan misol keltiramiz
standart metall ko'rinish va hissiyot (bu platformalarda bir xil ko'rinadi va o'zini tutadi), the
Nimbus ko'rinishi va hissiyoti (12-bobda keltirilgan), Motifni taqlid qiluvchi ko'rinish va tuyg'u (a
UNIX ko'rinishi va hissi) va Microsoft Windows ko'rinishini taqlid qiluvchi.
Hozirgi ko'pgina ilovalar ko'p hujjatli interfeysdan (MDI) foydalanadi - asosiy
oyna (ko'pincha ota-ona oynasi deb ataladi) boshqa oynalarni (ko'pincha bola deb ataladi) o'z ichiga oladi
windows) parallel ravishda bir nechta ochiq hujjatlarni boshqarish uchun. Masalan, ko'plab elektron pochta pro-
gramlar bir vaqtning o'zida bir nechta elektron pochta oynalarini ochishga imkon beradi, shuning uchun mumkin
bir nechta elektron pochta xabarlarini yozish yoki o'qish. Biz yaratish uchun Swingning darslarini namoyish qilamiz
bir nechta hujjatli interfeyslar. Nihoyat, siz qo'shimcha tartib menejerlari haqida bilib olasiz
grafik foydalanuvchi interfeyslarini tashkil qilish. Keyinchalik yana bir nechta Swing GUI komponentlaridan foydalanamiz
kerak bo'lganda bo'limlar.
Swing endi eski texnologiya hisoblanadi. GUI, grafik va multimedia uchun
yangi Java ilovalari uchun ushbu kitobning JavaFX boblarida keltirilgan funksiyalardan foydalanishingiz kerak.
Java SE 8: Hodisa tinglovchilarini lambdalar bilan amalga oshirish
Ushbu bob davomida biz amalga oshirish uchun anonim ichki sinflar va ichki sinflardan foydalanamiz
misollar Java SE 7 va Java bilan kompilyatsiya qilinishi va bajarilishi uchun voqea ishlov beruvchilari
SE 8. Ko'pgina misollarda siz funksional hodisa-tinglovchi inter-
Java SE 8 lambdalari bilan yuzlar (17.9-bo'limda ko'rsatilganidek).
22.2 JSlider
JSliderlar foydalanuvchiga butun son qiymatlari oralig'idan tanlash imkonini beradi. JSlider klassi meros qilib oladi
JComponent. 22.1-rasmda belgili gorizontal JSlider va bosh barmog'i ko'rsatilgan.
foydalanuvchiga qiymat tanlash imkonini beradi. JSlider-ni asosiy belgi belgilarini ko'rsatish uchun sozlash mumkin,
kichik belgilar va belgilar uchun teglar. Ular, shuningdek, snap-to Shomillarni qo'llab-quvvatlaydi, qaysi
Ikki belgi orasiga qo'yilganda bosh barmog'ingizni eng yaqiniga siqib qo'ying.

22.1 Kirish


22.2 JSlider
22.3 Java-da Windows-ni tushunish
22.4 Menyularni ramkalar bilan ishlatish
22.5 JPopupMenu
22.6 Pluggable Look-and-Feel

22.7 JDesktopPane va JInternalFrame


22.8 JTabbedPane
22.9 BoxLayout Layout Manager
22.10 GridBagLayout Layout Manager
22.11 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar


22.2 JSlider 913

Ko'pgina Swing GUI komponentlari sichqoncha va klaviatura o'zaro ta'sirini qo'llab-quvvatlaydi, masalan, agar a
JSlider fokusga ega (ya'ni, bu foydalanuvchi interfeysida hozirda tanlangan GUI komponenti).
yuz), chap strelka yoki o'ng strelka tugmachasini bosish JSlider bosh barmog'ining pasayishiga olib keladi
yoki mos ravishda 1 ga oshadi. Pastga o'q tugmasi va yuqoriga o'q tugmasi ham bosh barmog'iga sabab bo'ladi
mos ravishda 1 belgiga kamaytirish yoki oshirish. PgDn (sahifa pastga) tugmasi va PgUp (sahifa
yuqoriga) tugmasi bosh barmog'ining o'ndan bir qismidagi blok qadamlari bilan kamayishi yoki ortishiga olib keladi
mos ravishda qiymatlar diapazoni. "Uy" tugmasi bosh barmog'ini minimal qiymatiga o'tkazadi
JSlider va End tugmasi bosh barmog'ingizni JSliderning maksimal qiymatiga o'tkazadi.
JSliders gorizontal yoki vertikal yo'nalishga ega. Gorizontal JSlider uchun,
minimal qiymat chap tomonda, maksimal esa o'ng tomonda. Vertikal uchun
JSlider, minimal qiymat pastda, maksimal esa tepada. min-
JSlider-dagi imum va maksimal qiymat pozitsiyalarini JSlider-ni chaqirish orqali o'zgartirish mumkin
usul setInverted mantiqiy argument rost. Bosh barmog'ining nisbiy holati
JSliderning joriy qiymatini bildiradi.
Shakldagi dastur. 22.2–22.4 foydalanuvchiga pastki sinfga chizilgan doirani o'lchash imkonini beradi
JPanel OvalPanel deb nomlangan (22.2-rasm). Foydalanuvchi doira diametrini gorizontal chiziq bilan belgilaydi.
zonali JSlider. OvalPanel sinfi o'z-o'zidan aylana chizishni biladi
misol o'zgaruvchan diametri doira diametrini aniqlash uchun - diametri ishlatiladi
doira ko'rsatiladigan cheklovchi qutining kengligi va balandligi sifatida. Diametri
qiymat foydalanuvchi JSlider bilan o'zaro aloqada bo'lganda o'rnatiladi. Hodisa ishlov beruvchisi usullar to'plamini chaqiradi -
Diametri sinfdagi OvalPanel diametrni o'rnatish uchun va yangi doira chizish uchun repaintni chaqiradi.
Repaint chaqiruvi natijasida OvalPanel-ning paintComponent usuliga qo'ng'iroq qilinadi.

22.1-rasm | Gorizontal orientatsiyaga ega JSlider komponenti.

1 // 22.2-rasm: OvalPanel.java
2 // Moslashtirilgan JPanel klassi.
3 import java.awt.Graphics;
4 import java.awt.Dimension;
5 import javax.swing.JPanel;
6
7 ommaviy sinf OvalPanel JPanel-ni kengaytiradi
8 {
9 xususiy int diametri = 10; // standart diametr
10
11 // belgilangan diametrdagi ovalni chizish
12 @Bekor qilish
13 umumiy bekor bo'yoq Komponenti (Grafika g)
14 {
15 super.paintComponent(g);
16 g.fillOval(10, 10, diametri, diametri);
17 }
18

22.2-rasm | Belgilangan diametrli doiralarni chizish uchun JPanel subklassi. (2-qismning 1-qismi.)

Bosh barmoq belgisi

914 22-bob GUI komponentlari: 2-qism

19 // tasdiqlang va diametrni o'rnating, keyin qayta bo'yash
20 ommaviy bo'shliq to'plamiDiameter(int newDiameter)
21 {
22 // agar diametr noto'g'ri bo'lsa, sukut bo'yicha 10
23 diametr = (yangiDiameter >= 0 ? newDiameter : 10);
24 repaint(); // panelni qayta bo'yash
25 }
26
27 // afzal o'lchamni aniqlash uchun tartib menejeri tomonidan foydalaniladi
28 ommaviy oʻlcham getPreferredSize()
29 {
30 yangi o'lchamni qaytaradi (200, 200);
31 }
32
33
34
35
36
37
38 } // oxirgi sinf OvalPanel

1 // 22.3-rasm: SliderFrame.java


2 // JSlider-dan oval o'lchamini qo'llash.
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import javax.swing.JFrame;
6
7 import javax.swing.SwingConstants;
8
9
10
11 umumiy sinf SliderFrame JFrame-ni kengaytiradi
12 {
13
14 xususiy yakuniy OvalPanel myPanel; // doira chizish uchun panel
15
16 // argumentsiz konstruktor
17 ommaviy SliderFrame()
18 {
19 super("Slider demo");
20
21 myPanel = yangi OvalPanel(); // doira chizish uchun panel yaratish
22 myPanel.setBackground(Color.YELLOW);
23
24
25
26
27
28
29
22.3-rasm | JSlider qiymati doira diametrini aniqlash uchun ishlatiladi. (2-qismning 1-qismi.)

22.2-rasm | Belgilangan diametrli doiralarni chizish uchun JPanel subklassi. (2-qismning 2-qismi.)

// minimal hajmni aniqlash uchun tartib menejeri tomonidan foydalaniladi
umumiy o'lcham getMinimumSize()
{
getPreferredSize();
}

import javax.swing.JSlider;

import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

xususiy yakuniy JSlider diametriJSlider; // diametrni tanlash uchun slayder

// diametr qiymatini boshqarish uchun JSlider-ni o'rnating
diameterJSlider =
yangi JSlider(SwingConstants.HORIZONTAL, 0, 200, 10);
diameterJSlider.setMajorTickSpacing(10); // har 10 ta belgi yarating
diameterJSlider.setPaintTicks(to'g'ri); // slayderda belgilarni bo'yash

22.2 JSlider 915

OvalPanel sinfida (22.2-rasm) paintComponent usuli mavjud (12-17-qatorlar).
to'ldirilgan ovalni (bu misolda doira) chizadi, bu setDiameter usulini (20–25-chiziqlar) chizadi.
aylana diametrini o'zgartiradi va getPreferredSize usuli bo'lgan OvalPanelni qayta bo'yaydi

30
31


32
33
34
35
36
37
38
39
40
41
42
43 add(diameterJSlider, BorderLayout.SOUTH);
44 qo'shish(myPanel, BorderLayout.CENTER);
45 }
46 } // oxirgi sinf SliderFrame

1 // 22.4-rasm: SliderDemo.java


2 // SliderFrame sinovi.
3 import javax.swing.JFrame;
4
5 ommaviy sinf SliderDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 SliderFrame sliderFrame = yangi SliderFrame();
10 sliderFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 sliderFrame.setSize(220, 270);
12 sliderFrame.setVisible(rost);
13 }
14 } // yakuniy sinf SliderDemo

22.4-rasm | SliderFrame uchun test klassi.

22.3-rasm | JSlider qiymati doira diametrini aniqlash uchun ishlatiladi. (2-qismning 2-qismi.)

// JSlider voqea tinglovchisini ro'yxatdan o'tkazing


diameterJSlider.addChangeListener(
yangi ChangeListener() // anonim ichki sinf
{
// slayder qiymatini o'zgartirish
@Override
public void stateChanged(ChangeEvent e)
{
myPanel.setDiameter(diameterJSlider.getValue());
}
}
);

a) Dastlabki GUI bilan


standart doira

b) foydalanuvchidan keyin GUI


ni harakatga keltiradi
JSliderning bosh barmog'i
o'ng

916 22-bob GUI komponentlari: 2-qism



(28–31-qatorlar), bu OvalPanel va getMin-ning afzal qilingan kengligi va balandligini qaytaradi.
OvalPanelning minimal kengligi va balandligini qaytaruvchi imumSize usuli (34–37-qatorlar).
getPreferredSize va getMinimumSize usullari ba'zi tartib menejerlari tomonidan qo'llaniladi.
komponentning hajmini aniqlang.
Class SliderFrame (22.3-rasm) diametrini boshqaruvchi JSliderni yaratadi.
doira. Class SliderFrame konstruktori (17–45-qatorlar) myPanel OvalPanel obyektini yaratadi
(21-satr) va uning fon rangini o'rnatadi (22-qator). 25-26 qatorlar JSlider ob'ekt diametrini yaratadi
eterJSlider OvalPanelda chizilgan doira diametrini boshqarish uchun. JSlider
konstruktor to'rtta argumentni oladi. Birinchisi diameterJSliderning yo'nalishini belgilaydi,
bu HORIZONTAL (SwingConstants interfeysidagi doimiy). Ikkinchi va uchinchi
argumentlar uchun qiymatlar oralig'idagi minimal va maksimal butun qiymatlarni ko'rsatadi
bu JSlider. Oxirgi argument JSlider ning boshlang'ich qiymatini ko'rsatadi (ya'ni, qaerda
bosh barmog'i ko'rsatiladi) 10 bo'lishi kerak.
27-28 qatorlar JSlider ko'rinishini moslashtiradi. Usul setMajorTick-
Bo'shliq har bir asosiy belgi qiymatlar oralig'ida 10 ta qiymatni ifodalashini bildiradi
JSlider tomonidan qo'llab-quvvatlanadi. Haqiqiy argumentga ega setPaintTicks usuli buni ko'rsatadi
belgi belgilari ko'rsatilishi kerak (ular sukut bo'yicha ko'rsatilmaydi). Boshqa usullar uchun
JSlider ko'rinishini sozlash uchun ishlatiladigan JSlider onlayn hujjatlariga qarang
(docs.oracle.com/javase/7/docs/api/javax/swing/JSlider.html).
JSliders foydalanuvchiga javoban ChangeEvents (javax.swing.event paketi) yaratadi.
o'zaro ta'sirlar. ChangeListener interfeysini amalga oshiradigan sinf ob'ekti (paket
javax.swing.event) va stateChanged usulini e'lon qiladi ChangeEvents ga javob berishi mumkin.
31–41 qatorlar diameterJSlider hodisalarini boshqarish uchun ChangeListener-ni ro'yxatdan o'tkazing. Qachon
stateChanged usuli (35–39-qatorlar) foydalanuvchi shovqiniga javoban chaqiriladi, 38-qator qo‘ng‘iroqlari
myPanel-ning setDiameter usuli va JSliderning joriy qiymatini argument sifatida uzatadi.
ment. JSlider getValue usuli joriy bosh barmoq holatini qaytaradi.
22.3 Java-da Windows-ni tushunish
JFrame - sarlavha satri va chegarasi bo'lgan oyna. JFrame klassi Framening kichik sinfidir
(java.awt paketi), bu Window ning kichik klassi (java.awt paketi). Shunday qilib, JFrame
og'ir vaznli Swing GUI komponentlaridan biri. Java'dan oynani ko'rsatganingizda
dastur, oyna mahalliy platformaning oyna asboblari to'plami tomonidan taqdim etiladi va shuning uchun
oyna o'sha platformada ko'rsatilgan har bir boshqa oyna kabi ko'rinadi. Java qachon
ilova Macintoshda ishlaydi va oynani, oynaning sarlavha satrini va ko'rsatadi
chegaralar boshqa Macintosh ilovalaridagi kabi ko'rinadi. Qachonki Java ilovasi sobiq
Microsoft Windows tizimida ijro etiladi va oynani, oynaning sarlavha satrini va ko'rsatadi
chegaralar boshqa Microsoft Windows ilovalaridagi kabi ko'rinadi. Va qachon Java
ilova UNIX platformasida ishlaydi va oynani, oynaning sarlavha satrini ko'rsatadi
va chegaralar ushbu platformadagi boshqa UNIX ilovalari kabi ko'rinadi.
Tizimga oyna manbalarini qaytarish
Odatiy bo'lib, foydalanuvchi JFrame oynasini yopganda, u yashirin bo'ladi (ya'ni
ekran), lekin buni JFrame usuli setDefaultCloseOperation bilan boshqarishingiz mumkin. Inter-
JFrame klassi amalga oshiradigan face WindowConstants (javax.swing paketi), e'lon qiladi
uchta konstanta - DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE va HIDE_ON_CLOSE (de-
xato) - bu usul bilan foydalanish uchun. Ba'zi platformalar faqat cheklangan miqdordagi oynalarga ruxsat beradi

22.4 Menyularni ramkalar bilan ishlatish 917

ekranda aks ettirish uchun. Shunday qilib, oyna berilishi kerak bo'lgan qimmatli manbadir
kerak bo'lmaganda tizimga qayting. Sinf oynasi (bilvosita yuqori sinf
JFrame) bu maqsad uchun dispose usulini e'lon qiladi. Oyna endi kerak bo'lmaganda
ilova bo'lsa, siz uni aniq yo'q qilishingiz kerak. Buni Windows-ga qo'ng'iroq qilish orqali amalga oshirish mumkin
dispose usuli yoki argument bilan setDefaultCloseOperation usulini chaqirish orqali
WindowConstants.DISPOSE_ON_CLOSE. Ilovani tugatish ham oynani qaytaradi
tizimga resurslar. DO_NOTHING_ON_CLOSE dan foydalanish dastur o'z faoliyatini to'xtatib qo'yishini bildiradi.
foydalanuvchi oynani yopishga harakat qilganda nima qilish kerakligini to'xtating. Masalan, dastur
oynani yopishdan oldin fayldagi oʻzgarishlarni saqlash yoki saqlashni soʻrashi mumkin.

Windowsni ko'rsatish va joylashtirish


Odatiy bo'lib, dastur yutuqni chaqirmaguncha ekranda oyna ko'rsatilmaydi.
dow ning setVisible usuli (java.awt.Component sinfidan meros bo'lib qolgan) haqiqiy argu-
ment. Oynaning o'lchami setSize (sinfdan meros bo'lib qolgan) usuliga qo'ng'iroq bilan o'rnatilishi kerak
java.awt.Komponent). Ekranda paydo bo'lgan oynaning joylashuvi ma'lum.
setLocation usuli (java.awt.Component sinfidan meros bo'lib qolgan) bilan ta'minlangan.

Oyna voqealari


Foydalanuvchi oynani manipulyatsiya qilganda, bu harakat oyna hodisalarini yaratadi. Voqea ro'yxati -
tenerlar oyna hodisalari uchun addWindowListener Window usuli bilan ro'yxatga olinadi. The
WindowListener interfeysi oyna hodisalarini boshqarishning ettita usulini taqdim etadi - oyna
Faollashtirilgan (foydalanuvchi oynani faol oynaga aylantirganda chaqiriladi), windowClosed
(oyna yopilgandan keyin chaqiriladi), windowClosing (foydalanuvchi yopishni boshlaganda chaqiriladi).
oynaning), windowDeactivated (foydalanuvchi boshqa oynani harakatga keltirganda chaqiriladi)
tive oyna), windowDeiconified (foydalanuvchi kichraytirilgan oynani tiklaganda chaqiriladi),
windowIconified (foydalanuvchi oynani kichraytirganda chaqiriladi) va windowOpened (chaqiriladi
dastur birinchi marta ekranda oynani ko'rsatganda).

22.4 Menyularni ramkalar bilan ishlatish


Menyular grafik interfeyslarning ajralmas qismidir. Ular foydalanuvchiga harakatlarni bekor qilmasdan bajarishga imkon beradi.
GUI-ni qo'shimcha komponentlar bilan to'ldirish kerak. Swing GUI-larida menyular quyidagilar bo'lishi mumkin:
faqat setJMenuBar usulini ta'minlovchi sinflar ob'ektlariga taqaladi. Ikkita shunday sinf
JFrame va JApplet. Menyularni e'lon qilish uchun ishlatiladigan sinflar JMenuBar, JMenu, JMenu-
Element, JCheckBoxMenuItem va sinf JRadioButtonMenuItem.

Menyu bilan bog'liq bir nechta komponentlarning umumiy ko'rinishi


JMenuBar klassi (JComponentning kichik klassi) a boshqarish uchun zarur bo'lgan usullarni o'z ichiga oladi
menyu paneli, bu menyular uchun konteyner. JMenu sinfi (javax.swing.JMenu-ning pastki sinfi-
Element) menyularni boshqarish uchun zarur bo'lgan usullarni o'z ichiga oladi. Menyular menyu elementlarini o'z ichiga oladi
va menyu qatorlariga yoki boshqa menyularga pastki menyu sifatida qo'shiladi. Menyu bosilganda, u
menyu elementlari roʻyxatini koʻrsatish uchun kengaytiriladi.

Ko'rish va his qilish kuzatuvi 22.1


Menyular grafik interfeyslarni soddalashtiradi, chunki komponentlar ular ichida yashirin bo'lishi mumkin. Ushbu komponentlar
faqat foydalanuvchi ularni menyuni tanlash orqali qidirganda ko'rinadi.

918 22-bob GUI komponentlari: 2-qism

JMenuItem klassi (javax.swing.AbstractButton pastki klassi) usullarni o'z ichiga oladi.
menyu elementlarini boshqarish uchun zarur. Menyu elementi menyu ichidagi GUI komponenti bo'lib, u:
tanlanganda harakat hodisasini keltirib chiqaradi. Menyu elementi biror harakatni yoki uni boshlash uchun ishlatilishi mumkin
foydalanuvchi tanlashi mumkin bo'lgan ko'proq menyu bandlarini taqdim etadigan pastki menyu bo'lishi mumkin. Sub-
menyular menyudagi tegishli menyu elementlarini guruhlash uchun foydalidir.
JCheckBoxMenuItem klassi (javax.swing.JMenuItem pastki klassi) quyidagilarni o'z ichiga oladi
yoqish yoki o'chirish mumkin bo'lgan menyu elementlarini boshqarish uchun zarur bo'lgan usullar. JCheck qachon -
BoxMenuItem tanlangan, menyu bandining chap tomonida belgi paydo bo'ladi. JCheck qachon -
BoxMenuItem yana tanlanadi, chek olib tashlanadi.
JRadioButtonMenuItem klassi (javax.swing.JMenuItem kichik klassi) quyidagilarni o'z ichiga oladi
JCheckBox- kabi yoqish yoki o'chirish mumkin bo'lgan menyu elementlarini boshqarish uchun zarur bo'lgan usullar
Menyu elementlari. Bir nechta JRadioButtonMenuItems tugma qismi sifatida saqlanganida-
Guruh, ma'lum bir vaqtda guruhdagi faqat bitta elementni tanlash mumkin. Qachon a
JRadioButtonMenuItem tanlangan, menyu bandining chap tomonida to'ldirilgan doira paydo bo'ladi.
Boshqa JRadioButtonMenuItem tanlanganda, oldingi to'ldirilgan doira
tanlangan menyu elementi olib tashlanadi.
Ilovada menyulardan foydalanish
22.5–22.6-rasmlarda turli xil menyu bandlari va maxsus belgilarni belgilash ko'rsatilgan
mnemonika deb ataladi, bu kalitdan menyu yoki menyu elementiga tezkor kirishni ta'minlaydi.
taxta. Mnemonika javax.swing.AbstractButton ning barcha quyi sinflari bilan ishlatilishi mumkin. Sinf
MenuFrame (22.5-rasm) grafik interfeysni yaratadi va menyu bandi hodisalarini boshqaradi. Ko'pchilik
ushbu ilovadagi kod sinf konstruktorida ko'rinadi (34–151-qatorlar).

1 // 22.5-rasm: MenuFrame.java


2 // Menyularni ko'rsatish.
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.BorderLayout;
6 import java.awt.event.ActionListener;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ItemListener;
9 import java.awt.event.ItemEvent;
10 import javax.swing.JFrame;
11
12
13 import javax.swing.JOptionPane;
14 import javax.swing.JLabel;
15 import javax.swing.SwingConstants;
16 import javax.swing.ButtonGroup;
17
18
19
20
21 umumiy sinf MenuFrame JFrame-ni kengaytiradi
22 {
23 shaxsiy yakuniy Rang[] rangValues =
24 {Rang.QORA, Rang.Moviy, Rang.QIZIL, Rang.YaSIL};

22.5-rasm | JMenyular va mnemonika. (5-qismning 1-qismi.)

import javax.swing.JRadioButtonMenuItem;
import javax.swing.JCheckBoxMenuItem;

import javax.swing.JMenu;


import javax.swing.JMenuItem;
import javax.swing.JMenuBar;

22.4 Menyularni ramkalar bilan ishlatish 919

25
26
27
28 xususiy yakuniy JLabel displayJLabel; // namuna matnini ko'rsatadi
29 xususiy yakuniy ButtonGroup fontButtonGroup; // shrift menyusi elementlarini boshqaradi
30 xususiy yakuniy ButtonGroup colorButtonGroup; // rangli menyu elementlarini boshqaradi
31 xususiy int uslubi; // shrift uchun uslub yaratish uchun ishlatiladi
32
33 // argumentsiz konstruktor GUI-ni o'rnatdi
34 umumiy MenuFrame()
35 {
36 super("JMenusdan foydalanish");
37
38
39
40
41 // Haqida... menyu bandini yarating
42
43
44
45 haqidaItem.addActionListener(
46 ta yangi ActionListener() // anonim ichki sinf
47 {
48 // foydalanuvchi Haqida... ni tanlaganda xabar dialogini ko'rsatish.
49 @Bekor qilish
50 ta ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
51 {
52 JOptionPane.showMessageDialog(MenuFrame.this,
53 "Bu menyulardan foydalanishga misol\n",
54 "Haqida", JOptionPane.PLAIN_MESSAGE);
55 }
56 }
57);
58
59
60
61
62 exitItem.addActionListener(
63 yangi ActionListener() // anonim ichki sinf
64 {
65 // foydalanuvchi exitItem-ni bosganida dasturni tugatish
66 @Bekor qilish
67 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
68 {
69 System.exit(0); // dasturdan chiqish
70 }
71 }
72);
73
74
75
76
77

22.5-rasm | JMenyular va mnemonika. (5-qismning 2-qismi.)

xususiy yakuniy JRadioButtonMenuItem[] colorItems; // rangli menyu elementlari
xususiy yakuniy JRadioButtonMenuItem[] shriftlari; // shrift menyusi elementlari
xususiy yakuniy JCheckBoxMenuItem[] styleItems; // shrift uslubi menyusi elementlari

JMenu fileMenu = new JMenu("Fayl"); // fayl menyusini yaratish


fileMenu.setMnemonic('F'); // mnemonikani F ga o'rnating

JMenuItem aboutItem = new JMenuItem("Haqida...");


aboutItem.setMnemonic('A'); // mnemonikani A ga o'rnating
fileMenu.add(aboutItem); // fayl menyusiga ob'ektni qo'shish

JMenuItem exitItem = yangi JMenuItem("Chiqish"); // chiqish elementini yaratish


exitItem.setMnemonic('x'); // mnemonikani x ga o'rnating
fileMenu.add(exitItem); // fayl menyusiga chiqish elementini qo'shish

JMenuBar satri = yangi JMenuBar(); // menyu satrini yaratish


setJMenuBar(bar); // ilovaga menyu satrini qo'shish
bar.add(fileMenu); // menyu satriga fayl menyusini qo'shish

920 22-bob GUI komponentlari: 2-qism

78
79
80
81 // qator ranglarini ko'rsatish
82 String[] color = { "Qora", "Moviy", "Qizil", "Yashil" };
83
84
85
86
87 // ranglar uchun radio tugma menyu bandlarini yaratish
88
89
90 ItemHandler itemHandler = new ItemHandler(); // ranglar uchun ishlov beruvchi
91
92 // rangli radio tugma menyu bandlarini yaratish
93 uchun (int count = 0; count < color.length; count++)
94 {
95
96
97
98
99 colorItems[count].addActionListener(itemHandler);
100 }
101
102
103
104
105
106
107 // shrift nomlari qatori ro'yxati
108 String[] fontNames = { "Serif", "Monospaced", "SansSerif" };
109
110
111
112 // shrift nomlari uchun radio tugma menyu bandlarini yaratish
113
114
115
116 // Shrift radio tugmasi menyu bandlarini yaratish
117 uchun (int count = 0; count < fonts.length; count++)
118 {
119
120
121
122 shrift[hisoblash].addActionListener(itemHandler); // ishlov beruvchi qo'shing
123 }
124
125
126
127
128 String[] styleNames = { "Qalin", "Kursiv" }; // uslublar nomlari
129
130 StyleHandler styleHandler = yangi StyleHandler(); // uslub boshqaruvchisi
22.5-rasm | JMenyular va mnemonika. (5-qismning 3-qismi.)

JMenu formatMenu = new JMenu("Format"); // format menyusini yaratish


formatMenu.setMnemonic('r'); // mnemonikani r ga o'rnating

JMenu colorMenu = yangi JMenu("Rang"); // rang menyusini yaratish


colorMenu.setMnemonic('C'); // mnemonikani C ga o'rnating

colorItems = yangi JRadioButtonMenuItem[colors.length];


colorButtonGroup = new ButtonGroup(); // ranglarni boshqaradi

colorItems[hisoblash] =


yangi JRadioButtonMenuItem(ranglar[hisoblash]); // element yaratish
colorMenu.add(colorItems[hisoblash]); // rang menyusiga element qo'shish
colorButtonGroup.add(colorItems[hisoblash]); // guruhga qo'shish

colorItems[0].setSelected(rost); // birinchi Rang elementini tanlang

formatMenu.add(colorMenu); // format menyusiga rang menyusini qo'shish
formatMenu.addSeparator(); // menyuga ajratuvchi qo'shing

JMenu fontMenu = new JMenu("Shrift"); // shrift menyusini yaratish


fontMenu.setMnemonic('n'); // mnemonikani n ga o'rnating

shriftlar = yangi JRadioButtonMenuItem[fontNames.length];


fontButtonGroup = new ButtonGroup(); // shrift nomlarini boshqaradi

shriftlar[hisoblash] = yangi JRadioButtonMenuItem(fontNames[hisoblash]);


fontMenu.add(shriftlar[hisoblash]); // shrift menyusiga shrift qo'shish
fontButtonGroup.add(shriftlar[hisoblash]); // tugmalar guruhiga qo'shish

fonts[0].setSelected(to'g'ri); // birinchi Shrift menyusini tanlang


fontMenu.addSeparator(); // shrift menyusiga ajratuvchi satr qo'shish

styleItems = yangi JCheckBoxMenuItem[styleNames.length];


22.4 Menyularni ramkalar bilan ishlatish 921

131
132 // uslub yaratish katagiga menyu elementlari
133 uchun (int count = 0; count < styleNames.length; count++)
134 {
135
136
137
138 styleItems[count].addItemListener(styleHandler); // ishlov beruvchi
139 }
140
141
142
143
144 // matnni ko'rsatish uchun yorliqni o'rnating
145 displayJLabel = yangi JLabel("Namunaviy matn", SwingConstants.CENTER);
146 displayJLabel.setForeground(colorValues[0]);
147 displayJLabel.setFont(new Font("Serif", Font.PLAIN, 72));
148
149 getContentPane().setBackground(Color.CYAN); // fonni o'rnatish
150 qo'shish(displayJLabel, BorderLayout.CENTER); // displayJLabel qo'shing
151 } // end MenuFrame konstruktori
152
153 // menyu elementlaridan harakat hodisalarini boshqarish uchun ichki sinf
154 xususiy sinf ItemHandler ActionListener-ni amalga oshiradi
155 {
156 // rang va shrift tanlashni qayta ishlash
157 @Bekor qilish
158 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
159 {
160 // rang tanlash jarayoni
161 uchun (int count = 0; count < colorItems.length; count++)
162 {
163 agar (colorItems[count].isSelected())
164 {
165 displayJLabel.setForeground(colorValues[hisoblash]);
166 tanaffus;
167 }
168 }
169
170 // shrift tanlash jarayoni
171 uchun (int count = 0; count < fonts.length; count++)
172 {
173 agar (event.getSource() == shriftlar[hisoblash])
174 {
175 displayJLabel.setFont(
176 yangi Shrift(shriftlar[count].getText(), uslub, 72));
177 }
178 }
179
180 repaint(); // ilovani qayta chizish
181 }
182 } // oxirgi sinf ItemHandler
183

22.5-rasm | JMenyular va mnemonika. (5-qismning 4-qismi.)

styleItems[hisoblash] =
yangi JCheckBoxMenuItem(styleNames[hisoblash]); // uslub uchun
fontMenu.add(styleItems[hisoblash]); // shrift menyusiga qo'shish

formatMenu.add(fontMenu); // Format menyusiga Shrift menyusini qo'shish


bar.add(formatMenyu); // menyu satriga Format menyusini qo'shish

922 22-bob GUI komponentlari: 2-qism

184 // belgilash qutisi menyusidagi element hodisalarini boshqarish uchun ichki sinf
185 xususiy klassi StyleHandler ItemListener-ni amalga oshiradi
186 {
187 // shrift uslubini tanlashni qayta ishlash
188 @Bekor qilish
189 ommaviy bekor qilingan elementStateChanged(ItemEvent e)
190 {
191 String nomi = displayJLabel.getFont().getName(); // joriy Shrift
192 Shrift shrifti; // foydalanuvchi tanloviga asoslangan yangi shrift
193
194 // qaysi elementlar tekshirilishini aniqlang va Shrift yarating
195 agar (styleItems[0].isSelected() &&
196 styleItems[1].isSelected())
197 shrift = yangi Shrift (nom, Font.BOLD + Shrift.ITALIC, 72);
198 boshqa agar (styleItems[0].isSelected())
199 shrift = yangi Shrift (ism, Font.BOLD, 72);
200 ta boshqa agar (styleItems[1].isSelected())
201 shrift = yangi Shrift(nom, Shrift.ITALIC, 72);
yana 202
203 shrift = yangi Shrift(nom, Shrift.PLAIN, 72);
204
205 displayJLabel.setFont(shrift);
206 repaint(); // ilovani qayta chizish
207 }
208 }
209 } // oxirgi sinf MenuFrame

1 // 22.6-rasm: MenuTest.java


2 // MenuFrame-ni sinab ko'rish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf MenuTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 MenuFrame menuFrame = new MenuFrame();
10 menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 menuFrame.setSize(500, 200);
12 menuFrame.setVisible(rost);
13 }
14 } // oxirgi sinf MenuTest

22.6-rasm | MenuFrame uchun test klassi. (2-qismning 1-qismi.)

22.5-rasm | JMenyular va mnemonika. (5-qismning 5-qismi.)

Mnemonik menyu paneli


belgilar

Menyu

22.4 Menyularni ramkalar bilan ishlatish 923

Fayl menyusini sozlash


38-76 qatorlar Fayl menyusini o'rnatadi va uni menyu satriga biriktiradi. Fayl menyusi mavjud
Haqida… menyu bandi tanlanganda xabar dialogini ko'rsatadigan menyu bandi va a
Ilovani tugatish uchun tanlanishi mumkin bo'lgan menyudan chiqish. 38-qator JMenu ni yaratadi va
konstruktorga menyu nomi sifatida “Fayl” qatorini uzatadi. 39-qator JMenu-dan foydalanadi
F ning mne- ekanligini ko'rsatish uchun setMnemonic usuli (AstractButton sinfidan meros bo'lib o'tgan)
Ushbu menyu uchun monik. Alt tugmachasini va F harfini bosish, xuddi bosish kabi menyuni ochadi
sichqoncha bilan menyu nomi bo'ladi. GUI-da, menyudagi mnemonik belgi
ism pastki chiziq bilan ko'rsatiladi. (22.6-rasmdagi ekran tasvirlariga qarang.)

42–43 qatorlar “About...” matni bilan JMenuItem aboutItem ni yarating va uning mne-ni oʻrnating.


A harfiga monik. Ushbu menyu elementi JMenu usuli bilan 44-qatorda fileMenu-ga qo'shiladi.
qo'shish. Klaviatura orqali Haqida... menyu bandiga kirish uchun Alt tugmachasini va harfini bosing
Fayl menyusini ochish uchun F tugmachasini bosing, so'ngra Haqida... menyu bandini tanlash uchun A tugmasini bosing. 46–56 qatorlar yaratiladi
Itemning harakat hodisasini qayta ishlash uchun ActionListener. 52-54 qatorlar xabarni ko'rsatadi
dialog oynasi. showMessageDialog-dan oldingi ko'p foydalanishda birinchi argument null edi. The
birinchi argumentning maqsadi qaerdaligini aniqlashga yordam beradigan ota-oynani ko'rsatishdir
dialog oynasi paydo bo'ladi. Agar ota-oyna null sifatida belgilangan bo'lsa, dialog oynasi
ekranning markazida paydo bo'ladi. Aks holda, u belgilangan ota-onaning markazida ko'rinadi
oyna. Ushbu misolda dastur menyusi bilan ota-oynani belgilaydi.
Frame.this — MenuFrame obyektining ushbu havolasi. Ushbu havoladan foydalanganda
ichki sinfda buni o'zi belgilash ichki sinf ob'ektiga ishora qiladi. Murojaat qilish uchun
tashqi sinf ob'ektining ushbu havolasi, uni tashqi sinf nomi va nuqta (.) bilan belgilang.
Eslatib o'tamiz, dialog oynalari odatda modaldir. Modal dialog oynasi hech kimga ruxsat bermaydi
dialog oynasi o'chirilgunga qadar kirish uchun ilovadagi boshqa oyna. dia-
JOptionPane klassi bilan ko'rsatilgan jurnallar modal dialoglardir. JDialog sinfidan foydalanish mumkin
o'zingizning modal yoki nomodal dialoglaringizni yarating.

Ko'rish va his qilish kuzatuvi 22.2


Mnemonika menyu buyruqlari va tugma buyruqlariga tezkor kirish imkonini beradi
klaviatura.

Ko'rish va his qilish kuzatuvi 22.3


Har bir tugma yoki menyu bandi uchun turli mnemonikalardan foydalanish kerak. Odatda, birinchi harf
yorliqdagi menyu bandi yoki tugmasi mnemonika sifatida ishlatiladi. Agar bir nechta tugma yoki menyu bo'lsa
elementlar bir xil harf bilan boshlanadi, nomdagi keyingi eng ko'zga ko'ringan harfni tanlang (masalan, x is
odatda Chiqish tugmasi yoki menyu elementi uchun tanlanadi). Mnemonika katta-kichik harflarni sezmaydi.

22.6-rasm | MenuFrame uchun test klassi. (2-qismning 2-qismi.)

Kengaytirilgan
pastki menyu

Ajratuvchi


chiziq

Menyu elementlari


924 22-bob GUI komponentlari: 2-qism

59-72 qatorlar exitItem menyu bandini yaratadi, uning mnemonikasini x ga o'rnating, uni fileMenu ga qo'shing
va foydalanuvchi chiqishni tanlaganda dasturni tugatadigan ActionListener-ni ro'yxatdan o'tkazing.
Element. 74-76 qatorlar JMenuBar ni yaratadi, uni JFrame usuli bilan oynaga biriktiring -
JMenuBar va fileMenu-ni JMenuBar-ga biriktirish uchun JMenuBar usulidan foydalaning.

Format menyusini sozlash


78–79 qatorlar formatMenyuni yaratadi va uning mnemonikasini r ga o'rnatadi. F ishlatilmaydi, chunki bu
Fayl menyusining mnemonikasi. 84-85 qatorlar rang menyusini yaratadi (bu Formatdagi pastki menyu bo'ladi)
va uning mnemonikasini C ga o‘rnating. 88-qator JRadioButtonMenuItem colorItems massivini yaratadi, ular
colorMenu menyusidagi bandlarga ishora qiladi. 89-qator ButtonGroup colorButtonGroup-ni yaratadi,
bu bir vaqtning o'zida Rang pastki menyu bandlaridan faqat bittasi tanlanishini ta'minlaydi. 90-qator hosil qiladi
Tanlovga javob beradigan ItemHandler ichki sinfining namunasi (154-181-qatorlarda e'lon qilingan)
Rang va Shrift pastki menyusidan (qisqacha muhokama qilinadi). 93-100 qatorlardagi pastadir hosil qiladi
colorItems massividagi har bir JRadioButtonMenuItem, har bir menyu elementini colorMenu-ga qo'shadi va
colorButtonGroup-ga va har bir menyu elementi uchun ActionListener-ni ro'yxatdan o'tkazadi.
102-qator birinchi elementni tanlash uchun AbstractButton usuli setSelected-ni chaqiradi
massiv rang elementlari. 104-qator rangMenyuni formatMenyuning pastki menyusi sifatida qo'shadi. 105-qator
Menyuga gorizontal ajratuvchi chiziq qo'shish uchun JMenu usuli addSeparatorni chaqiradi.

108–126 qatorlar Shrift pastki menyusini va bir nechta JRadioButtonMenuItemsni yaratadi va tanlang


JRadioButtonMenuItem massiv shriftlarining birinchi elementi. 129-qator JCheckBoxMenu-ni yaratadi.
Shriftlar uchun qalin va kursiv uslublarni belgilash uchun menyu bandlarini ifodalovchi element qatori. Chiziq
130 javob berish uchun StyleHandler ichki sinfining namunasini yaratadi (185–208-qatorlarda e'lon qilingan)
JCheckBoxMenuItem voqealariga. 133–139-qatorlardagi for bayonoti har bir JCheck-ni yaratadi.
BoxMenuItem, uni fontMenu-ga qo'shadi va ItemListener-ni ro'yxatdan o'tkazadi. 141-qator shriftMenyusini qo'shadi
formatMenyuning pastki menyusi sifatida. 142-qator satrga formatMenyu qo'shadi (menyu satri).
GUIning qolgan qismini yaratish va hodisalarni qayta ishlash vositalarini aniqlash
145–147 qatorlar JLabel ni yaratadi, buning uchun Format menyusi elementlari shrift, shriftni boshqaradi.
rang va shrift uslubi. Dastlabki fon rangi massiv rangining birinchi elementiga o'rnatiladi-
JComponent setForeground usulini chaqirish orqali qiymatlar (Color.BLACK). Boshlang'ich shrift
PLAIN uslubi va 72 nuqtali oʻlchamli Serifga oʻrnatiladi. 149-qator fon rangini belgilaydi

Ko'rish va his qilish kuzatuvi 22.4


Menyular JMenuBar-ga qo'shilgan tartibda chapdan o'ngga ko'rinadi.

Ko'rish va his qilish kuzatuvi 22.5


Menyuni boshqa menyuga menyu elementi sifatida qo'shish orqali pastki menyu yaratiladi.

Ko'rish va his qilish kuzatuvi 22.6


Menyu elementlarini mantiqiy guruhlash uchun menyuga ajratuvchilar qo'shilishi mumkin.

Ko'rish va his qilish kuzatuvi 22.7


Har qanday JComponent JMenu yoki JMenuBar ga qo'shilishi mumkin.

22.5 JPopupMenu 925

oynaning kontent paneli ko'k rangga ega va 150-satr JLabelni CENTERga biriktiradi.
kontent panelining BorderLayout.
ItemHandler usuli actionPerformed (157–181-qatorlar) ifodalar uchun ikkitadan foydalanadi.
qaysi shrift yoki rang menyusi elementi hodisani yaratganligini aniqlang va shrift yoki rangni o'rnatadi
mos ravishda JLabel displayLabel. 163-satrdagi if sharti Abstract-dan foydalanadi.
Tanlangan JRadioButtonMenuItemni aniqlash uchun tugma usuli tanlangan. Agar
173-qatordagi shart havola olish uchun hodisa obyektining getSource usulini chaqiradi
hodisani yaratgan JRadioButtonMenuItem. 176-qator AbstractButton-ni chaqiradi
Menyu bandidan shrift nomini olish uchun getText usuli.
StyleHandler usuli itemStateChanged (188–207 qatorlar) agar foydalanuvchi tanlagan bo'lsa chaqiriladi.
fontMenudagi JCheckBoxMenuItem. 195–203 qatorlar qaysi JCheckBoxMenu-ni aniqlaydi
Elementlar tanlanadi va yangi shrift uslubini aniqlash uchun ularning birlashtirilgan holatidan foydalanadi.
22.5 JPopupMenu
Ilovalar ko'pincha bir nechta sabablarga ko'ra kontekstga sezgir qalqib chiquvchi menyularni taqdim etadi - ular mumkin
qulay bo'lishi mumkin, menyu satri bo'lmasligi mumkin va ular ko'rsatadigan variantlar aniq bo'lishi mumkin
ekrandagi alohida komponentlarga. Swing-da bunday menyular JPopup- klassi bilan yaratilgan.
Menyu (JComponentning kichik klassi). Ushbu menyular o'ziga xos variantlarni taqdim etadi
Qalqib chiquvchi tetik hodisasi sodir bo'lgan komponent - ko'pchilik tizimlarda, foydalanuvchi qachon
sichqonchaning o'ng tugmachasini bosadi va qo'yib yuboradi.

Rasmdagi dastur. 22.7–22.8 foydalanuvchiga tanlash imkonini beruvchi JPopupMenu-ni yaratadi


uchta rangdan birini tanlang va oynaning fon rangini o'zgartiring. Foydalanuvchi chertganda
PopupFrame oynasi fonida sichqonchaning o'ng tugmasi, JPopupMenu kon-
rangdor ranglar paydo bo'ladi. Agar foydalanuvchi rang uchun JRadioButtonMenuItem ni bossa, ItemHandler
Amal qilingan usul oynaning kontent panelining fon rangini o'zgartiradi.
PopupFrame konstruktorining 25-qatori (22.7-rasm, 21-70-qatorlar) misolini yaratadi.
Class ItemHandler (73-89-qatorlarda e'lon qilingan), bu element voqealarini qayta ishlaydi.
qalqib chiquvchi menyudagi menyu elementlari. 29-qator JPopupMenu-ni yaratadi. For bayonoti
(33-39-qatorlar) JRadioButtonMenuItem ob'ektini yaratadi (35-qator), uni popupMenu (satr) ga qo'shadi
36), tanlangan JRadioBut-ni saqlash uchun uni ButtonGroup colorGroup (37-qator) ga qo'shadi.
tonMenuItem bir vaqtning o'zida va uning ActionListener-ni ro'yxatdan o'tkazadi (38-qator). 41-qator boshlang'ichni o'rnatadi
setBackground usulini chaqirish orqali fonni oq rangga aylantiring.

Ko'rish va his qilish kuzatuvi 22.8


Qalqib chiquvchi tetik hodisasi platformaga xosdir. Sichqoncha bilan ishlaydigan ko'pgina platformalarda
Agar foydalanuvchi sichqonchaning o'ng tugmachasini bosganida, qalqib chiquvchi tetik hodisasi paydo bo'ladi, lekin-
ton ochiladigan menyuni qo'llab-quvvatlaydigan komponentda.

1 // 22.7-rasm: PopupFrame.java


2 // JPopupMenusni namoyish qilish.
3 import java.awt.Color;
4 import java.awt.event.MouseAdapter;
5 import java.awt.event.MouseEvent;
6 import java.awt.event.ActionListener;

22.7-rasm | Ranglarni tanlash uchun JPopupMenu. (3-qismning 1-qismi.)


926 22-bob GUI komponentlari: 2-qism

7 import java.awt.event.ActionEvent;
8 import javax.swing.JFrame;
9 import javax.swing.JRadioButtonMenuItem;
10 import javax.swing.JPopupMenu;
11 import javax.swing.ButtonGroup;
12
13 ommaviy sinf PopupFrame JFrame-ni kengaytiradi
14 {
15 ta shaxsiy yakuniy JRadioButtonMenuItem[] elementi; // ranglar uchun elementlarni saqlaydi
16 shaxsiy yakuniy Rang[] rangValues =
17 { Rang.KOV, Rang.SARI, Rang.QIZIL }; // foydalaniladigan ranglar
18
19
20 // argumentsiz konstruktor GUI-ni o'rnatadi
21 ommaviy PopupFrame()
22 {
23 super("JPopupMenusdan foydalanish");
24
25 ItemHandler ishlov beruvchisi = new ItemHandler(); // menyu elementlari uchun ishlov beruvchi
26 string[] ranglar = { "Moviy", "Sariq", "Qizil" };
27
28 ButtonGroup colorGroup = new ButtonGroup(); // rangli elementlarni boshqaradi
29
30 ta element = yangi JRadioButtonMenuItem[colors.length];
31
32 // menyu elementini yaratish, qalqib chiquvchi menyuga qo'shish, hodisalarni boshqarishni yoqish
33 uchun (int count = 0; count < items.length; count++)
34 {
35 ta element[hisob] = yangi JRadioButtonMenuItem(ranglar[hisoblash]);
36
37 colorGroup.add(elementlar[hisoblash]); // tugmalar guruhiga element qo'shish
38 ta element[hisoblash].addActionListener(ishlovchi); // ishlov beruvchi qo'shing
39 }
40
41 to'plamFafon(Rang.OQ);
42
43 // qalqib chiquvchi menyuni ko'rsatish uchun oyna uchun MouseListener e'lon qiling
44 qo'shimcha sichqoncha tinglovchisi (
45 ta yangi MouseAdapter() // anonim ichki sinf
46 {
47 // sichqonchani bosish hodisasi
48 @Bekor qilish
49 ommaviy void mousePressed(MouseEvent hodisasi)
50 {
51 checkForTriggerEvent(voqea);
52 }
53
54 // sichqonchani chiqarish hodisasini boshqarish
55 @Bekor qilish
56 ommaviy void mouseReleased(MouseEvent hodisasi)
57 {
58 checkForTriggerEvent(voqea);
59 }

22.7-rasm | Ranglarni tanlash uchun JPopupMenu. (3 qismning 2-qismi.)

xususiy yakuniy JPopupMenu popupMenu; // foydalanuvchiga rang tanlash imkonini beradi

popupMenu = yangi JPopupMenu(); // qalqib chiquvchi menyu yaratish

popupMenu.add(elementlar[hisoblash]); // qalqib chiquvchi menyuga element qo'shish

22.5 JPopupMenu 927

60
61 // hodisa qalqib chiquvchi menyuni ishga tushirishi kerakligini aniqlang
62 shaxsiy bekor tekshiruviForTriggerEvent(MouseEvent hodisasi)
63 {
64
65
66
67 }
68 }
69);
70 } // end PopupFrame konstruktori
71
72 // menyudagi voqealarni boshqarish uchun shaxsiy ichki sinf
73 xususiy sinf ItemHandler ActionListener-ni amalga oshiradi
74 {
75 // menyu bandlarini tanlash jarayoni
76 @Bekor qilish
77 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
78 {
79 // qaysi menyu bandi tanlanganligini aniqlang
80 uchun (int i = 0; i < element.length; i++)
81 {
82 agar (event.getSource() == elementlar[i])
83 {
84 getContentPane().setBackground(colorValues[i]);
85 qaytish;
86 }
87 }
88 }
89 } // ItemHandler xususiy ichki sinfini tugatish
90 } // PopupFrame klassi

1 // 22.8-rasm: PopupTest.java


2 // PopupFrame sinovi.
3 import javax.swing.JFrame;
4
5 ommaviy sinf PopupTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 PopupFrame popupFrame = yangi PopupFrame();
10 popupFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 popupFrame.setSize(300, 200);
12 popupFrame.setVisible(rost);
13 }
14 } // yakuniy sinf PopupTest

22.8-rasm | PopupFrame uchun test klassi. (2-qismning 1-qismi.)

22.7-rasm | Ranglarni tanlash uchun JPopupMenu. (3 qismning 3-qismi.)

agar (event.isPopupTrigger())


popupMenu.show(
event.getComponent(), event.getX(), event.getY());

928 22-bob GUI komponentlari: 2-qism

44–69 qatorlar ilovaning sichqoncha hodisalarini boshqarish uchun MouseListener-ni ro'yxatdan o'tkazadi
oyna. Sichqonchani bosish (48-52-qatorlar) va sichqonchani chiqarish (55-59-qatorlar) usullarini tekshirish
qalqib chiquvchi tetik hodisasi uchun. Har bir usul checkForTrigger-ning shaxsiy yordamchi usulini chaqiradi.
Qalqib chiquvchi tetik hodisasi sodir bo'lganligini aniqlash uchun hodisa (62-67 qatorlar). Agar shunday bo'lsa,
MouseEvent usuli isPopupTrigger haqiqatni qaytaradi va JPopupMenu usuli displeyni ko'rsatadi.
JPopupMenu-ni o'ynaydi. Ko'rsatish usulining birinchi argumenti kelib chiqish komponentini belgilaydi,
uning joylashuvi JPopupMenu ekranda qayerda paydo bo'lishini aniqlashga yordam beradi. Oxirgi
ikkita argument xy koordinatalari (boshlang'ich komponentning yuqori chap qismidan o'lchanadi)
burchagi) JPopupMenu paydo bo'lishi kerak.

Foydalanuvchi ochilgan menyudan menyu bandini tanlaganida, ItemHandler klassi


Amal qilingan usul (76–88-qatorlar) qaysi JRadioButtonMenuItemini aniqlaydi
foydalanuvchi tanladi va oynaning kontent panelining fon rangini o'rnatadi.
22.6 Pluggable Look-and-Feel
Java-ning AWT GUI komponentlaridan foydalanadigan dastur (java.awt paketi) ko'rinishga ega bo'ladi-
va-dastur bajariladigan platformani his qilish. a da ishlaydigan Java ilovasi
Mac OS X boshqa Mac OS X ilovalariga o'xshaydi, ulardan biri Microsoft Windows da ishlaydi
boshqa Windows ilovalariga o'xshaydi va Linux platformasida ishlaydigan biri o'xshaydi
ushbu Linux platformasidagi boshqa ilovalar. Bu ba'zan ma'qul, chunki u imkon beradi
Har bir platformadagi dastur foydalanuvchilari o'zlari foydalanayotgan GUI komponentlaridan foydalanishlari uchun
tayyor tanish. Shu bilan birga, u qiziqarli portativ muammolarni ham taqdim etadi.

Ko'rish va his qilish kuzatuvi 22.9


Bir nechta GUI komponentlarining qalqib chiquvchi tetik hodisasi uchun JPopupMenu-ni ko'rsatish
ushbu GUI komponentlarining har biri uchun sichqoncha hodisasi ishlov beruvchilarini ro'yxatdan o'tkazishni talab qiladi.

Portativlik bo'yicha maslahat 22.1


GUI komponentlari ko'pincha turli platformalarda (shriftlar, shrift o'lchamlari, komponent
chegaralar va boshqalar) va ko'rsatish uchun turli hajmdagi joy talab qilinishi mumkin. Bu o'zgarishi mumkin
ularning joylashuvi va hizalanishi.

Portativlik bo'yicha maslahat 22.2


Turli platformalardagi GUI komponentlari har xil standart funksiyalarga ega boʻlishi mumkin, masalan,
barcha platformalar fokusli tugmani bo'sh joy bilan "bosishga" ruxsat bermaydi.

22.8-rasm | PopupFrame uchun test klassi. (2-qismning 2-qismi.)


22.6 Pluggable Look-and-Feel 929

Swing-ning engil GUI komponentlari taqdim etish orqali ushbu muammolarning ko'pini bartaraf qiladi
platformalar bo'ylab yagona funksionallik va yagona platformalararo ko'rinishni aniqlash orqali
va - his qilish. 12.2-bo'lim Nimbus ko'rinishini taqdim etdi. Java ning oldingi versiyalari ishlatilgan
metall ko'rinish va hissiyot, bu hali ham standart hisoblanadi. Swing shuningdek, moslashuvchanlikni ta'minlaydi
Microsoft Windows uslubidagi tashqi ko'rinish va tuyg'uni o'zgartirish (faqat
Windows tizimlari), Motif uslubidagi (UNIX) ko'rinish va hissiyot (barcha platformalarda) yoki Macin-
tosh ko'rinish va his qilish (faqat Mac tizimlarida).
22.9–22.10-rasmlar Swing GUI koʻrinishini va hissiyotini oʻzgartirish usulini koʻrsatadi.
U bir nechta GUI komponentlarini yaratadi, shuning uchun ularning ko'rinishi va hissiyotidagi o'zgarishlarni ko'rishingiz mumkin
bir vaqtda. Chiqish oynalarida Metall, Nimbus, CDE/Motif, Windows va
Windows tizimlarida mavjud bo'lgan Windows Classic ko'rinishi va hissiyotlari. O'rnatilgan
ko'rinish va hislar platformaga qarab farq qiladi.
Biz ushbu misolda GUI komponentlari va hodisalarni boshqarish tushunchalarini ko'rib chiqdik
Ilgari, shuning uchun biz bu erda ko'rinish va tuyg'uni o'zgartirish mexanizmiga e'tibor qaratamiz. Sinf
UIManager (javax.swing paketi) ichida LookAndFeelInfo (ommaviy) klassi mavjud
statik sinf) ko'rinish va his qilish haqidagi ma'lumotlarni saqlaydi. 20-qator (22.9-rasm)
UIManager.LookAndFeelInfo tipidagi massivni e'lon qiladi (aniqlash uchun ishlatiladigan sintaksisga e'tibor bering.
statik ichki sinf LookAndFeelInfo). 34-qator UIManager statik usulidan foydalanadi.
InstalledLookAndFeels UIManager.LookAndFeelInfo obyektlari qatorini olish uchun.
tizimingizda mavjud bo'lgan har bir ko'rinishni tavsiflang.
Ishlash bo'yicha maslahat 22.1
Har bir ko'rinish va hissiyot Java sinfi bilan ifodalanadi. UIManager usuli getInstalled-
LookAndFeels har bir sinfni yuklamaydi. Aksincha, u mavjud ko'rinishning nomlarini beradi-
va-feel sinflari tanlovni amalga oshirish uchun (taxminan bir marta dasturni ishga tushirishda). Bu
dastur kerak bo'lsa ham, barcha ko'rinish va hissiyot sinflarini yuklash uchun qo'shimcha xarajatlarni kamaytiradi
ulardan ba'zilarini ishlatmang.

1 // 22.9-rasm: LookAndFeelFrame.java


2 // Ko'rinish va tuyg'uni o'zgartirish.
3 import java.awt.GridLayout;
4 import java.awt.BorderLayout;
5 import java.awt.event.ItemListener;
6 import java.awt.event.ItemEvent;
7 import javax.swing.JFrame;
8
9 import javax.swing.JRadioButton;
10 import javax.swing.ButtonGroup;
11 import javax.swing.JButton;
12 import javax.swing.JLabel;
13 import javax.swing.JComboBox;
14 import javax.swing.JPanel;
15 import javax.swing.SwingConstants;
16
17
18 umumiy sinf LookAndFeelFrame JFrame-ni kengaytiradi
19 {

22.9-rasm | Swing-ga asoslangan GUIga qarash va his qilish. (3-qismning 1-qismi.)

import javax.swing.UIManager;

import javax.swing.SwingUtilities;


930 22-bob GUI komponentlari: 2-qism

20 ta shaxsiy yakuniy UIManager.LookAndFeelInfo[] koʻrinishi;
21 shaxsiy yakuniy String[] lookNames; // ko'rinish va his qilish nomlari
22 xususiy yakuniy JRadioButton[] radiosi; // ko'rinish va tuyg'uni tanlash uchun
23 xususiy yakuniy ButtonGroup guruhi; // radio tugmalari uchun guruh
24 shaxsiy yakuniy JButton tugmasi; // tugma ko'rinishini ko'rsatadi
25 xususiy yakuniy JLabel yorlig'i; // yorliq ko'rinishini ko'rsatadi
26 xususiy yakuniy JComboBox comboBox; // birlashgan oynaning ko'rinishini ko'rsatadi
27
28 // GUI ni o'rnating
29 ommaviy LookAndFeelFrame()
30 {
31 super("Qarang va his qiling demo");
32
33
34
35 lookNames = yangi String[looks.length];
36
37 // o'rnatilgan ko'rinish va hissiyotlarning nomlarini oling
38 uchun (int i = 0; i < look.length; i++)
39 lookNames[i] = look[i].getName();
40
41 JPanel northPanel = yangi JPanel();
42 northPanel.setLayout(yangi GridLayout(3, 1, 0, 5));
43
44 label = new JLabel("Bu " + lookNames[0] + "koʻrinish va his qilish",
45 SwingConstants.CENTER);
46 northPanel.add(label);
47
48 tugma = yangi JButton("JButton");
49 northPanel.add(tugma);
50
51 comboBox = yangi JComboBox(lookNames);
52 northPanel.add(comboBox);
53
54 // radio tugmalar uchun massiv yaratish
55 radio = yangi JRadioButton[looks.length];
56
57 JPanel southPanel = yangi JPanel();
58
59 // har bir satrda 3 ta tugmali GridLayout dan foydalaning
60 int qator = (int) Math.ceil (radio.length / 3.0);
61 southPanel.setLayout(yangi GridLayout(satrlar, 3));
62
63 guruh = yangi ButtonGroup(); // ko'rinish va his qilish uchun tugmalar guruhi
64 ItemHandler ishlov beruvchisi = new ItemHandler(); // ko'rinish va his qilish moslamasi
65
66 uchun (int count = 0; count < radio.length; count++)
67 {
68 radio[hisoblash] = yangi JRadioButton(lookNames[hisoblash]);
69 radio[count].addItemListener(ishlovchi); // ishlov beruvchi qo'shing
70 group.add(radio[hisoblash]); // guruhga radio tugma qo'shing
71 southPanel.add(radio[hisoblash]); // panelga radio tugma qo'shing
72 }

22.9-rasm | Swing-ga asoslangan GUIga qarash va his qilish. (3 qismning 2-qismi.)

// o'rnatilgan ko'rinish va his qilish ma'lumotlarini olish
ko'rinadi = UIManager.getInstalledLookAndFeels();

22.6 Pluggable Look-and-Feel 931

73
74 qo'shish(northPanel, BorderLayout.NORTH); // shimoliy panelni qo'shing
75 qo'shish(southPanel, BorderLayout.SOUTH); // janubiy panelni qo'shing
76
77 radio[0].setSelected(to'g'ri); // standart tanlovni o'rnating
78 } // LookAndFeelFrame konstruktorini tugatish
79
80 // GUI ko'rinishini va hissiyotini o'zgartirish uchun UIManager-dan foydalaning
81 shaxsiy bekor o'zgarishTheLookAndFeel(int qiymati)
82 {
83 urinib ko'ring // ko'rinish va his-tuyg'ularni o'zgartiring
84 {
85
86
87
88
89
90 }
91 ta tutish (istisno istisno)
92 {
93 exception.printStackTrace();
94 }
95 }
96
97 // radio tugmalari hodisalarini boshqarish uchun shaxsiy ichki sinf
98 xususiy sinf ItemHandler ItemListener-ni amalga oshiradi
99 {
100 // foydalanuvchining ko'rinish va his-tuyg'ularini tanlashni qayta ishlaydi
101 @Bekor qilish
102 ommaviy void itemStateChanged (ItemEvent hodisasi)
103 {
104 uchun (int count = 0; count < radio.length; count++)
105 {
106 agar (radio[count].isSelected())
107 {
108 label.setText(String.format(
109 "Bu %s koʻrinish va his", lookNames[hisoblash]));
110 comboBox.setSelectedIndex(hisoblash); // combobox indeksini o'rnating
111 changeTheLookAndFeel(hisoblash); // ko'rinish va tuyg'uni o'zgartirish
112 }
113 }
114 }
115 } // ItemHandler xususiy ichki sinfini tugatish
116 } // yakuniy sinf LookAndFeelFrame

1 // 22.10-rasm: LookAndFeelDemo.java


2 // Ko'rinish va tuyg'uni o'zgartirish.
3 import javax.swing.JFrame;
4

22.10-rasm | LookAndFeelFrame uchun test klassi. (2-qismning 1-qismi.)

22.9-rasm | Swing-ga asoslangan GUIga qarash va his qilish. (3 qismning 3-qismi.)

// ushbu ilova uchun ko'rinish va hissiyotni o'rnating


UIManager.setLookAndFeel(ko'rinadi[value].getClassName());

// ushbu ilovadagi komponentlarni yangilash


SwingUtilities.updateComponentTreeUI(bu);

932 22-bob GUI komponentlari: 2-qism

ChangeTheLookAndFeel yordamchi usulimiz (81–95-qatorlar) voqea ishlovchisi tomonidan chaqiriladi
foydalanuvchi interfeysi pastki qismidagi JRadioButtons uchun. Hodisa ishlov beruvchisi (da e'lon qilingan
xususiy ichki sinf ItemHandler 98–115-qatorlarda) elementni ifodalovchi butun sonni uzatadi
ko'rinish va tuyg'uni o'zgartirish uchun ishlatilishi kerak bo'lgan massiv ko'rinishlarida. 86-qator statikni chaqiradi
UIManager-ning setLookAndFeel usuli tashqi ko'rinishni o'zgartirish. getClassName
UIManager sinfining usuli.LookAndFeelInfo ko'rinish va his qilish nomini aniqlaydi
UIManager.LookAndFeelInfo obyektiga mos keladigan sinf. Agar ko'rinish va hissiyot bo'lmasa
allaqachon yuklangan bo'lsa, u setLookAndFeel qo'ng'irog'ining bir qismi sifatida yuklanadi. 89-qator ni chaqiradi
SwingUtilities sinfining statik usulini yangilashComponentTreeUI (javax.swing paketi)
argumentiga biriktirilgan har bir GUI komponentining ko'rinishini va hissiyotini o'zgartirish uchun (bu
Bizning ilova sinfimiz LookAndFeelFrame misoli) yangi ko'rinish va his qilish uchun.

5 umumiy sinf LookAndFeelDemo


6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 LookAndFeelFrame lookAndFeelFrame = yangi LookAndFeelFrame();
10 lookAndFeelFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 lookAndFeelFrame.setSize(400, 220);
12 lookAndFeelFrame.setVisible(to'g'ri);
13 }
14 } // yakuniy sinf LookAndFeelDemo

22.10-rasm | LookAndFeelFrame uchun test klassi. (2-qismning 2-qismi.)


22.7 JDesktopPane va JInternalFrame 933

22.7 JDesktopPane va JInternalFrame
Ko'p hujjatli interfeys (MDI) - bu asosiy oyna (ota oyna deb ataladi)
boshqa oynalarni (bola oynalar deb ataladi) saqlash va ko'pincha bir nechta ochiq hujjatlarni boshqarish uchun ishlatiladi.
umentlar. Misol uchun, ko'pgina elektron pochta dasturlari sizga bir nechta oynalarni ochishga imkon beradi
bir vaqtning o'zida, shuning uchun siz bir vaqtning o'zida bir nechta elektron pochta xabarlarini yozishingiz yoki o'qishingiz mumkin. Xuddi shunday,
Ko'pgina matn protsessorlari foydalanuvchiga bir nechta hujjatlarni alohida oynalarda ochishga imkon beradi:
asosiy oynada, bittasini yopmasdan ular o'rtasida almashish imkonini beradi
boshqasini ochish uchun. Rasmdagi dastur. 22.11–22.12 Swing-ning JDesktopPane dasturini namoyish etadi
va bir nechta hujjatli interfeyslarni amalga oshirish uchun JInternalFrame sinflari.

1 // 22.11-rasm: DesktopFrame.java


2 // JDesktopPane-ni namoyish qilish.
3 import java.awt.BorderLayout;
4 import java.awt.Dimension;
5 import java.awt.Graphics;
6 import java.awt.event.ActionListener;
7 import java.awt.event.ActionEvent;
8 import java.util.Random;
9 import javax.swing.JFrame;
10
11 import javax.swing.JMenuBar;
12 import javax.swing.JMenu;
13 import javax.swing.JMenuItem;
14
15 import javax.swing.JPanel;
16 import javax.swing.ImageIcon;
17
18 umumiy sinf DesktopFrame JFrame-ni kengaytiradi
19 {
20
21
22 // GUI-ni o'rnating
23 umumiy DesktopFrame()
24 {
25 super("JDesktopPane-dan foydalanish");
26
27 JMenuBar satri = yangi JMenuBar();
28 JMenu addMenu = new JMenu("Qo'shish");
29 JMenuItem newFrame = yangi JMenuItem("Ichki ramka");
30
31 addMenu.add(newFrame); // Qo'shish menyusiga yangi ramka elementini qo'shing
32 bar.add(addMenu); // menyu satriga qo'shish menyusini qo'shing
33 setJMenuBar(bar); // ushbu ilova uchun menyu satrini o'rnating
34
35
36
37
38 // newFrame menyu bandi uchun tinglovchini sozlash
39 newFrame.addActionListener(

22.11-rasm | Ko'p hujjatli interfeys. (2-qismning 1-qismi.)

import javax.swing.JDesktopPane;

import javax.swing.JInternalFrame;

xususiy yakuniy JDesktopPane theDesktop;

theDesktop = yangi JDesktopPane();


qo'shish (ish stoli); // ramkaga ish stoli panelini qo'shish

934 22-bob GUI komponentlari: 2-qism

40 ta yangi ActionListener() // anonim ichki sinf
41 {
42 // yangi ichki oynani ko'rsatish
43 @Bekor qilish
44 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
45 {
46 // ichki ramka yaratish
47
48
49
50 MyJPanel paneli = yangi MyJPanel();
51 frame.add(panel, BorderLayout.CENTER);
52 frame.pack(); // ichki ramkani tarkib o'lchamiga o'rnating
53
54
55
56 }
57 }
58);
59 } // DesktopFrame konstruktorini tugatish
60 } // oxirgi sinf DesktopFrame
61
62 // panelda ImageIconni ko'rsatish uchun sinf
63-sinf MyJPanel JPanel-ni kengaytiradi
64 {
65 xususiy statik yakuniy SecureRandom generator = yangi SecureRandom();
66
67 ta shaxsiy yakuniy statik String[] rasmlari = { "yellowflowers.png",
68 "purpleflowers.png", "redflowers.png", "redflowers2.png",
69 "lavenderflowers.png" };
70
71 // tasvirni yuklash
72 ommaviy MyJPanel()
73 {
74 int randomNumber = generator.nextInt(images.length);
75
76 }
77
78 // panelda imageIconni ko'rsatish
79 @Bekor qilish
80 umumiy bekor bo'yoq Komponenti (Grafika g)
81 {
82 super.paintComponent(g);
83
84 }
85
86 // tasvir o'lchamlarini qaytarish
87 ommaviy oʻlcham getPreferredSize()
88 {
89
90
91 }
92 } // yakuniy sinf MyJPanel

22.11-rasm | Ko'p hujjatli interfeys. (2-qismning 2-qismi.)

JInternalFrame ramkasi = yangi JInternalFrame(
"Ichki ramka", rost, rost, rost, rost);

theDesktop.add(ramka); // ichki ramka biriktirish


frame.setVisible(rost); // ichki ramkani ko'rsatish

shaxsiy yakuniy ImageIcon rasm; // ko'rsatiladigan rasm

rasm = yangi ImageIcon(tasvirlar[tasodifiyNumber]); // belgini o'rnatish

picture.paintIcon(bu, g, 0, 0); // ko'rsatish belgisi

yangi o'lchamni qaytaring (picture.getIconWidth(),
picture.getIconHeight());

22.7 JDesktopPane va JInternalFrame 935

27–33 qatorlar JMenuBar, JMenu va JMenuItemni yaratadi, JMenuItem-ni
JMenu, JMenu-ni JMenuBar-ga qo'shing va dastur oynasi uchun JMenuBar-ni o'rnating.
Foydalanuvchi JMenuItem newFrame ni tanlaganida, dastur yangisini yaratadi va ko'rsatadi
Tasvirni o'z ichiga olgan JInternalFrame obyekti.
35-qator JDesktopPane (javax.swing paketi) o'zgaruvchisi Desktopga yangisini tayinlaydi.
JInternalFrame bolalar oynalarini boshqarish uchun ishlatiladigan JDesktopPane obyekti.
36-qator JDesktopPane-ni JFrame-ga qo'shadi. Odatiy bo'lib, JDesktopPane ilovasiga qo'shiladi
Kontent panelining BorderLayout markazida, shuning uchun JDesktopPane to'ldirish uchun kengayadi.
butun dastur oynasi.

1 // 22.12-rasm: DesktopTest.java


2 // JDesktopPane-ni namoyish qilish.
3 import javax.swing.JFrame;
4
5 umumiy sinf DesktopTest
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 DesktopFrame desktopFrame = yangi DesktopFrame();
10 desktopFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 desktopFrame.setSize(600, 480);
12 desktopFrame.setVisible(rost);
13 }
14 } // yakuniy sinf DesktopTest

22.12-rasm | DeskTopFrame uchun test klassi. (2-qismning 1-qismi.)

Ichki freymlar Kichiklashtirish Kattalashtirish Yopish

Kichraytirilgan ichki ramkalar O'lchamini o'zgartirish uchun sichqonchani bolalar oynasining istalgan burchagiga joylashtiring


oyna (o'lchamini o'zgartirishga ruxsat berilsa)

936 22-bob GUI komponentlari: 2-qism

39–58 qatorlar foydalanuvchi tanlaganida hodisani boshqarish uchun ActionListener-ni ro'yxatdan o'tkazing
newFrame menyu elementi. Voqea sodir bo'lganda, usul amalga oshirildi (43-56 qatorlar)
47–48-qatorlarda JInternalFrame obyektini yaratadi. JInternalFrame konstruktori ishlatilgan
bu erda beshta argument olinadi - ichki oynaning sarlavha satri uchun string, mantiqiy
foydalanuvchi tomonidan ichki freym o'lchamini o'zgartirish mumkinmi yoki yo'qligini ko'rsatadi, mantiqiy ko'rsatuvchi
ichki ramka foydalanuvchi tomonidan yopilishi mumkinmi, mantiqiy ko'rsatkich
ichki ramka foydalanuvchi tomonidan maksimal bo'lishi mumkin va ichki yoki yo'qligini ko'rsatuvchi mantiqiy
ramka foydalanuvchi tomonidan minimallashtirilishi mumkin. Boolean argumentlarning har biri uchun haqiqiy qiymat ko'rsatilgan.
operatsiyaga ruxsat berish kerakligini ta'kidlaydi (bu erda bo'lgani kabi).
JFrames va JApplets-da bo'lgani kabi, JInternalFrame ham GUI-ga ega bo'lgan kontent paneliga ega.
komponentlar biriktirilishi mumkin. 50-qator MyJPanel sinfimizning namunasini yaratadi (e'lon qilingan
63-91-qatorlarda), bu 51-qatorda JInternalFrame-ga qo'shiladi.
52-qator bola oynasining o'lchamini o'rnatish uchun JInternalFrame metodlar to'plamidan foydalanadi.
Usullar to'plami oyna o'lchamini aniqlash uchun komponentlarning afzal qilingan o'lchamlaridan foydalanadi.
MyJPanel klassi panelni belgilash uchun getPreferredSize usulini (87–91-qatorlar) e'lon qiladi.
qadoqlash usuli bilan foydalanish uchun afzal qilingan o'lcham. 54-qator JInternalFrame-ni JDesk-ga qo'shadi
topPane va 55-qator JInternalFrame-ni ko'rsatadi.
JInternalFrame va JDesktopPane sinflari boshqarish uchun ko'plab usullarni taqdim etadi
bolalar oynalari. JInternalFrame va JDesktopPane onlayn API hujjatlariga qarang
Ushbu usullarning to'liq ro'yxati uchun:

22.8 JTabbedPane


JTabbedPane GUI komponentlarini qatlamlarga joylashtiradi, ulardan faqat bittasi a da ko'rinadi
vaqt. Foydalanuvchilar har bir qatlamga fayllar kabinetidagi papkalarga o'xshash yorliq orqali kirishadi. Qachon foydalanuvchi
yorliqni bosganda, tegishli qatlam ko'rsatiladi. Yorliqlar sukut bo'yicha yuqorida ko'rinadi, lekin
shuningdek, JTabbedPane-ning chap, o'ng yoki pastki qismida joylashgan bo'lishi mumkin. Har qanday komponent

docs.oracle.com/javase/7/docs/api/javax/swing/JInternalFrame.html


docs.oracle.com/javase/7/docs/api/javax/swing/JDesktopPane.html

22.12-rasm | DeskTopFrame uchun test klassi. (2-qismning 2-qismi.)

Maksimallashtirilgan
ichki ramka

22.8 JTabbedPane 937

yorliq ustiga joylashtirilishi mumkin. Agar komponent idish bo'lsa, masalan, panel, u har qanday foydalanishi mumkin
yorliqda bir nechta komponentlarni joylashtirish uchun tartib menejeri. JTabbedPane klassi kichik sinfdir
JComponent. Rasmdagi dastur. 22.13–22.14 uchtadan bitta yorliqli panelni yaratadi
yorliqlar. Har bir yorliq JPanellardan birini ko'rsatadi - panel1, panel2 yoki panel3.

1 // 22.13-rasm: JTabbedPaneFrame.java


2 // JTabbedPane-ni namoyish qilish.
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import javax.swing.JFrame;
6
7 import javax.swing.JLabel;
8 import javax.swing.JPanel;
9 import javax.swing.JButton;
10 import javax.swing.SwingConstants;
11
12 umumiy sinf JTabbedPaneFrame JFrame-ni kengaytiradi
13 {
14 // GUI-ni o'rnating
15 ta umumiy JTabbedPaneFrame()
16 {
17 super("JTabbedPane Demo");
18
19
20
21 // panel11 ni o'rnating va uni JTabbedPane-ga qo'shing
22 JLabel label1 = yangi JLabel("birinchi panel", SwingConstants.CENTER);
23 JPanel paneli1 = yangi JPanel();
24 panel1.add(label1);
25
26
27 // panel2 ni o'rnating va uni JTabbedPane-ga qo'shing
28 JLabel label2 = yangi JLabel("ikkinchi panel", SwingConstants.CENTER);
29 JPanel paneli2 = yangi JPanel();
30 panel2.setBackground(Color.YELLOW);
31 panel2.add(label2);
32
33
34 // panel3 ni o'rnating va uni JTabbedPane-ga qo'shing
35 JLabel label3 = yangi JLabel("uchinchi panel");
36 JPanel paneli3 = yangi JPanel();
37 panel3.setLayout(yangi BorderLayout());
38 panel3.add(yangi JButton("Shimoliy"), BorderLayout.NORTH);
39 panel3.add(yangi JButton("G'arbiy"), BorderLayout.WEST);
40 panel3.add(yangi JButton("Sharq"), BorderLayout.EAST);
41 panel3.add(yangi JButton("Janubiy"), BorderLayout.SOUTH);
42 panel3.add(label3, BorderLayout.CENTER);
43
44
45 qo'shish (tabbedPane); // JTabbedPane-ni ramkaga qo'shing
46 }
47 } // yakuniy sinf JTabbedPaneFrame

22.13-rasm | JTabbedPane GUI komponentlarini tashkil qilish uchun ishlatilgan.

import javax.swing.JTabbedPane;

JTabbedPane tabbedPane = yangi JTabbedPane(); // JTabbedPane yarating

tabbedPane.addTab("Birinchi tab", null, panel1, "Birinchi panel");

tabbedPane.addTab("Ikkinchi tab", null, panel2, "Ikkinchi panel");

tabbedPane.addTab("Uchinchi yorliq", null, panel3, "Uchinchi panel");

938 22-bob GUI komponentlari: 2-qism

Konstruktor (15–46-qatorlar) GUI-ni yaratadi. 19-qator bo'sh JTabbedPane-ni yaratadi
standart sozlamalar bilan, ya'ni yuqoridagi yorliqlar. Agar yorliqlar bir qatorga to'g'ri kelmasa, ular to'g'ri keladi
yorliqlarning qo'shimcha qatorlarini hosil qilish uchun o'rash. Keyin konstruktor JPanels panelini yaratadi1,
panel2 va panel3 va ularning GUI komponentlari. Har bir panelni o'rnatganimizda, biz uni qo'shamiz
tabbedPane, to'rtta argumentli JTabbedPane usuli addTab yordamida. Birinchi dalil
yorliq sarlavhasini belgilaydigan satrdir. Ikkinchi dalil - bu Icon havolasi
yorliqda ko'rsatish uchun belgini belgilaydi. Agar belgi null mos yozuvlar bo'lsa, hech qanday rasm ko'rsatilmaydi.
Uchinchi argument - bu GUI komponentini o'chirish uchun aks ettiruvchi Komponent havolasi.
foydalanuvchi yorliqni bosganida o'ynang. Oxirgi argument - bu asbob maslahatini belgilaydigan String
tab uchun. Masalan, 25-qator JPanel paneli1ni tabbedPane-ga "Tab One" sarlavhasi bilan qo'shadi
va asboblar maslahati "Birinchi panel". JPanels panel2 va panel3 da tabbedPane-ga qo'shiladi
32 va 43 qatorlar. Yorliqni ko'rish uchun uni sichqoncha bilan bosing yoki aylanish uchun o'q tugmalaridan foydalaning
yorliqlar orqali.

22.9 BoxLayout Layout Manager


12-bobda biz uchta tartib menejerini tanishtirdik - FlowLayout, BorderLayout va
GridLayout. Ushbu bo'lim va 22.10-bo'lim ikkita qo'shimcha tartib menejerlarini taqdim etadi
(22.15-rasmda umumlashtirilgan). Biz ularni keyingi misollarda muhokama qilamiz.

1 // 22.14-rasm: JTabbedPaneDemo.java


2 // JTabbedPane-ni namoyish qilish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf JTabbedPaneDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 JTabbedPaneFrame tabbedPaneFrame = yangi JTabbedPaneFrame();
10 tabbedPaneFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 tabbedPaneFrame.setSize(250, 200);
12 tabbedPaneFrame.setVisible(to'g'ri);
13 }
14 } // yakuniy sinf JTabbedPaneDemo

22.14-rasm | JTabbedPaneFrame uchun test klassi.


22.9 BoxLayout Layout Manager 939

BoxLayout layout menejeri (javax.swing paketida) GUI komponentlarini tartibga soladi
konteynerning x o'qi bo'ylab gorizontal yoki y o'qi bo'ylab vertikal. Ilova ichida
Anjir. 22.16–22.17 BoxLayout va Box-dan foydalanadigan Box konteyner sinfini namoyish etadi.
Layout standart tartib boshqaruvchisi sifatida.

Layout menejeri Tavsif

BoxLayout GUI komponentlarini chapdan o'ngga yoki yuqoridan pastgacha tartibga solish imkonini beradi.
idish. Class Box BoxLayout-dan foydalanadigan va ta'minlovchi konteynerni e'lon qiladi
Gorizontal yoki vertikal BoxLayout bilan Box yaratish uchun statik usullar.
GridBagLayout GridLayout ga o'xshaydi, lekin komponentlar o'lchamlari bo'yicha farq qilishi va bo'lishi mumkin
har qanday tartibda qo'shiladi.

22.15-rasm | Qo'shimcha tartib menejerlari.

1 // 22.16-rasm: BoxLayoutFrame.java
2 // BoxLayoutni namoyish qilish.
3 import java.awt.Dimension;
4 import javax.swing.JFrame;
5 import javax.swing.Box;
6 import javax.swing.JButton;
7
8 import javax.swing.JPanel;
9 import javax.swing.JTabbedPane;
10
11 ommaviy sinf BoxLayoutFrame JFrame-ni kengaytiradi
12 {
13 // GUI-ni o'rnating
14 ommaviy BoxLayoutFrame()
15 {
16 super("BoxLayoutni namoyish qilish");
17
18 // BoxLayout yordamida Box konteynerlarini yarating
19
20
21
22
23
24 yakuniy int SIZE = 3; // har bir qutidagi tugmalar soni
25
26 // Box Horizontal1-ga tugmalar qo'shing
27 uchun (int count = 0; count < SIZE; count++)
28
29
30 // strut yarating va vertical1 qutisiga tugmalar qo'shing
31 uchun (int count = 0; count < SIZE; count++)
32 {
33
34
35 }
22.16-rasm | BoxLayout layout menejeri. (2-qismning 1-qismi.)

import javax.swing.BoxLayout;

Horizontal1 quti = Box.createHorizontalBox();
Box vertical1 = Box.createVerticalBox();
Gorizontal2 quti = Box.createHorizontalBox();
Box vertical2 = Box.createVerticalBox();

horizontal1.add(yangi JButton("Button" + hisoblash));

vertical1.add(Box.createVerticalStrut(25));
vertical1.add(yangi JButton("Button" + hisoblash));

940 22-bob GUI komponentlari: 2-qism

36
37 // gorizontal elim yarating va Horizontal2 qutisiga tugmalar qo'shing
38 uchun (int count = 0; count < SIZE; count++)
39 {
40
41
42 }
43
44 // qattiq maydon yarating va Box vertical2 ga tugmalar qo'shing
45 uchun (int count = 0; count < SIZE; count++)
46 {
47
48
49 }
50
51 // vertikal elim yarating va panelga tugmalar qo'shing
52 JPanel paneli = yangi JPanel();
53 panel.setLayout ();
54
55 uchun (int count = 0; count < SIZE; count++)
56 {
57
58
59 }
60
61 // JTabbedPane yarating
62
63
64
65 // har bir konteynerni yorliqli panelga joylashtiring
66 tabs.addTab("Gorizontal Box", gorizontal1);
67 tabs.addTab("Strutsli vertikal quti", vertikal1);
68 tabs.addTab("Yelimli gorizontal quti", gorizontal2);
69 tabs.addTab("Qattiq joylarga ega vertikal quti", vertikal2);
70 tabs.addTab("Yelimli vertikal quti", panel);
71
72 qo'shish (yorliqlar); // yorliqli panelni ramkaga joylashtiring
73 } // end BoxLayoutFrame konstruktori
74 } // oxirgi sinf BoxLayoutFrame

1 // 22.17-rasm: BoxLayoutDemo.java


2 // BoxLayoutni namoyish qilish.
3 import javax.swing.JFrame;
4
5 ommaviy sinf BoxLayoutDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 BoxLayoutFrame boxLayoutFrame = yangi BoxLayoutFrame();

22.17-rasm | BoxLayoutFrame uchun test klassi. (2-qismning 1-qismi.)

22.16-rasm | BoxLayout layout menejeri. (2-qismning 2-qismi.)

horizontal2.add(Box.createHorizontalGlue());


horizontal2.add(yangi JButton("Button" + hisoblash));

vertical2.add(Box.createRigidArea(yangi oʻlcham(12, 8)));


vertical2.add(yangi JButton("Button" + hisoblash));

yangi BoxLayout(panel, BoxLayout.Y_AXIS)

panel.add(Box.createGlue());
panel.add(yangi JButton("Button" + hisoblash));

JTabbedPane yorliqlari = yangi JTabbedPane(


JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);

22.9 BoxLayout Layout Manager 941

Quti konteynerlarini yaratish
19-22 qatorlar Box konteynerlarini yaratadi. Gorizontal1 va gorizontal2 havolalar boshlang'ich-
Box konteynerini qaytaradigan statik Box usuli createHorizontalBox bilan yaratilgan
GUI komponentlari chapdan o'ngga joylashtirilgan gorizontal BoxLayout. O'zgaruvchilar
vertical1 va vertical2 statik Box usuli createVerticalBox bilan ishga tushiriladi,
Bu vertikal BoxLayout bilan Box konteynerlariga havolalarni qaytaradi, bunda GUI mos keladi.
ponentlar yuqoridan pastgacha joylashtirilgan.
Struts
27–28-qatorlardagi halqa gorizontal1 ga uchta JButton qo'shadi. Satrlardagi for bayonoti
31–35 vertikal1 ga uchta JButton qo'shadi. Har bir tugmani qo'shishdan oldin, 33-satrga ver-
statik strutni konteynerga statik Box usuli createVerticalStrut bilan ulang. Vertikal
strut - bu aniq piksel balandligiga ega bo'lgan va kafolatlash uchun ishlatiladigan ko'rinmas GUI komponenti
GUI komponentlari orasidagi belgilangan bo'shliq miqdori. Yaratish usuli uchun int argumenti -
VerticalStrut strut balandligini piksellarda aniqlaydi. Konteyner hajmi o'zgartirilsa,
struts bilan ajratilgan GUI komponentlari orasidagi masofa o'zgarmaydi. Sinf qutisi ham
gorizontal BoxLayouts uchun createHorizontalStrut usulini e'lon qiladi.

10 boxLayoutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


11 boxLayoutFrame.setSize(400, 220);
12 boxLayoutFrame.setVisible(rost);
13 }
14 } // oxirgi sinf BoxLayoutDemo

22.17-rasm | BoxLayoutFrame uchun test klassi. (2-qismning 2-qismi.)

Velosiped uchun o'qlar
yorliqlar orqali

942 22-bob GUI komponentlari: 2-qism



Yelim
38–42 qatorlardagi for bayonoti gorizontal2 ga uchta JButton qo'shadi. Har birini qo'shishdan oldin
tugmasi, 40-qator statik Box yaratish usuli bilan konteynerga gorizontal elim qo'shadi -
Gorizontal elim. Gorizontal elim ko'rinmas GUI komponenti bo'lib, undan foydalanish mumkin:
qo'shimcha joy egallash uchun sobit o'lchamli GUI komponentlarini o'rtasida o'tkazing. Odatda, qo'shimcha joy
oxirgi gorizontal GUI komponentining o'ng tomonida yoki oxirgi vertikal qismi ostida ko'rinadi
BoxLayout. Yelim GUI komponentlari orasiga qo'shimcha joy qo'yish imkonini beradi. Qachon
konteyner hajmi o'zgartirildi, elim komponentlari bilan ajratilgan qismlar bir xil o'lchamda qoladi,
lekin elim ular orasidagi bo'shliqni egallash uchun cho'ziladi yoki shartnoma tuzadi. Class Box shuningdek,
clares usuli vertikal BoxLayouts uchun createVerticalGlue.
Qattiq hududlar
45-49 qatorlardagi for bayonoti vertikal2 ga uchta JButton qo'shadi. Har bir tugma oldidan
qo'shilgan bo'lsa, 47-qator statik Box yaratish usuli bilan konteynerga qattiq maydon qo'shadi -
Qattiq maydon. Qattiq maydon har doim belgilangan piksel kengligiga ega bo'lgan ko'rinmas GUI komponentidir
va balandligi. createRigidArea usulining argumenti Dimension ob'ekti bo'lib, u
maydonning kengligi va balandligini aniqlaydi.
Konteyner uchun BoxLayout ni o'rnatish
52-53 qatorlar JPanel ob'ektini yaratadi va uning tartibini an'anaviy tarzda BoxLayout ga o'rnatadi.
tarzda, setLayout konteyner usuli yordamida. BoxLayout konstruktori ko'rsatma oladi.
joylashuvni boshqaradigan konteynerga erence va doimiyligini ko'rsatuvchi belgi
tartib gorizontal (BoxLayout.X_AXIS) yoki vertikal (BoxLayout.Y_AXIS).
Yelim va JButtons qo'shish
55-59 qatorlardagi for bayonoti panelga uchta JButton qo'shadi. Har bir narsani qo'shishdan oldin -
tonna, 57-qator statik Box yaratish usuli bilan konteynerga elim komponentini qo'shadi -
Yelim. Ushbu komponent qutining o'lchamiga qarab kengayadi yoki qisqaradi.
JTabbedPane yaratish
62–63 qatorlar ushbu dasturdagi beshta konteynerni ko'rsatish uchun JTabbedPane ni yaratadi. ar-
konstruktorga yuborilgan gument JTabbedPane.TOP yorliqlar quyidagi manzilda paydo bo'lishi kerakligini bildiradi
JTabbedPane ning yuqori qismi. JTabbedPane.SCROLL_TAB_LAYOUT argumenti belgilaydi
Agar bitta qatorga sig'maydigan juda ko'p bo'lsa, yorliqlar yangi qatorga o'ralishi kerak.
Box konteynerlari va JPanelni JTabbedPane-ga ulash
Box konteynerlari va JPanel JTabbedPane-ga 66–70-qatorlarda biriktirilgan. Sinab ko'ring
ilovani amalga oshirish. Oyna paydo bo'lganda, oynaning o'lchamini o'zgartirishni ko'rish uchun
elim komponentlari, strut komponentlari va qattiq maydon har bir yorliqdagi tartibga ta'sir qiladi.
22.10 GridBagLayout Layout Manager
Eng kuchli oldindan belgilangan tartib menejerlaridan biri bu GridBagLayout (paketda ja-
va.awt). Ushbu tartib GridLayout-ga o'xshaydi, chunki u komponentlarni tarmoqqa joylashtiradi, lekin
u yanada moslashuvchan. Komponentlar hajmi jihatidan farq qilishi mumkin (ya'ni, ular bir nechta qatorlarni egallashi mumkin).
va ustunlar) va har qanday tartibda qo'shilishi mumkin.
GridBagLayout-dan foydalanishning birinchi bosqichi GUI ko'rinishini aniqlashdir. Uchun
Ushbu bosqichda sizga faqat bir varaq qog'oz kerak bo'ladi. GUI-ni chizing, so'ngra bo'linib, ustiga panjara chizing

22.10 GridBagLayout Layout Manager 943

komponentlarni satr va ustunlarga ajrating. Boshlang'ich satr va ustun raqamlari bo'lishi kerak
0, GridBagLayout layout menejeri qator va ustun raqamlaridan foydalanishi uchun
komponentlarni to'rga to'g'ri joylashtiring. 22.18-rasmda chiziqlar chizish ko'rsatilgan
GUI ustidagi satrlar va ustunlar uchun.

GridBag cheklovlari


GridBagConstraints obyekti komponent GridBagLayout-ga qanday joylashtirilishini tasvirlaydi.
Bir nechta GridBagConstraints maydonlari 22.19-rasmda jamlangan.

GridBagConstraints Maydon langari


GridBagConstraints maydon langari komponentning nisbiy holatini belgilaydi
u to'ldirmaydigan maydon. O'zgaruvchan ankraj quyidagi GridBagCon-dan biriga tayinlangan.
kuchlanish konstantalari: Shimol, Shimoli-Sharqiy, Sharqiy, Janubi-Sharqiy, Janubi, Janubi-G'arbiy, G'arbiy,
Shimoli G'arbiy yoki MARKAZ. Standart qiymat – MARKAZ.

22.18-rasm | GridBagLayout-dan foydalanadigan grafik interfeysni loyihalash.

Maydon tavsifi

anchor Nisbatan joylashuvni bildiradi (SHIMOL, SHIMOLIY-SARQ, SARQ, JANUBIY-SHARQ, JANUBI,


JANUBIY G'ARBIY, G'arbiy, Shimoli G'arbiy, MARKAZI) bo'lgan hududdagi komponent
to'ldirmaydi.
to'ldirish Komponentning o'lchamini ko'rsatilgan yo'nalishda o'zgartiradi (YO'Q, HORIZONTAL, VER-
TICAL, BOTH) displey maydoni komponentdan kattaroq bo'lganda.
gridx Komponent joylashtiriladigan ustun.
gridy Komponent joylashtiriladigan qator.
gridwidth Komponent egallagan ustunlar soni.
gridheight Komponent egallagan qatorlar soni.
weightx Gorizontal ajratish uchun qo'shimcha joy miqdori. To'r uyasi mumkin
qo'shimcha joy mavjud bo'lganda kengroq bo'ladi.
vaznli Vertikal ajratish uchun qo'shimcha joy miqdori. To'r uyasi bo'lishi mumkin
qo'shimcha joy mavjud bo'lganda balandroq.

22.19-rasm | GridBagConstraints maydonlari.

Qator

Ustun
0 1 2



0
1
2
3

944 22-bob GUI komponentlari: 2-qism



GridBagConstraints Maydonni to'ldirish
GridBagConstraints maydonini to'ldirish komponentning qaysi sohada o'sishini belgilaydi
komponentdan kattaroq ko'rsatilishi mumkin. To'ldiruvchi o'zgaruvchiga quyidagilardan biri tayinlanadi
quyidagi GridBagConstraints konstantalari: NONE, VERTICAL, HORIZONTAL yoki HAR ikkovi. de-
nosozlik qiymati YO'Q, bu komponent har ikki yo'nalishda ham o'smasligini ko'rsatadi.
VERTICAL vertikal ravishda o'sishini bildiradi. HORIZONTAL uning yomon o'sishini bildiradi.
izontal ravishda. BOTH ikkala yo'nalishda ham o'sishini bildiradi.
GridBagConstraints Maydonlar gridx va gridy
Gridx va gridy o'zgaruvchilari komponentning yuqori chap burchagi qayerda joylashganligini ko'rsatadi
panjara ichida. Gridx o'zgaruvchisi ustunga, o'zgaruvchan grid esa mos keladi
qator. 22.18-rasmda JComboBox (“Temir” ko‘rsatilgan) 1 va a ga teng gridx qiymatiga ega.
grid qiymati 2.
GridBagConstraints Maydon panjara kengligi
O'zgaruvchan tarmoq kengligi komponent egallagan ustunlar sonini belgilaydi. JCombo-
Quti ikkita ustunni egallaydi. Gridheight o'zgaruvchanligi kompozitsion qatorlar sonini belgilaydi.
nent egallaydi. 22.18-rasmning chap tomonidagi JTextArea uchta qatorni egallaydi.
GridBagConstraints Field weightx
O'zgaruvchan vazn x Grid-dagi grid uyalariga qo'shimcha gorizontal bo'shliqni qanday taqsimlashni belgilaydi.
BagLayout konteyner hajmi o'zgartirilganda. Nol qiymati panjara uyasi yo'qligini ko'rsatadi
o'z-o'zidan gorizontal ravishda o'sadi. Biroq, agar komponent a ni o'z ichiga olgan ustunni qamrab olsa
noldan farqli vaznx qiymatiga ega komponent, nol vaznx qiymatiga ega bo'lgan komponent bo'ladi
gorizontal ravishda ushbu ustundagi boshqa komponent(lar) bilan bir xil nisbatda o'sadi. Bu
chunki har bir komponent qaysi satr va ustunda saqlanishi kerak
dastlab joylashtirilgan edi.
GridBagConstraints Maydon og'ir
Weighty o'zgaruvchisi qo'shimcha vertikal bo'shliqni Grid-dagi grid slotlariga qanday taqsimlashni belgilaydi.
BagLayout konteyner hajmi o'zgartirilganda. Nol qiymati panjara uyasi yo'qligini ko'rsatadi
o'z-o'zidan vertikal ravishda o'sadi. Biroq, agar komponent kompozitsiyani o'z ichiga olgan qatorni qamrab olsa,
noldan farqli vaznli qiymatga ega bo'lgan nent, nol og'irlik qiymatiga ega bo'lgan komponent vertikal ravishda o'sadi
xuddi shu qatordagi boshqa komponent(lar) bilan bir xil nisbatda.
Weightx va weighty effektlari
22.18-rasmda vaznli va vaznli x ning ta'sirini konteynergacha osongina ko'rish mumkin emas
hajmi o'zgartiriladi va qo'shimcha joy mavjud bo'ladi. Kattaroq og'irlik qiymatlari bo'lgan komponentlar
kichikroq og'irlik qiymatlariga qaraganda qo'shimcha joyni ko'proq egallaydi.
Komponentlarga nolga teng bo'lmagan musbat og'irlik qiymatlari berilishi kerak, aks holda ular bo'ladi
Idishning o'rtasida birga "to'planish". 22.20-rasmda GUI ko'rsatilgan
Barcha og'irliklar nolga o'rnatilgan 22.18-rasm.
GridBagLayout ko'rsatilmoqda
Rasmdagi dastur. 22.21–22.22 tartiblash uchun GridBagLayout layout menejeridan foydalanadi
22.18-rasmdagi GUI komponentlari. Ilova iblisdan boshqa hech narsa qilmaydi.
GridBagLayout-dan qanday foydalanishni o'rganing.

22.10 GridBagLayout Layout Manager 945

22.20-rasm | GridBagLayout og'irliklari nolga o'rnatilgan.

1 // 22.21-rasm: GridBagFrame.java


2 // GridBagLayout ko'rsatilmoqda.
3
4
5 import java.awt.Component;
6 import javax.swing.JFrame;
7 import javax.swing.JTextArea;
8 import javax.swing.JTextField;
9 import javax.swing.JButton;
10 import javax.swing.JComboBox;
11
12 umumiy sinf GridBagFrame JFrame-ni kengaytiradi
13 {
14
15
16
17 // GUI-ni o'rnating
18 umumiy GridBagFrame()
19 {
20 super("GridBagLayout");
21
22
23
24
25 // GUI komponentlarini yaratish
26 JTextArea textArea1 = yangi JTextArea("TextArea1", 5, 10);
27 JTextArea textArea2 = yangi JTextArea("TextArea2", 2, 2);
28
29 String[] nomlari = { "Temir", "Po'lat", "Guruch" };
30 JComboBox comboBox = yangi JComboBox(nomlar);
31
32 JTextField textField = yangi JTextField("TextField");
33 JButton tugmasi1 = yangi JButton("1-tugma");
34 JButton tugmasi2 = yangi JButton("2-tugma");
35 JButton tugmasi3 = yangi JButton("3-tugma");
36
37 // textArea1 uchun weightx va weighty ikkalasi ham 0: standart
38 // barcha komponentlar uchun langar CENTER: standart
39
40

22.21-rasm | GridBagLayout layout menejeri. (2-qismning 1-qismi.)

import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;

xususiy yakuniy GridBagLayout tartibi; // ushbu ramkaning tartibi


xususiy yakuniy GridBagConstraints cheklovlari; // tartib cheklovlari

tartib = yangi GridBagLayout();


setLayout (tartib); // ramka tartibini o'rnatish
cheklovlar = new GridBagConstraints(); // cheklovlarni joriy qilish

constraints.fill = GridBagConstraints.BOTH;


addComponent(textArea1, 0, 0, 1, 3);

946 22-bob GUI komponentlari: 2-qism

41
42 // button1 uchun weightx va weighty ikkalasi ham 0: standart
43
44
45
46 // comboBox uchun weightx va weighty ikkalasi ham 0: sukut bo'yicha
47 // to'ldirish GORIZONTAL
48
49
50 // tugma 2
51
52
53
54
55
56 // to'ldirish 3-tugma uchun BOTH hisoblanadi
57
58
59
60
61 // textField uchun weightx va weighty ikkalasi ham 0, fill BOTH
62
63
64 // textArea2 uchun weightx va weighty ikkalasi ham 0, fill BOTH
65
66 } // GridBagFrame konstruktorini tugatish
67
68 // cheklovlarni o'rnatish usuli
69 xususiy void addComponent(Komponent komponenti,
70 int qator, int ustun, int kengligi, int balandligi)
71 {
72
73
74
75
76
77
78 }
79 } // oxirgi sinf GridBagFrame

1 // 22.22-rasm: GridBagDemo.java


2 // GridBagLayout ko'rsatilmoqda.
3 import javax.swing.JFrame;
4
5 umumiy sinf GridBagDemo
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 GridBagFrame gridBagFrame = yangi GridBagFrame();

22.22-rasm | GridBagFrame uchun test klassi. (2-qismning 1-qismi.)

22.21-rasm | GridBagLayout layout menejeri. (2-qismning 2-qismi.)

constraints.fill = GridBagConstraints.HORIZONTAL;


addComponent(button1, 0, 1, 2, 1);

addComponent(comboBox, 2, 1, 2, 1);

cheklovlar.weightx = 1000; // kengayishi mumkin
constraints.weighty = 1; // bo'yi o'sishi mumkin
constraints.fill = GridBagConstraints.BOTH;
addComponent(tugma 2, 1, 1, 1, 1);

constraints.weightx = 0;


constraints.weighty = 0;
addComponent(tugma3, 1, 2, 1, 1);

addComponent(textField, 3, 0, 2, 1);

addComponent(textArea2, 3, 2, 1, 1);

constraints.gridx = ustun;


constraints.gridy = qator;
constraints.gridwidth = width;
constraints.gridheight = balandlik;
layout.setConstraints(komponent, cheklovlar); // cheklovlarni o'rnatish
qo'shish (komponent); // komponent qo'shing

22.10 GridBagLayout Layout Manager 947

GUI umumiy ko'rinishi
GUIda uchta JButton, ikkita JTextAreas, JComboBox va JTextField mavjud. The
tartib menejeri GridBagLayout. 21-22 qatorlar GridBagLayout ob'ektini yaratadi va o'rnatadi
layout uchun JFrame uchun tartib menejeri. 23-qator GridBagConstraints ni yaratadi
tarmoqdagi har bir komponentning joylashuvi va hajmini aniqlash uchun ishlatiladigan ob'ekt. 26-qatorlar
35 kontent paneliga qo'shiladigan har bir GUI komponentini yarating.
JTextArea textArea1
39-40 qatorlar JTextArea textArea1 ni sozlaydi va uni kontent paneliga qo'shadi. Qadriyatlar
uchun weightx va vaznli qiymatlar cheklovlarda ko'rsatilmagan, shuning uchun har birining qiymati bor
sukut bo'yicha nolga teng. Shunday qilib, bo'sh joy mavjud bo'lsa ham, JTextArea o'lchamini o'zgartirmaydi. Qanaqasiga-
har doim, u bir nechta qatorlarni qamrab oladi, shuning uchun vertikal o'lcham JButtons ning og'ir qiymatlariga bo'ysunadi
tugma 2 va tugma 3. Har bir tugma oʻlchami kattaligiga qarab vertikal ravishda oʻzgartirilsa,
JTextArea ham o'lchamini o'zgartiradi.
39-qator GridBagConstraints.BOTH uchun o'zgaruvchan to'ldirish cheklovlarini o'rnatadi, bu esa quyidagilarga sabab bo'ladi.
JTextArea har doim tarmoqdagi barcha ajratilgan maydonni to'ldirish uchun. Ankraj qiymati aniq emas
cheklovlarga ega, shuning uchun standart CENTER ishlatiladi. Bunda biz o'zgaruvchan langardan foydalanmaymiz

10 gridBagFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


11 gridBagFrame.setSize(300, 150);
12 gridBagFrame.setVisible(rost);
13 }
14 } // oxirgi sinf GridBagDemo

22.22-rasm | GridBagFrame uchun test klassi. (2-qismning 2-qismi.)


948 22-bob GUI komponentlari: 2-qism



ilova, shuning uchun barcha komponentlar sukut bo'yicha foydalanadi. 40-qator bizning yordamchi usulimizni chaqiradi
addComponent (69-78-qatorlarda e'lon qilingan). JTextArea obyekti, satr, ustun,
argument sifatida uzatiladigan ustunlar soni va qatorlar soni uzatiladi.
Jtugma tugmasi1
JButton tugmasi1 - keyingi qo'shilgan komponent (43–44-qatorlar). Odatiy bo'lib, weightx va
og'ir qiymatlar hali ham nolga teng. To'ldirish o'zgaruvchisi HORIZONTAL ga o'rnatiladi - komponent bo'ladi
har doim uning maydonini gorizontal yo'nalishda to'ldiring. Vertikal yo'nalish to'ldirilmagan. The
og'ir qiymat nolga teng, shuning uchun tugma faqat boshqa komponentda bo'lsa balandroq bo'ladi
bir xil qator noldan farqli vaznli qiymatga ega. JButton tugmasi1 0-qator, 1-ustunda joylashgan.
Bir qator va ikkita ustun band.
JComboBox comboBox
JComboBox comboBox keyingi qo'shilgan komponentdir (48-qator). Odatiy bo'lib, weightx va
vaznli qiymatlar nolga teng va to'ldirish o'zgaruvchisi HORIZONTAL ga o'rnatiladi. JComboBox tugmasi
faqat gorizontal yo'nalishda o'sadi. Weightx, weighty va fill o'zgaruvchilari saqlanadi
o'zgartirilgunga qadar cheklovlarda o'rnatilgan qiymatlar. JComboBox tugmasi joylashgan
2-qator, ustun 1. Bir qator va ikkita ustun band.
JButton tugmasi2
JButton tugmasi2 - keyingi qo'shilgan komponent (51–54-qatorlar). Unga weightx qiymati berilgan
1000 va vaznli qiymati 1. Tugma egallagan maydon o'sishga qodir
vertikal va gorizontal yo'nalishlarda. To'ldirish o'zgaruvchisi BOTH ga o'rnatiladi, bu esa belgilaydi
tugma har doim butun maydonni to'ldiradi. Oyna o'lchami o'zgartirilsa, tugma 2 bo'ladi
o'sadi. Tugma 1-qatorning 1-ustuniga joylashtirilgan. Bitta qator va bitta ustun band.
JButton tugmasi3
JButton tugmasi3 keyingi qo'shiladi (57–59-qatorlar). Ham weightx qiymati, ham vaznli qiymat
nolga o'rnatiladi va to'ldirish qiymati BOTH. Agar oyna bo'lsa, JButton tugmasi3 o'sadi
o'lchami o'zgartirildi - bu tugma 2 og'irlik qiymatlariga ta'sir qiladi. Buton2 uchun vazn x qiymati
tugma 3 uchun bundan ancha katta. O'lchamni o'zgartirish sodir bo'lganda, 2 tugmasi kattaroq joyni egallaydi
yangi maydonning foizi. Tugma 1-qator, ustun 2. Bir qator va bitta
ustun band qilingan.
JTextField textField va JTextArea textArea2
JTextField textField (62-qator) va JTextArea textArea2 (65-qator) ikkalasi ham mavjud.
weightx qiymati 0 va vaznli qiymati 0. Toʻldirish qiymati BOTH. JTextField
3-qatorning 0-ustunida va JTextArea 3-qatorning 2-ustunida joylashgan. JTextField oc-
kubiklar bir qator va ikkita ustun, JTextArea bir qator va bitta ustun.
AddComponent usuli
Metod addComponent parametrlari Komponent mos yozuvlar komponenti va butun sonlardir
qator, ustun, kenglik va balandlik. 72-73 qatorlar GridBagConstraints o'zgaruvchilari panjarasini o'rnatadi
va gridy. Gridx o'zgaruvchisiga Komponent bo'ladigan ustun tayinlanadi
joylashtiriladi va panjara qiymati Komponent joylashtiriladigan qatorga tayinlanadi.
74-75 qatorlar GridBagConstraints o'zgaruvchilari gridwidth va gridheightni o'rnatadi. The
gridwidth o'zgaruvchisi Komponent to'rga joylashtiradigan ustunlar sonini belgilaydi,

22.10 GridBagLayout Layout Manager 949

va gridheight o'zgaruvchisi Komponentning ichida joylashgan qatorlar sonini belgilaydi
panjara. 76-qator GridBagLayout-dagi komponent uchun GridBagConstraints-ni o'rnatadi. Metod-
GridBagLayout sinfining od setConstraints komponenti argumenti va GridBag-ni oladi.
Cheklovlar argumenti. 77-qator komponentni JFrame-ga qo'shadi.
Ushbu ilovani ishga tushirganingizda, cheklovlar qandayligini ko'rish uchun oyna o'lchamini o'zgartirib ko'ring
har bir GUI komponenti uchun uning oynadagi holati va hajmiga ta'sir qiladi.
GridBagConstraints konstantalari RELATIVE va REMAINDER
Gridx va gridy o'rniga GridBagLayout o'zgarishi GridBagConstraints cheklovlaridan foydalanadi.
RELATIVE va REMAIDER stantslari. RELATIVE a da oxirgidan keyingi komponent ekanligini bildiradi
alohida satr qatordagi oldingi komponentning o'ng tomoniga joylashtirilishi kerak.
REMAINDER komponentning qatordagi oxirgi komponent ekanligini bildiradi. Har qanday komponent
qatordagi ikkinchi yoki oxirgi komponent emas, GridbagCon- uchun qiymatlarni ko'rsatishi kerak.
straints o'zgaruvchilari gridwidth va gridheight. Rasmdagi dastur. 22.23–22.24 ar-
GridBagLayout-da ushbu konstantalardan foydalangan holda komponentlarni diapazonga aylantiradi.

1 // 22.23-rasm: GridBagFrame2.java


2 // GridBagLayout konstantalarini ko'rsatish.
3 import java.awt.GridBagLayout;
4 import java.awt.GridBagConstraints;
5 import java.awt.Component;
6 import javax.swing.JFrame;
7 import javax.swing.JComboBox;
8 import javax.swing.JTextField;
9 import javax.swing.JList;
10 import javax.swing.JButton;
11
12 umumiy sinf GridBagFrame2 JFrame-ni kengaytiradi
13 {
14 xususiy yakuniy GridBagLayout tartibi; // ushbu ramkaning tartibi
15
16
17 // GUI-ni o'rnating
18 umumiy GridBagFrame2()
19 {
20 super("GridBagLayout");
21
22
23 cheklov = yangi GridBagConstraints(); // cheklovlarni joriy qilish
24
25 // GUI komponentlarini yaratish
26 String[] metallar = { "Mis", "Alyuminiy", "Kumush" };
27 JComboBox comboBox = yangi JComboBox(metallar);
28
29 JTextField textField = yangi JTextField("TextField");
30
31 String[] shriftlari = { "Serif", "Monospaced" };
32 JList ro'yxati = yangi JList(shriftlar);
33

22.23-rasm | GridBagConstraints konstantalari RELATIVE va REAINDER. (2-qismning 1-qismi.)

xususiy yakuniy GridBagConstraints cheklovlari; // tartib cheklovlari

tartib = yangi GridBagLayout();


setLayout (tartib); // ramka tartibini o'rnatish

950 22-bob GUI komponentlari: 2-qism

34 String[] nomlari = { "nol", "bir", "ikki", "uch", "to'rt" };
35 JButton[] tugmalari = yangi JButton[names.length];
36
37 uchun (int count = 0; count < buttons.length; count++)
38 tugmalar[hisoblash] = yangi JButton(nomlar[hisoblash]);
39
40 // textField uchun GUI komponenti cheklovlarini aniqlang
41
42
43
44
45
46
47 // buttons[0] -- weightx va weighty 1: fill BOTH
48
49
50
51 // tugmalar[1] -- vazn x va vazn 1: toʻldirish BOTH
52
53
54
55 // tugmalar[2] -- vaznx va vazn 1: toʻldirish BOTH
56
57
58
59 // comboBox -- weightx 1: to'ldirish BOTH
60
61
62
63
64 // tugmalar[3] -- vazn x 1: toʻldirish BOTH
65
66
67
68
69 // tugmalar[4] -- vazn x va vazn 1: toʻldirish BOTH
70
71
72
73 // list -- weightx va weighty 1: fill BOTH
74
75
76 } // GridBagFrame2 konstruktorini tugatish
77
78 // konteynerga komponent qo'shing
79 xususiy void addComponent (Komponent komponenti)
80 {
81
82
83 }
84 } // oxirgi sinf GridBagFrame2

22.23-rasm | GridBagConstraints konstantalari RELATIVE va REAINDER. (2-qismning 2-qismi.)

constraints.weightx = 1;
constraints.weighty = 1;
constraints.fill = GridBagConstraints.BOTH;
constraints.gridwidth = GridBagConstraints.REMAINDER;
addComponent(textField);

constraints.gridwidth = 1;


addComponent(tugmalar[0]);

constraints.gridwidth = GridBagConstraints.RELATIVE;


addComponent(tugmalar [1]);

constraints.gridwidth = GridBagConstraints.REMAINDER;


addComponent(tugmalar [2]);

constraints.weighty = 0;


constraints.gridwidth = GridBagConstraints.REMAINDER;
addComponent(comboBox);

constraints.weighty = 1;


constraints.gridwidth = GridBagConstraints.REMAINDER;
addComponent(tugmalar [3]);

constraints.gridwidth = GridBagConstraints.RELATIVE;


addComponent(tugmalar [4]);

constraints.gridwidth = GridBagConstraints.REMAINDER;


qo'shimcha komponent (ro'yxat);

layout.setConstraints(komponent, cheklovlar);


qo'shish (komponent); // komponent qo'shing

22.10 GridBagLayout Layout Manager 951

JFrame tartibini GridBagLayout ga o'rnatish
21–22 qatorlar GridBagLayout-ni yaratadi va undan JFrame-ning tartib menejerini o'rnatish uchun foydalaning. The
GridBagLayout-ga joylashtirilgan komponentlar 27–38-qatorlarda yaratilgan - ular
JComboBox, JTextField, JList va beshta JButton.

JTextFieldni sozlash


Avval JTextField qo'shiladi (41-45 qatorlar). Weightx va weighty qiymatlari o'rnatiladi
1. Fill o'zgaruvchisi BOTH ga o'rnatiladi. 44-qator JTextField oxirgi birikma ekanligini bildiradi.
ponent chiziqda. JTextField bizning yordamchi dasturimizga qo'ng'iroq qilish orqali kontent paneliga qo'shiladi
addComponent usuli (79-83-qatorlarda e'lon qilingan). AddComponent usuli Compo-ni oladi
nent argumenti va cheklovlarni o'rnatish uchun GridBagLayout usuli setConstraints dan foydalanadi
Komponent uchun. Qo'shish usuli komponentni kontent paneliga biriktiradi.

JButton tugmalarini sozlash[0]


JButton tugmalari[0] (48–49-qatorlar) vazn x va 1 vazn qiymatlariga ega. Toʻldirish oʻzgaruvchan-
ikkoviga ham qodir. Chunki tugmalar[0] qatordagi oxirgi ikki komponentdan biri emas, balki
1 to'r kengligi berilgan va shuning uchun bitta ustunni egallaydi. JButton konfiguratsiyaga qo'shiladi.
addComponent yordam dasturiga qo'ng'iroq qilish uchun chodir paneli.

1 // 22.24-rasm: GridBagDemo2.java


2 // GridBagLayout konstantalarini ko'rsatish.
3 import javax.swing.JFrame;
4
5 umumiy sinf GridBagDemo2
6 {
7 ta umumiy statik bekor asosiy (String [] args)
8 {
9 GridBagFrame2 gridBagFrame = yangi GridBagFrame2();
10 gridBagFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 gridBagFrame.setSize(300, 200);
12 gridBagFrame.setVisible(rost);
13 }
14 } // oxirgi sinf GridBagDemo2

22.24-rasm | GridBagDemo2 uchun test klassi.


952 22-bob GUI komponentlari: 2-qism

JButton tugmalarini sozlash[1]
JButton tugmalari[1] (52–53-qatorlar) vazn x va 1 vazn qiymatlariga ega. Toʻldirish oʻzgaruvchan-
ikkoviga ham qodir. 52-qator JButton oldingi tugmaga nisbatan joylashtirilishi kerakligini bildiradi.
ponent. Tugma JFrame-ga addComponent qo'ng'irog'i bilan qo'shiladi.
JButton tugmalarini sozlash[2]
JButton tugmalari[2] (56–57-qatorlar) 1 ga teng vazn va vazn qiymatlariga ega.
ikkoviga ham qodir. Bu JButton liniyadagi oxirgi komponent hisoblanadi, shuning uchun REMAINDER ishlatiladi. The
JButton addComponent qo'ng'irog'i bilan kontent paneliga qo'shiladi.
JComboBox sozlanmoqda
JComboBox (60–62-qatorlar) vazni 1 va vazni 0 ga teng. JComboBox
vertikal ravishda o'smaydi. JComboBox liniyadagi yagona komponent, shuning uchun REMAINDER
ishlatilgan. JComboBox kontent paneliga addComponent chaqiruvi bilan qo'shiladi.
JButton tugmalarini sozlash[3]
JButton tugmalari[3] (65–67-qatorlar) 1 ga teng vazn va vazn qiymatlariga ega.
ikkoviga ham qodir. Bu JButton liniyadagi yagona komponent hisoblanadi, shuning uchun REMAINDER ishlatiladi. The
JButton addComponent qo'ng'irog'i bilan kontent paneliga qo'shiladi.
JButton tugmalarini sozlash[4]
JButton tugmalari[4] (70–71-qatorlar) 1 ga teng vazn va vazn qiymatlariga ega.
ikkoviga ham qodir. Bu JButton qatordagi keyingi komponent hisoblanadi, shuning uchun RELATIVE ishlatiladi.
JButton addComponent qo'ng'irog'i bilan kontent paneliga qo'shiladi.
JList sozlanmoqda
JList (74–75-qatorlar) vazni x va 1 vaznli qiymatlariga ega. Toʻldirish oʻzgaruvchisi BOTH.
JList kontent paneliga addComponent qo'ng'irog'i bilan qo'shiladi.
22.11 Yakunlash
Ushbu bob GUI-larga kirishimizni yakunlaydi. Ushbu bobda biz qo'shimcha narsalarni muhokama qildik
Menyular, slayderlar, qalqib chiquvchi menyular, bir nechta hujjatli interfeyslar kabi grafik interfeys mavzulari
panellar va Java-ning ulanadigan ko'rinishi va hissi. Ushbu komponentlarning barchasi mavjud qismlarga qo'shilishi mumkin
ulardan foydalanish va tushunishni osonlashtiradigan ilovalar. Shuningdek, biz qo'shimcha layn-
GUI komponentlarini tashkil qilish va o'lchash uchun menejerlar. Keyingi bobda siz o'rganasiz
ko'p ish zarralari haqida, bu sizga ilova bajarilishi kerakligini belgilash imkonini beradi
bir vaqtning o'zida bir nechta vazifalar.

Xulosa
22.2 JSlider bo'limi


• JSliders (912-bet) butun son qiymatlari oralig‘idan tanlash imkonini beradi. Ular asosiy va ko'rsatishi mumkin
kichik belgilar va belgilar uchun teglar (912-bet). Ular, shuningdek, snap-to Shomillarni ham qo'llab-quvvatlaydi (912-bet)—
bosh barmog'ini (912-bet) ikkita belgi orasiga qo'yish, uni eng yaqin belgiga o'rnatadi.
• JSliderlar gorizontal yoki vertikal yo'nalishga ega. Gorizontal JSlider uchun minimal
qiymat o'ta chapda va maksimal qiymat o'ta o'ngda. Vertikal JSlider uchun,

Xulosa 953



minimal qiymat ekstremal pastki qismida va maksimal qiymat ekstremal tepada. The
bosh barmog'ining holati JSliderning joriy qiymatini ko'rsatadi. getValue usuli (916-bet).
class JSlider joriy bosh barmog'ining holatini qaytaradi.
• JSlider usuli setMajorTickSpacing () JSlider-dagi belgi belgilari oralig'ini o'rnatadi. Usul
Haqiqiy argumentga ega setPaintTicks (916-bet) belgi belgilari ko'rsatilishi kerakligini bildiradi.
• JSliders foydalanuvchi JSlider bilan aloqa qilganda ChangeEvents yaratadi. ChangeListener
(916-bet) ChangeEvents-ga javob bera oladigan stateChanged (916-bet) usulini e'lon qiladi.
22.3-bo'lim Java-da Windows-ni tushunish
• Oynaning (916-bet) hodisalari WindowListener (s. 917) tomonidan boshqarilishi mumkin, u yettitasini taqdim etadi.
oyna-hodisalar bilan ishlash usullari-windowActivated, windowClosed, windowClosing, window-
O'chirilgan, oyna ikonsizlashtirilgan, oyna belgisi va oyna ochilgan.
22.4-bo'lim Menyularni ramkalar bilan ishlatish
• Menyular GUIda buyruqlarni tartibli tartibga soladi. Swing GUI-larida menyular faqat ob'ektlarga biriktirilishi mumkin.
setJMenuBar usuli bilan sinflar ob'ektlari (917-bet).
• JMenuBar (917-bet) menyular uchun konteynerdir. Menyuda JMenuItem paydo bo'ladi. JMenyu (917-bet)
menyu elementlarini o'z ichiga oladi va JMenuBar yoki boshqa JMenuslarga pastki menyu sifatida qo'shilishi mumkin.
• Menyu bosilganda, u menyu elementlari ro'yxatini ko'rsatish uchun kengayadi.
• JCheckBoxMenuItem (918-bet) tanlanganda menyu bandining chap tomonida belgi paydo bo'ladi.
JCheckBoxMenuItem yana tanlanganda, chek olib tashlanadi.
• ButtonGroupda bir vaqtning o'zida faqat bitta JRadioButtonMenuItem (918-bet) tanlanishi mumkin.
• AbstractButton usuli setMnemonic (923-bet) tugma uchun mnemonikani (918-bet) belgilaydi.
Mnemonik belgilar odatda pastki chiziq bilan ko'rsatiladi.
• Modal dialog oynasi (923-bet) ilovaning boshqa oynasiga kirishga ruxsat bermaydi
dialog o'chiriladi. JOptionPane klassi bilan ko'rsatilgan dialoglar modal dialoglardir. Sinf
JDialog (923-bet) dan o'zingizning modal yoki nomodal dialoglaringizni yaratish uchun foydalanish mumkin.
22.5 JPopupMenu bo'limi
• Kontekstga sezgir qalqib chiquvchi menyular (925-bet) JPopupMenu klassi bilan yaratilgan. Qalqib chiquvchi tetik
hodisa odatda foydalanuvchi sichqonchaning o'ng tugmachasini bosgan va qo'yib yuborganida sodir bo'ladi. Sichqoncha hodisasi
isPopupTrigger usuli (928-bet) agar qalqib chiquvchi tetik hodisasi ro'y bergan bo'lsa, true qiymatini qaytaradi.
• JPopupMenu usullarini ko'rsatish (928-bet) JPopupMenu-ni ko'rsatadi. Birinchi argument kelib chiqishini belgilaydi
JPopupMenu qaerda paydo bo'lishini aniqlashga yordam beradigan komponent. Oxirgi ikkita dalil
JPopupMenu paydo bo'ladigan boshlang'ich komponentning yuqori chap burchagidagi koordinatalar.
22.6-bo'lim Pluggable Look-and-Feel
• UIManager.LookAndFeelInfo klassi (929-bet) ko'rinish va his qilish haqidagi ma'lumotlarni saqlaydi.
• UIManager (929-bet) getInstalledLookAndFeels statik usuli (929-bet) qatorni qaytaradi
Mavjud ko'rinish va hissiyotlarni tavsiflovchi UIManager.LookAndFeelInfo obyektlari.
• UIManager statik usuli setLookAndFeel (932-bet) tashqi ko'rinishni o'zgartiradi. SwingUtilities
(932-bet) statik usulni yangilashComponentTreeUI (932-bet) har bir qurilmaning koʻrinishini oʻzgartiradi.
yangi ko'rinish va hissiyotga komponent argumentiga biriktirilgan komponent.
22.7-bo'lim JDesktopPane va JInternalFrame
• Bugungi ilovalarning ko'pchiligi bir nechta hujjatli interfeysdan (MDI; 933-bet) foydalanadi.
parallel ravishda ishlanayotgan ochiq hujjatlar. Swing's JDesktopPane (p. 933) va
JInternalFrame (933-bet) sinflari bir nechta hujjatli interfeyslarni yaratish uchun yordam beradi.

954 22-bob GUI komponentlari: 2-qism

22.8-bo'lim JTabbedPane
• JTabbedPane (936-bet) GUI komponentlarini qatlamlarga joylashtiradi, ulardan faqat bittasi ko‘rinib turadi.
vaqt. Foydalanuvchilar har bir qatlamga uning yorlig'ini bosish orqali kirishadi.
22.9-bo'lim BoxLayout Layout Manager
• BoxLayout ) p. 939) konteynerda GUI komponentlarini chapdan o'ngga yoki yuqoridan pastgacha joylashtiradi.
• Class Box birlamchi tartib menejeri sifatida BoxLayout bilan konteynerni ifodalaydi va stat-
Gorizontal yoki vertikal BoxLayout bilan Box yaratish uchun ic usullari.
22.10 bo'limi GridBagLayout Layout Manager
• GridBagLayout (942-bet) GridLayout-ga o'xshaydi, lekin har bir komponent o'lchami farq qilishi mumkin.
• GridBagConstraints obyekti (943-bet) komponent GridBagLayout-ga qanday joylashtirilishini belgilaydi.
O'z-o'zini tekshirish mashqlari
22.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Klas menyu obyektini yaratish uchun ishlatiladi.
b) JMenu sinfining usuli menyuga ajratuvchi satrni joylashtiradi.
c) JSlider hodisalari interfeys usuli bilan ishlanadi.
d) GridBagConstraints misol o'zgaruvchisi sukut bo'yicha CENTER ga o'rnatiladi.
22.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Dasturchi JFrame ni yaratganda, kamida bitta menyu yaratilishi kerak va
JFrame-ga qo'shildi.
b) fill o'zgaruvchisi GridBagLayout sinfiga tegishli.
c) GUI komponentida chizish (0, 0) yuqori chap burchakka nisbatan bajariladi
komponentning koordinatasi.
d) Box uchun standart tartib BoxLayout hisoblanadi.
22.3 Quyidagilarning har birida xato(lar)ni toping va xato(lar)ni qanday tuzatish kerakligini tushuntiring.
a) JMenubar b;
b) mySlider = JSlider (1000, 222, 100, 450);
c) gbc.fill = GridBagConstraints.NORTHWEST; // to'ldirishni o'rnating
d) // moslashtirilgan Swing komponentida bo'yash uchun bekor qilish
Umumiy bekor bo'yoq komponenti (Grafika g)
{
g.drawString("SALOM", 50, 50);
}
e) // JFrame yarating va uni ko'rsating
JFrame f = yangi JFrame("Oyna");
f.setVisible(rost);
O'z-o'zini tekshirish mashqlariga javoblar
22.1 a) JMenyu. b) addSeparator. c) stateChanged, ChangeListener. d) langar.
22.2 a) Noto'g'ri. JFrame hech qanday menyuni talab qilmaydi.
b) yolg'on. Fill o'zgaruvchisi GridBagConstraints sinfiga tegishli.
c) To'g'ri.
d) To'g'ri.
22.3 a) JMenubar JMenuBar bo'lishi kerak.

Mashqlar 955



b) Konstruktorning birinchi argumenti SwingConstants.HORIZONTAL yoki Swing- bo'lishi kerak.
Constants.VERTICAL, va new kalit so'zi = operatoridan keyin qo'llanilishi kerak. Shuningdek,
minimal qiymat maksimaldan past bo'lishi kerak va boshlang'ich qiymat diapazonda bo'lishi kerak.
c) doimiy BOTH, HORIZONTAL, VERTICAL yoki NONE bo'lishi kerak.
d) bo'yoq komponenti paintComponent bo'lishi kerak va usul super.paint- deb nomlanishi kerak.
Komponent (g) birinchi bayonot sifatida.
e) Oynaning o'lchamini belgilash uchun JFrame ning setSize usulini ham chaqirish kerak.
Mashqlar
22.4 (Bo'sh joylarni to'ldirish) Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) JMenu bo'lgan JMenuItem a(n) deb ataladi.
b) Usul JMenuBar-ni JFrame-ga biriktiradi.
c) Konteyner sinfida birlamchi BoxLayout mavjud.
d) A(n) JInternalFrame klassi bilan e'lon qilingan ichki oynalar to'plamini boshqaradi.
22.5 (To'g'ri yoki noto'g'ri) Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ayting. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Menyular JFrame-ga biriktirilishi uchun JMenuBar obyektini talab qiladi.
b) BoxLayout JFrame uchun standart tartib menejeri.
c) JAppletlar menyularni o'z ichiga olishi mumkin.
22.6 (Kod xatolarini toping) Quyidagilarning har birida xato(lar)ni toping. Qanday tuzatish kerakligini tushuntiring
xato(lar).
a) x.add(yangi JMenuItem("Submenyu rangi")); // pastki menyu yaratish
b) container.setLayout(yangi GridbagLayout());
22.7 (Doira va uning atributlarini ko'rsatish) Tasodifiy o'lchamdagi doirani ko'rsatadigan dastur yozing.
va maydon, radius, diametr va atrofni hisoblab chiqadi va ko'rsatadi. Quyidagi tenglamadan foydalaning -
tionlar: diametri = 2 × radius, maydon = p × radius2, aylana = 2 × p × radius. Doimiydan foydalaning
pi (p) uchun Math.PI. Barcha chizmalar JPanelning kichik sinfida bajarilishi kerak va hisoblash natijalari
latsiyalar faqat o'qish uchun JTextArea ichida ko'rsatilishi kerak.
22.8 (JSlider yordamida) 22.7-mashqdagi dasturni foydalanuvchiga oʻzgartirishga ruxsat berish orqali yaxshilang.
JSlider bilan radius. Dastur 100 dan 200 gacha bo'lgan barcha radiuslar uchun ishlashi kerak
radius o'zgarishi, diametri, maydoni va atrofi yangilanishi va ko'rsatilishi kerak. Boshlang'ich
radius 150 bo'lishi kerak. 22.7-mashqdagi tenglamalardan foydalaning. Barcha chizmalar pastki qismda bajarilishi kerak.
JPanel klassi va hisob-kitoblar natijalari faqat o'qish uchun JTextArea ichida ko'rsatilishi kerak.
22.9 (O'zgaruvchan vazn va vazn) O'zgaruvchan vazn va vaznning ta'sirini o'rganing
22.21-rasmdagi dasturning qiymatlari. Slotning og'irligi nolga teng bo'lsa-da, nima sodir bo'ladi?
butun maydonni to'ldirish uchun tushirilganmi (ya'ni, to'ldirish qiymati HIKASIDA emas)?
22.10 (JSlider va JTextFieldni sinxronlash) paintCompo-dan foydalanadigan dastur yozing.
JPanel pastki sinfida JSliderning joriy qiymatini chizish uchun nent usuli. Bundan tashqari, a
Muayyan qiymatni kiritish mumkin bo'lgan JTextField. JTextField joriy qiymatni ko'rsatishi kerak
JSlider-dan har doim. JTextField-dagi qiymatni o'zgartirish JSlider-ni ham yangilashi kerak.
JTextField-ni aniqlash uchun JLabel-dan foydalanish kerak. JSlider usullari setValue va getValue
foydalanish kerak. [Izoh: setValue usuli umumiy usul bo'lib, qiymatni qaytarmaydi va
bosh barmog'ining o'rnini aniqlaydigan JSlider qiymati bo'lgan bitta butun son argumentini oladi.]
22.11 (Rang tanlash vositasini yaratish) JPanelning MyColorChoose deb nomlangan kichik sinfini e'lon qiling.
uchta JSlider ob'ektini va uchta JTextField ob'ektini vites. Har bir JSlider dan qiymatlarni ifodalaydi
Rangning qizil, yashil va ko'k qismlari uchun 0 dan 255 gacha. Ushbu qiymatlardan Rang uchun argument sifatida foydalaning
yangi Color ob'ektini yaratish uchun konstruktor. Har bir JSliderning joriy qiymatini mos ravishda ko'rsating.

956 22-bob GUI komponentlari: 2-qism

sponding JTextField. Foydalanuvchi JSlider qiymatini o'zgartirganda, JTextField bo'lishi kerak
mos ravishda o'zgartirildi. Yangi GUI komponentingizdan kursni aks ettiruvchi ilovaning bir qismi sifatida foydalaning.
To'ldirilgan to'rtburchak chizish orqali Rang qiymatini ijaraga oling.
22.12 (Rang tanlash vositasini yaratish: o'zgartirish) 22.11-mashqning MyColorChooser sinfini o'zgartiring
foydalanuvchiga qizil, yashil yoki ko'k qiymatni o'rnatish uchun JTextField-ga butun son qiymatini kiritishiga ruxsat berish. Qachon
foydalanuvchi JTextField-da Enter tugmasini bossa, tegishli JSlider mos ravishda o'rnatilishi kerak
qiymat.
22.13 (Rang tanlash vositasini yaratish: o'zgartirish) Chizish uchun 22.12-mashqdagi ilovani o'zgartiring.
Joriy rang o'zining bo'yashini ta'minlaydigan JPanel kichik klassi misolida to'rtburchak sifatida
To'rtburchak chizish uchun komponent usuli va qizil, yashil va ko'kni o'rnatish uchun belgilangan usullarni taqdim etadi
joriy rang uchun qiymatlar. Har qanday o'rnatilgan usul chaqirilganda, chizma paneli avtomatik ravishda
o'zini qayta bo'yash.
22.14 (Chizma ilovasi) 22.13-mashqdagi ilovani foydalanuvchiga sudrab borishiga ruxsat berish uchun o'zgartiring.
joriy rangdagi shaklni chizish uchun sichqonchani chizma paneli (JPanelning quyi sinfi) bo'ylab suring. En-
foydalanuvchi qaysi shaklni chizishni tanlashi mumkin.
22.15 (Chizma ilovasini oʻzgartirish) 22.14-mashqdagi ilovani oʻzgartirishga ruxsat bering.
foydalanuvchi ko'rsatilgan oynadagi yopish qutisini bosish orqali dasturni tugatishi va tomonidan
Fayl menyusidan Chiqish-ni tanlang. 22.5-rasmda ko'rsatilgan usullardan foydalaning.
22.16 (To'liq chizma ilovasi) Ushbu bobda ishlab chiqilgan usullardan foydalanish va
12-bob, to'liq chizma ilovasini yarating. Dastur GUI komponentlaridan foydalanishi kerak
12-bobdan va ushbu bobdan foydalanuvchiga shakl, rang va to'ldirish xususiyatlarini tanlash imkonini beradi.
Har bir shakl MyShape ob'ektlari massivida saqlanishi kerak, bu erda MyShape sizning yuqori sinfingizdir.
shakl sinflari ierarxiyasi. JDesktopPane va JInternalFrames-dan foydalaning, bu foydalanuvchiga multi-format yaratish imkonini beradi.
alohida bolalar oynalarida alohida chizmalarni qo'ying. Foydalanuvchi interfeysini alohida bola sifatida yarating.
dow barcha GUI komponentlarini o'z ichiga oladi, bu esa foydalanuvchiga uning xususiyatlarini aniqlash imkonini beradi
chizilgan shakl. Keyin foydalanuvchi shaklni chizish uchun istalgan JInternalFrame-ni bosishi mumkin.

Bir vaqtning o'zida 23


ning eng umumiy ta'rifi
go'zallik ... Birlikda ko'plik.
- Semyuel Teylor Kolerij
So'rov yo'lini to'sib qo'ymang.
- Charlz Sanders Pirs
Mehnat qilishni va kutishni o'rganing.
- Genri Uodsvort Longfello

Oh maqsadlar


Ushbu bobda siz:
■ parallellikni tushunish,
parallelizm va
ko'p tarmoqli.
■ Ipning hayot aylanishini o'rganing.
■ uchun ExecutorService dan foydalaning
parallel mavzularni ishga tushirish
Runnablesni bajaradi.
■ Sinxronlashtirilgandan foydalaning
kirishni muvofiqlashtirish usullari
umumiy o'zgaruvchan ma'lumotlarga.
■ Ishlab chiqaruvchini tushunish/
iste'molchi munosabatlari.
■ Buning uchun SwingWorker-dan foydalaning
a ichida Swing GUI-larni yangilang
ipdan xavfsiz usul.
■ unumdorligini solishtiring
Massivlar usullari tartiblash va
parallel tartiblash ko'p
yadro tizimi.
■ Yaxshiroq qilish uchun parallel oqimlardan foydalaning
ko'p yadroli ishlash
tizimlari.
■ CompletableFutures-dan foydalaning
uzoq hisob-kitoblarni amalga oshirish uchun
asinxron va ni oling
natijalar kelajakda.

958 23-bob Bir vaqtdalik

23.1 Kirish
[Izoh: "Kengaytirilgan" deb belgilangan bo'limlar muammoni chuqurroq ko'rib chiqishni istagan o'quvchilar uchun mo'ljallangan.
valyuta va faqat asosiy qamrovni afzal o'quvchilar tomonidan o'tkazib yuborilishi mumkin.] Agar biz yaxshi bo'lardi
diqqatimizni bir vaqtning o'zida faqat bitta vazifani bajarishga va uni yaxshi bajarishga qaratishimiz mumkin. Bu
bir vaqtning o'zida juda ko'p narsa sodir bo'ladigan murakkab dunyoda buni qilish odatda qiyin. Bu
bob bir nechta yaratuvchi va boshqaradigan dasturlarni ishlab chiqish uchun Java imkoniyatlarini taqdim etadi
vazifalar. Ko'rsatamizki, bu dastur ish faoliyatini sezilarli darajada yaxshilashi mumkin.
Ikki vazifa bir vaqtning o'zida ishlaydi deganda, ularning ikkalasi ham ekanligini bildiramiz
bir vaqtning o'zida taraqqiyotga erishish. Yaqin vaqtgacha ko'pchilik kompyuterlarda faqat bitta protsessor mavjud edi. Operatsion-
Bunday kompyuterlarda ishlaydigan tizimlar bir vaqtning o'zida vazifalarni tezda almashtirish orqali bajaradi
Ular, keyingisiga o'tishdan oldin har birining kichik qismini bajaring, shunda barcha vazifalar saqlanib qoladi
rivojlanmoqda. Masalan, shaxsiy kompyuterlar uchun dasturni kompilyatsiya qilish, yuborish odatiy holdir
faylni printerga yuborish, tarmoq orqali elektron pochta xabarlarini qabul qilish va boshqalar.
Yaratilganidan beri Java parallellikni qo'llab-quvvatladi.
Ikki vazifa parallel ravishda ishlayotganini aytganda, biz ular bajarilayotganligini nazarda tutamiz
bir vaqtning o'zida. Shu ma'noda, parallelizm bir vaqtning o'zida bir xillikdir. Inson tanasi har-
parallel ravishda turli xil operatsiyalarni tashkil qiladi. Nafas olish, qon aylanishi, ovqat hazm qilish,
fikrlash va yurish, masalan, barcha hislar kabi parallel ravishda sodir bo'lishi mumkin - ko'rish,
eshitish, teginish, hid va ta'm. Bu parallelizm mumkin, deb ishoniladi, chunki

23.1 Kirish


23.2 Ip holatlari va hayot aylanishi
23.2.1 Yangi va ishga tushirish mumkin bo'lgan holatlar
23.2.2 Kutish holati
23.2.3 Vaqtli kutish holati
23.2.4 Bloklangan holat
23.2.5 Tugatilgan holat
23.2.6 Operatsion tizim ko'rinishi
Ishlaydigan holat
23.2.7 Mavzu ustuvorliklari va mavzu
Rejalashtirish
23.2.8 Noma'lum kechiktirish va
O'lik qulf
23.3 bilan mavzularni yaratish va bajarish
Ijrochi ramkasi
23.4 Mavzuni sinxronlashtirish
23.4.1 O'zgarmas ma'lumotlar
23.4.2 Monitorlar
23.4.3 Sinxronlanmagan o'zgaruvchan ma'lumotlar
Ulashish
23.4.4 Sinxronlashtirilgan o'zgaruvchan ma'lumotlar
Almashish - operatsiyalarni atomik qilish
23.5 Ishlab chiqaruvchi/iste’molchi munosabatlari
Sinxronizatsiyasiz
23.6 Ishlab chiqaruvchi/iste’molchi munosabatlari:
ArrayBlockingQueue

23.7 (Kengaytirilgan) Ishlab chiqaruvchi/iste'molchi


Sinxronlashtirilgan bilan aloqa,
kuting, xabardor qiling va barchaga xabar bering
23.8 (Kengaytirilgan) Ishlab chiqaruvchi/iste'molchi
Aloqa: chegaralangan buferlar
23.9 (Kengaytirilgan) Ishlab chiqaruvchi/iste'molchi
Aloqa: Qulf va
Vaziyat interfeyslari
23.10 Bir vaqtning o'zida to'plamlar
23.11 GUI bilan ko'p qirrali:
SwingWorker
23.11.1 a da hisob-kitoblarni bajarish
Ishchi mavzu: Fibonachchi raqamlari
23.11.2 Oraliq natijalarni qayta ishlash: elak
Eratosthenes
23.12 bilan tartiblash/parallelSort Timeings
Java SE 8 Date/Time API
23.13 Java SE 8: Ketma-ket va parallel
Oqimlar
23.14 (Kengaytirilgan) Qo'ng'iroq qilish mumkin bo'lgan interfeyslar
va kelajak
23.15 (Kengaytirilgan) Fork/Join Framework
23.16 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar


23.1 Kirish 959

Inson miyasida milliardlab "protsessorlar" mavjud deb taxmin qilinadi. Hozirgi ko'p yadroli kompyuterlar
vazifalarni parallel ravishda bajara oladigan bir nechta protsessorlarga ega.
Java parallelligi
Java bir vaqtning o'zida til va API orqali siz uchun mavjud bo'ladi. Java dasturlari
bir nechta bajarilishi mumkin bo'lgan oqimlarga ega bo'lishi mumkin, bunda har bir ip o'zining metod-chaqiruv stekiga ega
va dastur hisoblagichi, u almashish paytida boshqa oqimlar bilan bir vaqtda ishlashga imkon beradi
ular bilan xotira va fayl tutqichlari kabi keng dasturli resurslar. Bu qobiliyat
multithreading deb ataladi.

Bir vaqtning o'zida dasturlashdan foydalanish


Biz bir vaqtning o'zida dasturlashning ko'plab ilovalarini muhokama qilamiz. Masalan, oqim qachon-
Internet orqali audio yoki videoni olayotganda, foydalanuvchi butun autentsiya tugaguncha kutishni xohlamasligi mumkin.
ijroni boshlashdan oldin dio yoki video yuklab olish. Ushbu muammoni hal qilish uchun bir nechta
mavzulardan audio yoki videoni yuklab olish uchun foydalanish mumkin (keyinroq bobda biz ko'rib chiqamiz
Bunga prodyuser sifatida) va boshqasi uni o'ynashga (keyinroq bobda biz buni fitna deb nomlaymiz.
Shumer). Ushbu tadbirlar bir vaqtning o'zida amalga oshiriladi. To'g'ri o'ynamaslik uchun, iplar
sinxronlashtiriladi (ya'ni, ularning harakatlari muvofiqlashtiriladi), shunda o'yinchi ipi boshlanmaydi
pleerni o'tkazish uchun xotirada etarli miqdorda audio yoki video bo'lmaguncha
band. Ishlab chiqaruvchi va iste'molchi iplari xotirani baham ko'radi - biz ularni qanday muvofiqlashtirishni ko'rsatamiz
to'g'ri bajarilishini ta'minlash uchun iplar. Java virtual mashinasi (JVM) mavzularni yaratadi
axlat yig'ish kabi uy ishlarini bajarish uchun dasturlar va mavzularni ishga tushiring.
Bir vaqtning o'zida dasturlash qiyin
Ko'p bosqichli dasturlarni yozish qiyin bo'lishi mumkin. Garchi inson aqli bajara olsa
bir vaqtning o'zida funktsiyalarni bajaradi, odamlar parallel fikrlash poezdlari o'rtasida o'tishni qiyinlashtiradi.
Nima uchun ko'p bosqichli dasturlarni yozish va tushunish qiyin bo'lishini bilish uchun quyidagi amallarni bajaring:
Tajriba: 1-sahifada uchta kitobni oching va kitoblarni bir vaqtning o'zida o'qishga harakat qiling.
Birinchi kitobdan bir nechta so'zlarni, keyin ikkinchisidan bir nechtasini, keyin esa bir nechta so'zlarni o'qing
uchinchidan, keyin orqaga qayting va birinchi kitobdan keyingi bir necha so'zni o'qing va hokazo. Keyin
Ushbu tajribada siz ko'p ish zarralarini o'tkazish - kommutatsiyaning ko'plab qiyinchiliklarini qadrlaysiz
kitoblar o'rtasida, qisqacha o'qish, har bir kitobdagi o'z o'rningizni eslash, ko'chirish
Siz o'qiyotgan kitobni yaqinroq ko'rishingiz va o'qimayotgan kitoblaringizni itarishingiz uchun
bir chetga suring - va bu tartibsizliklar orasida kitoblarning mazmunini tushunishga harakat qiling!
Iloji bo'lsa, bir vaqtning o'zida API-larning oldindan tuzilgan sinflaridan foydalaning
Bir vaqtning o'zida dasturlarni dasturlash qiyin va xatolarga moyil. Agar siz sinxronlashdan foydalanishingiz kerak bo'lsa
dasturni sozlash uchun quyidagi ko'rsatmalarga amal qiling:
1. Dasturchilarning katta qismi mavjud yig'ish sinflari va interfeyslaridan foydalanishi kerak
Sinxronizatsiyani boshqaradigan parallel API-lardan (masalan, Array-

Ishlash bo'yicha maslahat 23.1


Yomon javob berishga olib kelishi mumkin bo'lgan yagona tarmoqli ilovalar bilan bog'liq muammo shundaki
Boshqalar boshlashdan oldin uzoq davom etadigan harakatlar tugashi kerak. Ko'p tarmoqli ilovada,
iplar bir nechta yadrolar bo'ylab taqsimlanishi mumkin (agar mavjud bo'lsa), bir nechta vazifalar bajarilishi uchun
parallel ravishda va dastur yanada samarali ishlashi mumkin. Multithreading ham ko'payishi mumkin
bitta protsessorli tizimlarda ishlash - bitta oqim davom eta olmasa (chunki, masalan,
etarli, u I/U operatsiyasining natijasini kutmoqda), boshqasi protsessordan foydalanishi mumkin.

960 23-bob Parametrlilik

BlockingQueue klassi (BlockingQueue interfeysining amalga oshirilishi) biz muhokama qilamiz
23.6-bo'lim. Siz tez-tez foydalanadigan ikkita boshqa parallel API klasslari
LinkedBlockingQueue va ConcurrentHashMap (har biri 23.22-rasmda umumlashtirilgan).
Bir vaqtning o'zida API sinflari mutaxassislar tomonidan yozilgan, sinchkovlik bilan sinovdan o'tgan
va tuzatilgan, samarali ishlaydi va umumiy tuzoq va tuzoqlardan qochishingizga yordam beradi.
23.10-bo'lim Java-ning oldindan tuzilgan koncurrent to'plamlarini ko'rib chiqadi.
2. Sinxronizatsiyani boshqarmoqchi bo'lgan ilg'or dasturchilar uchun sinxronlashdan foydalaning.
chronized kalit so'z va Ob'ekt usullari kutish, xabardor va notifyAll, qaysi
biz ixtiyoriy 23.7 bo'limda muhokama qilamiz.
3. Biz faqat eng ilg'or dasturchilar Qulflar va shartlardan foydalanishlari kerak
ixtiyoriy bo'lim 23.9 va LinkedTransferQueue kabi sinflarni kiriting.
TransferQueue interfeysini amalga oshirish - biz buni 23.22-rasmda umumlashtiramiz.
2 va 3-bandlardagi ilg'or funksiyalar haqidagi munozaralarimizni o'qib chiqishingiz mumkin
yuqorida, garchi siz ulardan foydalanmasangiz ham. Biz buni tushuntiramiz, chunki:
• Ular bir vaqtning o'zida ilovalarni sinxronlashtirishni tushunish uchun mustahkam asos bo'lib xizmat qiladi.
umumiy xotiraga kirishni xronlash.
• Ushbu past darajadagi xususiyatlardan foydalanishning murakkabligini ko'rsatib, biz
Xabar sizga taassurot qoldirishga umid qilaman: Oldindan tuzilgan oddiyroq parallellik imkoniyatlaridan foydalaning.
iloji boricha qobiliyatlar.
23.2 Ip holatlari va hayot aylanishi
Istalgan vaqtda ip UMLda tasvirlangan bir nechta ip holatlaridan birida aytiladi
23.1-rasmdagi holat diagrammasi. Diagrammadagi bir nechta atamalar keyingi bo'limlarda tavsiflangan.
Biz ushbu munozarani “kaput ostida” nima bo'layotganini tushunishingizga yordam berish uchun kiritamiz
Java ko'p tarmoqli muhiti. Java bu tafsilotning ko'pini sizdan yashiradi, juda soddalashtiradi -
ko'p bosqichli ilovalarni ishlab chiqish vazifasi.

23.1-rasm | Mavzuning hayot davri UML holati diagrammasi.

vazifa
yakunlaydi

qulfni olish


xalaqit berish
I/U tugallanadi

Kutmoq
uyqu

xabar bering
hammaga xabar bering

Kutmoq


interval
muddati tugaydi
xabar bering
hammaga xabar bering

yugurish mumkin

dastur boshlanadi
ip

yangi


kiritish-chiqarish so'rovini berish

sinxronlangan kiriting


bayonot

kutish vaqti belgilangan kutish tugatildi bloklandi


23.2 Mavzu holatlari va hayot aylanishi 961



23.2.1 Yangi va ishga tushirish mumkin bo'lgan holatlar
Yangi ip o'zining hayot aylanishini yangi holatda boshlaydi. Dasturgacha shu holatda qoladi
ipni ishga tushiradi, bu esa uni ishga tushadigan holatga keltiradi. Ishlaydigan holatdagi ip
vazifasini bajarayapti, deb hisoblaydi.
23.2.2 Kutish holati
Ba'zida ishga tushiriladigan ip boshqasini kutayotganda kutish holatiga o'tadi
vazifani bajarish uchun ip. Kutilayotgan ip faqat ishga tushadigan holatga o'tadi
boshqa ish zarrachasi uni bajarishni davom ettirish haqida xabar beradi.
23.2.3 Vaqtli kutish holati
Ishlaydigan ip belgilangan vaqt oralig'ida vaqtli kutish holatiga kirishi mumkin. Bu trans-
vaqt oralig'i tugashi yoki voqea sodir bo'lganda, u ishga tushadigan holatga qaytadi
kutish sodir bo'ladi. Vaqtli kutish iplari va kutish iplari hatto protsessordan foydalana olmaydi
agar mavjud bo'lsa. Ishlaydigan ish zarrachalari, agar u taqdim etsa, vaqtni kutish holatiga o'tishi mumkin
vazifani bajarish uchun boshqa ish zarrachasini kutayotganda ixtiyoriy kutish oralig'i. Shunaqangi
ip boshqa ish zarrachasi tomonidan bildirilganda yoki vaqt belgilanganida ishga tushadigan holatga qaytadi
interval tugaydi - qaysi biri birinchi bo'lsa. Vaqtni kutishda ipni joylashtirishning yana bir usuli
holat ishga tushiriladigan ipni uyquga qo'yishdir - uxlab yotgan ip vaqtni kutishda qoladi
ma'lum bir vaqt oralig'ida (uyqu oralig'i deb ataladi), shundan so'ng u vaqtga qaytadi
ishlaydigan holat. Iplar bir lahzada bajarish uchun ishi bo'lmaganda uxlaydi. Uchun
Masalan, matn protsessorida vaqti-vaqti bilan zaxiralanadigan (ya'ni, a
nusxasi) tiklash maqsadida joriy hujjat diskka. Agar ip uxlamasa
ketma-ket zaxira nusxalari o'rtasida, u doimiy ravishda sinovdan o'tkazadigan tsiklni talab qiladi
u hujjatning nusxasini diskka yozishi kerak. Ushbu tsikl protsessor vaqtini sarflaydi
unumli ishni bajarmasdan, shuning uchun tizim ish faoliyatini kamaytiradi. Bu holda, u
ip uchun uyqu oralig'ini ko'rsatish yanada samaraliroq (bo'sh vaqt oralig'idagi davrga teng).
tessiv zahira nusxalari) va vaqtli kutish holatini kiriting. Bu ish zarracha ishga tushiriladigan mavzuga qaytariladi
uning uyqu oralig'i tugashini bildiradi, shu nuqtada u hujjatning nusxasini diskka yozadi
va vaqt belgilangan kutish holatiga qayta kiradi.
23.2.4 Bloklangan holat
Ishlaydigan ip shunday vazifani bajarishga harakat qilganda bloklangan holatga o'tadi
darhol bajarib bo'lmaydi va u bu vazifa tugaguncha vaqtincha kutishi kerak.
Misol uchun, ip kiritish/chiqarish so'rovini berganda, operatsion tizim bloklanadi
ish zarrachasini bajarishdan o'sha kiritish-chiqarish so'rovi tugaguncha - o'sha paytda bloklanadi
ip bajariladigan holatga o'tadi, shuning uchun u ishlashni davom ettirishi mumkin. Bloklangan mavzu -
protsessor mavjud bo'lsa ham foydalanmang.
23.2.5 Tugatilgan holat
Ishlaydigan ip tugatilgan holatga (ba'zan o'lik holat deb ataladi) kiradi
o'z vazifasini muvaffaqiyatli bajaradi yoki boshqa yo'l bilan tugatadi (ehtimol xato tufayli). In
23.1-rasmdagi UML holati diagrammasi, tugatilgan holatdan keyin UML yakuniy holati keladi.
(buqa ko'zi belgisi) davlat o'tishlarining tugashini ko'rsatish uchun.

962 23-bob Bir vaqtdalik

23.2.6 Ishlaydigan holatning operatsion tizim ko'rinishi
Operatsion tizim darajasida Java-ning ishga tushiriladigan holati odatda ikkita alohida holatni o'z ichiga oladi
(23.2-rasm). Operatsion tizim bu holatlarni Java Virtual Machine (JVM) dan yashiradi,
bu faqat ishlaydigan holatni ko'radi. Ip birinchi bo'lib ishga tushadigan holatga o'tganda
yangi holat, u tayyor holatda. Tayyor ip ishlaydigan holatga kiradi (ya'ni, oldingi
executing) operatsion tizim uni protsessorga tayinlaganida - dispetcherlik deb ham ataladi
ip. Aksariyat operatsion tizimlarda har bir ipga oz miqdorda protsessor beriladi
vaqt - kvant yoki vaqt chegarasi deb ataladi - bu bilan o'z vazifasini bajaradi. Qanchalik kattaligini hal qilish
kvant bo'lishi kerak operatsion tizimlar kurslarida asosiy mavzu. Qachon uning kvant sobiq
pires, ip tayyor holatga qaytadi va operatsion tizim boshqa ipni tayinlaydi
protsessorga. Tayyor va ishlayotgan holatlar o'rtasidagi o'tishlar faqat tomonidan amalga oshiriladi
operatsion tizim. JVM o'tishlarni "ko'rmaydi" - u shunchaki ipni shunday ko'radi
ishga tushirish mumkin bo'ladi va o'zaro ipni o'tkazish uchun uni operatsion tizimga qoldiradi
tayyor va ishlaydi. Operatsion tizim qaysi ipni aniqlash uchun foydalanadigan jarayon
jo'natish mavzuni rejalashtirish deb ataladi va mavzu ustuvorligiga bog'liq.

23.2.7 Mavzu ustuvorliklari va mavzuni rejalashtirish


Har bir Java ipida iplar tartibini aniqlashga yordam beruvchi ip ustuvorligi mavjud
rejalashtirilgan. Har bir yangi ip uni yaratgan ipning ustuvorligini meros qilib oladi. Norasmiy ravishda,
yuqori ustuvor mavzular dastur uchun muhimroq va protsessor ajratilishi kerak
pastroq ustuvor mavzulardan oldingi vaqt. Shunga qaramay, mavzu ustuvorliklari tartibni kafolatlay olmaydi
qaysi iplarda bajariladi.
Kontaktlarni amalga oshirish uchun Thread obyektlarini aniq yaratmaslik va foydalanmaslik tavsiya etiladi.
valyutani emas, balki Ijrochi interfeysidan foydalaning (bu 23.3-bo'limda tasvirlangan). Ip
class ba'zi foydali statik usullarni o'z ichiga oladi, siz ularni keyinchalik bobda ishlatasiz.
Aksariyat operatsion tizimlar vaqt chegarasini qo'llab-quvvatlaydi, bu esa teng ustuvorlikdagi oqimlarni ta'minlaydi
protsessorni ulashish uchun. Vaqt chegaralarisiz, har bir ip teng ustuvorlikdagi iplar to'plamida
yakuniga qadar ishlaydi (agar u ishlaydigan holatdan chiqib, kutish yoki vaqtga kirmasa
kutish holati yoki teng bo'lgan boshqa ish zarrachalaridan oldin yuqori ustuvorlik bilan uzilib qoladi
ustuvorlik amalga oshirish imkoniyatiga ega bo'ladi. Vaqtni belgilash bilan, hatto ip exe-ni tugatmagan bo'lsa ham
uning kvant muddati tugashi bilan kesish, protsessor ipdan olinadi va beriladi
Agar mavjud bo'lsa, teng ustuvorlikdagi keyingi ipga.
Operatsion tizimning ish tartibini rejalashtiruvchisi keyingi qaysi oqim ishga tushishini aniqlaydi. Bir oddiy
Thread-scheduler ilovasi har doim eng yuqori ustuvor ish zarrachalarining ishlashini ta'minlaydi
va, agar bir nechta eng yuqori ustuvor ish zarralari mavjud bo'lsa, barcha bunday oqimlarning bajarilishini ta'minlaydi
round-robin uslubida har bir kvant uchun. Bu jarayon barcha iplar ishga tushguncha davom etadi
yakunlash uchun.

23.2-rasm | Operatsion tizimning Java-ning ishga tushiriladigan holatining ichki ko'rinishi.

yugurish

yugurish mumkin

kvant muddati tugaydi

operatsion tizim


ipni yuboradi

tayyor

23.3 Executor Framework 963 yordamida mavzularni yaratish va bajarish

23.2.8 Noma'lum kechiktirish va boshi berk ko'chaga tushish


Yuqori ustunlikdagi ip tayyor holatga kirganda, operatsion tizim odatda oldindan ishlaydi
hozirda ishlayotgan ip (preemptive rejalashtirish deb nomlanuvchi operatsiya). qarab
Operatsion tizimda yuqori ustuvorliklarga ega bo'lgan oqimlarning doimiy oqimi kechiktirilishi mumkin - ehtimol
cheksiz muddatga - pastroq ustunlikdagi iplarning bajarilishi. Bunday noaniq kechiktirish
ba'zan ko'proq rang-barang ochlik deb ataladi. Operatsion tizimlar texnikadan foydalanadi
ochlikning oldini olish uchun qarish deb ataladi - ip tayyor holatda, operatsion tizimni kutmoqda
ip oxir-oqibat ishlashini ta'minlash uchun ipning ustuvorligini asta-sekin oshiradi.
Noma'lum kechiktirish bilan bog'liq yana bir muammo o'lik deb ataladi. Bu sodir bo'ladi
kutayotgan mavzu (keling, bu mavzuni 1 deb nomlaymiz) davom eta olmasa, chunki u kutmoqda (yoki
to'g'ridan-to'g'ri yoki bilvosita) boshqa mavzu uchun (keling, ushbu mavzuni2 deb nomlaymiz) davom etishi uchun, shu bilan birga
neously thread2 davom eta olmaydi, chunki u (to'g'ridan-to'g'ri yoki bilvosita) kutmoqda
Davom etish uchun mavzu1. Ikki ip bir-birini kutmoqda, shuning uchun bo'ladigan harakatlar
bajarishni davom ettirish uchun har bir ish zarrachasi hech qachon sodir bo'lmaydi.
23.3 Ijrochi bilan iplarni yaratish va bajarish
Ramka
Ushbu bo'lim ilovada bir vaqtning o'zida qanday vazifalarni bajarishni ko'rsatadi
Ijrochilar va Runnable ob'ektlari.
Runnable interfeysi bilan bir vaqtda vazifalarni yaratish
Mumkin bo'lgan vazifani belgilash uchun siz Runnable interfeysini (java.lang paketi) amalga oshirasiz
boshqa vazifalar bilan bir vaqtda bajarish. Runnable interfeysi yagona usulni e'lon qiladi
Runnable ob'ekti bajarishi kerak bo'lgan vazifani belgilaydigan kodni o'z ichiga olgan run.
Ijrochi bilan bajariladigan ob'ektlarni bajarish
Runnable-ga o'z vazifasini bajarishga ruxsat berish uchun uni bajarishingiz kerak. Ijrochi obyekti bajariladi
Runnables. Buni iplar hovuzi deb ataladigan iplar guruhini yaratish va boshqarish orqali amalga oshiradi.
Ijrochi Runnable ni bajarishni boshlaganda, Ijrochi Runnable ob'ektini chaqiradi.
yangi ish zarrachasida bajariladigan ishga tushirish usuli.
Ijrochi interfeysi Run-ni qabul qiladigan execute nomli yagona usulni e'lon qiladi.
argument sifatida foydalanish mumkin. Ijrochi o'tkazilgan har bir Runnableni o'zining bajarish usuliga tayinlaydi
ip hovuzidagi mavjud iplardan biriga. Agar mavjud mavzular bo'lmasa,
Ijrochi yangi ip yaratadi yoki ip mavjud bo'lishini kutadi va uni tayinlaydi
bajarish usuliga uzatilgan Runnable ni o'tkazing.

Dasturiy ta'minot muhandisligi kuzatuvi 23.1


Java ushbu murakkablikning ko'p qismini yashirish va qilish uchun yuqori darajadagi parallel yordamchi dasturlarni taqdim etadi
ko'p bosqichli dasturlash xatoga yo'l qo'ymaydi. Mavzu ustuvorliklari sahna ortida qo'llaniladi
operatsion tizim bilan ishlash uchun, lekin Java multithreadingdan foydalanadigan ko'pchilik dasturchilar
ip ustuvorliklarini o'rnatish va sozlash bilan bog'liq bo'lmaydi.

Portativlik bo'yicha maslahat 23.1


Mavzuni rejalashtirish platformaga bog'liq - ko'p oqimli dasturning xatti-harakati
turli Java ilovalarida farq qilishi mumkin.

964 23-bob Bir vaqtdalik

Ijrochidan foydalanish iplarni o'zingiz yaratishga nisbatan juda ko'p afzalliklarga ega. Ijrochilar mumkin
Har bir topshiriq uchun yangi ish zarrachasini yaratish uchun qo'shimcha xarajatlarni bartaraf qilish uchun mavjud mavzularni qayta ishlating va
protsessorni ta'minlash uchun iplar sonini optimallashtirish orqali ishlashni yaxshilash mumkin
band bo'lib qoladi, dastur resurslari tugaydigan darajada ko'p mavzularni yaratmasdan.

ExecutorServiceni olish uchun sinf ijrochilaridan foydalanish


ExecutorService interfeysi (java.util.concurrent paketi) Ijrochini kengaytiradi
va Ijrochining hayot aylanishini boshqarishning turli usullarini e'lon qiladi. Siz olasiz
ExecutorService ob'ekti Ijrochilar sinfida e'lon qilingan statik usullardan birini chaqirish orqali
(java.util.concurrent paketidan). Biz ExecutorService interfeysi va usulidan foydalanamiz
sinf Ijrochilar bizning misolimizda uchta vazifani bajaradi.
Runnable interfeysini amalga oshirish
Class PrintTask (23.3-rasm) Runnable (5-qator)ni amalga oshiradi, shuning uchun bir nechta PrintTasks mumkin.
bir vaqtda bajaring. UyquTime o'zgaruvchisi (8-qator) 0 dan tasodifiy butun son qiymatini saqlaydi
PrintTask konstruktorida yaratilgan 5 soniya (17-qator). Chop etish bilan ishlaydigan har bir mavzu -
Vazifa sleepTime tomonidan belgilangan vaqt davomida uxlaydi, so'ngra vazifa nomini chiqaradi
va uxlab yotganini bildiruvchi xabar.

Dasturiy ta'minot muhandisligi kuzatuvi 23.2


To'g'ridan-to'g'ri iplarni yaratish mumkin bo'lsa-da, dan foydalanish tavsiya etiladi
Runnable obyektlarining bajarilishini boshqarish uchun ijrochi interfeysi.

1 // 23.3-rasm: PrintTask.java


2 // PrintTask klassi 0 dan 5 soniyagacha tasodifiy vaqt davomida uxlaydi
3 import java.security.SecureRandom;
4
5 ommaviy sinf PrintTask
6 {
7 ta xususiy statik yakuniy SecureRandom generator = yangi SecureRandom();
8 shaxsiy yakuniy int uyqu vaqti; // mavzu uchun tasodifiy uyqu vaqti
9 xususiy yakuniy String taskName;
10
11 // konstruktor
12 ommaviy chop etish vazifasi (String vazifasi nomi)
13 {
14 this.taskName = taskName;
15
16 // 0 va 5 soniya oralig'ida tasodifiy uyqu vaqtini tanlang
17 sleepTime = generator.nextInt(5000); // millisekundlar
18 }
19
20 // ishga tushirish usuli ip bajaradigan kodni o'z ichiga oladi
21
22 {
23 urinib ko'ring // uyqu vaqti uchun ipni uyqu rejimiga qo'ying
24 {
25 System.out.printf("%s %d millisekund uyquga ketadi.%n",
26 vazifa nomi, uyqu vaqti);

23.3-rasm | PrintTask klassi 0 dan 5 soniyagacha tasodifiy vaqt davomida uxlaydi. (2-qismning 1-qismi.)

Runnable dasturini amalga oshiradi

public void run()


23.3 Executor Framework 965 yordamida mavzularni yaratish va bajarish

PrintTask ish zarrachasi PrintTaskning ishga tushirish usulini chaqirganda bajariladi. 25–26 qatorlar
hozir bajarilayotgan vazifa nomini va vazifa ekanligini ko'rsatadigan xabarni ko'rsatish
uyqu vaqti millisekundlari uchun uyquga ketish. 27-qator sinfning statik uyqu rejimini chaqiradi
Belgilangan vaqt oralig'ida ipni vaqtli kutish holatiga joylashtirish uchun ip. Da
bu nuqtada ip protsessorni yo'qotadi va tizim boshqa ipni bajarishga imkon beradi.
Ip uyg'onganda, u ishlaydigan holatga qaytadi. PrintTask tayinlanganda
protsessorga yana 36-satr topshiriq uxlab yotganligini bildiruvchi xabarni chiqaradi,
keyin usulni ishga tushirish tugaydi. 29-33-qatorlarda ushlash talab qilinadi, chunki usul uyqu
Agar uxlab yotgan ip bo'lsa, InterruptedException turidagi tekshirilgan istisnoni tashlashi mumkin
uzilish usuli deyiladi.
Mavzu InterruptedExceptions bilan ishlasin
Amaldagi ish zarrachasi InterruptedExceptions bilan ishlashga ruxsat berish yaxshi amaliyot hisoblanadi.
Odatda, siz buni amalga oshirasiz, deb e'lon qilish usuli run o'rniga istisno qiladi
istisnoni qo'lga olish. Biroq, 11-bobni eslang, agar siz biron bir usulni bekor qilsangiz,
od, tashlashlar faqat bir xil istisno turlarini yoki istisnoning kichik to'plamini o'z ichiga olishi mumkin
original usulning otish bandida e'lon qilingan turlar. Runnable usuli ishga tushirilmaydi
a throws bandi o'zining dastlabki deklaratsiyasida, shuning uchun biz 21-qatorda bittasini taqdim eta olmaymiz. Ta'minlash uchun
bajaruvchi ip InterruptedException ni qabul qilsa, 32-satr birinchi navbatda ref-ni oladi.
statik usul joriyThreadni chaqirish orqali hozirda bajarilayotgan Threadga o'ting, keyin
InterruptedException ni oqimga etkazish uchun Threadning uzilish usulidan foydalanadi
ip.1
PrintTasks bajaradigan mavzularni boshqarish uchun ExecutorService-dan foydalanish
23.4-rasmda PrintTasks ni bajaruvchi iplarni boshqarish uchun ExecutorService obyektidan foydalaniladi.
(23.3-rasmda belgilanganidek). 11–13 qatorlar bajarish uchun uchta Chop etish vazifasini yaratadi va nomlaydi. Chiziq
18 ExecutorServiceni olish uchun newCachedThreadPool usulidan foydalanadi.
ilovaga kerak bo'lgan yangi mavzularni yaratishga qodir. Bu iplar
ExecutorService tomonidan Runnablesni bajarish uchun foydalaniladi.

27
28 }


29 catch (InterruptedException istisno)
30 {
31 istisna.printStackTrace();
32 Thread.currentThread().interrupt(); // mavzuni qaytadan uzish
33 }
34
35 // vazifa nomini chop etish
36 System.out.printf("%s uxlab qoldi%n", vazifa nomi);
37 }
38 } // yakuniy sinf PrintTask

1. Tarmoq uzilishlarini boshqarish bo'yicha batafsil ma'lumot uchun Java Concurrency ning 7-bobiga qarang


Brayan Goetz va boshqalarning amaliyoti, Addison-Wesley Professional, 2006 yil.

23.3-rasm | PrintTask klassi 0 dan 5 soniyagacha tasodifiy vaqt davomida uxlaydi. (2-qismning 2-qismi.)

Thread.sleep(sleepTime); // ipni uyqu holatiga qo'ying

966 23-bob Bir vaqtdalik

1 // 23.4-rasm: TaskExecutor.java
2 // Runnables-ni bajarish uchun ExecutorService-dan foydalanish.
3 import java.util.concurrent.Executors;
4 import java.util.concurrent.ExecutorService;
5
6 ommaviy sinf TaskExecutor
7 {
8 ta umumiy statik bekor asosiy(String[] args)
9 {
10 // har bir ishga tushirishni yarating va nomlang
11 PrintTask task1 = yangi PrintTask("task1");
12 PrintTask task2 = yangi PrintTask("task2");
13 PrintTask task3 = yangi PrintTask("task3");
14
15 System.out.println("Boshlovchi ijrochi");
16
17 // mavzularni boshqarish uchun ExecutorService yarating
18
19
20 // uchta PrintTasksni ishga tushiring
21
22
23
24
25 // ExecutorService-ni o'chirib qo'ying - u mavzularni qachon o'chirishni hal qiladi
26
27
28 System.out.printf("Vazifalar boshlandi, asosiy tugaydi.%n%n");
29 }
30 } // tugatish sinfi TaskExecutor

Boshlovchi ijrochi


Vazifalar boshlandi, asosiy tugaydi

vazifa1 4806 millisekund uyquga ketadi


task2 2513 millisekund uyquga ketadi
task3 1132 millisekund uyquga ketadi
3-topshiriq uxlab yotgan holda bajarildi
2-topshiriq uxlab yotgan holda bajarildi
1-topshiriq uxlab yotgan holda bajarildi

Boshlovchi ijrochi


task1 3161 millisekund uyquga ketadi.
task3 532 millisekund uyquga ketadi.
task2 3440 millisekund davomida uxlaydi.
Vazifalar boshlandi, asosiy tugaydi.

3-topshiriq uxlab yotgan holda bajarildi


1-topshiriq uxlab yotgan holda bajarildi
2-topshiriq uxlab yotgan holda bajarildi

23.4-rasm | Runnablesni bajarish uchun ExecutorService dan foydalanish.

ExecutorService executorService = Executors.newCachedThreadPool();

excutorService.execute(task1); // 1-topshiriqni boshlash


execcutorService.execute(task2); // 2-topshiriqni boshlash
excutorService.execute(task3); // 3-topshiriqni boshlash

excutorService.shutdown();


23.4 Mavzuni sinxronlashtirish 967



21–23-qatorlar har biri ExecutorServicening bajarish usulini chaqiradi, bu esa uni bajaradi.
Ishga tushirish mumkin bo'lgan argument (bu holda PrintTask) kelajakda bir muncha vaqt. Belgilangan vazifa
ExecutorService iplar havzasidagi mavzulardan birida, yangi ipda bajarilishi mumkin
uni bajarish uchun yaratilgan yoki bajarish usulini chaqirgan ish zarrachasida - ExecutorSer-
vitse bu tafsilotlarni boshqaradi. Har bir chaqiruvdan darhol natijalarni bajarish usuli—
dastur har bir PrintTask tugashini kutmaydi. 26-qator ExecutorService-ni chaqiradi
Ijrochi xizmatiga yangi vazifalarni qabul qilishni to'xtatish haqida xabar beradigan usulni o'chirish, lekin
allaqachon topshirilgan vazifalarni bajarishda davom etadi. Oldindan taqdim etilganlarning barchasi bir marta
Runnables tugallandi, ExecutorService tugaydi. 28-qator xabarni chiqaradi
vazifalar boshlanganligini va asosiy ip o'z bajarilishini yakunlayotganini ko'rsatadi.
Asosiy mavzu
Main'dagi kod JVM tomonidan yaratilgan asosiy oqimda ishlaydi. Kod ichida
PrintTask ning ishga tushirish usuli (23.3-rasmning 21-37-qatorlari) har doim Ijrochi bajaradi.
har bir PrintTask-ni ishga tushiradi - bu ular ExecutorSer-ga o'tkazilgandan keyin bir muncha vaqt o'tgach.
vitse-ning bajarish usuli (23.4-rasm, 21-23-qatorlar). Asosiy tugagach, dastur u-
self ishlashni davom ettiradi, chunki hali bajarilishi kerak bo'lgan vazifalar mavjud. Dastur
bu vazifalar tugamaguncha tugamaydi.
Namuna natijalari
Namunaviy natijalar ip uyqu rejimiga o'tayotganda har bir vazifaning nomi va uxlash vaqtini ko'rsatadi. The
uyqu vaqti eng qisqa bo'lgan ip ko'p hollarda birinchi bo'lib uyg'onadi, bu uyqu tugaganligini ko'rsatadi-
ing va tugaydi. 23.8-bo'limda biz oldini olish mumkin bo'lgan ko'p tarmoqli muammolarni muhokama qilamiz
birinchi uyg'onishdan eng qisqa uyqu vaqtiga ega ip. Birinchi chiqishda asosiy
PrintTasks har qanday nomlari va uyqu vaqtlarini chiqarishdan oldin ip tugaydi. Bu
PrintTasks dan birortasi imkoniyatga ega bo'lgunga qadar asosiy mavzu tugashini ko'rsatadi
yugurmoq. Ikkinchi chiqishda barcha PrintTasks o'z nomlarini va uyqu vaqtlarini chiqaradi
asosiy mavzu tugashidan oldin. Bu PrintTasks avvalroq bajarila boshlaganini ko'rsatadi
asosiy mavzu tugatildi. Shuningdek, ikkinchi misolda e'tibor bering, vazifa 3 ga o'tadi
2-topshiriqni ExecutorService-ning bajarilishiga topshirgan bo'lsak ham, oxirgi vazifadan oldin uxlang
3-topshiriqdan oldingi usul. Bu biz qanday tartibni oldindan aytib bera olmasligimizni ko'rsatadi
Vazifalar, ularning yaratilgan va boshlangan tartibini bilsak ham, bajarila boshlaydi.
Oldindan rejalashtirilgan vazifalar tugashini kutish
Bajariladigan vazifalarni rejalashtirganingizdan so'ng, odatda vazifalar tugashini kutishingiz kerak bo'ladi.
Masalan, siz topshiriq natijalaridan foydalanishingiz mumkin. Qo'ng'iroq qilish usuli o'chirilgandan so'ng, siz qo'ng'iroq qilishingiz mumkin
Rejalashtirilgan vazifalar bajarilishini kutish uchun ExecutorService usuli awaitTermination. Biz
buni 23.7-rasmda ko'rsating. Biz ataylab 23.4-rasmda kutishni tugatish deb atamadik
asosiy oqim tugagandan so'ng dastur ishlashni davom ettirishi mumkinligini ko'rsatish uchun.
23.4 Mavzuni sinxronlashtirish
Agar bir nechta mavzular ob'ektni baham ko'rsa va u ulardan biri yoki bir nechtasi tomonidan o'zgartirilsa,
Agar umumiy ob'ektga kirish imkoni bo'lmasa, minate natijalar paydo bo'lishi mumkin (misollarda ko'rib chiqamiz).
to'g'ri boshqariladi. Agar bitta mavzu umumiy ob'ektni va boshqasini yangilash jarayonida bo'lsa
thread ham uni yangilashga harakat qiladi, qaysi ip yangilanishi kuchga kirishi noma'lum. Xuddi shunday, agar
bitta mavzu umumiy ob'ektni yangilash jarayonida va boshqa mavzu uni o'qishga harakat qilmoqda,
o'qish chizig'i eski qiymatni yoki yangisini ko'rishi noaniq. Bunday holda

968 23-bob Bir vaqtdalik

hollarda, dasturning xatti-harakatlariga ishonib bo'lmaydi - ba'zida dastur ishlab chiqaradi
to'g'ri natijalar, va ba'zan u bo'lmaydi, va baham ko'rgan hech qanday ko'rsatkich bo'lmaydi
ob'ekt noto'g'ri manipulyatsiya qilingan.
Muammoni bir vaqtning o'zida faqat bitta mavzuni kodga eksklyuziv kirishni berish orqali hal qilish mumkin
umumiy ob'ektga kirish imkonini beradi. Bu vaqt ichida ob'ektga kirishni xohlaydigan boshqa mavzular
kutishmoqda. Eksklyuziv ruxsatga ega bo'lgan ip ob'ektga kirishni tugatganda, ulardan biri
kutish iplarini davom ettirishga ruxsat beriladi. Bu jarayon, ip sinxronizatsiyasi deb ataladi,
bir vaqtning o'zida bir nechta oqimlar orqali umumiy ma'lumotlarga kirishni ta'minlaydi. Bunda mavzularni sinxronlash orqali
Shunday qilib, umumiy ob'ektga kiruvchi har bir mavzu boshqa barcha mavzularni o'z ichiga olmaydi
buni bir vaqtning o'zida qilishdan - bu o'zaro istisno deb ataladi.

23.4.1 O'zgarmas ma'lumotlar


Darhaqiqat, ish zarralarini sinxronlashtirish faqat umumiy o'zgaruvchan ma'lumotlar, ya'ni ma'lumotlar uchun kerak
hayoti davomida o'zgarishi mumkin. O'zgarmas umumiy o'zgarmas ma'lumotlar bilan, u o'zgarmaydi
boshqa ipning manipulyatsiyasi natijasida ip eski yoki noto'g'ri qiymatlarni ko'rishi mumkin.
bu ma'lumotlarning asosi.
O'zgarmas ma'lumotlarni iplar bo'ylab baham ko'rganingizda, tegishli ma'lumotlar maydonlarini e'lon qiling
final o'zgaruvchilar qiymatlari ishga tushirilgandan keyin o'zgarmasligini ko'rsatadi.
Bu umumiy ma'lumotlarning tasodifiy o'zgarishini oldini oladi, bu esa mavzuni buzishi mumkin
xavfsizlik. Ob'ekt havolalarini yakuniy deb belgilash havola o'zgarmasligini bildiradi, lekin u
havola qilingan ob'ektning o'zgarmasligiga kafolat bermaydi - bu butunlay ob'ektga bog'liq
xususiyatlari. Biroq, o'zgarmaydigan havolalarni belgilash hali ham yaxshi amaliyotdir
final.

23.4.2 Monitorlar


Sinxronizatsiyani amalga oshirishning keng tarqalgan usuli Java-ning o'rnatilgan monitorlaridan foydalanishdir. Har bir ob'ekt
monitor va monitor blokirovkasi (yoki ichki qulf) mavjud. Monitor uning ob'ektini ta'minlaydi
monitor blokirovkasi istalgan vaqtda maksimal faqat bitta ip tomonidan ushlab turiladi. Monitorlar va monitorlar
Shunday qilib, qulflar o'zaro istisno qilish uchun ishlatilishi mumkin. Agar operatsiya bajarishni talab qilsa
operatsiya bajarilayotganda qulfni ushlab turish uchun ip qulfni olishdan oldin kerak
operatsiyani davom ettirish. Operatsiyani bajarishga urinayotgan boshqa iplar
birinchi ip qulfni bo'shatmaguncha bir xil qulf bloklanadi, shu nuqtada
bloklangan iplar qulfni olishga harakat qilishi va operatsiyani davom ettirishi mumkin.
Kod blokini bajarish uchun ipning monitor blokirovkasini ushlab turishi kerakligini belgilash uchun kod
sinxronlashtirilgan bayonotga joylashtirilishi kerak. Bunday kod tomonidan himoyalangan deb aytiladi
monitor blokirovkasi; Himoyalangan bayonotlarni bajarish uchun ip qulfni olishi kerak. oy -
u bir vaqtning o'zida faqat bitta ish zarrachasini sinxronlashtirilgan holatda bajarishga imkon beradi.
bir xil ob'ektda qulflanadigan mentlar, chunki bir vaqtning o'zida faqat bitta ip monitor qulfini ushlab turishi mumkin.
Sinxronlashtirilgan bayonotlar sinxronlashtirilgan kalit so'z yordamida e'lon qilinadi:

Dasturiy ta'minot muhandisligi kuzatuvi 23.3


O'zgartirishni kutmagan ma'lumotlar maydonlarini har doim yakuniy deb e'lon qiling. Bu ibtidoiy o'zgaruvchilar
yakuniy deb e'lon qilinadi, ular iplar bo'ylab xavfsiz tarzda almashish mumkin. E'lon qilingan ob'ekt havolasi
final sifatida u nazarda tutilgan ob'ekt to'liq qurilgan va undan oldin ishga tushirilishini ta'minlaydi
dastur tomonidan ishlatiladi va havolaning boshqa ob'ektga ishora qilishiga yo'l qo'ymaydi.

23.4 Mavzuni sinxronlashtirish 969

bu erda ob'ekt - monitor blokirovkasi olinadigan ob'ekt; obyekt odatda bu if
bu sinxronlashtirilgan bayonot paydo bo'ladigan ob'ekt. Agar bir nechta sinxronlashtirilgan bo'lsa
turli mavzulardagi bayonotlar bir vaqtning o'zida ob'ektda bajarishga harakat qilmoqda, faqat
ulardan biri ob'ektda faol bo'lishi mumkin - boshqa barcha iplar sinxronlashtirishga harakat qilmoqda.
Xuddi shu ob'ekt bo'yicha xronlashtirilgan bayonot bloklangan holatda joylashtiriladi.
Sinxronlashtirilgan bayonot bajarilishini tugatgandan so'ng, ob'ekt monitor blokirovkasi hisoblanadi
chiqarilgan va sinxronlashtirilgan bayonotni kiritishga urinayotgan bloklangan mavzulardan biri mumkin
davom etish uchun qulfni olishga ruxsat bering. Java ham sinxronlashtirilgan usullarga ruxsat beradi. Oldin
bajarilayotganda, sinxronlashtirilgan namuna usuli ob'ektda qulfni olishi kerak
usulni chaqirish uchun ishlatiladi. Xuddi shunday, statik sinxronlashtirilgan usul ham qulfni olishi kerak
usulni chaqirish uchun ishlatiladigan sinfda.

23.4.3 Sinxronlanmagan o'zgaruvchan ma'lumotlarni almashish


Birinchidan, biz ob'ektni to'g'ri sinxronlashsiz iplar bo'ylab almashish xavfini ko'rsatamiz.
nizatsiya. Ushbu misolda (23.5–23.7-rasmlar) ikkita Runnables bitta faylga havolalarni saqlaydi.
butun sonli massiv. Har bir Runnable massivga uchta qiymat yozadi va keyin tugaydi. Bu mumkin
zararsiz ko'rinadi, lekin agar massivni ishlatmasdan boshqarilsa, bu xatolarga olib kelishi mumkinligini ko'ramiz.
sinxronizatsiya.
SimpleArray sinfi
SimpleArray ob'ekti (23.5-rasm) bir nechta iplar bo'ylab taqsimlanadi. SimpleArray bo'ladi
ushbu iplarni int qiymatlarini massivga joylashtirishga ruxsat bering (9-satrda e'lon qilingan). 10-qator ishga tushiriladi
bo'lishi kerak bo'lgan massiv elementini aniqlash uchun foydalaniladigan writeIndex o'zgaruvchisi
keyingisiga yoziladi. Konstruktor (13-16 qatorlar) kerakli o'lchamdagi butun sonli massivni yaratadi.

sinxronlangan (ob'ekt)


{
bayonotlar
}

Dasturiy ta'minot muhandisligi kuzatuvi 23.4


O'zaro istisno qilish uchun sinxronlashtirilgan blokdan foydalanish dizaynga misoldir
Java Monitor Pattern deb nomlanuvchi naqsh (Java Concurrency ning 4.2.1 bo'limiga qarang).
Brayan Goetzning amaliyoti va boshqalar, Addison-Wesley Professional, 2006).

1 // 23.5-rasm: SimpleArray.java


2 // Bir nechta mavzular bilan bo'lishish uchun butun sonli massivni boshqaradigan sinf.
3 import java.security.SecureRandom;
4 import java.util.Arrays;
5
6 ommaviy sinf SimpleArray // DIQQAT: TIRISH XAVFSIZ EMAS!
7 {
8 ta xususiy statik yakuniy SecureRandom generator = yangi SecureRandom();
9 ta xususiy yakuniy int[] massivi; // umumiy butun sonlar massivi
10 xususiy int writeIndex = 0; // yozish uchun keyingi elementning umumiy indeksi
11

23.5-rasm | Bir nechta iplar tomonidan bo'lishish uchun butun sonli massivni boshqaradigan sinf. (Diqqat: The


shakllarga misol. 23.5–23.7 ip xavfsiz emas.) (2-qismning 1-qismi.)

970 23-bob Bir vaqtdalik

Qo'shish usuli (19-40 qatorlar) massiv oxiriga yangi qiymatlarni kiritish imkonini beradi.
21-qator joriy writeIndex qiymatini saqlaydi. 26-qator qo'shishni chaqiradigan ipni qo'yadi
0 dan 499 millisekundgacha bo'lgan tasodifiy intervalgacha uxlash. Bu muammolarni hal qilish uchun amalga oshiriladi
umumiy o'zgaruvchan ma'lumotlarga sinxronlashtirilmagan kirish bilan bog'liq. Ipdan keyin
uxlab yotgan bo'lsa, 34-satr element spetsifikatsiyasida massivga qo'shish uchun o'tkazilgan qiymatni kiritadi.
pozitsiyasiga qarab belgilanadi. 35–36 qatorlar bajarilayotgan ip nomini ko'rsatuvchi xabarni chiqaradi,
massivga kiritilgan qiymat va u kiritilgan joy. Ifodasi
Thread.currentThread().getName() (36-satr) birinchi navbatda hozirga havola oladi.
Thread-ni bajarib, uning nomini olish uchun o'sha Threadning getName usulidan foydalanadi. 38-qator
writeIndex ni oshiradi, shunda qo'shiladigan keyingi qo'ng'iroq massivning keyingi qismiga qiymat kiritadi
element. 43–46 qatorlar toString ning String tasvirini yaratish uchun usulini bekor qiladi
massiv tarkibi.

12 // berilgan o'lchamdagi SimpleArray ni tuzing


13 ommaviy SimpleArray (int hajmi)
14 {
15 massiv = new int[size];
16 }
17
18 // umumiy massivga qiymat qo'shing
19 ommaviy bekor qo'shish (int qiymati)
20 {
21
22
23 urinib ko'ring
24 {
25 // ipni 0-499 millisekundga uyqu rejimiga qo'ying
26 Thread.sleep(generator.nextInt(500));
27 }
28 catch (InterruptedException oldingi)
29 {
30 Thread.currentThread().interrupt(); // mavzuni qaytadan uzish
31 }
32
33
34
35 System.out.printf("%s %d.%n elementga %2d yozdi",
36 Thread.currentThread().getName(), qiymat, pozitsiya);
37
38
39 System.out.printf("Keyingi yozish indeksi: %d%n", writeIndex);
40 }
41
42 // umumiy tamsayı massivining mazmunini chiqarish uchun ishlatiladi
43 umumiy string toString()
44 {
45 qaytish Arrays.toString(massiv);
46 }
47 } // oxirgi sinf SimpleArray

23.5-rasm | Bir nechta iplar tomonidan bo'lishish uchun butun sonli massivni boshqaradigan sinf. (Diqqat: The


shakllarga misol. 23.5–23.7 ip xavfsiz emas.) (2-qismning 2-qismi.)

int pozitsiyasi = writeIndex; // yozish indeksini saqlash

// tegishli elementga qiymat qo'ying
massiv [pozitsiya] = qiymat;

++writeIndex; // keyingi yoziladigan elementning o'sish indeksi


23.4 Mavzuni sinxronlashtirish 971

Class ArrayWriter
Class ArrayWriter (23.6-rasm) ishga kirish uchun vazifani aniqlash uchun Runnable interfeysini amalga oshiradi.
SimpleArray ob'ektida qiymatlarni kiritish. Konstruktor (10–14-qatorlar) ikkita argumentni oladi.
ments - bu vazifa SimpleArray-ga kiritadigan birinchi qiymat bo'lgan butun son qiymati
obyekti va SimpleArray obyektiga havola. 20-qator qo'shimcha usulini chaqiradi
SimpleArray obyekti. bilan boshlanadigan ketma-ket uchta tamsayıdan keyin vazifa bajariladi
startValue SimpleArray obyektiga kiritiladi.

Class SharedArrayTest


Class SharedArrayTest (23.7-rasm) ikkita ArrayWriter vazifasini bajaradi.
bitta SimpleArray obyekti. 12-qator olti elementli SimpleArray obyektini quradi. Chiziqlar
15–16 ikkita yangi ArrayWriter vazifasini yaratadi, ulardan biri Simple-ga 1–3 qiymatlarini joylashtiradi.
Massiv obyekti va 11–13 qiymatlarni joylashtiradigan obyekt. 19–21-qatorlar IjrochiSer-ni yaratadi.
vice va ikkita ArrayWriter-ni bajaring. 23-qator ExecutorService-ni chaqiradi
Qo'shimcha vazifalarni ishga tushirishni oldini olish va ilovani yoqish uchun o'chirish usuli
joriy bajarilayotgan vazifalar bajarilishini tugatgandan so'ng tugatish.

1 // 23.6-rasm: ArrayWriter.java


2 // Boshqa Runnables bilan bo'lingan massivga butun sonlarni qo'shadi
3 import java.lang.Runnable;
4
5 ommaviy sinf ArrayWriter Runnable dasturini amalga oshiradi
6 {
7 xususiy yakuniy SimpleArray shareSimpleArray;
8 xususiy final int startValue;
9
10 ta umumiy ArrayWriter (int qiymati, SimpleArray massivi)
11 {
12 startValue = qiymat;
13 sharedSimpleArray = massiv;
14 }
15
16 ommaviy bekor yugurish()
17 {
18 uchun (int i = startValue; i < startValue + 3; i++)
19 {
20 sharedSimpleArray.add(i); // umumiy massivga element qo'shish
21 }
22 }
23 } // ArrayWriter sinfining oxiri

23.6-rasm | Boshqa Runnables bilan bo'lingan massivga butun sonlarni qo'shadi. (Diqqat: misol


Anjir. 23,5–23,7 ip xavfsiz emas.)

1 // 23.7-rasm: SharedArrayTest.java


2 // Umumiy SimpleArrayga elementlar qo'shish uchun ikkita Runnable dasturini bajarish.
3 import java.util.concurrent.Executors;

23.7-rasm | Umumiy massivga elementlar qo'shish uchun ikkita Runnable dasturini bajarish. (Diqqat: misol


Anjirlardan. 23.5–23.7 ip xavfsiz emas.) (3-qismning 1-qismi)

972 23-bob Parametrlilik

4 import java.util.concurrent.ExecutorService;
5 import java.util.concurrent.TimeUnit;
6
7 umumiy sinf SharedArrayTest
8 {
9 umumiy statik bekor asosiy(String[] arg)
10 {
11 // umumiy ob'ektni yarating
12 SimpleArray sharedSimpleArray = yangi SimpleArray(6);
13
14 // umumiy SimpleArrayga yozish uchun ikkita vazifa yarating
15 ArrayWriter writer1 = yangi ArrayWriter(1, sharedSimpleArray);
16 ArrayWriter writer2 = yangi ArrayWriter(11, sharedSimpleArray);
17
18 // vazifalarni ExecutorService bilan bajaring
19 ExecutorService executorService = Executors.newCachedThreadPool();
20 ijrochiService.execute(yozuvchi1);
21 execcutorService.execute(writer2);
22
23 execcutorService.shutdown();
24
25 urinib ko'ring
26 {
27 // ikkala yozuvchi ham bajarishni tugatguncha 1 daqiqa kuting
28
29
30
31 agar (vazifalar tugadi)
32 {
33 System.out.printf("%nSimpleArray tarkibi:%n");
34 System.out.println(sharedSimpleArray); // tarkibni chop etish
35 }
yana 36
37 System.out.println(
38 "Vazifalar tugashini kutish vaqti tugadi.");
39 }
40 ta tutish (InterruptedException oldingi)
41 {
42 ex.printStackTrace();
43 }
44 } // asosiyni tugatish
45 } // yakuniy sinf SharedArrayTest

Keyingi yozish indeksi: 1


pool-1-thread-1 element 1ga 2 yozdi.
Keyingi yozish indeksi: 2
pool-1-thread-1 2-elementga 3 yozdi.
Keyingi yozish indeksi: 3

Keyingi yozish indeksi: 4

23.7-rasm | Umumiy massivga elementlar qo'shish uchun ikkita Runnable dasturini bajarish. (Diqqat: misol
Anjirlardan. 23.5–23.7 ip xavfsiz emas.) (3-qismning 2-qismi)

mantiqiy topshiriqlarEnded =


excutorService.awaitTermination(1, TimeUnit.MINUTES);

pool-1-thread-1 0 elementiga 1 yozdi.

Birinchi pool-1-thread-1 qiymatini yozdi
1-dan 0-elementga. Keyinchalik hovuz-1-ip-2
0 elementiga 11 qiymatini yozdi, shunday qilib
ilgari saqlangan qiymatni qayta yozish.

pool-1-thread-2 0 elementiga 11 ni yozdi.


23.4 Mavzuni sinxronlashtirish 973



ExecutorService usuli tugashni kutmoqda
Eslatib o'tamiz, ExecutorService usulini o'chirish darhol qaytariladi. Shunday qilib, har qanday kod
ExecutorService usuliga qo'ng'iroq qilingandan keyin paydo bo'ladi 23-qatorda o'chirish exe- davom etadi
asosiy ip hali ham protsessorga tayinlangan ekan, kesish. Biz Sim-ni chiqarmoqchimiz.
pleArray ob'ekti iplar o'z vazifalarini bajargandan so'ng sizga natijalarni ko'rsatish uchun. Demak, bizga kerak
SimpleArray ob'ektining asosiy chiqishidan oldin mavzular tugashini kutadigan dastur
ob'ektning mazmuni. Interface ExecutorService awaitTermination usulini taqdim etadi
bu maqsad. Ushbu usul barcha vazifalar bajarilganda boshqaruvni chaqiruvchiga qaytaradi
ExecutorService tugallandi yoki belgilangan vaqt tugashi bilan. Agar barcha vazifalar birlashtirilgan bo'lsa,
awaitTermination muddati tugashidan oldin to'langan bo'lsa, bu usul haqiqatni qaytaradi; aks holda qaytib keladi
yolg'on. awaitTermination uchun ikkita argument vaqt tugashi qiymati va birligini ifodalaydi
TimeUnit sinfidagi doimiy bilan belgilangan o'lchov (bu holda, TimeUnit.MINUTES).
WaitTermination usuli, agar chaqiruvchi ip bo'lsa, InterruptedException ni chiqaradi
boshqa mavzular tugashini kutayotganda uzilib qoldi. Chunki biz bu istisnoni ushlaymiz
Ilovaning asosiy usulida asosiy mavzuni qayta uzib qo'yishning hojati yo'q
dastur asosiy tugashi bilanoq tugatiladi.
Ushbu misolda, agar ikkala vazifa ham kutish tugashidan oldin tugasa, 34-qator
SimpleArray ob'ektining mazmunini ko'rsatadi. Aks holda, 37–38 qatorlar quyidagi xabarni ko'rsatadi:
Kutish tugash vaqti tugashidan oldin vazifalar bajarilmaganligini bildiradi.
Namuna dastur chiqishi
23.7-rasmning chiqishida yuzaga kelishi mumkin bo'lgan muammolar (chiqishda ta'kidlangan) ko'rsatilgan
umumiy o'zgaruvchan ma'lumotlarga kirishni sinxronlashda xatolik. Keyin 0 elementiga 1 qiymati yozildi
keyinroq 11 qiymati ustiga yoziladi. Shuningdek, writeIndex 3 ga oshirilganda, hech narsa bo‘lmadi.
bosilgan massivning ushbu elementidagi 0 bilan ko'rsatilgandek, ushbu elementga yoziladi.
Eslatib o'tamiz, biz birgalikdagi operatsiyalar o'rtasida Thread usuli uyqu qo'ng'iroqlarini qo'shdik
o'zgaruvchan ma'lumotlar ipni rejalashtirishning oldindan aytib bo'lmaydiganligini ta'kidlash va ehtimollikni oshirish uchun
noto'g'ri ishlab chiqarish qopqog'i. Ushbu operatsiyalarni davom ettirishga ruxsat berilgan bo'lsa ham
ularning normal tezligi, siz hali ham dasturning chiqishida xatolarni ko'rishingiz mumkin. Biroq, zamonaviy
protsessorlar SimpleArray usulining oddiy operatsiyalarini juda tez bajara oladi
Ushbu usulni bir vaqtda bajarayotgan ikkita ish zarrachasidan kelib chiqqan xatolarni ko'rmasligingiz mumkin.
Agar siz dasturni o'nlab marta sinab ko'rgan bo'lsangiz ham ijaraga olingan. Ko'p muammolardan biri
tishli dasturlash xatolarni aniqlaydi - ular juda kamdan-kam hollarda va oldindan aytib bo'lmaydigan tarzda sodir bo'lishi mumkin
Sinov paytida buzilgan dastur noto'g'ri natijalar bermasligi, bu illyuziyani yaratadi
dastur to'g'ri. Bu ishlov beradigan oldindan belgilangan to'plamlardan foydalanish uchun ko'proq sababdir
siz uchun sinxronizatsiya.

pool-1-thread-2 4-elementga 12 yozdi.


Keyingi yozish indeksi: 5
pool-1-thread-2 5-elementga 13 yozdi.
Keyingi yozish indeksi: 6

SimpleArray tarkibi:


[11, 2, 3, 0, 12, 13]

23.7-rasm | Umumiy massivga elementlar qo'shish uchun ikkita Runnable dasturini bajarish. (Diqqat: misol


Anjirlardan. 23.5–23.7 ip xavfsiz emas.) (3-qismning 3-qismi.)

974 23-bob Bir vaqtning o'zida



23.4.4 Sinxronlashtirilgan o'zgaruvchan ma'lumotlarni almashish - operatsiyalarni bajarish
Atom
23.7-rasmdagi chiqish xatolarini umumiy ob'ekt Simple-
Massiv, ish zarrachalari xavfsiz emas — SimpleArray bir vaqtning o'zida foydalanilsa, xatolarga moyil bo'ladi
bir nechta iplar orqali. Muammo writeIndex qiymatini saqlaydigan add usulida yotadi,
ushbu elementga yangi qiymat qo'yadi, keyin writeIndexni oshiradi. Bunday usul bo'lardi
bitta oqimli dasturda hech qanday muammo tug'dirmaydi. Biroq, agar bitta ip qiymatni olsa
writeIndex dan boshqa bir ish zarracha paydo boʻlmasligi va koʻpayishiga kafolat yoʻq
writeIndex birinchi ish zarrachasi qatorga qiymat qo'yish imkoniyatiga ega bo'lishidan oldin. Agar bu sodir bo'lsa -
qalamlar, birinchi ip writeIndex-ning eskirgan qiymatiga asoslangan massivga yoziladi.
endi haqiqiy emas qiymat. Yana bir imkoniyat shundaki, bitta ip qiymatni olishi mumkin
writeIndex ning boshqa ipdan keyin elementi massivga qo'shiladi, lekin writeIndex bo'lishidan oldin
oshirilgan. Bu holatda ham birinchi ish zarrachalari massivga yaroqsizga asoslanib yozadi
writeIndex uchun qiymat.
SimpleArray ip xavfsiz emas, chunki u har qanday miqdordagi iplarni o'qish va o'zgartirish imkonini beradi
bir vaqtning o'zida almashiladigan o'zgaruvchan ma'lumotlar, bu xatolarga olib kelishi mumkin. SimpleArray ishini xavfsiz qilish uchun,
uning umumiy o'zgaruvchan ma'lumotlariga bir vaqtning o'zida ikkita oqim kira olmasligini ta'minlashimiz kerak.
Bir ish zarrachasi writeIndexni saqlash jarayonida, massivga qiymat qo'shish va
writeIndex-ni oshirgan holda, boshqa hech qanday mavzu writeIndex yoki qiymatini o'qiy olmaydi yoki o'zgartira olmaydi
ushbu uchta operatsiya davomida istalgan nuqtada massiv tarkibini o'zgartirish. Boshqa so'zlar bilan aytganda,
Biz ushbu uchta operatsiyani xohlaymiz - writeIndex-ni saqlash, massivga yozish, oshirish
writeIndex - atom operatsiyasi bo'lib, uni kichikroq suboperatsiyalarga bo'lish mumkin emas.
lar. (Keyingi misollarda ko'rib turganingizdek, umumiy o'zgaruvchan ma'lumotlarda o'qish operatsiyalari ham bo'lishi kerak
atomik.) Biz faqat bitta ip uchta ipni bajarishini ta'minlash orqali atomiklikni taqlid qilishimiz mumkin
bir vaqtning o'zida operatsiyalar. Amaliyotni bajarishi kerak bo'lgan har qanday boshqa ish zarrachalari kutishlari kerak
birinchi ip qo'shish operatsiyasini to'liq yakunladi.
Atomlikka sinxronlashtirilgan kalit so'z yordamida erishish mumkin. Bizning uchta joyimizni joylashtirish orqali
sinxronlashtirilgan bayonotda yoki sinxronlashtirilgan usulda suboperatsiyalar, biz faqat bittasiga ruxsat beramiz
qulfni olish va operatsiyalarni bajarish uchun bir vaqtning o'zida ip. Bu mavzu bo'lganda
sinxronlangan blokdagi barcha operatsiyalarni yakunladi va qulfni chiqaradi, boshqasi
ip qulfni olishi va operatsiyalarni bajarishni boshlashi mumkin. Bu ip bo'lishini ta'minlaydi
operatsiyalarni bajarish umumiy o'zgaruvchan ma'lumotlarning haqiqiy qiymatlarini va bularni ko'radi
qiymatlar boshqa ish zarrachalari natijasida operatsiyalar o'rtasida kutilmaganda o'zgarmaydi
ularni o'zgartirish.

Sinxronizatsiya bilan SimpleArray sinfi


23.8-rasmda SimpleArray sinfi to'g'ri sinxronizatsiya bilan ko'rsatilgan. E'tibor bering, shunday
23.5-rasmdagi SimpleArray klassi bilan bir xil, bundan tashqari qo‘shish endi sinxronlashtirilgan.
usul (20-qator). Shunday qilib, bir vaqtning o'zida faqat bitta ip bu usulni bajarishi mumkin. Biz darslarni qayta ishlatamiz
Oldingi misoldan ArrayWriter (23.6-rasm) va SharedArrayTest (23.7-rasm).

Dasturiy ta'minot muhandisligi kuzatuvi 23.5


Ichkarida bir nechta iplar tomonidan baham ko'rilishi mumkin bo'lgan o'zgaruvchan ma'lumotlarga barcha ruxsatlarni joylashtiring
sinxronlashtirilgan bayonotlar yoki bir xil qulfda sinxronlashtiriladigan sinxronlashtirilgan usullar.
Umumiy o'zgaruvchan ma'lumotlarda bir nechta operatsiyalarni bajarayotganda, qulfni ushlab turing
operatsiya samarali atomik bo'lishini ta'minlash uchun operatsiyaning to'liqligi.

23.4 Mavzuni sinxronlashtirish 975

1 // 23.8-rasm: SimpleArray.java
2 // Bir nechta tomonidan bo'lishish uchun butun sonli massivni boshqaradigan sinf
3 // sinxronizatsiya bilan mavzular.
4 import java.security.SecureRandom;
5 import java.util.Arrays;
6
7 ommaviy sinf SimpleArray
8 {
9 ta xususiy statik yakuniy SecureRandom generator = yangi SecureRandom();
10 ta xususiy yakuniy int[] massivi; // umumiy butun sonlar massivi
11 xususiy int writeIndex = 0; // yoziladigan keyingi elementning indeksi
12
13 // berilgan o'lchamdagi SimpleArray ni tuzing
14 ommaviy SimpleArray (int hajmi)
15 {
16 massiv = new int[size];
17 }
18
19 // umumiy massivga qiymat qo'shing
20
21 {
22 int pozitsiyasi = writeIndex; // yozish indeksini saqlash
23
24 urinib ko'ring
25 {
26 // haqiqiy ilovalarda siz qulfni ushlab uxlamasligingiz kerak
27 Thread.sleep(generator.nextInt(500)); // faqat demo uchun
28 }
29 catch (InterruptedException oldingi)
30 {
31 Thread.currentThread().interrupt();
32 }
33
34 // tegishli elementga qiymat qo'ying
35 massiv [pozitsiya] = qiymat;
36 System.out.printf("%s %d.%n elementga %2d yozdi",
37 Thread.currentThread().getName(), qiymat, pozitsiya);
38
39 ++writeIndex; // keyingi yoziladigan elementning o'sish indeksi
40 System.out.printf("Keyingi yozish indeksi: %d%n", writeIndex);
41 }
42
43 // umumiy tamsayı massivining mazmunini chiqarish uchun ishlatiladi
44 umumiy sinxronlashtirilgan String toString()
45 {
46 qaytish Arrays.toString(massiv);
47 }
48 } // oxirgi sinf SimpleArray

23.8-rasm | Bir nechta mavzular bilan bo'lishish uchun butun sonli massivni boshqaradigan sinf


sinxronizatsiya. (2-qismning 1-qismi.)

umumiy sinxronlashtirilgan bekor qo'shish (int qiymati)


976 23-bob Bir vaqtning o'zida

20-qator qo'shish usulini sinxronlashtirilgan deb e'lon qiladi va bunda barcha operatsiyalarni bajaradi
usul yagona, atom operatsiyasi sifatida harakat qiladi. 22-qator birinchi suboperatsiyani bajaradi -
writeIndex qiymatini saqlash. 35-qator ikkinchi suboperatsiyani belgilaydi, ele-
indeks pozitsiyasidagi elementga ment. 39-qator indexni yozadi. Qachon
usul 41-qatorda bajarilishini tugatsa, bajaruvchi ip bilvosita Simple-ni chiqaradi.
Massivni blokirovkalash, qo'shish usulini boshqa ish zarrachasini bajarishni boshlash imkonini beradi.
Sinxronlashtirilgan qo'shish usulida biz konsolga xabarlarni chop etamiz
Haqiqiy operatsiyani bajarishdan tashqari, ushbu usulni bajarayotganda iplarning rivojlanishi.
massivga qiymat kiritish uchun zarur bo'lgan narsalar. Biz buni xabarlar chop etilishi uchun qilamiz
to'g'ri tartibda, bu usul to'g'ri sinxronlanganligini ko'rishga imkon beradi
bu natijalarni oldingi, sinxronlashtirilmagan misol bilan solishtirish. Biz kelishamiz -
Namoyish uchun keyingi misollarda sinxronlangan bloklardan xabarlarni chiqarishni davom eting
faqat maqsadlar uchun; Biroq, odatda, kirish/chiqarish sinxronlashtirilgan bloklarda bajarilmasligi kerak,
chunki ob'ektning "qulflangan" vaqtini minimallashtirish muhimdir. [Eslatma:
Ushbu misoldagi 27-qator ta'kidlash uchun Thread usuli uyquni (faqat demo maqsadlarda) chaqiradi.
ipni rejalashtirishning oldindan aytib bo'lmaydiganligini o'lcham. Siz hech qachon uyquga qo'ng'iroq qilmasligingiz kerak
haqiqiy ilovada qulfni ushlab turish.]

23.5 Ishlab chiqaruvchi/iste'molchi munosabatlarisiz


Sinxronizatsiya
Ishlab chiqaruvchi/iste'molchi munosabatlarida dasturning ishlab chiqaruvchi qismi hosil qiladi
ma'lumotlarni oladi va uni umumiy ob'ektda saqlaydi va ilovaning iste'molchi qismi ma'lumotlarni o'qiydi

pool-1-thread-1 0 elementiga 1 yozdi.


Keyingi yozish indeksi: 1
pool-1-thread-2 1-elementga 11 yozdi.
Keyingi yozish indeksi: 2
pool-1-thread-2 2-elementga 12 yozdi.
Keyingi yozish indeksi: 3
pool-1-thread-2 3-elementga 13 yozdi.
Keyingi yozish indeksi: 4
pool-1-thread-1 4-elementga 2 yozdi.
Keyingi yozish indeksi: 5
pool-1-thread-1 5-elementga 3 yozdi.
Keyingi yozish indeksi: 6

SimpleArray tarkibi:


[1, 11, 12, 13, 2, 3]

Ishlash bo'yicha maslahat 23.2


Sinxronlashtirilgan iboralar davomiyligini imkon qadar qisqa tuting
zarur sinxronizatsiya. Bu bloklangan mavzularni kutish vaqtini kamaytiradi. Qo'ymang -
kiritish-chiqarishni shakllantirish, sinxronlashtirishni talab qilmaydigan uzoq hisoblar va operatsiyalar
qulfni ushlab turganda.

23.8-rasm | Bir nechta mavzular bilan bo'lishish uchun butun sonli massivni boshqaradigan sinf


sinxronizatsiya. (2-qismning 2-qismi.)

23.5 Sinxronizatsiyasiz ishlab chiqaruvchi/iste'molchi munosabatlari 977



umumiy ob'ektdan. Ishlab chiqaruvchi/iste'molchi munosabatlari aniqlash vazifasini ajratib turadi.
ishni haqiqatda bajarish bilan bog'liq vazifalardan bajarilishi kerak bo'lgan ish.
Ishlab chiqaruvchi/iste'molchi munosabatlariga misollar
Umumiy ishlab chiqaruvchi/iste'molchi munosabatlariga misollardan biri chop etishni birlashtirishdir. Garchi
Ilovadan chop qilmoqchi bo'lganingizda printer mavjud bo'lmasligi mumkin (ya'ni, pro-
ducer), siz hali ham chop etish vazifasini "bajarishingiz" mumkin, chunki ma'lumotlar vaqtincha diskda joylashtirilgan
printer mavjud bo'lgunga qadar. Xuddi shunday, printer (ya'ni, iste'molchi) mavjud bo'lganda
qodir, joriy foydalanuvchi chop etishni xohlamaguncha kutish shart emas. Biriktirilgan chop etish ishlari mumkin
printer mavjud bo'lishi bilanoq chop eting. Ishlab chiqaruvchining yana bir misoli
sumer munosabatlari - bu ma'lumotlarni qattiq faylga joylashtirish orqali DVD disklariga ma'lumotlarni nusxalaydigan dastur.
o'lchamli bufer, bu DVD drayveri ma'lumotlarni DVDga "yondirishi" sababli bo'shatiladi.
Sinxronizatsiya va davlatga qaramlik
Ko'p tarmoqli ishlab chiqaruvchi/iste'molchi munosabatlarida ishlab chiqaruvchi ip ma'lumotlarni yaratadi va
uni bufer deb ataladigan umumiy ob'ektga joylashtiradi. Iste'molchi ipi buferdan ma'lumotlarni o'qiydi.
Bu munosabatlar qiymatlar ishlab chiqarilishi va mos kelishini ta'minlash uchun sinxronlashni talab qiladi.
to'g'ri jamlangan. Bir nechta iplar tomonidan baham ko'rilgan o'zgaruvchan ma'lumotlar bo'yicha barcha operatsiyalar (masalan,
buferdagi ma'lumotlar) da muhokama qilinganidek, buzilishning oldini olish uchun qulf bilan himoyalangan bo'lishi kerak
23.4-bo'lim. Ishlab chiqaruvchi va iste'molchi ipi tomonidan baham ko'rilgan bufer ma'lumotlari bo'yicha operatsiyalar
ham holatga bog'liq - operatsiyalar faqat bufer to'g'ri bo'lsa davom etishi kerak
davlat. Agar bufer to'liq bo'lmagan holatda bo'lsa, ishlab chiqaruvchi ishlab chiqarishi mumkin; agar bufer bo'lmasa -
bo'sh holatda, iste'molchi iste'mol qilishi mumkin. Buferga kiradigan barcha operatsiyalar sinxronlashdan foydalanishi kerak.
ma'lumotlar buferga yozilishini yoki buferdan o'qilishini ta'minlash uchun faqat
bufer to'g'ri holatda. Agar ishlab chiqaruvchi keyingi ma'lumotlarni buferga qo'yishga harakat qilsa
to'lganligini aniqlasa, ishlab chiqaruvchi ip yangi yozish uchun joy bo'lguncha kutishi kerak
qiymat. Agar iste'molchi ipi buferni bo'sh deb topsa yoki oldingi ma'lumotlarda
o'qilgan bo'lsa, iste'molchi yangi ma'lumotlar paydo bo'lishini ham kutishi kerak. Boshqa sobiq -
Davlat qaramligining ko'pligi shundaki, agar uning benzin baki bo'sh bo'lsa va avtomobilingizni boshqara olmaysiz
Agar u allaqachon to'lgan bo'lsa, unga ko'proq gaz quya olmaysiz.
Sinxronizatsiya etishmasligidan kelib chiqadigan mantiqiy xatolar
Agar biz bir nechta kirishni sinxronlashtirmasak, qanday mantiqiy xatolar paydo bo'lishi mumkinligini ko'rib chiqing
umumiy o'zgaruvchan ma'lumotlarni boshqaradigan mavzular. Bizning keyingi misolimiz (23.9–23.13-rasmlar)
To'g'ri sinxronizatsiyasiz ishlab chiqaruvchi/iste'molchi munosabatlari. Prodyuser
ip 1 dan 10 gacha raqamlarni umumiy buferga yozadi - bitta xotira joyi
ikkita ip o'rtasida taqsimlangan (23.12-rasmning 6-qatorida bufer deb nomlangan bitta int o'zgaruvchisi
bu misol). Iste'molchi ipi ushbu ma'lumotlarni umumiy buferdan o'qiydi va ko'rsatadi
ma'lumotlar. Dasturning chiqishi ishlab chiqaruvchi tomonidan yoziladigan (ishlab chiqarilgan) qiymatlarni ko'rsatadi
umumiy bufer va iste'molchi umumiy buferdan o'qiydigan (iste'mol qiladigan) qiymatlar.
Ishlab chiqaruvchining umumiy buferga yozgan har bir qiymati aniq iste'mol qilinishi kerak
bir marta iste'molchi ip tomonidan. Biroq, bu misoldagi mavzular sinxronlashtirilmagan.
Shuning uchun, agar ishlab chiqaruvchi umumiy buferga yangi ma'lumotlarni joylashtirsa, ma'lumotlar yo'qolishi yoki buzilishi mumkin
iste'molchi oldingi ma'lumotlarni o'qishdan oldin. Bundan tashqari, agar ma'lumotlar noto'g'ri takrorlanishi mumkin
ishlab chiqaruvchi keyingi qiymatni ishlab chiqarishdan oldin iste'molchi ma'lumotlarni yana iste'mol qiladi. Ko'rsatish uchun
Ushbu imkoniyatlardan kelib chiqqan holda, quyidagi misoldagi iste'molchi ipi hammasini jami saqlaydi
o'qigan qadrlaydi. Ishlab chiqaruvchi ip 1 dan 10 gacha bo'lgan qiymatlarni ishlab chiqaradi. Agar iste'molchi

978 23-bob Bir vaqtdalik

ishlab chiqarilgan har bir qiymatni bir marta va faqat bir marta o'qiydi, jami 55 bo'ladi. Biroq, agar siz exe-
Ushbu dasturni bir necha marta yoqsangiz, jami har doim ham 55 emasligini ko'rasiz (rasmda ko'rsatilganidek).
23.13-rasmdagi chiqishlar). Nuqtani ta'kidlash uchun, ishlab chiqaruvchi va iste'molchi mavzularda
Misol uchun, har bir uyquni bajarish o'rtasida uch soniyagacha bo'lgan tasodifiy intervallar uchun
vazifalar. Shunday qilib, biz ishlab chiqaruvchining ipi qachon yangi qiymat yozishga harakat qilishini bilmaymiz,
yoki iste'molchi ip qiymatini o'qishga harakat qilganda.
Interfeys buferi
Dastur interfeysi Bufer (23.9-rasm) va Producer sinflaridan iborat (23.10-rasm),
Consumer (23.11-rasm), UnsynchronizedBuffer (23.12-rasm) va SharedBufferTest
(23.13-rasm). Interfeys buferi (23.9-rasm) blokirovkalash usullarini e'lon qiladiPut (6-qator) va
blockingGet (9-qator) bufer (masalan, UnsynchronizedBuffer) amalga oshirishi kerak.
Buferga qiymat qo'yish uchun Producer ipini va qayta ishlash uchun Iste'molchi ipini yoqing.
mos ravishda buferdan qiymatni sinab ko'ring. Keyingi misollarda blokirovka qilish usullari
Put va blockingGet odatda InterruptedExceptions-ni tashlaydigan usullarni chaqiradi
bu vazifani bajarish uchun usul vaqtincha bloklanishi mumkinligini ko'rsatadi. Biz de-
Ushbu interfeysni o'zgartirishga majbur bo'lmasligimiz uchun har bir usulni bu erda otish bandi bilan aniqlang
keyingi misollar uchun.

Sinf ishlab chiqaruvchisi


Class Producer (23.10-rasm) Runnable interfeysini amalga oshiradi, uni bajarishga imkon beradi.
alohida mavzudagi vazifa sifatida. Konstruktor (11–14-qatorlar) Bufer havolasini ishga tushiradi
Asosiy (23.13-rasmning 15-qatori) yaratilgan ob'ekt bilan umumiy joylashuv va kon-
instruktor. Ko'rib turganimizdek, bu interfeysni amalga oshiradigan UnsynchronizedBuffer obyektidir
Umumiy ob'ektga kirishni sinxronlashtirmasdan bufer. Ushbu dasturdagi Prodyuser mavzusi
ishga tushirish usulida ko'rsatilgan vazifalarni bajaradi (23.10-rasm, 17-39-qatorlar). ning har bir iteratsiyasi
pastadir (21-35-qatorlar) ishlab chiqaruvchi ipni joylashtirish uchun Thread usuli uyquni (25-qator) chaqiradi
0 dan 3 soniyagacha bo'lgan tasodifiy vaqt oralig'ida vaqtli kutish holatiga o'tkazing. Qachon
ip uyg'onadi, 26-satr nazorat o'zgaruvchisi sonining qiymatini Bufer ob'ektiga o'tkazadi
umumiy bufer qiymatini belgilash uchun blockingPut usuli. 27-28 qatorlar jami barcha qiymatlarni saqlaydi.
shu paytgacha ishlab chiqarilgan va shu qiymatni chiqaradi. Loop tugagach, 36-37 qatorlar a ko'rsatiladi
Prodyuser ma'lumotlarni ishlab chiqarishni tugatganligi va tugatilayotganligini bildiruvchi xabar. Keyingisi,
usulni ishga tushirish tugaydi, bu esa Ishlab chiqaruvchi o'z vazifasini bajarganligini ko'rsatadi. Har qanday usul
Runnable'ning ishga tushirish usulidan chaqirilgan (masalan, Bufer usuli blockingPut) qism sifatida ishlaydi

1 // 23.9-rasm: Bufer.java


2 // Bufer interfeysi ishlab chiqaruvchi va iste'molchi tomonidan chaqirilgan usullarni belgilaydi.
3 umumiy interfeysi bufer
4 {
5 // Buferga int qiymatini qo'ying
6 public void blockingPut(int qiymati) InterruptedException ni chiqaradi;
7
8 // Buferdan int qiymatini qaytaring
9 public int blockingGet() InterruptedException ni chiqaradi;
10 } // yakuniy interfeys buferi
23.9-rasm | Bufer interfeysi ishlab chiqaruvchi va iste'molchi tomonidan chaqiriladigan usullarni belgilaydi. (Diqqat:
Shakllarning misoli. 23.9–23.13 ip xavfsiz emas.)

23.5 Sinxronizatsiyasiz ishlab chiqaruvchi/iste'molchi munosabatlari 979

bu vazifaning bajarilishi to'g'risida. Bu fakt 23.6-23.8 bo'limlarida muhim bo'ladi
biz ishlab chiqaruvchi / iste'molchi munosabatlariga sinxronizatsiya qo'shamiz.

Iste'molchi sinfi


Class Consumer (23.11-rasm) shuningdek, Runnable interfeysini amalga oshiradi, bu esa Consumerga imkon beradi.
Ishlab chiqaruvchi bilan bir vaqtda amalga oshirish. 11–14 qatorlar Bufer havolasini ishga tushiradi
Bufer interfeysini amalga oshiradigan ob'ekt bilan sharedLocation (asosiy,
23.13-rasm) va umumiy parametr sifatida konstruktorga uzatiladi. Ko'rib turganimizdek, bu
Producer ob'ektini ishga tushirish uchun ishlatiladigan bir xil UnsynchronizedBuffer ob'ekti - shunday qilib,

1 // 23.10-rasm: Producer.java


2 // Buferga 1 dan 10 gacha qiymatlarni kiritadigan ishga tushirish usuli bilan ishlab chiqaruvchi.
3 import java.security.SecureRandom;
4
5
6 {
7 ta xususiy statik yakuniy SecureRandom generator = yangi SecureRandom();
8 xususiy yakuniy Bufer umumiy joylashuv; // umumiy ob'ektga havola
9
10 // konstruktor
11 ommaviy ishlab chiqaruvchi (bufer umumiy joylashuvi)
12 {
13 this.sharedLocation = sharedLocation;
14 }
15
16
17
18 {
19 int sum = 0;
20
21 uchun (int count = 1; count <= 10; count++)
22 {
23 harakat qilib ko'ring // 0 dan 3 soniyagacha uxlang, keyin qiymatni Buferga qo'ying
24 {
25
26
27 so'm += hisoblash; // qiymatlar yig'indisini oshirish
28 System.out.printf("\t%2d%n", summa);
29 }
30 ta tutish (InterruptedException istisno)
31 {
32 Thread.currentThread().interrupt();
33 }
34 }
35
36 System.out.printf(
37 "Prodyuser ishlab chiqarishni tugatdi%nTerminating Producer%n");
38 }
39 } // yakuniy sinf Ishlab chiqaruvchi
23.10-rasm | Buferga 1 dan 10 gacha qiymatlarni kiritadigan ishga tushirish usuli bilan ishlab chiqaruvchi. (Diqqat:
Shakllarning misoli. 23.9–23.13 ip xavfsiz emas.)

jamoat sinfi Producer Runnable dasturini amalga oshiradi

// ShareLocation-da 1 dan 10 gacha qiymatlarni saqlang
public void run()

Thread.sleep(generator.nextInt(3000)); // tasodifiy uyqu


sharedLocation.blockingPut(hisoblash); // buferda qiymatni o'rnating

980 23-bob Bir vaqtdalik

ikkita ip bir xil ob'ektni baham ko'radi. Ushbu dasturdagi Consumer thread ni bajaradi
ishga tushirish usulida ko'rsatilgan vazifalar (17-39-qatorlar). 21-34 qatorlar 10 marta takrorlanadi. Har bir iteratsiya
Iste'molchi ipini vaqtli kutishga qo'yish uchun Thread usuli uyquni (26-qator) chaqiradi
holatini 3 soniyagacha ushlab turing. Keyinchalik, 27-satr olish uchun Buferning blockingGet usulidan foydalanadi
umumiy buferdagi qiymatdan so'ng qiymatni o'zgaruvchan summaga qo'shadi. 28-qator ko'rsatiladi
hozirgacha iste'mol qilingan barcha qiymatlarning jami. Loop tugagach, 36-37 qatorlar a ko'rsatiladi
iste'mol qilingan qiymatlar yig'indisini ko'rsatadigan chiziq. Keyin usulni ishga tushirish tugaydi, bu esa-
Iste'molchi o'z vazifasini bajarganligini ko'rsatadi. Ikkala mavzu ham tugatilgan holatga kirgandan so'ng,
dastur tugaydi.

1 // 23.11-rasm: Consumer.java


2 // Buferdan 10 ta qiymatni o'qiydigan, ishga tushirish usuli bilan iste'molchi.
3 import java.security.SecureRandom;
4
5
6 {
7 ta xususiy statik yakuniy SecureRandom generator = yangi SecureRandom();
8 xususiy yakuniy Bufer umumiy joylashuv; // umumiy ob'ektga havola
9
10 // konstruktor
11 ommaviy iste'molchi (bufer umumiy joylashuvi)
12 {
13 this.sharedLocation = sharedLocation;
14 }
15
16
17
18 {
19 int sum = 0;
20
21 uchun (int count = 1; count <= 10; count++)
22 {
23 // 0 dan 3 soniyagacha uxlang, buferdan qiymatni o'qing va yig'indiga qo'shing
24 urinib ko'ring
25 {
26
27
28 System.out.printf("\t\t\t%2d%n", summa);
29 }
30 ta tutish (InterruptedException istisno)
31 {
32 Thread.currentThread().interrupt();
33 }
34 }
35
36 System.out.printf("%n%s %d%n%s%n",
37 "Iste'molchi o'qigan qiymatlarni yig'ish", yig'indi, "Iste'molchini tugatish");
38 }
39 } // oxirgi sinf Consumer
23.11-rasm | Buferdan 10 ta qiymatni o'qiydigan, ishga tushirish usuli bilan iste'molchi. (Diqqat:
Shakllarning misoli. 23.9–23.13 ip xavfsiz emas.)

jamoat sinfi Consumer Runnable dasturlarini amalga oshiradi

// sharedLocation qiymatini 10 marta o'qing va qiymatlarni yig'ing
public void run()

Thread.sleep(generator.nextInt(3000));


summa += sharedLocation.blockingGet();

23.5 Sinxronizatsiyasiz ishlab chiqaruvchi/iste'molchi munosabatlari 981

Biz Mavzu usulini uyqu deb ataymiz, faqat ko'rgazmali maqsadlar uchun
Biz ta'kidlash uchun Producer va Consumer sinflarining usulida uyqu usulini chaqiramiz
ko'p oqimli ilovalarda har bir ish zarrachasi qachon ishlashini oldindan aytib bo'lmaydi
uning vazifasi va u protsessorga ega bo'lganda vazifani qancha vaqt davomida bajarishi. Odatda, bular
mavzuni rejalashtirish muammolari Java dasturchisining nazorati ostida emas. Ushbu dasturda bizning
ipning vazifalari juda oddiy - ishlab chiqaruvchi buferga 1 dan 10 gacha qiymatlarni yozadi va
Iste'molchi buferdan 10 ta qiymatni o'qiydi va har bir qiymatni o'zgaruvchan summaga qo'shadi. holda
uyqu usuli chaqiruvi, va agar Prodyuser birinchi bo'lib bajarsa, bugungi ajoyib tezlikni hisobga olgan holda
protsessorlar bo'lsa, ishlab chiqaruvchi o'z vazifasini iste'molchi imkoniyatga ega bo'lgunga qadar bajarishi mumkin
amalga oshirish. Agar Iste'molchi birinchi bo'lib bajarilgan bo'lsa, u axlat ma'lumotlarini o'n marta iste'mol qilishi mumkin,
keyin Ishlab chiqaruvchi birinchi haqiqiy qiymatni ishlab chiqargunga qadar tugatadi.

Sinxronlashtirilmagan bufer sinfi buferga kirishni sinxronlashtirmaydi


Sinxronlashtirilmagan Buffer klassi (23.12-rasm) interfeys buferini (4-qator) amalga oshiradi, lekin buni amalga oshiradi.
bufer holatiga kirishni sinxronlashtirmang - biz buni muammoni ko'rsatish uchun ataylab qilamiz.
bir nechta ish zarrachalari umumiy o'zgaruvchan ma'lumotlarga sinxronizatsiyasiz kirishda paydo bo'ladi.
tion. 6-qator misol o'zgaruvchisi buferini e'lon qiladi va uni -1 ga ishga tushiradi. Bu qiymat uchun ishlatiladi
Iste'molchi Pro-dan oldin qiymatni iste'mol qilishga harakat qiladigan holatni ko'rsating.
ducer har doim buferga qiymat qo'yadi. Shunga qaramay, blokirovkalash usullari qo'yish (9-13-qatorlar) va bloklash-
ingGet (16–20-qatorlar) bufer namunasi o'zgaruvchisiga kirishni sinxronlashtirmaydi. Usul
blockingPut oddiygina argumentini buferga tayinlaydi (12-satr) va blockingGet usuli
oddiygina bufer qiymatini qaytaradi (19-satr). 23.13-rasmda ko'rib turganingizdek, Sinxronlashtirilmagan-
Bufer ob'ekti ishlab chiqaruvchi va iste'molchi o'rtasida taqsimlanadi.

1 // 23.12-rasm: UnsynchronizedBuffer.java


2 // UnsynchronizedBuffer tomonidan kirish mumkin bo'lgan umumiy sonni saqlaydi
3 // ishlab chiqaruvchi ip va iste'molchi ip.
4 umumiy sinf UnsynchronizedBuffer Buferni amalga oshiradi
5 {
6
7
8 // qiymatni buferga joylashtiring
9 public void blockingPut(int qiymati) InterruptedExceptionni tashlaydi
10 {
11 System.out.printf("Produser yozadi\t%2d", qiymat);
12
13 }
14
15 // buferdan qiymatni qaytarish
16 public int blockingGet() InterruptedException-ni tashlaydi
17 {
18 System.out.printf("Iste'molchi o'qiydi\t%2d", bufer);
19
20 }
21 } // end klassi UnsynchronizedBuffer

23.12-rasm | UnsynchronizedBuffer ishlab chiqaruvchi tomonidan foydalaniladigan umumiy sonni saqlaydi


ip va iste'molchi ip. (Ehtiyot bo'ling: 23.9-rasm - 23.13-rasmdagi misol ip xavfsiz emas.)

xususiy int buferi = -1; // ishlab chiqaruvchi va iste'molchi mavzulari tomonidan baham ko'rilgan

bufer = qiymat;

qaytarish buferi;


982 23-bob Bir vaqtdalik

Class SharedBufferTest
SharedBufferTest sinfida (23.13-rasm) 12-satr bajarish uchun ExecutorService-ni yaratadi.
Ishlab chiqaruvchi va iste'molchining ishga tushirilishi. 15-qator Sinxronizatsiyalanmagan buferni yaratadi va
ShareLocation bufer o'zgaruvchisiga imzo qo'yadi. Ushbu ob'ekt Ishlab chiqaruvchiga tegishli ma'lumotlarni saqlaydi
va iste'molchi mavzulari ulashadi. 24–25-qatorlar Prodyuser va Con-ni yaratadi va bajaradi.
shumer. Ishlab chiqaruvchi va iste'molchi konstruktorlarining har biri bir xil Bufer ob'ektidan o'tadi
(sharedLocation), shuning uchun har bir ob'ekt bir xil Buferga ishora qiladi. Bu chiziqlar ham bilvosita
mavzularni ishga tushiring va har bir Runnable-ning ishga tushirish usulini chaqiring. Nihoyat, 27-qatorni chaqirish usuli
o'chirish, shuning uchun dastur ishlab chiqaruvchini bajarayotgan iplar tugashi mumkin
va Iste'molchi o'z vazifalarini bajaradi va 28-qator rejalashtirilgan vazifalar bajarilishini kutadi.
Asosiy tugashi bilan (29-satr), asosiy ijro chizig'i tugatilgan holatga kiradi.

1 // 23.13-rasm: SharedBufferTest.java


2 // Sinxronlashtirilmagan buferni boshqaradigan ikkita oqimli dastur.
3 import java.util.concurrent.ExecutorService;
4 import java.util.concurrent.Executors;
5 import java.util.concurrent.TimeUnit;
6
7 umumiy sinf SharedBufferTest
8 {
9 ta umumiy statik void main(String[] args) InterruptedExceptionni tashlaydi
10 {
11 // ikkita ipli yangi iplar hovuzini yarating
12 ExecutorService executorService = Executors.newCachedThreadPool();
13
14
15
16
17 System.out.println(
18 "Aktsiya\t\tQiymat\tishlab chiqarilgan\tIste'mol qilingan summa");
19 System.out.printf(
20 "------\t\t-----\t---------------\t-------------- -%n%n");
21
22 // ishlab chiqaruvchi va iste'molchini bajaring, har birini bering
23 // umumiy joylashuvga kirish
24
25
26
27 execcutorService.shutdown(); // vazifalar tugagach, ilovani to'xtating
28 excutorService.awaitTermination(1, TimeUnit.MINUTES);
29 }
30 } // yakuniy sinf SharedBufferTest

Harakat qiymati ishlab chiqarilgan iste'mol summasining yig'indisi


------ ----- --------------- ---------------

Ishlab chiqaruvchi 11 yozadi

23.13-rasm | Sinxronlashtirilmagan buferni boshqaradigan ikkita ipli dastur. (Diqqat:
Shakllarning misoli. 23.9–23.13 ip xavfsiz emas.) (2-qismning 1-qismi)

// Ints saqlash uchun UnsynchronizedBuffer yarating


Bufer sharedLocation = new UnsynchronizedBuffer();

execcutorService.execute(yangi Producer(sharedLocation));


execcutorService.execute(yangi iste'molchi(sharedLocation));

Ishlab chiqaruvchi yozadi 2 3 1 yo'qolgan


Ishlab chiqaruvchi yozadi 3 6 2 yo'qolgan

23.5 Sinxronizatsiyasiz ishlab chiqaruvchi/iste'molchi munosabatlari 983

Iste'molchi 3 3 ni o'qiydi
Ishlab chiqaruvchi 4 10 yozadi
Iste'molchi 4 7 ni o'qiydi
Ishlab chiqaruvchi 5 15 yozadi

Iste'molchi 7 14 ni o'qiydi

Ishlab chiqaruvchi 8 36 yozadi
Iste'molchi 8 29 ni o'qiydi

Ishlab chiqaruvchi 9 45 yozadi

Ishlab chiqaruvchi ishlab chiqarishni tugatdi
Ishlab chiqaruvchini tugatish
Iste'molchi 10 47 ni o'qiydi

Iste'molchi o'qigan qiymatlar jami 77


Iste'molchini tugatish

Harakat qiymati ishlab chiqarilgan iste'mol summasining yig'indisi


------ ----- --------------- ---------------

Ishlab chiqaruvchi 11 yozadi


Iste'molchi 10 ni o'qiydi

Ishlab chiqaruvchi 2 3 yozadi


Iste'molchi 2 6 ni o'qiydi
Ishlab chiqaruvchi 36 yozadi
Iste'molchi 39 ni o'qiydi
Ishlab chiqaruvchi 4 10 yozadi
Iste'molchi 4 13 ni o'qiydi
Ishlab chiqaruvchi 5 15 yozadi

Iste'molchi 6 19 ni o'qiydi

Iste'molchi o'qigan qiymatlar jami 19
Iste'molchini tugatish

Ishlab chiqaruvchi ishlab chiqarishni tugatdi


Ishlab chiqaruvchini tugatish

23.13-rasm | Sinxronlashtirilmagan buferni boshqaradigan ikkita ipli dastur. (Diqqat:


Shakllarning misoli. 23.9–23.13 ip xavfsiz emas.) (2-qismning 2-qismi)

5 yo'qoladi


6 yo'qoladi

7 qayta o'qing

8 qayta o'qing

9 yo'qoladi

10 qayta o'qing
10 qayta o'qing
10 qayta o'qing

Ishlab chiqaruvchi 6 21 yozadi


Ishlab chiqaruvchi 7 28 yozadi

Iste'molchi 7 21 ni o'qiydi

Iste'molchi 8 37 ni o'qiydi

Ishlab chiqaruvchi 10 55 yozadi

Iste'molchi 10 57 ni o'qiydi
Iste'molchi 10 67 ni o'qiydi
Iste'molchi 10 77 ni o'qiydi

Iste'molchi o'qiydi -1 -1 o'qiydi -1 yomon ma'lumot

1 qayta o'qing
1 qayta o'qing
1 qayta o'qing
1 qayta o'qing

10 hech qachon o'qimagan

5 yo'qoladi

7 hech qachon o'qimagan


8 hech qachon o'qimagan
9 hech qachon o'qimagan

Iste'molchi 1 1 ni o'qiydi


Iste'molchi 1 2 ni o'qiydi
Iste'molchi 13 ni o'qiydi
Iste'molchi 1 4 ni o'qiydi

Ishlab chiqaruvchi 6 21 yozadi

Ishlab chiqaruvchi 7 28 yozadi
Ishlab chiqaruvchi 8 36 yozadi
Ishlab chiqaruvchi 9 45 yozadi
Ishlab chiqaruvchi 10 55 yozadi

984 23-bob Parametrlilik

Ushbu misolning umumiy ko'rinishidan Prodyuser birinchi va har bir narsani bajarishi kerakligini eslang
Ishlab chiqaruvchi tomonidan ishlab chiqarilgan qiymat iste'molchi tomonidan aynan bir marta iste'mol qilinishi kerak. Qanaqasiga-
har doim, 23.13-rasmning birinchi chiqishini o'rganganingizda, Prodyuser quyidagini yozishiga e'tibor bering.
Iste'molchi birinchi qiymatini (3) o'qishdan oldin 1, 2 va 3 qiymatlari. Shunday qilib, 1 va 2 qiymatlari
yo'qolgan. Keyinchalik, 5, 6 va 9 qiymatlari yo'qoladi, 7 va 8 ikki marta o'qiladi va 10 to'rtta o'qiladi.
marta. Shunday qilib, birinchi chiqish to'g'ri jami o'rniga 77 noto'g'ri jami hosil qiladi
55. Ikkinchi chiqishda Iste'molchi -1 qiymatini ishlab chiqaruvchi yozishdan oldin o'qiydi.
qiymat. Ishlab chiqaruvchi 2 qiymatini yozishdan oldin iste'molchi 1 qiymatini besh marta o'qiydi.
Shu bilan birga, 5, 7, 8, 9 va 10 qiymatlari yo'qoladi - oxirgi to'rttasi, chunki Iste'molchi ter-
Ishlab chiqaruvchining oldida minatatsiya qilinadi. 19 ta noto'g'ri iste'molchi ko'rsatiladi. (.dagi qatorlar
Ishlab chiqaruvchi yoki iste'molchi tartibsiz harakat qilgan mahsulot ta'kidlangan.)

Yo'qolgan va takrorlangan ma'lumotlar bilan bog'liq muammolarni hal qilish uchun 23.6-bo'limda misol keltirilgan


Sinxronlashtirish uchun biz ArrayBlockingQueue (java.util.concurrent paketidan) foydalanamiz.
umumiy ob'ektga kirishni xronizatsiya qilish, har bir qiymatning pro- bo'lishini kafolatlash.
bir marta va faqat bir marta to'xtatildi.
23.6 Ishlab chiqaruvchi/iste’molchi munosabatlari:
ArrayBlockingQueue
Ishlab chiqaruvchi va iste'molchi iplarini sinxronlashtirishning eng yaxshi usuli Java-dan sinflardan foydalanishdir
Siz uchun sinxronizatsiyani qamrab oluvchi java.util.concurrent paketi. Java o'z ichiga oladi
ArrayBlockingQueue klassi - to'liq amalga oshirilgan, ish zarralari uchun xavfsiz bufer sinfi.
BlockingQueue interfeysi. Ushbu interfeys bo'limda muhokama qilingan Queue interfeysini kengaytiradi
16-bob va qo'yish va olish usullarini e'lon qiladi, Queue meth-ning blokirovka ekvivalentlari
mos ravishda ods taklifi va so'rov. Qo'yish usuli elementni Blokning oxiriga qo'yadi -
ingQueue, agar navbat to'lgan bo'lsa, kutish. Qabul qilish usuli elementni boshidan olib tashlaydi
BlockingQueue, agar navbat bo'sh bo'lsa, kutish. Ushbu usullar sinfni Array-ga aylantiradi.
BlockingQueue umumiy buferni amalga oshirish uchun yaxshi tanlovdir. Chunki usul qo'yilgan
ma'lumotlarni yozish uchun buferda joy qolguncha bloklaydi va usul mavjud bo'lguncha bloklarni oladi
Yangi ma'lumotlarni o'qish uchun ishlab chiqaruvchi birinchi navbatda qiymat ishlab chiqarishi kerak, iste'molchi esa to'g'ri qabul qilishi kerak.
faqat ishlab chiqaruvchi qiymat yozgandan so'ng va ishlab chiqaruvchi keyingisini to'g'ri ishlab chiqargandan keyingina yig'iladi
qiymat (birinchidan keyin) faqat iste'molchi oldingi (yoki birinchi) qiymatni o'qiganidan keyin. Massiv-
BlockingQueue umumiy o'zgaruvchan ma'lumotlarni massivda saqlaydi, uning o'lchami sifatida belgilanadi
ArrayBlockingQueue konstruktor argumenti. Yaratilgandan so'ng, ArrayBlockingQueue bo'ladi
o'lchamda o'rnatiladi va qo'shimcha elementlarni joylashtirish uchun kengaytirilmaydi.
Sinfni blokirovkalash buferi
23.14–23.15-rasmlarda ishlab chiqaruvchi va isteʼmolchining ArrayBlock-ga kirishi koʻrsatilgan.
ingQueue. Class BlockingBuffer (23.14-rasm) ArrayBlockingQueue obyektidan foydalanadi.
Butun sonni saqlaydi (7-qator). 11-qator ArrayBlockingQueue-ni yaratadi va 1-ga o'tadi
konstruktor, shuning uchun ob'ekt SinxronlashtirilmaganBufferni taqlid qilish uchun yagona qiymatga ega bo'ladi
23.12-rasmdagi misol. 7 va 11-qatorlarda (23.14-rasm) biz muhokama qilgan generiklardan foydalaniladi.

Xatolarning oldini olish bo'yicha maslahat 23.1


Birgalikda ish zarralari orqali umumiy ob'ektga kirish ehtiyotkorlik bilan yoki dastur tomonidan boshqarilishi kerak
noto'g'ri natijalar berishi mumkin.

23.6 Ishlab chiqaruvchi/iste'molchi munosabatlari: ArrayBlockingQueue 985

16–20-boblar. Biz 23.8-bo'limda bir nechta elementli buferlarni muhokama qilamiz. Chunki bizning blokimiz -
ingBuffer klassi o'zining barcha baham ko'rilganlarini boshqarish uchun xavfsiz ArrayBlockingQueue sinfidan foydalanadi.
davlat (bu holda umumiy bufer), BlockingBuffer o'zi xavfsiz mavzu, garchi biz
sinxronizatsiyani o'zimiz amalga oshirmadik.

BlockingBuffer interfeysi Buferni amalga oshiradi (23.9-rasm) va Producer sinflaridan foydalanadi


(28-qatorni olib tashlash uchun o'zgartirilgan 23.10-rasm) va iste'molchi (23.11-rasmni olib tashlash uchun o'zgartirilgan)
28-qator) 23.5-banddagi misoldan. Ushbu yondashuv inkapsullangan sintezni ko'rsatadi.
chronization - umumiy ob'ektga kiruvchi iplar buferga kirishlari haqida bilishmaydi
endi sinxronlashtirildi. Sinxronizatsiya butunlay blockingPut va block-da amalga oshiriladi.
Sinxronlashtirilgan ArrayBlockingQueue ni chaqirish orqali BlockingBuffer ning ingGet usullari
mos ravishda qo'yish va olish usullari. Shunday qilib, ishlab chiqaruvchi va iste'molchi ishlab chiqaruvchisi
umumiy ob'ektni blockingPut va block-ni chaqirish orqali to'g'ri sinxronlashtiriladi.
ingGet usullari.
Bloklash usulidagi 17-satr (23.14-rasm, 15-20-qatorlar) ArrayBlocking-ni chaqiradi.
Navbatdagi obyektni joylashtirish usuli. Bu usul, agar kerak bo'lsa, xonada bo'sh joy qolguncha bloklaydi
qiymatni joylashtirish uchun bufer. BlokingGet usuli (23-30-qatorlar) ArrayBlocking-ni chaqiradi.

1 // 23.14-rasm: BlockingBuffer.java


2 // ArrayBlockingQueue yordamida sinxronlashtirilgan bufer yaratish.
3 import java.util.concurrent.ArrayBlockingQueue;
4
5 ommaviy sinf BlockingBuffer Buferni amalga oshiradi
6 {
7
8
9 ommaviy blokirovkalash buferi()
10 {
11
12 }
13
14 // qiymatni buferga joylashtiring
15 public void blockingPut(int qiymati) InterruptedException-ni tashlaydi
16 {
17
18 System.out.printf("%s%2d\t%s%d%n", "Ishlab chiqaruvchi yozadi ", qiymat,
19 "Bufer hujayralar egallangan: ", buffer.size());
20 }
21
22 // buferdan qiymatni qaytarish
23 public int blockingGet() InterruptedException-ni tashlaydi
24 {
25
26 System.out.printf("%s %2d\t%s%d%n", "Iste'molchi o'qiydi ",
27 readValue, "Bufer hujayralar band: ", buffer.size());
28
29 o'qish qiymatini qaytarish;
30 }
31 } // oxirgi sinf BlockingBuffer
23.14-rasm | ArrayBlockingQueue yordamida sinxronlashtirilgan bufer yaratish.

xususiy final ArrayBlockingQueue buferi; // umumiy bufer

bufer = new ArrayBlockingQueue(1);

buffer.put(qiymat); // qiymatni buferga joylashtiring

int readValue = buffer.take(); // buferdan qiymatni olib tashlang

986 23-bob Parametrlilik

Navbatdagi obyektni olish usuli (25-qator). Agar kerak bo'lsa, bu usul mavjud bo'lmaguncha qo'ng'iroqni bloklaydi
olib tashlash uchun buferdagi element. 18–19 va 26–27 qatorlarda ArrayBlockingQueue ishlatiladi
Massivda mavjud elementlarning umumiy sonini ko'rsatish uchun ob'ektning o'lchami usuli -
Bloklash navbati.
Class BlockingBufferTest
Class BlockingBufferTest (23.15-rasm) ilovani ishga tushiradigan asosiy usulni o'z ichiga oladi.
takrorlash. 13-qator ExecutorService-ni yaratadi va 16-satr BlockingBuffer ob'ektini yaratadi.
ject va uning havolasini bufer o'zgaruvchisi sharedLocation ga tayinlaydi. 18-19 qatorlar bajariladi
Ishlab chiqaruvchi va iste'molchining ishga tushirilishi. 21-qator dasturni tugatish uchun usulni o'chirishni chaqiradi.
ish zarralari ishlab chiqaruvchi va iste'molchi vazifalarini bajarishni tugatganida katyon va 22-qator
rejalashtirilgan vazifalar bajarilishini kutadi.

1 // 23.15-rasm: BlockingBufferTest.java


2 // Bloklash buferini to'g'ri boshqaradigan ikkita ip
3 // ishlab chiqaruvchi/iste'molchi munosabatlarini amalga oshiradi.
4 import java.util.concurrent.ExecutorService;
5 import java.util.concurrent.Executors;
6 import java.util.concurrent.TimeUnit;
7
8 ommaviy sinf BlockingBufferTest
9 {
10 ta umumiy statik void main(String[] args) InterruptedExceptionni tashlaydi
11 {
12 // ikkita ipli yangi iplar hovuzini yarating
13 ExecutorService executorService = Executors.newCachedThreadPool();
14
15
16
17
18
19
20
21 excutorService.shutdown();
22 excutorService.awaitTermination(1, TimeUnit.MINUTES);
23 }
24 } // oxirgi sinf BlockingBufferTest

Ishlab chiqaruvchi egallagan 1 ta bufer hujayrani yozadi: 1


Iste'molchi 1 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 2 ta bufer hujayrani yozadi: 1
Iste'molchi 2 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 3 ta bufer hujayrani yozadi: 1
Iste'molchi 3 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 4 ta bufer hujayrani yozadi: 1
Iste'molchi 4 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 5 ta bufer hujayrani yozadi: 1
Iste'molchi 5 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 6 ta bufer hujayralarini yozadi: 1

23.15-rasm | To'g'ri amalga oshiradigan blokirovka buferini boshqaradigan ikkita ip


ishlab chiqaruvchi / iste'molchi munosabatlari. (2-qismning 1-qismi.)

// ints saqlash uchun BlockingBuffer yarating


Bufer sharedLocation = new BlockingBuffer();

execcutorService.execute(yangi Producer(sharedLocation));


execcutorService.execute(yangi iste'molchi(sharedLocation));

23.7 sinxronlashtirildi, kuting, xabardor qiling va barcha 987ni xabardor qiling

ArrayBlockingQueue qo'yish va olish usullari to'g'ri sinxronlashtirilgan bo'lsa-da,
BloklashBufer usullari blockingPut va blockingGet (23.14-rasm) e’lon qilinmaydi.
sinxronlashtiriladi. Shunday qilib, blokirovkalash usulida bajariladigan operatorlar - qo'yish operatsiyasi -
ation (17-satr) va chiqish (18-19-qatorlar) - atomik emas; bayonotlar ham mavjud emas
usuli blokirovkalashGet - qabul qilish operatsiyasi (25-qator) va chiqish (26-27-qatorlar). Shunday qilib
Har bir chiqish mos keladigan qo'yishdan keyin darhol paydo bo'lishiga kafolat yo'q
yoki ishga tushirish, va chiqishlar tartibsiz ko'rinishi mumkin. Agar ular shunday qilsalar ham, Array-
BlockingQueue ob'ekti ma'lumotlarga kirishni to'g'ri sinxronlashtirmoqda, bu faktdan dalolat beradi
iste'molchi tomonidan o'qilgan qiymatlar yig'indisi har doim to'g'ri ekanligini.
23.7 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi bilan aloqa
sinxronlangan, kuting, xabar bering va barchani xabardor qiling
[Izoh: Ushbu bo'lim sinxronlashtirishni boshqarishni xohlaydigan ilg'or dasturchilar uchun mo'ljallangan.
nization.2] Oldingi misolda bir nechta iplar bitta elementni qanday ulashishi mumkinligini ko'rsatdi
o'z ichiga olgan ArrayBlockingQueue sinfidan foydalanib, ipni xavfsiz tarzda buferlash
umumiy o'zgaruvchan ma'lumotlarni himoya qilish uchun zarur bo'lgan sinxronizatsiya. Ta'lim maqsadlarida -
es, endi biz sinxronlash yordamida umumiy buferni o'zingiz qanday amalga oshirishingiz mumkinligini tushuntiramiz.
Ob'ekt sinfining aniq kalit so'zi va usullari. Odatda ArrayBlockingQueue dan foydalanish
ko'proq xizmat ko'rsatadigan, yaxshiroq ishlaydigan kodga olib keladi.
Birgalikda o'zgaruvchan ma'lumotlar va sinxronizatsiya siyosatini aniqlagandan so'ng (ya'ni, assotsiatsiya
ma'lumotlarni uni himoya qiluvchi qulf bilan ishlash), buferga kirishni sinxronlashtirishning keyingi bosqichi
blockingGet va blockingPut usullarini sinxronlashtirilgan usullar sifatida amalga oshirishdir. Bu
urinishdan oldin ip Bufer ob'ektida monitor blokirovkasini olishini talab qiladi
bufer ma'lumotlariga kirish, lekin u avtomatik ravishda iplar bilan davom etishini ta'minlamaydi
faqat bufer to'g'ri holatda bo'lsa ishlaydi. Bizga mavzularimizga ruxsat berish usuli kerak
ba'zi shartlar to'g'ri yoki yo'qligiga qarab kuting. Yangi buyumni joylashtirishda
buferda operatsiyani davom ettirishga imkon beruvchi shart buferning to'liq emasligidir.

Iste'molchi 6 ta bufer xujayrasini o'qiydi: 0


Ishlab chiqaruvchi egallagan 7 ta bufer hujayrani yozadi: 1
Iste'molchi 7 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 8 ta bufer hujayralarini yozadi: 1
Iste'molchi 8 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 9 ta bufer hujayrani yozadi: 1
Iste'molchi 9 ta bufer xujayrasini o'qiydi: 0
Ishlab chiqaruvchi egallagan 10 ta bufer hujayrani yozadi: 1
Ishlab chiqaruvchi ishlab chiqarishni tugatdi
Ishlab chiqaruvchini tugatish
Iste'molchi band bo'lgan 10 ta bufer hujayralarini o'qiydi: 0
Iste'molchi o'qigan qiymatlar jami 55
Iste'molchini tugatish

2. Kutish, xabardor qilish va barchaga xabar berish haqida batafsil ma'lumot olish uchun Java Concurrency-ning 14-bobiga qarang.


Brayan Goetz va boshqalarning amaliyoti, Addison-Wesley Professional, 2006 yil.

23.15-rasm | To'g'ri amalga oshiradigan blokirovka buferini boshqaradigan ikkita ip


ishlab chiqaruvchi / iste'molchi munosabatlari. (2-qismning 2-qismi.)

988 23-bob Bir vaqtning o'zida

Buferdan elementni olishda, operatsiyani bajarishga ruxsat beruvchi shart
Davom etish - bufer bo'sh emas. Agar ko'rib chiqilayotgan shart to'g'ri bo'lsa, operatsiya
davom etishi mumkin; agar noto'g'ri bo'lsa, ip haqiqat bo'lguncha kutishi kerak. Ip bo'lganda
bir shart bilan kutib, u protsessor uchun tortishuvdan olib tashlanadi va ichiga joylashtiriladi
kutish holati va u ushlab turgan qulf bo'shatiladi.

Usullari kutish, xabardor qilish va barchani xabardor qilish


Ob'ekt usullarini kutish, xabardor qilish va notifyAll dan iplar yaratish shartlari bilan foydalanish mumkin
o'z vazifalarini bajara olmaganda kuting. Agar ip ob'ektda monitor qulfini olsa,
keyin u ob'ektdagi vazifasini ba'zi shartlar bajarilmaguncha davom ettira olmasligini aniqlaydi
qanoatlansa, ip sinxronlashtirilgan ob'ektda Object usulini kutishga qo'ng'iroq qilishi mumkin; bu chiqaradi
ob'ektda monitor qulflanadi va ip boshqa esa kutish holatida kutadi
mavzular ob'ektning sinxronlashtirilgan bayonot(lar)ini yoki usullarini kiritishga harakat qiladi. Ip qachon
sinxronlashtirilgan bayonotni (yoki usulini) bajarish shartni tugatadi yoki qondiradi
qaysi boshqa mavzu kutayotgan bo'lsa, u sinxronlashda Object method notify ni chaqirishi mumkin.
nized ob'ekti kutilayotgan ish zarrachasini yana ishga tushadigan holatga o'tishga imkon beradi. Bunda
nuqta, kutish holatidan ishga tushiriladigan holatga o'tgan ish zarrachalari -
ob'ektdagi monitor qulfini qayta sotib olishga vasvasaga soling. Ip qayta ega bo'lsa ham
monitor blokirovkasi bo'lsa ham, u hozirda o'z vazifasini bajara olmasligi mumkin - bu holda
ip kutish holatiga qayta kiradi va monitor blokirovkasini bilvosita chiqaradi. Agar mavzu qo'ng'iroq qilsa
sinxronlangan ob'ektda notifyAll, so'ngra monitor bloklanishini kutayotgan barcha iplar
qulfni qayta sotib olish huquqiga ega bo'ladi (ya'ni, ularning barchasi ishlaydigan holatga o'tadi).
Esda tutingki, bir vaqtning o'zida faqat bitta ip ob'ektdagi monitor qulfini olishi mumkin -
Xuddi shu monitor blokirovkasini olishga urinayotgan boshqa oqimlar oygacha bloklanadi.
itor blokirovkasi yana mavjud bo'ladi (ya'ni, sinxronlashtirilganda boshqa hech qanday oqim bajarilmaguncha
ushbu ob'ekt bo'yicha bayonot).

23.16 va 23.17-rasmlarda ishlab chiqaruvchi va iste'molchining umumiy foydalanishga kirishi ko'rsatilgan.


sinxronizatsiya bilan bufer. Bunday holda, Ishlab chiqaruvchi har doim birinchi navbatda qiymatni ishlab chiqaradi
Ishlab chiqaruvchi qiymat ishlab chiqargandan keyingina iste'molchi to'g'ri iste'mol qiladi va ishlab chiqaruvchi
Iste'molchi avvalgi (yoki birinchi)ni iste'mol qilgandan keyingina keyingi qiymatni to'g'ri ishlab chiqaradi.
qiymat. Biz bufer interfeysini va ishlab chiqaruvchi va iste'molchi sinflarini misoldan qayta ishlatamiz
23.5-qism, 28-qator ishlab chiqaruvchi va iste'molchi sinfidan olib tashlanganidan tashqari.

Sinxronlashtirilgan bufer sinfi


Sinxronizatsiya SynchronizedBuffer's blockingPut va blocking- sinfida amalga oshiriladi.
Interfeys Buferni (4-qator) amalga oshiradigan usullarni oling (23.16-rasm). Shunday qilib, Ishlab chiqaruvchining
va Iste'molchining ishga tushirish usullari oddiygina umumiy ob'ektning sinxronlashtirilgan blokirovkasini qo'ng'iroq qilish va chaqiradi

Umumiy dasturlash xatosi 23.1


Agar mavzu ob'ektda kutish, bildirishnoma yoki notifyAll funksiyasi mavjud bo'lmasa, bu xato.
Buning uchun qulf oldi. Bu IllegalMonitorStateException ni keltirib chiqaradi.

Xatolarning oldini olish bo'yicha maslahat 23.2


Kutilayotgan mavzularni ishga tushirish haqida xabar berish uchun notifyAll dan foydalanish yaxshi amaliyotdir. Qilish
shuning uchun dasturingiz kutish mavzularini unutib qo'yish ehtimolidan qochadi
aks holda och qolardi.

23.7 sinxronlashtirildi, kuting, xabardor qiling va barcha 989ni xabardor qiling

blockingGet usullari. Shunga qaramay, biz ushbu sinfning sinxronlashtirilgan usullaridan xabarlarni chiqaramiz
faqat namoyish qilish uchun - kiritish/chiqarish sinxronlashtirilgan bloklarda bajarilmasligi kerak
ob'ektning "qulflangan" vaqtini minimallashtirish muhim ahamiyatga ega.

1 // 23.16-rasm: SynchronizedBuffer.java


2 // Ob'ekt yordamida umumiy o'zgaruvchan ma'lumotlarga kirishni sinxronlash
3 // usullar kutish va barchani xabardor qilish.
4 umumiy sinf SynchronizedBuffer Buferni amalga oshiradi
5 {
6 xususiy int bufer = -1; // ishlab chiqaruvchi va iste'molchi mavzulari tomonidan baham ko'rilgan
7 xususiy mantiqiy ishg'ol qilingan = noto'g'ri;
8
9 // qiymatni buferga joylashtiring
10
11
12 {
13 // bo'sh joy bo'lmasa, ipni kutish holatiga qo'ying
14
15 {
16 // ip ma'lumotlari va bufer ma'lumotlarini chiqaring, keyin kuting
17 System.out.println("Prodyuser yozishga harakat qilmoqda."); // faqat demo uchun
18 displayState("Bufer to'lgan. Ishlab chiqaruvchi kutmoqda."); // faqat demo uchun
19
20 }
21
22
23
24
25
26
27
28 displayState("Ishlab chiqaruvchi yozadi " + bufer); // faqat demo uchun
29
30
31 } // tugatish usuli blockingPut; SynchronizedBuffer-da qulfni chiqaradi
32
33 // buferdan qiymatni qaytarish
34
35 {
36 // o'qish uchun ma'lumot yo'q bo'lsa, ipni kutish holatiga qo'ying
37 (! band)
38 {
39 // ip ma'lumotlari va bufer ma'lumotlarini chiqaring, keyin kuting
40 System.out.println("Iste'molchi o'qishga harakat qilmoqda."); // faqat demo uchun
41 displayState("Bufer bo'sh. Iste'molchi kutmoqda."); // faqat demo uchun
42
43 }
44
45
46
47

23.16-rasm | Ob'ekt usullaridan foydalangan holda umumiy o'zgaruvchan ma'lumotlarga kirishni sinxronlash kutish va


hammaga xabar bering. (2-qismning 1-qismi.)

umumiy sinxronlashtirilgan bekor blokirovkalashPut (int qiymati)


InterruptedException-ni tashlaydi

esa (ishg'ol qilingan)

Kutmoq();

bufer = qiymat; // yangi bufer qiymatini o'rnating

// ishlab chiqaruvchi boshqa qiymatni saqlay olmasligini bildiradi
// iste'molchi joriy bufer qiymatini olguncha
band = rost;

notifyAll(); // kutilayotgan ip(lar)ga ishga tushadigan holatga kirishni ayting

public synchronized in blockingGet() InterruptedException-ni tashlaydi

Kutmoq();

// ishlab chiqaruvchi boshqa qiymatni saqlashi mumkinligini bildiradi
// chunki iste'molchi hozirgina bufer qiymatini oldi
ishg'ol qilingan = noto'g'ri;

990 23-bob Bir vaqtdalik

Sinxronlashtirilgan bufer sinfining maydonlari va usullari
Sinxronlashtirilgan Buffer sinfi bufer (6-qator) va band (7-qator) maydonlarini o'z ichiga oladi - siz
SynchronizedBuffer sinfining ip ekanligini ta'minlash uchun ikkala maydonga kirishni sinxronlashtirishi kerak
xavfsiz. BlokingPut (10–31-qatorlar) va blockingGet (34–54-qatorlar) usullari eʼlon qilinadi.
sinxronlashtirilgan - bu usullardan biriga bir vaqtning o'zida faqat bitta ip qo'ng'iroq qilishi mumkin
SynchronizedBuffer obyekti. Ishg'ol qilingan dala uning mahsulot ekanligini aniqlash uchun ishlatiladi.
vazifani bajarish uchun er yoki Iste'molchining navbati. Bu maydon shartli iboralarda ishlatiladi
ham blockingPut, ham blockingGet usullarida. Agar ishg'ol qilingan noto'g'ri bo'lsa, bufer
bo'sh, shuning uchun iste'molchi bufer qiymatini o'qiy olmaydi, lekin ishlab chiqaruvchi val-
buferga kiriting. Agar band rost bo'lsa, iste'molchi buferdan qiymatni o'qiy oladi, lekin
Ishlab chiqaruvchi qiymatni buferga joylashtira olmaydi.
Qo'yish va ishlab chiqaruvchi mavzuni bloklash usuli
Producer ipining ishga tushirish usuli blokirovkalashning sinxronlashtirilgan usulini chaqirganda,
ip bilvosita SynchronizedBuffer ob'ektining monitor blokirovkasini olishga harakat qiladi.
Agar monitor blokirovkasi mavjud bo'lsa, Producer ipi bilvosita qulfni oladi. Keyin
14–20-qatorlardagi pastadir avval band qilingan rost yoki yoʻqligini aniqlaydi. Agar shunday bo'lsa, bufer to'lgan va biz
bufer bo'sh bo'lguncha kutishni xohlaysiz, shuning uchun 17-satr shuni ko'rsatadigan xabarni chiqaradi
Ishlab chiqaruvchi ip qiymat yozishga harakat qilmoqda va 18-satr displayState usulini chaqiradi
(57-61-qatorlar) bufer to'lganligini va Pro-
ducer ip bo'sh joy bo'lguncha kutmoqda. 19-qator kutish usulini chaqiradi (merosdan olingan
SynchronizedBuffer tomonidan ob'ekt) blockingPut usuli deb nomlangan ipni joylashtirish uchun (ya'ni,
Producer thread) SynchronizedBuffer obyekti uchun kutish holatida. Qo'ng'iroq
kutish chaqiruvchi ipni SynchronizedBuffer ob'ektidagi qulfni bilvosita bo'shatishiga olib keladi.
ob'ekt. Bu muhim, chunki ip hozirda o'z vazifasini bajara olmaydi va chunki
boshqa mavzular (bu holda, Iste'molchi) ruxsat berish uchun ob'ektga kirishga ruxsat berilishi kerak
shart (ishg'ol qilingan) o'zgarishi. Endi boshqa ish zarrachasi Syn-ni olishga harakat qilishi mumkin.
chronizedBuffer ob'ektining blokirovkasi va ob'ektning blockingPut yoki blockingGet-ni chaqirish
usul.

48
49 displayState("Iste'molchi o'qiydi" + bufer); // faqat demo uchun


50
51
52
53 qaytish buferi;
54 } // tugatish usuli blockingGet; SynchronizedBuffer-da qulfni chiqaradi
55
56 // joriy ish va bufer holatini ko'rsatish; faqat demo uchun
57 xususiy void displayState (String operatsiyasi)
58 {
59 System.out.printf("%-40s%d\t\t%b%n%n", operatsiya, bufer,
60 band);
61 }
62 } // so'nggi sinf SynchronizedBuffer

23.16-rasm | Ob'ekt usullaridan foydalangan holda umumiy o'zgaruvchan ma'lumotlarga kirishni sinxronlash kutish va


hammaga xabar bering. (2-qismning 2-qismi.)

notifyAll(); // kutilayotgan ip(lar)ga ishga tushadigan holatga kirishni ayting

sinxronlashtirilgan

23.7 sinxronlashtirildi, kuting, xabardor qiling va barcha 991ni xabardor qiling

Boshqa ish zarrachalari xabar bermaguncha, Producer ipi kutish holatida qoladi
Davom etishi mumkin bo'lgan ishlab chiqaruvchi - bu vaqtda Ishlab chiqaruvchi ishga tushadigan holatga qaytadi
va SynchronizedBuffer ob'ektidagi qulfni bilvosita qayta olishga harakat qiladi. Agar
qulf mavjud bo'lsa, Producer ipi uni qayta oladi va blockingPut usuli davom etadi
kutish qo'ng'irog'idan keyin keyingi bayonot bilan bajarish. Chunki kutish tsiklda chaqiriladi, the
halqani davom ettirish sharti ipning davom etishini aniqlash uchun yana sinovdan o'tkaziladi.
Agar yo'q bo'lsa, kutish yana chaqiriladi - aks holda blockingPut usuli bilan davom etadi
tsikldan keyingi keyingi gap.
BlokingPut usulidagi 22-qator qiymatni buferga belgilaydi. 26-qator to'plamlar
Buferda endi qiymat borligini ko'rsatish uchun rost qiymatiga tenglashtirildi (ya'ni, iste'molchi o'qiy oladi
qiymat, lekin Ishlab chiqaruvchi u erda boshqa qiymat qo'ya olmaydi). 28-qator usulni chaqiradi
ishlab chiqaruvchi yangi qiymat yozayotganini bildiruvchi xabarni chiqarish uchun displayState
bufer. 30-qator notifyAll usulini chaqiradi (Object-dan meros). Agar biron bir mavzu bo'lsa
SynchronizedBuffer ob'ektining monitor blokirovkasini kutayotgan bo'lsa, bu iplar ichiga kiradi
ishga tushirish mumkin va endi qulfni qayta olishga harakat qilishi mumkin. NotifyAll usuli qaytaradi
darhol va blockingPut usuli qo'ng'iroq qiluvchiga qaytadi (ya'ni, Producer's run
usuli). BlokingPut usuli qaytsa, u bilvosita monitor blokirovkasini chiqaradi
SynchronizedBuffer obyekti.

Bloklash usuli Get va Consumer Thread


BlokingGet va blockingPut usullari xuddi shunday amalga oshiriladi. Iste'molchi qachon
ipning ishga tushirish usuli blokirovkalashGet sinxronlashtirilgan usulini chaqiradi, ip harakat qiladi
SynchronizedBuffer ob'ektida monitor blokirovkasini oling. Agar qulf mavjud bo'lsa,
Iste'molchi ipi uni oladi. Keyin 37-43 qatorlardagi while tsikli oc-
cupied noto'g'ri. Agar shunday bo'lsa, bufer bo'sh, shuning uchun 40-satr shuni ko'rsatadigan xabarni chiqaradi
Iste'molchi ipi qiymatni o'qishga harakat qilmoqda va 41-satr displayState usulini chaqiradi
bufer bo'shligini va iste'molchi ipi kutilayotganligini ko'rsatadigan xabarni chiqaring.
ing. 42-qator usul blockingGet deb nomlangan ipni joylashtirish uchun kutish usulini chaqiradi
(ya'ni, iste'molchi) SynchronizedBuffer ob'ekti uchun kutish holatida. Yana qo'ng'iroq
kutish qo'ng'iroq qiluvchi ipni SynchronizedBuffer'dagi qulfni bilvosita bo'shatishiga olib keladi
ob'ekt, shuning uchun boshqa ish zarrachasi SynchronizedBuffer ob'ektining qulfini olishga harakat qilishi mumkin
va ob'ektning blockingPut yoki blockingGet usulini chaqiring. Agar Sinxro-
nizedBuffer mavjud emas (masalan, Produser hali usuldan qaytmagan bo'lsa
blockingPut), Iste'molchi qulf mavjud bo'lgunga qadar bloklanadi.
Iste'molchi to'plami boshqa oqim tomonidan xabardor qilinmaguncha kutish holatida qoladi
u davom etishi mumkin - bu vaqtda Consumer ipi ishga tushadigan holatga qaytadi va
SynchronizedBuffer ob'ektidagi qulfni bilvosita qayta olishga harakat qiladi. Agar qulf bo'lsa
mavjud bo'lsa, iste'molchi uni qayta sotib oladi va blockingGet usuli bilan ishlashda davom etadi
kutishdan keyin keyingi bayonot. Kutish tsiklda chaqirilganligi sababli, tsiklning davomi
dition, ip o'z bajarilishini davom ettirishi mumkinligini aniqlash uchun yana sinovdan o'tkaziladi. Agar
emas, kutish yana chaqiriladi - aks holda blockingGet usuli keyingi bilan davom etadi
tsikldan keyingi gap. 47-qator bufer hozir ekanligini ko'rsatish uchun noto'g'ri to'plamlarni egalladi
bo'sh (ya'ni, Iste'molchi qiymatni o'qiy olmaydi, lekin Ishlab chiqaruvchi boshqa qiymatni joylashtirishi mumkin
bufer), 49-qator iste'molchi o'qiyotganligini ko'rsatish uchun displayState usulini chaqiradi va
51-qator notifyAll usulini chaqiradi. Agar biron-bir mavzu qulfni yoqish uchun kutish holatida bo'lsa
ushbu SynchronizedBuffer ob'ekti, ular ishga tushadigan holatga kiradi va endi urinishlari mumkin

992 23-bob Bir vaqtning o'zida

qulfni qaytarib oling. Method notifyAll darhol qaytadi, so'ngra blockingGet usuli
chaqiruvchiga bufer qiymatini qaytaradi. BlokingGet usuli qaytsa, qulf yoqiladi
SynchronizedBuffer obyekti bilvosita chiqariladi.

DisplayState usuli ham sinxronlashtiriladi


E'tibor bering, displayState usuli sinxronlashtirilgan usuldir. Bu muhim, chunki
u ham SynchronizedBufferning umumiy o'zgaruvchan ma'lumotlarini o'qiydi. Faqat bitta mavzu bo'lsa-da
vaqt berilgan ob'ektning qulfini olishi mumkin, bitta ip bir xil ob'ektning qulfini olishi mumkin
bir necha marta - bu qayta kirish bloki sifatida tanilgan va bitta sinxronlashtirilgan usulni yoqadi
xuddi shu ob'ektda boshqasini chaqirish.
Sinxronlashtirilgan bufer sinfini sinash
SharedBufferTest2 sinfi (23.17-rasm) SharedBufferTest sinfiga o'xshaydi (23.13-rasm).
SharedBufferTest2 asosiy usulni o'z ichiga oladi (23.17-rasm, 9–26-qatorlar), u
ilova. 12-qator Ishlab chiqaruvchi va iste'molchi vazifalarini bajarish uchun ExecutorService yaratadi.
15-qator SynchronizedBuffer ob'ektini yaratadi va uning havolasini Bufer o'zgaruvchisiga tayinlaydi
umumiy joylashuv. Ushbu ob'ekt Ishlab chiqaruvchi va o'rtasida almashiladigan ma'lumotlarni saqlaydi
Iste'molchi. 17-18 qatorlar chiqish uchun ustun boshlarini ko'rsatadi. 21-22-qatorlar bajariladi a
Ishlab chiqaruvchi va iste'molchi. Nihoyat, 24-qator dasturni tugatish uchun o'chirish usulini chaqiradi
Ishlab chiqaruvchi va iste'molchi o'z vazifalarini bajarganda va 25-qator rejalashtirilgan vaqtni kutadi
bajarish uchun vazifalar. Asosiy usul tugashi bilan (26-satr), asosiy bajarilish chizig'i tugaydi.
Nates.

Xatolarning oldini olish bo'yicha maslahat 23.3


Har doim vazifa kutayotgan holatni sinab ko'radigan tsiklda kutish usulini chaqiring. Bu
ish zarrachasi ishga tushadigan holatga qayta kirishi mumkin (vaqt bo'yicha kutish yoki boshqa oqim orqali
shart bajarilishidan oldin notifyAll ni chaqirish. Vaziyatni yana sinovdan o'tkazish ta'minlaydi
agar u erta xabardor qilingan bo'lsa, ip noto'g'ri bajarilmaydi.

1 // 23.17-rasm: SharedBufferTest2.java


2 // Sinxronlashtirilgan buferni to'g'ri boshqaradigan ikkita oqim.
3 import java.util.concurrent.ExecutorService;
4 import java.util.concurrent.Executors;
5 import java.util.concurrent.TimeUnit;
6
7 umumiy sinf SharedBufferTest2
8 {
9 ta umumiy statik void main(String[] args) InterruptedExceptionni tashlaydi
10 {
11 // yangiCachedThreadPool yarating
12 ExecutorService executorService = Executors.newCachedThreadPool();
13
14
15
16
17 System.out.printf("%-40s%s\t\t%s%n%-40s%s%n%n", "Operatsiya",
18 "Bufer", "Boshlangan", "---------", "------\t\t--------");
19
23.17-rasm | Sinxronlashtirilgan buferni to'g'ri boshqaradigan ikkita ip. (3-qismning 1-qismi.)

// ints saqlash uchun SynchronizedBuffer yarating


Bufer sharedLocation = new SynchronizedBuffer();

23.7 sinxronlashtirildi, kuting, xabar bering va barcha 993ni xabardor qiling

20 // Ishlab chiqaruvchi va iste'molchi vazifalarini bajaring
21
22
23
24 excutorService.shutdown();
25 execcutorService.awaitTermination(1, TimeUnit.MINUTES);
26 }
27 } // yakuniy sinf SharedBufferTest2

Operatsiya buferi band


--------- ------ --------
Iste'molchi o'qishga harakat qiladi.
-1 noto'g'ri
Ishlab chiqaruvchi 1 1 rost deb yozadi
Iste'molchi 1 1 xatoni o'qiydi
Iste'molchi o'qishga harakat qiladi.
1 yolg'on
Ishlab chiqaruvchi 2 2 rost deb yozadi
Iste'molchi 2 2 ni noto'g'ri o'qiydi
Ishlab chiqaruvchi 3 3 rost deb yozadi
Iste'molchi 3 3 ni noto'g'ri o'qiydi
Ishlab chiqaruvchi 4 4 rost deb yozadi
Ishlab chiqaruvchi yozishga harakat qiladi.
4 rost
Iste'molchi 4 4 ni noto'g'ri o'qiydi
Ishlab chiqaruvchi 5 5 rost deb yozadi
Iste'molchi 5 5 ni noto'g'ri o'qiydi
Ishlab chiqaruvchi 6 6 rost deb yozadi
Ishlab chiqaruvchi yozishga harakat qiladi.
6 rost
Iste'molchi 6 6 ni noto'g'ri o'qiydi
Ishlab chiqaruvchi 7 7 rost deb yozadi
Ishlab chiqaruvchi yozishga harakat qiladi.
7 haqiqat
Iste'molchi 7 7 ni noto'g'ri o'qiydi
Ishlab chiqaruvchi 8 8 rost deb yozadi
Iste'molchi 8 8 ni noto'g'ri o'qiydi
Iste'molchi o'qishga harakat qiladi.
8 yolg'on
23.17-rasm | Sinxronlashtirilgan buferni to'g'ri boshqaradigan ikkita ip. (3 qismning 2-qismi.)

execcutorService.execute(yangi Producer(sharedLocation));


execcutorService.execute(yangi iste'molchi(sharedLocation));

Bufer bo'sh. Iste'molchi kutmoqda.

Bufer bo'sh. Iste'molchi kutmoqda.

Bufer toʻlgan. Ishlab chiqaruvchi kutmoqda.

Bufer toʻlgan. Ishlab chiqaruvchi kutmoqda.

Bufer toʻlgan. Ishlab chiqaruvchi kutmoqda.

Bufer bo'sh. Iste'molchi kutmoqda.

994 23-bob Parametrlilik

23.17-rasmdagi natijalarni o'rganing. E'tibor bering, ishlab chiqarilgan har bir butun son aniq iste'mol qilinadi
bir marta - hech qanday qiymat yo'qolmaydi va hech qanday qiymat bir martadan ortiq iste'mol qilinmaydi. Sinxronizatsiya
Ishlab chiqaruvchi faqat bufer bo'sh bo'lganda qiymat ishlab chiqarishini ta'minlaydi va
sumer faqat bufer to'lganida iste'mol qiladi. Ishlab chiqaruvchi har doim birinchi o'rinda turadi, iste'molchi
Ishlab chiqaruvchi iste'molchi oxirgi marta iste'mol qilganidan beri ishlab chiqarmagan bo'lsa, kutadi va Pro-
ducer, agar iste'molchi hali ishlab chiqaruvchi eng ko'p qiymatni iste'mol qilmagan bo'lsa, kutadi
yaqinda ishlab chiqarilgan. Bu dasturni bir necha marta bajaring va har bir butun son pro-
duced aynan bir marta iste'mol qilinadi. Namuna chiqishida alohida ajratilgan qatorlarga e'tibor bering.
Ishlab chiqaruvchi va iste'molchi o'z vazifalarini bajarish uchun kutishlari kerak bo'lganda.
23.8 (Kengaytirilgan) Ishlab chiqaruvchi/iste'molchi munosabatlari:
Cheklangan buferlar
23.7-bo'limdagi dastur ikkita mavzuni kafolatlash uchun ip sinxronlashidan foydalanadi
umumiy buferdagi ma'lumotlarni to'g'ri boshqarish. Biroq, dastur bajarilmasligi mumkin
optimal tarzda. Agar ikkita ip har xil tezlikda ishlasa, ulardan biri ko'proq sarflaydi (yoki
ko'p) vaqti kutish. Misol uchun, 23.7-bo'limdagi dasturda biz bittasini baham ko'rdik
ikki ip orasidagi butun o'zgaruvchi. Agar Producer ipi qiymatlarni tezroq ishlab chiqarsa
Iste'molchi ularni iste'mol qilishi mumkin bo'lganidan ko'ra, ishlab chiqaruvchi ip iste'molchini kutadi,
chunki buferda keyingi qiymatni joylashtirish uchun boshqa joylar yo'q. O'xshash
Odatda, agar iste'molchi qiymatlarni ishlab chiqaruvchi ularni ishlab chiqarganidan tezroq iste'mol qilsa, shartnoma
sumer Ishlab chiqaruvchi keyingi qiymatni umumiy buferga joylashtirguncha kutadi. Hatto biz qachon
bir xil nisbiy tezlikda ishlaydigan iplar bo'lsa, bu iplar vaqti-vaqti bilan bo'lishi mumkin
vaqt o'tishi bilan "sinxron" kelib, ulardan biri ikkinchisini kutishiga sabab bo'ladi.

Ishlab chiqaruvchi 9 9 rost deb yozadi


Iste'molchi 9 9 ni noto'g'ri o'qiydi
Iste'molchi o'qishga harakat qiladi.
9 yolg'on
Ishlab chiqaruvchi 10 10 rost deb yozadi
Iste'molchi 10 10 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi ishlab chiqarishni tugatdi


Ishlab chiqaruvchini tugatish
Iste'molchi o'qigan qiymatlar jami 55
Iste'molchini tugatish

Ishlash bo'yicha maslahat 23.3


Biz bir vaqtning o'zida oqimlarning nisbiy tezligi haqida taxmin qila olmaymiz -
operatsion tizim, tarmoq, foydalanuvchi va boshqa tarkibiy qismlar bilan sodir bo'ladigan o'zaro ta'sirlar.
nentlar iplarning har xil va doimiy o'zgaruvchan tezlikda ishlashiga olib kelishi mumkin. Bu qachon
sodir bo'ladi, iplar kutadi. Mavzular haddan tashqari kutilganda, dasturlarning samaradorligi pasayadi,
interaktiv dasturlar kamroq javob beradi va ilovalar uzoqroq kechikishlarga duchor bo'ladi.

23.17-rasm | Sinxronlashtirilgan buferni to'g'ri boshqaradigan ikkita ip. (3 qismning 3-qismi.)

Bufer bo'sh. Iste'molchi kutmoqda.

23.8 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi munosabatlari: Chegaralangan buferlar 995



Cheklangan buferlar
Resurslarni baham ko'radigan va ishlaydigan oqimlar uchun kutish vaqtini minimallashtirish uchun
bir xil o'rtacha tezliklar, biz qattiq raqamni ta'minlaydigan cheklangan buferni amalga oshirishimiz mumkin
Ishlab chiqaruvchi qiymatlarni joylashtirishi mumkin bo'lgan va Iste'molchi qo'yishi mumkin bo'lgan bufer hujayralar
bu qiymatlarni oling. (Aslida, biz buni ArrayBlockingQueue klassi bilan qilganmiz
23.6-bo'limda.) Agar Ishlab chiqaruvchi vaqtincha qiymatlarni iste'molchiga nisbatan tezroq ishlab chiqarsa
Agar mavjud bo'lsa, ishlab chiqaruvchi qo'shimcha bufer hujayralariga qo'shimcha qiymatlarni yozishi mumkin
mavjud. Bu qobiliyat ishlab chiqaruvchiga o'z vazifasini bajarishga imkon beradi
Iste'molchi ishlab chiqarilayotgan joriy qiymatni olishga tayyor emas. Xuddi shunday, agar Con-
Sumer ishlab chiqaruvchi yangi qiymatlarni ishlab chiqarishdan ko'ra tezroq iste'mol qiladi, iste'molchi reklamani o'qiy oladi.
buferdan ditional qiymatlar (agar mavjud bo'lsa). Bu iste'molchiga band bo'lishga imkon beradi
Ishlab chiqaruvchi qo'shimcha qiymatlarni ishlab chiqarishga tayyor bo'lmasa ham. ga misol
Cheklangan buferdan foydalanadigan ishlab chiqaruvchi/iste'molchi munosabatlari video oqimidir, biz uni
23.1-bo'limda muhokama qilingan.
Agar ishlab chiqaruvchi va iste'molchi o'zaro hamkorlikda ishlayotgan bo'lsa, hatto chegaralangan bufer ham mos kelmaydi.
doimiy ravishda turli tezliklarda. Agar iste'molchi har doim ishlab chiqaruvchidan tezroq bajarsa, u holda
bitta joyni o'z ichiga olgan bufer etarli. Agar Ishlab chiqaruvchi har doim tezroq bajarsa, faqat a
"cheksiz" joylarga ega bufer qo'shimcha mahsulotni o'zlashtira oladi.
tion. Biroq, agar ishlab chiqaruvchi va iste'molchi taxminan bir xil o'rtacha tezlikda bajarsa, a
chegaralangan bufer har qanday vaqti-vaqti bilan tezlashtirish yoki sekinlashuvning ta'sirini yumshatishga yordam beradi
har ikkala mavzuning bajarilishida.
Taxminan ishlaydigan ishlab chiqaruvchi va iste'molchi bilan chegaralangan buferdan foydalanish kaliti
bir xil tezlik buferni kutilganlarni boshqarish uchun etarli joylar bilan ta'minlashdir
"qo'shimcha" ishlab chiqarish. Agar ma'lum vaqt ichida biz ishlab chiqaruvchining tez-tez pro-
Iste'molchi iste'mol qilishi mumkin bo'lgan qiymatdan uchta ko'proq qiymatga ega bo'lsa, biz ta'minlay olamiz
qo'shimcha ishlab chiqarishni boshqarish uchun kamida uchta hujayradan iborat bufer. Buferni juda kichik qilish
iplarning uzoqroq kutishiga olib keladi.
[Izoh: 23.22-rasmda aytib o'tganimizdek, ArrayBlockingQueue bir nechta bilan ishlashi mumkin.
ishlab chiqaruvchilar va ko'plab iste'molchilar. Masalan, o'z mahsulotini juda ko'p ishlab chiqaradigan zavod
Tezda ushbu mahsulotlarni olib tashlash uchun yana ko'plab yuk mashinalari (ya'ni iste'molchilar) bo'lishi kerak.
omborxona hududidan (ya'ni, chegaralangan buferdan) tezda chiqib ketadi, shunda zavod
to'liq quvvat bilan mahsulot ishlab chiqarishni davom ettiring.]

ArrayBlockingQueue yordamida chegaralangan buferlar


Cheklangan buferni amalga oshirishning eng oddiy usuli - ArrayBlockingQueue dan foydalanish
sinxronizatsiya tafsilotlari siz uchun qayta ishlanishi uchun bufer. Bu modda yordamida amalga oshirilishi mumkin.
23.6-bo'limdagi misoldan foydalanib, chegaralangan bufer uchun kerakli o'lchamni
ArrayBlockingQueue konstruktori. Oldingi ArrayBlockingQueue-ni takrorlash o'rniga
boshqa o'lchamdagi misol, buning o'rniga qanday qilib amalga oshirishingiz mumkinligini ko'rsatadigan misolni taqdim etamiz

Ishlash bo'yicha maslahat 23.4


Cheklangan buferdan foydalanganda ham, ishlab chiqaruvchi ip bufni to'ldirishi mumkin.
fer, bu ishlab chiqaruvchini iste'molchini ozod qilish uchun qiymatni iste'mol qilguncha kutishga majbur qiladi
buferdagi element. Xuddi shunday, agar bufer istalgan vaqtda bo'sh bo'lsa, iste'molchi
ip ishlab chiqaruvchi boshqa qiymat hosil qilguncha kutishi kerak. Cheklangan foydalanish uchun kalit
bufer ish zarrachalarini kutish vaqtini minimallashtirish uchun bufer hajmini optimallashtirishdir
joyni isrof qilmaslik.

996 23-bob Bir vaqtdalik

o'zingiz chegaralangan buferni yarating. Shunga qaramay, ArrayBlockingQueue dan foydalanish ko'proq natijaga olib keladi -
barqaror va yaxshi ishlaydigan kod. 23.13-mashqda biz buni qaytadan amalga oshirishingizni so'raymiz
23.9-bo'limda keltirilgan Java Concurrency API texnikasidan foydalangan holda bo'lim misoli.
O'zingizning chegaralangan buferingizni doiraviy bufer sifatida amalga oshirish
Shakldagi dastur. 23.18 va 23.19-da ishlab chiqaruvchi va iste'molchi kirish imkoniyatini ko'rsatadi.
sinxronizatsiya bilan chegaralangan bufer. Shunga qaramay, biz bufer interfeysi va Pro sinflarini qayta ishlatamiz.
23.5-bo'limdagi misoldan ducer va Consumer, bundan tashqari 28-qator olib tashlangan
ishlab chiqaruvchi va iste'molchi sinfidan. Biz Cir- sinfida chegaralangan buferni amalga oshiramiz.
cularBuffer (23.18-rasm) uchta elementdan iborat umumiy massivdan foydalanadigan dumaloq bufer sifatida. A
dumaloq bufer massiv elementlariga birinchidan boshlab tartibda yozadi va o'qiydi
hujayra va oxirgi tomon harakatlanadi. Ishlab chiqaruvchi yoki iste'molchi oxirgi elementga yetganda,
birinchisiga qaytadi va u yerdan mos ravishda yozish yoki o'qishni boshlaydi. Ushbu versiyada
Ishlab chiqaruvchi/iste'molchi munosabatlarida iste'molchi qiymatni faqat o'z-o'zidan paydo bo'lganda iste'mol qiladi.
ray bo'sh emas va Produser faqat massiv to'liq bo'lmaganda qiymat hosil qiladi. Bir marta
Shunga qaramay, ushbu sinfning sinxronlashtirilgan usullarida ishlatiladigan chiqish bayonotlari namoyish qilish uchundir.
faqat maqsadlarda.

1 // 23.18-rasm: CircularBuffer.java


2 // Umumiy uch elementli chegaralangan buferga kirishni sinxronlash.
3 umumiy sinf CircularBuffer Buferni amalga oshiradi
4 {
5 xususiy final int[] bufer = {-1, -1, -1}; // umumiy bufer
6
7 ta xususiy int occupiedCells = 0; // ishlatilgan buferlar sonini hisoblash
8 xususiy int writeIndex = 0; // yozish uchun keyingi elementning indeksi
9 xususiy int readIndex = 0; // o'qiladigan keyingi elementning indeksi
10
11 // qiymatni buferga joylashtiring
12
13
14 {
15 // buferda bo'sh joy bo'lguncha kuting, so'ngra qiymat yozing;
16
17
18
19
20
21
22
23 bufer[writeIndex] = qiymat; // yangi bufer qiymatini o'rnating
24
25 // dumaloq yozish indeksini yangilash
26
27
28 ++ band qilingan hujayralar; // yana bitta bufer hujayra to'lgan
29 displayState("Ishlab chiqaruvchi yozadi " + qiymat);
30 notifyAll(); // buferdan o'qishni kutayotgan mavzularni xabardor qilish
31 }

23.18-rasm | Umumiy uch elementli chegaralangan buferga kirishni sinxronlash. (3-qismning 1-qismi.)

umumiy sinxronlashtirilgan bekor blokirovkalashPut (int qiymati)
InterruptedException-ni tashlaydi

// bo'sh joy bo'lmasa, ipni bloklangan holatda joylashtiring


while (occpiedCells == buffer.length)
{
System.out.printf("Bufer to'lgan. Ishlab chiqaruvchi kutmoqda.%n");
Kutmoq(); // bufer hujayra bo'sh bo'lguncha kuting
} // tugash vaqti

writeIndex = (writeIndex + 1) % bufer.uzunlik;


23.8 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi munosabatlari: Cheklangan buferlar 997

32
33 // buferdan qiymatni qaytarish
34 ommaviy sinxronlashtirilgan int blockingGet() InterruptedException-ni tashlaydi
35 {
36 // buferda ma'lumotlar bo'lguncha kuting, keyin qiymatni o'qing;
37 // o'qish uchun ma'lumot yo'q bo'lsa, ipni kutish holatiga qo'ying
38 vaqt (ishg'ol qilingan hujayralar == 0)
39 {
40 System.out.printf("Bufer bo'sh. Iste'molchi kutmoqda.%n");
41 kutish (); // bufer katak to'lguncha kuting
42 } // tugash vaqti
43
44 int readValue = bufer[readIndex]; // buferdan qiymatni o'qish
45
46 // dumaloq o'qish indeksini yangilash
47
48
49 - ishg'ol qilingan hujayralar; // bir nechta bufer hujayralar band
50 displayState("Iste'molchi o'qiydi" + readValue);
51 notifyAll(); // buferga yozishni kutayotgan mavzularni xabardor qilish
52
53 o'qish qiymatini qaytarish;
54 }
55
56 // joriy ish va bufer holatini ko'rsatish
57 ommaviy void displayState (String operatsiyasi)
58 {
59 // chiqish ishi va ishg'ol qilingan bufer hujayralari soni
60 System.out.printf("%s%s%d)%n%s", operatsiya,
61 " (bufer hujayralar band: ", occupiedCells, "bufer hujayralar: ");
62
63 uchun (int qiymati: bufer)
64 System.out.printf(" %2d ", qiymat); // buferdagi chiqish qiymatlari
65
66 System.out.printf("%n ");
67
68 uchun (int i = 0; i < buffer.length; i++)
69 System.out.print("---- ");
70
71 System.out.printf("%n ");
72
73 uchun (int i = 0; i < buffer.length; i++)
74 {
75 agar (i == writeIndex && i == readIndex)
76 System.out.print("WR"); // ham yozish va o'qish indeksi
77 boshqa agar (i == writeIndex)
78 System.out.print("Vt"); // shunchaki indeks yozing
79 boshqa agar (i == readIndex)
80 System.out.print(" R "); // shunchaki indeksni o'qing
yana 81
82 System.out.print(" "); // na indeks
83 }
84

23.18-rasm | Umumiy uch elementli chegaralangan buferga kirishni sinxronlash. (3 qismning 2-qismi.)

readIndex = (readIndex + 1) % bufer.uzunlik;

sinxronlashtirilgan


998 23-bob Parametrlilik



5-qator massiv buferini aylanani ifodalovchi uch elementli int massiv sifatida ishga tushiradi.
bufer. OccupiedCells o'zgaruvchisi (7-qator) buferdagi elementlar sonini hisoblaydi
o'qilishi kerak bo'lgan ma'lumotlarni o'z ichiga oladi. OccupedBuffers 0 bo'lsa, aylana bufer bo'sh va
Iste'molchi kutishi kerak - ishg'ol qilingan hujayralar 3 ga (dumaloq bufer hajmi) bo'lganda
Bufer to'lgan va ishlab chiqaruvchi kutishi kerak. writeIndex o'zgaruvchisi (8-qator) ni bildiradi
qiymat ishlab chiqaruvchi tomonidan joylashtirilishi mumkin bo'lgan keyingi joy. O'zgaruvchan o'qish indeksi (9-qator)
keyingi qiymat Iste'molchi tomonidan o'qilishi mumkin bo'lgan pozitsiyani ko'rsatadi. Doiraviy-
Bufer namunasi o'zgaruvchilari sinfning umumiy o'zgaruvchan ma'lumotlarining bir qismidir, shuning uchun barchaga kirish
CircularBuffer ip xavfsiz bo'lishini ta'minlash uchun ushbu o'zgaruvchilar sinxronlashtirilishi kerak.
CircularBuffer Method blockingPut
CircularBuffer usuli blokirovkalashPut (12–31-qatorlar) xuddi shu vazifalarni bajaradi.
23.16-rasm, bir nechta o'zgartirishlar bilan. 17-21-qatorlardagi pastadir aniqlaydi
Ishlab chiqaruvchi kutishi kerak (ya'ni, barcha bufer hujayralari to'lgan). Agar shunday bo'lsa, 19-satr Ishlab chiqaruvchini ko'rsatadi
vazifasini bajarishni kutmoqda. Keyin 20-qator kutish usulini chaqiradi, bu esa Ishlab chiqaruvchiga sabab bo'ladi
CircularBuffer qulfini bo'shatish uchun ipni oching va yangi qiymat uchun joy bo'lguncha kuting
buferga yoziladi. Bajarish while siklidan keyin 23-satrda davom etsa,
Ishlab chiqaruvchi tomonidan yozilgan qiymat writeIndex manzilidagi dumaloq buferga joylashtiriladi. Keyin
26-satr CircularBuffer usuli blockingPut-ga keyingi qo'ng'iroq qilish uchun writeIndex-ni yangilaydi.
Bu chiziq bufer aylanasining kalitidir. writeIndex o'tgandan keyin oshirilganda
bufer oxirida, satr uni 0 ga o'rnatadi. 28-satr ishg'ol qilingan hujayralarni oshiradi, chunki u erda
endi buferda Iste'molchi o'qishi mumkin bo'lgan yana bir qiymat. Keyinchalik, 29-satr meth-ni chaqiradi
od displayState (57–86 qatorlar) ishlab chiqarilgan qiymat, raqam bilan chiqishni yangilash uchun
ishg'ol qilingan bufer hujayralar, bufer hujayralar tarkibi va joriy writeIndex va
o'qish indeksi. 30-qator kutilayotgan iplarni ishga tushirishga o'tkazish uchun notifyAll usulini chaqiradi.
kutayotgan Iste'molchi ipi (agar mavjud bo'lsa) endi a o'qish uchun qayta urinib ko'rishi mumkin
buferdan olingan qiymat.
CircularBuffer Method blockingGet
CircularBuffer usuli blockingGet (34–54-qatorlar) ham xuddi shunday vazifalarni bajaradi.
23.16-rasmda, bir nechta kichik o'zgarishlar bilan. 38-42-qatorlardagi halqa (23.18-rasm) de-
Iste'molchi kutish kerakmi yoki yo'qligini tugatadi (ya'ni, barcha bufer katakchalari bo'sh). Agar iste'molchi
kutish kerak, 40-satr Iste'molchi bajarishni kutayotganligini bildirish uchun chiqishni yangilaydi
uning vazifasi. Keyin 41-satr kutish usulini chaqiradi, bu esa joriy ipning qulfni bo'shatishiga olib keladi
CircularBuffer-da o'qing va ma'lumotlar o'qish uchun mavjud bo'lguncha kuting. Qachon oxir-oqibat ijro etilmoqda
Ishlab chiqaruvchidan bildirilgan barcha qo'ng'iroqdan keyin 44-qatorda davom etadi, readValue qiymati tayinlanadi
dumaloq buferdagi readIndex manzilidagi qiymat. Keyin 47-qator uchun readIndex yangilanadi
CircularBuffer usuliga keyingi qo'ng'iroq blockingGet. Ushbu chiziq va 26-qator amalga oshiradi
buferning aylanmaligi. 49-satr ishg'ol qilingan hujayralarni kamaytiradi, chunki hozir bittasi bor
Buferdagi ko'proq joy, unda ishlab chiqaruvchi ip qiymatni joylashtirishi mumkin. 50-qator -
chiqishni iste'mol qilingan qiymat, raqam bilan yangilash uchun displayState usulini vokes

85 System.out.printf("%n%n");


86 }
87 } // oxirgi sinf CircularBuffer

23.18-rasm | Umumiy uch elementli chegaralangan buferga kirishni sinxronlash. (3 qismning 3-qismi.)


23.8 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi munosabatlari: Cheklangan buferlar 999

ishg'ol qilingan bufer hujayralar, bufer hujayralar tarkibi va joriy writeIndex va
o'qish indeksi. 51-qator har qanday Prodyuser oqimlarini kutishga ruxsat berish uchun notifyAll usulini chaqiradi
qayta yozishga harakat qilish uchun CircularBuffer obyektiga yozing. Keyin 53 qatorni qaytaradi
qo'ng'iroq qiluvchiga iste'mol qilingan qiymat.
CircularBuffer Method displayState
DisplayState usuli (57–86-qatorlar) ilova holatini chiqaradi. 63-64 qatorlar chiqdi
bufer hujayralarining qiymatlari. 64-qator "%2d" format spetsifikatsiyasi bilan printf usulidan foydalanadi
har bir buferning mazmunini, agar u bitta raqam bo'lsa, bosh bo'sh joy bilan chop etish uchun. 71–83 qatorlar
joriy writeIndex va readIndex ni mos ravishda W va R harflari bilan chiqaring. Bir marta
yana, displayState sinxronlashtirilgan usuldir, chunki u CircularBuffer sinfiga kiradi
almashiladigan o'zgaruvchan ma'lumotlar.
Sinov sinfi CircularBuffer
Class CircularBufferTest (23.19-rasm) ilovani ishga tushiradigan asosiy usulni o'z ichiga oladi.
takrorlash. 12-satr ExecutorService-ni yaratadi va 15-qator CircularBuffer ob'ektini yaratadi.
ject va uning havolasini CircularBuffer o'zgaruvchisi sharedLocation ga tayinlaydi. 18-qator
bufning dastlabki holatini ko'rsatish uchun CircularBufferning displayState usulini chaqiradi.
fer. 21-22 qatorlar Ishlab chiqaruvchi va Iste'molchi vazifalarini bajaradi. 24-qator qo'ng'iroqlar usulini o'chirish
iplar Ishlab chiqaruvchi va Iste'molchi vazifalarini bajarganida dasturni tugatish va
25-qator vazifalarni bajarishni kutadi.

1 // 23.19-rasm: CircularBufferTest.java


2 // Ishlab chiqaruvchi va iste'molchi iplari dumaloq buferni to'g'ri boshqaradi.
3 import java.util.concurrent.ExecutorService;
4 import java.util.concurrent.Executors;
5 import java.util.concurrent.TimeUnit;
6
7 ommaviy sinf CircularBufferTest
8 {
9 ta umumiy statik void main(String[] args) InterruptedExceptionni tashlaydi
10 {
11 // ikkita ipli yangi iplar hovuzini yarating
12 ExecutorService executorService = Executors.newCachedThreadPool();
13
14
15
16
17 // CircularBuffer ning dastlabki holatini ko'rsatish
18 sharedLocation.displayState("Dastlabki holat");
19
20 // Ishlab chiqaruvchi va iste'molchi vazifalarini bajaring
21
22
23
24 excutorService.shutdown();
25 execcutorService.awaitTermination(1, TimeUnit.MINUTES);
26 }
27 } // yakuniy sinf CircularBufferTest
23.19-rasm | Ishlab chiqaruvchi va iste'molchi iplari dumaloq buferni to'g'ri boshqaradi. (3-qismning 1-qismi.)

// ints saqlash uchun CircularBuffer yarating


CircularBuffer sharedLocation = new CircularBuffer();

execcutorService.execute(yangi Producer(sharedLocation));


execcutorService.execute(yangi iste'molchi(sharedLocation));

1000 23-bob Parametrlilik

Dastlabki holat (bufer hujayralar band: 0)
bufer hujayralar: -1 -1 -1
---- ---- ----
WR

Ishlab chiqaruvchi 1 yozadi (bufer hujayralar band: 1)


bufer hujayralar: 1 -1 -1
---- ---- ----
RW

Iste'molchi o'qiydi 1 (bufer hujayralar band: 0)


bufer hujayralar: 1 -1 -1
---- ---- ----
WR

Ishlab chiqaruvchi 2 yozadi (bufer hujayralar band: 1)


bufer hujayralar: 1 2 -1
---- ---- ----
RW

Iste'molchi o'qiydi 2 (bufer hujayralar band: 0)


bufer hujayralar: 1 2 -1
---- ---- ----
WR

Ishlab chiqaruvchi 3 ta yozadi (bufer hujayralar band: 1)


bufer hujayralar: 1 2 3
---- ---- ----
WR

Iste'molchi o'qiydi 3 (bufer hujayralar band: 0)


bufer hujayralar: 1 2 3
---- ---- ----
WR

Ishlab chiqaruvchi 4 ta yozadi (bufer hujayralar band: 1)


bufer hujayralar: 4 2 3
---- ---- ----
RW

Ishlab chiqaruvchi 5 ta yozadi (bufer hujayralar band: 2)


bufer hujayralar: 4 5 3
---- ---- ----
RW

Iste'molchi o'qiydi 4 (bufer hujayralar band: 1)


bufer hujayralar: 4 5 3
---- ---- ----
RW

Ishlab chiqaruvchi 6 yozadi (bufer hujayralar band: 2)


bufer hujayralar: 4 5 6
---- ---- ----
WR

23.19-rasm | Ishlab chiqaruvchi va iste'molchi iplari dumaloq buferni to'g'ri boshqaradi. (3 qismning 2-qismi.)

Bufer boʻsh. Iste'molchi kutmoqda.

23.8 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi munosabatlari: 1001 chegaralangan buferlar

Ishlab chiqaruvchi 7 yozadi (bufer hujayralar band: 3)
bufer hujayralar: 7 5 6
---- ---- ----
WR

Iste'molchi o'qiydi 5 (bufer hujayralar band: 2)


bufer hujayralar: 7 5 6
---- ---- ----
WR

Ishlab chiqaruvchi 8 ta yozadi (bufer hujayralar band: 3)


bufer hujayralar: 7 8 6
---- ---- ----
WR

Iste'molchi o'qiydi 6 (bufer hujayralar band: 2)


bufer hujayralar: 7 8 6
---- ---- ----
RW

Iste'molchi o'qiydi 7 (bufer hujayralar band: 1)


bufer hujayralar: 7 8 6
---- ---- ----
RW

Ishlab chiqaruvchi 9 yozadi (bufer hujayralar band: 2)


bufer hujayralar: 7 8 9
---- ---- ----
WR

Iste'molchi o'qiydi 8 (bufer hujayralar band: 1)


bufer hujayralari: 7 8 9
---- ---- ----
WR

Iste'molchi o'qiydi 9 (bufer hujayralar band: 0)


bufer hujayralari: 7 8 9
---- ---- ----
WR

Ishlab chiqaruvchi 10 ni yozadi (bufer hujayralar band: 1)


bufer hujayralar: 10 8 9
---- ---- ----
RW

Ishlab chiqaruvchi ishlab chiqarishni tugatdi


Ishlab chiqaruvchini tugatish
Iste'molchi 10 ni o'qiydi (bufer hujayralar band: 0)
bufer hujayralar: 10 8 9
---- ---- ----
WR

Jami iste'molchi o'qish qiymatlari: 55


Iste'molchini tugatish

23.19-rasm | Ishlab chiqaruvchi va iste'molchi iplari dumaloq buferni to'g'ri boshqaradi. (3 qismning 3-qismi.)


1002 23-bob Parametrlilik

Har safar ishlab chiqaruvchi qiymat yozganda yoki iste'molchi qiymatni o'qiganda, dastur o'z-o'zidan chiqib ketadi.
bajarilgan harakatni (o'qish yoki yozish), bufer tarkibini ko'rsatadigan xabarni qo'yadi,
va writeIndex va readIndex joylashuvi. 23.19-rasmning chiqishida Ishlab chiqaruvchi
avval 1 qiymatini yozadi. Keyin bufer birinchi katakchadagi 1 qiymatini va qiymatni o'z ichiga oladi
–1 (biz chiqish uchun foydalanadigan standart qiymat) qolgan ikkita katakchada. Yozish
indeks ikkinchi katakchaga yangilanadi, o'qilgan indeks esa birinchi katakchada qoladi. Keyingi,
Iste'molchi o'qiydi 1. Bufer bir xil qiymatlarni o'z ichiga oladi, lekin o'qish indeksi bo'lgan
ikkinchi katakchaga yangilangan. Keyin iste'molchi yana o'qishga harakat qiladi, ammo bufer bo'sh
va Iste'molchi kutishga majbur bo'ladi. Dasturning ushbu bajarilishida faqat bir marta kerak edi
har ikkala mavzuni kutish uchun insho.

23.9 (Kengaytirilgan) Ishlab chiqaruvchi/Iste'molchi munosabatlari: The


Qulflash va holat interfeyslari
Sinxronlashtirilgan kalit so'z ko'pgina asosiy ip-sinxronizatsiyani ta'minlaydi
kerak bo'lsa, Java parallel dasturlarni ishlab chiqishda yordam beradigan boshqa vositalarni taqdim etadi. Bu sekundda -
Biz Qulflash va Holat interfeyslarini muhokama qilamiz. Ushbu interfeyslar sizga aniqroq ma'lumot beradi
ip sinxronizatsiyasini boshqarish, lekin ulardan foydalanish ancha murakkab. Faqat eng ko'p reklama -
Ilg'or dasturchilar ushbu interfeyslardan foydalanishlari kerak.

Interfeys qulfi va Class ReentrantLock


Har qanday ob'ekt Lock interfeysini amalga oshiradigan ob'ektga havolani o'z ichiga olishi mumkin
java.util.concurrent.locks to'plami). Tarmoq Lockning qulflash usulini chaqiradi (analo-
gous sinxronlangan blokga kirish) qulfni olish uchun. Qulf o'rnatilgandan so'ng
Agar bitta ip bilan bog'langan bo'lsa, Lock ob'ekti boshqa ipga Lockni olishga ruxsat bermaydi
birinchi ip Qulfni chiqaradi (Lockning qulfini ochish usulini chaqirish orqali - oldingisiga o'xshash
sinxronlashtirilgan blokdan foydalanish). Agar bir nechta mavzular bir xil usulda qulfni chaqirishga harakat qilsa
Bir vaqtning o'zida ob'ektni bloklash, bu iplardan faqat bittasi qulfni olishi mumkin - qolganlari
o'sha qulf uchun kutish holatiga joylashtiriladi. Mavzu qulfni ochish usulini chaqirganda, qulf
ob'ektda bo'shatiladi va ob'ektni blokirovka qilishga urinayotgan kutish ipi davom etadi.

ReentrantLock klassi (java.util.concurrent.locks to'plami) asosiy vazifadir.


Lock interfeysini eslatib o'tish. ReentrantLock konstruktori mantiqiy qiymatni oladi
qulfning adolat siyosatiga ega yoki yo'qligini ko'rsatadigan argument. Agar argument to'g'ri bo'lsa,
ReentrantLockning adolat siyosati: "eng uzoq kutilgan ip qulfni oladi.
u mavjud." Bunday adolat siyosati noma'lum kechiktirishni kafolatlaydi (shuningdek
ochlik) yuzaga kelishi mumkin emas. Agar adolat siyosati argumenti noto'g'ri bo'lsa, hech qanday kafolat yo'q.
Qaysi kutish ipi mavjud bo'lganda qulfni olishini oldindan biling.

Xatolarning oldini olish bo'yicha maslahat 23.4


Nihoyat blokda Qulfni ochish usuliga qo'ng'iroqlarni joylashtiring. Agar istisno o'rnatilgan bo'lsa, qulfni oching
hali qo'ng'iroq qilish kerak, aks holda blokirovka yuz berishi mumkin.

Dasturiy ta'minot muhandisligi kuzatuvi 23.6


ReentrantLock-dan adolat siyosati bilan foydalanish noma'lum kechiktirishni oldini oladi.

23.9 Qulflash va holat interfeyslari 1003

Shart ob'ektlari va interfeys holati
Agar Lock-ga ega bo'lgan ip o'z vazifasini ba'zilarigacha davom eta olmasligini aniqlasa
shart qondirilsa, ip shart ob'ektida kutishi mumkin. Lock obyektlaridan foydalanish imkonini beradi
siz ipni kutishingiz kerak bo'lgan shart ob'ektlarini aniq e'lon qilishingiz kerak. Uchun
Masalan, ishlab chiqaruvchi/iste'molchi munosabatlarida ishlab chiqaruvchilar bir ob'ektda kutishlari mumkin va
iste'molchilar boshqasini kutishlari mumkin. Sinxronlashtirilgan kalitdan foydalanganda bu mumkin emas -
so'zlar va ob'ektning o'rnatilgan monitor blokirovkasi. Shart ob'ektlari spesifik bilan bog'langan.
cific Lock va Lockning newCondition usulini chaqirish orqali yaratiladi, bu esa a qaytaradi
Shart interfeysini amalga oshiradigan ob'ekt (java.util.concur- paketi).
ijaraga.qulflar). Shart ob'ektini kutish uchun ip Shartning kutishini chaqirishi mumkin
usuli (Object usuli kutishga o'xshash). Bu darhol bog'langanni chiqaradi
Qulflang va ipni ushbu Shartni kutish holatiga qo'ying. Keyin boshqa mavzular mumkin
Qulfni olishga harakat qiling. Yugurish mumkin bo'lgan ish zarrasi vazifani bajarib, aniqlaganda
kutish ipi endi davom etishi mumkin, ishga tushiriladigan ip shart usuli signalini chaqirishi mumkin
(Ob'ekt usuli xabarnomasiga o'xshash) o'sha Shartning kutish holatida ipga ruxsat berish
ishlaydigan holatga qaytish uchun. Shu nuqtada, kutishdan o'tgan ip
ishga tushirish holatiga o'tish Qulfni qayta olishga urinishi mumkin. Qayta sotib olishga qodir bo'lsa ham
Qulfda, ip hali ham o'z vazifasini bajara olmasligi mumkin - bu holda
Qulfni bo'shatish va kutishni qayta kiritish uchun ip shartni kutish usulini chaqirishi mumkin.
holati. Agar signal chaqirilganda bir nechta iplar Shartning kutish holatida bo'lsa,
Shartning sukut bo'yicha amalga oshirilishi o'tish uchun eng uzoq kutilgan ipni bildiradi
ishlaydigan holat. Agar mavzu signalAll shart usulini chaqirsa (Object
notifyAll usuli), keyin ushbu shartni ishga tushirishni kutayotgan barcha mavzular
holatiga o'ting va Qulfni qayta sotib olish huquqiga ega bo'ling. Ushbu mavzulardan faqat bittasini olish mumkin
ob'ektdagi Qulf - qolganlari Qulf yana mavjud bo'lguncha kutishadi. Agar
Lock adolat siyosatiga ega, eng uzoq kutilgan ip Qulfni oladi. Ip bo'lganda
umumiy ob'ekt bilan tugatilgan bo'lsa, u Qulfni bo'shatish uchun unlock usulini chaqirishi kerak.

Ishlash bo'yicha maslahat 23.5


Aksariyat hollarda adolatsiz qulflash afzalroqdir, chunki adolatli qulfdan foydalanish dasturni kamaytirishi mumkin
ishlash.

Xatolarning oldini olish bo'yicha maslahat 23.5


Bir nechta ish zarrachalari umumiy ob'ektni qulflar yordamida boshqarganda, bitta ip mavjudligiga ishonch hosil qiling
qo'ng'iroqlar usuli shart ob'ekti uchun kutish holatiga kirishni kutadi, alohida ip
oxirida kutayotgan ipni o'tkazish uchun Condition usuli signalini chaqiradi
shart ob'ektini ishga tushiriladigan holatga qaytarish. Agar bir nechta mavzu kutayotgan bo'lsa
shart ob'ekti, alohida ip himoya sifatida Condition usuli signalAll chaqirishi mumkin
barcha kutayotgan iplar o'z vazifalarini bajarish uchun yana bir imkoniyatga ega bo'lishini ta'minlash. Agar
bu bajarilmasa, ochlik paydo bo'lishi mumkin.

Umumiy dasturlash xatosi 23.2


IllegalMonitorStateException, agar ip kutish, signal yoki a bildirsa paydo bo'ladi
signalAll on Condition ob'ekti ReentrantLock-dan hech qanday shartlarsiz yaratilgan.
ing ushbu Condition ob'ekti uchun qulfni qo'lga kiritdi.

1004 23-bob Parametrlilik

Qulf va holat sinxronlangan Kalit so'zga nisbatan
Ba'zi ilovalarda "Lock and Condition" ob'ektlaridan foydalanish sinxronlashdan foydalanish afzalroq bo'lishi mumkin.
xronlashtirilgan kalit so'z. Qulflar sizni kutayotgan mavzularni to'xtatish yoki kutish vaqtini belgilash imkonini beradi
sinxronlangan kalit so'zdan foydalanib bo'lmaydigan qulfni olishni kutish. Shuningdek, a
Qulfni bir xil kod blokida olish va chiqarish uchun cheklanmagan, ya'ni
sinxronlangan kalit so'z bilan ish. Shart ob'ektlari bir nechta shartlarni belgilashga imkon beradi.
iplar kutishi mumkin bo'lgan shartlar. Shunday qilib, kutayotgan mavzularga shuni ko'rsatish mumkinki, a
Muayyan shart ob'ekti endi ushbu Shart ob'ekti bo'yicha signal yoki signallAll ni chaqirish orqali haqiqiydir.
ob'ekt. Sinxronlashtirilgan holda, qaysi iplar holatini aniq ko'rsatishning imkoni yo'q
kutishmoqda va shuning uchun bir shart bilan kutayotgan mavzularni xabardor qilishning imkoni yo'q
boshqa shartlarni kutayotgan iplarni ham signalizatsiya qilmasdan davom eting. Boshqa postlar ham bor
Lock and Condition ob'ektlaridan foydalanishning afzalliklari bor, lekin odatda sinxronlashdan foydalanish yaxshidir.
ilovangiz kengaytirilgan sinxronizatsiya imkoniyatlarini talab qilmasa, xronlashtirilgan kalit so'z.

Sinxronizatsiyani amalga oshirish uchun qulflar va shartlardan foydalanish


Endi biz ishlab chiqaruvchi/iste'molchi munosabatlarini Lock and Condition ob'ektidan foydalanib amalga oshiramiz.
umumiy bir elementli buferga kirishni muvofiqlashtirish uchun ob'ektlar (23.20 va 23.21-rasmlar). Bunda
har bir ishlab chiqarilgan qiymat bir marta to'g'ri iste'mol qilinadi. Shunga qaramay, biz interfeysni qayta ishlatamiz
23.5-bo'limdagi misoldan bufer va ishlab chiqaruvchi va iste'molchi sinflari, bundan tashqari
28-qator ishlab chiqaruvchi va iste'molchi sinfidan olib tashlandi.
Sinxronlashtirilgan bufer sinfi
Sinxronlashtirilgan Buffer sinfi (23.20-rasm) beshta maydonni o'z ichiga oladi. 11-qator yangi ob'ektni yaratadi
ReentrantLock tipidagi va o'z havolasini Lock o'zgaruvchisi accessLock ga tayinlaydi. Reen-
trantLock adolat siyosatisiz yaratilgan, chunki istalgan vaqtda faqat bitta ishlab chiqaruvchi
yoki Iste'molchi ushbu misolda Qulfni sotib olishni kutadi. 14-15 qatorlar ikkita hosil qiladi
Lock usulidan foydalangan holda shartlar newCondition. CanWrite sharti uchun navbat mavjud
Bufer to‘la bo‘lganda ishlab chiqaruvchi ip kutmoqda (ya’ni, buferda ma’lumotlar mavjud
Iste'molchi hali o'qimagan). Agar bufer to'lgan bo'lsa, Producer qo'ng'iroqlari usuli buni kutadi
Vaziyat. Iste'molchi to'liq buferdan ma'lumotlarni o'qiganda, u usul signalini yoqadi
bu shart. CanRead sharti kutayotgan iste'molchi ipi uchun navbatni o'z ichiga oladi
bufer bo'sh (ya'ni, iste'molchi o'qishi uchun buferda ma'lumot yo'q). Agar bufer bo'lsa
bo'sh, iste'molchi qo'ng'iroqlari usuli ushbu Shartda kutmoqda. Ishlab chiqaruvchi yozganda
bo'sh buferga, u ushbu Shartda usul signalini chaqiradi. int o'zgaruvchisi buferi
(17-satr) umumiy o'zgaruvchan ma'lumotlarni saqlaydi. Ishg'ol qilingan mantiqiy o'zgaruvchi (18-qator) saqlaydi
bufer hozirda ma'lumotlarni saqlaydimi yoki yo'qligini kuzatish (Iste'molchi o'qishi kerak).

Dasturiy ta'minot muhandisligi kuzatuvi 23.7


Qulflash va holatni sinxronlashtirilganning ilg'or versiyasi sifatida o'ylab ko'ring. Qulf va
Vaziyatni qo'llab-quvvatlash vaqtli kutishlar, uzilishi mumkin bo'lgan kutishlar va har biriga bir nechta shart navbatlari
Qulflash - agar sizga ushbu xususiyatlardan birortasi kerak bo'lmasa, sizga Qulflash va holat kerak emas.

Xatolarning oldini olish bo'yicha maslahat 23.6


Interfeyslardan foydalanish Qulf va holat xatoga yo'l qo'yadi - qulfni ochish kafolatlanmaydi
chaqiriladi, sinxronlashtirilgan bayonotdagi monitor har doim qachon chiqariladi
bayonot ijrosini yakunlaydi. Albatta, siz qulfni ochish bo'lishini kafolatlashingiz mumkin
23.20-rasmda bo'lgani kabi finally blokiga joylashtirilgan bo'lsa chaqiriladi.

23.9 Qulflash va holat interfeyslari 1005

1 // 23.20-rasm: SynchronizedBuffer.java
2 // Bloklash va shart yordamida umumiy butun songa kirishni sinxronlash
3 // interfeyslar
4 import java.util.concurrent.locks.Lock;
5 import java.util.concurrent.locks.ReentrantLock;
6 import java.util.concurrent.locks.Condition;
7
8 umumiy sinf SynchronizedBuffer Buferni amalga oshiradi
9 {
10
11
12
13
14
15
16
17
18 xususiy mantiqiy ishg'ol qilingan = noto'g'ri; // bufer band yoki yo'qmi
19
20 // buferga int qiymatini joylashtiring
21 public void blockingPut(int qiymati) InterruptedException-ni tashlaydi
22 {
23
24
25 // ip ma'lumotlari va bufer ma'lumotlarini chiqaring, keyin kuting
26 urinib ko'ring
27 {
28 // bufer bo'sh bo'lmasa, ipni kutish holatiga qo'ying
29 vaqt (ishg'ol qilingan)
30 {
31 System.out.println("Prodyuser yozishga harakat qilmoqda.");
32 displayState("Bufer toʻlgan. Ishlab chiqaruvchi kutmoqda.");
33
34 }
35
36 bufer = qiymat; // yangi bufer qiymatini o'rnating
37
38 // ishlab chiqaruvchi boshqa qiymatni saqlay olmasligini bildiradi
39 // iste'molchi joriy bufer qiymatini olguncha
40 band = rost;
41
42 displayState("Ishlab chiqaruvchi yozadi " + bufer);
43
44
45
46 }
47 nihoyat
48 {
49
50 }
51 }
23.20-rasm | Bloklash va shart yordamida umumiy butun songa kirishni sinxronlash
interfeyslar. (2-qismning 1-qismi.)

// Ushbu bufer bilan sinxronlashni boshqarish uchun qulflash


xususiy final Lock accessLock = new ReentrantLock();

// o'qish va yozishni nazorat qilish shartlari


xususiy yakuniy shart canWrite = accessLock.newCondition();
xususiy yakuniy shart canRead = accessLock.newCondition();

xususiy int buferi = -1; // ishlab chiqaruvchi va iste'molchi mavzulari tomonidan baham ko'rilgan

accessLock.lock(); // ushbu ob'ektni qulflash

canWrite.await(); // bufer bo'sh bo'lguncha kuting

// buferdan o'qishni kutayotgan har qanday mavzularga signal bering
canRead.signalAll();

accessLock.unlock(); // ushbu ob'ektni qulfdan chiqaring


1006 23-bob Parametrlilik

52
53 // buferdan qiymatni qaytarish
54 public int blockingGet() InterruptedException-ni tashlaydi
55 {
56 int readValue = 0; // buferdan o'qilgan qiymatni ishga tushirish
57
58
59 // ip ma'lumotlari va bufer ma'lumotlarini chiqaring, keyin kuting
60 urinib ko'ring
61 {
62 // agar o'qish uchun ma'lumot bo'lmasa, ipni kutish holatiga qo'ying
63 (!bo'sh)
64 {
65 System.out.println("Iste'molchi o'qishga harakat qilmoqda.");
66 displayState("Bufer bo'sh. Iste'molchi kutmoqda.");
67
68 }
69
70 // ishlab chiqaruvchi boshqa qiymatni saqlashi mumkinligini bildiradi
71 // chunki iste'molchi hozirgina bufer qiymatini oldi
72 band = noto'g'ri;
73
74 readValue = bufer; // buferdan qiymatni olish
75 displayState("Iste'molchi o'qiydi" + readValue);
76
77
78
79 }
80 nihoyat
81 {
82
83 }
84
85 o'qish qiymatini qaytarish;
86 }
87
88 // joriy ish va bufer holatini ko'rsatish
89 xususiy void displayState (String operatsiyasi)
90 {
91 urinib ko'ring
92 {
93
94 System.out.printf("%-40s%d\t\t%b%n%n", operatsiya, bufer,
95 ishg'ol qilingan);
96 }
97 nihoyat
98 {
99
100 }
101 }
102 } // so'nggi sinf SynchronizedBuffer
23.20-rasm | Bloklash va shart yordamida umumiy butun songa kirishni sinxronlash
interfeyslar. (2-qismning 2-qismi.)

accessLock.lock(); // ushbu ob'ektni qulflash

canRead.await(); // bufer to'lguncha kuting

// bufer bo'sh bo'lishini kutayotgan har qanday mavzularga signal bering


canWrite.signalAll();

accessLock.unlock(); // ushbu ob'ektni qulfdan chiqaring

accessLock.lock(); // ushbu ob'ektni qulflash

accessLock.unlock(); // ushbu ob'ektlarni qulfdan chiqaring


23.9 Qulflash va holat interfeyslari 1007

Bloklash usulidagi 23-qator SynchronizedBuffer-ga qo'ng'iroqlar usuli blokirovkasini qo'ying.
accessLock. Agar qulf mavjud bo'lsa (ya'ni, uni boshqa hech qanday mavzu olmagan bo'lsa), bu mavzu hozir
qulfga egalik qiladi va ip davom etadi. Agar qulf mavjud bo'lmasa (ya'ni, uni boshqasi ushlab turadi
ip), usul qulfi qulf bo'shatilguncha kutadi. Qulfni sotib olgandan so'ng, 26-qatorlar
46 bajaring. Bufer to'lganligini aniqlash uchun 29-qator sinovlari band. Agar shunday bo'lsa, 31-qatorlar
32 ip kutishini bildiruvchi xabarni ko'rsatadi. 33-qator shart usulini chaqiradi
Sinxronlashtirilgan-ni vaqtincha chiqaradigan canWrite shart ob'ektida kuting.
Buferni qulflaydi va iste'molchidan bufer yozish uchun mavjudligi haqida signalni kutadi.
Bufer mavjud bo'lganda, usul davom etadi, buferga yoziladi (36-satr), ish joyini o'rnatadi.
rostga pied (40-satr) va ishlab chiqaruvchi qiymat yozganligini bildiruvchi xabarni ko'rsatadi
(42-qator). 45-qator xabar berish uchun shart ob'ektidagi holat usuli signalini chaqiradi canRead
kutayotgan Iste'molchi (agar mavjud bo'lsa) buferda o'qilishi kerak bo'lgan yangi ma'lumotlar bor. 49-qator qo'ng'iroqlar
qulfni bo'shatish va iste'molchiga pro-
ruxsat.
BloklashGet usulining 57-qatori (54–86-qatorlar) Qulfni olish uchun usul qulfini chaqiradi.
Bu usul Qulf mavjud bo'lguncha kutadi. Qulf sotib olingandan so'ng, 63-qator sinovdan o'tkaziladi
ishg'ol qilinganligi noto'g'ri, bufer bo'sh ekanligini ko'rsatadi. Agar shunday bo'lsa, 67-qator qo'ng'iroqlar usuli
canRead shartida kuting. Eslatib o'tamiz, usul signali o'zgaruvchiga chaqiriladi -
blockingPut usulida o'qing (45-qator). Condition obyektiga signal berilganda, the
blockingGet usuli davom etadi. 72–74 satrlar “false” qiymatini egallab, qiymatini saqlang
readValue-da bufer va readValue-ni chiqaring. Keyin 78-satr shart ob'ektiga signal beradi
yozish mumkin. Bu prodyuserni uyg'otadi, agar u haqiqatan ham bufer bo'shatilguncha kutayotgan bo'lsa.
82-qator qo'ng'iroqlar usuli qulfni bo'shatish uchun yakuniy blokdan qulfni ochish usulini chaqiradi va 85-qator qaytadi.
qo'ng'iroq qiluvchiga o'qingValue.

Class SharedBufferTest2


SharedBufferTest2 klassi (23.21-rasm) 23.17-rasmdagi bilan bir xil. Natijalarni o'rganing
23.21-rasmda. E'tibor bering, har bir ishlab chiqarilgan butun son bir marta iste'mol qilinadi - hech qanday qiymat yo'q
yo'qoladi va hech qanday qiymat bir martadan ortiq iste'mol qilinmaydi. Lock and Condition ob'ektlari ta'minlaydi
Ishlab chiqaruvchi va iste'molchi o'z vazifalarini bajara olmaydi, agar navbati kelmaguncha. Pro-
Ducer birinchi bo'lib ketishi kerak, agar Ishlab chiqaruvchi o'shandan beri ishlab chiqarmagan bo'lsa, Iste'molchi kutishi kerak
Iste'molchi oxirgi marta iste'mol qilgan va agar iste'molchi hali iste'mol qilmagan bo'lsa, ishlab chiqaruvchi kutishi kerak.
Ishlab chiqaruvchi yaqinda ishlab chiqarilgan qiymatni yig'di. Ushbu dasturni bir nechta bajaring
ishlab chiqarilgan har bir butun son aynan bir marta iste'mol qilinishini tasdiqlash uchun. Namunada -
qo'ying, ishlab chiqaruvchi va iste'molchi qachon kutishi kerakligini ko'rsatadigan ajratilgan qatorlarga e'tibor bering
tegishli vazifalarni bajarish.

Umumiy dasturlash xatosi 23.3


Kutilayotgan ipga signal berishni unutish mantiqiy xatodir. Mavzu kutishda qoladi -
ing holati, bu uning davom etishiga to'sqinlik qiladi. Bunday kutish noma'lum muddatga olib kelishi mumkin.
to'xtab qolish yoki boshi berk ko'chaga tushish.

1 // 23.21-rasm: SharedBufferTest2.java


2 // Sinxronlashtirilgan buferni boshqaradigan ikkita oqim.
3 import java.util.concurrent.ExecutorService;
23.21-rasm | Sinxronlashtirilgan buferni boshqaradigan ikkita ip. (3-qismning 1-qismi.)

1008 23-bob Parametrlilik

4 import java.util.concurrent.Executors;
5 import java.util.concurrent.TimeUnit;
6
7 umumiy sinf SharedBufferTest2
8 {
9 ta umumiy statik void main(String[] args) InterruptedExceptionni tashlaydi
10 {
11 // ikkita ipli yangi iplar hovuzini yarating
12 ExecutorService executorService = Executors.newCachedThreadPool();
13
14 // Ints saqlash uchun SynchronizedBuffer yarating
15 Bufer sharedLocation = new SynchronizedBuffer();
16
17 System.out.printf("%-40s%s\t\t%s%n%-40s%s%n%n", "Operatsiya",
18 "Bufer", "Boshlangan", "---------", "------\t\t--------");
19
20 // Ishlab chiqaruvchi va iste'molchi vazifalarini bajaring
21 executorService.execute(yangi Producer(sharedLocation));
22 executorService.execute(yangi Consumer(sharedLocation));
23
24 excutorService.shutdown();
25 execcutorService.awaitTermination(1, TimeUnit.MINUTES);
26 }
27 } // yakuniy sinf SharedBufferTest2

Operatsiya buferi band


--------- ------ --------

Ishlab chiqaruvchi 1 1 rost deb yozadi

Iste'molchi 1 1 xatoni o'qiydi

Ishlab chiqaruvchi 2 2 rost deb yozadi

Iste'molchi 2 2 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi 3 3 rost deb yozadi

Iste'molchi 3 3 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi 4 4 rost deb yozadi

Iste'molchi 4 4 ni noto'g'ri o'qiydi

23.21-rasm | Sinxronlashtirilgan buferni boshqaradigan ikkita ip. (3 qismning 2-qismi.)

Ishlab chiqaruvchi yozishga harakat qiladi.
Bufer toʻlgan. Ishlab chiqaruvchi kutmoqda. 1 rost

Ishlab chiqaruvchi yozishga harakat qiladi.


Bufer toʻlgan. Ishlab chiqaruvchi kutmoqda. 2 rost

Iste'molchi o'qishga harakat qiladi.


Bufer bo'sh. Iste'molchi kutmoqda. 4 yolg'on

23.10 Bir vaqtning o'zida to'plamlar 1009

23.10 Bir vaqtning o'zida to'plamlar
16-bobda biz Java Collections API-dan turli to'plamlarni taqdim etdik. Biz ham
faqat bittasiga ruxsat berish uchun ushbu to'plamlarning sinxronlashtirilgan versiyalarini olishingiz mumkinligini ta'kidladi
bir vaqtning o'zida bir nechta mavzular o'rtasida bo'lishish mumkin bo'lgan to'plamga kirish uchun. kol-
java.util.concurrent paketidagi darslar maxsus ishlab chiqilgan va optimallashtirilgan
to'plamlarni bir nechta mavzular orasida almashish uchun.
23.22-rasmda java.util.concur- paketidagi ko'plab parallel to'plamlar ro'yxati keltirilgan.
ijara. ConcurrentHashMap va LinkedBlockingQueue uchun yozuvlar qalin qilib ko'rsatilgan
chunki bular eng ko'p ishlatiladigan bir vaqtning o'zida to'plamlardir. Kollektiv kabi -
16-bobda kiritilgan qoidalarga ko'ra, bir vaqtning o'zida to'plamlar qo'llab-quvvatlash uchun kengaytirilgan
lambdalar. Biroq, oqimlarni qo'llab-quvvatlash usullarini taqdim etish o'rniga, bir vaqtning o'zida
darslar turli xil oqimga o'xshash operatsiyalarni o'zlarining amalga oshirishlarini ta'minlaydi, masalan, Con-
currentHashMap-da har bir, kamaytirish va qidirish usullari mavjud - ular ishlab chiqilgan va
mavzular o'rtasida almashinadigan bir vaqtda to'plamlar uchun optimallashtirilgan. Qo'shimcha ma'lumot uchun
bir vaqtning o'zida to'plamlar bo'yicha, tashrif buyuring

Ishlab chiqaruvchi 5 5 rost deb yozadi

Iste'molchi 5 5 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi 6 6 rost deb yozadi

Iste'molchi 6 6 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi 7 7 rost deb yozadi

Iste'molchi 7 7 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi 8 8 rost deb yozadi

Iste'molchi 8 8 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi 9 9 rost deb yozadi

Iste'molchi 9 9 ni noto'g'ri o'qiydi

Ishlab chiqaruvchi 10 10 rost deb yozadi

Ishlab chiqaruvchi ishlab chiqarishni tugatdi
Ishlab chiqaruvchini tugatish
Iste'molchi 10 10 ni noto'g'ri o'qiydi

Iste'molchi o'qigan qiymatlar jami 55


Iste'molchini tugatish

23.21-rasm | Sinxronlashtirilgan buferni boshqaradigan ikkita ip. (3 qismning 3-qismi.)

Iste'molchi o'qishga harakat qiladi.
Bufer bo'sh. Iste'molchi kutmoqda. 5 yolg'on

1010 23-bob Parametrlilik

Java SE 7:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/
paket-summary.html
Java SE 8
http://download.java.net/jdk8/docs/api/java/util/concurrent/
paket-summary.html

To'plam tavsifi

ArrayBlockingQueue Ishlab chiqaruvchi/iste'molchi munosabatlarini qo'llab-quvvatlaydigan qat'iy o'lchamdagi navbat -
ehtimol ko'plab ishlab chiqaruvchilar va iste'molchilar bilan.
ConcurrentHashMap Xeshga asoslangan xarita (16-bobda kiritilgan HashMapga o'xshash)
bu o'quvchilarning ixtiyoriy soniga va cheklangan songa imkon beradi.
yozuvchi mavzular. Bu va LinkedBlockingQueue hozirgacha
eng tez-tez ishlatiladigan bir vaqtning o'zida to'plamlar.
ConcurrentLinkedDeque Ikki tomonlama navbatning bir vaqtda bog'langan ro'yxatini amalga oshirish.
ConcurrentLinkedQueue O'sishi mumkin bo'lgan navbatning bir vaqtning o'zida bog'langan ro'yxatini amalga oshirish
dinamik ravishda.
ConcurrentSkipListMap - kalitlari bo'yicha tartiblangan bir vaqtda xarita.
ConcurrentSkipListSet Saralangan bir vaqtda to'plam.
CopyOnWriteArrayList Tarmoq uchun xavfsiz ArrayList. To'plamni o'zgartiradigan har bir operatsiya
avval tarkibning yangi nusxasini yaratadi. To'plam tra-
to'plam mazmuni o'zgartirilganidan ko'ra tez-tez o'rganilgan.
CopyOnWriteArraySet CopyOnWriteArrayList yordamida amalga oshiriladigan to'plam.
DelayQueue Kechiktirilgan ob'ektlarni o'z ichiga olgan o'zgaruvchan o'lchamdagi navbat. Ob'ekt bo'lishi mumkin
faqat uning kechikish muddati tugaganidan keyin olib tashlanadi.
LinkedBlockingDeque Bog'langan ro'yxat sifatida amalga oshiriladigan ikki tomonlama blokirovka navbati
ixtiyoriy ravishda o'lchamda o'rnatiladi.
LinkedBlockingQueue Ixtiyoriy ravishda bo'lishi mumkin bo'lgan bog'langan ro'yxat sifatida amalga oshiriladigan blokirovka navbati
o'lchamda mustahkamlangan. Bu va ConcurrentHashMap hozirgacha eng tez-tez uchraydi.
tez-tez ishlatiladigan bir vaqtning o'zida to'plamlar.
LinkedTransferQueue TransferQueue interfeysining bog'langan ro'yxatini amalga oshirish. Har bir ishlab chiqaruvchi
iste'molchining elementni olishini kutish imkoniyati mavjud
kiritilgan (usul uzatish orqali) yoki oddiygina elementni ichiga joylashtirish
navbat (qo'yish usuli orqali). Shuningdek, ortiqcha yuklangan tryTransfer usulini taqdim etadi
elementni darhol kutayotgan iste'molchiga o'tkazish yoki buni amalga oshirish
belgilangan vaqt oralig'ida. Agar transferni yakunlab bo'lmasa,
element navbatga qo'yilmaydi. Odatda ilovalarda qo'llaniladi
mavzular orasidagi xabarlarni uzatuvchi.
PriorityBlockingQueue O'zgaruvchan uzunlikdagi ustuvorlikka asoslangan blokirovka navbati (masalan, PriorityQueue).
SynchronousQueue [Mutaxassislar uchun.] Yo'q blokirovka navbati amalga oshirish
ichki quvvat. Bitta ip bilan har bir kiritish operatsiyasi a ni kutishi kerak
operatsiyani boshqa ipdan olib tashlash va aksincha.

23.22-rasm | Bir vaqtning o'zida to'plamlar xulosasi (java.util.concurrent to'plami).


23.11 GUI bilan multithreading: SwingWorker 1011

23.11 GUI bilan multithreading: SwingWorker
Swing ilovalari ko'p bosqichli dasturlash uchun noyob muammolar to'plamini taqdim etadi. Hammasi
Swing ilovalari bir-biri bilan ishlash uchun voqea jo'natish ipi deb ataladigan bitta ipga ega.
ilovaning GUI komponentlari bilan harakatlar. Odatdagi shovqinlar yangilanishni o'z ichiga oladi
GUI komponentlari yoki sichqonchani bosish kabi foydalanuvchi harakatlarini qayta ishlash. O'zaro bog'liqlikni talab qiladigan barcha vazifalar
ilovaning GUI bilan amallar voqea navbatiga joylashtiriladi va ketma-ket bajariladi
voqea jo'natish ipi orqali.
Swing GUI komponentlari ish zarrachalari xavfsiz emas - ularni bir nechta tomonidan boshqarib bo'lmaydi
GUI-ni buzishi mumkin bo'lgan noto'g'ri natijalar xavfisiz mavzular. Boshqasidan farqli o'laroq
Ushbu bobda keltirilgan misollar, GUI ilovalarida ish zarrachalari xavfsizligiga emas, balki erishiladi
ip harakatlarini sinxronlash, lekin Swing komponentlariga faqat shu yerdan kirishni ta'minlash orqali
hodisani jo'natish to'plami. Ushbu usul ipni cheklash deb ataladi. Faqat bittasiga ruxsat
ipdan himoyalanmagan ob'ektlarga kirish uchun ip tufayli buzilish ehtimolini yo'q qiladi
bir vaqtning o'zida ushbu ob'ektlarga kirish uchun bir nechta iplar.
Hodisa jo'natmalari bo'yicha qisqacha hisob-kitoblarni ketma-ketlikda bajarish maqbuldir
GUI komponentlarini manipulyatsiya qilish bilan. Agar dastur uzoq muddatli hisoblashni amalga oshirishi kerak bo'lsa,
Foydalanuvchining o'zaro ta'siriga javoban, voqea jo'natish oqimi boshqasiga qatnasha olmaydi
Ushbu hisoblashda ip bog'langan bo'lsa, voqea navbatdagi vazifalar. Bu sabab bo'ladi
GUI komponentlari javob bermayapti. Uzoq vaqt davomida ishlaydigan aloqa bilan shug'ullanish afzalroqdir.
boshqaruvni davom ettirish uchun voqea jo'natish ipini bo'shatib, alohida mavzuga joylashtirish
boshqa GUI shovqinlari. Albatta, siz grafik interfeysni hisoblash bilan yangilashingiz kerak
bajarilgan ishchi ish zarrachasidan ko'ra, voqea jo'natish oqimidan kelib chiqadi
hisoblash.

SwingWorker sinfi


Sinf SwingWorker (javax.swing paketida) asinxronni bajarishga imkon beradi
Ishchi ish zarrachasidagi vazifani (masalan, uzoq muddatli hisoblash) keyin Swing kompozitsiyasini yangilang.
topshiriq natijalariga ko'ra voqea jo'natish ipidan ents. SwingWorker asboblari
Runnable interfeysi, ya'ni SwingWorker ob'ekti a.da bajarilishini rejalashtirish mumkin
alohida ip. SwingWorker klassi a ni bajarishni soddalashtirish uchun bir nechta usullarni taqdim etadi
ishchi ish zarrachasidagi vazifa va uning natijalarini GUIda ko'rsatish uchun mavjud qilish. Ba'zi com-
mon SwingWorker usullari 23.23-rasmda tasvirlangan.

Usul tavsifi

doInBackground Uzoq hisoblashni belgilaydi va ishchi ipda chaqiriladi.
tugallandi DoInBackground qaytib kelganida, voqea jo'natish ipida bajariladi.
bajarish SwingWorker obyektini ishchi ish zarrachasida bajarilishini rejalashtiradi.
get Hisoblash tugashini kutadi, so'ngra natijasini qaytaradi
hisoblash (ya'ni, doInBackgroundning qaytish qiymati).
nashr qilish DoInBackground usulidan pro-ga oraliq natijalarni yuboradi.
hodisani jo'natish ipida ishlov berish uchun cess usuli.

23.23-rasm | Tez-tez ishlatiladigan SwingWorker usullari. (2-qismning 1-qismi.)


1012 23-bob Parametrlilik

23.11.1 Ishchi ipda hisob-kitoblarni bajarish: Fibonachchi
Raqamlar
Keyingi misolda foydalanuvchi n raqamini kiritadi va dastur n-chi Fibonachchini oladi
raqam, biz 18.5-bo'limda muhokama qilingan rekursiv algoritm yordamida hisoblaymiz. beri
algoritm katta qiymatlar uchun vaqt talab qiladi, biz bajarish uchun SwingWorker ob'ektidan foydalanamiz
ishchi ipda hisoblash. GUI shuningdek, alohida komponentlar to'plamini taqdim etadi
Bu har bir tugmani bosish bilan ketma-ketlikda keyingi Fibonachchi raqamini oladi
fibonachchi bilan (1). Ushbu komponentlar to'plami to'g'ridan-to'g'ri qisqa hisoblashni amalga oshiradi
hodisani jo'natish to'plami. Ushbu dastur 92-Fibonachchigacha ishlab chiqarishga qodir
raqam - keyingi qiymatlar uzun bilan ifodalanishi mumkin bo'lgan diapazondan tashqarida. Eslab qoling
o'zboshimchalik bilan katta butun son qiymatlarini ifodalash uchun BigInteger sinfidan foydalanishingiz mumkin.
Class BackgroundCalculator (23.24-rasm) Fibonachchining rekursiv hisob-kitoblarini bajaradi.
ishchi ipda tion. Bu sinf SwingWorker-ni kengaytiradi (8-qator), usullarni bekor qiladi
doInBackground va bajarildi. doInBackground usuli (21–24-qatorlar) n-ni hisoblaydi
Ishchi ipdagi Fibonachchi raqami va natijani qaytaradi. Bajarilgan usul (27–43-qatorlar)
natijani JLabelda ko'rsatadi.

jarayon Nashr qilish usuli va jarayonlaridan oraliq natijalarni oladi


bu natijalar voqea jo'natish ipida.
setProgress Har qanday xususiyat o'zgarishini tinglovchilarni xabardor qilish uchun progress xususiyatini o'rnatadi
taraqqiyot satri yangilanishlarining voqea jo'natish chizig'i.

1 // 23.24-rasm: BackgroundCalculator.java


2 // Fibonachchi raqamlarini hisoblash uchun SwingWorker kichik klassi
3 // fonda.
4 import javax.swing.SwingWorker;
5 import javax.swing.JLabel;
6 import java.util.concurrent.ExecutionException;
7
8 umumiy sinf BackgroundCalculator SwingWorker-ni kengaytiradi
9 {
10 xususiy final int n; // Hisoblash uchun Fibonachchi raqami
11 xususiy yakuniy JLabel natijasiJLabel; // Natijani ko'rsatish uchun JLabel
12
13 // konstruktor
14 ta umumiy fon kalkulyatori (int n, JLabel natijasiJLabel)
15 {
16 this.n = n;
17 this.resultJLabel = resultJLabel;
18 }

23.24-rasm | Orqa fonda Fibonachchi raqamlarini hisoblash uchun SwingWorker subklassi.


(2-qismning 1-qismi.)

Usul tavsifi

23.23-rasm | Tez-tez ishlatiladigan SwingWorker usullari. (2-qismning 2-qismi.)

23.11 GUI bilan multithreading: SwingWorker 1013

SwingWorker umumiy sinfdir. 8-qatorda birinchi turdagi parametr Long va ikkinchisi
Ob'ekt hisoblanadi. Birinchi turdagi parametr doInBackground tomonidan qaytarilgan turni bildiradi
usul; ikkinchisi nashr va jarayon o'rtasida o'tgan turni bildiradi
oraliq natijalar bilan ishlash usullari. Biz bunda nashr etish va ishlov berishdan foydalanmaymiz
Masalan, biz Ob'ektni ikkinchi turdagi parametr sifatida ishlatamiz. Biz nashr qilishni muhokama qilamiz va
23.11.2-banddagi jarayon.
BackgroundCalculator obyekti grafik interfeysni boshqaruvchi sinfdan yaratilishi mumkin.
BackgroundCalculator ni ifodalovchi butun son uchun misol o'zgaruvchilarini saqlaydi
Hisoblash kerak bo'lgan Fibonachchi raqami va hisoblash natijalarini ko'rsatadigan JLabel
(10–11-qatorlar). BackgroundCalculator konstruktori (14–18-qatorlar) ularni ishga tushiradi
konstruktorga uzatiladigan argumentlar bilan misol o'zgaruvchilari.

19
20 // ishchi ish zarrachasida ishga tushiriladigan uzoq muddatli kod


21 ommaviy Long doInBackground()
22 {
23 qaytish nthFib = Fibonachchi(n);
24 }
25
26 // doInBackground qaytib kelganda voqea jo'natish oqimida ishlash uchun kod
27 himoyalangan bekor qilindi()
28 {
29 urinib ko'ring
30 {
31
32
33 }
34 catch (InterruptedException oldingi)
35 {
36 resultJLabel.setText("Natijalarni kutish vaqtida uzilib qoldi.");
37 }
38 catch (ExecutionException oldingi)
39 {
40 ta natijaJLabel.setText(
41 "Hisoblashda xatolik yuz berdi.");
42 }
43 }
44
45 // rekursiv usul fibonachchi; n-Fibonachchi sonini hisoblaydi
46 umumiy uzun fibonachchi (uzun raqam)
47 {
48 agar (raqam == 0 || raqam == 1)
49 qaytish raqami;
yana 50
51 qaytish fibonachchi(raqam - 1) + fibonachchi(raqam - 2);
52 }
53 } // yakuniy sinf BackgroundCalculator

23.24-rasm | Orqa fonda Fibonachchi raqamlarini hisoblash uchun SwingWorker subklassi.


(2-qismning 2-qismi.)

// doInBackground natijasini oling va uni ko'rsating


resultJLabel.setText(get().toString());

1014 23-bob Parametrlilik

BackgroundCalculator ob'ektida bajarish usuli chaqirilsa, ob'ekt bo'ladi
ishchi ipda bajarish uchun rejalashtirilgan. doInBackground usuli dan chaqiriladi
ishchi o'zgaruvchidan o'tib, fibonachchi usulini chaqiradi (46-52 qatorlar),
n argument sifatida (23-qator). Fibonachchi usuli Fibonachchini hisoblash uchun rekursiyadan foydalanadi
dan n. Fibonachchi qaytsa, doInBackground usuli natijani qaytaradi.
doInBackground qaytgandan so'ng, bajarilgan usul voqea jo'natish ipidan chaqiriladi.
Bu usul JLabel natijasini doInBackground by qaytaruvchi qiymatiga o'rnatishga harakat qiladi
qo'ng'iroq qilish usuli bu qaytish qiymatini olish uchun olinadi (32-qator). Get usuli natijani kutadi
Agar kerak bo'lsa, tayyor bo'ling, lekin biz uni bajarilgan usuldan chaqirganimiz uchun, hisoblash aralash bo'ladi.
get oldidan plete chaqiriladi. 34–37 satrlar, agar joriy oqim bo'lsa, InterruptedException ni ushlab turadi
qaytishni kutayotganda uzilib qoldi. Ushbu misolda bu istisno bo'lmaydi
chunki get chaqirilgunga qadar hisoblash allaqachon yakunlangan bo'ladi. 38-42 qatorlar tutiladi
ExecutionException, agar hisoblash paytida istisno sodir bo'lsa, tashlanadi.
Fibonachchi raqamlari sinfi
FibonachchiNumbers klassi (23.25-rasm) GUI com-ning ikkita to'plamini o'z ichiga olgan oynani ko'rsatadi.
ponents - biri ishchi ipida Fibonachchi raqamini hisoblash uchun, ikkinchisi esa olish uchun
foydalanuvchining JButton tugmasini bosganiga javoban keyingi Fibonachchi raqami. Konstruktor
(38–109-qatorlar) ushbu komponentlarni alohida sarlavhali JPanellarga joylashtiradi. 46–47 va 78– qatorlar
79 foydalanuvchiga ruxsat berish uchun ishchiJPanelga ikkita JLabel, JTextField va JButton qo'shing.
Fibonachchi raqami BackgroundWorker tomonidan hisoblab chiqiladigan butun sonni kiritish uchun.
84–85 va 103-qatorlar ruxsat berish uchun eventThreadJPanel-ga ikkita JLabel va JButton qo'shadi.
foydalanuvchi navbatdagi Fibonachchi raqamini olish uchun. n1 va n2 misol o'zgaruvchilari
ketma-ketlikda oldingi ikkita Fibonachchi raqamini o'z ichiga oladi va 0 va ga ishga tushiriladi
1, mos ravishda (29-30-qatorlar). Namuna o'zgaruvchilari soni eng so'nggi hisoblanganlarni saqlaydi
tartib raqami va 1 ga ishga tushiriladi (31-qator). Ikki JLabels ko'rsatish soni va n2
dastlab, foydalanuvchi eventThreadJPanel'da 1: 1 bo'lgan Fibonachchi matnini ko'rishi uchun
GUI boshlanganda.

Dasturiy ta'minot muhandisligi kuzatuvi 23.8


SwingWorker usullari bilan boshqariladigan har qanday GUI komponentlari, masalan
usullar jarayonidan yangilanadigan yoki bajariladigan komponentlar ga o'tkazilishi kerak
SwingWorker kichik sinfining konstruktori va pastki sinf ob'ektida saqlanadi. Bu ularni beradi
GUI komponentlariga kirish usullari, ular boshqaradigan.

1 // 23.25-rasm: FibonacciNumbers.java


2 // SwingWorker yordamida uzoq hisob-kitoblarni amalga oshirish
3 // natijalar GUIda ko'rsatiladi.
4 import java.awt.GridLayout;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import javax.swing.JButton;
8 import javax.swing.JFrame;
9 import javax.swing.JPanel;
10 import javax.swing.JLabel;

23.25-rasm | GUI-da ko'rsatilgan natijalar bilan uzoq hisob-kitoblarni amalga oshirish uchun SwingWorker-dan foydalanish.


(4-qismning 1-qismi.)

23.11 GUI bilan ko'p ish zarralari: SwingWorker 1015

11 import javax.swing.JTextField;
12 import javax.swing.border.TitledBorder;
13 import javax.swing.border.LineBorder;
14 import java.awt.Color;
15 import java.util.concurrent.ExecutionException;
16
17 ommaviy sinf FibonacciNumbers JFrame-ni kengaytiradi
18 {
19 // foydalanuvchi kiritgan raqamning Fibonachchi ni hisoblash uchun komponentlar
20 xususiy yakuniy JPanel ishchiJPanel =
21 ta yangi JPanel(yangi GridLayout(2, 2, 5, 5));
22 xususiy yakuniy JTextField raqamiJTextField = yangi JTextField();
23 xususiy final JButton goJButton = yangi JButton("O'tish");
24 xususiy final JLabel fibonacciJLabel = yangi JLabel();
25
26 // keyingi Fibonachchi raqamini olish uchun komponentlar va o'zgaruvchilar
27 xususiy yakuniy JPanel eventThreadJPanel =
28 ta yangi JPanel(yangi GridLayout(2, 2, 5, 5));
29 xususiy uzun n1 = 0; // birinchi Fibonachchi raqami bilan ishga tushiring
30 xususiy uzun n2 = 1; // ikkinchi Fibonachchi raqami bilan ishga tushiring
31 xususiy int count = 1; // ko'rsatish uchun joriy Fibonachchi raqami
32 xususiy final JLabel nJLabel = yangi JLabel("Fibonachchi 1: ");
33 xususiy yakuniy JLabel nFibonacciJLabel =
34 ta yangi JLabel(String.valueOf(n2));
35 xususiy final JButton nextNumberJButton = yangi JButton("Keyingi raqam");
36
37 // konstruktor
38 umumiy FibonachchiNumbers()
39 {
40 super("Fibonachchi raqamlari");
41 setLayout(yangi GridLayout(2, 1, 10, 10));
42
43 // SwingWorker paneliga GUI komponentlarini qo'shing
44 ishchiJPanel.setBorder(yangi TitleBorder(
45 ta yangi LineBorder(Color.BLACK), "SwingWorker bilan"));
46 workerJPanel.add(yangi JLabel("Fibonachchini oling:"));
47 ishchiJPanel.add(son JTextField);
48 goJButton.addActionListener(
49 ta yangi ActionListener()
50 {
51 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
52 {
53 int n;
54
55 urinib ko'ring
56 {
57 // foydalanuvchi kiritishini butun son sifatida olish
58 n = Integer.parseInt(numberJTextField.getText());
59 }

23.25-rasm | GUI-da ko'rsatilgan natijalar bilan uzoq hisob-kitoblarni amalga oshirish uchun SwingWorker-dan foydalanish.


(4 qismning 2-qismi.)

1016 23-bob Parametrlilik

60 ta tutish (NumberFormatException oldingi)
61 {
62 // agar foydalanuvchi xato xabarini ko'rsatmasa
63 // butun sonni kiriting
64 fibonacciJLabel.setText("Butun sonni kiriting.");
65 qaytish;
66 }
67
68 // hisoblash boshlanganligini bildiradi
69 fibonacciJLabel.setText("Hisoblash...");
70
71
72
73
74
75 }
76 } // anonim ichki sinfni tugatish
77); // addActionListener-ga qo'ng'iroqni tugatish
78 ishchiJPanel.add(goJButton);
79 ishchiJPanel.add(fibonacciJLabel);
80
81 // GUI komponentlarini hodisalarni yuborish paneliga qo'shing
82 eventThreadJPanel.setBorder(yangi TitleBorder(
83 yangi LineBorder(Color.BLACK), "SwingWorkersiz"));
84 eventThreadJPanel.add(nJLabel);
85 eventThreadJPanel.add(nFibonacciJLabel);
86 nextNumberJButton.addActionListener(
87 ta yangi ActionListener()
88 {
89 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
90 {
91 // n2 dan keyin Fibonachchi sonini hisoblang
92 uzun harorat = n1 + n2;
93 n1 = n2;
94 n2 = harorat;
95 ++son;
96
97 // keyingi Fibonachchi raqamini ko'rsatish
98 nJLabel.setText("Fibonachchi ning " + count + ": ");
99 nFibonacciJLabel.setText(String.valueOf(n2));
100 }
101 } // anonim ichki sinfni tugatish
102); // addActionListener-ga qo'ng'iroqni tugatish
103 eventThreadJPanel.add(nextNumberJButton);
104
105 qo'shish (workerJPanel);
106 qo'shish (eventThreadJPanel);
107 toʻplamOʻlcham(275, 200);
108 setVisible(to'g'ri);
109 } // yakunlovchi konstruktor

23.25-rasm | GUI-da ko'rsatilgan natijalar bilan uzoq hisob-kitoblarni amalga oshirish uchun SwingWorker-dan foydalanish.


(4 qismning 3-qismi.)

// fonda hisoblashni amalga oshirish uchun vazifa yarating


BackgroundCalculator vazifasi =
yangi BackgroundCalculator(n, fibonacciJLabel);
task.execute(); // vazifani bajaring

23.11 GUI bilan ko'p qirrali: SwingWorker 1017

48–77 qatorlar goJButton uchun hodisa ishlov beruvchisini ro'yxatdan o'tkazadi. Agar foydalanuvchi buni bossa
JButton, 58-qator JTextField raqamiga kiritilgan qiymatni oladi va uni tahlil qilishga harakat qiladi
butun son sifatida. 72-73-qatorlar yangi BackgroundCalculator ob'ektini yaratadi va foydalanuvchiga o'tadi.
kiritilgan qiymat va hisoblash natijalarini ko'rsatish uchun ishlatiladigan fibonacciJLabel.
74-qator qo'ng'iroqlar usulini BackgroundCalculator-da bajarish, uni bajarish uchun rejalashtirish
alohida ishchi ipida. Usulning bajarilishi BackgroundCalcu-ni kutmaydi.
lator bajarishni tugatish. U darhol qaytadi, bu GUI-ni pro-dasturni davom ettirishga imkon beradi.
hisoblash amalga oshirilayotganda boshqa hodisalarni to'xtatish.
Agar foydalanuvchi eventThreadJPanel-dagi nextNumberJButton tugmachasini bossa, voqea ishlov beruvchisi
86-102 qatorlarda ro'yxatdan o'tganlar bajariladi. 92-95 qatorlar oldingi ikkita Fibonachchi raqamini qo'shadi
ketma-ketlikdagi keyingi raqamni aniqlash uchun n1 va n2 da saqlanadi, n1 va n2 ni ularning soniga yangilang.
yangi qiymatlar va o'sish soni. Keyin 98–99 qatorlar keyingisini ko'rsatish uchun GUI-ni yangilaydi
raqam. Ushbu hisob-kitoblar uchun kod actionPerformed usulida, shuning uchun ular bajariladi.
voqea jo'natish ipida shakllangan. Voqea sodir bo'lganda bunday qisqa hisob-kitoblarni boshqarish

110
111 // asosiy usul dasturni bajarishni boshlaydi


112 umumiy statik bekor asosiy (String [] args)
113 {
114 FibonacciNumbers ilovasi = yangi FibonacciNumbers();
115 application.setDefaultCloseOperation(EXIT_ON_CLOSE);
116 }
117 } // oxirgi sinf FibonachchiNumbers

23.25-rasm | GUI-da ko'rsatilgan natijalar bilan uzoq hisob-kitoblarni amalga oshirish uchun SwingWorker-dan foydalanish.


(4 qismning 4-qismi.)

a) 40 dan Fibonachchini hisoblashni boshlang


fon

b) Boshqa Fibonachchi qiymatlarini hisoblash esa


40 ning Fibonachchi hisoblashda davom etmoqda

c) 40 ta hisob tugashining Fibonachchi


1018 23-bob Parametrlilik

yamoq chizig'i rekursivda bo'lgani kabi GUI-ning javob bermasligiga olib kelmaydi
ko'p sonli Fibonachchini hisoblash algoritmi. Chunki Fibonachchi uzoqroq
hisoblash SwingWorker yordamida alohida ishchi ipda amalga oshiriladi, bu mumkin
Rekursiv hisoblash hali davom etayotganda keyingi Fibonachchi raqamini olish uchun.
23.11.2 Oraliq natijalarni qayta ishlash: Eratosthenes elak
Biz uzoq jarayonni bajarish uchun SwingWorker sinfidan foydalanadigan misolni taqdim etdik
fon oqimini yarating va jarayon tugagach GUI-ni yangilang. Endi biz taqdim etamiz
uzoq jarayon tugashidan oldin GUI-ni oraliq natijalar bilan yangilash misoli.
23.26-rasmda SwingWorker-ni hisoblash uchun kengaytiruvchi PrimeCalculator sinfi ko'rsatilgan
ishchi ipdagi birinchi n tub son. doInBackground va bajarilganidan tashqari
oldingi misolda ishlatilgan usullar, bu sinf SwingWorker nashr qilish usullaridan foydalanadi,
jarayon va setProgress. Ushbu misolda publish usuli asosiy raqamlarni yuboradi
usul jarayoni topilganidek, usul jarayoni ushbu asosiy qiymatlarni GUI birikmasida ko'rsatadi.
ponent va usul setProgress progress xususiyatini yangilaydi. Keyinchalik qanday qilishni ko'rsatamiz
JProgressBar-ni yangilash uchun ushbu xususiyatdan foydalaning.

1 // 23.26-rasm: PrimeCalculator.java


2 // Birinchi n ta tub sonni hisoblab, ularni topilgan holda ko'rsatadi.
3 import javax.swing.JTextArea;
4 import javax.swing.JLabel;
5 import javax.swing.JButton;
6 import javax.swing.SwingWorker;
7 import java.security.SecureRandom;
8 import java.util.Arrays;
9 import java.util.List;
10 import java.util.concurrent.CancellationException;
11 import java.util.concurrent.ExecutionException;
12
13 ommaviy sinf PrimeCalculator SwingWorker-ni kengaytiradi
14 {
15 xususiy statik yakuniy SecureRandom generator = yangi SecureRandom();
16 xususiy yakuniy JTextArea intermediateJTextArea; // topilgan tub sonlarni ko'rsatadi
17 xususiy final JButton getPrimesJButton;
18 xususiy final JButton bekor qilishJButton;
19 xususiy yakuniy JLabel statusJLabel; // hisoblash holatini ko'rsatadi
20 ta xususiy yakuniy mantiqiy[] tub sonlar; // tub sonlarni topish uchun mantiqiy massiv
21
22 // konstruktor
23 ommaviy PrimeCalculator (int max, JTextArea intermediateJTextArea,
24 JLabel statusJLabel, JButton getPrimesJButton,
25 JButton bekor qilishJButton)
26 {
27 this.intermediateJTextArea = intermediateJTextArea;
28 this.statusJLabel = statusJLabel;
29 this.getPrimesJButton = getPrimesJButton;
30 this.cancelJButton = bekor qilishJButton;
31 tub son = yangi mantiqiy[maks];
32

23.26-rasm | Birinchi n tub sonni hisoblab, ularni topilgan holda ko'rsatadi. (3-qismning 1-qismi.)


23.11 GUI bilan ko'p ish zarralari: SwingWorker 1019

33 Massivlar.fill(bosh sonlar, rost); // barcha tub elementlarni rost deb ishga tushiring
34 }
35
36 // Eratosfen elakidan foydalanib, maksimalgacha bo'lgan barcha tub sonlarni topadi
37 umumiy integer doInBackground()
38 {
39 int soni = 0; // topilgan tub sonlar soni
40
41 // uchinchi qiymatdan boshlab, massiv bo'ylab aylantiring va qo'ying
42 // yolg'on ko'paytmali har qanday katta raqamning qiymati sifatida
43 uchun (int i = 2; i < primes.length; i++)
44 {
45 if (isCancelled()) // agar hisoblash bekor qilingan bo'lsa
46 qaytish soni;
yana 47
48 {
49
50
51 urinib ko'ring
52 {
53 Thread.sleep(generator.nextInt(5));
54 }
55 catch (InterruptedException oldingi)
56 {
57 statusJLabel.setText("Ishchi mavzu uzilib qoldi");
58 qaytish soni;
59 }
60
61 if (past [i]) // i tub
62 {
63
64 ++son;
65
66 uchun (int j = i + i; j < primes.length; j += i)
67 tub son[j] = noto‘g‘ri; // i asosiy emas
68 }
69 }
70 }
71
72 qaytish soni;
73 }
74
75
76
77
78
79
80
81
82 // doInBackground tugallanganda bajariladigan kod
83 himoyalangan bekor qilindi()
84 {
85 getPrimesJButton.setEnabled(to'g'ri); // Primesni olish tugmasini yoqing

23.26-rasm | Birinchi n tub sonni hisoblab, ularni topilgan holda ko'rsatadi. (3 qismning 2-qismi.)

setProgress(100 * (i + 1) / primes.length);

nashr qilish(i); // i asosiy ro'yxatda ko'rsatish uchun mavjud qilish

// nashr etilgan qiymatlarni asosiy ro'yxatda ko'rsatadi
himoyalangan bekor jarayoni (Ro'yxat publishedVals)
{
uchun (int i = 0; i < publishedVals.size(); i++)
intermediateJTextArea.append(publishedVals.get(i) + "\n");
}

1020 23-bob Parametrlilik

Class PrimeCalculator SwingWorker-ni (13-qator) birinchi turdagi parametr bilan kengaytiradi
doInBackground usulining qaytish turini, ikkinchisi esa turini ko'rsatadi
nashr qilish va qayta ishlash usullari o'rtasida o'tkazilgan oraliq natijalar. Bunday holda, ikkalasi ham
tip parametrlari butun sonlardir. Konstruktor (23–34-qatorlar) argument sifatida butun sonni oladi
Bu joylashish uchun tub sonlarning yuqori chegarasini ko'rsatadi, ko'rsatish uchun ishlatiladigan JTextArea
GUIdagi boshlang'ich sonlar, hisoblashni boshlash uchun bitta JButton va uni bekor qilish uchun bitta JButton va
JLabel hisoblash holatini ko'rsatish uchun ishlatiladi.
Eratosfen elaklari
33-qator mantiqiy massivning elementlarini “Arrays” usuli yordamida “true” qiymatiga kiritadi.
to'ldirish. PrimeCalculator ushbu massiv va Eratosfen elak algoritmidan foydalanadi (ta'riflangan)
7.27-mashqda) max dan kichik barcha tub sonlarni toping. Eratosfen elaklari ro'yxatini oladi
butun sonlar va birinchi tub sondan boshlab, bu tubning barcha karralarini filtrlaydi.
Keyin u keyingi asosiy raqamga o'tadi, bu hali filtrlanmagan keyingi raqam bo'ladi,
va uning barcha ko'paytmalarini yo'q qiladi. Bu ro'yxatning oxirigacha davom etadi va hammasi
oddiy bo'lmaganlar filtrdan o'tkazildi. Algoritmik ravishda biz bool-ning 2-elementidan boshlaymiz.
ean massivini o'rnating va 2 ga karrali barcha qiymatlarga mos keladigan katakchalarni o'rnating
ular 2 ga bo'linishini va shuning uchun tub emasligini ko'rsatadi. Keyin keyingi qatorga o'tamiz
elementning rostligini tekshiring va agar shunday bo'lsa, buni ko'rsatish uchun uning barcha ko'paytmalarini yolg'onga qo'ying
ular joriy indeksga bo'linadi. Butun massiv shu tarzda o'tkazilganda,
rost ni o'z ichiga olgan barcha indekslar tubdir, chunki ularning bo'luvchilari yo'q.
doInBackground usuli
doInBackground usulida (37-73-qatorlar), tsikl uchun i boshqaruv o'zgaruvchisi (43-satrlar)
70) Eratosthenes elakini joriy qilish uchun joriy indeksni nazorat qiladi. 45-qator qo'ng'iroqlar
meros qilib olingan SwingWorker usuli foydalanuvchida bor yoki yo'qligini aniqlash uchun Bekor qilingan
Bekor qilish tugmasini bosing. Agar isCancelled rost qaytarsa, doInBackground usuli qaytariladi
hisoblashni tugatmasdan hozirgacha topilgan tub sonlar soni (46-qator).
Agar hisob-kitob bekor qilinmasa, 49-qator foizni yangilash uchun setProgress-ni chaqiradi.
hozirgacha bosib o'tilgan massiv. 53-qator hozirda bajarilayotgan ipni uyqu rejimiga qo'yadi
4 millisekundgacha. Buning sababini qisqacha muhokama qilamiz. 61-qator tekshiradi
Joriy indeksdagi massivning asosiy elementi rost (va shuning uchun tub). Agar shunday bo'lsa, 63-qator o'tadi

86 cancelJButton.setEnabled(noto'g'ri); // Bekor qilish tugmachasini o'chirish


87
88 urinib ko'ring
89 {
90 // doInBackground qaytish qiymatini olish va ko'rsatish
91 statusJLabel.setText("Topildi" + get() + "asosiy raqamlar.");
92 }
93 catch (InterruptedException | ExecutionException |
94 CancellationException ex)
95 {
96 statusJLabel.setText(ex.getMessage());
97 }
98 }
99 } // yakuniy sinf PrimeCalculator

23.26-rasm | Birinchi n tub sonni hisoblab, ularni topilgan holda ko'rsatadi. (3 qismning 3-qismi.)


23.11 GUI bilan multithreading: SwingWorker 1021

nashr qilish usuli indeksini oraliq natija sifatida ko'rsatish uchun
GUI va 64-qator topilgan tub sonlar sonini oshiradi. 66-67 qatorlar barcha ko'paytmalarni o'rnatadi
joriy indeks ular asosiy emasligini ko'rsatish uchun noto'g'ri. Butun massiv mavjud bo'lganda
o'tgan bo'lsa, 72-satr topilgan tub sonlar sonini qaytaradi.
Usul jarayoni
76-80 qatorlar hodisani jo'natish oqimida bajariladigan va qayta ishlaydigan usul jarayonini e'lon qiladi.
o'z argumentini nashr etish usulidan publishedVals qabul qiladi. Qiymatlar orasidagi o'tish
ishchi to'plamida nashr eting va voqea jo'natuvchi ip asinxron bo'lganda jarayon;
nashr qilish uchun har bir qo'ng'iroq uchun jarayon chaqirilmasligi mumkin. dan beri chop etilgan barcha butun sonlar
Jarayonga oxirgi qo'ng'iroq usul bo'yicha ro'yxat sifatida qabul qilinadi. 78–79 qatorlar takrorlanadi
ushbu roʻyxatni oʻrnating va chop etilgan qiymatlarni JTextAreaʼda koʻrsating. Chunki hisoblash ichida
doInBackground usuli tez rivojlanadi, qiymatlarni tez-tez nashr etadi, yangilanadi
JTextArea hodisani jo'natish to'plamida to'planishi mumkin, bu esa GUIning sustlashishiga olib keladi.
Haqiqatan ham, ko'p sonli boshlang'ich sonlarni qidirganda, voqea jo'natish oqimi qabul qilinishi mumkin
JTextArea-ni yangilash uchun ketma-ket juda ko'p so'rovlar bo'lib, uning xotirasi tugaydi
uning voqea navbatida. Shuning uchun biz ishchi ipni bir necha millisekundga uyqu rejimiga qo'yamiz.
nashr qilish uchun oraliq qo'ng'iroqlar. Hisoblash hodisani jo'natish imkonini beradigan darajada sekinlashtirilgan
JTextArea-ni yangi boshlang'ich sonlar bilan yangilash bo'yicha so'rovlarni bajarish uchun ip
GUI muammosiz yangilanadi va javob beradi.
Usul bajarildi
83–98 qatorlar bajarilgan usulni belgilaydi. Hisoblash tugallanganda yoki bekor qilinganda, usul
tugallanganda “Get Primes” tugmasi yoqiladi va Bekor qilish tugmasi oʻchiriladi (85–86-qatorlar). 91-qator
Qaytish qiymatini oladi va ko'rsatadi - topilgan asosiy sonlar soni - doIn- usulidan
Fon. 93-97 qatorlar olish usuli bilan chiqarilgan istisnolarni ushlaydi va ilovani ko'rsatadi.
statusJLabelda tegishli xabar.
FindPrimes sinfi
FindPrimes klassi (23.27-rasm) foydalanuvchiga raqam kiritish imkonini beruvchi JTextField-ni ko'rsatadi.
ber, bu sondan kichik barcha tub sonlarni topish uchun JButton va yo'q qilish uchun JTextArea.
asosiylarni o'ynang. JButton foydalanuvchiga hisobni va JProgressBarni bekor qilish imkonini beradi
hisoblashning borishini ko'rsatadi. Konstruktor (32-125-qatorlar) GUI-ni o'rnatadi.

1 // 23.27-rasm: FindPrimes.java


2 // Asosiy raqamlarni ko'rsatish va JProgressBar-ni yangilash uchun SwingWorker-dan foydalanish
3 // tub sonlar hisoblanayotganda.
4 import javax.swing.JFrame;
5 import javax.swing.JTextField;
6 import javax.swing.JTextArea;
7 import javax.swing.JButton;
8 import javax.swing.JProgressBar;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JScrollPane;
12 import javax.swing.ScrollPaneConstants;

23.27-rasm | Asosiy raqamlarni ko'rsatish va JProgressBar-ni yangilash uchun SwingWorker-dan foydalanish


tub sonlar hisoblanayotganda. (4-qismning 1-qismi.)

1022 23-bob Parametrlilik

13 import java.awt.BorderLayout;
14 import java.awt.GridLayout;
15 import java.awt.event.ActionListener;
16 import java.awt.event.ActionEvent;
17 import java.util.concurrent.ExecutionException;
18 import java.beans.PropertyChangeListener;
19 import java.beans.PropertyChangeEvent;
20
21 umumiy sinf FindPrimes JFrame-ni kengaytiradi
22 {
23 xususiy yakuniy JTextField highPrimeJTextField = yangi JTextField();
24 xususiy final JButton getPrimesJButton = yangi JButton("Get Primes");
25 xususiy yakuniy JTextArea displayPrimesJTextArea = yangi JTextArea();
26 xususiy final JButton cancelJButton = yangi JButton("Bekor qilish");
27 xususiy yakuniy JProgressBar progressJProgressBar = yangi JProgressBar();
28 xususiy yakuniy JLabel statusJLabel = yangi JLabel();
29 shaxsiy PrimeCalculator kalkulyatori;
30
31 // konstruktor
32 ommaviy FindPrimes()
33 {
34 super("SwingWorker yordamida asosiy sonlarni topish");
35 setLayout(yangi BorderLayout());
36
37 // foydalanuvchidan raqam olish uchun panelni ishga tushiring
38 JPanel northJPanel = yangi JPanel();
39 northJPanel.add(new JLabel("Kichik tub sonlarni toping: "));
40 ta highPrimeJTextField.setColumns(5);
41 northJPanel.add(highestPrimeJTextField);
42 getPrimesJButton.addActionListener(
43 ta yangi ActionListener()
44 {
45 ommaviy bekor harakat bajarildi(ActionEvent e)
46 {
47 progressJProgressBar.setValue(0); // JProgressBar-ni tiklash
48 displayPrimesJTextArea.setText(""); // JTextArea-ni tozalang
49 statusJLabel.setText(""); // JLabel-ni tozalang
50
51 int raqami; // bu qiymat orqali boshlang'ich sonlarni qidiring
52
53 urinib ko'ring
54 {
55 // foydalanuvchi ma'lumotlarini olish
56 raqami = Integer.parseInt(
57 highPrimeJTextField.getText());
58 }
59 catch (NumberFormatException oldingi)
60 {
61 statusJLabel.setText("Butun sonni kiriting.");
62 qaytish;
63 }
64
23.27-rasm | Asosiy raqamlarni ko'rsatish va JProgressBar-ni yangilash uchun SwingWorker-dan foydalanish
tub sonlar hisoblanayotganda. (4 qismning 2-qismi.)

23.11 GUI bilan ko'p qirrali: SwingWorker 1023

65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 // Get Primes tugmachasini o'chiring va Bekor qilish tugmasini yoqing
88 getPrimesJButton.setEnabled(false);
89 cancelJButton.setEnabled(to'g'ri);
90
91
92 }
93 } // anonim ichki sinfni tugatish
94); // addActionListener-ga qo'ng'iroqni tugatish
95 northJPanel.add(getPrimesJButton);
96
97 // Hisoblash natijalarini ko'rsatish uchun aylantiriladigan JList qo'shing
98 displayPrimesJTextArea.setEditable(noto'g'ri);
99 qoʻshish(yangi JScrollPane(displayPrimesJTextArea,
100 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
101 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_HECH));
102
103 // cancelJButtonni ko'rsatish uchun panelni ishga tushiring,
104 // progressJProgressBar va statusJLabel
105 JPanel southJPanel = yangi JPanel (yangi GridLayout(1, 3, 10, 10));
106 cancelJButton.setEnabled(noto'g'ri);
107 cancelJButton.addActionListener(
108 ta yangi ActionListener()
109 {
110 ommaviy bekor harakat bajarildi(ActionEvent e)
111 {
112
113 }
114 } // anonim ichki sinfni tugatish
115); // addActionListener-ga qo'ng'iroqni tugatish

23.27-rasm | Asosiy raqamlarni ko'rsatish va JProgressBar-ni yangilash uchun SwingWorker-dan foydalanish


tub sonlar hisoblanayotganda. (4 qismning 3-qismi.)

// yangi PrimeCalculator obyektini qurish


kalkulyator = yangi PrimeCalculator (raqam,
displayPrimesJTextArea, statusJLabel, getPrimesJButton,
bekor qilishJButton);

// progress satrining xususiyati o'zgarishlarini tinglang


calculator.addPropertyChangeListener(
yangi PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent e)
{
// agar o'zgartirilgan xususiyat progress bo'lsa,
// taraqqiyot satrini yangilash
agar (e.getPropertyName().equals("progress"))
{
int newValue = (Integer) e.getNewValue();
progressJProgressBar.setValue(newValue);
}
}
} // anonim ichki sinfni tugatish
); // addPropertyChangeListener-ga qo'ng'iroqni tugatish

kalkulyator.execute(); // PrimeCalculator obyektini bajaring

kalkulyator.cancel(to'g'ri); // hisoblashni bekor qilish

1024 23-bob Parametrlilik

42–94 satrlar getPrimesJButton uchun hodisa ishlov beruvchisini ro'yxatdan o'tkazing. Qachon foydalanuvchi
ushbu Jtugmachani bosgandan so'ng, 47–49-qatorlar JProgressBar-ni qayta tiklaydi va displayPrimes-ni tozalaydi.
JTextArea va statusJLabel. 53-63 qatorlar JTextField-dagi qiymatni tahlil qiladi va o'chiradi.
qiymat butun son bo'lmasa, xato xabarini o'ynatish. 66-68 qatorlar yangisini quradi
PrimeCalculator ob'ekti foydalanuvchi kiritgan butun sonni argument sifatida uzatadi, displey-
PrimesJTextArea asosiy sonlarni, statusJLabelni va ikkita JButtonni ko'rsatish uchun.
71–85-qatorlar PrimeCalculator obyekti uchun PropertyChangeListener-ni ro'yxatdan o'tkazadi.
PropertyChangeListener - bu java.beans to'plamining interfeysi bo'lib, u bitta
usul, xususiyatni o'zgartirish. PrimeCalcu-da setProgress usuli har safar chaqirilganda
Buning uchun PrimeCalculator PropertyChangeEvent ni hosil qiladi, bu prog-
ress xususiyati o'zgargan. Method propertyChange bu hodisalarni tinglaydi. 78-qator testlari
berilgan PropertyChangeEvent progress xususiyatining o'zgarishini bildiradimi yoki yo'qmi. Agar shunday bo'lsa,
80-qator xususiyatning yangi qiymatini oladi va 81-qator JProgressBar-ni yangilaydi
yangi progress mulk qiymati.
Get Primes J tugmasi o'chirilgan (88-qator), shuning uchun faqat bitta hisob yangilanadi.
GUI bir vaqtning o'zida ishlashi mumkin va foydalanuvchiga ruxsat berish uchun Bekor qilish JButton yoqilgan (89-satr).

116 southJPanel.add(cancelJButton);


117 progressJProgressBar.setStringPainted(to'g'ri);
118 southJPanel.add(progressJProgressBar);
119 southJPanel.add(statusJLabel);
120
121 add(northJPanel, BorderLayout.NORTH);
122 add(southJPanel, BorderLayout.SOUTH);
123 toʻplamOʻlcham(350, 300);
124 setVisible(to'g'ri);
125 } // yakunlovchi konstruktor
126
127 // asosiy usul dasturni bajarishni boshlaydi
128 umumiy statik bekor asosiy(String[] args)
129 {
130 FindPrimes ilovasi = yangi FindPrimes();
131 application.setDefaultCloseOperation(EXIT_ON_CLOSE);
132 } // asosiyni tugatish
133 } // oxirgi sinf FindPrimes

23.27-rasm | Asosiy raqamlarni ko'rsatish va JProgressBar-ni yangilash uchun SwingWorker-dan foydalanish


tub sonlar hisoblanayotganda. (4 qismning 4-qismi.)

23.12 Java SE 8 Sana/Vaqt API 1025 bilan vaqtlarni tartiblash/parallel saralash

hisoblashni yakunlashdan oldin to'xtatish uchun. 91-qator PrimeCalculator dasturini bajaradi
tub sonlarni topishni boshlang. Agar foydalanuvchi bekor qilishJButton tugmachasini bosgan bo'lsa, voqea ishlovchisi ro'yxatdan o'tgan
107–115 qatorlar PrimeCalculatorning bekor qilish usulini chaqiradi (112-satr), u meros qilib olingan
sinf SwingWorker, va hisoblash erta qaytadi. Argument usulga to'g'ri keladi
bekor qilish vazifani bajaruvchi ip urinishda uzilishi kerakligini bildiradi
vazifani bekor qilish.

23.12 Java SE 8 bilan sort/parallelSort Timeings


Sana/vaqt API
7.15-bo'limda biz massivni saralash uchun Arrays sinfining statik usulidan foydalandik va biz:
Katta massivlarni ko'p massivlarda samaraliroq saralash uchun parallelSort statik usuli joriy etildi.
yadro tizimlari. 23.28-rasmda 15 000 000 ta elementli massivlarni saralash uchun ikkala usul ham qo'llaniladi.
dom int qiymatlarini kiriting, shunda biz parallelSortning ish faoliyatini yaxshilashni ko'rsatishimiz mumkin
ko'p yadroli tizimda ortiqcha tartiblash (biz buni ikki yadroli tizimda ishlatdik).

1 // SortComparison.java


2 // Massivlar tartiblash va parallelSort usullarining unumdorligini solishtirish.
3 import java.time.Duration;
4 import java.time.Instant;
5 import java.text.NumberFormat;
6 import java.util.Arrays;
7 import java.security.SecureRandom;
8
9 umumiy sinf SortComparison
10 {
11 ta umumiy statik bekor asosiy(String[] args)
12 {
13 SecureRandom tasodif = yangi SecureRandom();
14
15 // tasodifiy ints qatorini yarating, keyin uni nusxalang
16 int[] massiv1 = random.ints(15_000_000).toArray();
17 int[] array2 = new int[array1.length];
18 System.arraycopy(massiv1, 0, massiv2, 0, massiv1.uzunlik);
19
20 // massiv1ni massivlar usuli bilan tartiblash vaqti
21 System.out.println("Boshlab turuvchi");
22
23
24
25
26 // vaqtni hisoblash natijalarini ko'rsatish
27 uzun sortTime = Duration.between(sortStart, sortEnd).toMillis();
28 System.out.printf("Millisekundlardagi umumiy vaqt: %d%n%n", sortTime);
29
30 // Massivlar usuli parallelSort bilan massiv2ni tartiblash vaqti
31 System.out.println("ParalelSortni ishga tushirish");
32

23.28-rasm | Massivlarni tartiblash va parallelSort usullarining samaradorligini solishtirish. (2-qismning 1-qismi.)

Instant sortStart = Instant.now();
massivlar.sort(1-massiv);
Instant sortEnd = Instant.now();

Instant parallelSortStart = Instant.now();


1026 23-bob Parametrlilik

Massivlarni yaratish
16-qator 15 000 000 tasodifiy IntStream yaratish uchun SecureRandom usulidan foydalanadi.
int qiymatlari, keyin qiymatlarni massivga joylashtirish uchun IntStream usulini toArray chaqiradi. Chiziqlar
17 va 18 massivni shunday nusxa ko'chiringki, tartiblash va parallelSort qo'ng'iroqlari bilan ishlaydi.
bir xil qiymatlar to'plami.
Vaqt massivlari Sana/vaqt API sinflari lahzali va davomiylik bo'yicha tartiblash usuli
22 va 24-qatorlar har bir qo'ng'iroq sinfi Instantning statik usulidan oldingi joriy vaqtni olish uchun hozir.
va tartiblash uchun qo'ng'iroqdan keyin. Ikki lahza o'rtasidagi farqni aniqlash uchun 27-qator ishlatiladi
sinf Duration ning statik usuli oʻrtasida boʻlib, u oʻz ichiga Duration obyektini qaytaradi
vaqt farqi. Keyin milli-dagi farqni olish uchun Duration usulini toMillis deb ataymiz.
soniya.
Vaqt massivlari usuli parallelSort bilan sana/vaqt API sinflari Instant va
Davomiyligi
32–34 qatorlar parallelSort Massivlar usuliga qo'ng'iroq qilish vaqti. Keyin, 37-38 qatorlarni hisoblang
Instants o'rtasidagi farq.
Saralash vaqtlari orasidagi foiz farqini ko'rsatish
43–44 qatorlar tartiblash vaqtlari nisbatini formatlash uchun NumberFormat (java.text paketi)dan foydalanadi.
foiz sifatida. NumberFormat statik usuli getPercentInstance raqamni qaytaradi-
Raqamni foiz sifatida formatlash uchun foydalaniladigan format. NumberFormat usuli formati -
formatlashni tashkil qiladi. Namunada ko'rib turganingizdek, tartiblash usuli o'z zimmasiga oldi
15 000 000 tasodifiy int qiymatlarini saralash uchun 400% ko'proq vaqt.

33
34


35
36 // vaqtni hisoblash natijalarini ko'rsatish
37 uzun parallelSortTime =
38;
39 System.out.printf("Millisekundlardagi umumiy vaqt: %d%n%n",
40 parallelSortTime);
41
42 // vaqt farqini foiz sifatida ko'rsatish
43
44
45 System.out.printf("%nsort parallelSort%n ga qaraganda %s ko'proq vaqt oldi",
46 foiz);
47 }
48 } // so'nggi sinf SortComparison

Boshlang'ich saralash


Millisekundlarda umumiy vaqt: 1319
ParallelSortni boshlash
Millisekundlarda umumiy vaqt: 323
Saralash parallelSortga qaraganda 408% ko'proq vaqt oldi

23.28-rasm | Massivlarni tartiblash va parallelSort usullarining samaradorligini solishtirish. (2-qismning 2-qismi.)

Arrays.parallelSort(massiv2);
Instant parallelSortEnd = Instant.now();

Duration.been(parallelSortStart, parallelSortEnd).toMillis()

String foizi = NumberFormat.getPercentInstance().format(
(ikki marta) sortTime / parallelSortTime);

23.13 Java SE 8: Ketma-ket va parallel oqimlar 1027

Parallel massivning boshqa operatsiyalari
ParallelSort usuliga qo'shimcha ravishda, Arrays klassi endi parallel usullarni o'z ichiga oladi.
lelSetAll va parallelPrefix, ular quyidagi vazifalarni bajaradi:
• parallelSetAll — massivni generator funksiyasi tomonidan ishlab chiqarilgan qiymatlar bilan to'ldiradi
bu int qabul qiladi va int tipidagi qiymatni qaytaradi, long yoki double. qarab
parallelSetAll usulining haddan tashqari yuklanishida generator funktsiyasi ishlatiladi
IntToDoubleFunction-ni amalga oshiradigan sinf ob'ekti (ikkita massivlar uchun),
IntUnaryOperator (int massivlar uchun), IntToLongFunction (uzun massivlar uchun) yoki
IntFunction (har qanday ibtidoiy bo'lmagan massivlar uchun).
• parallelPrefix—Joriy va oldingi massivga BinaryOperatorni qo‘llaydi
elementlar va natijani joriy elementda saqlaydi. Masalan, ko'rib chiqing:

ParallelPrefix-ga qo'ng'iroq qilish ikkita qiymat qo'shadigan BinaryOperator-dan foydalanadi. Keyin


qo'ng'iroq tugaydi, massiv 1, 3, 6, 10 va 15 ni o'z ichiga oladi. Xuddi shunday, quyidagi
parallelPrefix ga qo'ng'iroq qilish, ikkita qiymatni ko'paytiruvchi BinaryOperator dan foydalanadi. Keyin
qo'ng'iroq tugaydi, massiv 1, 2, 6, 24 va 120 ni o'z ichiga oladi:

23.13 Java SE 8: Ketma-ket va parallel oqimlar


17-bobda siz Java SE 8 lambdalari va oqimlari haqida bilib oldingiz. Biz buni eslatib o'tdik
Oqimlarni parallellashtirish oson, bu dasturlarga yaxshilangan ishlashdan foydalanish imkonini beradi
ko'p yadroli tizimlarda. 23.12-bo'limda kiritilgan vaqtni belgilash imkoniyatlaridan foydalangan holda,
23.29-rasmda 10 000 000-da ketma-ket va parallel oqim operatsiyalari ko'rsatilgan.
unumdorlikni solishtirish uchun tasodifiy uzun qiymatlarning elementlar majmuasi (17-qatorda yaratilgan).

int[] qiymatlari = {1, 2, 3, 4, 5};


Massivlar.parallelPrefix(qiymatlar, (x, y) -> x + y);

int[] qiymatlari = {1, 2, 3, 4, 5};


Massivlar.parallelPrefix(qiymatlar, (x, y) -> x * y);

1 // StreamStatisticsComparison.java


2 // Ketma-ket va parallel oqim operatsiyalarining ishlashini solishtirish.
3 import java.time.Duration;
4 import java.time.Instant;
5 import java.util.Arrays;
6 import java.util.LongSummaryStatistics;
7 import java.util.stream.LongStream;
8 import java.security.SecureRandom;
9
10 ochiq sinf StreamStatisticsComparison
11 {
12 ta umumiy statik bekor asosiy(String[] args)
13 {
14 SecureRandom tasodif = yangi SecureRandom();
15
16 // tasodifiy uzun qiymatlar qatorini yarating
17 ta long[] qiymat = random.longs(10_000_000, 1, 1001).toArray();

23.29-rasm | Ketma-ket va parallel oqim operatsiyalari samaradorligini solishtirish. (3-qismning 1-qismi.)


1028 23-bob Parametrlilik

18
19 // hisob-kitoblarni alohida bajarish
20
21
22
23
24
25
26
27
28 // natijalarni ko'rsatish
29 System.out.println("Hisob-kitoblar alohida bajariladi");
30 System.out.printf("hisob: %,d%n", hisoblash);
31 System.out.printf("sum: %,d%n", summa);
32 System.out.printf(" min: %,d%n", min);
33 System.out.printf("maks: %,d%n", maks);
34 System.out.printf("o'rtacha: %f%n", o'rtacha);
35 System.out.printf("Millisekundlardagi umumiy vaqt: %d%n%n",
36 Davomiylik.orasida(alohidaStart, alohidaEnd).toMillis());
37
38 // ketma-ket oqim bilan vaqt yig'indisi operatsiyasi
39 LongStream stream1 = Massivlar.stream(qiymatlar);
40 System.out.println("Tartibli oqim bo'yicha statistik ma'lumotlarni hisoblash");
41
42
43
44
45 // natijalarni ko'rsatish
46 displayStatistics(natijalar1);
47 System.out.printf("Millisekundlardagi umumiy vaqt: %d%n%n",
48 Davomiylik.arasida(sequentialStart, sequentialEnd).toMillis());
49
50 // parallel oqim bilan vaqt yig'indisi ishlashi
51 LongStream stream2 = Massivlar.stream(qiymatlar).parallel();
52 System.out.println("Paralel oqim bo'yicha statistikani hisoblash");
53
54
55
56
57 // natijalarni ko'rsatish
58 displayStatistics(natijalar1);
59 System.out.printf("Millisekundlardagi umumiy vaqt: %d%n%n",
60 Duration.been(parallelStart, parallelEnd).toMillis());
61 }
62
63 // LongSummaryStatistics qiymatlarini ko'rsatish
64 ta shaxsiy statik boʻshliqni koʻrsatishStatistika(LongSummaryStatistics stats)
65 {
66 System.out.println("Statistika");
67 System.out.printf("hisob: %,d%n", stats.getCount());
68 System.out.printf("sum: %,d%n", stats.getSum());
69 System.out.printf("min: %,d%n", stats.getMin());
70 System.out.printf("maks: %,d%n", stats.getMax());

23.29-rasm | Ketma-ket va parallel oqim operatsiyalari samaradorligini solishtirish. (3 qismning 2-qismi.)

Instant separatStart = Instant.now();
long count = Arrays.stream(qiymatlar).count();
uzun summa = Massivlar.stream(qiymatlar).sum();
long min = Massivlar.stream(qiymatlar).min().getAsLong();
long max = Massivlar.stream(qiymatlar).max().getAsLong();
ikki barobar o'rtacha = Arrays.stream(qiymatlar).average().getAsDouble();
Instant separatEnd = Instant.now();

Instant sequentialStart = Instant.now();


LongSummaryStatistics results1 = stream1.summaryStatistics();
Instant sequentialEnd = Instant.now();

Instant parallelStart = Instant.now();


LongSummaryStatistics natijalari2 = stream2.summaryStatistics();
Instant parallelEnd = Instant.now();

23.13 Java SE 8: Ketma-ket va parallel oqimlar 1029

Ketma-ket oqimning alohida o'tishlari bilan oqim operatsiyalarini bajarish
17.3-bo'lim IntStreams-da turli xil raqamli operatsiyalarni namoyish etdi. 20–26 qatorlar
Har bir bajarilgan hisob, yig'indi, min, maksimal va o'rtacha oqim operatsiyalarini shakl va vaqt
Arrays usuli oqimi tomonidan qaytarilgan LongStreamda alohida. 29–36 qatorlar, so'ngra o'chiriladi
natijalarni va barcha besh operatsiyani bajarish uchun zarur bo'lgan umumiy vaqtni o'ynang.
Oqim operatsiyalarini ketma-ket oqimning bir martalik o'tishi bilan bajarish
39–48-qatorlar LongStream-dan foydalanish orqali erishgan ish faoliyatini yaxshilashni namoyish etadi
Usul sarhisobi Hisob, summa, minimal qiymat, maksimalni aniqlash uchun statistika
ketma-ket LongStreamning bir o'tishidagi qiymat va o'rtacha - barcha oqimlar ketma-ketlik bilan ketma-ket bo'ladi.
ayb. Ushbu operatsiya beshta operatsiyani bajarish uchun zarur bo'lgan vaqtning taxminan 40 foizini oladi.
nashrlar alohida.
Parallel oqimning bir martalik o'tishi bilan oqim operatsiyalarini bajarish
51–60-qatorlar LongStream-dan foydalangan holda ishlashning yaxshilanishini namoyish etadi
Parallel LongStream bo'yicha statistik ma'lumotlar. Mumkin bo'lgan parallel oqimni olish uchun
ko'p yadroli protsessorlardan foydalaning, shunchaki mavjud bo'lgan parallel usulni chaqiring
oqim. Namunadan ko'rinib turibdiki, parallel ravishda operatsiyalarni bajarish
oqim talab qilinadigan umumiy vaqtni yanada qisqartirdi - taxminan 55% ni tashkil etdi

71 System.out.printf("o'rtacha: %f%n", stats.getAverage());


72 }
73 } // oxirgi sinf StreamStatisticsComparison

Hisob-kitoblar alohida amalga oshiriladi


soni: 10 000 000
summasi: 5 003 695 285
min: 1
maksimal: 1000
o'rtacha: 500,369529
Millisekundlarda umumiy vaqt: 173

Ketma-ket oqim bo'yicha statistikani hisoblash


Statistika
soni: 10 000 000
summasi: 5 003 695 285
min: 1
maksimal: 1000
o'rtacha: 500,369529
Millisekundlarda umumiy vaqt: 69

Parallel oqim bo'yicha statistikani hisoblash


Statistika
soni: 10 000 000
summasi: 5 003 695 285
min: 1
maksimal: 1000
o'rtacha: 500,369529
Millisekundlarda umumiy vaqt: 38

23.29-rasm | Ketma-ket va parallel oqim operatsiyalari samaradorligini solishtirish. (3 qismning 3-qismi.)


1030 23-bob Parametrlilik



ketma-ket LongStream uchun hisoblash vaqti va bajarish uchun zarur bo'lgan vaqtning atigi 22%.
beshta operatsiyani alohida shakllantiring.
23.14 (Kengaytirilgan) Chaqiriladigan va kelajak interfeyslari
Interface Runnable ko'p bosqichli dastur uchun faqat eng asosiy funktsiyalarni ta'minlaydi.
ming. Aslida, bu interfeys cheklovlarga ega. Aytaylik, Runnable uzoq vaqt ishlayapti.
culation va ilova ushbu hisob natijasini olishni xohlaydi. Yugurish
usul qiymatni qaytara olmaydi, shuning uchun qiymatni uzatish uchun umumiy o'zgaruvchan ma'lumotlar talab qilinadi
chaqiruvchi mavzuga qaytish. Ma'lumki, bu ish zarralarini sinxronlashtirishni talab qiladi.
Chaqiriladigan interfeys (java.util.concurrent paketi) bu cheklovni tuzatadi. ichida -
terface qo'ng'iroq deb nomlangan yagona usulni e'lon qiladi va natijani ifodalovchi qiymatni qaytaradi
Chaqiriladigan vazifaning - masalan, uzoq davom etgan hisob-kitob natijasi.
Chaqiriladigan ilovani yaratuvchi dastur uni boshqasi bilan bir vaqtda ishga tushirishni xohlashi mumkin
Runnables va Callables. ExecutorService yuborish usuli o'zining Callable argumentini bajaradi.
ment va Future tipidagi ob'ektni qaytaradi (java.util.concurrent paketi), qaysi
Callablening kelajakdagi natijasini ifodalaydi. Future interfeysi olish usuli qo'ng'iroqni bloklaydi
mavzuni ochadi va Callable tugallanishini kutadi va natijasini qaytaradi. Interfeys ham
Qo'ng'iroq qilinuvchining bajarilishini bekor qilish imkonini beruvchi usullarni taqdim etadi, yoki yo'qligini aniqlang
Chaqirilishi bekor qilindi va Chaqiriladigan o'z vazifasini bajarganligini aniqlang.
CompletableFuture bilan aysnxron vazifalarni bajarish
Java SE 8 CompletableFuture (java.util.concurrent paketi) sinfini taqdim etadi.
Future interfeysini amalga oshiradi va Runnables-ni asinxron tarzda bajarishga imkon beradi
qiymatlarni qaytaradigan vazifalarni yoki etkazib beruvchilarni bajarish. Interfeys ta'minotchisi, masalan, Callable interfeysi,
argumentlarni qabul qilmaydigan yagona usul (bu holda, olish) bilan funktsional interfeysdir
va natijani qaytaradi. Class CompletableFuture ko'plab qo'shimcha imkoniyatlarni taqdim etadi
ilg'or dasturchilar, masalan, ularni bajarmasdan CompletableFutures yaratish.
vositachilik bilan, bir yoki bir nechta CompletableFutures tuzing, shunda siz istalgan yoki barchasini kutishingiz mumkin
ulardan to'liq bajarish, CompletableFuture tugagandan so'ng kodni bajarish va boshqalar.
23.30-rasmda ketma-ket ikkita uzoq muddatli hisob-kitoblar amalga oshiriladi, so'ngra amalga oshiriladi
ishlashni namoyish qilish uchun CompletableFutures-dan foydalanib, ularni yana asinxron
ko'p yadroli tizimda asinxron bajarishdan takomillashtirish. Namoyish uchun
maqsadlarda, bizning uzoq muddatli hisobimiz rekursiv fibonachchi usuli bilan amalga oshiriladi
(73–79-qatorlar; 18.5-bo'limda keltirilganga o'xshash). Kattaroq Fibonachchi qiymatlari uchun,
rekursiv amalga oshirish muhim hisoblash vaqtini talab qilishi mumkin - amalda bu
loop yordamida Fibonachchi qiymatlarini hisoblash uchun ancha tezroq.

1 // FibonacciDemo.java


2 // Fibonachchi hisob-kitoblari sinxron va asinxron tarzda amalga oshirildi
3 import java.time.Duration;
4 import java.text.NumberFormat;
5 import java.time.Instant;
6
7
8

23.30-rasm | Fibonachchi hisob-kitoblari sinxron va asinxron tarzda amalga oshirildi. (4-qismning 1-qismi.)

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

23.14 (Kengaytirilgan) Chaqiriladigan va kelajak 1031 interfeyslari

9 // ikki lahzani o'z vaqtida saqlaydigan sinf
10-sinf TimeData
11 {
12 ommaviy tezkor ishga tushirish;
13 ommaviy Instant end;
14
15 // jami vaqtni soniyalarda qaytaring
16 umumiy ikki martalik vaqtInSeconds()
17 {
18 qaytish Duration.been(boshlash, tugatish).toMillis() / 1000.0;
19 }
20 } // oxirgi sinf TimeData
21
22 ommaviy sinf FibonacciDemo
23 {
24 ta umumiy statik bekor asosiy (String [] args)
25
26 {
27 // sinxron fibonachchi(45) va fibonachchi(44) hisoblarini bajaring
28 System.out.println("Sinxron uzoq muddatli hisoblar");
29
30
31 juft sinxron vaqt =
32 hisoblashVaqt(synchronousResult1, synchronousResult2);
33 System.out.printf(
34 "Jami hisoblash vaqti = %.3f soniya% n", synchronousTime);
35
36 // asinxron fibonachchi(45) va fibonachchi(44) hisoblarini bajaring
37 System.out.printf("%nAsinxron uzoq muddatli hisoblar%n");
38
39
40
41
42
43 // asinxron operatsiyalar natijalarini kuting
44
45
46 juft asynchronousTime =
47 hisoblashTime(asynchronousResult1, asynchronousResult2);
48 System.out.printf(
49 "Jami hisoblash vaqti = %.3f soniya% n", asinxron vaqt);
50
51 // vaqt farqini foiz sifatida ko'rsatish
52 String foizi = NumberFormat.getPercentInstance().format(
53 sinxron vaqt / asynchronousTime);
54 System.out.printf("%nSinxron hisob-kitoblar %s oldi" +
55 "asinxron hisob-kitoblarga qaraganda ko'proq vaqt% n", foiz);
56 }
57
58 // fibonachchi funksiyasini asinxron tarzda bajaradi
59 shaxsiy statik TimeData startFibonachchi(int n)
60 {

23.30-rasm | Fibonachchi hisob-kitoblari sinxron va asinxron tarzda amalga oshirildi. (4 qismning 2-qismi.)

InterruptedException, ExecutionException ni tashlaydi

TimeData synchronousResult1 = startFibonachchi(45);


TimeData synchronousResult2 = startFibonachchi(44);

CompletableFuture futureResult1 =


CompletableFuture.supplyAsync(() -> startFibonachchi(45));
CompletableFuture futureResult2 =
CompletableFuture.supplyAsync(() -> startFibonachchi(44));

TimeData asynchronousResult1 = futureResult1.get();


TimeData asynchronousResult2 = futureResult2.get();

1032 23-bob Parametrlilik

61 // vaqtni saqlash uchun TimeData obyektini yarating
62 TimeData timeData = yangi TimeData();
63
64 System.out.printf("Fibonachchini hisoblash(%d)%n", n);
65 timeData.start = Instant.now();
66
67 timeData.end = Instant.now();
68 displayResult(n, fibonacciValue, timeData);
69 qaytish vaqtiData;
70 }
71
72 // rekursiv usul fibonachchi; n-Fibonachchi sonini hisoblaydi
73 shaxsiy statik uzun fibonachchi (uzun n)
74 {
75 agar (n == 0 || n == 1)
76 qaytish n;
yana 77
78 qaytish fibonachchi(n - 1) + fibonachchi(n - 2);
79 }
80
81 // Fibonachchi hisoblash natijasi va umumiy hisoblash vaqtini ko'rsatish
82 xususiy statik bekor displeyResult(int n, uzun qiymat, TimeData timeData)
83 {
84 System.out.printf("fibonachchi(%d) = %d%n", n, qiymat);
85 System.out.printf(
86 "Fibonachchi uchun hisoblash vaqti(%d) = %.3f soniya%n",
87 n, timeData.timeInSeconds());
88 }
89
90 // Fibonachchi hisoblash natijasi va umumiy hisoblash vaqtini ko'rsatish
91 shaxsiy statik ikki marta hisoblashVaqt(TimeData natijasi1, TimeData natijasi2)
92 {
93 TimeData bothThreads = new TimeData();
94
95 // oldingi boshlanish vaqtini aniqlang
96 bothThreads.start = result1.start.compareTo(result2.start) < 0 ?
97 natija1.start : natija2.start;
98
99 // keyinroq tugash vaqtini aniqlang
100 bothThreads.end = result1.end.compareTo(result2.end) > 0 ?
101 natija1.end : natija2.end;
102
103 ikkalaThreads.timeInSeconds();
104 }
105 } // oxirgi sinf FibonacciDemo

Sinxron uzoq muddatli hisoblar


Fibonachchini hisoblash(45)
fibonachchi (45) = 1134903170
Fibonachchi (45) = 5,884 soniya uchun hisoblash vaqti
Fibonachchini hisoblash(44)
fibonachchi (44) = 701408733

23.30-rasm | Fibonachchi hisob-kitoblari sinxron va asinxron tarzda amalga oshirildi. (4 qismning 3-qismi.)

long fibonacciValue = Fibonachci(n);

23.14 (Kengaytirilgan) Chaqiriladigan va kelajak 1033 interfeyslari

Sinf vaqti ma'lumotlari
Class TimeData (10–20-qatorlar) boshlanish va tugash vaqtini ifodalovchi ikkita Instantni saqlaydi.
vazifa va ular orasidagi umumiy vaqtni hisoblash uchun timeInSeconds usulini taqdim etadi. Biz
bajarish uchun zarur bo'lgan vaqtni hisoblash uchun ushbu misol davomida TimeData ob'ektlaridan foydalaning
Fibonachchi hisob-kitoblari.
Fibonachchi hisob-kitoblarini bajarish va vaqtni belgilash uchun Fibonachchi usuli
Fibonachchi usuli (59-70-qatorlar) asosiyda bir necha marta chaqiriladi (29, 30, 39 va qatorlar).
41) Fibonachchi hisob-kitoblarini boshlash va har bir hisoblash uchun zarur bo'lgan vaqtni hisoblash.
Usul hisoblash uchun Fibonachchi raqamini oladi va quyidagi vazifalarni bajaradi:
• 62-qator hisobning boshlanish va tugash vaqtlarini saqlash uchun TimeData obyektini yaratadi.
• 64-qatorda hisoblab chiqiladigan Fibonachchi raqami ko'rsatiladi.
• 65-qator Fibonachchi usuli chaqirilgunga qadar joriy vaqtni saqlaydi.
• 66-qator hisoblashni amalga oshirish uchun fibonachchi usulini chaqiradi.
• 67-qator Fibonachchiga qo'ng'iroq tugagandan so'ng joriy vaqtni saqlaydi.
• 68-qatorda natija va hisoblash uchun zarur bo'lgan umumiy vaqt ko'rsatiladi.
• 69-qator asosiy usulda foydalanish uchun TimeData obyektini qaytaradi.
Fibonachchi hisob-kitoblarini sinxron ravishda bajarish
Asosiy usul (24–56-qatorlar) birinchi navbatda sinxron Fibonachchi hisoblarini namoyish etadi. Chiziq
29 fibonachchi(45) hisobini boshlash va saqlash uchun startFibonachchi(45) ni chaqiradi.
Hisoblashning boshlanish va tugash vaqtlarini o'z ichiga olgan TimeData obyekti. Bu qo'ng'iroq bo'lganda
pletes, 30-qator fibonachchi(44) hisobini boshlash uchun startFibonachchi(44) ni chaqiradi va
uning TimeData-ni saqlang. Keyinchalik, 31-32 qatorlar ikkala TimeData ob'ektini hisoblash usuliga o'tkazadi -
Vaqt (91–104-qatorlar), bu umumiy hisoblash vaqtini soniyalarda qaytaradi. 33–34 qatorlar
sinxron Fibonachchi hisob-kitoblari uchun umumiy hisoblash vaqtini o'ynang.
Fibonachchi hisoblarini asinxron tarzda bajarish
Asosiy 38–41-qatorlar asenkron Fibonachchi hisoblarini alohida iplarda boshlaydi.
CompletableFuture statik usul supplyAsync asinxron vazifani bajaradi, bu esa qayta ishlaydi.
qiymatga aylanadi. Usul o'z argumenti sifatida interfeysni amalga oshiradigan ob'ektni oladi.

Fibonachchi (44) = 3,605 soniya uchun hisoblash vaqti


Umumiy hisoblash vaqti = 9,506 soniya
Asenkron uzoq muddatli hisoblar
Fibonachchini hisoblash(45)
Fibonachchini hisoblash(44)
fibonachchi (44) = 701408733
Fibonachchi (44) = 3,650 soniya uchun hisoblash vaqti
fibonachchi (45) = 1134903170
Fibonachchi (45) = 5,911 soniya uchun hisoblash vaqti
Umumiy hisoblash vaqti = 5,911 soniya
Sinxron hisob-kitoblar asenkron hisob-kitoblarga qaraganda 161% ko'proq vaqt talab qildi

23.30-rasm | Fibonachchi hisob-kitoblari sinxron va asinxron tarzda amalga oshirildi. (4 qismning 4-qismi.)


1034 23-bob Parametrlilik



pense - bu holda biz chaqirish uchun bo'sh parametrlar ro'yxatiga ega lambdalardan foydalanamiz.
startFibonachchi (45) (39-qator) va startFibonachchi (44) (41-qator). Buni kompilyator xulosa qiladi
supplyAsync CompletableFuture ni qaytaradi, chunki startFibonachchi usuli
TimeData turini qaytaradi. Class CompletableFuture ham runAsync statik usulini taqdim etadi
natijani qaytarmaydigan asinxron vazifani bajaring - bu usul Runnable ni oladi.
Asinxron hisoblar natijalarini olish
Class CompletableFuture Future interfeysini amalga oshiradi, shuning uchun biz asinxronni olishimiz mumkin
Kelajak usulini chaqirish orqali vazifalar natijalari (44–45-qatorlar). Bu qo'ng'iroqlarni bloklaydi - ular
asosiy ish zarrachasini asinxron vazifalar tugaguncha kutishiga va ularning natijalarini qaytarishiga sabab bo'ladi.
Bizning holatlarimizda natijalar TimeData obyektlaridir. Ikkala vazifa ham qaytgandan so'ng, 46-47 qatorlar ikkalasi ham o'tadi
TimeData umumiy hisobni olish uchun "calpTime" (91–104-qatorlar) usuliga mos keladi.
soniyalarda vaqt. Keyin, 48-49 qatorlar asenkron uchun umumiy hisoblash vaqtini ko'rsatadi
Fibonachchi hisob-kitoblari. Nihoyat, 52-55 qatorlar foiz farqini hisoblab chiqadi va ko'rsatadi
sinxron va asinxron hisoblar uchun bajarilish vaqtida.
Dastur natijalari
Ikki yadroli kompyuterimizda sinxron hisob-kitoblar jami 9,506 soniya davom etdi.
Garchi individual asinxron hisob-kitoblar taxminan bir xil miqdorni oldi
mos keladigan sinxron hisoblar sifatida vaqt, asinxron uchun umumiy vaqt
hisob-kitoblar atigi 5,911 soniyani tashkil etdi, chunki ikkita hisob-kitob haqiqatda amalga oshirildi
parallel ravishda. Chiqishda ko'rib turganingizdek, sinxron hisob-kitoblar 161% ko'proq vaqtni oldi
bajarish uchun, shuning uchun asinxron bajarish sezilarli darajada ishlashni ta'minladi.
23.15 (Kengaytirilgan) Fork/Join Framework
Java-ning parallel API-lari dasturchilarga yordam beradigan fork/join ramkasini o'z ichiga oladi.
allelizatsiya algoritmlari. Ramka ushbu kitob doirasidan tashqarida. Buni mutaxassislar aytishadi
Aksariyat Java dasturchilari baribir fork/join ramkasidan “orqada” foydalanishdan foyda ko'radi
Java API va boshqa uchinchi tomon kutubxonalarida sahnalar”. Masalan, parallel sig'im
Java SE 8 oqimlarining qobiliyatlari ushbu ramka yordamida amalga oshiriladi.
Vilkalar/qo'shilish ramkasi, ayniqsa, bo'lish va zabt etish uslubidagi algoritmlar uchun juda mos keladi.
ritmlar, masalan, biz 19.8-bo'limda amalga oshirgan birlashma turi. Eslatib o'tamiz, takroriy
sive birlashtirish-tartib algoritmi massivni ikkita teng o'lchamdagi pastki qatorga bo'lish orqali tartiblaydi,
har bir pastki qatorni saralash, keyin ularni bitta katta massivga birlashtirish. Har bir pastki qator bo'yicha tartiblangan
pastki qatorda bir xil algoritmni bajarish. Birlashtirish tartibi kabi algoritmlar uchun fork/
qo'shilish ramkasi bir vaqtda vazifalarni yaratish uchun ishlatilishi mumkin, shunda ular bo'ylab taqsimlanishi mumkin
bir nechta protsessorlar va haqiqatan ham parallel ravishda bajarilishi - vazifalarni belgilash tafsilotlari
turli protsessorlar siz uchun ramka tomonidan ko'rib chiqiladi.
23.16 Yakunlash
Ushbu bobda biz Java-ning ilovalarni yaxshilash uchun bir vaqtning o'zida ishlash imkoniyatlarini taqdim etdik.
ko'p yadroli tizimlarda ishlash. Siz parallel va par-par o'rtasidagi farqlarni bilib oldingiz.
allel ijrosi. Biz Java bir vaqtning o'zida siz uchun mavjud bo'lishini muhokama qildik
ko'p tarmoqli. JVM ning o'zi dasturni ishga tushirish uchun iplar yaratishini ham bilib oldingiz va
Shuningdek, u axlat yig'ish kabi uy ishlarini bajarish uchun iplar yaratishi mumkin.

Xulosa 1035



Biz ipning hayot aylanishi va uning davomida egallashi mumkin bo'lgan holatlarni muhokama qildik
uning umri. Keyinchalik, biz vazifani belgilash uchun ishlatiladigan Runnable interfeysini taqdim etdik
boshqa vazifalar bilan bir vaqtda bajarishi mumkin. Ushbu interfeysning ishga tushirish usuli tomonidan chaqiriladi
vazifani bajaruvchi ip. Runnable ob'ektini bog'lash orqali uni qanday bajarish kerakligini ko'rsatdik
Thread sinfining obyekti bilan. Keyin biz Ijrochi interfeysidan qanday foydalanishni ko'rsatdik
Mavjuddan qayta foydalanishi mumkin bo'lgan ip hovuzlari orqali Runnable ob'ektlarining bajarilishini boshqaring
mavzular har bir vazifa uchun yangi ish zarrachasini yaratishda qo'shimcha xarajatlarni bartaraf etish va yaxshilash mumkin
protsessor band bo'lishini ta'minlash uchun iplar sonini optimallashtirish orqali ishlash.
Bir nechta iplar ob'ektni va ulardan bir yoki bir nechtasini baham ko'rganda buni bilib oldingiz
ushbu ob'ektni o'zgartirsangiz, umumiy ob'ektga kirish imkoni bo'lmasa, noaniq natijalar paydo bo'lishi mumkin
to'g'ri boshqariladi. Biz sizga ushbu muammoni ip sinxronizatsiyasi orqali qanday hal qilishni ko'rsatdik,
bir vaqtning o'zida bir nechta iplar tomonidan umumiy o'zgaruvchan ma'lumotlarga kirishni muvofiqlashtiradi. Siz
Sinxronizatsiyani amalga oshirishning bir nechta usullarini o'rgandi - avvalo o'rnatilgan sinf bilan
ArrayBlockingQueue (siz uchun barcha sinxronizatsiya tafsilotlarini boshqaradi), keyin bilan
Java-ning o'rnatilgan monitorlari va sinxronlashtirilgan kalit so'z va nihoyat Lock interfeyslari bilan
va holat.
Biz Swing GUI-larning ip xavfsiz emasligini muhokama qildik, shuning uchun va bilan barcha o'zaro ta'sirlar
GUIga o'zgartirishlar voqea jo'natish oqimida amalga oshirilishi kerak. Biz ham rad-
tadbirda uzoq muddatli hisob-kitoblarni amalga oshirish bilan bog'liq muammolarni qarg'aydi
yuborish ipi. Keyin biz SwingWorker sinfidan uzoq vaqt ishlash uchun qanday foydalanishingiz mumkinligini ko'rsatdik.
ishchi iplarda ishlaydigan hisoblar. Siz Swing natijalarini qanday ko'rsatishni o'rgandingiz -
Hisoblash tugallanganda va oraliq natijalarni qanday ko'rsatish kerakligi haqida GUIdagi ishchi
hisoblash hali davom etayotgan paytda.
ni namoyish qilish uchun Arrays sinfining tartiblash va parallelSort usullarini qayta ko‘rib chiqdik
ko'p yadroli protsessorda parallel tartiblash algoritmidan foydalanishning foydasi. Biz Java-dan foydalandik
SE 8 Date/Time API ning Instant va Duration klasslari saralash operatsiyalarini vaqtga moslashtiradi.
Java SE 8 oqimlarini parallellashtirish oson, bu dasturlarga foyda keltirishini bilib oldingiz
ko'p yadroli tizimlarda yaxshilangan ishlash va parallel oqim olish uchun,
Siz shunchaki mavjud oqimda parallel usulni chaqirasiz.
Biz vazifalarni bajarishga imkon beruvchi Callable va Future interfeyslarini muhokama qildik
natijalarni qaytaradigan va o'sha natijalarni olish uchun. Keyin biz misol keltirdik
Java SE 8-dan foydalanib, uzoq muddatli vazifalarni sinxron va asinxron tarzda bajarish
yangi CompletableFuture klassi. Biz bunda joriy qilingan multithreading texnikasidan foydalanamiz
mumkin bo'lgan ko'p tarmoqli serverlarni yaratishga yordam berish uchun 28-bobda yana bo'lim, Tarmoq
bir vaqtning o'zida bir nechta mijozlar bilan muloqot qilish. Keyingi bobda biz ma'lumotlar bazasi bilan tanishamiz -
Java'ning JDBC API bilan ilovalarni ishlab chiqish.

Xulosa
23.1-bo'lim Kirish


• Bir vaqtning o'zida ishlaydigan ikkita vazifa bir vaqtning o'zida bajarilmoqda.
• Parallel ishlaydigan ikkita vazifa bir vaqtning o'zida bajarilmoqda. Shu ma'noda parallelizm
parallellikning kichik to'plami. Hozirgi ko'p yadroli kompyuterlar bir nechta protsessorlarga ega, ular
vazifalarni parallel ravishda shakllantirish.
• Java bir vaqtning o'zida til va API orqali siz uchun mavjud bo'ladi.

1036 23-bob Parametrlilik



• Java dasturlari bir nechta bajarilish iplariga ega bo'lishi mumkin, bunda har bir mavzu o'z uslubiga ega-
qo'ng'iroqlar to'plami va dastur hisoblagichi, bu boshqa oqimlar bilan bir vaqtda ishlashga imkon beradi. Bu ca-
qobiliyati ko'p ish zarralari deb ataladi.
• Ko‘p tarmoqli ilovada iplar bir nechta protsessorlarga taqsimlanishi mumkin (agar mavjud bo‘lsa)
bir nechta vazifalar parallel ravishda bajarilishi va dastur yanada samarali ishlashi uchun.
• JVM dasturni ishga tushirish va axlat yig'ish kabi uy ishlarini bajarish uchun iplarni yaratadi.
• Multithreading, shuningdek, bitta protsessorli tizimlarda ishlashni oshirishi mumkin - bir ip bo'lganda
Davom eta olmaydi (chunki, masalan, u kiritish-chiqarish operatsiyasining natijasini kutmoqda), boshqasi
protsessordan foydalanishi mumkin.
• Dasturchilarning katta qismi mavjud to'plam sinflari va interfeyslaridan foydalanishi kerak
siz uchun sinxronlashni boshqaradigan parallel API.
23.2-bo'lim mavzu holatlari va hayot aylanishi
• Yangi ip o'zining hayot aylanishini yangi holatda boshlaydi (961-bet). Dastur mavzuni boshlaganida, u
ishlaydigan holatga keltiriladi. Ishlaydigan holatdagi ip o'z vazifasini bajarayotgan deb hisoblanadi.
• Ishlaydigan ip kutish holatiga o'tadi (961-bet) boshqa ipning bajarilishini kutish uchun.
vazifa. Boshqa ish zarrachasi uni bajarishni davom ettirish haqida xabar berganida, kutilayotgan ip ishga tushadigan holatga o'tadi.
• Ishlaydigan ip belgilangan vaqt oralig'ida vaqtli kutish holatiga (961-bet) kirishi mumkin.
o'sha vaqt oralig'i tugaganda yoki u kutayotgan voqea sodir bo'lganda runnable ga qaytish.
• Ishlaydigan ip ixtiyoriy kutish oralig'ini ta'minlasa, vaqt belgilangan kutish holatiga o'tishi mumkin
u vazifani bajarish uchun boshqa ipni kutayotganda. Bunday ip yugurish mumkin bo'lgan narsaga qaytadi
u boshqa ish zarrachasi tomonidan bildirilganda yoki vaqt oralig'i tugashi bilan bog'liq.
• Uyqu ipi (961-bet) belgilangan vaqt davomida kutish holatida qoladi, keyin
u ishga tushadigan holatga qaytadi.
• Ishlaydigan ip bloklangan holatga o'tadi (961-bet) u vazifani bajarishga harakat qilganda.
zudlik bilan bajarib bo'lmaydi va mavzu bu vazifa tugaguncha vaqtincha kutishi kerak.
O'sha paytda bloklangan ip bajariladigan holatga o'tadi, shuning uchun u ishlashni davom ettirishi mumkin.
• Ishlaydigan ip o‘z vazifasini muvaffaqiyatli bajargandan so‘ng tugatilgan holatga kiradi (961-bet).
aks holda tugatiladi (ehtimol xato tufayli).
• Operatsion tizim darajasida ishga tushiriladigan holat (962-bet) ikkita alohida holatni o'z ichiga oladi. Qachon a
ip birinchi navbatda yangi holatdan ishga tushadigan holatga o'tadi, u tayyor holatda (962-bet). A
tayyor ip operatsion tizim uni jo'natganda ish holatiga kiradi (962-bet).
• Aksariyat operatsion tizimlar ip o'z vazifasini bajaradigan kvantni (962-bet) ajratadi. Bu qachon
muddati tugaydi, ip tayyor holatga qaytadi va protsessorga boshqa ip tayinlanadi.
• Mavzuni rejalashtirish mavzu ustuvorliklari asosida qaysi ipni jo'natish kerakligini aniqlaydi.
• Operatsion tizimning ish tartibini rejalashtiruvchisining vazifasi (962-bet) keyingi qaysi oqim ishga tushishini aniqlashdan iborat.
• Yuqori ustunlikdagi ip tayyor holatga kirganda, operatsion tizim odatda buning oldini oladi
hozirda ishlayotgan ip (preemptive Scheduling deb nomlanuvchi operatsiya; 963-bet).
• Operatsion tizimga bog'liq holda, ustuvorroq bo'lgan mavzular kechiktirilishi mumkin - ehtimol noaniq.
nitely (963-bet) - pastroq ustunlikdagi iplarni bajarish.
23.3-bo'lim Ijrochi ramkasi bilan mavzularni yaratish va bajarish
• Runnable (963-bet) obyekti boshqa vazifalar bilan bir vaqtda bajarilishi mumkin bo‘lgan vazifani ifodalaydi.
• Interface Runnable usuli ishga tushirilishini e'lon qiladi (963-bet) unda siz kodni belgilaydigan kodni joylashtirasiz.
bajarish vazifasi. Runnable qo'ng'iroqlar usulini bajaruvchi ip vazifani bajarish uchun ishlaydi.
• Dastur oxirgi ish zarrachalari bajarilishini tugatmaguncha tugamaydi.

Xulosa 1037



• Tartibni bilsangiz ham, mavzular qaysi tartibda rejalashtirilishini oldindan aytib bera olmaysiz
ular yaratilgan va boshlangan.
• Run-ning bajarilishini boshqarish uchun Ijrochi interfeysidan (963-bet) foydalanish tavsiya etiladi.
qulay ob'ektlar. Ijrochi obyekti odatda a deb nomlangan iplar guruhini yaratadi va boshqaradi
iplar hovuzi (963-bet).
• Ijrochilar (964-bet) mavjud iplardan qayta foydalanishlari va ish faoliyatini optimallashtirish orqali yaxshilashlari mumkin.
protsessor band bo'lishini ta'minlash uchun iplar soni.
• Ijrochi usulini bajarish (963-bet) Runnable ni oladi va uni mavjud bo'lgan ish zarrachasiga tayinlaydi.
iplar hovuzi. Agar ular yo'q bo'lsa, Ijrochi yangi mavzu yaratadi yoki mavjud bo'lishini kutadi.
• Interface ExecutorService (java.util.concurrent paketi; p. 964) Exec- interfeysini kengaytiradi.
utor va Ijrochining hayot aylanishini boshqarishning boshqa usullarini e'lon qiladi.
• ExecutorService interfeysini amalga oshiruvchi obyekt statik usullar yordamida yaratilishi mumkin
Ijrochilar sinfida e'lon qilingan (java.util.concurrent paketi).
• newCachedThreadPool (965-bet) ijrochilar usuli yangisini yaratadigan ExecutorServiceni qaytaradi.
mavzular ilovaga kerak bo'lganidek.
• ExecutorService usulini bajarish o'zining Runnable-ni kelajakda qachondir bajaradi. Usul qayta-
har bir chaqiruvdan darhol aylanadi - dastur har bir vazifa tugashini kutmaydi.
• ExecutorService usulini o‘chirish (967-bet) IjrochiServicega yangisini qabul qilishni to‘xtatish haqida xabar beradi
vazifalarni bajaradi, lekin mavjud vazifalarni bajarishda davom etadi va bu vazifalar bajarilishini tugatgandan keyin tugaydi.
23.4-bo'lim Mavzuni sinxronlashtirish
• Mavzuni sinxronlashtirish (968-bet) bir nechta o'zgaruvchan ma'lumotlarga kirishni muvofiqlashtiradi.
iplarni ijaraga olish.
• Mavzularni sinxronlash orqali siz umumiy obyektga kiruvchi har bir mavzu hammasini istisno qilishiga ishonch hosil qilishingiz mumkin
boshqa iplarni bir vaqtning o'zida qilishdan - bu o'zaro istisno deb ataladi (968-bet).
• Sinxronizatsiyani amalga oshirishning keng tarqalgan usuli Java-ning o'rnatilgan monitorlaridan foydalanishdir. Har bir ob'ekt mavjud
monitor va monitor qulfi (968-bet). Monitor o'z ob'ektining monitor qulfini ushlab turishini ta'minlaydi
har qanday vaqtda maksimal faqat bitta ip bilan va shu tariqa oʻzaro istisno qilish uchun foydalanish mumkin.
• Agar operatsiya bajarilayotganda bajaruvchi ipning qulfni ushlab turishini talab qilsa, a
Ishni davom ettirishdan oldin ip qulfni olishi kerak (968-bet). Boshqa har qanday mavzular
bir xil qulfni talab qiladigan operatsiyani bajarishga urinish birinchisiga qadar bloklanadi
ip qulfni chiqaradi, bunda bloklangan iplar qulfni olishga harakat qilishi mumkin.
• Kod blokini bajarish uchun ipda monitor blokirovkasi bo'lishi kerakligini belgilash uchun kod shunday bo'lishi kerak
sinxronlashtirilgan bayonotga joylashtirilgan (968-bet). Bunday kod monitor qulfi tomonidan himoyalangan deb aytiladi.
• Sinxronlashtirilgan bayonotlar sinxronlangan kalit so'z yordamida e'lon qilinadi:
sinxronlangan (ob'ekt)
{
bayonotlar
} // sinxronlashtirilgan bayonotni tugatish
bu erda ob'ekt - monitor blokirovkasi olinadigan ob'ekt; ob'ekt, agar u bo'lsa, odatda bu
sinxronlashtirilgan bayonot paydo bo'ladigan ob'ekt.
• Java sinxronlashtirilgan usullarga ham ruxsat beradi (969-bet). Amalga oshirishdan oldin, sinxronlashtirilgan namuna
usul usulni chaqirish uchun ishlatiladigan ob'ektda qulfni olishi kerak. Xuddi shunday, statik
sinxronlashtirilgan usul usulni chaqirish uchun ishlatiladigan sinfda qulfni olishi kerak.
• ExecutorService awaitTermination usuli (973-bet) dasturni mavzular tugashini kutishga majbur qiladi.
minat. Ijrochi xizmatida barcha vazifalar bajarilganda u boshqaruvni chaqiruvchiga qaytaradi

1038 23-bob Parametrlilik



to'liq yoki belgilangan vaqt tugashi bilan. Vaqt tugashidan oldin barcha vazifalar bajarilsa,
usul haqiqatni qaytaradi; aks holda, u false qaytaradi.
• Siz faqat bitta ip bir qator operatsiyalarni bajarishini ta'minlash orqali atomiklikni taqlid qilishingiz mumkin (974-bet).
bir vaqtning o'zida. Atomga sinxronlashtirilgan bayonotlar yoki sinxronlashtirilgan usullar bilan erishish mumkin.
• O'zgarmas ma'lumotlarni iplar bo'ylab baham ko'rganingizda, tegishli ma'lumotlar maydonlarini e'lon qilishingiz kerak
final o'zgaruvchilarning qiymatlari ular ishga tushirilgandan keyin o'zgarmasligini bildiradi.
23.5-bo'lim Sinxronizatsiyasiz ishlab chiqaruvchi/iste'molchi munosabatlari
• Ko'p tarmoqli ishlab chiqaruvchi/iste'molchi munosabatlarida (976-bet), ishlab chiqaruvchi ip ma'lumotlarni yaratadi
va uni bufer deb ataladigan umumiy ob'ektga joylashtiradi. Iste'molchi ipi buferdan ma'lumotlarni o'qiydi.
• Ishlab chiqaruvchi va iste'molchi tomonidan baham ko'rilgan bufer ma'lumotlari bo'yicha operatsiyalar faqat bufer
fer to'g'ri holatda. Agar tampon to'liq bo'lmasa, ishlab chiqaruvchi ishlab chiqarishi mumkin; agar bufer bo'lmasa
bo'sh, iste'molchi iste'mol qilishi mumkin. Agar ishlab chiqaruvchi yozishga harakat qilganda bufer to'lgan bo'lsa
Buning uchun ishlab chiqaruvchi bo'sh joy qolguncha kutishi kerak. Agar bufer bo'sh bo'lsa yoki oldingi qiymat bo'lsa
allaqachon o'qilgan bo'lsa, iste'molchi yangi ma'lumotlar paydo bo'lishini kutishi kerak.
23.6-bo'lim Ishlab chiqaruvchi/iste'molchi munosabatlari: ArrayBlockingQueue
• ArrayBlockingQueue (984-bet) java.util.con- paketidan to'liq amalga oshirilgan bufer sinfidir.
BlockingQueue interfeysini amalga oshiradigan joriy.
• ArrayBlockingQueue ishlab chiqaruvchi/iste'molchi munosabatlarida umumiy buferni amalga oshirishi mumkin.
Qo'yish usuli (984-bet) elementni BlockingQueue oxiriga qo'yadi, agar navbatda bo'lsa, kutadi.
to'la. Qabul qilish usuli (984-bet) BlockingQueue boshidan elementni olib tashlaydi, agar kutilsa
navbat bo'sh.
• ArrayBlockingQueue umumiy o‘zgaruvchan ma’lumotlarni o‘tkazilgan argument bilan o‘lchamli massivda saqlaydi
konstruktorga. Yaratilgandan so'ng, ArrayBlockingQueue hajmi o'rnatiladi.
23.7-bo'lim (Kengaytirilgan) Ishlab chiqaruvchi/iste'molchi bilan sinxronlangan aloqa,
kuting, xabardor qiling va barchaga xabar bering
• Sinxronlashtirilgan kalit so'z va Ob'ekt usuli yordamida umumiy buferni o'zingiz amalga oshirishingiz mumkin.
kutish, xabardor qilish va barchaga xabar berish (988-bet).
• Tarmoq ob'ekt monitor blokirovkasini bo'shatish uchun Object wait usulini chaqirishi va kutishda kutishi mumkin
holatini boshqa iplar esa ob'ektning sinxronlashtirilgan bayonot(lar)ini yoki usullarini kiritishga harakat qiladi.
• Sinxronlashtirilgan bayonotni (yoki usulni) bajaruvchi ip moslikni tugatsa yoki qanoatlantirsa.
boshqa mavzu kutayotgan bo'lsa, u Object method notify (988-bet) ni chaqirishi mumkin.
kutayotgan ipning ishga tushadigan holatga o'tishiga ruxsat bering. Shu nuqtada, o'tgan ip-
sitioned ob'ektdagi monitor qulfini qayta olishga harakat qilishi mumkin.
• Agar ip notifyAll ni chaqirsa (988-bet), monitor bloklanishini kutayotgan barcha iplar bloklanadi.
qulfni qayta sotib olish huquqiga ega (ya'ni, ularning barchasi ishlaydigan holatga o'tadi).
23.8-bo‘lim (Kengaytirilgan) Ishlab chiqaruvchi/iste’molchi munosabatlari: cheklangan buferlar
• Bir vaqtning o'zida oqimlarning nisbiy tezligi haqida taxmin qila olmaysiz.
• Chegaralangan buferdan (995-bet) iplar uchun kutish vaqtini kamaytirish uchun foydalanish mumkin.
resurslarni baham ko'ring va bir xil o'rtacha tezlikda ishlaydi. Agar ishlab chiqaruvchi vaqtincha mahsulot ishlab chiqarsa,
iste'molchi ularni iste'mol qilishidan tezroq iste'mol qilsa, ishlab chiqaruvchi qo'shimcha qiymatlarni yozishi mumkin
qo'shimcha bufer maydoni (agar mavjud bo'lsa). Agar iste'molchi ishlab chiqaruvchidan tezroq iste'mol qilsa
yangi qiymatlarni ishlab chiqaradi, iste'molchi buferdan qo'shimcha qiymatlarni (agar mavjud bo'lsa) o'qiy oladi.
• Taxminan bir xil ishlaydigan ishlab chiqaruvchi va iste'molchi bilan chegaralangan buferdan foydalanish kaliti
tezlik buferni kutilayotgan "qo'shimcha" ishlab chiqarishni boshqarish uchun etarli joylar bilan ta'minlashdir.

Xulosa 1039



• Cheklangan buferni amalga oshirishning eng oddiy usuli bufer uchun ArrayBlockingQueue dan foydalanishdir.
Shunday qilib, barcha sinxronizatsiya tafsilotlari siz uchun ko'rib chiqiladi.
23.9-bo'lim (Kengaytirilgan) Ishlab chiqaruvchi/iste'molchi munosabatlari: qulf va holat
Interfeyslar
• Lock and Condition interfeyslari (1002-bet) dasturchilarga ipni yanada aniqroq boshqarish imkonini beradi.
sinxronizatsiya, lekin ulardan foydalanish ancha murakkab.
• Har qanday ob'ekt Lock interfeysini amalga oshiruvchi ob'ektga havolani (paketning
java.util.concurrent.locks). Mavzuni olish uchun Qulflash usulini (1002-bet) chaqiradi
qulf. Bitta ip tomonidan Qulf olinsa, Qulf boshqa ipga ruxsat bermaydi
birinchi ip uni bo'shatmaguncha uni oling (Lock's unlock usulini chaqirish orqali; p. 1002).
• Agar bir nechta tarmoq bir vaqtning o'zida bitta Lock ob'ektida usul qulfini chaqirishga harakat qilsa, faqat
bitta ip qulfni olishi mumkin - qolganlari kutish holatiga joylashtiriladi. Mavzu qo'ng'iroq qilganda
qulfni ochganda, ob'ektning qulfi chiqariladi va ob'ektni blokirovka qilishga urinayotgan kutish ipi davom etadi.
• Class ReentrantLock (p. 1002) Lock interfeysining asosiy ilovasi hisoblanadi.
• ReentrantLock konstruktori mantiqiy qiymatni qabul qiladi, bu qulfning adolatlilik pol-tining mavjudligini belgilaydi.
muzli (1002-bet). Agar rost bo'lsa, ReentrantLockning adolat siyosati "eng uzoq kutilgan mavzu bo'ladi.
mavjud bo'lganda qulfni so'rang" - bu muddatsiz kechiktirishni oldini oladi. Agar argument o'rnatilgan bo'lsa
noto'g'ri bo'lsa, mavjud bo'lganda qaysi kutish ipi qulfni olishiga kafolat yo'q.
• Agar Qulfga ega bo'lgan ish zarrachalari u o'z vazifasini ba'zi bir shartlargacha davom ettira olmasligini aniqlasa
qanoatlansa, ip shartli ob'ektni kutishi mumkin (1003-bet). Lock obyektlaridan foydalanish sizga imkon beradi
ip kutish kerak bo'lishi mumkin bo'lgan shart ob'ektlarini aniq e'lon qiling.
• Shart (1003-bet) ob'ektlari ma'lum bir Lock bilan bog'lanadi va Lock chaqiruvi orqali yaratiladi.
Condition ob'ektini qaytaradigan newCondition usuli. Shartni kutish uchun ip
Shartni kutish usulini chaqirishi mumkin. Bu darhol bog'langan Qulf va joylarni chiqaradi
ushbu Shart uchun kutish holatidagi ip. Keyin boshqa mavzular Qulfni olishga harakat qilishi mumkin.
• Ishlaydigan ip vazifani bajarib, kutayotgan ip endi davom etishi mumkinligini aniqlasa,
ishga tushadigan ish zarrachalari ushbu shartda kutishga ruxsat berish uchun Condition usuli signalini chaqirishi mumkin.
ishga tushirish holatiga qaytish. Shu nuqtada, kutishdan o'tgan ip-
ing holatini ishga tushirish holatiga o'tkazish Qulfni qayta olishga urinishi mumkin.
• Agar signal chaqirilganda bir nechta iplar Shartning kutish holatida bo'lsa, standart imple-
Shartni eslatib o'tish eng uzoq kutilayotgan ipni ishga tushiriladigan holatga o'tish uchun signal beradi.
• Agar ip Condition usuli signalAll ni chaqirsa, u holda barcha iplar shu shartni kutmoqda
ishga tushadigan holatga o'ting va Qulfni qayta sotib olish huquqiga ega bo'ling.
• Mavzu umumiy ob'ekt bilan tugagach, Qulfni bo'shatish uchun unlock usulini chaqirishi kerak.
• Qulflar sizni kutayotgan mavzularni to'xtatish yoki a olish uchun kutish vaqtini belgilash imkonini beradi
qulflash - sinxronlangan holda mumkin emas. Bundan tashqari, Lock ob'ekti sotib olinishi cheklanmagan va
bir xil kod blokida chiqariladi, bu sinxronlangan kalit so'z bilan sodir bo'ladi.
• Shart ob'ektlari iplar kutishi mumkin bo'lgan bir nechta shartlarni belgilash imkonini beradi. Shunday qilib, shunday
Muayyan shart ob'ekti endi to'g'ri ekanligini kutayotgan mavzularga uni chaqirish orqali ko'rsatish mumkin
Ob'ektning sharti signali yoki signaliBarcha usullar (1003-bet). Sinxronlashtirilgan holda, hech qanday yo'l yo'q
iplar kutayotgan shartni aniq ko'rsatish.
23.11-bo'lim GUI bilan multithreading: SwingWorker
• Voqealarni jo'natish oqimi (1011-bet) ilovaning GUI kompozitsiyasi bilan o'zaro aloqalarni boshqaradi.
ents. GUI bilan o'zaro aloqada bo'lgan barcha vazifalar voqea navbatiga joylashtiriladi va ketma-ket bajariladi.
bu mavzu orqali.

1040 23-bob Parametrlilik



• Swing GUI komponentlari ip xavfsiz emas. Ip xavfsizligiga Swingni ta'minlash orqali erishiladi
komponentlarga faqat voqea jo'natish oqimidan kirish mumkin.
• Foydalanuvchi interfeysining o'zaro ta'siriga javoban uzoq hisoblashni amalga oshirish voqeani bog'laydi
jo'natish ipi, uning boshqa vazifalarni bajarishiga yo'l qo'ymaydi va GUI komponentlariga sabab bo'ladi
javobsiz bo'lib qolish. Uzoq muddatli hisob-kitoblar alohida mavzularda ko'rib chiqilishi kerak.
• Siz SwingWorker umumiy sinfini (javax.swing paketi; 1011-bet) kengaytira olasiz, u amalga oshiradi.
Ishga tushirish mumkin, ishchi ipda vazifani bajarish uchun, keyin voqeadan Swing komponentlarini yangilang
topshiriq natijalariga ko'ra ipni yuborish. Siz uning doInBackground va bajarilgan usullarini bekor qilasiz.
doInBackground usuli hisoblashni amalga oshiradi va natijani qaytaradi. Bajarilgan usul ko'rsatiladi
GUIdagi natijalar.
• Class SwingWorkerning birinchi turdagi parametri doInBackground tomonidan qaytarilgan turni bildiradi
usul; ikkinchisi nashr qilish va qayta ishlash usullari o'rtasida o'tgan turni bildiradi
oraliq natijalar bilan ishlash uchun.
• doInBackground usuli ishchi ipdan chaqiriladi. doInBackground qaytgandan so'ng, usul
Natijalarni ko'rsatish uchun voqea jo'natish ipidan bajarildi deb chaqiriladi.
• Hisoblash jarayonida istisno yuzaga kelsa, ExecutionException tashlanadi.
• SwingWorker usuli nashr qilish qayta-qayta oraliq natijalarni usul jarayoniga yuboradi
natijalarni GUI komponentida ko'rsatadi. SetProgress usuli progress xususiyatini yangilaydi.
• Usul jarayoni voqea jo'natish oqimida amalga oshiriladi va usulni nashr qilishdan ma'lumotlarni oladi.
Ishchi oqimida nashr qilish va voqea jo'natishdagi jarayon o'rtasida qiymatlarning o'tishi
ip asinxron; nashr qilish uchun har bir qo'ng'iroq uchun jarayon chaqirilishi shart emas.
• PropertyChangeListener (1024-bet) java.beans paketining interfeysi bo'lib, u bitta faylni belgilaydi.
usul, xususiyatni o'zgartirish. Har safar setProgress usuli chaqirilganda, PropertyChangeEvent
progress xususiyati o'zgarganligini bildirish uchun hosil qilinadi.
23.12-bo'lim Java SE 8 Date/Time API bilan vaqtni tartiblash va parallel tartiblash
• Class Instantning statik usuli endi joriy vaqtni oladi.
• Ikki Instant orasidagi farqni aniqlash uchun Duration sinfining statik usulidan foydalaning:
vaqt farqini o'z ichiga olgan Duration ob'ektini qaytaradi.
• Davomiylik usuli toMillis Davomiylikni millisekundlar uzun qiymati sifatida qaytaradi.
• NumberFormat statik usuli getPercentInstance formatlash uchun ishlatiladigan NumberFormatni qaytaradi
foiz sifatida raqam.
• NumberFormat usuli formati ko'rsatilgan argumentning String ko'rinishini qaytaradi
raqamli format.
• Massivlar statik usuli parallelSetAll massivni generator funktsiyasi tomonidan ishlab chiqarilgan qiymatlar bilan to'ldiradi.
tion int qabul qiladi va int tipidagi qiymatni qaytaradi, long yoki double. Qaysiligiga qarab
parallelSetAll usulining haddan tashqari yuklanishi generator funktsiyasidan foydalaniladi, bu sinfning ob'ektidir.
IntToDoubleFunction (er-xotin massivlar uchun), IntUnaryOperator (int massivlar uchun), IntTo-
LongFunction (uzun massivlar uchun) yoki IntFunction (har qanday ibtidoiy bo'lmagan massivlar uchun).
• Massivlar statik usuli parallelPrefix joriy va oldingi ar-ga BinaryOperatorni qo'llaydi.
ray elementlari va natijani joriy elementda saqlaydi.
23.13-bo'lim Java SE 8: Ketma-ket va parallel oqimlar
• Oqimlarni parallellashtirish oson, bu dasturlarga yaxshilangan unumdorlikdan foydalanish imkonini beradi
ko'p yadroli tizimlar.
• Parallel oqim olish uchun mavjud oqimda parallel usulni chaqirish kifoya.

O'z-o'zini tekshirish mashqlari 1041



23.14-bo'lim (Kengaytirilgan) Chaqirilishi mumkin bo'lgan interfeyslar va kelajak
• Chaqiriladigan (1030-bet) interfeysi (java.util.concurrent paketi) yagona usulni e'lon qiladi.
vazifaga qiymatni qaytarish imkonini beruvchi nomli chaqiruv.
• ExecutorService yuborish usuli (1030-bet) o‘z argumenti sifatida qabul qilingan Callableni bajaradi. Metod-
od submit Future tipidagi ob'ektni qaytaradi (java.util.concurrent paketi)
Callable ni bajarishning kelajakdagi natijasi.
• Interface Future (1030-bet) Callable natijasini qaytarish uchun get usulini e'lon qiladi. inter-
face shuningdek, Callable ijrosini bekor qilish, yoki yo'qligini aniqlash imkonini beruvchi usullarni taqdim etadi
Chaqirilsa bekor qilindi va Chaqiriladigan o'z vazifasini bajarganligini aniqlang.
• Java SE 8 yangi CompletableFuture sinfini taqdim etadi (paket java.util.concurrent; p. 1030),
Future interfeysini amalga oshiradi va Runnables-ni asinxron tarzda bajarishga imkon beradi
vazifalarni bajaradigan yoki qiymatlarni qaytaradigan etkazib beruvchilar.
• Interface Supplier (1030-bet), xuddi Callable interfeysi kabi, bitta usulga ega funksional interfeysdir.
od (bu holda, olish) argumentlarni qabul qilmaydi va natijani qaytaradi.
• CompletableFuture statik usul supplyAsync (1033-bet) yetkazib beruvchini asinxron tarzda bajaradi
qiymat qaytaradigan vazifa.
• CompletableFuture statik runAsync usuli (1034-bet) Asinxron bajariladigan vazifani bajaradi
bu natijani qaytarmaydi.
• CompletableFuture get usuli blokirovkalash usuli bo‘lib, qo‘ng‘iroq qiluvchi ipni kutishiga sabab bo‘ladi
asinxron vazifa yakunlanadi va natijalarini qaytaradi.
23.15-bo'lim (Kengaytirilgan) Fork/Join Framework
• Java-ning parallel API-lari dasturchilarga parallellashtirishga yordam beruvchi fork/join ramkasini o'z ichiga oladi
algoritmlar. Vilkalar/qo'shilish ramkasi, ayniqsa, bo'lish va zabt etish uslubidagi algoritm uchun juda mos keladi.
ritmlar, masalan, birlashma turi.
O'z-o'zini tekshirish mashqlari
23.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) ip qachon tugatilgan holatga kiradi.
b) Belgilangan miqdordagi millisekundlarda pauza qilish va bajarishni davom ettirish uchun, ip
sinf usulini chaqirishi kerak.
c) Ishlaydigan ip belgilangan vaqt oralig'ida holatga kirishi mumkin.
d) Operatsion tizim darajasida ishlaydigan holat aslida ikkita alohida holatni o'z ichiga oladi
davlatlar va .
e) Runnables interfeysni amalga oshiradigan sinf yordamida bajariladi.
f) ExecutorService usuli ExecutorService-dagi har bir mavzuni darhol tugatadi
agar mavjud bo'lsa, joriy Runnable dasturini bajarishni tugatadi.
g) a(n) munosabatlarida ma'lumotlarni hosil qiladi va ularni umumiy ob'ektda saqlaydi.
ject va umumiy ob'ektdan ma'lumotlarni o'qiydi.
h) Kalit so'z ob'ektda bir vaqtning o'zida faqat bitta ip bajarilishi kerakligini bildiradi.
23.2 (Kengaytirilgan ixtiyoriy bo'limlar) Quyidagi bayonotlarning har biridagi bo'sh joylarni to'ldiring:
a) Sinf usuli Condition ob'ektni kutish holatida bitta ipni siljitadi
ishlaydigan holatga.
b) Sinf usuli Shart ob'ektning kutish holatidagi har bir ipni o'zgartiradi
ishlaydigan holat.
c) Tarmoq bog'langan Lockni chiqarish uchun Condition ob'ektidagi usulni chaqirishi mumkin
va bu ipni holatga joylashtiring.

1042 23-bob Parametrlilik

d) Sinf massiv yordamida BlockingQueue interfeysini amalga oshiradi.
e) Class Instantning statik usuli joriy vaqtni oladi.
f) Duration usuli Duration ni millisekundlar uzun qiymati sifatida qaytaradi.
g) NumberFormat statik usuli a formatini formatlash uchun ishlatiladigan NumberFormatni qaytaradi
foiz sifatida raqam.
h) NumberFormat usuli o'z argumentining String tasvirini qaytaradi
belgilangan raqamli format.
i) Massivlar statik usuli massivni generator funktsiyasi tomonidan ishlab chiqarilgan qiymatlar bilan to'ldiradi.
j) Massivlar statik usuli joriy va oldingi uchun BinaryOperatorni qo'llaydi
massiv elementlari va natijani joriy elementda saqlaydi.
k) Parallel oqim olish uchun mavjud oqimda usulni chaqirish kifoya.
l) CompletableFuture o'zining ko'p funktsiyalari orasida asinxron tarzda bajarishga imkon beradi
vazifalarni bajaradigan yoki qiymatlarni qaytaradigan.
23.3 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Agar ip tugatilgan bo'lsa, uni ishga tushirish mumkin emas.
b) Ba'zi operatsion tizimlar iplar bilan vaqt chegarasidan foydalanadi. Shuning uchun ular iplarni yoqishlari mumkin
bir xil ustuvorlikka ega bo'lgan mavzularni oldindan tanlash uchun.
c) Ip kvantining muddati tugagach, ip ish holatiga qaytadi.
baholash tizimi uni protsessorga tayinlaydi.
d) Vaqt chegarasisiz bitta protsessorli tizimda har bir ip teng ustuvorlik to'plamida
threads (boshqa iplar mavjud bo'lmagan holda) boshqa teng bo'lgan iplardan oldin tugallanadi
ustuvorlik amalga oshirish imkoniyatiga ega bo'ladi.
23.4 (Kengaytirilgan ixtiyoriy bo'limlar) Quyidagilarning har biri rost yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa,
sababini tushuntiring.
a) Ikki Instant orasidagi farqni aniqlash uchun Duration sinfining statik usulidan foydalaning
farq, bu vaqt farqini o'z ichiga olgan Duration obyektini qaytaradi.
b) Oqimlarni parallellashtirish oson, bu dasturlarga takomillashtirilgan samaradorlikdan foydalanish imkonini beradi.
ko'p yadroli tizimlarda ishlash.
c) Interfeys ta'minotchisi, xuddi Callable interfeysi kabi, bitta usulga ega funktsional interfeysdir.
od argumentlarni qabul qilmaydi va natijani qaytaradi.
d) CompletableFuture statik usul runAsync asinxron ravishda yetkazib beruvchi vazifasini bajaradi
bu qiymatni qaytaradi.
e) CompletableFuture statik usul supplyAsync asinxron ravishda Runnable-ni bajaradi
natijani qaytarmaydigan vazifa.

O'z-o'zini tekshirish mashqlariga javoblar


23.1 a) uning ishlash usuli tugaydi. b) uyqu, ip. c) vaqtli kutish. d) tayyor, yugurish. e) ijrochi.
f) o'chirish. g) ishlab chiqaruvchi/iste’molchi, ishlab chiqaruvchi, iste’molchi. h) sinxronlashtirilgan.
23.2 a) signal. b) Hammasi signal. v) kutmoq, kutmoq. d) ArrayBlockingQueue. e) hozir. f) Millisga.
g) getPercentInstance. h) format. i) parallelSetAll. j) parallelPrefiks. k) parallel. l) yugurish -
Assalomu alaykum, yetkazib beruvchilar.
23.3 a) To'g'ri. b) yolg'on. Timeslicing ish zarrachasini vaqt chegarasi (yoki kvant)gacha bajarishga imkon beradi
muddati tugaydi. Keyin teng ustuvorlikdagi boshqa oqimlar bajarilishi mumkin. c) yolg'on. Qachonki, ipning kvant sobiq -
pires, ip tayyor holatga qaytadi va operatsion tizim protsessorga boshqasini tayinlaydi
ip. d) To'g'ri.
23.4 a) Noto'g'ri. Ikki lahza o'rtasidagi farqni hisoblash uchun Duration usuli hisoblanadi
orasida nomlanadi. b) To'g'ri. c) To'g'ri. d) yolg'on. Ta'minotchini asinxron tarzda bajaradigan usul
ta'minotAsync. e) yolg'on. Runnable faylini asinxron tarzda bajaradigan usul runAsync hisoblanadi.

1043-mashqlar



Mashqlar
23.5 (To'g'ri yoki noto'g'ri) Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ayting. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Uyqu rejimi ip uxlayotganda protsessor vaqtini sarflamaydi.
b) Swing komponentlari ip xavfsiz.
c) (Kengaytirilgan) Sinxronlashtirilgan usulni e'lon qilish, blokirovka yuzaga kelmasligini kafolatlaydi.
d) (Kengaytirilgan) ReentrantLock ip orqali olingandan so'ng, ReentrantLock
ob'ekt birinchi ip uni qo'yib yubormaguncha, boshqa ipga qulfni olishga ruxsat bermaydi.
23.6 (Multithreading Terms) Quyidagi atamalarning har birini aniqlang.
a) ip
b) ko'p tarmoqli
c) ishlaydigan holat
d) vaqtli kutish holati
e) oldindan rejalashtirish
f) ishga tushiriladigan interfeys
g) ishlab chiqaruvchi/iste'molchi munosabatlari
h) kvant
23.7 (Kengaytirilgan: Ko‘p mavzuli shartlar) Quyidagi atamalarning har birini quyidagi kontekstda muhokama qiling.
Java-ning ish zarrachalari mexanizmlari:
a) sinxronlashtirilgan
b) kuting
c) xabardor qilish
d) hammaga xabar bering
e) qulflash
f) holat
23.8 (Bloklangan holat) Bloklangan holatga kirish sabablarini sanab o'ting. Ularning har biri uchun tavsif bering
dastur odatda bloklangan holatdan qanday chiqib ketadi va ishga tushadigan holatga kiradi.
23.9 (O'lik qulf va noaniq kechiktirish) Tizimlarda yuzaga kelishi mumkin bo'lgan ikkita muammo:
Kutish kerak bo'lgan past ish zarralari boshi berk ko'chadir, bunda bir yoki bir nechta mavzular shunday voqeani abadiy kutadi
sodir bo'lmaydi va noma'lum kechiktirish, bunda bir yoki bir nechta mavzular ba'zilari uchun kechiktiriladi
oldindan aytib bo'lmaydigan uzoq vaqt. Ushbu muammolarning har biri ko'p oqimda qanday paydo bo'lishi mumkinligiga misol keltiring.
ed Java dasturlari.
23.10 (Top etuvchi to'p) JPanel ichida ko'k to'pni sakraydigan dastur yozing. To'p kerak
mousePressed hodisasi bilan harakat qilishni boshlang. To'p JPanel chetiga tegsa, u sakrashi kerak
chetidan va teskari yo'nalishda davom eting. To'pni Runnable yordamida yangilash kerak.
23.11 (Toplayotgan to'plar) Har safar foydalanuvchi yangi to'p qo'shish uchun 23.10-mashqdagi dasturni o'zgartiring.
sichqonchani bosadi. Kamida 20 ta to'pni ta'minlang. Har bir yangi to'p uchun tasodifiy rangni tanlang.
23.12 (Soyali to'plar) Soya qo'shish uchun 23.11-mashqdagi dasturni o'zgartiring. Sifatida
to'p harakatlansa, JPanel pastki qismida qattiq qora ovalni torting. 3-D qo'shishni o'ylab ko'rishingiz mumkin
JPanel chetiga tegsa, har bir to'p hajmini oshirish yoki kamaytirish orqali ta'sir qiladi.
23.13 (Kengaytirilgan: Qulflar va shartlarga ega aylana buferi) Quyidagi misolni qayta ishlating
23.8-bo'lim 23.9-bo'limda taqdim etilgan Qulf va holat tushunchalaridan foydalangan holda.
23.14 (Cheklangan bufer: haqiqiy dunyo misoli) Magistral yo‘lning mahalliy yo‘lga chiqib ketishini tasvirlab bering.
yo'l cheklangan bufer bilan ishlab chiqaruvchi / iste'molchi munosabatlarining yaxshi namunasidir. Ayniqsa,
dizaynerlar off-rampa o'lchamini qanday tanlashi mumkinligini muhokama qiling.

1044 23-bob Parametrlilik

Parallel oqimlar
23.15–23.17 mashqlari uchun muhim samaradorlikni koʻrish uchun kattaroq maʼlumotlar toʻplamini yaratishingiz kerak boʻlishi mumkin.
farq.
23.15 (Fayldagi so'zlarni umumlashtirish) Parallel oqimlar yordamida 17.17-rasmni qayta bajaring. dan foydalaning
23.12-bo'limda o'rgangan sana/vaqt API vaqtini belgilash usullari
dasturning ketma-ket va parallel versiyalari.
23.16 (Fayldagi belgilarni umumlashtirish) Parallel oqimlar yordamida 17.9-mashqni qayta bajaring.
Vaqtni taqqoslash uchun 23.12-bo'limda o'rgangan sana/vaqt API vaqtini belgilash usullaridan foydalaning.
dasturning ketma-ket va parallel versiyalari uchun talab qilinadi.
23.17 (Katalogdagi fayl turlarini umumlashtirish) Parallel yordamida 17.10 mashqni qayta bajaring
oqimlar. 23.12-bo'limda o'rgangan sana/vaqt API vaqtini solishtirish usullaridan foydalaning.
dasturning ketma-ket va parallel versiyalari uchun talab qilinadigan vaqt.

24

Ma'lumotlar bazalariga kirish


JDBC

Bu katta xatodir


ma'lumotlarga ega bo'lgunga qadar nazariya qiling.
- Artur Konan Doyl
Endi boring, ularning oldiga yozing
jadval va uni kitobga yozib qo'ying,
Bu vaqt uchun bo'lishi mumkin
abadiy va abadiy kel.
Muqaddas Kitob, Ishayo 30:8
Avval faktlaringizni oling, keyin
siz ularni shunchalik buzishingiz mumkin
iltimos.
- Mark Tven
Menga ikki turdagi erkaklar yoqadi:
mahalliy va xorijiy.
- Mey Vest

Oh maqsadlar


Ushbu bobda siz quyidagilarni bilib olasiz:
■ Relyatsion ma'lumotlar bazasi tushunchalari.
■ Strukturaviy so'rovdan foydalanish uchun
Qayta olish uchun til (SQL).
ma'lumotlarni manipulyatsiya qilish
ma'lumotlar bazasidagi ma'lumotlar.
■ JDBC ™ API dan foydalanish uchun
ma'lumotlar bazalariga kirish.
■ RowSet interfeysidan foydalanish uchun
javax.sql to'plamidan
ma'lumotlar bazalarini manipulyatsiya qilish.
■ JDBC 4 ni avtomatik ishlatish uchun
JDBC drayverini topish.
■ Oldindan kompilyatsiya qilingan SQL yaratish uchun
parametrlarga ega bayonotlar
PreparedStatements orqali.
■ Tranzaksiyani qanday qayta ishlash
ma'lumotlar bazasi ilovalarini yaratadi
yanada mustahkam.

1046 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

24.1 Kirish
Ma'lumotlar bazasi - ma'lumotlarning uyushgan to'plami. Tashkilotlar uchun juda ko'p turli xil strategiyalar mavjud.
qulay foydalanish va manipulyatsiyani osonlashtirish uchun ma'lumotlarni to'plash. Ma'lumotlar bazasini boshqarish tizimi
(DBMS) ma'lumotlarni saqlash, tartibga solish, olish va o'zgartirish mexanizmlarini taqdim etadi
ko'p foydalanuvchilar. Ma'lumotlar bazasini boshqarish tizimlari ma'lumotlarga kirish va saqlash imkonini beradi:
ma'lumotlarning ichki namoyishi uchun tashvish.
Strukturaviy so'rovlar tili
Hozirgi kunda eng mashhur ma'lumotlar bazasi tizimlari relyatsion ma'lumotlar bazalaridir (24.2-bo'lim). Bir til
SQL deb ataladi, ya'ni "davomi" deb talaffuz qilinadi yoki uning alohida harflari sifatida - xalqaro standartdir.
so'rovlarni bajarish uchun (ya'ni, to
berilgan mezonlarga javob beradigan ma'lumotni so'rash) va ma'lumotlarni manipulyatsiya qilish. [Izoh: Siz kabi
SQL haqida ma'lumotga ega bo'lsangiz, siz "SQL bayonoti" yozayotgan ba'zi mualliflarni ko'rasiz (bu
talaffuzi “davomi”) va boshqalar “SQL bayonoti” yozadilar (bu
alohida harflar talaffuz qilinadi). Ushbu kitobda biz SQLni “davomi” deb talaffuz qilamiz.]
Relyatsion ma'lumotlar bazasini boshqarishning mashhur tizimlari
Ba'zi mashhur relyatsion ma'lumotlar bazasini boshqarish tizimlari (RDBMS) Microsoft SQL
Server®, Oracle®, Sybase®, IBM DB2®, Informix®, PostgreSQL va MySQL™. The
JDK Java DB deb nomlangan sof Java RDBMS bilan birga keladi - bu Oracle brendli versiyasi.
Apache Derby™.
JDBC
Java dasturlari Java Database Connectivity (JDBC™) yordamida maʼlumotlar bazalari bilan oʻzaro ishlaydi.
API. JDBC drayveri Java ilovalariga ma'lum bir ma'lumotlar bazasiga ulanish imkonini beradi
DBMS va JDBC API yordamida ushbu ma'lumotlar bazasini boshqarish imkonini beradi.

24.1 Kirish


24.2 Relyatsion ma'lumotlar bazalari
24.3 Kitoblar ma'lumotlar bazasi
24.4 SQL
24.4.1 Asosiy SELECT so'rovi
24.4.2 WHERE bandi
24.4.3. BUYURT BO'YICHA
24.4.4 Bir nechta ma'lumotlarni birlashtirish
Jadvallar: INNER JOIN
24.4.5 INSERT bayonoti
24.4.6 YANGILANISH to'g'risidagi bayonot
24.4.7 Bayonotni o'chirish
24.5 Java ma'lumotlar bazasini o'rnatish
24.5.1 Bo'limning ma'lumotlar bazalarini yaratish
Windows-da

24.5.2 Macda bo'lim ma'lumotlar bazalarini yaratish


OS X
24.5.3 Bo'lim ma'lumotlar bazasini yaratish
Linux
24.6 JDBC bilan ma'lumotlar bazalarini manipulyatsiya qilish
24.6.1 Ma'lumotlar bazasiga ulanish va so'rov o'tkazish
24.6.2 Kitoblar ma'lumotlar bazasini so'rash
24.7 RowSet interfeysi
24.8 Tayyorlangan bayonotlar
24.9 Saqlangan protseduralar
24.10 Tranzaksiyalarni qayta ishlash
24.11 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar

Dasturiy ta'minot muhandisligi kuzatuvi 24.1
JDBC API portativdir - bir xil kod turli RDBMSlarda ma'lumotlar bazalarini boshqarishi mumkin.

24.2 Relyatsion ma'lumotlar bazalari 1047

Eng mashhur ma'lumotlar bazasini boshqarish tizimlari JDBC drayverlarini taqdim etadi. Ushbu bobda,
biz JDBC ni joriy qilamiz va undan Java DB ma'lumotlar bazasini manipulyatsiya qilish uchun foydalanamiz. Biz aniqlagan texnikalar -
bu yerda onstrate JDBC drayverlariga ega bo'lgan boshqa ma'lumotlar bazalarini boshqarish uchun ishlatilishi mumkin. Agar unday bo'lmasa,
uchinchi tomon ishlab chiqaruvchilari ko'plab DBMSlar uchun JDBC drayverlarini taqdim etadilar. Ushbu bobning misollari edi
Java SE 7 va Java SE 8 JDK yordamida Java DB bilan sinovdan o'tgan.
Java Persistence API (JPA)
Onlayn 29-bobda biz Java Persistence API (JPA) ni joriy qilamiz. Bu bobda siz
Ma'lumotlar bazasidagi jadvallarni aks ettiruvchi Java sinflarini avtomatik yaratishni o'rganing.
ular o'rtasidagi aloqalar - ob'ektga aloqador xaritalash deb nomlanuvchi - keyin ularning ob'ektlaridan foydalaning
ma'lumotlar bazasi bilan ishlash uchun sinflar. Ko'rib turganingizdek, ma'lumotlarni saqlash va a.dan ma'lumotlarni olish
ma'lumotlar bazasi siz uchun ko'rib chiqiladi - odatda siz ushbu bobda o'rganadigan texnikalar
JPA tomonidan sizdan yashirilsin.
24.2 Relyatsion ma'lumotlar bazalari
Relyatsion ma'lumotlar bazasi ma'lumotlarga kirish imkonini beruvchi ma'lumotlarning mantiqiy tasviridir
uning jismoniy tuzilishini hisobga olmagan holda. Relyatsion ma'lumotlar bazasi ma'lumotlarni jadvallarda saqlaydi.
24.1-rasmda kadrlar tizimida qo'llanilishi mumkin bo'lgan namunaviy jadval ko'rsatilgan. Jadval
nomi Xodim bo'lib, uning asosiy maqsadi xodimlarning atributlarini saqlashdir. Jadvallar
qatorlardan iborat bo'lib, ularning har biri bitta ob'ektni tavsiflaydi - 24.1-rasmda, xodim. Qatorlar
qiymatlar saqlanadigan ustunlardan iborat. Ushbu jadval olti qatordan iborat. The
Har bir satrning raqamlar ustuni jadvalning asosiy kaliti — ustun (yoki ustunlar guruhi)
har bir satr uchun noyob qiymat bilan. Bu har bir qatorni aniqlash mumkinligini kafolatlaydi
asosiy kaliti bilan. Asosiy kalit ustunlarga yaxshi misollar ijtimoiy xavfsizlik raqami,
xodimlarning identifikatori raqami va inventarizatsiya tizimidagi qism raqami, har biridagi qiymatlar sifatida
bu ustunlar noyob bo'lishi kafolatlanadi. 24.1-rasmdagi qatorlar tartibda ko'rsatilgan
asosiy kalit orqali. Bunday holda, qatorlar asosiy kalit bo'yicha o'sish tartibida keltirilgan, lekin ular
kamayish tartibida yoki umuman alohida tartibda sanab o'tilishi mumkin.

Har bir ustun boshqa ma'lumotlar atributini ifodalaydi. Qatorlar noyob (asosiy kalit bo'yicha)


jadval ichida, lekin alohida ustun qiymatlari qatorlar orasida takrorlanishi mumkin. Uchun
Masalan, Xodimlar jadvalining bo'limi ustunidagi uchta turli qatorda raqam mavjud
413.

24.1-rasm | Xodimlar jadvali namunasi ma'lumotlari.

23603
24568
34589
35761
47132
78321

Jons
Kervin


Larson
Myers
Neyman
Stiven

Raqam


Asosiy kalit

Qator


Ustun

Ism


413
413
642
611
413
611

Bo'lim


1100
2000
1800
1400
9000
8500

Ish haqi


Nyu-Jersi
Nyu-Jersi
Los Anjeles
Orlando
Nyu-Jersi
Orlando

Manzil

1048 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

Ma'lumotlar to'plamini tanlash


Ma'lumotlar bazasining turli foydalanuvchilari ko'pincha turli ma'lumotlar va turli munosabatlarga qiziqishadi.
ma'lumotlar orasida yuboriladi. Aksariyat foydalanuvchilar faqat qatorlar va ustunlar to'plamini talab qiladi. So'rovlar
jadvaldan qaysi ma'lumotlar to'plamini tanlashni belgilang. Siz so'rovlarni aniqlash uchun SQL dan foydalanasiz. Uchun
masalan, qaerda ekanligini ko'rsatadigan natijani yaratish uchun Xodimlar jadvalidan ma'lumotlarni tanlashingiz mumkin
Har bir bo'lim joylashgan bo'lib, ma'lumotlarni bo'lim bo'yicha ortib borayotgan tartibda saralangan holda taqdim etadi
raqam. Bu natija 24.2-rasmda ko'rsatilgan. SQL 24.4-bo'limda muhokama qilinadi.

24.3 Kitoblar ma'lumotlar bazasi


Biz ushbu bobning kitoblar ma'lumotlar bazasi kontekstida relyatsion ma'lumotlar bazalarini kiritamiz
bir nechta misollarda foydalanasiz. SQL-ni muhokama qilishdan oldin, biz kitoblar jadvallarini muhokama qilamiz
ma'lumotlar bazasi. Biz ushbu ma'lumotlar bazasidan turli xil ma'lumotlar bazasi tushunchalarini, jumladan, qanday qilishni ham joriy qilish uchun foydalanamiz
ma'lumotlar bazasidan ma'lumot olish va ma'lumotlarni manipulyatsiya qilish uchun SQL dan foydalaning. ta'minlaymiz
ma'lumotlar bazasini yaratish uchun skript. Buning uchun skriptni misollar katalogida topishingiz mumkin
bob. 24.5-bo'lim ushbu skriptdan qanday foydalanishni tushuntiradi.

Mualliflar jadvali


Ma'lumotlar bazasi uchta jadvaldan iborat: Mualliflar, AuthorISBN va Sarlavhalar. Mualliflar ta-
ble (24.3-rasmda tasvirlangan) har bir muallifning o'ziga xosligini saqlaydigan uchta ustundan iborat.
ID raqami, ismi va familiyasi. 24.4-rasmda Mualliflarning namunaviy ma'lumotlari mavjud
stol.

24.2-rasm | Xodimlar jadvalidagi alohida bo'lim va joylashuv ma'lumotlari.

Ustun tavsifi

AuthorID Ma'lumotlar bazasidagi muallifning ID raqami. Kitoblar ma'lumotlar bazasida bu butun son


umn avtomatik oshirilgan sifatida aniqlanadi - bu jadvalga kiritilgan har bir qator uchun
AuthorID qiymati har bir qatorga ega bo'lishini ta'minlash uchun avtomatik ravishda 1 ga oshiriladi
noyob AuthorID. Bu ustun jadvalning asosiy kalitini ifodalaydi. Avtomatik oshirish-
zikr qilingan ustunlar identifikatsiya ustunlari deb ataladi. Biz taqdim etgan SQL skripti
Ushbu ma'lumotlar bazasi uchun SQL IDENTITY kalit so'zidan foydalanib, AuthorID belgisini belgilaydi.
umn identifikatsiya ustuni sifatida. IDENTITY dan foydalanish haqida ko'proq ma'lumot olish uchun
kalit so'z va ma'lumotlar bazalarini yaratish uchun Java DB Developer qo'llanmasiga qarang
http://docs.oracle.com/javadb/10.10.1.1/devguide/derbydev.pdf.
Ism Muallifning ismi (satr).
Familiya Muallifning familiyasi (satr).

24.3-rasm | Kitoblar ma'lumotlar bazasidan mualliflar jadvali.

413
611
642

Nyu-Jersi


Orlando
Los Anjeles

Bo'limning joylashuvi


24.3 A kitoblar ma'lumotlar bazasi 1049

Sarlavhalar jadvali
24.5-rasmda tasvirlangan sarlavhalar jadvali ma'lumotlarni saqlaydigan to'rtta ustundan iborat.
ma'lumotlar bazasidagi har bir kitob, shu jumladan uning ISBN, nomi, nashr raqami va nusxasi
to'g'ri yil. 24.8-rasmda Sarlavhalar jadvalidagi ma'lumotlar mavjud.

AuthorID FirstName Familiya

1 Pol Deytel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Maykl Morgano

24.4-rasm | Mualliflar jadvalidagi namuna ma'lumotlari.

Ustun tavsifi

Kitobning ISBN ISBN (satr). Jadvalning asosiy kaliti. ISBN qisqartma-


"Xalqaro standart kitob raqami" uchun tion - raqamlash sxemasi
nashriyotlar har bir kitobga noyob identifikatsiya raqamini berish uchun foydalanadigan.
Sarlavha Kitobning nomi (torli).
EditionNumber Kitobning nashr raqami (butun son).
Mualliflik huquqi kitobning mualliflik huquqi yili (string).

24.5-rasm | Kitoblar ma'lumotlar bazasidan sarlavhalar jadvali.

ISBN Title EditionNumber Mualliflik huquqi

0132151006 Internet va World Wide Web Qanday qilib


Dastur

5 2012 yil

0133807800 Java dasturlash 10 2015 yil
0132575655 Java qanday dasturlash kerak, kech
Ob'ektlar versiyasi

10 2015 yil

013299044X C 7 2013-yilni qanday dasturlash kerak
0132990601 Simply Visual Basic 2010 4 2013
0133406954 Visual Basic 2012 Qanday dasturlash mumkin 6 2014
0133379337 Visual C# 2012 Qanday dasturlash mumkin 5 2014
0136151574 Visual C++ 2008 Qanday qilib dastur 2 2008
0133378713 C++ qanday dasturlash 9 2014 yil
0133570924 Android Qanday dasturlash 2 2015
0133570924 Dasturchilar uchun Android: Ilova-
Boshqariladigan yondashuv, 1-jild

2 2014 yil

0132121360 Dasturchilar uchun Android: Ilova-
Yo'naltirilgan yondashuv

1 2012 yil

24.6-rasm | Kitoblar ma'lumotlar bazasining Sarlavhalar jadvalidagi namuna ma'lumotlari.

1050 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

AuthorISBN jadvali
AuthorISBN jadvali (24.7-rasmda tasvirlangan) saqlovchi ikkita ustundan iborat.
Har bir kitob uchun ISBN va ularga tegishli mualliflarning ID raqamlari. Ushbu jadval bog'langan
mualliflar kitoblari bilan. AuthorID ustuni tashqi kalit - bu jadvaldagi ustun
Bu boshqa jadvaldagi asosiy kalit ustuniga mos keladi (ya'ni, Mualliflar ro'yxatidagi AuthorID
jadval). ISBN ustuni ham tashqi kalit bo'lib, u asosiy kalit ustuniga mos keladi (ya'ni,
ISBN) Sarlavhalar jadvalida. Ma'lumotlar bazasi ko'plab jadvallardan iborat bo'lishi mumkin. Loyihalashda maqsad
ma'lumotlar bazasi - bu ma'lumotlar bazasi jadvallari orasidagi takrorlanadigan ma'lumotlar miqdorini minimallashtirish. Uchun-
ma'lumotlar bazasida ma'lumotlar bazasi jadvali yaratilganda ko'rsatilgan eign kalitlari ma'lumotlarni bog'laydi
bir nechta jadvallarda. Ushbu jadvaldagi AuthorID va ISBN ustunlari birgalikda kompozitsiyani tashkil qiladi
asosiy kalit. Ushbu jadvaldagi har bir qator bitta muallif va bitta kitobning ISBN raqamiga mos keladi.
24.8-rasmda kitoblar ma'lumotlar bazasining AuthorISBN jadvalidagi ma'lumotlar mavjud.

Har bir xorijiy kalit qiymati boshqa jadvalning asosiy kalit qiymati sifatida ko'rinishi kerak, shuning uchun


DBMS tashqi kalit qiymatining haqiqiyligini ta'minlashi mumkin - bu Referans qoidasi deb nomlanadi.
entsial yaxlitlik. Masalan, DBMS ma'lum bir narsa uchun AuthorID qiymatini ta'minlaydi

Ustun tavsifi

AuthorID Muallifning ID raqami, Mualliflar jadvalining chet el kaliti.
ISBN Kitob uchun ISBN, Sarlavhalar jadvalining chet el kaliti.

24.7-rasm | Kitoblar ma'lumotlar bazasidan AuthorISBN jadvali.

Muallif ID ISBN Muallif ID ISBN

1 0132151006 2 0133379337


2 0132151006 1 0136151574
3 0132151006 2 0136151574
1 0133807800 4 0136151574
2 0133807800 1 0133378713
1 0132575655 2 0133378713
2 0132575655 1 0133764036
1 013299044X 2 0133764036
2 013299044X 3 0133764036
1 0132990601 1 0133570924
2 0132990601 2 0133570924
3 0132990601 3 0133570924
1 0133406954 1 0132121360
2 0133406954 2 0132121360
3 0133406954 3 0132121360
1 0133379337 5 0132121360
24.8-rasm | AuthorISBN kitoblar jadvalidagi namuna ma'lumotlari.

24.3 A kitoblar ma'lumotlar bazasi 1051

AuthorISBN jadvalining qatori Mualliflar jadvalida qator mavjudligini tekshirish orqali haqiqiydir
asosiy kalit sifatida ushbu AuthorID bilan.
Chet el kalitlari, shuningdek, bir nechta jadvallardagi tegishli ma'lumotlarni ushbu jadvallardan tanlashga imkon beradi -
bu ma'lumotlarga qo'shilish deb nomlanadi. Birlamchi o'rtasida birdan ko'pga bog'liqlik mavjud
kalit va mos keladigan chet el kaliti (masalan, bitta muallif ko'p kitob yozishi mumkin va
bitta kitobni ko'plab mualliflar yozishi mumkin). Bu shuni anglatadiki, chet el kaliti ko'p paydo bo'lishi mumkin
marta o'z jadvalida, lekin faqat bir marta (asosiy kalit sifatida) boshqa jadvalda. Masalan,
ISBN 0132151006 AuthorISBN ning bir nechta qatorlarida ko'rsatilishi mumkin (chunki bu kitobda bir nechta
mualliflar) lekin ISBN asosiy kalit bo'lgan Sarlavhalarda faqat bir marta.
Shaxs-munosabat (ER) diagrammasi
Birlamchi kalit va mos keladigan xorijiy kalit o'rtasida bittadan ko'pga bog'liqlik mavjud
kalit (masalan, bitta muallif ko'p kitob yozishi mumkin). Chet el kaliti uning ichida ko'p marta paydo bo'lishi mumkin
shaxsiy jadval, lekin faqat bir marta (asosiy kalit sifatida) boshqa jadvalda. 24.9-rasmda ob'ekt
kitoblar ma'lumotlar bazasi uchun munosabatlar (ER) diagrammasi. Ushbu diagrammada ma'lumotlar bazasi jadvallari ko'rsatilgan
va ular orasidagi munosabatlar. Har bir qutidagi birinchi bo'limda jadvallar mavjud
nom va qolgan bo'limlarda jadval ustunlari mavjud. Ismlar kursivda
asosiy kalitlardir. Jadvalning asosiy kaliti jadvaldagi har bir satrni noyob tarzda aniqlaydi. Har bir qator
asosiy kalit qiymatiga ega bo'lishi kerak va bu qiymat jadvalda yagona bo'lishi kerak. Bu ma'lum
sub'ektning yaxlitligi qoidasi sifatida. Shunga qaramay, AuthorISBN jadvali uchun asosiy kalit bu
ikkala ustunning kombinatsiyasi - bu kompozit asosiy kalit sifatida tanilgan.

24.9-rasmdagi jadvallarni birlashtiruvchi chiziqlar o'rtasidagi munosabatlarni ifodalaydi


jadvallar. Mualliflar va AuthorISBN jadvallari orasidagi chiziqni ko'rib chiqing. Mualliflar oxirida
qatorda 1, AuthorISBN oxirida esa cheksizlik belgisi (∞) mavjud. Bu ko'rsatadi
birdan ko'pga munosabat - Mualliflar jadvalidagi har bir muallif uchun o'zboshimchalik bo'lishi mumkin
AuthorISBN jadvalidagi ushbu muallif tomonidan yozilgan kitoblar uchun ISBN soni (ya'ni,
muallif istalgan miqdordagi kitob yozishi mumkin). E'tibor bering, aloqa chizig'i AuthorID ni bog'laydi
Mualliflar jadvalidagi ustun (bu erda AuthorID asosiy kalit) AuthorID ustuniga
AuthorISBN jadvalida (bu erda AuthorID chet el kalitidir) - jadvallar orasidagi chiziq
asosiy kalitni mos keladigan tashqi kalitga bog'laydi.
Sarlavhalar va MuallifISBN jadvallari orasidagi chiziq birdan ko'pga munosabatni ko'rsatadi.
kema - bitta kitobni ko'plab mualliflar yozishi mumkin. E'tibor bering, jadvallar orasidagi chiziq
Sarlavhalar jadvalidagi asosiy kalit ISBN ni jadvaldagi mos keladigan tashqi kalit bilan bog'laydi
MuallifISBN. 24.9-rasmdagi munosabatlar shuni ko'rsatadiki, muallifning yagona maqsadi -
ISBN jadvali Mualliflar va Sarlavhalar o'rtasida ko'pdan ko'pga munosabatni ta'minlash uchun mo'ljallangan
jadvallar - muallif ko'p kitob yozishi mumkin va kitobda ko'plab mualliflar bo'lishi mumkin.

24.9-rasm | Kitoblar ma'lumotlar bazasida jadval munosabatlari.

1 1

Sarlavhalar



Mualliflik huquqi

Nashr raqami

Sarlavha

ISBN


MuallifISBN

ISBN


Muallif ID

Mualliflar

Familiya

Ism


Muallif ID

1052 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

24.4 SQL
Endi biz kitoblar ma'lumotlar bazasi kontekstida SQL-ni muhokama qilamiz. Siz SQL dan foydalana olasiz
bu erda keyingi bobdagi misollarda muhokama qilinadi. Keyingi bir nechta kichik bo'limlar iblis-
strate SQL so'rovlari va bayonotlari 24.10-rasmdagi SQL kalit so'zlari yordamida. Boshqa SQL kalitlari -
so'zlar ushbu matn doirasidan tashqarida.

24.4.1 Asosiy SELECT so'rovi


Keling, ma'lumotlar bazasi kitoblaridan ma'lumotlarni chiqaradigan bir nechta SQL so'rovlarini ko'rib chiqaylik. SQL
so'rov ma'lumotlar bazasidagi bir yoki bir nechta jadvallardan satr va ustunlarni "tanlaydi". Bunday tanlovlar
SELECT kalit so'zi bilan so'rovlar orqali amalga oshiriladi. SELECT so'rovining asosiy shakli

unda yulduzcha (*) joker belgi jadval nomidagi barcha ustunlar ekanligini bildiradi


jadvalni olish kerak. Masalan, Mualliflar jadvalidagi barcha ma'lumotlarni olish uchun foydalaning

Ko'pgina dasturlar jadvaldagi barcha ma'lumotlarni talab qilmaydi. Faqat ma'lum ustunlarni olish uchun,


* ni vergul bilan ajratilgan ustun nomlari ro'yxati bilan almashtiring. Masalan, faqat olish uchun
Mualliflar jadvalidagi barcha qatorlar uchun AuthorID va Familiya ustunlari uchun so'rovdan foydalaning

Ushbu so'rov 24.11-rasmda keltirilgan ma'lumotlarni qaytaradi.

SQL kalit so'zi tavsifi

SELECT Bir yoki bir nechta jadvallardan ma'lumotlarni oladi.


FROM So'rovga jalb qilingan jadvallar. Har bir SELECTda talab qilinadi.
QAYER: Qabul qilinadigan, o'chiriladigan yoki satrlarni belgilovchi tanlash mezonlari
yangilangan. SQL so'rovida yoki SQL bayonotida ixtiyoriy.
GROUP BY Qatorlarni guruhlash mezonlari. SELECT so'rovida ixtiyoriy.
ORDER BY Qatorlarni buyurtma qilish mezonlari. SELECT so'rovida ixtiyoriy.
INNER JOIN Bir nechta jadvaldagi qatorlarni birlashtirish.
INSERT Belgilangan jadvalga qatorlar qo'shing.
UPDATE Belgilangan jadvaldagi qatorlarni yangilash.
DELETE Belgilangan jadvaldan qatorlarni o'chirish.

24.10-rasm | SQL so'rovi kalit so'zlari.

TANLOV * jadval nomidan

Mualliflardan * ni tanlang

Muallif identifikatori, familiyasini mualliflardan tanlang

AuthorID Familiya Muallif ID Familiyasi

1 Deitel 4 Quirk
2 Deitel 5 Morgano
3 Deitel

24.11-rasm | Mualliflar jadvalidagi AuthorID va Familiya ma'lumotlarining namunasi.


24.4 SQL 1053

24.4.2 WHERE bandi
Ko'pgina hollarda ma'lumotlar bazasida ma'lum tanlov mezonlarini qondiradigan qatorlarni topish kerak.
ria. Faqat tanlash mezonlariga javob beradigan qatorlar (rasmiy ravishda predikatlar deb ataladi) tanlanadi.
SQL so'rov uchun tanlash mezonlarini belgilash uchun so'rovda ixtiyoriy WHERE bandidan foydalanadi.
Tanlov mezonlari bilan so'rovning asosiy shakli

Masalan, jadvaldan Sarlavha, Nashr raqami va Mualliflik huquqi ustunlarini tanlash uchun


Mualliflik huquqi 2013 yildan kattaroq bo'lgan sarlavhalar uchun so'rovdan foydalaning

SQL-dagi satrlar ikki (") qo'shtirnoq emas, bitta (') bilan ajratilgan.24.12-rasm.


oldingi so'rov natijasini ko'rsatadi.

Naqsh moslashuvi: nol yoki undan ortiq belgilar


WHERE bandi mezonlari <, >, <=, >=, =, <> va LIKE operatorlarini o'z ichiga olishi mumkin. Operator
LIKE qoʻshilgan belgilar foiz (%) va pastki chiziq bilan naqsh moslashtirish uchun ishlatiladi
(_). Shaklni moslashtirish SQL-ga berilgan naqshga mos keladigan satrlarni qidirishga imkon beradi.

Dasturiy ta'minot muhandisligi kuzatuvi 24.2


Umuman olganda, siz ustunlar tartibini oldindan bilib, natijalarni qayta ishlaysiz
natija - masalan, Mualliflar jadvalidan AuthorID va Familiyani tanlash buni ta'minlaydi
ustunlar natijada birinchi ustun sifatida AuthorID va familiya sifatida paydo bo'ladi
ikkinchi ustun. Dasturlar odatda ustunni belgilash orqali natija ustunlarini qayta ishlaydi
natijada raqam (birinchi ustun uchun 1 raqamidan boshlab). Ustunlarni tanlash
name keraksiz ustunlarni qaytarishdan saqlaydi va haqiqiy tartibdagi o'zgarishlardan himoya qiladi
ustunlarni aniq belgilangan tartibda qaytarish orqali jadval(lar)dagi ustunlar soni.
Umumiy dasturlash xatosi 24.1
Agar siz so'rovdan ustunlar har doim bir xil tartibda qaytariladi deb hisoblasangiz
yulduzcha (*) ishlatsa, dastur natijalarni noto'g'ri ishlashi mumkin. Agar ustun tartibi bo'lsa
jadval(lar)dagi o'zgarishlar yoki keyinchalik qo'shimcha ustunlar qo'shilsa, tartibi
natijadagi ustunlar mos ravishda o'zgaradi.

1-ustun nomi, ustun nomi2, … jadvalName WHERE mezonlaridan FROM TANLANING

Sarlavha, nashr raqami, mualliflik huquqini tanlang
FROM Sarlavhalar
QAYERDA Mualliflik huquqi > '2013'

Title EditionNumber Mualliflik huquqi

Java qanday dasturlash 10 2015
Java qanday dasturlash kerak, Late Objects Version 10 2015
Visual Basic 2012 Qanday qilib dastur 6 2014
Visual C# 2012 Qanday qilib dasturlash 5 2014
C++ qanday dasturlash 9 2014
Android qanday dastur 2 2015
Dasturchilar uchun Android: Ilovaga asoslangan
Yondashuv, 1-jild

2 2014 yil

24.12-rasm | Sarlavhalar jadvalidan 2005 yildan keyin mualliflik huquqiga ega sarlavhalar namunasi.

1054 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

Foiz belgisini (%) o'z ichiga olgan naqsh nol yoki bo'lgan satrlarni qidiradi
naqshdagi foiz belgisi o'rnida ko'proq belgilar. Masalan, keyingi
so'rov familiyasi D harfi bilan boshlangan barcha mualliflarning qatorlarini topadi:

Ushbu so'rov 24.13-rasmda ko'rsatilgan ikkita qatorni tanlaydi - beshta muallifdan uchtasida oxirgi bor


D harfi bilan boshlangan ism (keyin nol yoki undan ortiq belgilar). dagi % belgisi
WHERE bandining LIKE qolipi dan keyin istalgan miqdordagi belgilar paydo bo'lishi mumkinligini bildiradi
Familiyada D harfi. Naqsh qatori bitta tirnoqli belgilar bilan o'ralgan.

Naqsh mosligi: har qanday belgi


Naqsh qatoridagi pastki chiziq (_) o'sha pozitsiyadagi bitta joker belgini bildiradi.
naqshda. Misol uchun, quyidagi so'rov barcha mualliflarning qatorlarini topadi
familiyalari har qanday belgi bilan boshlanadigan (_ bilan ko'rsatilgan), keyin o harfi bilan boshlanadi
qo'shimcha belgilar soni bo'yicha (% bilan ko'rsatilgan):

Oldingi so'rov 24.14-rasmda ko'rsatilgan qatorni hosil qiladi, chunki faqat bitta muallif


bizning ma'lumotlar bazasida ikkinchi harf sifatida o harfini o'z ichiga olgan familiya mavjud.

Muallif identifikatori, ismi, familiyasini tanlang


Mualliflardan
QAYERDA familiya 'D%' KABI

AuthorID FirstName Familiya

1 Pol Deytel
2 Harvey Deitel
3 Abbey Deitel

24.13-rasm | Mualliflar jadvalidagi familiyasi D harfi bilan boshlangan mualliflar.

Portativlik bo'yicha maslahat 24.1
SQL katta-kichik harf sezgirligini aniqlash uchun ma'lumotlar bazasi tizimingiz hujjatlariga qarang
tizimingizda va SQL kalit so'zlari sintaksisini aniqlash uchun.

Portativlik bo'yicha maslahat 24.2


ni qo'llab-quvvatlashini aniqlash uchun ma'lumotlar bazasi tizimingiz hujjatlarini diqqat bilan o'qing
Bu yerda muhokama qilinganidek LIKE operatori.

Muallif identifikatori, ismi, familiyasini tanlang


Mualliflardan
QERDA Familiya '_o%' YOQTI

AuthorID FirstName Familiya

5 Maykl Morgano

24.14-rasm | Mualliflar jadvalidagi yagona muallif


familiyasida ikkinchi harf sifatida o harfi mavjud.

24.4 SQL 1055

24.4.3. BUYURT BO'YICHA
So'rov natijasidagi qatorlarni o'sish yoki kamayish tartibida tartiblash mumkin
ixtiyoriy ORDER BY bandi. ORDER BY bandi bilan so'rovning asosiy shakli

bu erda ASC o'sish tartibini belgilaydi (eng pastdan yuqoriga), DESC kamayish tartibini belgilaydi


(eng yuqoridan pastgacha) va ustun saralash asosidagi ustunni bildiradi. Imtihon uchun -
ple, mualliflar ro'yxatini familiya bo'yicha ortib borayotgan tartibda olish uchun (24.15-rasm), so'rovdan foydalaning.

Kamayish tartibida saralash


Standart tartiblash tartibi ortib bormoqda, shuning uchun ASC ixtiyoriy. Xuddi shu ro'yxatni olish uchun
thors familiyasi bo'yicha kamayish tartibida (24.16-rasm), so'rovdan foydalaning

Bir nechta ustunlar bo'yicha saralash


Shaklning ORDER BY bandi bilan tartiblash uchun bir nechta ustunlardan foydalanish mumkin

bu erda sortingOrder ASC yoki DESC bo'ladi. SortingOrder uchun bir xil bo'lishi shart emas


har bir ustun. So'rov

ustun nomi1, ustun nomi2, … jadvalName TARTIBI BO'YICHA ustun ustunini tanlang


TANLASH ustun nomi1, ustun nomi2, … jadval nomidan TARTIB BY ustuni DESC

Muallif identifikatori, ismi, familiyasini tanlang


Mualliflardan
Familiya bo'yicha BUYURTDI ASC

AuthorID FirstName Familiya

1 Pol Deytel
2 Harvey Deitel
3 Abbey Deitel
5 Maykl Morgano
4 Dan Quirk

24.15-rasm | Familiya bo'yicha o'sish tartibida mualliflar jadvalidagi namuna ma'lumotlari.

Muallif identifikatori, ismi, familiyasini tanlang
Mualliflardan
Familiyasi bo'yicha BUYURTDI DESC

AuthorID FirstName Familiya

4 Dan Quirk
5 Maykl Morgano
1 Pol Deytel
2 Harvey Deitel
3 Abbey Deitel

24.16-rasm | Familiya bo'yicha kamayish tartibida mualliflar jadvalidagi namuna ma'lumotlari.

1-ustun saralash tartibi, 2-ustun saralash tartibi, …

1056 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

barcha qatorlarni familiya bo'yicha, keyin ism bo'yicha o'sish tartibida tartiblaydi. Agar qatorlar mavjud bo'lsa
bir xil familiya qiymati, ular ism bo'yicha tartiblangan holda qaytariladi (24.17-rasm).

WHERE va ORDER BY bandlarini birlashtirish


WHERE va ORDER BY bandlari quyidagi kabi bir so'rovda birlashtirilishi mumkin

Sarlavhalardagi har bir kitobning ISBN, Sarlavha, Nashr raqami va mualliflik huquqini qaytaradi


"Qanday dasturlash kerak" bilan tugaydigan sarlavhaga ega jadval va ularni o'sish tartibida tartiblaydi
Sarlavha bo'yicha. So'rov natijalari 24.18-rasmda ko'rsatilgan.

24.4.4 Bir nechta jadvallardan ma'lumotlarni birlashtirish: INNER JOIN


Ma'lumotlar bazasi dizaynerlari ko'pincha ma'lumotlar bazasi mavjudligini ta'minlash uchun tegishli ma'lumotlarni alohida jadvallarga ajratadilar
ma'lumotlarni ortiqcha saqlamang. Masalan, kitoblar ma'lumotlar bazasida biz AuthorISBN jadvalidan foydalanamiz
mualliflar va ularning tegishli nomlari o'rtasidagi munosabatlar ma'lumotlarini saqlash uchun. Agar biz qilmagan bo'lsak
bu maʼlumotlarni alohida jadvallarga ajratsak, muallif haqidagi maʼlumotlarni kiritishimiz kerak boʻladi
Sarlavhalar jadvalidagi har bir yozuv bilan. Bu ma'lumotlar bazasida ikki nusxadagi autentifikatsiyani saqlashga olib keladi.

Muallif identifikatori, ismi, familiyasini tanlang


Mualliflardan
Familiya, Ism bo'yicha BUYURTMA

AuthorID FirstName Familiya

3 Abbey Deitel
2 Harvey Deitel
1 Pol Deytel
5 Maykl Morgano
4 Dan Quirk

24.17-rasm | Familiya va familiya bo'yicha o'sish tartibida mualliflardan namuna ma'lumotlari.

ISBN, sarlavha, nashr raqami, mualliflik huquqini tanlang
FROM Sarlavhalar
QAYERDA Sarlavha LIKE '%Qanday dasturlash kerak'
Title ASC BO'YICHA Buyurtma

ISBN Title EditionNumber Mualliflik huquqi

0133764036 Android 2 dastur 2015
013299044X C 7 2013-yilni qanday dasturlash kerak
0133378713 C++ qanday dasturlash 9 2014 yil
0132151006 Internet & World Wide Web Qanday Dasturlash 5 2012
0133807800 Java dasturlash 10 2015 yil
0133406954 Visual Basic 2012 Qanday dasturlash mumkin 6 2014
0133379337 Visual C# 2012 Qanday dasturlash mumkin 5 2014
0136151574 Visual C++ 2008 Qanday qilib dastur 2 2008

24.18-rasm | Jadvaldan kitoblar namunasi Sarlavhalari "Qanday dasturlash kerak" bilan tugaydigan sarlavhalar


Sarlavha bo'yicha o'sish tartibi.

24.4 SQL 1057

bir nechta kitob yozgan mualliflar uchun ma'lumot. Ko'pincha ma'lumotlarni birlashtirish kerak
bir nechta jadvallardan bitta natijaga. Jadvallarga qo'shilish deb ataladi, bu tomonidan belgilanadi
INNER JOIN operatori, u ikkita jadvaldagi satrlarni ustunlardagi qiymatlarni moslashtirish orqali birlashtiradi
jadvallar uchun umumiydir. INNER JOIN ning asosiy shakli:

INNER JOIN ning ON bandi har bir jadvalning birlashgan ustunlarini belgilaydi.


Qaysi qatorlar birlashtirilganligini aniqlash uchun ajratilgan - bu maydonlar deyarli har doim ga mos keladi
birlashtirilayotgan jadvallardagi xorijiy kalit maydonlari. Misol uchun, quyidagi so'rov a hosil qiladi
Har bir muallif tomonidan yozilgan kitoblar uchun ISBN ko'rsatilgan mualliflar ro'yxati:

So'rov Mualliflar jadvalidagi Ism va Familiya ustunlarini birlashtiradi


Natijalarni Familiya bo'yicha o'sish tartibida tartiblash AuthorISBN jadvalidagi ISBN ustuni
va Ism. ON bandida tableName.columnName sintaksisidan foydalanishga e'tibor bering. Bu
malakali nom deb ataladigan sintaksis har bir jadvalning birlashtirilishi kerak bo'lgan ustunlarini belgilaydi.
jadvallarga qo'shilish uchun tayyorlandi. "Jadval nomi." Agar ustunlar bir xil bo'lsa, sintaksis talab qilinadi
ikkala jadvaldagi nom. Xuddi shu sintaksis har qanday SQL bayonotida farqlash uchun ishlatilishi mumkin
bir xil nomga ega bo'lgan turli jadvallardagi ustunlar. Ba'zi tizimlarda jadval nomlari sifatga mos keladi.
ma'lumotlar bazasi nomi bilan ma'lumotlar bazasi o'zaro so'rovlarini bajarish uchun ishlatilishi mumkin. Har doimgidek,
so'rovda ORDER BY bandi bo'lishi mumkin. 24.19-rasmda oldingi natijalar ko'rsatilgan
familiya va familiya bo'yicha tartiblangan so'rov. [Izoh: Joyni tejash uchun biz natijani ajratamiz
har birida Ism, Familiya va ISBN ustunlarini o'z ichiga olgan ikkita ustunga so'rov.]

1 ustun nomi, ustun nomi2, …


1-jadvaldan
INNER JOIN jadvali 2
ON table1.columnName = table2.columnName

Ism, Familiya, ISBN ni tanlang


Mualliflardan
INNER JOIN AuthorISBN
ON Authors.AuthorID = AuthorISBN.AuthorID
Familiya, Ism bo'yicha BUYURTMA

Umumiy dasturlash xatosi 24.2


Ikki yoki undan ortiq jadvallarda bir xil nomga ega bo'lgan ustunlar uchun nomlarni talab qilmaslik
xato. Bunday hollarda, bayonot jadval nomlari bilan ustun nomlaridan oldin bo'lishi kerak
va nuqta (masalan, Authors.AuthorID).

Ism Familiya ISBN Ism Familiya ISBN

Abbey Deitel 0132121360 Harvey Deitel 0133764036
Abbey Deitel 0133570924 Harvey Deitel 0133378713
Abbey Deitel 0133764036 Harvey Deitel 0136151574
Abbey Deitel 0133406954 Harvey Deitel 0133379337
Abbey Deitel 0132990601 Harvey Deitel 0133406954
Abbey Deitel 0132151006 Harvey Deitel 0132990601
Harvey Deitel 0132121360 Harvey Deitel 013299044X
Harvey Deitel 0133570924 Harvey Deitel 0132575655

24.19-rasm | Mualliflar va ular yozgan kitoblar uchun ISBN ko'tarilgan namunalar


Familiya va ism bo'yicha buyurtma. (2-qismning 1-qismi.)

1058 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

24.4.5 INSERT bayonoti
INSERT iborasi jadvalga qator kiritadi. Ushbu bayonotning asosiy shakli

bu erda tableName - qator qo'shiladigan jadval. tableName dan keyin a


Qavslar ichidagi ustun nomlarining vergul bilan ajratilgan ro'yxati (agar IN-
SERT operatsiyasi jadvalning har bir ustuni uchun qiymatni to'g'ri tartibda belgilaydi). Ro'yxat
ustun nomlaridan keyin SQL kalit so'zi VALUES va vergul bilan ajratilgan ro'yxati keladi.
Qavslar ichidagi qiymatlar. Bu erda ko'rsatilgan qiymatlar keyin ko'rsatilgan ustunlarga mos kelishi kerak
jadval nomi ham tartibda, ham turda (masalan, agar ustun nomi1 birinchi ism bo'lishi kerak bo'lsa
ustun, keyin qiymat1 birinchi ismni ifodalovchi bitta tirnoq ichidagi satr bo'lishi kerak). Al-
yo'llar qatorlarni kiritishda ustunlarni aniq ro'yxatga oladi. Jadvalning ustunlar tartibi o'zgartirilsa
yoki yangi ustun qo'shilsa, faqat VALUES ishlatilsa, xatolik yuzaga kelishi mumkin. INSERT bayonoti

Mualliflar jadvaliga qator kiritadi. Bayonot qiymatlar taqdim etilganligini bildiradi


Ism va Familiya ustunlari. Tegishli qiymatlar "Sue" va "Smit".
Ushbu misolda biz mualliflik identifikatorini ko'rsatmayapmiz, chunki AuthorID avtomatik oshirilgan
Mualliflar jadvalidagi ustun. Ushbu jadvalga qo'shilgan har bir qator uchun DBMS a ni belgilaydi
avtomatik oshirilgan ketma-ketlikning keyingi qiymati bo'lgan yagona AuthorID qiymati (ya'ni, 1, 2,
3 va boshqalar). Bunday holda, Sue Redga AuthorID raqami 6 beriladi. 24.20-rasm
INSERT operatsiyasidan keyin Mualliflar jadvalini ko'rsatadi. [Izoh: Har bir ma'lumotlar bazasini boshqara olmaydi -
ment tizimi avtomatik oshirilgan ustunlarni qo'llab-quvvatlaydi. Hujjatlaringizni tekshiring
Avtomatik oshirilgan ustunlarga alternativalar uchun DBMS.]

Harvey Deitel 0133807800 Pol Deitel 0133406954


Harvey Deitel 0132151006 Pol Deitel 0132990601
Pol Deitel 0132121360 Pol Deitel 013299044X
Pol Deitel 0133570924 Pol Deitel 0132575655
Pol Deitel 0133764036 Pol Deitel 0133807800
Pol Deitel 0133378713 Pol Deitel 0132151006
Pol Deitel 0136151574 Maykl Morgano 0132121360
Pol Deitel 0133379337 Dan Quirk 0136151574

INSERT INTO tableName (ustun nomi1, ustun nomi2, …, ustun nomiN)


VALUES (qiymat1, qiymat2, …, qiymatN)

INSERT INTO Mualliflar (Ism, Familiya)


QIYMATLAR ('Sue', 'Qizil')

Umumiy dasturlash xatosi 24.3


SQL satrlarni bitta tirnoq (') bilan chegaralaydi. Bitta tirnoqli satr (masalan,
O'Malley) bitta qo'shtirnoq paydo bo'ladigan holatda ikkita bitta tirnoq bo'lishi kerak (masalan,
"O''Malley"). Birinchisi ikkinchisi uchun qochish belgisi sifatida ishlaydi. Yolg'izlikdan qochib qutulmaslik -
SQL bayonotining bir qismi bo'lgan satrdagi tirnoq belgilari SQL sintaksisi xatosidir.

Ism Familiya ISBN Ism Familiya ISBN

24.19-rasm | Mualliflar va ular yozgan kitoblar uchun ISBN ko'tarilgan namunalar
Familiya va ism bo'yicha buyurtma. (2-qismning 2-qismi.)

24.4 SQL 1059

24.4.6 YANGILANISH to'g'risidagi bayonot
UPDATE bayonoti jadvaldagi ma'lumotlarni o'zgartiradi. Uning asosiy shakli

bu erda tableName yangilanadigan jadvaldir. tableName dan keyin SET va a kalit so'zi keladi


ustun nomi = qiymat juftlarining vergul bilan ajratilgan ro'yxati. Ixtiyoriy WHERE bandi taqdim etadi
qaysi qatorlarni yangilash kerakligini aniqlaydigan mezonlar. Garchi shart bo'lmasa-da, WHERE bandi
har bir qatorga o'zgartirish kiritilmasa, odatda ishlatiladi. UPDATE bayonoti

Mualliflar jadvalidagi qatorni yangilaydi. Bayonot Familiya tayinlanishini bildiradi


Familiya Qizil va Ism Sue bo'lgan qator uchun qora qiymat. [Eslatma: Agar mavjud bo'lsa
bir nechta mos keladigan satrlar bo'lsa, bu bayonot familiyaga ega bo'lish uchun barcha qatorlarni o'zgartiradi
“Qora.”] Agar biz AuthorID ni UPDATE operatsiyasidan oldin bilsak (ehtimol, chunki
Biz uni avval qidirgan edik), WHERE bandini quyidagicha soddalashtirish mumkin:

24.21-rasmda YANGILASH operatsiyasi amalga oshirilgandan so'ng Mualliflar jadvali ko'rsatilgan.

Umumiy dasturlash xatosi 24.4
Avtomatik o'sish ustuni uchun qiymatni belgilash odatda xatodir.

AuthorID FirstName Familiya

1 Pol Deytel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Maykl Morgano
6 Sue Red

24.20-rasm | INSERT operatsiyasidan keyin Mualliflar jadvalidagi namuna ma'lumotlari.

Jadval nomini YANGILASH
SET ustun nomi1 = qiymat1, ustun nomi2 = qiymat2, …, ustun nomiN = qiymatN
WHERE mezonlari

YANGILANISh mualliflari


SET Familiyasi = "Qora"
WHERE Familiya = 'Qizil' VA Ism = 'Sue'

WHERE Muallif ID = 6

AuthorID FirstName Familiya

1 Pol Deytel


2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Maykl Morgano
6 Sue Black

24.21-rasm | YANGILANISH operatsiyasidan so‘ng Mualliflar jadvalidagi namuna ma’lumotlari.


1060 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

24.4.7 Bayonotni o'chirish
SQL DELETE bayonoti jadvaldan qatorlarni olib tashlaydi. Uning asosiy shakli

bu erda tableName - o'chiradigan jadval. Ixtiyoriy WHERE bandi ni belgilaydi


qaysi qatorlarni o'chirishni aniqlash uchun foydalaniladigan mezonlar. Agar ushbu band o'tkazib yuborilsa, jadvalning barcha qatorlari
o'chiriladi. DELETE bayonoti

Mualliflar jadvalidagi Sue Black uchun qatorni o'chiradi. Agar biz AuthorID ni oldindan bilsak


DELETE operatsiyasining WHERE bandini quyidagicha soddalashtirish mumkin:

24.22-rasmda DELETE operatsiyasi amalga oshirilgandan so'ng Mualliflar jadvali ko'rsatilgan.

24.5 Java ma'lumotlar bazasini o'rnatish
Ushbu bobning misollarida Oracle'ning sof Java ma'lumotlar bazasi Java DB ishlatiladi, u bilan o'rnatilgan
Windows, Mac OS X va Linuxda Oracle's JDK. Ushbu bobni bajarishdan oldin
ilovalar uchun Java DB da 24.6– bo'limlarida qo'llaniladigan kitoblar ma'lumotlar bazasini o'rnatishingiz kerak.
24.7 va 24.8-bo'limda foydalaniladigan manzillar kitobi ma'lumotlar bazasi.
Ushbu bo'lim uchun siz Java DB ning o'rnatilgan versiyasidan foydalanasiz. Bu shuni anglatadiki
Har bir misolda siz boshqaradigan ma'lumotlar bazasi ushbu misolning papkasida joylashgan bo'lishi kerak.
Ushbu bobning misollari ch24 misollar papkasining ikkita pastki papkasida joylashgan—
kitoblar_misollari va manzillar_misoli. Java DB ham server vazifasini bajarishi mumkin
tarmoq orqali ma'lumotlar bazasi so'rovlarini qabul qilish, lekin bu ushbu bobning doirasidan tashqarida.

JDK o'rnatish papkalari


Java DB dasturiy ta'minoti JDK o'rnatish direktsiyasining db pastki katalogida joylashgan.
ry. Quyida keltirilgan kataloglar Oracle'ning JDK 7 yangilanishi 51 uchun:
• Windows uchun 32-bitli JDK:
C:\Program Files (x86)\Java\jdk1.7.0_51
• Windows uchun 64-bitli JDK:
C:\Program Files\Java\jdk1.7.0_51

DELETE FROM tableName WHERE mezonlari

Mualliflardan Oʻchirish
WHERE Familiya = 'Qora' VA FirstName = 'Sue'

WHERE AuthorID = 5

AuthorID FirstName Familiya

1 Pol Deytel


2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Maykl Morgano

24.22-rasm | DELETE operatsiyasidan keyin mualliflar jadvalidagi namuna ma'lumotlari.


24.5 Java 1061 ma'lumotlar bazasini sozlash

• Mac OS X:
/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home
• Ubuntu Linux:
/usr/lib/jvm/java-7-oracle
Linux uchun o'rnatish joyi siz foydalanadigan o'rnatuvchiga va ehtimol versiyasiga bog'liq
Siz foydalanadigan Linux. Biz sinov uchun Ubuntu Linuxdan foydalandik.
Platformangizga qarab, JDK o'rnatish jildining nomi siz bo'lsa, farq qilishi mumkin
JDK 7 ning boshqa yangilanishidan foydalanish yoki JDK 8 dan foydalanish. Quyidagi ko'rsatmalarda siz
foydalanayotgan JDK versiyasi asosida JDK o'rnatish papkasining nomini yangilashi kerak.

Java ma'lumotlar bazasi konfiguratsiyasi


Java DB uni sozlash va ishga tushirish imkonini beruvchi bir nechta fayllar bilan birga keladi. Amalga oshirishdan oldin
bu fayllarni buyruqlar oynasidan olish uchun siz JAVA_HOME muhit oʻzgaruvchisini oʻrnatishingiz kerak
JDK ning yuqorida sanab o'tilgan aniq o'rnatish katalogiga (yoki siz kirgan joyingizga) qarang.
Agar u yuqorida sanab o'tilganlardan farq qilsa, JDK to'xtatildi). Boshlashdan oldin bo'limiga qarang
atrof-muhit o'zgaruvchilari haqida ma'lumot olish uchun ushbu kitob.

24.5.1 Windowsda bo'lim ma'lumotlar bazalarini yaratish


JAVA_HOME muhit o'zgaruvchisini o'rnatgandan so'ng, quyidagi amallarni bajaring:
1. Notepadni administrator sifatida ishga tushiring. Buni Windows 7 da amalga oshirish uchun Start > All-ni tanlang
Dasturlar > Aksessuarlar, Notepad-ni o'ng tugmasini bosing va Administrator sifatida ishga tushirish-ni tanlang. Yoniq
Windows 8, Notepad-ni qidiring, qidiruv natijalarida uni o'ng tugmasini bosing va tanlang
Ilovalar panelida Kengaytirilgan, keyin Administrator sifatida ishga tushirish-ni tanlang.
2. Bloknotda joylashgan setEmbeddedCP.bat ommaviy ish faylini oching
JDK o'rnatish jildining db\bin papkasi.
3. Chiziqni toping

va uni o'zgartiring

O'zgartirishlaringizni saqlang va ushbu faylni yoping.
4. Buyruqlar satri oynasini oching va kataloglarni JDK o'rnatish-ga o'zgartiring.
tion jildining db\bin papkasi. Keyin setEmbeddedCP.bat kiriting va sozlash uchun Enter tugmasini bosing
Java DB tomonidan talab qilinadigan muhit o'zgaruvchilari.
5. Ushbu bobning books_examples katalogiga o'tish uchun cd buyrug'idan foydalaning. Bu
katalogda kitoblar ma'lumotlar bazasini yaratadigan SQL skripti books.sql mavjud.
6. Quyidagi buyruqni bajaring (tirnoq belgisi bilan):

Java DB bilan ishlash uchun buyruq qatori vositasini ishga tushirish. Ikkita tirnoq


zarur, chunki %JAVA_HOME% muhit oʻzgaruvchisi koʻrsatadigan yoʻl
sends bo'sh joyni o'z ichiga oladi. Bu ij> so'rovini ko'rsatadi.

@rem o'rnatilgan DERBY_INSTALL=

@set DERBY_INSTALL=%JAVA_HOME%\db

"%JAVA_HOME%\db\bin\ij"


1062 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

7. ij> so'rovida yozing

va joriy katalogda kitoblar ma'lumotlar bazasini yaratish va yaratish uchun Enter tugmasini bosing


ma'lumotlar bazasiga kirish uchun parol bilan foydalanuvchi deitel.
8. Ma'lumotlar bazasi jadvalini yaratish va unga namuna ma'lumotlarini kiritish uchun biz faylni taqdim etdik
Ushbu misol katalogida address.sql. Ushbu SQL skriptini bajarish uchun yozing

Ma'lumotlar bazasini yaratganingizdan so'ng, taqdim etilgan SQL iboralarini bajarishingiz mumkin


Ularning bajarilishini tasdiqlash uchun 24.4-qism. ij> da kiritgan har bir buyruq
so'rov nuqtali vergul (;) bilan tugatilishi kerak.
9. Java DB buyruq qatori vositasini tugatish uchun kiriting

10. Kataloglarni ch24 misollarining addressbook_example pastki papkasiga o'zgartiring


manzilni yaratuvchi addressbook.sql SQL skriptini o'z ichiga olgan papka.
kitoblar bazasi. 6–9-bosqichlarni takrorlang. Har bir qadamda kitoblarni manzillar kitobi bilan almashtiring.
Endi siz ushbu bobdagi misollarni bajarishga tayyorsiz.
24.5.2 Mac OS X da bo'lim ma'lumotlar bazalarini yaratish
JAVA_HOME muhit o'zgaruvchisini o'rnatgandan so'ng, quyidagi amallarni bajaring:
1. Terminalni oching, so'ngra quyidagini kiriting:

va Enter tugmasini bosing. Keyin yozing

va Enter tugmasini bosing. Bu Mac kompyuteringizda Java DB qayerda joylashganligini bildiradi.
2. Terminal oynasida kataloglarni JDK o'rnatish papkasining db/ga o'zgartiring.
bin papkasi. Keyin, ./setEmbeddedCP ni kiriting va muhitni sozlash uchun Enter tugmasini bosing
Java DB tomonidan talab qilinadigan o'zgaruvchilar.
3. Terminal oynasida cd buyrug'i yordamida kitoblar_misollariga o'ting
katalog. Bu katalogda kitoblarni yaratuvchi books.sql SQL skripti mavjud
ma'lumotlar bazasi.
4. Quyidagi buyruqni bajaring (tirnoq belgisi bilan):

Java DB bilan ishlash uchun buyruq qatori vositasini ishga tushirish. Bu ko'rsatadi


ij> so'rov.
5. Kitoblar maʼlumotlar bazasini yaratish uchun 24.5.1-boʻlimning 7–9-bosqichlarini bajaring.
6. Adresbook_example katalogiga o'tish uchun cd buyrug'idan foydalaning. Bu rejissyor-
tory manzillar kitobi ma'lumotlar bazasini quradigan SQL skript addressbook.sql ni o'z ichiga oladi.

connect 'jdbc:derby:books;create=true;user=deitel;


parol=deitel';

"books.sql" ni ishga tushiring;

Chiqish;

DERBY_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/


Mundarija/Bosh sahifa/db

eksport DERBY_HOME

$JAVA_HOME/db/bin/ij

24.6 JDBC 1063 yordamida ma'lumotlar bazalarini manipulyatsiya qilish

7. Manzillar kitobi maʼlumotlar bazasini yaratish uchun 24.5.1-boʻlimning 7–9-bosqichlarini bajaring. Har birida
qadam, kitoblarni manzillar kitobi bilan almashtiring.
Endi siz ushbu bobdagi misollarni bajarishga tayyorsiz.

24.5.3 Linuxda bo'lim ma'lumotlar bazalarini yaratish


JAVA_HOME muhit o'zgaruvchisini o'rnatgandan so'ng, quyidagi amallarni bajaring:
1. Qobiq oynasini oching.
2. 24.5.2-bo'limdagi amallarni bajaring, lekin 1-bosqichda DERBY_HOME-ni o'rnating.

Bizning Ubuntu Linux tizimimizda bu:

Endi siz ushbu bobdagi misollarni bajarishga tayyorsiz.

24.6 JDBC bilan ma'lumotlar bazalarini manipulyatsiya qilish


Ushbu bo'limda ikkita misol keltirilgan. Birinchisi ma'lumotlar bazasiga qanday ulanishni va
so'rang. Ikkinchisi so'rov natijasini JTableda qanday ko'rsatishni ko'rsatadi.

24.6.1 Ma'lumotlar bazasiga ulanish va so'rov o'tkazish


24.23-rasmdagi misol kitoblar ma'lumotlar bazasida oddiy so'rovni bajaradi.
butun Mualliflar jadvali va ma'lumotlarni ko'rsatadi. Dastur ga ulanishni tasvirlaydi
ma'lumotlar bazasini so'rash va natijani qayta ishlash. Keyingi munozaralar -
dasturning asosiy JDBC jihatlarini kiritadi.
3–8 qatorlar JDBC interfeyslari va sinflarini java.sql paketidan import qiladi
dastur. Asosiy usul (12-48-qatorlar) kitoblar ma'lumotlar bazasiga ulanadi, ma'lumotlar bazasini so'raydi,
so'rov natijasini ko'rsatadi va ma'lumotlar bazasi ulanishini yopadi. 14-qator Stringni e'lon qiladi
ma'lumotlar bazasi URL uchun doimiy. Bu ulanish uchun ma'lumotlar bazasi nomini belgilaydi, deb
shuningdek, JDBC drayveri tomonidan ishlatiladigan protokol haqida ma'lumot (qisqacha muhokama qilinadi). Chiziqlar
15–16 muallif identifikatorini tanlaydigan SQL so'rovini ifodalovchi String konstantasini e'lon qiladi,
ma'lumotlar bazasi mualliflari jadvalidagi firstName va LastName ustunlari.

DERBY_HOME=YourLinuxJDKIInstallationFolder/db

DERBY_HOME=/usr/lib/jvm/java-7-oracle/db

1 // 24.23-rasm: DisplayAuthors.java


2 // Mualliflar jadvalining mazmunini ko'rsatish.
3 import java.sql.Connection;
4 import java.sql.Statement;
5 import java.sql.DriverManager;
6 import java.sql.ResultSet;
7 import java.sql.ResultSetMetaData;
8 import java.sql.SQLException;
9
10 ta ommaviy toifali DisplayAuthors
11 {

24.23-rasm | Mualliflar jadvalining mazmunini ko'rsatish. (2-qismning 1-qismi.)


1064 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

JDBC avtomatik drayverni aniqlashni qo'llab-quvvatlaydi - u ma'lumotlar bazasi drayverini xotiraga yuklaydi
Siz uchun. Dastur haydovchi sinfini aniqlay olishini ta'minlash uchun siz sinfni kiritishingiz kerak
dasturni bajarayotganda dasturning sinf yo'lidagi joylashuvi. Siz buni Java DB uchun qildingiz
24.5 bo'limida setEmbeddedCP.bat yoki setEmbeddedCP faylini ishga tushirganingizda

12 ta umumiy statik void main(String args[])


13 {
14
15
16
17
18
19
20
21
22
23
24 {
25 // ResultSet meta-ma'lumotlarini oling
26
27
28
29 System.out.printf("Mualliflar jadvali kitoblar bazasi:%n%n");
30
31 // ResultSet-dagi ustunlar nomlarini ko'rsatish
32 uchun (int i = 1; i <= soniOfColumns; i++)
33 System.out.printf("%-8s\t", );
34 System.out.println();
35
36 // so'rov natijalarini ko'rsatish
37 esa (resultSet.next())
38 {
39 uchun (int i = 1; i <= soniOfColumns; i++)
40 System.out.printf("%-8s\t", );
41 System.out.println();
42 }
43
44 catch (SQLException sqlException)
45 {
46 sqlException.printStackTrace();
47 }
48 }
49 } // oxirgi sinf DisplayAuthors

Mualliflar kitoblari ma'lumotlar bazasi:

AVTORID FIRSTNAME FAMİLYA
1 Pol Deytel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Maykl Morgano

24.23-rasm | Mualliflar jadvalining mazmunini ko'rsatish. (2-qismning 2-qismi.)

final String DATABASE_URL = "jdbc:derbi:kitoblar";
yakuniy satr SELECT_QUERY =
"Muallif ID, ism, familiyani mualliflardan tanlang";

// ma'lumotlar bazasiga ulanish va so'rovlar uchun resurslarni sinab ko'rishdan foydalaning


harakat qilib ko'ring (
Ulanish ulanishi = DriverManager.getConnection(
DATABASE_URL, "deitel", "deitel");
Bayonot bayonoti = connection.createStatement();
ResultSet resultsSet = statement.executeQuery(SELECT_QUERY))

ResultSetMetaData metaData = resultSet.getMetaData();


int numberOfColumns = metaData.getColumnCount();

metaData.getColumnName(i)

resultSet.getObject(i)

} // Avtomatik yopiladigan obyektlarni yopish usullari hozir chaqiriladi


24.6 JDBC 1065 bilan ma'lumotlar bazalarini manipulyatsiya qilish

tizim - bu qadam buyruqlar oynasida CLASSPATH muhit o'zgaruvchisini sozladi
platformangiz uchun. Buni qilgandan so'ng, siz ushbu dasturni oddiygina buyruq yordamida ishga tushirishingiz mumkin

Ma'lumotlar bazasiga ulanish


Ushbu misolda biz foydalanadigan JDBC interfeyslarining har biri AutoCloseable interfeysini kengaytiradi, shuning uchun
ushbu interfeyslarni amalga oshiradigan ob'ektlarni resurs bilan sinab ko'rish bayonoti bilan ishlatishingiz mumkin
(11.12-bandga kiritilgan). 19–23 qatorlar ushbu misolning AutoCloseable obyektlarini yaratadi
Qavslar ichida quyidagi kalit so'z try - bunday ob'ektlar avtomatik ravishda yopilganda
try bloki tugaydi (43-satr) yoki try blokining bajarilishi paytida istisno yuzaga kelsa.
Qavslar ichida try kalit so'zidan keyin yaratilgan har bir ob'ekt dan ajratilishi kerak
keyingi nuqtali vergul (;).
20–21 qatorlar connec- tomonidan havola qilingan Ulanish obyektini (java.sql paketi) yaratadi.
tion. Interfeysni amalga oshiradigan ob'ekt Ulanish o'rtasidagi aloqani boshqaradi
Java dasturi va ma'lumotlar bazasi. Ulanish obyektlari dasturlarga SQL yaratish imkonini beradi
ma'lumotlar bazasini boshqaradigan bayonotlar. Dastur natija bilan ulanishni ishga tushiradi
DriverManager sinfining getConnection statik usuliga qo'ng'iroq qilish (java.sql paketi),
URL manzilida ko'rsatilgan ma'lumotlar bazasiga ulanishga harakat qiladi.
getConnection usuli uchta argumentni oladi
• maʼlumotlar bazasi URL manzilini koʻrsatuvchi qator,
• foydalanuvchi nomini belgilaydigan string va
• parolni belgilaydigan string.
Kitoblar ma'lumotlar bazasi uchun foydalanuvchi nomi va parol 24.5-bo'limda o'rnatilgan. Agar foydalansangiz
u erda boshqa foydalanuvchi nomi va parol bo'lsa, foydalanuvchi nomini almashtirishingiz kerak bo'ladi (ikkinchi ar-
gument) va parol (uchinchi argument) 21-qatordagi getConnection usuliga o'tkazildi.
URL ma'lumotlar bazasini (ehtimol tarmoqda yoki mahalliy fayl tizimida
kompyuter). URL jdbc:derby:books aloqa uchun protokolni belgilaydi
(jdbc), aloqa uchun subprotokol (derbi) va ma'lumotlar bazasining joylashuvi
(kitoblar). Subprotokol derbisi dastur Java DB/Apache Derby-dan foydalanishini ko'rsatadi.
ma'lumotlar bazasiga ulanish uchun maxsus subprotokol - Java DB oddiygina Oracle ekanligini eslang
Apache Derbining markali versiyasi. DriverManager ma'lumotlar bazasiga ulana olmasa,
getConnection usuli SQLException (java.sql paketi) ni chiqaradi. 24.24-rasmdagi ro'yxatlar
JDBC drayveri nomlari va bir nechta mashhur RDBMSlarning ma'lumotlar bazasi URL formatlari.

java DisplayAuthors

RDBMS ma'lumotlar bazasi URL formati

MySQL jdbc: mysql://hostname:portNumber/databaseName


ORACLE jdbc:oracle:thin:@hostname:portNumber:databaseName
DB2 jdbc: db2: xost nomi: portNumber/ma'lumotlar bazasi nomi
PostgreSQL jdbc: postgresql://hostname:portNumber/databaseName
Java DB/Apache Derby jdbc:derby:dataBaseName (oʻrnatilgan)
jdbc:derby://hostname:portNumber/databaseName (tarmoq)

24.24-rasm | Mashhur JDBC ma'lumotlar bazasi URL formatlari. (2-qismning 1-qismi.)


1066 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

So'rovlarni bajarish uchun bayonot yaratish
24.23-rasmning 22-qatori obyektni olish uchun createStatement ulanish usulini chaqiradi.
interfeys bayonotini (java.sql paketini) amalga oshiradi. Dastur davlatdan foydalanadi-
SQL bayonotlarini ma'lumotlar bazasiga yuborish uchun ment ob'ekti.
So'rovni bajarish
23-qator tanlangan so'rovni yuborish uchun Statement ob'ektining executeQuery usulidan foydalaning
Mualliflar jadvalidagi barcha muallif ma'lumotlari. Bu usul amalga oshiradigan ob'ektni qaytaradi:
ments interfeysi ResultSet va so'rov natijalarini o'z ichiga oladi. ResultSet usullarini yoqish
so'rov natijasini manipulyatsiya qilish uchun dastur.
So'rov natijalari to'plamiga ishlov berish
26–42 qatorlar Natijalar to'plamini qayta ishlaydi. 26-qator ResultSet-ning ResultSetMetaData-ni oladi
(java.sql paketi) obyekti. Metadata ResultSet tarkibini tavsiflaydi. Dasturlar
ResultSet ustuni haqida ma'lumot olish uchun metama'lumotlardan dasturiy ravishda foydalanishi mumkin
nomlari va turlari. 27-qator olish uchun ResultSetMetaData getColumnCount usulidan foydalanadi
ResultSet-dagi ustunlar soni. 32–33 satrlarda ustun nomlari ko'rsatilgan.

37-42 qatorlar har bir ResultSet qatoridagi ma'lumotlarni ko'rsatadi. Birinchidan, dastur joylashtiradi


ResultSet kursori (qayta ishlanayotgan qatorga ishora qiluvchi) birinchi qatorga
Keyingi usul bilan ResultSet (37-qator). Keyingi usul, agar bo'lsa, mantiqiy qiymatni qaytaradi
keyingi qatorga joylashish imkoniyati; aks holda, usul false qaytaradi.

Agar ResultSet-da qatorlar mavjud bo'lsa, 39-40-satrlar tarkibini ajratib oling va ko'rsatadi.


joriy qatordagi har bir ustun. ResultSet ishlov berilganda, har bir ustun bo'lishi mumkin
ma'lum Java turi sifatida chiqariladi - ResultSetMetaData usuli getColumnType qaytaradi

Microsoft SQL Server jdbc:sqlserver://hostname:portNumber;databaseName=dataBaseName


Sybase jdbc:sybase:Tds:hostname:portNumber/ma'lumotlar bazasiName

Dasturiy ta'minot muhandisligi kuzatuvi 24.3


Ko'pgina ma'lumotlar bazasini boshqarish tizimlari ma'lumotlar bazasiga kirishdan oldin foydalanuvchidan tizimga kirishini talab qiladi
tarkibi. DriverManager getConnection usuli yoqilgan versiyalar bilan haddan tashqari yuklangan
kirish uchun foydalanuvchi nomi va parolni taqdim etish uchun dastur.

Dasturiy ta'minot muhandisligi kuzatuvi 24.4


Metadata dasturlarga batafsil ma'lumot berilganda ResultSet tarkibini dinamik ravishda qayta ishlash imkonini beradi
ResultSet haqida ma'lumot oldindan ma'lum emas.

Umumiy dasturlash xatosi 24.5


Dastlab, ResultSet kursori birinchi qatordan oldin joylashtiriladi. Agar SQLException sodir bo'lsa
ResultSet kursorini joylashtirishdan oldin ResultSet tarkibiga kirishga harakat qilasiz
keyingi usul bilan birinchi qator.

RDBMS ma'lumotlar bazasi URL formati

24.24-rasm | Mashhur JDBC ma'lumotlar bazasi URL formatlari. (2-qismning 2-qismi.)

24.6 JDBC 1067 yordamida ma'lumotlar bazalarini manipulyatsiya qilish

Turlar sinfidan doimiy tamsayı (java.sql to'plami) belgilangan turini ko'rsatadi
ustun. Dasturlar bu qiymatlardan ResultSet-ni chaqirish uchun switch bayonotida foydalanishi mumkin
ustun qiymatlarini mos Java turlari sifatida qaytaradigan usullar. Masalan, turi bo'lsa
ustunning turi Types.INTEGER, GetInt ResultSet usuli ustunni olish uchun ishlatilishi mumkin
qiymat int sifatida. Oddiylik uchun ushbu misol har bir qiymatni Ob'ekt sifatida ko'rib chiqadi. Biz topamiz
GetObject (40-satr) ResultSet usuli bilan har bir ustun qiymatini, keyin Ob'ektni chop eting
String tasviri. ResultSet get usullari odatda argument sifatida qabul qilinadi yoki a
ustun raqami (int sifatida) yoki ustun nomi (string sifatida) qaysi ustunni ko'rsatadi
olish qiymati. Massiv indekslaridan farqli o'laroq, ResultSet ustun raqamlari 1 dan boshlanadi.

Sinab ko'rish blokining oxiriga (43-qator) erishilganda, yopish usuli chaqiriladi


Resurslarni sinab ko'rish orqali olingan ResultSet, bayonot va ulanish
bayonot.

24.6.2 Kitoblar ma'lumotlar bazasini so'rash


Keyingi misol (24.25 va 24.28-rasmlar) foydalanuvchiga pro-ga har qanday so'rovni kiritish imkonini beradi.
gramm. Misol TableModel obyekti yordamida JTableda so'rov natijasini ko'rsatadi
JTablega ResultSet ma'lumotlarini taqdim etish. JTable - bu Swing GUI komponentidir
so'rov natijalarini ko'rsatish uchun ma'lumotlar bazasiga bog'lanishi mumkin. ResultSetTableModel sinfi
(24.25-rasm) TableModel orqali ma'lumotlar bazasiga ulanishni amalga oshiradi va
Natijalar to'plami. Class DisplayQueryResults (24.28-rasm) GUI ni yaratadi va in-
JTable uchun ma'lumotlarni taqdim etish uchun ResultSetTableModel sinfining pozitsiyasi.

Ishlash bo'yicha maslahat 24.1


Agar so'rov ma'lumotlar bazasidan tanlash uchun aniq ustunlarni ko'rsatsa, ResultSet tarkibiga kiradi
ustunlar belgilangan tartibda. Bunday holda, ustun raqamini olish uchun foydalaning
ustunning qiymati ustun nomini ishlatishdan ko'ra samaraliroq. ustun raqami pro-
ko'rsatilgan ustunga to'g'ridan-to'g'ri kirish imkonini beradi. Ustun nomidan foydalanish ni qidirishni talab qiladi
tegishli ustunni topish uchun ustun nomlari.

Xatolarning oldini olish bo'yicha maslahat 24.1


ResultSet dan qiymatlarni olish uchun ustun nomlaridan foydalanish xatolik kamroq bo'lgan kod ishlab chiqaradi
ustun raqami bo'yicha qiymatlarni olishdan ko'ra ko'proq moyil bo'ladi - siz rangni eslab qolishingiz shart emas.
umn buyurtma. Bundan tashqari, agar ustun tartibi o'zgarsa, kodingiz o'zgarishi shart emas.

Umumiy dasturlash xatosi 24.6


ResultSet dan qiymatlarni olishda 0 ustun indeksini ko'rsatish SQL-ni keltirib chiqaradi
Istisno - ResultSet-dagi birinchi ustun indeksi har doim 1 ga teng.

Umumiy dasturlash xatosi 24.7


Agar siz ResultSet-ni yopganingizdan so'ng uni boshqarishga harakat qilsangiz, SQLException paydo bo'ladi
Uni yaratgan bayonot. Bayonot yopilganda ResultSet o'chiriladi.

Dasturiy ta'minot muhandisligi kuzatuvi 24.5


Har bir bayonot ob'ekti bir vaqtning o'zida faqat bitta ResultSet ob'ektini ochishi mumkin. Bayonot qachon
yangi ResultSet-ni qaytaradi, Bayonot oldingi ResultSet-ni yopadi. Bir nechta foydalanish uchun
Natijalar to'plami parallel, alohida bayonot ob'ektlari ResultSets-ni qaytarishi kerak.

1068 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

ResultSetTableModel klassi
ResultSetTableModel sinfi (24.25-rasm) AbstractTableModel sinfini kengaytiradi (paket).
javax.swing.table), TableModel interfeysini amalga oshiradi. ResultSetTableModel
TableModel usullarini bekor qiladi getColumnClass, getColumnCount, getColumnName, get-
RowCount va getValueAt. TableModel usullarining standart ilovalari -
CellEditable va setValueAt (AstractTableModel tomonidan taqdim etilgan) bekor qilinmaydi,
chunki bu misol JTable hujayralarini tahrirlashni qo'llab-quvvatlamaydi. Standart amalga oshirish -
AddTableModelListener va removeTableModelListener TableModel usullarining xususiyatlari
(AstractTableModel tomonidan taqdim etilgan) bekor qilinmaydi, chunki ilovalar
AbstractTableModel-dagi ushbu usullar voqea tinglovchilarini to'g'ri qo'shish va olib tashlash.

1 // 24.25-rasm: ResultSetTableModel.java


2 // JTablega ResultSet ma'lumotlarini ta'minlovchi TableModel.
3 import java.sql.Connection;
4 import java.sql.Statement;
5 import java.sql.DriverManager;
6 import java.sql.ResultSet;
7 import java.sql.ResultSetMetaData;
8 import java.sql.SQLException;
9 import javax.swing.table.AbstractTableModel;
10
11 // ResultSet satrlari va ustunlari 1 va JTabledan hisoblanadi
12 // satr va ustunlar 0 dan hisoblanadi. Qayta ishlashda
13 // JTableda foydalanish uchun ResultSet qatorlari yoki ustunlari
14 // manipulyatsiya qilish uchun satr yoki ustun raqamiga 1 qo'shish kerak
15 // tegishli ResultSet ustuni (ya'ni, JTable ustuni 0
16 // ResultSet ustuni 1 va JTable 0 qatori ResultSet qatori 1).
17
18 {
19 xususiy yakuniy Ulanish ulanishi;
20 xususiy yakuniy bayonot;
21 shaxsiy Natijalar toʻplami natijalar toʻplami;
22 shaxsiy ResultSetMetaData metaData;
23 xususiy int raqamiOfRows;
24
25
26
27
28 // konstruktor resultsSet-ni ishga tushiradi va uning metadata ob'ektini oladi;
29 // qatorlar sonini aniqlaydi
30 ommaviy ResultSetTableModel (String url, String foydalanuvchi nomi,
31 String paroli, String so'rovi) SQLExceptionni chiqaradi
32 {
33 // ma'lumotlar bazasiga ulanish
34 ulanish = DriverManager.getConnection (url, foydalanuvchi nomi, parol);
35
36
37
38
39

24.25-rasm | JTablega ResultSet ma'lumotlarini ta'minlovchi TableModel. (4-qismning 1-qismi.)

umumiy sinf ResultSetTableModel AbstractTableModelni kengaytiradi

// ma'lumotlar bazasiga ulanish holatini kuzatib boring


xususiy mantiqiy bog'langanToDatabase = noto'g'ri;

// ma'lumotlar bazasi so'rovi uchun bayonot yaratish


bayonot = connection.createStatement(
ResultSet.TYPE_SCROLL_INSESITIVE,
ResultSet.CONCUR_READ_ONLY);

24.6 JDBC 1069 bilan ma'lumotlar bazalarini manipulyatsiya qilish

40
41
42
43
44 // so'rovni o'rnating va uni bajaring
45 setQuery(so'rov);
46 }
47
48 // ustun turini ifodalovchi sinfni oling
49 IllegalStateException ni chiqaradi
50 {
51
52
53
54
55 // ustunning Java sinfini aniqlang
56 urinib ko'ring
57 {
58
59
60
61
62 }
63 ushlash (istisno istisno)
64 {
65 exception.printStackTrace();
66 }
67
68 Object.classni qaytarish; // agar yuqorida muammolar yuzaga kelsa, Ob'ekt turini qabul qiling
69 }
70
71 // ResultSet-dagi ustunlar sonini oling
72 IllegalStateException ni chiqaradi
73 {
74 // ma'lumotlar bazasiga ulanish mavjudligiga ishonch hosil qiling
75 agar (!connectedToDatabase)
76 yangi IllegalStateException ("Ma'lumotlar bazasiga ulanmagan");
77
78 // ustunlar sonini aniqlang
79 urinib ko'ring
80 {
81 qaytish metaData.getColumnCount();
82 }
83 catch (SQLException sqlException)
84 {
85 sqlException.printStackTrace();
86 }
87
88 qaytish 0; // agar yuqorida muammolar yuzaga kelsa, ustunlar soni uchun 0 ni qaytaring
89 }
90

24.25-rasm | JTablega ResultSet ma'lumotlarini ta'minlovchi TableModel. (4 qismning 2-qismi.)

// ma'lumotlar bazasiga ulanish holatini yangilash
connectToDatabase = rost;

umumiy sinf getColumnClass(int ustuni)

// ma'lumotlar bazasiga ulanish mavjudligiga ishonch hosil qiling
agar (!connectedToDatabase)
yangi IllegalStateException ("Ma'lumotlar bazasiga ulanmagan");

String className = metaData.getColumnClassName(ustun + 1);

// className ni ifodalovchi Class obyektini qaytaring
qaytish Class.forName(className);

public int getColumnCount()


1070 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

91 // ResultSet-da ma'lum bir ustun nomini oling
92 IllegalStateException ni chiqaradi
93 {
94 // ma'lumotlar bazasiga ulanish mavjudligiga ishonch hosil qiling
95 agar (!connectedToDatabase)
96 yangi IllegalStateException ("Ma'lumotlar bazasiga ulanmagan");
97
98 // ustun nomini aniqlang
99 urinib ko'ring
100 {
101 qaytish metaData.getColumnName(ustun + 1);
102 }
103 catch (SQLException sqlException)
104 {
105 sqlException.printStackTrace();
106 }
107
108 qaytarish ""; // muammo bo'lsa, ustun nomi uchun bo'sh qatorni qaytaring
109 }
110
111 // ResultSet-dagi qatorlar sonini qaytaring
112 IllegalStateExceptionni chiqaradi
113 {
114 // ma'lumotlar bazasiga ulanish mavjudligiga ishonch hosil qiling
115 agar (!connectedToDatabase)
116 yangi IllegalStateException ("Ma'lumotlar bazasiga ulanmagan");
117
118 qaytish raqamiOfRows;
119 }
120
121 // alohida satr va ustunda qiymatni oling
122
123 IllegalStateException ni chiqaradi
124 {
125 // ma'lumotlar bazasiga ulanish mavjudligiga ishonch hosil qiling
126 agar (!connectedToDatabase)
127 yangi IllegalStateException ("Ma'lumotlar bazasiga ulanmagan");
128
129 // belgilangan ResultSet satri va ustunida qiymat oling
130 urinib ko'ring
131 {
132
133
134 }
135 ta tutish (SQLException sqlException)
136 {
137 sqlException.printStackTrace();
138 }
139
140 qaytarish ""; // muammo bo'lsa, bo'sh string ob'ektini qaytaring
141 }

24.25-rasm | JTablega ResultSet ma'lumotlarini ta'minlovchi TableModel. (4 qismning 3-qismi.)

umumiy String getColumnName (int ustuni)

public int getRowCount()

umumiy ob'ekt getValueAt (int qator, int ustun)

resultSet.absolute(satr + 1);


return resultSet.getObject(ustun + 1);

24.6 JDBC 1071 bilan ma'lumotlar bazalarini manipulyatsiya qilish

ResultSetTableModel konstruktori
ResultSetTableModel konstruktori (30-46 qatorlar) to'rtta String argumentini qabul qiladi -
ma'lumotlar bazasi URL manzili, foydalanuvchi nomi, parol va bajariladigan standart so'rov.
Konstruktor o'z tanasida yuzaga keladigan har qanday istisnolarni ilovaga qaytaradi
Ilova qanday qilishni aniqlashi uchun ResultSetTableModel obyektini yaratdi

142
143 // yangi ma'lumotlar bazasi so'rovi qatorini o'rnating


144 umumiy bekor setQuery (String so'rovi)
145 SQLException, IllegalStateExceptionni tashlaydi
146 {
147 // ma'lumotlar bazasiga ulanish mavjudligiga ishonch hosil qiling
148 agar (!connectedToDatabase)
149 yangi IllegalStateException ("Ma'lumotlar bazasiga ulanmagan");
150
151 // so'rovni belgilang va uni bajaring
152 resultsSet = statement.executeQuery(so'rov);
153
154 // ResultSet uchun metadata olish
155 metadata = resultSet.getMetaData();
156
157 // ResultSet-dagi qatorlar sonini aniqlang
158 natijaSet.last(); // oxirgi qatorga o'tish
159 numberOfRows = resultSet.getRow(); // qator raqamini oling
160
161
162
163 }
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 } // yakuniy sinf ResultSetTableModel

24.25-rasm | JTablega ResultSet ma'lumotlarini ta'minlovchi TableModel. (4 qismning 4-qismi.)

// JTable-ga model o'zgarganligi haqida xabar bering
fireTableStructureChanged();

// Bayonot va ulanishni yoping


public void disconnectFromDatabase()
{
agar (Ma'lumotlar bazasiga ulangan)
{
// Bayonot va ulanishni yoping
harakat qilib ko'ring
{
resultSet.close();
statement.close();
ulanish.yopish();
}
catch (SQLException sqlException)
{
sqlException.printStackTrace();
}
nihoyat // ma'lumotlar bazasiga ulanish holatini yangilash
{
connectToDatabase = noto'g'ri;
}
}
}

1072 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

istisnoni hal qilish (masalan, xato haqida xabar berish va dasturni tugatish). 34-qator
ma'lumotlar bazasiga ulanishni ta'minlaydi. 37-39-qatorlar ulanish usulini chaqiradi createState-
Bayonot obyektini yaratish uchun ment. Ushbu misol usulning versiyasidan foydalanadi
createStatement ikkita argumentni oladi - natijalar to'plami turi va natijalar to'plami mos keladi.
renta. Natijalar to'plamining turi (24.26-rasm) ResultSet kursori
ikkala yo'nalishda yoki faqat oldinga aylantiring va ResultSet o'zgarishlarga sezgirmi
asosiy ma'lumotlar asosida tuzilgan.

O'zgarishlarga sezgir bo'lgan natijalar to'plami bu o'zgarishlar kiritilgandan so'ng darhol aks etadi


ResultSet interfeysi usullari bilan yaratilgan. Agar ResultSet o'zgarishlarga sezgir bo'lmasa,
ResultSet-ni yaratgan so'rov kiritilgan o'zgarishlarni aks ettirish uchun qayta bajarilishi kerak.
Natijalar to'plamining parallelligi (24.27-rasm) ResultSet yangilanishi mumkinligini aniqlaydi.
ResultSet yangilash usullari bilan.

ResultSet doimiy Tavsif

TYPE_FORWARD_ONLY Natijalar to‘plami kursori faqat oldinga siljishi mumkinligini bildiradi.
yo'nalish (ya'ni, ResultSet da birinchi qatordan oxirgi qatorga).
TYPE_SCROLL_INSENSITIVE Natijalar to‘plami kursori har ikki yo‘nalishda ham aylana olishini bildiradi.
va davomida asosiy ma'lumotlarga kiritilgan o'zgarishlar
ResultSet-ni qayta ishlash ResultSet-da aks ettirilmaydi
dastur yana ma'lumotlar bazasini so'raydi.
TYPE_SCROLL_SENSITIVE Natijalar to‘plami kursori har ikki yo‘nalishda ham aylana olishini bildiradi.
ResultSet davomida asosiy ma'lumotlarga kiritilgan o'zgarishlar
qayta ishlash darhol ResultSet da aks ettiriladi.

24.26-rasm | ResultSet turini belgilash uchun ResultSet konstantalari.

Portativlik bo'yicha maslahat 24.3
Ba'zi JDBC drayverlari aylantiriladigan ResultSets-ni qo'llab-quvvatlamaydi. Bunday hollarda haydovchi
kursor faqat oldinga siljishi mumkin bo'lgan ResultSet ni qaytaradi. Qo'shimcha ma'lumot uchun -
maʼlumotlar bazasi drayveri hujjatlarini koʻring.

Umumiy dasturlash xatosi 24.8


Ma'lumotlar bazasi drayveri ishlayotganida kursorni ResultSet orqali orqaga siljitishga urinish
orqaga o'tishni qo'llab-quvvatlamaydi SQLFeatureNotSupportedException sabab bo'ladi.

ResultSet statik


parallellik doimiysi Tavsif

CONCUR_READ_ONLY Natijalar to'plamini yangilab bo'lmasligini bildiradi - ResultSet konfiguratsiyasiga o'zgartirishlar


chodirlarni ResultSet yangilash usullari bilan ma'lumotlar bazasida aks ettirib bo'lmaydi.
CONCUR_UPDATABLE ResultSet yangilanishi mumkinligini bildiradi (ya'ni, uning mazmuniga o'zgartirishlar kiritilishi mumkin)
ResultSet yangilash usullari bilan ma'lumotlar bazasida aks ettirilishi mumkin).

24.27-rasm | Natija xususiyatlarini belgilash uchun ResultSet konstantalari.


24.6 JDBC 1073 yordamida ma'lumotlar bazalarini manipulyatsiya qilish

Ushbu misolda aylantiriladigan, o'zgarishlarni sezmaydigan va faqat o'qiladigan ResultSet ishlatiladi.
45-qator (24.25-rasm) standart so'rovni bajarish uchun setQuery usulini (144-163-qatorlar) chaqiradi.
GetColumnClass ResultSetTableModel usuli
getColumnClass usuli (49–69-qatorlar) yuqori sinfni ifodalovchi Class obyektini qaytaradi
ma'lum bir ustundagi barcha ob'ektlar. JTable ushbu ma'lumotni o'chirishni sozlash uchun ishlatadi.
JTabledagi ushbu ustun uchun xato hujayra renderer va hujayra muharriri. 58-qator ResultSet-dan foydalanadi
MetaData usuli getColumnClassName uchun to'liq malakali sinf nomini olish uchun
belgilangan ustun. 61-qator sinfni yuklaydi va tegishli Class obyektini qaytaradi. Agar a
istisno sodir bo'lsa, 63-66-qatorlardagi ushlash stek izini chop etadi va 68-satr Ob-ni qaytaradi.
ject.class — Ob'ekt sinfini ifodalovchi Sinf namunasi — standart tur sifatida. [Eslatma:
58-qatorda argument ustuni + 1 ishlatiladi. Massivlar singari JTable satr va ustun raqamlari ham
0 dan hisoblanadi. Biroq, ResultSet satr va ustun raqamlari 1 dan hisoblanadi. Shunday qilib,
JTableda foydalanish uchun ResultSet satrlari yoki ustunlarini qayta ishlashda unga 1 qo'shish kerak.
tegishli ResultSet satri yoki ustunini boshqarish uchun satr yoki ustun raqami.]
ResultSetTableModel usuli getColumnCount
getColumnCount usuli (72–89-qatorlar) modeldagi ustunlar sonini qaytaradi.
aniq natijalar to'plami. 81-qator olish uchun ResultSetMetaData getColumnCount usulidan foydalanadi
ResultSet-dagi ustunlar soni. Agar istisno yuzaga kelsa, 83-qatordagi ushlash.
86 stek izini chop etadi va 88-satr standart ustunlar soni sifatida 0 ni qaytaradi.
ResultSetTableModel usuli getColumnName
getColumnName usuli (92–109-qatorlar) modelning un-kodidagi ustun nomini qaytaradi.
aniq natijalar to'plami. 101-qator olish uchun ResultSetMetaData getColumnName usulidan foydalanadi
ResultSet dan ustun nomi. Agar istisno ro'y bersa, 103-106 qatorlarda ushlang
stek izini chop etadi va 108-satr bo'sh qatorni standart ustun nomi sifatida qaytaradi.
ResultSetTableModel usuli getRowCount
getRowCount usuli (112–119-qatorlar) model ostidagi qatorlar sonini qaytaradi.
yolg'on ResultSet. setQuery usuli (144–163-qatorlar) so'rovni bajarganda, u so'rovni saqlaydi
numberOfRows o'zgaruvchisidagi qatorlar soni.
GetValueAt ResultSetTableModel usuli
getValueAt usuli (122-141-qatorlar) ob'ektni ma'lum bir qator va ustunga qaytaradi.
modelning asosiy ResultSet. 132-qatorda joylashish uchun mutlaq ResultSet usuli qo'llaniladi
ma'lum bir qatordagi ResultSet kursorini. 133-qator ob'ektlar uchun GetObject ResultSet usulidan foydalanadi.
Ob'ektni joriy qatorning ma'lum bir ustuniga qo'ying. Agar istisno yuzaga kelsa, ushlang
135–138 qatorlar stek izini chop etadi va 140-satr bo'sh satrni standart qiymat sifatida qaytaradi.

Portativlik bo'yicha maslahat 24.4


Ba'zi JDBC drayverlari yangilanadigan ResultSets-ni qo'llab-quvvatlamaydi. Bunday hollarda haydovchi
cally faqat o'qish uchun ResultSet ni qaytaradi. Qo'shimcha ma'lumot olish uchun ma'lumotlar bazasi drayveri hujjatiga qarang.
umentatsiya.

Umumiy dasturlash xatosi 24.9


Ma'lumotlar bazasi drayveri yangilanishini qo'llab-quvvatlamasa, ResultSet-ni yangilashga urinish
ResultSets SQLFeatureNotSupportedExceptions sabab bo'ladi.

1074 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

ResultSetTableModel usuli setQuery
setQuery usuli (144–163-qatorlar) olish uchun argument sifatida olingan so‘rovni bajaradi.
yangi ResultSet (152-qator). 155-qator yangi natija uchun ResultSetMetaData-ni oladi.
Oʻrnatish. 158-qatorda ResultSet kursorini oxirgi joyga joylashtirish uchun ResultSet usulidan foydalaniladi
Natijalar to'plamidagi qator. [Izoh: Jadvalda ko'p qatorlar bo'lsa, bu sekin bo'lishi mumkin.] 159-qator
Re-dagi joriy qator uchun satr raqamini olish uchun GetRow ResultSet usulidan foydalanadi.
sultSet. 162-qator fireTableStructureChanged usulini chaqiradi (sinfdan meros qilib olingan)
AbstractTableModel) ushbu ResultSetTableModel ob'ektidan foydalangan holda har qanday JTableni xabardor qilish uchun
model tuzilishi o'zgargan model. Bu JTableni qayta to'ldirishga olib keladi
uning satrlari va ustunlari yangi ResultSet ma'lumotlari bilan. setQuery usuli har qanday istisnolarni chiqaradi -
uning tanasida paydo bo'ladigan tions, setQuery-ni chaqirgan dasturga qaytadi.
ResultSetTableModel usuli disconnectFromDatabase
DisconnectFromDatabase usuli (166–186-qatorlar) tegishli terminalni amalga oshiradi.
ResultSetTableModel sinfi uchun tion usuli. Sinf dizayneri ommani ta'minlashi kerak
sinf mijozlari ob'ektga ega bo'lgan bepul resurslarga aniq murojaat qilishlari kerak bo'lgan usul
ishlatilgan. Bunday holda disconnectFromDatabase usuli ResultSet, Statementni yopadi
va Ulanish (173–175-qatorlar), ular cheklangan resurslar hisoblanadi. ning mijozlari
ResultSetTableModel klassi har doim bu usulga misol bo'lganda uni chaqirishi kerak
sinf endi kerak emas. Resurslarni chiqarishdan oldin, 168-satr ulanganligini tekshiradi.
tion allaqachon tugatilgan. Agar yo'q bo'lsa, usul davom etadi. Sinfdagi boshqa usullar
Agar ConnectToDatabase bo'lsa, sultSetTableModel har biri IllegalStateExceptionni chiqaradi
yolg'on. DisconnectFromDatabase usuli connectToDatabase ni yolg'onga o'rnatadi (183-qator)
mijozlar ushbu misoldan keyin ResultSetTableModel namunasidan foydalanmasligiga ishonch hosil qilish uchun
allaqachon tugatilgan. IllegalStateException Java kutubxonasidan istisno hisoblanadi.
bu xatolik holatini ko'rsatish uchun mos.
DisplayQueryResults klassi
Class DisplayQueryResults (24.28-rasm) ilovaning GUI-ni amalga oshiradi va o'zaro ta'sir qiladi.
JTable obyekti orqali ResultSetTableModel bilan. Ushbu ilova ham ko'rsatadi
JTable saralash va filtrlash imkoniyatlari.

1 // 24.28-rasm: DisplayQueryResults.java


2 // Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish.
3 import java.awt.BorderLayout;
4 import java.awt.event.ActionListener;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.WindowAdapter;
7 import java.awt.event.WindowEvent;
8 import java.sql.SQLException;
9 import java.util.regex.PatternSyntaxException;
10 import javax.swing.JFrame;
11 import javax.swing.JTextArea;
12 import javax.swing.JScrollPane;
13 import javax.swing.ScrollPaneConstants;
14
15 import javax.swing.JOptionPane;

24.28-rasm | Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish. (5-qismning 1-qismi.)

import javax.swing.JTable;

24.6 JDBC 1075 bilan ma'lumotlar bazalarini manipulyatsiya qilish

16 import javax.swing.JButton;
17 import javax.swing.Box;
18 import javax.swing.JLabel;
19 import javax.swing.JTextField;
20
21
22
23
24 umumiy sinf DisplayQueryResults JFrame-ni kengaytiradi
25 {
26 // ma'lumotlar bazasi URL manzili, foydalanuvchi nomi va parol
27 xususiy statik final String DATABASE_URL = "jdbc:derbi:kitoblar";
28 xususiy statik yakuniy String USERNAME = "deitel";
29 xususiy statik final String PASSWORD = "deitel";
30
31 // standart so'rov Mualliflar jadvalidagi barcha ma'lumotlarni oladi
32 xususiy statik final String DEFAULT_QUERY = "Mualliflardan * TANGLASH";
33
34 xususiy statik ResultSetTableModel tableModel;
35
36 ta umumiy statik void main(String args[])
37 {
38 // ResultSetTableModel yarating va ma'lumotlar bazasi jadvalini ko'rsating
39 urinib ko'ring
40 {
41
42
43
44
45 // JTextArea ni sozlang, unda foydalanuvchi so'rovlarni yozadi
46 yakuniy JTextArea queryArea = yangi JTextArea(DEFAULT_QUERY, 3, 100);
47 queryArea.setWrapStyleWord(to'g'ri);
48 queryArea.setLineWrap(rost);
49
50 JScrollPane scrollPane = yangi JScrollPane (queryArea,
51 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
52 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
53
54 // so'rovlarni yuborish uchun JButton-ni o'rnating
55 JButton submitButton = yangi JButton ("So'rov yuborish");
56
57 // queryArea joylashuvini boshqarish uchun Box yaratish va
58 // GUI-da yuborish tugmasi
59 Box boxNorth = Box.createHorizontalBox();
60 boxNorth.add(scrollPane);
61 boxNorth.add(submitButton);
62
63
64
65
66 JLabel filterLabel = yangi JLabel("Filtr:");
67 yakuniy JTextField filterText = new JTextField();
68 JButton filterButton = yangi JButton("Filtrni qo'llash");

24.28-rasm | Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish. (5-qismning 2-qismi.)

import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import javax.swing.table.TableModel;

// SELECT * FROM Authors so'rovi natijalari uchun TableModel yarating


tableModel = yangi ResultSetTableModel(DATABASE_URL,
USERNAME, PASSWORD, DEFAULT_QUERY);

// tableModel asosida JTable yarating


JTable resultTable = yangi JTable(tableModel);

1076 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

69 Box boxSouth = Box.createHorizontalBox();
70
71 boxSouth.add(filterLabel);
72 boxSouth.add(filtrText);
73 boxSouth.add(filterButton);
74
75 // GUI komponentlarini JFrame kontent paneliga joylashtiring
76 JFrame oynasi = yangi JFrame("So'rov natijalarini ko'rsatish");
77 add(boxNorth, BorderLayout.NORTH);
78 qo'shish(yangi JScrollPane(natijalar jadvali), BorderLayout.CENTER);
79 qo'shish(boxSouth, BorderLayout.SOUTH);
80
81 // submitButton uchun hodisa tinglovchisini yarating
82 submitButton.addActionListener(
83 ta yangi ActionListener()
84 {
85 ommaviy bekor harakat bajarildi (ActionEvent hodisasi)
86 {
87 // yangi so'rovni bajaring
88 urinib ko'ring
89 {
90
91 }
92 catch (SQLException sqlException)
93 {
94 JOptionPane.showMessageDialog(null,
95 sqlException.getMessage(), "Ma'lumotlar bazasi xatosi",
96 JOptionPane.ERROR_MESSAGE);
97
98 // noto'g'ri foydalanuvchi so'rovini tiklashga harakat qiling
99 // standart so'rovni bajarish orqali
100 sinash
101 {
102
103 queryArea.setText(DEFAULT_QUERY);
104 }
105 tutish (SQLException sqlException2)
106 {
107 JOptionPane.showMessageDialog(null,
108 sqlException2.getMessage(), "Ma'lumotlar bazasi xatosi",
109 JOptionPane.ERROR_MESSAGE);
110
111
112
113
114 System.exit(1); // ilovani tugatish
115 }
116 }
117 }
118 }
119);
120

24.28-rasm | Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish. (5-qismning 3-qismi.)

tableModel.setQuery(queryArea.getText());

tableModel.setQuery(DEFAULT_QUERY);

// ma'lumotlar bazasi ulanishi yopilganligiga ishonch hosil qiling
tableModel.disconnectFromDatabase();

24.6 JDBC 1077 bilan ma'lumotlar bazalarini manipulyatsiya qilish

121
122
123
124
125 // filterButton uchun tinglovchi yaratish
126 filterButton.addActionListener(
127 ta yangi ActionListener()
128 {
129 // tinglovchiga matnni filtrlash
130 ommaviy bekor harakat bajarildi(ActionEvent e)
131 {
132 String matni = filterText.getText();
133
134 agar (text.length() == 0)
135
yana 136
137 {
138 urinib ko'ring
139 {
140
141
142 }
143 catch (PatternSyntaxException pse)
144 {
145 JOptionPane.showMessageDialog(null,
146 "Yomon regex naqsh", "Yomon regex naqsh",
147 JOptionPane.ERROR_MESSAGE);
148 }
149 }
150 }
151 }
152);
153 // foydalanuvchi dasturdan chiqqanda oynani yo'q qilish (bu bekor qiladi
154 // HIDE_ON_CLOSE standarti)
155 window.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
156 window.setSize(500, 250);
157 window.setVisible(rost);
158
159 // foydalanuvchi dasturdan chiqqanda ma'lumotlar bazasi yopilganligiga ishonch hosil qiling
160 addWindowListener(
161 yangi WindowAdapter()
162 {
163
164
165
166
167
168
169 }
170);
171 }
172 catch (SQLException sqlException)
173 {

24.28-rasm | Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish. (5-qismning 4-qismi.)

final TableRowSorter tartiblovchi =
new TableRowSorter(tableModel);
resultTable.setRowSorter(saralovchi);

sorter.setRowFilter(null);

sorter.setRowFilter(
RowFilter.regexFilter(matn));

// ma'lumotlar bazasidan uzing va oyna yopilgandan keyin chiqing


umumiy bekor oynasiClosed(WindowEvent hodisasi)
{
tableModel.disconnectFromDatabase();
System.exit(0);
}

1078 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

27-29 va 32-qatorlar URL, foydalanuvchi nomi, parol va standart so'rovni e'lon qiladi.
ga dastlabki ulanishni amalga oshirish uchun ResultSetTableModel konstruktoriga uzatiladi
ma'lumotlar bazasini yarating va standart so'rovni bajaring. Asosiy usul (36-179-qatorlar) a yaratadi

174 JOptionPane.showMessageDialog(null, sqlException.getMessage(),


175 "Ma'lumotlar bazasi xatosi", JOptionPane.ERROR_MESSAGE);
176
177 System.exit(1); // ilovani tugatish
178 }
179 }
180 } // oxirgi sinf DisplayQueryResults

24.28-rasm | Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish. (5-qismning 5-qismi.)

tableModel.disconnectFromDatabase();

a) Barcha mualliflarni ko'rsatish


Mualliflar jadvali

b) mualliflarni ko'rsatish


ism va familiya bilan birlashtiriladi
nomlari va nashr raqamlari
ular yozgan kitoblardan

c) natijalarini filtrlash


oldingi so'rov faqat ko'rsatish uchun
sarlavhasida Java bo'lgan kitoblar

24.6 JDBC 1079 yordamida ma'lumotlar bazalarini manipulyatsiya qilish



ResultSetTableModel ob'ekti va ilova uchun GUI va GUI-ni a ichida ko'rsatadi
JFrame. 64-qator JTable ob'ektini yaratadi va ResultSetTableModel ob'ektini o'tkazadi (cre-
42-43-qatorlarda JTable konstruktoriga yoziladi, so'ngra JTableni tinglovchi sifatida ro'yxatdan o'tkazadi
ResultSetTableModel tomonidan yaratilgan TableModelEvents uchun.
Mahalliy o'zgaruvchilar queryArea (46-qator), filterText (67-qator) va tartiblovchi (121-satr)
122) yakuniy deb e'lon qilinadi, chunki ular anonim ichki sinflardan foydalaniladi. Shuni eslang
anonim ichki sinfda ishlatiladigan har qanday mahalliy o'zgaruvchi yakuniy deb e'lon qilinishi kerak;
aks holda kompilyatsiya xatosi yuzaga keladi. (Java SE 8 da bu dastursiz kompilyatsiya qilinadi
bu o'zgaruvchilarni yakuniy deb e'lon qilish, chunki bu o'zgaruvchilar samarali ravishda yakuniy bo'ladi, chunki
17-bobda la'natlangan.)
82–119-qatorlar foydalanuvchi bosgan submitButton uchun hodisa ishlovchisini ro'yxatdan o'tkazadi
ma'lumotlar bazasiga so'rov yuboring. Foydalanuvchi tugmani bosganida, actionPer- usuli
shakllangan (85–117-qatorlar) ResultSetTableModel sinfidan setQuery usulini chaqiradi.
yangi so'rovni bajaring (90-qator). Agar foydalanuvchi so'rovi bajarilmasa (masalan, sintaktik xato tufayli
foydalanuvchi kiritishi), 102–103 qatorlar standart so'rovni bajaradi. Agar standart so'rov ham bajarilmasa,
jiddiyroq xato bo'lishi mumkin, shuning uchun 112-qator ma'lumotlar bazasi ulanishini ta'minlaydi
yopiladi va 114-satr dasturdan chiqadi. 24.28-rasmdagi ekran tasvirlari natijalarni ko'rsatadi
ikkita so'rovdan. Birinchi ekran tasviri barcha ma'lumotlarni oladigan standart so'rovni ko'rsatadi
jadvaldan Ma'lumotlar bazasi kitoblari mualliflari. Ikkinchi ekran tasviri so'rovni ko'rsatadi
Mualliflar jadvalidan har bir muallifning ismi va familiyasini tanlaydi va ularni birlashtiradi
Sarlavhalar jadvalidagi sarlavha va nashr raqami bilan ma'lumot. Oʻz raqamingizni kiritib koʻring
matn maydonida o'z so'rovlarini kiriting va so'rovni bajarish uchun So'rovni yuborish tugmasini bosing.
161-170-qatorlar sodir bo'ladigan windowClosed hodisasi uchun WindowListener-ni ro'yxatdan o'tkazadi
foydalanuvchi oynani yopganda. Chunki WindowListeners bir nechta oynani boshqarishi mumkin
hodisalar uchun biz WindowAdapter sinfini kengaytiramiz va faqat windowClosed hodisa ishlovchisini bekor qilamiz.
JTableda qatorlarni saralash
JTables foydalanuvchilarga ma'lum bir ustundagi ma'lumotlar bo'yicha qatorlarni saralash imkonini beradi. 121–122 qatorlar ishlatiladi
TableRowSorter klassi (javax.swing.table paketidan) bizni ishlatadigan ob'ektni yaratish uchun
ResultSetTableModel so'rov natijalarini ko'rsatadigan JTabledagi qatorlarni saralash uchun. Qachon
foydalanuvchi ma'lum bir JTable ustunining sarlavhasini bosadi, TableRowSorter bilan o'zaro ishlaydi
Ushbu ustundagi ma'lumotlar asosida satrlarni qayta tartiblash uchun TableModel-ga asoslanadi. 123-qator
resultTable uchun TableRowSorterni belgilash uchun JTable usuli setRowSorter dan foydalanadi.
JTabledagi qatorlarni filtrlash
JTables endi asosiy TableModel ma'lumotlarining quyi to'plamlarini ko'rsatishi mumkin. Bu ma'lum
ma'lumotlarni filtrlash kabi. 126–152 qatorlar filterButton uchun hodisa ishlov beruvchisini ro'yxatdan o'tkazing
foydalanuvchi ma'lumotlarni filtrlash uchun bosadi. Amaliyot usulida (130–150-qatorlar), 132-qator
filtr matnini oladi. Agar foydalanuvchi filtr matnini ko'rsatmagan bo'lsa, 135-qator JTable usulidan foydalanadi
setRowFilter filtrni nolga o'rnatish orqali oldingi filtrni olib tashlash uchun. Aks holda, 140-qatorlar
141 RowFilterni (javax.swing paketidan) belgilash uchun setRowFilter dan foydalaning.
foydalanuvchi kiritishi. Class RowFilter filtrlarni yaratish uchun bir nechta usullarni taqdim etadi. Statik
RegexFilter usuli argument sifatida muntazam ifoda naqshini o'z ichiga olgan Stringni oladi.
ment va qaysi ustunlar filtrlanishini belgilaydigan ixtiyoriy indekslar to'plami. Agar indekslar bo'lmasa
belgilangan, keyin barcha ustunlar qidiriladi. Ushbu misolda muntazam ifoda namunasi
foydalanuvchi kiritgan matn. Filtr o'rnatilgandan so'ng, JTableda ko'rsatilgan ma'lumotlar yangilanadi
filtrlangan TableModel asosida.

1080 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

24.7 RowSet interfeysi
Oldingi misollarda siz aniq o'rnatish orqali ma'lumotlar bazasini qanday so'rashni o'rgandingiz
Ma'lumotlar bazasiga ulanish, ma'lumotlar bazasini so'rash uchun bayonot tayyorlash va exe-
so'rovni kesish. Ushbu bo'limda biz sozlaydigan RowSet interfeysini namoyish qilamiz
ma'lumotlar bazasi ulanishi va so'rov bayonotlarini avtomatik ravishda tayyorlaydi. Interfeys qatori -
Set o'rnatish uchun zarur bo'lgan xususiyatlarni belgilash imkonini beruvchi bir nechta to'plam usullarini taqdim etadi
ulanish (ma'lumotlar bazasi URL manzili, ma'lumotlar bazasining foydalanuvchi nomi va paroli kabi) va cre-
Bayonotni (masalan, so'rovni) yedi. RowSet shuningdek, qaytib keladigan bir nechta olish usullarini taqdim etadi
bu xususiyatlar.
Ulangan va ajratilgan qatorlar to'plami
RowSet obyektlarining ikki turi mavjud - ulangan va uzilgan. Bog'langan qatorlar to'plami
ob'ekt ma'lumotlar bazasiga bir marta ulanadi va ob'ekt foydalanish paytida ulangan qoladi. A
uzilgan RowSet ob'ekti ma'lumotlar bazasiga ulanadi, ma'lumotlarni olish uchun so'rovni bajaradi
ma'lumotlar bazasidan va keyin ulanishni yopadi. Dastur a dagi ma'lumotlarni o'zgartirishi mumkin
RowSet o'chirilgan paytda o'chirildi. O'zgartirilgan ma'lumotlar ma'lumotlarda yangilanishi mumkin -
o'chirilgan RowSet ma'lumotlar bazasi bilan aloqani qayta tiklagandan so'ng.
javax.sql.rowset to'plami RowSet-ning ikkita pastki interfeysini o'z ichiga oladi - JdbcRowSet va
CachedRowSet. JdbcRowSet, ulangan RowSet, ResultSet atrofida o'rash vazifasini bajaradi
ob'ekti va sizga ResultSet-dagi qatorlarni aylantirish va yangilash imkonini beradi. Shuni eslang
sukut bo'yicha, ResultSet ob'ekti aylantirilmaydi va faqat o'qiladi - siz aniq belgilashingiz kerak
natija to'plami turi konstantasini TYPE_SCROLL_INSENSITIVE ga o'rnating va natijalar to'plamining parallelligini o'rnating
ResultSet obyektini aylantiruvchi va yangilanadigan qilish uchun CONCUR_UPDATABLE ga doimiy. A
JdbcRowSet ob'ekti sukut bo'yicha aylantirilishi va yangilanishi mumkin. CachedRowSet, uzilgan
RowSet, ResultSet ma'lumotlarini xotirada keshlaydi va ma'lumotlar bazasidan ajratadi.
JdbcRowSet singari, CachedRowSet ob'ekti sukut bo'yicha aylantirilishi va yangilanishi mumkin. Keshlangan -
RowSet ob'ekti ham serializatsiya qilinadi, shuning uchun uni Java ilovalari o'rtasida a orqali o'tkazish mumkin
tarmoq, masalan, Internet. Biroq, CachedRowSet chekloviga ega - miqdori
xotirada saqlanishi mumkin bo'lgan ma'lumotlar cheklangan. javax.sql.rowset paketi uchtadan iborat
RowSet ning boshqa pastki interfeyslari.

Rowset-dan foydalanish


24.29-rasm 24.23-rasmdagi misolni RowSet yordamida qayta tiklaydi. O'rnatishdan ko'ra -
ulanishni o'rnating va aniq bayonot yarating, 24.29-rasm JdbcRowSet ob'ektidan foydalanadi.
avtomatik ravishda ulanish va bayonot yaratish.
RowSetProvider klassi (javax.sql.rowset paketi) yangi statik usulni ta'minlaydi.
RowSetFactory interfeysini amalga oshiradigan ob'ektni qaytaradigan zavod (paket
javax.sql.rowset) har xil turdagi qatorlarni yaratish uchun ishlatilishi mumkin. 18–19-qatorlar
Resurslarni sinab ko'rish bayonotida RowSetFactory createJdbcRowSet usulidan foydalaning
JdbcRowSet obyektini oling.
22–24 qatorlar DriverManager maʼlumotlarni oʻrnatish uchun foydalanadigan RowSet xususiyatlarini oʻrnatadi.
asosiy ulanish. 22-qator ma'lumotlar bazasini belgilash uchun JdbcRowSet setUrl usulini chaqiradi

Portativlik bo'yicha maslahat 24.5


RowSet aylantirilishi mumkin bo'lgan qayta ishlashni qo'llab-quvvatlamaydigan drayverlar uchun aylantirish qobiliyatini ta'minlaydi.
sultSets.

24.7 RowSet interfeysi 1081

1 // 24.29-rasm: JdbcRowSetTest.java
2 // JdbcRowSet yordamida Mualliflar jadvalining mazmunini ko'rsatish.
3 import java.sql.ResultSetMetaData;
4 import java.sql.SQLException;
5
6
7
8 umumiy sinf JdbcRowSetTest
9 {
10 // JDBC drayveri nomi va ma'lumotlar bazasi URL manzili
11 ta xususiy statik yakuniy String DATABASE_URL = "jdbc:derbi:books";
12 shaxsiy statik yakuniy String USERNAME = "deitel";
13 xususiy statik final String PASSWORD = "deitel";
14
15 ta umumiy statik bekor asosiy(String args[])
16 {
17 // ma'lumotlar bazasi kitoblari va so'rovlar ma'lumotlar bazasiga ulanish
18
19
20 {
21
22
23
24
25
26
27
28 // so'rov natijalarini qayta ishlash
29
30 int numberOfColumns = metaData.getColumnCount();
31 System.out.printf("Mualliflar jadvali kitoblar bazasi:%n%n");
32
33 // qatorlar sarlavhasini ko'rsatish
34 uchun (int i = 1; i <= soniOfColumns; i++)
35 System.out.printf("%-8s\t", metaData.getColumnName(i));
36 System.out.println();
37
38 // har bir qatorni ko'rsatish
39 vaqt ( )
40 {
41 uchun (int i = 1; i <= soniOfColumns; i++)
42 System.out.printf("%-8s\t", );
43 System.out.println();
44 }
45 }
46 catch (SQLException sqlException)
47 {
48 sqlException.printStackTrace();
49 System.exit(1);
50 }
51 }
52 } // tugatish sinfi JdbcRowSetTest

24.29-rasm | JdbcRowSet yordamida Mualliflar jadvalining mazmunini ko'rsatish. (2-qismning 1-qismi.)

import javax.sql.rowset.JdbcRowSet;
import javax.sql.rowset.RowSetProvider;

harakat qilib ko'ring (JdbcRowSet rowSet =


RowSetProvider.newFactory().createJdbcRowSet())

// JdbcRowSet xususiyatlarini belgilang


rowSet.setUrl(DATABASE_URL);
rowSet.setUsername(USERNAME);
rowSet.setPassword(PASSWORD);
rowSet.setCommand("Mualliflardan * SELECT *"); // so'rovni o'rnatish
rowSet.execute(); // so'rovni bajarish

ResultSetMetaData metaData = rowSet.getMetaData();

rowSet.next()

rowSet.getObject(i)


1082 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

URL. 23-qator foydalanuvchi nomini belgilash uchun JdbcRowSet setUsername usulini chaqiradi. 24-qator
parolni belgilash uchun JdbcRowSet setPassword usulini chaqiradi. 25-qator Jdbc-ni chaqiradi
RowSet usuli setCommand to'ldirish uchun ishlatiladigan SQL so'rovini belgilash uchun
Qatorlar to'plami. 26-qator SQL so'rovini bajarish uchun JdbcRowSet usulini ishga tushiradi. Usul
execute to'rtta amalni bajaradi - ma'lumotlar bazasiga ulanishni o'rnatadi, tayyorlaydi
so'rov bayonoti, so'rovni bajaradi va so'rov orqali qaytarilgan ResultSet-ni saqlaydi. The
Ulanish, bayonot va ResultSet JdbcRowSet obyektida inkapsullangan.
Qolgan kod 24.23-rasm bilan deyarli bir xil, 29-qatordan tashqari (24.29-rasm)
JdbcRowSet-dan ResultSetMetaData obyektini oladi, 39-qator JdbcRowSet-dan foydalanadi
natijaning keyingi qatorini olishning keyingi usuli va 42-qator JdbcRowSet ning getObject-dan foydalanadi
ustun qiymatini olish usuli. Sinab ko'rish blokining oxiriga yetganda, try-
with-resources bayonoti JdbcRowSet usulini yopishni chaqiradi, bu esa RowSet-ni yopadi.
kapsullangan ResultSet, bayonot va ulanish. CachedRowSet-da, yopishni chaqirish
shuningdek, ushbu RowSet tomonidan saqlanadigan resurslarni chiqaradi. Ushbu ilovaning chiqishi bir xil
24.23-rasmdagi kabi.
24.8 Tayyorlangan bayonotlar
PreparedStatement ko'proq samarali bajaradigan kompilyatsiya qilingan SQL bayonotlarini yaratishga imkon beradi.
Bayonotlarga qaraganda. PreparedStatements parametrlarni ham belgilashi va ularni yaratishi mumkin
Bayonotlardan ko'ra moslashuvchanroq - bir xil so'rovni boshqa so'rovlar bilan qayta-qayta bajarishingiz mumkin
parametr qiymatlari. Misol uchun, kitoblar ma'lumotlar bazasida siz barcha kitob nomlarini topishni xohlashingiz mumkin
Muayyan familiyasi va ismi bo'lgan muallif uchun va siz ushbu so'rovni bajarishni xohlashingiz mumkin
bir nechta mualliflar uchun. PreparedStatement bilan bu so'rov quyidagicha aniqlanadi:

Oldingi SQL iborasining oxirgi satridagi ikkita savol belgisi (?) joy egalaridir


ma'lumotlar bazasiga so'rovning bir qismi sifatida uzatiladigan qiymatlar uchun. Oldindan bajarishdan oldin
paredStatement, dastur Prepared- yordamida parametr qiymatlarini belgilashi kerak.
Bayonot interfeysining o'rnatilgan usullari.
Oldingi so'rov uchun ikkala parametr ham Prepared- bilan o'rnatilishi mumkin bo'lgan satrlardir.
Bayonot usuli setString quyidagicha:

Mualliflar kitoblari ma'lumotlar bazasi:

AVTORID FIRSTNAME FAMİLYA
1 Pol Deytel
2 Harvey Deitel
3 Abbey Deitel
4 Dan Quirk
5 Maykl Morgano

PreparedStatement authorBooks = connection.prepareStatement(


"Familiya, ism, unvonni tanlang" +
"Mualliflardan INNER JOIN AuthorISBN" +
"ON Authors.AuthorID=AuthorISBN.AuthorID " +
"INNER JOIN Sarlavhalari" +
"ON AuthorISBN.ISBN=Titles.ISBN " +
"WHERE Familiya = ? VA Ismi =?");

24.29-rasm | JdbcRowSet yordamida Mualliflar jadvalining mazmunini ko'rsatish. (2-qismning 2-qismi.)


24.8 Tayyorlangan bayonotlar 1083

setString usulining birinchi argumenti o'rnatilayotgan parametr raqamini va
ikkinchi argument - bu parametrning qiymati. Parametr raqamlari 1 dan boshlab hisoblanadi
birinchi savol belgisi (?) bilan. Dastur oldingi tayyorgarlikni bajarganda
Yuqorida o'rnatilgan parametr qiymatlari bilan bayonot, ma'lumotlar bazasiga uzatilgan SQL hisoblanadi

SetString usuli kerak bo'lganda String parametr qiymatlaridan avtomatik ravishda chiqib ketadi. Imtihon uchun -


ple, agar familiya O'Brien bo'lsa, bayonot

O'Brayendagi "belgidan" uni ikkita bitta tirnoqli belgilar bilan almashtirib qochadi, shuning uchun


' ma'lumotlar bazasida to'g'ri ko'rinadi.

Interface PreparedStatement har bir qo'llab-quvvatlanadigan SQL turi uchun o'rnatilgan usullarni taqdim etadi. Bu


da parametrning SQL turiga mos keladigan o'rnatilgan usuldan foydalanish muhim
ma'lumotlar bazasi - SQLE istisnolari dastur parametr qiymatini aylantirishga harakat qilganda yuzaga keladi
noto'g'ri turga.
PreparedStatements dan foydalanadigan manzillar kitobi ilovasi
Endi biz mavjud yozuvlarni ko'rib chiqish, yangilarini qo'shish imkonini beruvchi manzillar kitobi ilovasini taqdim etamiz
yozuvlar va ma'lum bir familiyaga ega yozuvlarni qidiring. Bizning AdresBook Java DB ma'lumotlar bazasi
Unda addressID, FirstName, Familiya, Email ustunlaridan iborat Manzillar jadvali mavjud
va Telefon raqami. Ustun addressID - bu Manzillar jadvalidagi identifikatsiya ustunidir.
Sinf odami
Bizning manzillar kitobi ilovamiz uchta sinfdan iborat - Shaxs (24.30-rasm), ShaxsQue-
ries (24.31-rasm) va AddressBookDisplay (24.32-rasm). Sinf odami oddiy sinfdir

authorBooks.setString(1, "Deitel");


authorBooks.setString(2, "Pol");

Familiya, Ism, Sarlavhani tanlang


Mualliflardan INNER JOIN AuthorISBN
ON Authors.AuthorID=AuthorISBN.AuthorID
INNER JOIN Sarlavhalari
ON AuthorISBN.ISBN=Titles.ISBN
WHERE Familiyasi = 'Deitel' VA FirstName = 'Pol'

authorBooks.setString(1, "O'Brien");

Ishlash bo'yicha maslahat 24.2
PreparedStatements SQL bayonotlarini bajarishda bayonotlarga qaraganda samaraliroq
bir necha marta va turli parametr qiymatlari bilan.
Xatolarning oldini olish bo'yicha maslahat 24.2
String qiymatlarini ar- sifatida qabul qiladigan so'rovlar uchun PreparedStatements parametrlaridan foydalaning.
SQL bayonotida satrlarning to'g'ri keltirilishini ta'minlash uchun guments.
Xatolarning oldini olish bo'yicha maslahat 24.3
PreparedStatements odatda SQL da sodir bo'ladigan SQL in'ektsion hujumlarini oldini olishga yordam beradi
foydalanuvchi kiritish noto'g'ri kiritilgan bayonotlar. Ushbu xavfsizlik muammosining oldini olish uchun Prepared-dan foydalaning.
Foydalanuvchi ma'lumotlari faqat parametrlar orqali berilishi mumkin bo'lgan bayonotlar - bilan ko'rsatilgan?
PreparedStatement yaratishda. Bunday PreparedStatementni yaratganingizdan so'ng,
foydalanuvchi kiritishini ushbu parametrlar uchun argument sifatida belgilash uchun uning o'rnatilgan usullaridan foydalanishingiz mumkin.

1084 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

bu manzillar kitobida bir kishini ifodalaydi. Sinfda manzil uchun maydonlar mavjud
ID, ism, familiya, elektron pochta manzili va telefon raqami, shuningdek, sozlash va olish usullari
bu maydonlarni manipulyatsiya qilish uchun.

1 // 24.30-rasm: Shaxs.java


2 // Manzillar kitobidagi yozuvni ifodalovchi shaxs sinfi.
3 ommaviy toifali shaxs
4 {
5 xususiy int addressID;
6 xususiy String firstName;
7 shaxsiy String familiyasi;
8 shaxsiy elektron pochta;
9 shaxsiy simli telefon raqami;
10
11 // konstruktor
12 jamoatchi ()
13 {
14 }
15
16 // konstruktor
17 ommaviy shaxs (int addressID, String firstName, String familiyasi,
18 String email, String phoneNumber)
19 {
20 setAddressID(addressID);
21 setFirstName(firstName);
22 setLastName(familiya);
23 to'plamiE-mail (elektron pochta);
24 to'plamTelefonNumber(telefon raqami);
25 }
26
27 // manzil identifikatorini o'rnatadi
28 umumiy bekor to'siqAddressID(int addressID)
29 {
30 this.addressID = addressID;
31 }
32
33 // manzil identifikatorini qaytaradi
34 umumiy int getAddressID()
35 {
36 manzil identifikatorini qaytarish;
37 }
38
39 // birinchi ismni o'rnatadi
40 ommaviy bekor setFirstName(String firstName)
41 {
42 this.firstName = firstName;
43 }
44
45 // birinchi ismni qaytaradi
46 ommaviy string getFirstName()
47 {

24.30-rasm | Manzillar kitobidagi yozuvni ifodalovchi shaxs klassi. (2-qismning 1-qismi.)


24.8 Tayyorlangan bayonotlar 1085

Sinf shaxslari so'rovlari
Class PersonQueries (24.31-rasm) manzillar kitobi ilovasining ma'lumotlar bazasini boshqaradi.
va ilova bilan o'zaro aloqada bo'lish uchun foydalanadigan PreparedStatements ni yaratadi
ma'lumotlar bazasi. 18-20 qatorlar uchta PreparedStatement o'zgaruvchisini e'lon qiladi. Konstruktor (chiziqlar
23–49) 27–28-qatorlarda maʼlumotlar bazasiga ulanadi.

48 nomini qaytarish;


49 }
50
51 // familiyani belgilaydi
52 umumiy bekor setLastName(String familiyasi)
53 {
54 this.lastName = familiya;
55 }
56
57 // familiyani qaytaradi
58 ommaviy string getLastName()
59 {
60 familiyasini qaytaradi;
61 }
62
63 // elektron pochta manzilini o'rnatadi
64 umumiy bekor to'plamiEmail (String email)
65 {
66 this.email = email;
67 }
68
69 // elektron pochta manzilini qaytaradi
70 ommaviy string getEmail()
71 {
72 elektron pochtani qaytarish;
73 }
74
75 // telefon raqamini o'rnatadi
76 ommaviy bekor to'plamiTelefonNumber(String telefon)
77 {
78 this.phoneNumber = telefon;
79 }
80
81 // telefon raqamini qaytaradi
82 ommaviy string getPhoneNumber()
83 {
84 qaytish telefon raqami;
85 }
86 } // oxirgi sinf Shaxs

1 // 24.31-rasm: PersonQueries.java


2 // Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements.
3 import java.sql.Connection;

24.31-rasm | Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements. (5-qismning 1-qismi.)

24.30-rasm | Manzillar kitobidagi yozuvni ifodalovchi shaxs klassi. (2-qismning 2-qismi.)

1086 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

4 import java.sql.DriverManager;
5
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8 import java.util.List;
9 import java.util.ArrayList;
10
11 umumiy sinf PersonQueries
12 {
13 xususiy statik yakuniy String URL = "jdbc:derby:AddressBook";
14 shaxsiy statik yakuniy String USERNAME = "deitel";
15 xususiy statik final String PASSWORD = "deitel";
16
17 shaxsiy ulanish ulanishi; // ulanishni boshqaradi
18
19
20
21
22 // konstruktor
23 ta umumiy shaxs soʻrovi()
24 {
25 urinib ko'ring
26 {
27 ulanish =
28 DriverManager.getConnection(URL, FOYDALANUVCHI NAME, PAROL);
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 }
44 catch (SQLException sqlException)
45 {
46 sqlException.printStackTrace();
47 System.exit(1);
48 }
49 }
50
51 // ma'lumotlar bazasidagi barcha manzillarni tanlang
52 umumiy roʻyxat< Shaxs > getAllPeople()
53 {
54 Ro'yxat< Shaxs > natijalar = null;
55 ResultSet resultsSet = null;
56

24.31-rasm | Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements. (5-qismning 2-qismi.)

import java.sql.PreparedStatement;

private PreparedStatement selectAllPeople;


private PreparedStatement selectPeopleByLastName;
xususiy PreparedStatement insertNewPerson;

// Manzillar kitobidagi barcha yozuvlarni tanlaydigan so'rov yaratish


selectAllPeople =
connection.prepareStatement("manzillardan * TANILA");

// ma'lum bir familiyaga ega yozuvlarni tanlaydigan so'rov yaratish


selectPeopleByLastName = connection.prepareStatement(
"Familiya = ?");

// ma'lumotlar bazasiga yangi yozuv qo'shadigan qo'shimchani yarating


insertNewPerson = connection.prepareStatement(
"Manzillarga INSERT INTO" +
"(Ism, familiya, elektron pochta, telefon raqami)" +
"QIYMATLAR (?, ?, ?, ?)");

24.8 Tayyorlangan bayonotlar 1087

57 urinib ko'ring
58 {
59
60
61 ta natija = yangi ArrayList< Person >();
62
63 esa (resultSet.next())
64 {
65 ta natija. qoʻshish(yangi shaxs(
66 resultsSet.getInt("adres identifikatori"),
67 natijaSet.getString("FirstName"),
68 natijaSet.getString("Familiya"),
69 resultsSet.getString("Elektron pochta"),
70 natijaSet.getString("Telefon raqami")));
71 }
72 }
73 catch (SQLException sqlException)
74 {
75 sqlException.printStackTrace();
76 }
77 nihoyat
78 {
79 urinib ko'ring
80 {
81 resultsSet.close();
82 }
83 catch (SQLException sqlException)
84 {
85 sqlException.printStackTrace();
86 yopish ();
87 }
88 }
89
90 ta natija;
91 }
92
93 // shaxsni familiyasi bo'yicha tanlang
94 umumiy roʻyxat< Shaxs > getPeopleByLastName(String nomi)
95 {
96 List< Shaxs > natijalar = null;
97 ResultSet resultsSet = null;
98
99 urinib ko'ring
100 {
101
102
103
104
105
106 natija = yangi ArrayList< Person >();
107
108 vaqt (resultSet.next())
109 {

24.31-rasm | Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements. (5-qismning 3-qismi.)

// executeQuery mos yozuvlarni o'z ichiga olgan ResultSet-ni qaytaradi
resultSet = selectAllPeople.executeQuery();

selectPeopleByLastName.setString(1, ism); // familiyani belgilang

// executeQuery mos yozuvlarni o'z ichiga olgan ResultSet-ni qaytaradi
resultSet = selectPeopleByLastName.executeQuery();

1088 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

110 natijalar.add(yangi shaxs(resultSet.getInt("adresID"),
111 natijaSet.getString("FirstName"),
112 natijaSet.getString("Familiya"),
113 natijaSet.getString("Elektron pochta"),
114 natijaSet.getString("Telefon raqami")));
115 }
116 }
117 catch (SQLException sqlException)
118 {
119 sqlException.printStackTrace();
120 }
121 nihoyat
122 {
123 urinib ko'ring
124 {
125 resultSet.close();
126 }
127 catch (SQLException sqlException)
128 {
129 sqlException.printStackTrace();
130 yopish ();
131 }
132 }
133
134 ta natijalar;
135 }
136
137 // yozuv qo'shing
138 public int addPerson(
139 String fname, String lname, String email, String num)
140 {
141 int natija = 0;
142
143 // parametrlarni o'rnating, keyin insertNewPerson-ni bajaring
144 urinib ko'ring
145 {
146
147
148
149
150
151
152
153 }
154 catch (SQLException sqlException)
155 {
156 sqlException.printStackTrace();
157 yopish ();
158 }
159
160 qaytish natijasi;
161 }
162

24.31-rasm | Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements. (5-qismning 4-qismi.)

insertNewPerson.setString(1, fname);
insertNewPerson.setString(2, lname);
insertNewPerson.setString(3, elektron pochta);
insertNewPerson.setString(4, num);

// yangi yozuvni kiriting; yangilangan # qatorni qaytaradi


natija = insertNewPerson.executeUpdate();

24.8 Tayyorlangan bayonotlar 1089

PreparedStatements yaratish
31–32-qatorlar Prepared-ni yaratish uchun PreparedStatement ulanish usulini chaqiradi.
Manzillar jadvalidagi barcha qatorlarni tanlaydigan selectAllPeople deb nomlangan bayonot. Chiziqlar
35–36 parametr bilan selectPeopleByLastName nomli PreparedStatementni yarating.
Ushbu bayonot Manzillar jadvalidagi ma'lum bir oxirgiga mos keladigan barcha qatorlarni tanlaydi
nomi. E'tibor bering? familiya parametrini belgilash uchun ishlatiladigan belgi. 39–42 qatorlar
ko'rsatadigan to'rtta parametr bilan insertNewPerson nomli PreparedStatement ni yarating.
yangi yozuv uchun ism, familiya, elektron pochta manzili va telefon raqamini yubordi. Yana,
e'tibor bering? bu parametrlarni ifodalash uchun ishlatiladigan belgilar.
PersonQueries usuli getAllPeople
getAllPeople usuli (52–91-qatorlar) PreparedStatement selectAllPeople dasturini bajaradi
(60-satr) executeQuery usulini chaqirish orqali, o'z ichiga olgan ResultSet ni qaytaradi
so'rovga mos keladigan qatorlar (bu holda, Manzillar jadvalidagi barcha qatorlar). 61–71 qatorlar
so'rov natijalarini qo'ng'iroq qiluvchiga qaytariladigan ArrayList of Person ob'ektlari ro'yxatiga joylashtiring
90-satrda. getPeopleByLastName usuli (94–135-qatorlar) PreparedStatement usulidan foydalanadi.
Parametrni SelectPeopleByLastName (101-qator) ga o'rnatish uchun od setString. Keyin 104-qator
so'rovni bajaradi va 106-115 qatorlar so'rov natijalarini Shaxsning ArrayList ro'yxatiga joylashtiring
ob'ektlar. 134-qator qo'ng'iroq qiluvchiga ArrayList-ni qaytaradi.
PersonQueries usullari addPerson va Close
AddPerson usuli (138–161-qatorlar) setString (satrlar) PreparedStatement usulidan foydalanadi
146–149) insertNewPerson PreparedStatement uchun parametrlarni o'rnatish. 152-qator
yangi yozuvni kiritish uchun PreparedStatement executeUpdate usulidan foydalanadi. Bu usul
ga yangilangan (yoki kiritilgan) qatorlar sonini ko'rsatuvchi butun sonni qaytaradi
ma'lumotlar bazasi. Yopish usuli (164-174-qatorlar) shunchaki ma'lumotlar bazasi ulanishini yopadi.
Class AddressBookDisplay
AddressBookDisplay (24.32-rasm) ilovasi o'zaro bog'lanish uchun PersonQueries ob'ektidan foydalanadi.
ma'lumotlar bazasi bilan harakat qilish. 59-qator PersonQueries obyektini yaratadi. Foydalanuvchi bosilganda
Barcha yozuvlarni ko'rib chiqish JButton, browseButtonActionPerformed ishlov beruvchisi (309-satrlar)
335) deyiladi. 313-qator PersonQueries obyektidagi getAllPeople usulini chaqiradi
ma'lumotlar bazasidagi barcha yozuvlarni olish. Keyin foydalanuvchi yozuvlar bo'ylab harakatlanishi mumkin

163 // ma'lumotlar bazasi ulanishini yoping


164 ommaviy bekor yopish()
165 {
166 urinib ko'ring
167 {
168 ulanish.close();
169 }
170 ta tutish (SQLException sqlException)
171 {
172 sqlException.printStackTrace();
173 }
174 }
175 } // oxirgi sinf PersonQueries

24.31-rasm | Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements. (5-qismning 5-qismi.)


1090 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

Oldingi va keyingi JButtons. Foydalanuvchi Find JButton tugmasini bosganida queryButtonAc-
tionPerformed handler (265–287-qatorlar) chaqiriladi. 267-268 qatorlar qo'ng'iroq usuli getPeo-
Ma'lumotlar bazasidagi yozuvlarni olish uchun PersonQueries ob'ektidagi pleByLastName
belgilangan familiyaga mos keladi. Agar bir nechta bunday yozuvlar mavjud bo'lsa, foydalanuvchi keyin aylantirishi mumkin
Oldingi va Keyingi JButtons yordamida ular orqali.

1 // 24.32-rasm: AddressBookDisplay.java


2 // Oddiy manzillar kitobi
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.awt.event.WindowAdapter;
6 import java.awt.event.WindowEvent;
7 import java.awt.FlowLayout;
8 import java.awt.GridLayout;
9 import java.util.List;
10 import javax.swing.JButton;
11 import javax.swing.Box;
12 import javax.swing.JFrame;
13 import javax.swing.JLabel;
14 import javax.swing.JPanel;
15 import javax.swing.JTextField;
16 import javax.swing.WindowConstants;
17 import javax.swing.BoxLayout;
18 import javax.swing.BorderFactory;
19 import javax.swing.JOptionPane;
20
21 umumiy sinf AddressBookDisplay JFrame-ni kengaytiradi
22 {
23 xususiy shaxs joriyKirish;
24
25 shaxsiy roʻyxat natijalari;
26 private int numberOfEntries = 0;
27 xususiy int currentEntryIndex;
28
29 xususiy JButton browseButton;
30 shaxsiy JLabel emailLabel;
31 xususiy JTextField emailTextField;
32 xususiy JLabel firstNameLabel;
33 xususiy JTextField firstNameTextField;
34 xususiy JLabel idLabel;
35 xususiy JTextField idTextField;
36 xususiy JTextField indexTextField;
37 xususiy JLabel lastNameLabel;
38 xususiy JTextField lastNameTextField;
39 xususiy JTextField maxTextField;
40 xususiy JButton nextButton;
41 xususiy JLabel ofLabel;
42 shaxsiy JLabel phoneLabel;
43 xususiy JTextField phoneTextField;
44 shaxsiy JButton oldingiButton;
45 xususiy JButton queryButton;
46 xususiy JLabel queryLabel;

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 1-qismi.)

xususiy PersonQueries personQueries;

24.8 Tayyorlangan bayonotlar 1091

47 xususiy JPanel queryPanel;
48 xususiy JPanel navigatePanel;
49 xususiy JPanel displayPanel;
50 xususiy JTextField queryTextField;
51 xususiy JButton insertButton;
52
53 // konstruktor
54 umumiy manzillar kitobi displeyi()
55 {
56 super("Manzil kitobi");
57
58
59
60
61 // GUI yarating
62 navigatePanel = yangi JPanel();
63 oldingiButton = yangi JButton();
64 indexTextField = yangi JTextField(2);
65 ofLabel = yangi JLabel();
66 maxTextField = yangi JTextField(2);
67 nextButton = new JButton();
68 displayPanel = new JPanel();
69 idLabel = yangi JLabel();
70 idTextField = yangi JTextField(10);
71 firstNameLabel = yangi JLabel();
72 firstNameTextField = yangi JTextField(10);
73 lastNameLabel = yangi JLabel();
74 lastNameTextField = yangi JTextField(10);
75 emailLabel = yangi JLabel();
76 emailTextField = yangi JTextField(10);
77 phoneLabel = yangi JLabel();
78 phoneTextField = yangi JTextField(10);
79 queryPanel = yangi JPanel();
80 queryLabel = yangi JLabel();
81 queryTextField = yangi JTextField(10);
82 queryButton = new JButton();
83 browseButton = yangi JButton();
84 insertButton = new JButton();
85
86 setLayout(yangi FlowLayout(FlowLayout.CENTER, 10, 10));
87 toʻplamOʻlcham(400, 300);
88 setResizable(false);
89
90 navigatePanel.setLayout(
91 yangi BoxLayout(navigatePanel, BoxLayout.X_AXIS));
92
93 oldingiButton.setText("Oldingi");
94 oldingiButton.setEnabled(false);
95 oldingiButton.addActionListener(
96 ta yangi ActionListener()
97 {
98 ommaviy bekor harakat bajarildi (ActionEvent evt)
99 {

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 2-qismi.)

// ma'lumotlar bazasiga ulanishni o'rnating va PreparedStatements-ni o'rnating
personQueries = new PersonQueries();

1092 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

100 oldingiButtonActionPerformed(evt);
101 }
102 }
103);
104
105 navigatePanel.add(oldingi tugma);
106 navigatePanel.add(Box.createHorizontalStrut(10));
107
108 indexTextField.setHorizontalAlignment(
109 JTextField.CENTER);
110 indexTextField.addActionListener(
111 ta yangi ActionListener()
112 {
113 ommaviy bekor harakat bajarildi (ActionEvent evt)
114 {
115 indexTextFieldActionPerformed(evt);
116 }
117 }
118);
119
120 navigatePanel.add(indexTextField);
121 navigatePanel.add(Box.createHorizontalStrut(10));
122
123 ofLabel.setText("of");
124 navigatePanel.add(ofLabel);
125 navigatePanel.add(Box.createHorizontalStrut(10));
126
127 maxTextField.setHorizontalAlignment(
128 JTextField.CENTER);
129 maxTextField.setEditable(noto'g'ri);
130 navigatePanel.add(maxTextField);
131 navigatePanel.add(Box.createHorizontalStrut(10));
132
133 nextButton.setText("Keyingi");
134 nextButton.setEnabled(false);
135 nextButton.addActionListener(
136 ta yangi ActionListener()
137 {
138 ommaviy bekor harakat bajarildi (ActionEvent evt)
139 {
140 keyingiButtonActionPerformed(evt);
141 }
142 }
143);
144
145 navigatePanel.add(nextButton);
146 qo'shish (navigatePanel);
147
148 displayPanel.setLayout(yangi GridLayout(5, 2, 4, 4));
149
150 idLabel.setText("Manzil ID:");
151 displayPanel.add(idLabel);
152

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 3-qismi.)


24.8 Tayyorlangan bayonotlar 1093

153 idTextField.setEditable(noto'g'ri);
154 displayPanel.add(idTextField);
155
156 firstNameLabel.setText("Ism:");
157 displayPanel.add(firstNameLabel);
158 displayPanel.add(firstNameTextField);
159
160 lastNameLabel.setText("Familiya:");
161 displayPanel.add(lastNameLabel);
162 displayPanel.add(lastNameTextField);
163
164 emailLabel.setText("Elektron pochta:");
165 displayPanel.add(emailLabel);
166 displayPanel.add(emailTextField);
167
168 phoneLabel.setText("Telefon raqami:");
169 displayPanel.add(phoneLabel);
170 displayPanel.add(phoneTextField);
171 qo'shish(displayPanel);
172
173 queryPanel.setLayout(
174 yangi BoxLayout(queryPanel, BoxLayout.X_AXIS));
175
176 queryPanel.setBorder(BorderFactory.createTitledBorder(
177 "Familiya bo'yicha yozuvni toping"));
178 queryLabel.setText("Familiya:");
179 queryPanel.add(Box.createHorizontalStrut(5));
180 queryPanel.add(queryLabel);
181 queryPanel.add(Box.createHorizontalStrut(10));
182 queryPanel.add(queryTextField);
183 queryPanel.add(Box.createHorizontalStrut(10));
184
185 queryButton.setText("Topish");
186 queryButton.addActionListener(
187 ta yangi ActionListener()
188 {
189 ommaviy bekor harakat bajarildi (ActionEvent evt)
190 {
191 queryButtonActionPerformed(evt);
192 }
193 }
194);
195
196 queryPanel.add(queryButton);
197 queryPanel.add(Box.createHorizontalStrut(5));
198 qo'shish (queryPanel);
199
200 browseButton.setText("Barcha yozuvlarni ko'rib chiqish");
201 browseButton.addActionListener(
202 yangi ActionListener()
203 {
204 ommaviy bekor harakat bajarildi (ActionEvent evt)
205 {

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 4-qismi.)


1094 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

206 browseButtonActionPerformed(evt);
207 }
208 }
209);
210
211 qo'shish (ko'rish tugmasi);
212
213 insertButton.setText("Yangi yozuv kiritish");
214 insertButton.addActionListener(
215 ta yangi ActionListener()
216 {
217 ommaviy bekor harakat bajarildi (ActionEvent evt)
218 {
219 insertButtonActionPerformed(evt);
220 }
221 }
222);
223
224 qo'shish (insert tugmasi);
225
226 addWindowListener(
227 ta yangi WindowAdapter()
228 {
229 umumiy bekor oynani yopish (WindowEvent evt)
230 {
231 personQueries.close(); // ma'lumotlar bazasi ulanishini yopish
232 System.exit(0);
233 }
234 }
235);
236
237 setVisible(to'g'ri);
238 } // yakunlovchi konstruktor
239
240 // oldingi tugma bosilganda qo'ng'iroqni boshqaradi
241 shaxsiy bekor oldingiButtonActionPerformed(ActionEvent evt)
242 {
243 joriyEntryIndex--;
244
245 agar (joriyEntryIndex < 0)
246 joriyEntryIndex = soniOfEntries - 1;
247
248 indexTextField.setText("" + (joriyEntryIndex + 1));
249 indexTextFieldActionPerformed(evt);
250 }
251
252 // keyingi tugma bosilganda chaqiruvni boshqaradi
253 xususiy void nextButtonActionPerformed(ActionEvent evt)
254 {
255 joriyEntryIndex++;
256
257 agar (joriyEntryIndex >= soniOfEntries)
258 joriyEntryIndex = 0;

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 5-qismi.)


24.8 Tayyorlangan bayonotlar 1095

259
260 indexTextField.setText("" + (joriyEntryIndex + 1));
261 indexTextFieldActionPerformed(evt);
262 }
263
264 // queryButton bosilganda chaqiruvni boshqaradi
265 shaxsiy bekor so'rovButtonActionPerformed(ActionEvent evt)
266 {
267
268
269 numberOfEntries = results.size();
270
271 agar (OfEntries soni!= 0)
272 {
273 joriyEntryIndex = 0;
274 joriyEntry = results.get(currentEntryIndex);
275 idTextField.setText("" + currentEntry.getAddressID());
276 firstNameTextField.setText(currentEntry.getFirstName());
277 lastNameTextField.setText(currentEntry.getLastName());
278 emailTextField.setText(currentEntry.getEmail());
279 phoneTextField.setText(currentEntry.getPhoneNumber());
280 maxTextField.setText("" + numberOfEntries);
281 indexTextField.setText("" + (joriyEntryIndex + 1));
282 nextButton.setEnabled(rost);
283 oldingiButton.setEnabled(rost);
284 }
yana 285
286 browseButtonActionPerformed(evt);
287 }
288
289 // indexTextField-ga yangi qiymat kiritilganda qo'ng'iroqni boshqaradi
290 shaxsiy bekor indeksiTextFieldActionPerformed(ActionEvent evt)
291 {
292 joriyEntryIndex =
293 (Integer.parseInt(indexTextField.getText()) - 1);
294
295 agar (numberOfEntries != 0 && currentEntryIndex < numberOfEntries)
296 {
297 joriyEntry = results.get(currentEntryIndex);
298 idTextField.setText("" + currentEntry.getAddressID());
299 firstNameTextField.setText(currentEntry.getFirstName());
300 lastNameTextField.setText(currentEntry.getLastName());
301 emailTextField.setText(currentEntry.getEmail());
302 phoneTextField.setText(currentEntry.getPhoneNumber());
303 maxTextField.setText("" + numberOfEntries);
304 indexTextField.setText("" + (joriyEntryIndex + 1));
305 }
306 }
307
308 // browseButton bosilganda chaqiruvni boshqaradi
309 xususiy void browseButtonActionPerformed(ActionEvent evt)
310 {

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 6-qismi.)

natijalar =
personQueries.getPeopleByLastName(queryTextField.getText());

1096 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

311 urinib ko'ring
312 {
313
314 numberOfEntries = results.size();
315
316 agar (OfEntries soni!= 0)
317 {
318 joriyEntryIndex = 0;
319 joriyEntry = results.get(currentEntryIndex);
320 idTextField.setText("" + currentEntry.getAddressID());
321 firstNameTextField.setText(currentEntry.getFirstName());
322 lastNameTextField.setText(currentEntry.getLastName());
323 emailTextField.setText(currentEntry.getEmail());
324 phoneTextField.setText(currentEntry.getPhoneNumber());
325 maxTextField.setText("" + numberOfEntries);
326 indexTextField.setText("" + (joriyEntryIndex + 1));
327 nextButton.setEnabled(rost);
328 oldingiButton.setEnabled(rost);
329 }
330 }
331 tutish (e istisno)
332 {
333 e.printStackTrace();
334 }
335 }
336
337 // insert tugmasi bosilganda chaqiruvni boshqaradi
338 xususiy void insertButtonActionPerformed(ActionEvent evt)
339 {
340
341
342
343
344 agar (natija == 1)
345 JOptionPane.showMessageDialog(bu, "Kishi qoʻshilgan!",
346 "Qo'shilgan shaxs", JOptionPane.PLAIN_MESSAGE);
yana 347
348 JOptionPane.showMessageDialog(bu, "Shaxs qo'shilmagan!",
349 "Xato", JOptionPane.PLAIN_MESSAGE);
350
351 browseButtonActionPerformed(evt);
352 }
353
354 // asosiy usul
355 umumiy statik bekor asosiy (String args[])
356 {
357 yangi AddressBookDisplay();
358 }
359 } // tugatish sinfi AddressBookDisplay

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 7-qismi.)

natijalar = personQueries.getAllPeople();

int natijasi = personQueries.addPerson(firstNameTextField.getText(),


lastNameTextField.getText(), emailTextField.getText(),
phoneTextField.getText());

24.8 Tayyorlangan bayonotlar 1097

AddressBook ma'lumotlar bazasiga yangi yozuv qo'shish uchun foydalanuvchi ismni kiritishi mumkin,
JTextFields-da familiya, elektron pochta va telefon raqami (AddressID avtomatik ravishda oshadi).
va Insert New Entry Jtugmasini bosing. insertButtonActionPerformed ishlov beruvchisi (liniyalar
338–352) deyiladi. 340–342 qatorlar PersonQueries obyektidagi addPerson usulini chaqiradi
ma'lumotlar bazasiga yangi yozuv qo'shish uchun. 351-qatorni olish uchun browseButtonActionPerformed chaqiradi
manzillar kitobidagi yangilangan odamlar to'plami va GUI-ni mos ravishda yangilang.

24.32-rasm | Oddiy manzillar kitobi. (8-qismning 8-qismi.)

a) Dastlabki manzillar kitobi ekrani. b) Browse All Entries tugmasini bosish natijalari.

c) Keyingi yozuvga o'tish. d) Yashil familiyali yozuvlarni topish.

e) Yangi yozuv qo'shgandan va uni ko'rib chiqqandan keyin.

1098 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

Keyin foydalanuvchi Oldingi JButton yoki Keyingi tugmasini bosish orqali turli yozuvlarni ko'rishi mumkin
JButton, buning natijasida oldingiButtonActionPerformed usullariga qo'ng'iroq qilinadi (241-qatorlar).
250) yoki keyingiButtonActionPerformed (253–262-qatorlar). Shu bilan bir qatorda,
foydalanuvchi indexTextField-ga raqam kiritishi va ma'lum bir yozuvni ko'rish uchun Enter tugmasini bosishi mumkin.
Bu indexTextFieldActionPerformed (290–306-qatorlar) usuliga qo'ng'iroq qilishiga olib keladi.
belgilangan yozuvni o'ynang.
24.9 Saqlangan protseduralar
Ko'pgina ma'lumotlar bazasini boshqarish tizimlari alohida yoki SQL bayonotlari to'plamini a ichida saqlashi mumkin
ma'lumotlar bazasi, shuning uchun ushbu ma'lumotlar bazasiga kiruvchi dasturlar ularni chaqirishi mumkin. Bunday nomli to'plam
SQL operatorlari saqlanadigan protseduralar deb ataladi. JDBC dasturlarni ishga tushirish imkonini beradi
CallableStatement interfeysini amalga oshiradigan ob'ektlar yordamida saqlangan protseduralar.
CallableStatements meros qilib olingan usullar bilan belgilangan argumentlarni qabul qilishi mumkin.
PreparedStatement interfeysi. Bundan tashqari, CallableStatements chiqish parametrlarini belgilashi mumkin.
eters, unda saqlangan protsedura qaytariladigan qiymatlarni joylashtirishi mumkin. CallableStatement interfeysi
saqlangan protseduradagi qaysi parametrlar chiqish parametrlari ekanligini aniqlash usullarini o'z ichiga oladi.
Interfeys, shuningdek, qaytarilgan chiqish parametrlarining qiymatlarini olish usullarini ham o'z ichiga oladi
saqlangan protseduradan.

24.10 Tranzaksiyalarni qayta ishlash


Ko'pgina ma'lumotlar bazasi ilovalari ma'lumotlar bazasini bir qator qo'shish, yangilash kafolatlarini talab qiladi
va dastur keyingi ma'lumotlarni qayta ishlashni davom ettirishdan oldin o'chirish to'g'ri amalga oshiriladi -
bazaviy operatsiya. Masalan, siz bank hisoblari o'rtasida elektron pul o'tkazganingizda.
hisoblar, bir qancha omillar tranzaksiya muvaffaqiyatli yoki yo'qligini aniqlaydi. Siz belgilashdan boshlaysiz
manba hisobi va ushbu hisobdan manzilga o'tkazmoqchi bo'lgan miqdor
hisob. Keyinchalik, siz maqsadli hisobni belgilaysiz. Bank manba hisobini tekshiradi
uning mablag'lari pul o'tkazmasini bajarish uchun etarli yoki yo'qligini aniqlash. Agar shunday bo'lsa, bank bilan -
belgilangan miqdorni oladi va agar hammasi yaxshi bo'lsa, uni belgilangan hisob raqamiga o'tkazadi
transferni yakunlang. Bank pulni qaytarib olgandan keyin pul o'tkazmasi bajarilmasa nima bo'ladi?
ey manba hisobidanmi? To'g'ri bank tizimida bank pulni qayta depozitga qo'yadi
manba hisobida. Agar sizning manbangizdan pul olib qo'yilsa, o'zingizni qanday his qilasiz?
hisob va bank pulni maqsadli hisob raqamiga kiritmaganmi?
Tranzaksiyalarni qayta ishlash ma'lumotlar bazasi bilan o'zaro aloqada bo'lgan dasturga a
ma'lumotlar bazasi bilan ishlash (yoki operatsiyalar to'plami) bitta operatsiya sifatida. Bunday operatsiya ham ma'lum

Portativlik bo'yicha maslahat 24.6


Saqlangan protseduralarni yaratish sintaksisi ma'lumotlar bazasini boshqarish tizimida farq qilsa-da.
CallableStatement interfeysi kirishni belgilash uchun yagona interfeysni ta'minlaydi
va saqlangan protseduralar va saqlangan protseduralarni chaqirish uchun chiqish parametrlari.

Portativlik bo'yicha maslahat 24.7


CallableStatement interfeysi uchun Java API hujjatlariga muvofiq, maksimal
ma'lumotlar bazasi tizimlari o'rtasida ko'chirish, dasturlar yangilanish hisoblarini qayta ishlashlari kerak
(bu qancha qator yangilanganligini ko'rsatadi) yoki qo'ng'iroqdan qaytgan ResultSets-
Har qanday chiqish parametrlarining qiymatlarini olishdan oldin,ableStatement.

24.11 Yakunlash 1099

atom operatsiyasi yoki tranzaksiya sifatida. Bitim oxirida qaror qabul qilinishi mumkin
tranzaktsiyani amalga oshirish yoki operatsiyani orqaga qaytarish uchun qilingan. Majbur qilish
tranzaksiya ma'lumotlar bazasi operatsiyalarini yakunlaydi; Barcha qo'shishlar, yangilanishlar va o'chirishlar
tranzaktsiyaning bir qismi sifatida tuzilgan yangi ma'lumotlar bazasini amalga oshirmasdan bekor qilinishi mumkin emas
operatsiya. Tranzaktsiyani orqaga qaytarish ma'lumotlar bazasini ma'lumotlar bazasidan oldingi holatida qoldiradi
operatsiya. Bu tranzaksiyaning bir qismi to'g'ri bajarilmasa foydali bo'ladi. Bizning
bank-hisob-o'tkazish muhokamasi, agar depozit mumkin bo'lsa, tranzaksiya orqaga qaytariladi
maqsad hisobiga kiritilmaydi.
Java ulanish interfeysi usullari orqali tranzaktsiyalarni qayta ishlashni ta'minlaydi. Usul
setAutoCommit har bir SQL bayonoti tugallangandan keyin bajariladimi yoki yo'qligini aniqlaydi (haqiqiy
argument) yoki bir nechta SQL iboralarini tranzaktsiya sifatida guruhlash kerakmi (false
dalil). Agar setAutoCommit argumenti noto'g'ri bo'lsa, dastur oxirgisiga amal qilishi kerak
Ulanish usuliga qo'ng'iroq qilish bilan tranzaktsiyadagi SQL bayonoti (majburiy
ma'lumotlar bazasidagi o'zgarishlar) yoki ulanish usulini qaytarish (ma'lumotlar bazasini qaytarish uchun
operatsiyadan oldingi holati). Interfeys ulanishi getAuto- usulini ham taqdim etadi.
Ulanish uchun avtomatik qabul qilish holatini aniqlash majburiyatini oling.
24.11 Yakunlash
Ushbu bobda siz asosiy ma'lumotlar bazasi tushunchalarini, ma'lumotlarni so'rash va boshqarish usullarini o'rgandingiz
SQL-dan foydalanadigan ma'lumotlar bazasi va Java ilovalarining Java bilan o'zaro ishlashiga ruxsat berish uchun JDBC-dan qanday foydalanish
JB ma'lumotlar bazalari. Siz SQL SELECT, INSERT, UPDATE va DE- buyruqlari haqida bilib oldingiz.
LETE, shuningdek WHERE, ORDER BY va INNER JOIN kabi bandlar. Siz yaratdingiz va sozladingiz -
oldindan belgilangan SQL skriptlaridan foydalangan holda Java ma'lumotlar bazasida ma'lumotlar bazalarini o'rganing. uchun qadamlarni o'rgandingiz
ma'lumotlar bazasiga ulanishni olish, ma'lumotlar bilan o'zaro aloqa qilish uchun bayonot yaratish -
baza ma'lumotlari, bayonotni bajarish va natijalarni qayta ishlash. Keyin siz RowSet-dan foydalandingiz
ma'lumotlar bazasiga ulanish va bayonotlar yaratish jarayonini soddalashtirish. Oldindan foydalangansiz
oldindan kompilyatsiya qilingan SQL bayonotlarini yaratish uchun paredStatements. Biz ham umumiy ko'rinishlarni taqdim etdik
CallableStatements va tranzaktsiyalarni qayta ishlash. Keyingi bobda siz grafik tuzasiz.
JavaFX-dan foydalanadigan foydalanuvchi interfeyslari - Java'ning kelajak GUI texnologiyasi.

Xulosa
24.1-bo'lim Kirish


• Ma'lumotlar bazasi (1046-bet) ma'lumotlarning birlashtirilgan to'plamidir. Ma'lumotlar bazasini boshqarish tizimi (DBMS;
p. 1046) ma'lumotlarni saqlash, tartibga solish, olish va o'zgartirish mexanizmlarini taqdim etadi.
• Hozirgi kunda eng mashhur ma'lumotlar bazasini boshqarish tizimlari relyatsion ma'lumotlar bazasi (1046-bet) tizimlaridir.
• SQL (1046-bet) so'rovlar (1046-bet) va manipulyatsiya qilish uchun ishlatiladigan xalqaro standart tildir.
aloqador ma'lumotlar.
• Dasturlar relyatsion ma'lumotlar bazalariga interfeys orqali ulanadi va ular bilan o'zaro ta'sir qiladi, ya'ni
ma'lumotlar bazasini boshqarish tizimi va dastur o'rtasidagi aloqani ta'minlaydi.
• JDBC drayveri (1046-bet) Java ilovalariga ma'lum ma'lumotlar bazasidagi ma'lumotlar bazasiga ulanish imkonini beradi.
va ma'lumotlar bazasi ma'lumotlarini olish va manipulyatsiya qilish imkonini beradi.

1100 24-bob JDBC yordamida ma'lumotlar bazalariga kirish



24.2-bo'lim Relyatsion ma'lumotlar bazalari
• Relyatsion ma'lumotlar bazasi (1047-bet) ma'lumotlarni jadvallarda saqlaydi (1047-bet). Jadvallar qatorlardan tuzilgan
(1047-bet) va satrlar qiymatlar saqlanadigan ustunlardan iborat.
• Jadvalning asosiy kaliti (1047-bet) har bir satrda o'ziga xos kalitga ega.
• Jadvalning har bir ustuni (1047-bet) boshqa atributni ifodalaydi.
• Asosiy kalit bir nechta ustunlardan iborat bo'lishi mumkin.
• Identifikatsiya ustuni avtomatik oshirilgan (1048-bet) ustunni ifodalashning SQL standart usulidir.
SQL IDENTITY kalit so'zi (1048-bet) ustunni identifikatsiya ustuni sifatida belgilaydi.
• Tashqi kalit - bu jadvaldagi ustun bo'lib, u boshqa jadvaldagi asosiy kalit ustuniga mos kelishi kerak.
Bu Referensial yaxlitlik qoidasi sifatida tanilgan (1050-bet).
• Jadvallar orasidagi bir-ko‘p munosabati (1051-bet) bitta jadvaldagi qatorga ega bo‘lishi mumkinligini ko‘rsatadi.
alohida jadvaldagi ko'plab bog'liq qatorlar.
• Asosiy kalitdagi har bir ustun qiymatga ega bo'lishi kerak va asosiy kalitning qiymati bo'lishi kerak
noyob. Bu ob'ektning yaxlitligi qoidasi sifatida tanilgan (1051-bet).
• Xorijiy kalitlar bir nechta jadvallardagi ma'lumotlarni birlashtirish imkonini beradi. Birga-bir bor
asosiy kalit va unga mos keladigan tashqi kalit o'rtasidagi ko'p munosabatlar.
24.4.1-bo'lim asosiy SELECT so'rovi
• So‘rovning asosiy shakli (1052-bet).
TANLOV * jadval nomidan
bu erda yulduzcha (*; 1052-bet) jadval nomidagi barcha ustunlar tanlanishi kerakligini bildiradi,
va tableName ma'lumotlar bazasidagi satrlar olinadigan jadvalni belgilaydi.
• Muayyan ustunlarni olish uchun * belgisini vergul bilan ajratilgan ustun nomlari ro'yxati bilan almashtiring.
24.4.2-bo'lim WHERE bandi
• So‘rovdagi ixtiyoriy WHERE bandi (1053-bet) so‘rov uchun tanlash mezonlarini belgilaydi. The
tanlash mezonlari bilan so'rovning asosiy shakli (1052-bet) hisoblanadi
1-ustun nomi, ustun nomi2, … jadvalName WHERE mezonlaridan FROM TANLANING
• WHERE bandida <, >, <=, >=, =, <> va LIKE operatorlari bo‘lishi mumkin. LIKE (1053-bet) uchun ishlatiladi
foiz (%) va pastki chiziq (_) bilan joker belgilar bilan satr naqshini moslashtirish (1053-bet).
• Naqshdagi foiz belgisi (%; 1053-bet) naqshga mos keladigan satr mumkin ekanligini bildiradi.
naqshdagi foiz belgilarining joylashuvida nol yoki undan ortiq belgilarga ega bo'lishi.
• Naqsh qatoridagi pastki chiziq (_ ; 1053-bet) o‘sha joydagi bitta belgini bildiradi.
naqsh.
24.4.3-qism
• So‘rov natijasini ORDER BY bandi bilan tartiblash mumkin (1055-bet). Buyurtmaning eng oddiy shakli
BY bandi hisoblanadi
ustun nomi1, ustun nomi2, … jadvalName TARTIBI BO'YICHA ustun ustunini tanlang
TANLASH ustun nomi1, ustun nomi2, … jadval nomidan TARTIB BY ustuni DESC
Bu erda ASC o'sish tartibini belgilaydi, DESC kamayish tartibini va ustun rangni belgilaydi.
umn qaysiga asoslanadi. Standart tartiblash tartibi ortib bormoqda, shuning uchun ASC ixtiyoriy.
• Shaklning ORDER BY bandi bilan buyurtma berish uchun bir nechta ustunlardan foydalanish mumkin
1-ustun saralash tartibi, 2-ustun saralash tartibi, …

Xulosa 1101



• WHERE va ORDER BY bandlarini bitta so‘rovda birlashtirish mumkin. Agar foydalanilsa, ORDER BY bo'lishi kerak
so'rovning oxirgi bandi.
24.4.4-bo'lim Bir nechta jadvallardan ma'lumotlarni birlashtirish: INNER JOIN
• INNER JOIN (1057-bet) ikkita jadvaldagi satrlarni ustunlardagi qiymatlarni moslashtirish orqali birlashtiradi.
jadvallar uchun umumiydir. INNER JOIN operatorining asosiy shakli:
1 ustun nomi, ustun nomi2, …
1-jadvaldan
INNER JOIN jadvali 2
ON table1.columnName = table2.columnName
ON bandi (1057-bet) aniqlash uchun solishtiriladigan har bir jadvaldagi ustunlarni belgilaydi.
qaysi qatorlar birlashtiriladi. Agar SQL iborasi bir xil nomli ustunlardan bir nechta ta-
bles, ustun nomlari jadvali bilan old qo'shib to'liq malakali bo'lishi kerak (1057-bet).
ismlar va nuqta (.).
24.4.5-bo'lim INSERT bayonoti
• INSERT operatori (1058-bet) jadvalga yangi qator kiritadi. Ushbu bayonotning asosiy shakli
INSERT INTO tableName (ustun nomi1, ustun nomi2, …, ustun nomiN)
VALUES (qiymat1, qiymat2, …, qiymatN)
bu erda tableName - qator qo'shiladigan jadval. Jadval nomidan keyin vergul qo'yiladi
Qavslar ichidagi ustun nomlarining ajratilgan ro'yxati. Ustun nomlari ro'yxatidan keyin SQL keladi
VALUES kalit so'zi (1058-bet) va qavslar ichida vergul bilan ajratilgan qiymatlar ro'yxati.
• SQL satrlarni chegaralash uchun bitta tirnoqdan (') foydalanadi. Bitta tirnoqli qatorni belgilash uchun
SQL, bitta tirnoqdan boshqa bitta tirnoq bilan (ya'ni, '') qoching.
24.4.6-bo'lim YANGILANISH bayonnomasi
• UPDATE operatori (1059-bet) jadvaldagi ma’lumotlarni o‘zgartiradi. UPDATE bayonotining asosiy shakli
Jadval nomini YANGILASH
SET ustun nomi1 = qiymat1, ustun nomi2 = qiymat2, …, ustun nomiN = qiymatN
WHERE mezonlari
bu erda tableName yangilanadigan jadvaldir. SET (1059-bet) kalit so‘zidan keyin vergul bilan ajratilgan
ustunlar ro'yxatiName = qiymat juftliklari. Ixtiyoriy WHERE bandi qaysi qatorlarni yangilash kerakligini belgilaydi.
24.4.7-bo'lim O'CHIRISH bayonoti
• DELETE operatori (1060-bet) jadvaldan qatorlarni olib tashlaydi. DELETE holatining eng oddiy shakli -
ment hisoblanadi
DELETE FROM tableName WHERE mezonlari
bu erda tableName - satr (yoki satrlar) o'chiriladigan jadval. Ixtiyoriy WHERE mezonlari
qaysi qatorlarni o'chirishni belgilaydi. Agar ushbu band o'tkazib yuborilsa, jadvalning barcha qatorlari o'chiriladi.
24.5-bo'lim Java ma'lumotlar bazasini o'rnatish
• Oracle'ning sof Java ma'lumotlar bazasi Java DB (1060-bet) Windows, Mac OS tizimlarida JDK bilan o'rnatilgan.
X va Linux.
• Java DB ham o'rnatilgan versiyaga, ham tarmoq versiyasiga ega.
• Java DB dasturiy ta'minoti JDK o'rnatish katalogining db pastki katalogida joylashgan.
• Java DB uni sozlash va ishga tushirish imkonini beruvchi bir nechta fayllar bilan birga keladi. Bularni amalga oshirishdan oldin
buyruqlar oynasidan fayllarga murojaat qilish uchun JAVA_HOME muhit o'zgaruvchisini o'rnatishingiz kerak
JDK ning aniq o'rnatish katalogi.

1102 24-bob JDBC yordamida ma'lumotlar bazalariga kirish



• Siz sozlash uchun setEmbeddedCP.bat yoki setEmbeddedCP faylidan (OT platformangizga qarab) foydalanasiz.
Java DB o'rnatilgan ma'lumotlar bazalari bilan ishlash uchun CLASSPATH ni belgilang.
• Java DB ij asbobi buyruq satridan Java DB bilan o'zaro ishlash imkonini beradi. foydalanishingiz mumkin
ma'lumotlar bazalarini yaratish, SQL skriptlarini ishga tushirish va SQL so'rovlarini bajarish uchun. Siz kiritgan har bir buyruq
ij> so'rovi nuqtali vergul (;) bilan tugatilishi kerak.
24.6.1-bo'lim Ma'lumotlar bazasiga ulanish va so'rovlar
• java.sql to'plami Java tilidagi relyatsion ma'lumotlar bazalariga kirish uchun sinflar va interfeyslarni o'z ichiga oladi.
• Connection ob'ekti (1065-bet) Java dasturi va ma'lumotlar bazasi o'rtasidagi aloqani boshqaradi.
Ulanish ob'ektlari dasturlarga ma'lumotlarga kirish uchun SQL bayonotlarini yaratishga imkon beradi.
• DriverManager (1065-bet) getConnection usuli (1065-bet) quyidagi manzilda ma’lumotlar bazasiga ulanishga harakat qiladi.
Aloqa uchun protokolni, aloqa uchun subprotokolni (1065-bet) belgilaydigan URL.
katyon va ma'lumotlar bazasi nomi.
• CreateStatement ulanish usuli (1066-bet) bayonot obyektini yaratadi (1066-bet), u
ma'lumotlar bazasiga SQL bayonotlarini yuborish uchun ishlatiladi.
• ExecuteQuery bayoni usuli (1066-bet) so‘rovni bajaradi va ResultSet obyektini qaytaradi
(1066-bet). ResultSet usullari dasturga so'rov natijalarini manipulyatsiya qilish imkonini beradi.
• ResultSetMetaData obyekti (1066-bet) ResultSet tarkibini tavsiflaydi. Dasturlar meta-dan foydalanishi mumkin
ResultSet ustunlari nomlari va turlari haqida ma'lumot olish uchun ma'lumotlarni dasturiy ravishda.
• ResultSetMetaData usuli getColumnCount (1066-bet) ResultSet col-ning sonini oladi.
umns.
• Keyingi (1066-bet) ResultSet usuli ResultSet kursorini keyingi qatorga joylashtiradi va qaytaradi.
agar qator mavjud bo'lsa true ; aks holda, u false qaytaradi. Ushbu usul qayta ishlashni boshlash uchun chaqirilishi kerak
a ResultSet, chunki kursor dastlab birinchi qatordan oldin joylashgan.
• Har bir ResultSet ustunini muayyan Java turi sifatida ajratib olish mumkin. ResultSetMetaData usuli
getColumnType (1066-bet) Turlar (1067-bet) konstantasini (java.sql paketi) qaytaradi.
ustun turi.
• ResultSet olish usullari odatda argument sifatida ustun raqamini (int sifatida) yoki
qaysi ustun qiymatini olish kerakligini ko'rsatadigan ustun nomi (string sifatida).
• ResultSet satr va ustun raqamlari 1 dan boshlanadi.
• Har bir Statement obyekti bir vaqtning o'zida faqat bitta ResultSetni ochishi mumkin. Bayonot yangisini qaytarganda
ResultSet, Bayonot oldingi ResultSetni yopadi.
24.6.2-bo'lim Kitoblar ma'lumotlar bazasini so'rash
• TableModel (1067-bet) getColumnClass usuli (1068-bet) ni ifodalovchi Class obyektini qaytaradi.
ma'lum bir ustundagi barcha ob'ektlarning yuqori sinfi. JTable (1067-bet) ushbu ma'lumotdan foydalanadi
JTableda ushbu ustun uchun standart hujayra rendererini va hujayra muharririni o'rnating.
• CreateStatement ulanish usulida natija turini qabul qiluvchi haddan tashqari yuklangan versiya va
parallellik. Natija turi ResultSet kursori ikkala di-da ham aylana olishini aniqlaydi.
rections yoki faqat oldinga va ResultSet o'zgarishlarga sezgirmi yoki yo'qmi. Natija mos keladi -
rency (1072-bet) ResultSet yangilanishi mumkinligini bildiradi.
• Ba'zi JDBC drayverlari (1072-bet) aylantiriladigan yoki yangilanadigan Natijalar to'plamini qo'llab-quvvatlamaydi.
• GetColumnClassName (1073-bet) ResultSetMetaData usuli ustunning toʻliq malakali maʼlumotlarini oladi.
sinf nomi.
• TableModel usuli getColumnCount (1073-bet) ResultSetdagi ustunlar sonini qaytaradi.
• TableModel usuli getColumnName (1073-bet) ResultSetdagi ustun nomini qaytaradi.

Xulosa 1103



• ResultSetMetaData usuli getColumnName (1073-bet) ResultSet ustunining nomini oladi.
• TableModel usuli getRowCount (1073-bet) modelning ResultSetdagi qatorlar sonini qaytaradi.
• GetValueAt TableModel usuli (1073-bet) ma'lum bir satr va ustundagi Ob'ektni qaytaradi.
modelning asosiy ResultSet.
• Absolyut ResultSet usuli (1073-bet) ResultSet kursorini ma'lum bir qatorga joylashtiradi.
• FireTableStructureChanged AbstractTableModel usuli (1074-bet) yordamida har qanday JTable haqida xabar beradi.
modeldagi ma'lumotlar o'zgargan model sifatida ma'lum TableModel ob'ekti.
24.7-bo'lim RowSet interfeysi
• Interface RowSet (1080-bet) ma'lumotlar bazasi ulanishini sozlaydi va so'rovni avtomatik ravishda bajaradi.
• Ulangan RowSet (1080-bet) ob'ekt ishlatilayotgan vaqtda ma'lumotlar bazasiga ulangan holda qoladi. A
ajratilgan RowSet (1080-bet) ulanadi, so‘rovni bajaradi, so‘ngra ulanishni yopadi.
• JdbcRowSet (1080-bet) (bog'langan RowSet) ResultSet obyektini o'rab oladi va sizga aylantirish va
uning qatorlarini yangilang. ResultSet ob'ektidan farqli o'laroq, JdbcRowSet sukut bo'yicha aylantirilishi va yangilanishi mumkin.
• CachedRowSet (1080-bet), ajratilgan RowSet, ResultSet ma'lumotlarini xotirada keshlaydi. A
CachedRowSet aylantirilishi va yangilanishi mumkin. CachedRowSet ham serializatsiya qilinadi.
• RowSetProvider klassi (javax.sql.rowset paketi; 1080-bet) newFacto-ning statik usulini ta'minlaydi.
ry RowSetFactory interfeysini amalga oshiradigan ob'ektni qaytaradi (javax.sql.row- paketi
to'plam) har xil turdagi RowSets yaratish uchun ishlatilishi mumkin.
• RowSetFactory (1080-bet) createJdbcRowSet usuli JdbcRowSet obyektini qaytaradi.
• JdbcRowSet usuli setUrl ma'lumotlar bazasi URL manzilini belgilaydi.
• JdbcRowSet usuli setUsername foydalanuvchi nomini belgilaydi.
• JdbcRowSet usuli setPassword parolni belgilaydi.
• JdbcRowSet usuli setCommand RowSet to'ldirish uchun ishlatiladigan SQL so'rovini belgilaydi.
• JdbcRowSet usulini bajarish SQL so'rovini bajaradi. Metod execute performs o'rnatadi a
Ma'lumotlar bazasiga ulanish, so'rov bayonnomasini tayyorlaydi, so'rovni bajaradi va qayta ma'lumotlarni saqlaydi.
sultSet so'rov orqali qaytarildi. Ulanish, bayonot va Natijalar to'plami inkapsullangan
JdbcRowSet obyekti.
24.8-bo'lim Tayyorlangan bayonotlar
• PreparedStatements (1082-bet) kompilyatsiya qilingan, shuning uchun ular bayonotlarga qaraganda samaraliroq ishlaydi.
• PreparedStatements parametrlarga ega bo'lishi mumkin, shuning uchun bir xil so'rov turli argumentlar bilan bajarilishi mumkin.
• Parametr SQL bayonotida savol belgisi (?) bilan ko'rsatilgan. Oldindan bajarishdan oldin
paredStatement-da, argumentlarni belgilash uchun PreparedStatement-ning o'rnatilgan usullaridan foydalanishingiz kerak.
• PreparedStatement usuli setString (1082-bet) birinchi argumenti parametr sonini ifodalaydi.
ber o'rnatilmoqda va ikkinchi argument bu parametrning qiymati.
• Parametr raqamlari birinchi savol belgisidan (?) boshlab 1 dan hisoblanadi.
• SetString usuli kerak bo'lganda String parametr qiymatlaridan avtomatik ravishda chiqib ketadi.
• Interface PreparedStatement har bir qo'llab-quvvatlanadigan SQL turi uchun o'rnatilgan usullarni taqdim etadi.
24.9-bo'lim Saqlangan protseduralar
• JDBC dasturlarga CallableStatement yordamida saqlangan protseduralarni (1098-bet) chaqirish imkonini beradi.
(1098-bet) ob'ektlar.
• CallableStatement kirish parametrlarini belgilashi mumkin. CallableStatement chiqish parametrini belgilashi mumkin
eters (1098-bet), unda saqlangan protsedura qaytariladigan qiymatlarni joylashtirishi mumkin.

1104 24-bob JDBC yordamida ma'lumotlar bazalariga kirish



24.10 Tranzaksiyalarni qayta ishlash
• Tranzaksiyalarni qayta ishlash (1098-bet) ma'lumotlar bazasi bilan o'zaro aloqada bo'lgan dasturga ma'lumotlarni qayta ishlash imkonini beradi.
tabase operatsiyasi (yoki operatsiyalar to'plami) bitta operatsiya sifatida - atom operatsiyasi sifatida tanilgan
(1099-bet) yoki bitim (1099-bet).
• Tranzaksiya yakunida bitimni bajarish yoki bekor qilish to‘g‘risida qaror qabul qilinishi mumkin.
• Tranzaktsiyani amalga oshirish (1099-bet) ma'lumotlar bazasi operatsiyalarini yakunlaydi - qo'shish, yangilash va o'chirish
yangi ma'lumotlar bazasi operatsiyasini amalga oshirmasdan, letesni qaytarib bo'lmaydi.
• Tranzaksiyani orqaga qaytarish (1099-bet) ma'lumotlar bazasini ma'lumotlar bazasi ishlashidan oldingi holatida qoldiradi.
• Java Ulanish interfeysi usullari orqali tranzaktsiyalarni qayta ishlashni ta'minlaydi.
• setAutoCommit (1099-bet) usuli har bir SQL bayonnomasi bajarilgandan keyin bajariladimi yoki yo'qligini aniqlaydi.
pletes (haqiqiy argument) yoki bir nechta SQL bayonotlarini tranzaktsiya sifatida guruhlash kerakmi.
• Avtomatik bajarish o'chirilgan bo'lsa, dastur tranzaksiyadagi oxirgi SQL bayonotiga amal qilishi kerak.
Ulanish usuliga qo'ng'iroq qilish (ma'lumotlar bazasiga o'zgartirish kiritish uchun; 1099-bet)
yoki Ulanish usulini qaytarish (ma'lumotlar bazasini tranzaktsiyadan oldingi holatiga qaytarish uchun);
p. 1099).
• getAutoCommit usuli (1099-bet) Ulanish uchun avtomatik qabul qilish holatini aniqlaydi.
O'z-o'zini tekshirish mashqlari
24.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) Xalqaro standart ma'lumotlar bazasi tili .
b) Ma'lumotlar bazasidagi jadval va dan iborat.
c) Bayonot ob'ektlari SQL so'rov natijalarini ob'ektlar sifatida qaytaradi.
d) jadvaldagi har bir satrni noyob tarzda aniqlaydi.
e) SQL kalit so'zidan keyin qatorlarni belgilovchi tanlash mezonlari keladi
so'rovda tanlang.
f) SQL kalit so'zlari so'rovda qatorlarni tartiblash tartibini belgilaydi.
g) Bir nechta ma'lumotlar bazasi jadvallari qatorlarini birlashtirish jadvallar deyiladi.
h) A(n) ma’lumotlarning uyushgan to‘plamidir.
i) A(n) - qiymatlari an-ning asosiy kalit qiymatlariga mos keladigan ustunlar to'plami.
boshqa jadval.
j) usul ma'lumotlar bazasiga ulanishni olish uchun ishlatiladi.
k) Interfeys Java dasturi va ma'lumotlar o'rtasidagi aloqani boshqarishga yordam beradi.
asos.
l) A(n) obyekti ma lumotlar bazasiga so rov yuborish uchun ishlatiladi.
m) ResultSet ob'ektidan farqli o'laroq, ob'ektlar aylantirilishi va yangilanishi mumkin.
sukut bo'yicha mumkin.
n) , uzilgan RowSet, ResultSet ma'lumotlarini xotirada keshlaydi.
O'z-o'zini tekshirish mashqlariga javoblar
24.1 a) SQL. b) qatorlar, ustunlar. c) Natijalar to'plami. d) asosiy kalit. e) QAYERDA. f) BUYURTMA BILAN. g) qo'shilish.
h) ma'lumotlar bazasi. i) chet el kaliti. j) DriverManager, getConnection. k) ulanish. l) bayonot.
m) JdbcRowSet, CachedRowSet. n) CachedRowSet.
Mashqlar
24.2 (Kitoblar ma'lumotlar bazasi uchun so'rovlar) Ushbu bobda ko'rsatilgan usullardan foydalanib,
kitoblar ma'lumotlar bazasi uchun to'liq so'rov ilovasini yaxshilang. Quyidagi oldindan belgilangan so'rovlarni taqdim eting:

1105-mashqlar



a) Mualliflar jadvalidan barcha mualliflarni tanlang.
b) Muayyan muallifni tanlang va shu muallif uchun barcha kitoblarni sanab chiqing. Har bir kitobning nomini, yilini kiriting
va ISBN. Ma'lumotni alifbo tartibida muallifning familiyasiga, so'ngra birinchisiga qarab tartiblang
nomi.
c) Muayyan sarlavhani tanlang va ushbu sarlavha uchun barcha mualliflarni sanab o'ting. Mualliflarni alifbo tartibida tartiblang
familiyasi, keyin ismi bilan.
d) O'zingizga mos deb hisoblagan boshqa so'rovlarni bering.
Har bir oldindan belgilangan so'rov uchun tegishli nomlar bilan JComboBox-ni ko'rsating. Shuningdek, foydalanuvchilarga etkazib berishga ruxsat bering
o'zlarining so'rovlari.
24.3 (Kitoblar ma'lumotlar bazasi uchun ma'lumotlarni manipulyatsiya qilish ilovasi) Ma'lumotlarni manipulyatsiya qilish ilovasini aniqlang.
kitoblar ma'lumotlar bazasi uchun ariza. Foydalanuvchi mavjud ma'lumotlarni tahrirlash va yangi ma'lumotlarni qo'shish imkoniyatiga ega bo'lishi kerak
ma'lumotlar bazasi (ma'lumotnoma va ob'ekt yaxlitligi cheklovlariga rioya qilish). Foydalanuvchiga ma'lumotlar bazasini tahrirlashiga ruxsat bering
quyidagi yo'llar bilan:
a) yangi muallif qo'shing.
b) Muallif uchun mavjud ma'lumotlarni tahrirlash.
c) muallifga yangi nom qo'shing. (Yodda tutingki, kitobda Au-
thorISBN jadvali.).
d) Mualliflarni sarlavhalar bilan bog'lash uchun AuthorISBN jadvaliga yangi yozuv qo'shing.
24.4 (Xodimlar ma'lumotlar bazasi) 10.5-bo'limda biz xodimlarga ish haqi to'lash ierarxiyasini joriy qildik.
har bir xodimning ish haqini hisoblash. Ushbu mashqda biz mos keladigan xodimlarning ma'lumotlar bazasini taqdim etamiz
xodimlar-ish haqi fondi ierarxiyasiga. (Xodimlar ma'lumotlar bazasini yaratish uchun SQL skripti taqdim etiladi
Ushbu bob uchun misollar.) Foydalanuvchiga quyidagilarga imkon beruvchi ilovani yozing:
a) xodimlar jadvaliga xodimlarni qo'shish.
b) Har bir yangi xodim uchun tegishli jadvalga ish haqi to'g'risidagi ma'lumotlarni qo'shing. Masalan,
maoshli xodim uchun maoshli xodimlar jadvaliga ish haqi to'g'risidagi ma'lumotlarni qo'shing.
24.33-rasmda xodimlarning ma'lumotlar bazasi uchun ob'ekt munosabatlari diagrammasi.
24.5 (Xodimlar ma'lumotlar bazasi so'rovi ilovasi) JComboBox va taqdim etish uchun 24.4 mashqni o'zgartiring
JTextArea foydalanuvchiga JComboBox-dan tanlangan yoki o'chirilgan so'rovni bajarishga ruxsat berish uchun.
JTextArea-da jarimaga tortildi. Oldindan belgilangan so'rovlar namunasi:
a) SOTISH bo'limida ishlaydigan barcha xodimlarni tanlang.
b) 30 soatdan ortiq ishlaydigan soatlik xodimlarni tanlang.
c) barcha komissiya xodimlarini komissiya stavkasining kamayish tartibida tanlang.
24.6 (Xodimlar ma'lumotlar bazasini manipulyatsiya qilish ilovasi) 24.5-mashqni bajarish uchun o'zgartiring
quyidagi vazifalar:
a) Bazaviy va komissiyali barcha xodimlarning asosiy ish haqini 10% ga oshirish.
b) Agar xodimning tug'ilgan kuni joriy oyda bo'lsa, 100 dollar bonus qo'shing.
c) yalpi savdosi 10 000 dollardan ortiq bo'lgan barcha komissiya xodimlari uchun 100 dollar bonus qo'shing.
24.7 (Manzil kitobini o'zgartirish: mavjud yozuvni yangilash) Shakldagi dasturni o'zgartiring. 24.30–
Foydalanuvchiga PersonQue-da updatePerson nomli usulni chaqirish imkonini beruvchi JButton bilan ta'minlash uchun 24.32.
ries klassi manzillar kitobi ma'lumotlar bazasidagi joriy yozuvni yangilash uchun.
24.8 (Manzil kitobini o'zgartirish: mavjud yozuvni o'chirish) 24.7-mashq dasturini o'zgartirish
foydalanuvchiga PersonQueries-da deletePerson nomli usulni chaqirish imkonini beruvchi JButton bilan ta'minlash
sinf manzillar kitobi ma'lumotlar bazasidagi joriy yozuvni o'chirish uchun.
24.9 (Ixtiyoriy loyiha: ma'lumotlar bazasi bilan bankomat ishini o'rganish) Ixtiyoriy bankomat qutisini o'zgartirish
Hisob ma'lumotlarini saqlash uchun haqiqiy ma'lumotlar bazasidan foydalanishni o'rganing (onlayn boblar 33-34). Biz tarafdorimiz
to'rtta ustundan iborat bitta jadvalga ega BankMa'lumotlar bazasini yaratish uchun SQL skriptini ko'rsating -
Hisob raqami (int), PIN (int), AvailableBalance (ikkita) va TotalBalance (ikkita).

1106 24-bob JDBC yordamida ma'lumotlar bazalariga kirish

24.33-rasm | Xodimlar ma'lumotlar bazasidagi jadval munosabatlari.

1

1



1

1

1



1 1

1

xodimlar



bo'lim nomi

xodim turi

tug'ilgan kun

familiya


ism

ijtimoiy Havfsizlik raqami

basePluscommissionEmployees

bonus


asosiy ish haqi

komissiya stavkasi

yalpi savdo

ijtimoiy Havfsizlik raqami

soatlik xodimlar

bonus


ish haqi

soat


ijtimoiy Havfsizlik raqami

maoshli xodimlar

bonus

haftalik ish haqi



ijtimoiy Havfsizlik raqami

komissiya xodimlari

bonus

komissiya stavkasi



yalpi savdo

ijtimoiy Havfsizlik raqami


JavaFX GUI: 1-qism 25


Ammo, yumshoq! qanday yorug'lik o'tadi
deraza sinishi bormi?
Bu sharq, Julietta esa
quyosh!
- Uilyam Shekspir
Hatto hayotidagi kichik bir voqea
bola - bu bolaning hodisasi
dunyo va shuning uchun dunyo hodisasi.
- Gaston Bachelard
... eng dono payg'ambarlar ishonch hosil qiladilar
birinchi bo'lib voqea.
- Horace Walpole
Sizningcha, men kun bo'yi tinglay olamanmi?
bunday narsalarga?
- Lyuis Kerroll

Oh maqsadlar


Ushbu bobda siz:
■ JavaFX grafik interfeyslarini yaratish va
tomonidan yaratilgan hodisalarni boshqarish
foydalanuvchining ular bilan aloqalari.
■ a ning tuzilishini tushunish
JavaFX ilova oynasi.
■ Buning uchun JavaFX Scene Builder dasturidan foydalaning
FXML fayllarini yarating
JavaFX sahnalarini tasvirlab bering
o'z ichiga olgan teglar,
ImageViews, TextFields,
Slayderlar va tugmalar
hech qanday kod yozmasdan.
■ GUI komponentlarini tartibga soling
VBox yordamida va
GridPane layout konteynerlari.
■ uchun kontroller sinfidan foydalaning
uchun hodisa ishlov beruvchilarini aniqlang
JavaFX FXML grafik interfeysi.
■ Ikkita JavaFX ilovasini yarating.

1108 25-bob JavaFX GUI: 1-qism

25.1 Kirish
[Izoh: Ushbu bob uchun zarur shartlar 1–11-boblardir. Ushbu bo'lim talab qilmaydi
Siz 12-bob, GUI komponentlari: Swing GUI haqida gapiradigan 1-qismni oʻqiganingiz.]
Grafik foydalanuvchi interfeysi (GUI) foydalanuvchi bilan muloqot qilish uchun qulay mexanizmni taqdim etadi
ilova. GUI ("GOO-ee" deb talaffuz qilinadi) ilovaga o'ziga xos "ko'rinish va his" beradi. GUI'lar
GUI komponentlaridan qurilgan. Ular ba'zan boshqaruv yoki vidjetlar deb ataladi - qisqartmasi
oyna gadjetlari. GUI komponenti - bu foydalanuvchi bilan o'zaro aloqada bo'lgan ob'ekt
sichqoncha, klaviatura yoki ovozni aniqlash kabi boshqa kiritish shakli.

Java-da GUI tarixi


Java-ning asl GUI kutubxonasi Abstract Window Toolkit (AWT) edi. Swing (12-bob
va 22) Java SE 1.2 da platformaga qo'shildi. O'shandan beri Swing birinchi o'rinni egalladi.
mary Java GUI texnologiyasi. Swing hozir texnik xizmat ko‘rsatish rejimida — Oracle o‘chirishni to‘xtatdi.
rivojlanish va faqat keyingi xatolarni tuzatishni ta'minlaydi; ammo, u qismi qoladi
Java va hali ham keng qo'llaniladi.
Java-ning GUI, grafik va kelajakdagi multimedia API-si JavaFX. Quyosh mikrotizimlari
(2010-yilda Oracle tomonidan sotib olingan) 2007-yilda JavaFX-ni Adobe Flash-ga raqobatchi sifatida e'lon qildi.
va Microsoft Silverlight. JavaFX 1.0 2008 yilda chiqarilgan. 2.0 versiyasidan oldin ishlab chiqilgan
Operatorlar JavaFX ilovalarini yozish uchun JavaScript-ga o'xshash JavaFX skriptidan foydalanganlar. The
JavaFX skriptining manba kodi Java baytekodiga kompilyatsiya qilingan bo'lib, JavaFX ilovalariga quyidagi saytlarda ishlashga imkon beradi.
Java virtual mashinasi. 2011-yilda 2.0 versiyasidan boshlab, JavaFX qayta ishga tushirildi
to'g'ridan-to'g'ri Java ilovalarida foydalanish mumkin bo'lgan Java kutubxonalari to'plami. JavaFX ning ba'zi afzalliklari
Swing va boshqalar quyidagilarni o'z ichiga oladi:

25.1 Kirish


25.2 JavaFX Scene Builder va
NetBeans IDE
25.3 JavaFX ilova oynasi tuzilishi
25.4 Xush kelibsiz ilovasi - matnni ko'rsatish va
rasm
25.4.1 Ilova loyihasini yaratish
25.4.2 NetBeans loyihalari oynasi—
Loyiha mazmunini ko'rish
25.4.3 Loyihaga rasm qo'shish
25.4.4 JavaFX Scene Builder dasturini ochish
NetBeans
25.4.5 VBox Layout konteyneriga o'tish
25.4.6 VBox tartibini sozlash
Idish

25.4.7 Yorliq qo'shish va sozlash


25.4.8 Qo'shish va sozlash
ImageView
25.4.9 Xush kelibsiz ilovasini ishga tushirish
25.5 Maslahat Kalkulyator ilovasi — Kirish
Voqealarni boshqarish
25.5.1 Maslahat kalkulyatori ilovasini sinovdan o'tkazish
25.5.2 Texnologiyalar haqida umumiy ma'lumot
25.5.3 Ilovaning grafik interfeysini yaratish
25.5.4 MaslahatKalkulyator sinfi
25.5.5 TipCalculatorController klassi
25.6 Onlaynda yoritilgan xususiyatlar
JavaFX bo'limlari
25.7 Yakunlash

Xulosa | O'z-o'zini tekshirish mashqlari | O'z-o'zini tekshirish mashqlariga javoblar | Mashqlar | Farq qilish

Ko'rish va his qilish kuzatuvi 25.1
Turli ilovalarni izchil, intuitiv foydalanuvchi interfeysi komponentlari bilan ta'minlash foydalanuvchilarga a
yangi ilova bilan tanishlik hissi, ular uni tezroq o'rganishlari va undan ko'proq foydalanishlari uchun
samarali.

25.2 JavaFX Scene Builder va NetBeans IDE 1109



• JavaFXdan foydalanish osonroq — u GUI, grafik va multimedia uchun bitta API taqdim etadi
(rasmlar, animatsiya, audio va video), Swing esa faqat GUI uchun, shuning uchun siz
grafik va multimedia ilovalari uchun boshqa API lardan foydalanish kerak.
• Swing yordamida ko'plab IDElar sudrab olib tashlash uchun GUI dizayn vositalarini taqdim etdi
maketga komponentlar; ammo, har bir IDE turli xil kod ishlab chiqardi. JavaFX
Scene Builder (25.2-bo'lim) mustaqil ishlatilishi yoki ko'pchilik bilan birlashtirilgan bo'lishi mumkin
IDE va u IDE dan qat'iy nazar bir xil kodni ishlab chiqaradi.
• Swing komponentlarini moslash mumkin bo'lsa-da, JavaFX sizga to'liq beradi
Kaskad orqali JavaFX GUI ko'rinishini boshqarish (onlayn 26-bob)
Uslublar jadvallari (CSS).
• JavaFX bugungi kun uchun muhim bo'lgan ish zarralari xavfsizligini yaxshilash uchun ishlab chiqilgan
ko'p yadroli tizimlar.
• JavaFX JavaFX tarkibini o'zgartirish va yo'nalishini o'zgartirish uchun transformatsiyalarni qo'llab-quvvatlaydi.
ponentlar va JavaFX komponentlarining xususiyatlarini o'zgartirish uchun animatsiyalar
vaqt. Ular ilovalarni yanada intuitiv va ulardan foydalanishni osonlashtirish uchun ishlatilishi mumkin.
Ushbu bobda foydalanilgan JavaFX versiyasi
Ushbu bobda biz Java SE 7 bilan JavaFX 2.2 dan (2012 yil oxirida chiqarilgan) foydalanamiz.
bobning Windows, Mac OS X va Linuxdagi ilovalari. Ushbu yozish paytida Oracle edi
JavaFX 8 va Java SE 8 ni chiqarish arafasida. Bizning onlayn bo'limlarimiz 26 va 27 -
kitobning hamroh veb-sayti (ushbu kitobning ichki muqovasiga qarang) - qo'shimchani taqdim eting
JavaFX GUI xususiyatlari va JavaFX grafik va multimedia xususiyatlarini joriy eting.
JavaFX 8 va Java SE 8 matnlari.
25.2 JavaFX Scene Builder va NetBeans IDE
GUI dasturlashni joriy qiluvchi ko'pgina Java darsliklari qo'lda kodlangan grafik interfeyslarni taqdim etadi - bu
ya'ni mualliflar vizual grafik interfeysdan foydalanish o'rniga, Java kodida noldan grafik interfeyslarni yaratadilar
dizayn vositasi. Bu Java IDE bozorining buzilganligi bilan bog'liq - ko'plab Java IDElar mavjud
mualliflar foydalanilayotgan birorta IDEga bog'liq bo'lishi mumkin emas.
JavaFX boshqacha tashkil etilgan. JavaFX Scene Builder vositasi mustaqil JavaFX hisoblanadi
Turli IDElar, jumladan, eng mashhurlari bilan ham foydalanish mumkin bo'lgan GUI vizual tartiblash vositasi
Ular - NetBeans, Eclipse va IntelliJ IDEA. JavaFX Scene Builder juda chambarchas bog'langan.
NetBeans 1 bilan maydalangan, shuning uchun biz uni JavaFX taqdimotimizda ishlatamiz.
JavaFX Scene Builder GUI-ni sudrab olib tashlash orqali GUI yaratish imkonini beradi
Komponentlarni Scene Builder kutubxonasidan dizayn maydoniga o'tkazing, keyin o'zgartiring va uslublang
GUI - barchasi hech qanday kod yozmasdan. JavaFX Scene Builder-ning jonli tahriri va oldindan ko'rishi
xususiyatlar sizga GUI-ni yaratish va o'zgartirish jarayonida kompilyatsiya qilmasdan ko'rish imkonini beradi
ilovani ishga tushirish. Butun ko'rinishni o'zgartirish uchun kaskadli uslublar jadvallaridan (CSS) foydalanishingiz mumkin.
va GUI-ni his qilish - bu ba'zan terini terish deb ataladigan tushuncha. Onlayn 26-bobda biz
CSS bilan uslublash asoslarini namoyish eting.
Ushbu bobda biz yaratish uchun JavaFX Scene Builder 1.1 va NetBeans 7.4 dan foydalanamiz.
ikkita to'liq kirish JavaFX ilovalari. Onlayn boblar 26–27 JavaFX Scene-dan foydalanadi
Builder 2.0, bu kitob nashrga chiqqanda chiqarilishi kerak edi.
1. http://www.oracle.com/technetwork/java/javafx/tools/index.html.

1110 25-bob JavaFX GUI: 1-qism

FXML nima?
GUI yaratish va o'zgartirish jarayonida JavaFX Scene Builder FXML (FX Markup) ni yaratadi.
Language) - JavaFX GUI boshqaruvlarini belgilash va tartibga solish uchun XML lug'ati -
har qanday Java kodini yozish. Ushbu bo'limni o'rganish uchun FXML yoki XML tilini bilishingiz shart emas.
25.4-bo'limda ko'rib turganingizdek, JavaFX Scene Builder FXML ma'lumotlarini sizdan yashiradi, shuning uchun
Siz qanday yaratishni ko'rsatmasdan GUI nimani o'z ichiga olishi kerakligini aniqlashga e'tibor qaratishingiz mumkin
yedim - bu biz Java SE bilan ishlatgan deklarativ dasturlashning yana bir misolidir
17-bobdagi lambdalar.

25.3 JavaFX ilova oynasi tuzilishi


JavaFX ilova oynasi 25.4– bo‘limlarida foydalaniladigan bir necha qismlardan iborat (25.1-rasm)
25.5:

• JavaFX ilovasining GUI ko'rsatiladigan oyna sahna va deb nomlanadi


Stage sinfining namunasidir (javafx.stage paketi).
• Sahna GUIni sahna grafigi — daraxt sifatida belgilaydigan bitta faol sahnani o'z ichiga oladi
GUI boshqaruvlari, shakllar, tasvirlar, videolar kabi ilovaning vizual elementlarining maʼlumotlar tuzilishi
eo, matn va boshqalar. Sahna Scene sinfining namunasidir (javafx.scene paketi).
• Sahna grafigidagi har bir vizual element tugun bo'lib, quyi sinfning bir misolidir
Umumiy atributlar va xatti-harakatlarni belgilaydigan tugun (javafx.scene paketi).
sahna grafigidagi barcha tugunlar uchun. Sahnadagi birinchi tugun bundan mustasno
grafik - ildiz tugunlari sifatida tanilgan - har bir tugun bitta ota-onaga ega. Tugunlar bo'lishi mumkin
transformatsiyalar (masalan, siljitish, aylantirish, masshtablash va qiyshayish), shaffoflik (boshqaruvchi)
tugun shaffofmi, qisman shaffof yoki noaniqmi), effektlar (masalan, tomchi
soyalar, loyqalar, aks ettirish va yoritish) va boshqalarni biz onlayn tarzda taqdim etamiz
26-bob.

Dasturiy ta'minot muhandisligi kuzatuvi 25.1


FXML kodi Java manba kodida belgilangan dastur mantig'idan alohida -
interfeysni (GUI) amalga oshirishdan (Java kodi) bu ajratish
JavaFX GUI ilovalarini disk raskadrovka qilish, o'zgartirish va saqlash osonroq.

25.1-rasm | JavaFX ilova oynasi qismlari.

JavaFX ning har biri
ushbu GUI komponentlari a
sahna grafigidagi tugun

Ushbu sahna sahnasining ildiz tugunlari


grafik - bu joylashtirish konteyneridir
boshqa tugunlarni tartibga soladi

Deraza sahna sifatida tanilgan

Sahna sahnasi o'z ichiga oladi
tugunlarning sahna grafigi

25.4 Xush kelibsiz ilovasi — matn va tasvirni ko‘rsatish 1111

• Bolalari bo'lgan tugunlar, odatda, ularning bolasini tartibga soluvchi tartibli konteynerlardir
sahnadagi tugunlar. Bunda siz ikkita layout konteyneridan (VBox va GridPane) foydalanasiz
26–27-boblarda onlayn bo'lim va yana bir qancha ma'lumotlarni bilib oling.
• Tartibli konteynerda joylashtirilgan tugunlar boshqaruv elementlari va, in
murakkabroq GUI-lar, ehtimol boshqa joylashtirish konteynerlari. Boshqaruv elementlari GUI kompozitsiyasidir
Matnni aks ettiruvchi teglar, dasturni qayta ishlashga imkon beruvchi TextFields kabilar.
foydalanuvchi tomonidan kiritilgan matnni, harakatlarni boshlaydigan tugmalarni va boshqalarni qabul qiling. Qachon
foydalanuvchi boshqaruv elementi bilan o'zaro ishlaydi, masalan, tugmani bosish, boshqaruv elementni yaratadi
voqea. Dasturlar ushbu hodisalarga javob berishi mumkin, masalan, voqealarni boshqarish
har bir foydalanuvchi shovqini sodir bo'lganda nima bo'lishi kerakligini belgilang.
• Hodisa ishlov beruvchisi foydalanuvchi o‘zaro ta’siriga javob beruvchi usuldir. FXML
GUI voqea ishlov beruvchilari boshqaruvchi sinf deb ataladigan sinfda aniqlanadi (siz ko'rib turganingizdek
25.5.5-bo'lim).
25.4 Xush kelibsiz ilovasi - matn va rasmni ko'rsatish
Ushbu bo'limda hech qanday kod yozmasdan matnni ko'rsatadigan JavaFX Welcome ilovasini yaratasiz
Labelda va tasvir ImageViewda (25.2-rasm). Birinchidan, siz JavaFX ilova loyihasini yaratasiz
NetBeans IDE da. Keyin vizual dasturlash texnikasi va JavaFX Scene-dan foydalanasiz
JavaFX komponentlarini dizayn maydoniga sudrab olib tashlash uchun Builder. Keyin JavaFX dan foydalanasiz
Yorliqlar matni va shrifti kabi parametrlarni sozlash uchun Scene Builder inspektor oynasi
hajmi va ImageView tasviri. Nihoyat, siz NetBeans'dan dasturni ishga tushirasiz. Ushbu bo'lim
Siz Boshlashdan oldin bo'limni o'qib chiqdingiz va NetBeans va Scene-ni o'rnatdingiz deb taxmin qiladi
Quruvchi. Ushbu bob misollari uchun biz NetBeans 7.4, Scene Builder 1.1 va Java SE 7 dan foydalandik.

25.4.1 Ilova loyihasini yaratish


Endi JavaFX FXML ilovasini yaratish uchun NetBeans’dan foydalanasiz. Tizimingizda NetBeans-ni oching.
Dastlab, Bosh sahifa (25.3-rasm) ko'rsatiladi - bu sahifa sizga NetBeans havolalarini beradi.
hujjatlar va agar mavjud bo'lsa, so'nggi loyihalaringiz ro'yxatini ko'rsatadi.

25.2-rasm | Windows 7 da ishlaydigan yakuniy Welcome ilovasi.

Yorliq komponenti

ImageView komponentlari


1112 25-bob JavaFX GUI: 1-qism

Yangi loyiha yaratish
Ilova yaratish uchun avvalo loyiha yaratishingiz kerak - kod fayllari kabi tegishli fayllar guruhi
va ilovani tashkil etuvchi tasvirlar. Asboblar panelidagi Yangi loyiha… ( ) tugmasini bosing yoki
Yangi loyiha dialog oynasini ko'rsatish uchun File > New Project… ni tanlang (25.4-rasm). Kategoriyalar ostida,
JavaFX ni tanlang va Loyihalar ostida JavaFX FXML ilovasini tanlang, keyin Keyingi > tugmasini bosing.

25.3-rasm | Bosh sahifani ko'rsatadigan NetBeans IDE.

25.4-rasm | Yangi loyiha dialogi.

25.4 Xush kelibsiz ilovasi — matn va tasvirni ko‘rsatish 1113

Yangi JavaFX ilovalari dialogi
Yangi JavaFX ilovasi dialog oynasida (25.5-rasm) quyidagi ma'lumotlarni ko'rsating:
1. Loyiha nomi: maydoni — bu ilovangiz nomi. Ushbu maydonga xush kelibsiz.
2. Loyihaning joylashuvi: maydoni — loyihaning tizimingizdagi joylashuvi. NetBeans joylari
foydalanuvchi hisobingizdagi NetBeansProjects kichik katalogidagi yangi loyihalar
Hujjatlar papkasi. Boshqa joyni belgilash uchun “Browse…” tugmasini bosishingiz mumkin.
tion. Loyihangiz nomi pastki katalog nomi sifatida ishlatiladi.
3. FXML nomi: maydon - Ilovani o'z ichiga olgan FXML fayl nomi
GUI. Bu yerga Welcome ni kiriting — IDE loyihada Welcome.fxml faylini yaratadi.
4. Ilovalar sinfini yaratish: katakchasi - bu belgilansa, NetBeans a yaratadi
belgilangan nomga ega sinf. Ushbu sinf ilovaning asosiy usulini o'z ichiga oladi. Kirish
Ushbu sohaga xush kelibsiz. Agar sinf nomidan oldin paket nomini yozsangiz, Net-
Fasol ushbu paketdagi sinfni yaratadi; aks holda, NetBeans sinfni joylashtiradi
standart paket.
Loyihani yaratish uchun Finish tugmasini bosing.

25.4.2 NetBeans loyihalar oynasi — loyiha mazmunini ko‘rish


NetBeans Loyihalari oynasi barcha loyihalaringizga kirish imkonini beradi. Xush kelibsiz tugun
ushbu ilova loyihasini ifodalaydi. Siz bir vaqtning o'zida ko'plab loyihalarni ochishingiz mumkin - har birida o'z bo'ladi
o'z yuqori darajadagi tugun. Loyiha tugunida tarkib papkalarga va
fayllar. Xush kelibsiz > Manbani kengaytirish orqali Welcome loyihasining mazmunini ko'rishingiz mumkin

25.5-rasm | Yangi JavaFX ilovasi dialog oynasi.


1114 25-bob JavaFX GUI: 1-qism

Paketlar > tugun (25.6-rasm). Agar siz paket nomini belgilagan bo'lsangiz
25.5-rasmdagi ilova sinfi bo'lsa, emas, balki ushbu paket nomi paydo bo'ladi.

NetBeans JavaFX FXML ilova loyihasi uchun uchta fayl yaratadi va ochadi:


• Welcome.fxml—Ushbu faylda GUI uchun FXML belgilari mavjud. Avvalboshdan,
IDE tugma va yorliqdan iborat grafik interfeysni yaratadi.
• Welcome.java — bu FXML faylidan GUI yaratuvchi asosiy sinfdir
va GUI-ni oynada ko'rsatadi.
• WelcomeController.java — bu siz GUI-ni belgilaydigan sinfdir
ilovaga foydalanuvchining GUI bilan oʻzaro munosabatlariga javob berishga imkon beruvchi voqea ishlov beruvchilari.
25.5-bo'limda biz voqea ishlov beruvchilari bilan ilovani taqdim etganimizda, biz asosiy ilovani muhokama qilamiz
sinf va nazoratchi sinfi batafsil. Welcome ilovasi uchun siz ulardan hech birini tahrirlamaysiz
NetBeans-dagi fayllar, shuning uchun ularni yopishingiz mumkin. WelcomeController.java kerak emas
Ushbu ilovadagi faylni tanlang, shuning uchun siz Loyihalar oynasida faylni o'ng tugmasini bosib, O'chirish-ni tanlashingiz mumkin
uni olib tashlang. Faylni o'chirish uchun tasdiqlash dialog oynasida Ha ni bosing.
25.4.3 Loyihaga rasm qo'shish
Ilovangizdagi rasmdan foydalanishning usullaridan biri uning faylini loyihaga qo'shish va keyin uni ekranda ko'rsatishdir
ImageView. Ushbu ilova uchun ishlatadigan bug.png tasviri rasmlar pastki papkasida joylashgan
ushbu bobning misollar papkasidan. Fayl tizimingizdagi tasvirlar jildini toping, so'ngra sudrang
faylni loyihaga qo'shish uchun loyihaning tuguniga bug.png faylini kiriting.
25.4.4 NetBeans'dan JavaFX Scene Builder dasturini ochish
Endi siz ushbu ilovaning grafik interfeysini yaratishingiz uchun JavaFX Scene Builder dasturini ochasiz. Buning uchun,
Loyihalar oynasida Welcome.fxml-ni o'ng tugmasini bosing, so'ngra FXML faylini ko'rish uchun Ochish-ni tanlang
Scene Builder da (25.7-rasm).
Standart boshqaruv elementlarini o'chirish
NetBeans tomonidan taqdim etilgan FXML fayli birlamchi grafik interfeysni o'z ichiga oladi.
trol va Label boshqaruvi. Xush kelibsiz ilovasi bu standart boshqaruv elementlaridan foydalanmaydi, shuning uchun siz mumkin
ularni o'chirib tashlang. Buning uchun kontent panelidagi (yoki ierarxiya oynasida) har birini bosing
Scene Builder oynasining pastki chap tomonida), keyin Backspace yoki Delete tugmasini bosing. Har birida
Bunday holda, Scene Builder "Ba'zi komponentlarda fx: id mavjud. Haqiqatan ham
ularni yo'q qilmoqchimisiz?". Bu shuni anglatadiki, loyihada Java kodi bo'lishi mumkin

25.6-rasm | NetBeans loyihalari oynasi.

Kengaytirilgan tugun

Yiqilgan tugun


25.4 Xush kelibsiz ilovasi — matn va tasvirni ko‘rsatish 1115

ushbu boshqaruv elementlariga - bu ilova uchun bunday kod bo'lmaydi, shuning uchun "O'chirish" tugmasini bosishingiz mumkin
ushbu boshqaruv elementlarini olib tashlang.
WelcomeController sinfiga havolani o'chirish
25.5-bo'limda bilib olganingizdek, Scene Builder-da siz kontroller nomini belgilashingiz mumkin
foydalanuvchining GUI bilan o'zaro munosabatlariga javob berish usullarini o'z ichiga olgan sinf. The
Xush kelibsiz ilovasi foydalanuvchilarning har qanday muloqotiga javob berishi shart emas, shuning uchun siz ko'rsatmani olib tashlaysiz.
FXML faylida WelcomeController sinfiga o'ting. Buning uchun AnchorPane-ni tanlang
ierarxiya oynasida tugunni tanlang, so'ngra kengaytirish uchun Inspektor oynasining Kod bo'limini bosing
uni va Controller klassi maydonida ko'rsatilgan qiymatni o'chiring. Endi siz yaratishga tayyorsiz
Xush kelibsiz ilovaning GUI.
25.4.5 VBox Layout konteyneriga o'tish
Ushbu ilova uchun VBox layout konteyneriga Label va ImageView joylashtirasiz (paket).
javafx.scene.layout), bu sahna grafigining ildiz tuguniga aylanadi. Layout konteynerlari yordam beradi
GUI komponentlarini tartibga soling va o'lchamsiz. VBox o'z tugunlarini yuqoridan vertikal ravishda joylashtiradi
pastki. VBox GUI-da boshqaruv elementlarini tartibga solish uchun bir nechta JavaFX layout konteynerlaridan biridir.
Biz GridPane layout konteynerini 25.5-bo'limda va boshqa bir nechta onlaynda muhokama qilamiz
26-bob. Odatiy bo'lib, NetBeans ildiz tartibi sifatida AnchorPane-ni taqdim etadi. Tuzatmoq
standart AnchorPane-dan VBox-ga:

ii

25.7-rasm | Welcome.fxml-da standart GUI-ni aks ettiruvchi JavaFX Scene Builder.



Kutubxonada JavaFX konteynerlari mavjud,
Boshqarish va sudrab borish mumkin bo'lgan boshqa elementlar
va tuvalga tushdi

Ierarxiya oynasi tuzilishini ko'rsatadi


GUI va boshqaruv elementlarini tanlash va qayta tashkil qilish imkonini beradi

dan foydalanasiz


kontent paneliga
GUI-ni loyihalash

Buning uchun Inspektor oynasidan foydalanasiz


joriy tanlangan elementni sozlang
kontent paneli

1116 25-bob JavaFX GUI: 1-qism



1. Standart maketga VBox qo'shish. Kutubxona oynasidan VBox-ni torting
Scene Builder kontent panelidagi standart AnchorPane-ga konteynerlar bo'limi.
2. VBox-ni Root Layout qilish. Tahrirlash > Hujjatni tanlash uchun kesish-ni tanlang
VBox-ni ildiz tartibiga aylantiring va AnchorPane-ni olib tashlang.
25.4.6 VBox Layout konteynerini sozlash
Endi siz VBox-ning hizalanishini, boshlang'ich hajmini va to'ldirishni belgilaysiz:
1. VBox ning alignmentini belgilash. VBox-ning moslashuvi joylashuvni aniqlaydi.
VBox bolalarini tilga olish. Ushbu ilovada biz har bir kichik tugunni xohlaymiz (Label va
ImageView) sahnaning gorizontal markazida bo'lishini va biz ikkala bolani ham xohlaymiz
Yorliq ustidagi bo'sh joy teng bo'lishi uchun vertikal markazlashtirilgan bo'lishi kerak
va ImageView ostida. Buni amalga oshirish uchun VBox-ni tanlang, so'ngra Tekshirish-da
torning Xususiyatlar bo'limida Alignment xususiyatini CENTER ga o'rnating. ni o'rnatganingizda
Hizalama, siz foydalanishingiz mumkin bo'lgan turli xil moslashtirish qiymatlariga e'tibor bering.
2. VBoxning afzal ko'rgan hajmini belgilash. Tanlangan o'lcham (kenglik va balandlik).
sahna grafigining ildiz tugunidan sahna tomonidan uning oyna hajmini qachon aniqlash uchun foydalaniladi
ilova ishga tusha boshlaydi. Afzal o'lchamni o'rnatish uchun VBox-ni, so'ngra ichidan tanlang
Inspector's Layout bo'limida Pref Width xususiyatini 450 va Pref Height ga o'rnating.
mulk 300 ga.
25.4.7 Yorliq qo'shish va sozlash
Keyin, “JavaFX ga xush kelibsiz!” ko‘rsatuvchi Yorliq yaratasiz:
1. VBox-ga yorliq qo'shish. Kutubxona oynasining Boshqaruv elementlaridan yorliqni torting
VBox-ga bo'lim. Yorliq avtomatik ravishda VBox-da markazlashtiriladi, chunki
siz 25.4.6-bo'limda VBox-ni CENTERga moslashtirishni o'rnatdingiz.
2. Yorliq matnini o'zgartirish. Yorliq matnini ikki marta bosish orqali o'rnatishingiz mumkin
va matnni terish yoki Yorliqni tanlash va uning matn xususiyatini o'rnatish orqali
Inspektorning xususiyatlari bo'limi. Yorliq matnini "JavaFX ga xush kelibsiz!" ga o'rnating.
3. Label shriftini o'zgartirish. Ushbu ilova uchun biz Yorliqni katta qalin qilib ko'rsatish uchun o'rnatdik
shrift. Buning uchun Yorliqni tanlang, so'ng Inspektorning afzalliklari bo'limida bosing
Shrift xususiyatining o'ng tomonidagi qiymat. Ko'rsatilgan oynada ni o'rnating
style xossasini Boldga va size xossasini 30 ga.
25.4.8 ImageView qo'shish va sozlash
Nihoyat, siz bug.png ko'rsatadigan ImageView-ni qo'shasiz:
1. VBox-ga ImageView qo'shish. Kutubxona oynasidan ImageView-ni torting
VBox-dagi boshqaruv bo'limi. ImageView avtomatik ravishda pastga joylashtiriladi
Yorliq. Siz VBox-ga qo'shadigan har bir yangi boshqaruv VBox-ning boshqa chil-ning ostida joylashgan.
dren, lekin siz bolalarni Scene Build-da sudrab tartibni o'zgartirishingiz mumkin.
er ierarxiyasi oynasi. Label kabi, ImageView ham avtomatik ravishda ishlaydi
VBox-da markazlashtirilgan.
2. ImageViews tasvirini o'rnatish. Rasmni ko'rsatish uchun sozlash uchun ImageView-ni tanlang
va Inspect-da Image xususiyatining o'ng tomonidagi ellips (...) tugmasini bosing.

25.4 Xush kelibsiz ilovasi — matn va rasmni ko‘rsatish 1117

torning xususiyatlari bo'limi. Odatiy bo'lib, Scene Builder ko'rsatuvchi dialog oynasini ochadi
loyihaning manba kodi papkasida, bug.png rasm faylini joylashtirgan joy
25.4.3-bo'lim. Rasm faylini tanlang, so'ng Ochish tugmasini bosing. Scene Builder ni ko'rsatadi
tasvirni o'zgartiradi va ImageView o'lchamini tasvirning nisbati - nisbatiga mos keladigan qilib o'zgartiradi
tasvirning kengligini uning balandligiga - ImageView-ning Fit Width va Fit parametrlarini o'rnatish orqali
Balandlik xususiyatlari.
3. ImageView o'lchamini o'zgartirish. Biz rasmni asl o'lchamida ko'rsatishni xohlaymiz.
Buning uchun ImageView-ning Fit Width va Fit uchun standart qiymatlarini o'chirishingiz kerak
Inspektorning joylashuvi bo'limida joylashgan balandlik xususiyatlari. Bir marta siz
ushbu qiymatlarni o'chirib tashlasangiz, Scene Builder ImageView o'lchamini tasvirning aniq o'lchamiga o'zgartiradi.
eslatmalar. FXML faylini saqlang.
Siz GUI-ni tugatdingiz. Scene Builder kontent paneli endi shunday ko'rinishi kerak
25.8-rasmda ko'rsatilgan.

25.4.9 Xush kelibsiz ilovasini ishga tushirish


Ilovani NetBeans-dan uchta usuldan birida ishga tushirishingiz mumkin:
• NetBeans Projects oynasida loyihaning ildiz tugunini tanlang, so'ng tugmasini bosing
Asboblar panelidagi Loyihani ishga tushirish ( ) tugmasi.
• NetBeans Projects oynasida loyihaning ildiz tugunini tanlang, so'ng F6 tugmasini bosing.
• NetBeans Projects oynasida loyihaning ildiz tugunini o‘ng tugmasini bosing, so‘ng tanlang
Yugurish.
Har holda, IDE ilovani kompilyatsiya qiladi (agar u allaqachon kompilyatsiya qilinmagan bo'lsa), keyin dasturni ishga tushiring.
Xush kelibsiz ilovasi endi 25.2-rasmda ko'rsatilganidek paydo bo'lishi kerak.

25.8-rasm | Scene Builder-da Welcome ilovasining GUI dizayni tugallandi.


1118 25-bob JavaFX GUI: 1-qism

25.5 Maslahat kalkulyatori ilovasi — Voqeaga kirish
Ishlov berish
Maslahat kalkulyatori ilovasi (25.9(a)-rasm) restoran toʻlovi uchini va jami hisoblab chiqadi va koʻrsatadi.
Odatiy bo'lib, ilova 15% maslahat bilan jami hisoblaydi. Maslahat foizini belgilashingiz mumkin
Slayder bosh barmog'ini siljitish orqali 0% dan 30% gacha - bu maslahat foizini yangilaydi
(25.9-rasm (b) va (c)). Ushbu bo'limda siz bir nechta JavaFX yordamida Maslahat kalkulyatori ilovasini yaratasiz
komponentlar va foydalanuvchilarning GUI bilan o'zaro munosabatlariga qanday javob berishni o'rganing.

25.9-rasm | Hisob-kitob miqdorini kiritish va uchini hisoblash.

Slayder bosh barmog'ini quyidagiga o'tkazing
uchi foizini o'zgartiring

a) Boshlang'ich Maslahat Kalkulyator GUI

Joriy maslahat foizi
ushbu Yorliqda ko'rsatiladi

Bunda foydalanuvchi hisob miqdorini kiritadi


TextField

Sarlavha paneli

b) foydalanuvchi 34.56 miqdorini kiritgandan so'ng GUI
va Hisoblash tugmasini bosing

Foydalanuvchi Hisoblash tugmasini bosadi


Maslahatni ko'rsatish uchun tugma
va jami

c) GUI foydalanuvchi uchini o'zgartirish uchun Slayderning bosh barmog'ini harakatga keltirgandan so'ng


foizni 20% gacha, keyin Hisoblash tugmasini bosing

Yangilangan maslahat foizi


foydalanuvchi ko'chirilgandan keyin
Slayderning bosh barmog'i

25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1119



Siz 15% va 10% maslahatlarni hisoblash uchun ilovani sinovdan o'tkazishdan boshlaysiz. Keyin
biz ilovani yaratishda foydalanadigan texnologiyalarni ko'rib chiqamiz. Siz ilovaning grafik interfeysini yaratasiz
NetBeans va JavaFX SceneBuilder yordamida. Va nihoyat, biz to'liq Java-ni taqdim etamiz
ilova uchun kodni kiriting va batafsil kodni ko'rib chiqing.
25.5.1 Maslahat kalkulyatori ilovasini sinovdan o'tkazish
Ilovani ochish va ishga tushirish
NetBeans IDE-ni oching, so'ngra Maslahat kalkulyatori ilovasini ochish uchun quyidagi amallarni bajaring
loyihalash va uni ishga tushirish:
1. Maslahat kalkulyatori ilovasi loyihasini ochish. Fayl > Loyihani ochish… ni tanlang yoki ni bosing
Loyihani ochish muloqot oynasini ko'rsatish uchun asboblar panelidagi Project Open… ( ) tugmasini bosing.
Ushbu bobning misollar jildiga o'ting, TipCalculator-ni tanlang va tugmasini bosing
Loyihani ochish tugmasi. Endi Loyihalar oynasida TipCalculator tuguni paydo bo'ladi.
2. Maslahat kalkulyatori ilovasini ishga tushirish. ichida TipCalculator loyihasini o'ng tugmasini bosing
Loyihalar oynasini oching va asboblar panelidagi Loyihani ishga tushirish ( ) tugmasini bosing.
Jami hisobni kiritish
Klaviaturadan foydalanib, 34.56 kiriting, so'ng Hisoblash tugmasini bosing. Maslahat va jami
TextFields 15% uchlik uchun uchlik miqdori va umumiy hisobni ko'rsatadi (25.9(b)-rasm).
Maxsus maslahat foizini tanlash
Maxsus maslahat foizini belgilash uchun Slayderdan foydalaning. Slayderning bosh barmog'ini belgilanmaguncha torting.
foiz 20% ni o'qiydi (25.9(c)-rasm), so'ngra yangilangan ma'lumotni ko'rsatish uchun Hisoblash tugmasini bosing.
maslahat va jami. Bosh barmog'ingizni sudrab borganingizda, Slayderning chap tomonidagi Yorliqdagi uch foizi
doimiy ravishda yangilanadi. Odatiy bo'lib, Slayder 0,0 dan 100,0 gacha qiymatlarni tanlash imkonini beradi,
lekin bu ilovada biz Slayderni 0 dan 30 gacha butun sonlarni tanlash bilan cheklaymiz.
25.5.2 Texnologiyalar haqida umumiy ma'lumot
Ushbu bo'lim Maslahat Kalkulyator ilovasini yaratishda foydalanadigan texnologiyalar bilan tanishtiradi.
Sinf arizasi
JavaFX ilovasidagi asosiy sinf Ilovaning quyi klassi (javafx.applica- paketi)
tion.Ilova). Ilovaning asosiy usuli Ilovaning statik ishga tushirilishi sinfini chaqiradi
JavaFX ilovasini ishga tushirishni boshlash usuli. Bu usul, o'z navbatida, JavaFX ish vaqtini keltirib chiqaradi
Ilova kichik sinfining ob'ektini yaratish va uni yaratadigan boshlash usulini chaqirish
GUI, uni Sahnaga biriktiradi va uni Sahnaga qo'yadi, bu usul boshlanadi
argument.
GridPane yordamida JavaFX komponentlarini tartibga solish
Esda tutingki, joylashtirish konteynerlari JavaFX komponentlarini sahnada joylashtiradi. GridPane (paket
javafx.scene.layout) JavaFX komponentlarini to'rtburchaklar shaklida ustunlar va qatorlarga joylashtiradi.
lar panjara.
Ushbu ilova ko'rinishlarni ikkita ustun va beshtaga ajratish uchun GridPane (25.10-rasm) dan foydalanadi.
qatorlar. GridPane'dagi har bir katak bo'sh bo'lishi yoki bir yoki bir nechta JavaFX komponentlarini saqlashi mumkin,
shu jumladan, boshqa boshqaruv elementlarini tartibga soluvchi joylashtirish konteynerlari. GridPanedagi har bir komponent
bir nechta ustunlar yoki qatorlarni qamrab olishi mumkin, ammo biz ushbu GUIda bu imkoniyatdan foydalanmadik.

1120 25-bob JavaFX GUI: 1-qism

GridPane-ni Scene Builder-ning kontent paneliga tortsangiz, Scene Builder-ni yaratadi.
Sukut bo'yicha ikkita ustunli va uchta qatorli GridPane. Siz ustunlarni qo'shishingiz va o'chirishingiz mumkin
va kerak bo'lganda qatorlar. GUI-ni taqdim etar ekanmiz, GridPane-ning boshqa xususiyatlarini muhokama qilamiz.
qurilish bosqichlari. GridPane sinfi haqida ko'proq ma'lumot olish uchun tashrif buyuring:

Scene Builder yordamida grafik interfeysni yaratish va sozlash


Yorliqlar, matn maydonlari, slayder va tugmachalarni yaratasiz, ularni kontekstga torting.
Scene Builder-da chodir panelini o'rnating, so'ngra ularni Inspektor oynasidan foydalanib sozlang.
• TextField (javafx.scene.control paketi) foydalanuvchidan matn kiritishni qabul qilishi mumkin
yoki matnni ko'rsatish. Hisob raqamini kiritish uchun bitta tahrirlanadigan TextField dan foydalanasiz
maslahat va umumiy miqdorlarni ko'rsatish uchun foydalanuvchi va ikkita tahrirlanmaydigan TextFields.
• Slayder (javafx.scene.control paketi) 0,0– oralig‘idagi qiymatni ifodalaydi.
Sukut bo'yicha 100.0 va foydalanuvchiga harakatlanish orqali ushbu diapazondagi raqamni tanlash imkonini beradi
Slayderning bosh barmog'i. Siz Slayderni moslashtirasiz, shunda foydalanuvchi o'ziga xos narsani tanlashi mumkin
Maslahat foizi faqat cheklangan 0 dan 30 gacha.
• Tugma (javafx.scene.control paketi) foydalanuvchiga harakatni boshlash imkonini beradi.
tion—ushbu ilovada Hisoblash tugmasini bosish hisobni hisoblaydi va ko‘rsatadi
va umumiy miqdorlar.
Raqamlarni mahalliy valyuta va foiz qatorlari sifatida formatlash
Mahalliy valyutani yaratish uchun NumberFormat sinfidan (java.text paketi) foydalanasiz va
foiz satrlari - xalqarolashtirishning muhim qismi.
Voqealarni boshqarish
Odatda, foydalanuvchi ilova bajarishi kerak bo'lgan vazifalarni ko'rsatish uchun ilovaning grafik interfeysi bilan o'zaro ishlaydi.
shakl. Masalan, siz elektron pochta ilovasida elektron xat yozganingizda, Yuborish tugmasini bosing
ilovaga e-mailni belgilangan elektron pochta manzillariga yuborishni aytadi. GUI'lar voqealarga asoslangan.
Foydalanuvchi GUI komponenti bilan o'zaro aloqada bo'lganda, o'zaro ta'sir - hodisa sifatida tanilgan -

http://docs.oracle.com/javafx/2/api/javafx/scene/layout/GridPane.html

25.10-rasm | Maslahat Kalkulyator GUI ning GridPane satrlari va ustunlari bilan belgilanadi.

0-ustun 1-ustun

qator 0

1-qator


2-qator

qator 3


4-qator

25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1121

vazifani bajarish uchun dasturni boshqaradi. Ilovaga sabab bo'lgan ba'zi umumiy foydalanuvchi shovqinlari
vazifani bajarish uchun tugmani bosish, matn maydoniga yozish, a dan elementni tanlash kiradi
menyu, oynani yopish va sichqonchani harakatlantirish. Javob sifatida vazifani bajaradigan kod
hodisaga hodisa ishlovchisi deyiladi va hodisalarga javob berish jarayoni deb nomlanadi
hodisani boshqarish.
Ilova ma'lum bir boshqaruv uchun hodisaga javob berishidan oldin, sizga kerak:
1. Hodisa ishlov beruvchisini ifodalovchi va mos keladigan sinfni yarating
interfeys - hodisani tinglovchi interfeysi sifatida tanilgan.
2. Hodisa sodir bo'lganda ushbu sinf ob'ekti xabardor qilinishi kerakligini ko'rsating -
hodisa ishlovchisini ro'yxatdan o'tkazish sifatida tanilgan.
Ushbu ilovada siz ikkita hodisaga javob berasiz - foydalanuvchi Sliderning bosh barmog'ini harakatga keltirganda,
ilova joriy maslahat foizini ko'rsatadi Label yangilanadi, va qachon foydalanuvchi
Hisoblash tugmachasini bosgandan so'ng, ilova maslahat va umumiy hisob miqdorini hisoblab chiqadi va ko'rsatadi.
Siz ba'zi hodisalar uchun, masalan, foydalanuvchi tugmani bosganida, bog'lanishingiz mumkinligini ko'rasiz
Scene Builder inspektorining Kod bo'limidan foydalangan holda hodisalarni boshqarish usulini boshqarish
oyna. Bunday holda, voqea-tinglovchi interfeysini amalga oshiradigan sinf uchun yaratiladi
va siz belgilagan usulni chaqirasiz. Boshqaruvning qiymati sodir bo'lgan voqealar uchun
xususiyat o'zgaradi - masalan, foydalanuvchi Slayderning bosh barmog'ini o'zgartirganda
qiymat - voqea ishlov beruvchisini butunlay kodda yaratishingiz kerakligini ko'rasiz.

Slayderning bosh barmog'i holatini boshqarish uchun ChangeListener interfeysini qo'llash


O'zgarishlar
Siz ChangeListener interfeysini (javafx.beans.value paketidan)gacha amalga oshirasiz
Slayderning bosh barmog'ini harakatlantirgan foydalanuvchiga javob bering. Xususan, siz o'zgartirilgan usuldan foydalanasiz
foydalanuvchi Slayderning bosh barmog'ini harakatlantirganda foydalanuvchi tanlagan maslahat foizini ko'rsatish uchun.

Model-View-Controller (MVC) arxitekturasi


GUI FXML sifatida amalga oshirilgan JavaFX ilovalari Modelga mos keladi.
Ilova ma'lumotlarini ajratuvchi View-Controller (MVC) dizayn namunasi
modeli) ilovaning GUI (ko‘rinish) va ilovani qayta ishlash mantig‘idan (nazoratchi).
Tekshirish moslamasi foydalanuvchi ma'lumotlarini qayta ishlash uchun mantiqni amalga oshiradi. Modelda ilovalar mavjud
katyon ma'lumotlari va ko'rinish modelda saqlangan ma'lumotlarni taqdim etadi. Foydalanuvchi ba'zilarini taqdim qilganda
kiritish, kontroller berilgan kirish bilan modelni o'zgartiradi. Maslahat kalkulyatorida
model - hisob-kitob summasi, uchi va jami. Model o'zgarganda, boshqaruvchi
o'zgartirilgan ma'lumotlarni taqdim etish uchun ko'rinishni yangilaydi.
JavaFX FXML ilovasida siz nazoratchi sinfida ilovaning hodisa ishlov beruvchilarini aniqlaysiz. The
kontroller klassi boshqaruv elementlari bilan dasturiy ta'sir o'tkazish uchun misol o'zgaruvchilarini belgilaydi,
shuningdek, hodisalarni boshqarish usullari. Nazoratchi sinfi qo'shimchani ham e'lon qilishi mumkin
misol o'zgaruvchilari, statik o'zgaruvchilar va ilovaning ishlashini qo'llab-quvvatlaydigan usullar. a.da
Maslahat kalkulyatori, model va kontroller kabi oddiy dastur ko'pincha birlashtiriladi
Bu misolda qilganimizdek, bitta sinf.

FXMLLoader klassi


JavaFX FXML ilovasi ishga tusha boshlaganda, FXMLLoader sinfining statik usul yuklanishi
ilovaning GUI-ni ifodalovchi FXML faylini yuklash uchun ishlatiladi. Bu usul:

1122 25-bob JavaFX GUI: 1-qism

• GUI sahna grafigini yaratadi va Ota-ona (javafx.scene paketi) ref-ni qaytaradi.
sahna grafigining ildiz tuguniga o'tish.
• Manipulyatsiya qilinadigan komponentlar uchun kontroller misol o'zgaruvchilarini ishga tushiradi.
dasturiy jihatdan ishlab chiqilgan.
• FXMLda ko'rsatilgan har qanday hodisalar uchun hodisa ishlov beruvchilarini yaratadi va ro'yxatdan o'tkazadi.
Biz ushbu bosqichlarni 25.5.4–25.5.5 bo'limlarda batafsil muhokama qilamiz.

25.5.3 Ilovaning grafik interfeysini yaratish


Ushbu bo'limda biz Maslahat hisobini yaratish uchun Scene Builder-dan foydalanishning aniq qadamlarini ko'rsatamiz.
latorning GUI. Siz yakunlamaguningizcha GUI 25.9-rasmda ko'rsatilgandek ko'rinmaydi
qadamlar.

fx:id Ushbu ilova boshqaruv elementlari uchun xossa qiymatlari


Agar boshqaruv yoki tartib boshqaruvchi sinfida dasturiy tarzda boshqarilsa (biz o'zimiz uchun
Yorliqlardan biri, ushbu ilovadagi barcha TextFields va Slayder bilan bajaring), siz kerak
ushbu boshqaruv yoki tartib uchun nom bering. 25.5.4-bo'limda siz qanday deklaratsiya qilishni o'rganasiz
FXML-dagi har bir bunday komponent uchun manba kodingizdagi o'zgaruvchilar va biz muhokama qilamiz
bu o'zgaruvchilar siz uchun qanday ishga tushirilgan. Har bir ob'ektning nomi fx: id prop- orqali ko'rsatiladi.
erty. Sahnangizdagi komponentni tanlash orqali ushbu xususiyat qiymatini belgilashingiz mumkin, keyin esa
Inspektor oynasining Kod bo'limiga panding - fx: id xususiyati yuqori qismida paydo bo'ladi
Kod bo'limi. 25.11-rasmda Maslahat kalkulyatori dasturining fx:id xususiyatlari ko'rsatilgan.
manipulyatsiya qilingan boshqaruv elementlari. Aniqlik uchun bizning nomlash qoidamiz boshqaruv sinfidan foydalanishdir
fx: id xususiyatidagi nom.

TipCalculator loyihasini yaratish


Asboblar panelidagi Yangi loyiha… ( ) tugmasini bosing yoki Fayl > Yangi loyiha… ni tanlang. In
Yangi loyiha dialogi. Kategoriyalar ostida JavaFX ni va Loyihalar ostida JavaFX ni tanlang
FXML ilovasiga o'ting, so'ngra Keyingi > tugmasini bosing va Loyiha nomida TipCalculator-ni belgilang, FXML
nom va Ilovalar sinfini yaratish maydonlari. Loyihani yaratish uchun Finish tugmasini bosing.

25.11-rasm | Maslahat Kalkulyatorning fx: identifikatorlari bilan belgilangan dasturiy jihatdan boshqariladigan boshqaruv elementlari.

summaTextField

tipPercentageLabel tipPercentageSlider

tipTextField

totalTextField


25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1123

1-qadam: Ildiz tartibini AnchorPane-dan GridPane-ga o'zgartirish
TipCalculator.fxml-ni Scene Builder-da oching, shunda siz grafik interfeysni yaratishingiz va o'chirishingiz mumkin.
standart boshqaruv elementlari, keyin standart AnchorPane’dan GridPane’ga o‘zgartiring:
1. Standart sxemaga GridPane qo'shish. Kutubxona g'alabasidan GridPane-ni torting -
dow-ning Konteynerlar bo'limida Scene Builder tarkibidagi standart AnchorPane-ga o'ting
paneli.
2. GridPane-ni ildiz tartibiga aylantirish. Tahrirlash > Hujjatni tanlash uchun kesish-ni tanlang
GridPane-ni ildiz tartibiga aylantirish va AnchorPane-ni olib tashlash uchun.
2-qadam: GridPane-ga qatorlar qo'shish
Odatiy bo'lib, GridPane ikkita ustun va uchta qatorni o'z ichiga oladi. Eslatib o'tamiz, GUI ichida
25.10-rasm besh qatordan iborat. Mavjud qatorning ustiga yoki ostiga o'ng tomondan qator qo'shishingiz mumkin
qatorni bosing va To‘r paneli > Yuqoridagi qator qo‘shish yoki To‘r paneli > Pastga qator qo‘shish-ni tanlang.
Ikki qator qo'shgandan so'ng, GridPane 25.12-rasmda ko'rsatilganidek paydo bo'lishi kerak. foydalanishingiz mumkin
ustunlar qo'shish uchun shunga o'xshash qadamlar. Siz satr yoki ustunni o'ng tugmani bosish orqali o'chirishingiz mumkin.
satr yoki ustun raqamini belgilang va O'chirish-ni tanlang.

3-qadam: GridPane-ga boshqaruv elementlarini qo'shish


Endi siz 25.10-rasmdagi boshqaruv elementlarini GridPane-ga qo'shasiz. Fx: idlari bo'lganlar uchun (qarang
25.11-rasm), boshqaruv elementi tanlanganda Inspektor oynasida uning fx:id xususiyatini o‘rnating.
Kod bo'limi. Quyidagi amallarni bajaring:
1. Yorliqlarni qo'shish. Kutubxona oynasining Boshqaruv bo'limidan Yorliqlarni torting
GridPane chap ustunining birinchi to'rtta qatori (ya'ni, 0-ustun). Har birini qo'shsangiz
Yorliq, uning matnini ko'rsatilganidek o'rnating. 25.10-rasm.
2. Matn maydonlarini qo'shish. Kutubxona oynasining boshqaruv elementlaridan TextFields-ni torting
bo'limni GridPane o'ng ustunining 0, 2 va 3-qatorlariga (ya'ni, 1-ustun) ajrating.
3. Slayder qo'shish. Kutubxona oynasining boshqaruv elementlaridan gorizontal slayderni torting
bo'limni GridPane o'ng ustunining 1-qatoriga kiriting.
4. Tugma qo'shish. Kutubxona oynasining Boshqaruv bo'limidan tugmachani torting
GridPane o'ng ustunining 4-qatori. Tugma matnini ikki marta o'rnatishingiz mumkin
bosish yoki Tugmachani tanlab, Inspect-da uning Text xususiyatini o'rnatish.
tor oynasining Xususiyatlar bo'limi.
GridPane 25.13-rasmda ko'rsatilganidek paydo bo'lishi kerak.

25.12-rasm | Besh qatorli GridPane.

0-qatorni tanlash uchun yorliq

1-ustunni tanlash uchun yorliq


1124 25-bob JavaFX GUI: 1-qism

4-qadam: GridPane ustunining 0 tarkibini o'ngga tekislash
GridPane ustunining mazmuni sukut bo'yicha chapga hizalanadi. Tarkibni o'ng tomonga tekislash uchun
0-ustunni tanlang, uni ustunning yuqori yoki pastki qismidagi yorliqni, keyin esa In-
spectorning Layout boʻlimida Halignment (gorizontal alignment) xususiyatini OʻNGGA oʻrnating.
5-qadam: GridPane ustunlarini ularning tarkibiga moslashtirish uchun o'lchamini belgilash
Odatiy bo'lib, Scene Builder har bir GridPane ustunining kengligini 100 pikselga va har bir satrning kengligini o'rnatadi.
GridPane xujayralariga boshqaruv elementlarini osongina sudrab borishni ta'minlash uchun balandligi 30 pikselgacha. In
ushbu ilovada biz har bir ustunning o'lchamini uning mazmuniga moslashtirdik. Buning uchun tugmani bosish orqali 0-ustunni tanlang
ustunning yuqori yoki pastki qismidagi yorliqni, so'ngra Inspektorning tartibi bo'limida ni o'rnating
Ustun kengligi shunday bo'lishi kerakligini ko'rsatish uchun Width xususiyatini USE_COMPUTED_SIZE qilib belgilang
eng keng bolaga asoslangan - bu holda miqdor yorlig'i. Ushbu jarayonni 1-ustun uchun takrorlang.
GridPane 25.14-rasmda ko'rsatilganidek paydo bo'lishi kerak.

6-qadam: Matn maydonlarining o'lchamlari


Scene Builder sukut bo'yicha har bir TextField kengligini 200 pikselga o'rnatadi. Siz o'lchamlarni boshqarishingiz mumkin
yaratgan har bir GUI uchun mos ravishda. Ushbu ilovada bizga TextFields kerak emas
juda keng, shuning uchun biz har bir TextField uchun afzal qilingan kenglikdan foydalandik, bu biroz torroq.
Bir nechta boshqaruv elementlari uchun xususiyatni bir xil qiymatga o'rnatishda siz ularning barchasini tanlashingiz mumkin
va qiymatni bir marta belgilang. Barcha uchta TextFieldni tanlash uchun Ctrl (yoki Buyruq) tugmasini bosib turing.
tugmachasini bosing va har bir TextField-ni bosing. Keyin Inspector's Layout bo'limida Pref Width ni o'rnating
xususiyat USE_COMPUTED_SIZE. Bu har bir TextField o'zining oldindan foydalanishi kerakligini ko'rsatadi.
ferred kenglik (JavaFX tomonidan belgilangan). GridPane-ning o'ng ustuni o'lchamini o'zgartirishiga e'tibor bering
TextFields-ning afzal ko'rgan kengliklari.

25.13-rasm | GridPane Maslahat Kalkulyatorining boshqaruv elementlari bilan to'ldirilgan.

25.14-rasm | Tarkibiga mos keladigan o'lchamdagi ustunlar bilan GridPane.

25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1125

7-qadam: Tugmachaning o'lchami
Odatiy bo'lib, Scene Builder uning matni asosida tugma kengligini o'rnatadi. Ushbu ilova uchun biz tanladik
Tugmachani GridPane ning o'ng ustunidagi boshqa boshqaruv elementlari bilan bir xil kenglikda qiling. Kimga
Buning uchun tugmani tanlang, so'ngra Inspektorning tartibi bo'limida Maksimal kenglik xususiyatini o'rnating.
MAX_VALUE gacha. Bu ustun kengligini to'ldirish uchun tugma kengligi o'sishiga olib keladi.
GUI oldindan ko'rish
GUI-ni loyihalashda siz uni oldindan ko'rish > Win-da ko'rishni ko'rsatish-ni tanlash orqali ko'rishingiz mumkin.
dow. 25.15-rasmda ko'rib turganingizdek, chap ustundagi Yorliqlar orasida bo'sh joy yo'q.
va o'ng ustundagi boshqaruv elementlari. Bundan tashqari, GridPane atrofida bo'sh joy yo'q,
chunki Sahna o'lchami Sahna mazmuniga mos keladi. Shunday qilib, ko'p boshqaruv elementlari teginish yoki
deraza chegaralariga yaqinlashing. Bu muammolarni keyingi bosqichda tuzatasiz.

8-qadam: GridPane to'ldirish va uning ustunlari orasidagi gorizontal bo'shliqni sozlash


Tugun tarkibi va uning yuqori, o'ng, pastki va chap qirralari orasidagi bo'shliq deb nomlanadi
tarkibni tugunning chetlaridan ajratib turadigan plomba. GridPane o'lchamidan beri
Sahna oynasining o'lchamini aniqlaydi, bu misoldagi to'ldirish ham oynani ajratadi
GridPane bolalari deraza chetidan. To'ldirishni o'rnatish uchun GridPane-ni tanlang,
keyin Inspector's Layout bo'limida Padding xususiyatining to'rtta qiymatini o'rnating (TOP, RIGHT,
BOTTOM va LEFT) dan 14 gacha — konturning chetlari orasidagi JavaFX tavsiya etilgan masofa.
trol va sahna cheti.
Siz GridPane ustunlari va satrlari orasidagi standart bo'shliq miqdorini belgilashingiz mumkin
mos ravishda Hgap (gorizontal bo'shliq) va Vgap (vertikal bo'shliq) xususiyatlari bilan. Chunki
Scene Builder har bir GridPane qatorining balandligini 30 pikselga o'rnatadi, bu esa belgilanganidan kattaroqdir.
ushbu ilova boshqaruv elementlarining balandligi - kompozitsiyalar o'rtasida allaqachon vertikal bo'shliq mavjud.
ents. Ustunlar orasidagi gorizontal bo'shliqni belgilash uchun Hier-da GridPane-ni tanlang.
archy oynasida, keyin Inspektorning tartibi bo'limida Hgap xususiyatini 8 ga o'rnating.
komponentlar orasidagi vertikal bo'shliqni aniq nazorat qilishni yoqtirsangiz, har bir qatorning Pref ni o'rnatishingiz mumkin
Height xususiyati: USE_COMPUTED_SIZE (biz ustunlarning Pref Width xususiyati uchun qilganimiz kabi)
5-qadam), keyin GridPane-ning Vgap xususiyatini o'rnating.
9-qadam: tipTextField va totalTextField-ni tahrir qilib bo'lmaydigan qilib qo'yish
Fokuslanuvchan
TipTextField va totalTextField ushbu ilovada faqat natijalarni ko'rsatish uchun ishlatiladi, emas
matn kiritishni qabul qilish. Shu sababli, ular interaktiv bo'lmasligi kerak. Siz matn kiritishingiz mumkin -
Maydon faqat "fokusda" bo'lsa, ya'ni foydalanuvchi o'zaro aloqada bo'lgan boshqaruv elementidir. Qachon

25.15-rasm | TextFields va tugma bilan GridPane o'lchamini o'zgartirdi.


1126 25-bob JavaFX GUI: 1-qism

interaktiv boshqaruv tugmachasini bossangiz, u diqqatni oladi. Xuddi shunday, Tabni bosganingizda
kalit, fokus joriy fokuslanadigan boshqaruvdan keyingisiga o'tadi - bu sodir bo'ladi
boshqaruv elementlari GUIga qo'shilgan tartibda. Interaktiv boshqaruv elementlari, masalan, TextFields,
Slayderlar va tugmalar - sukut bo'yicha fokuslanadi. Yorliqlar kabi interaktiv boshqaruvlar
diqqat markazida emas.
Ushbu ilovada tipTextField va totalTextField tahrirlanmaydi va fokuslanmaydi.
qodir. Ushbu o'zgarishlarni amalga oshirish uchun ikkala TextFields-ni, so'ngra Inspektorning xususiyatlari-ni tanlang
bo'limida Editable va Focus Transversable xususiyatlaridan belgini olib tashlang.
10-qadam: Slayderning xususiyatlarini o'rnatish
GUIni yakunlash uchun siz endi Maslahat kalkulyatorining slayderini sozlaysiz. Odatiy bo'lib, a
Slayder diapazoni 0,0 dan 100,0 gacha va uning boshlang'ich qiymati 0,0 ga teng. Bu ilova maslahat foizlariga ruxsat beradi
0 dan 30 gacha, sukut boʻyicha 15. Ushbu oʻzgarishlarni amalga oshirish uchun Slayderni, soʻngra
Inspector's Properties bo'limida Slider's Max xususiyatini 30 ga va Value xususiyatiga o'rnating.
ga 15. Shuningdek, biz Blokni oshirish xususiyatini 5 ga o'rnatdik - bu Val-
Foydalanuvchi Slayderning oxiri va tugmalari o'rtasida bosilganda ue xususiyati ortadi yoki kamayadi
Slayderning bosh barmog'i. Fayl > Saqlash-ni tanlash orqali FXML faylini saqlang.
Yakuniy tartibni oldindan ko'rish
Yakuniy grafik interfeysni ko'rish uchun Ko'rib chiqish > Oynada ko'rishni ko'rsatish-ni tanlang (25.16-rasm). Biz qachon
25.5.5-bo'limda TipCalculatorController sinfini muhokama qiling, biz qanday belgilashni ko'rsatamiz.
FXML faylidagi Hisoblash tugmasi hodisa ishlovchisi.

25.5.4 MaslahatKalkulyator sinfi


Maslahat kalkulyatori ilovasi loyihasini yaratganingizda, NetBeans ikkita Java manba kodini yaratdi
siz uchun fayllar:
• TipCalculator.java—Ushbu fayl TipCalculator sinfini o'z ichiga oladi, unda
asosiy usul (ushbu bo'limda muhokama qilinadi) GUI yaratish uchun FXML faylini yuklaydi
va GUI-ni ilovaning Sahnasida ko'rsatilgan Sahnaga biriktiradi.
• TipCalculatorController.java—Ushbu faylda TipCalculatorControl-
troller sinfi (25.5.5-bo'limda muhokama qilingan), bu erda siz belgilaysiz
Slayder va tugmani boshqarish vositalarining hodisa ishlov beruvchilari.
25.17-rasmda TipCalculator sinfi keltirilgan. Shartnomamizni qondirish uchun kodni qayta formatladik.
lar. 18-qatordan tashqari, ushbu sinfdagi barcha kodlar Net- tomonidan yaratilgan.

25.16-rasm | Yakuniy GUI dizayni Scene Builder-da ko'rib chiqilgan.


25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1127

Dukkaklilar. 25.5.2-bo'limda muhokama qilganimizdek, Ilova kichik sinfi boshlang'ich nuqtadir
JavaFX ilovasi uchun. Asosiy usul sinfni Ilovaning statik ishga tushirish usulini chaqiradi (line
26) ilovani ishga tushirishni boshlash uchun. Bu usul, o'z navbatida, JavaFX ish vaqtini yaratishga olib keladi
TipCalculator sinfining ob'ekti va uni boshlash usulini chaqiradi.

Qayta belgilangan dastur usulini ishga tushirish


Boshlash usuli (11–21-qatorlar) GUI-ni yaratadi, uni Sahnaga biriktiradi va uni ekranga joylashtiradi.
Ushbu usul boshlanishi argument sifatida qabul qilinadi. 14–15 qatorlar FXMLLoader sinfidan foydalanadi
GUI ning sahna grafigini yaratish uchun statik usul yuki. Bu usul:
• Sahna grafigining ildiziga Ota-ona (javafx.scene paketi) havolasini qaytaradi
tugun (ushbu misoldagi GridPane).
• Controller sinfining obyektini yaratadi.
• Manipulyatsiya qilinadigan komponentlar uchun kontroller misol o'zgaruvchilarini ishga tushiradi.
dasturiy jihatdan ishlab chiqilgan.
• FXML da belgilangan har qanday hodisalar uchun hodisa ishlov beruvchilarini ro'yxatdan o'tkazadi.
Biz tekshirgichning instantsiya o'zgaruvchilarini ishga tushirish va ro'yxatdan o'tkazishni muhokama qilamiz
25.5.5-bo'limdagi voqea ishlovchilar.

1 // 25.17-rasm: TipCalculator.java


2 // Maslahat kalkulyatorining grafik interfeysini yuklaydigan va ko'rsatadigan asosiy ilova sinfi
3 import javafx.application.Application;
4 import javafx.fxml.FXMLLoader;
5 import javafx.scene.Parent;
6 import javafx.scene.Scene;
7 import javafx.stage.Stage;
8
9 ommaviy sinf TipCalculator
10 {
11 @Bekor qilish
12
13 {
14
15
16
17
18
19
20
21 }
22
23 umumiy statik bekor asosiy(String[] args)
24 {
25 // TipCalculator obyektini yarating va uni ishga tushirish usulini chaqiring
26
27 }
28 }

25.17-rasm | Maslahat Kalkulyatorining GUI-ni yuklaydigan va ko'rsatadigan asosiy ilova sinfi.

Ilovani kengaytiradi

ommaviy bekor boshlash (Bosqich bosqichi) Istisnoni tashlaydi

Asosiy ildiz =
FXMLLoader.load(getClass().getResource("TipCalculator.fxml"));

Sahna sahnasi = yangi sahna(root); // sahna grafigini sahnaga qo'shish


stage.setTitle("Maslahat kalkulyatori"); // oynaning sarlavha satrida ko'rsatiladi
sahna.setScene(sahna); // sahnaga sahna biriktirish
sahna.show(); // sahnani ko'rsatish

ishga tushirish(args);


1128 25-bob JavaFX GUI: 1-qism

Sahna yaratish
GUI-ni ko'rsatish uchun uni sahnaga biriktirishingiz kerak, keyin sahnani sahnaga biriktirishingiz kerak.
boshlash usuliga o'tdi. 17-qator o'tish ildizini (sahna grafigining ildizi) hosil qiladi
tugun) konstruktorga argument sifatida. Odatiy bo'lib, Sahna o'lchami bilan belgilanadi
sahna grafigining ildiz tugunining o'lchami. Scene konstruktorining haddan tashqari yuklangan versiyalari sizga imkon beradi
Sahna o'lchamini va sahnada paydo bo'ladigan to'ldirishni (rang, gradient yoki rasm) belgilash uchun
fon. 18-qatorda paydo bo'ladigan matnni belgilash uchun Scene usuli setTitle ishlatiladi
Bosqich oynasining sarlavha satri. 19-qator Sahnani joylashtirish uchun setScene Stage usulini joylashtiradi
Sahna. Nihoyat, 20-qator Stage oynasini ko'rsatish uchun Stage usulini ko'rsatadi.
25.5.5 TipCalculatorController klassi
25.18–25.21-rasmlarda foydalanuvchiga javob beradigan TipCalculatorController sinfi keltirilgan.
ilova tugmasi va slayder bilan o'zaro aloqalar. NetBeans yaratgan kodni almashtiring
TipCalculatorController.java da shakldagi kod bilan. 25.18–25.21.
Class TipCalculatorController import bayonotlari
25.18-rasmda TipCalculatorController sinfining import bayonotlari ko'rsatilgan.

3–12 qatorlar TipCalculatorController sinfi tomonidan ishlatiladigan sinflar va interfeyslarni import qiladi:


• Java.math paketining BigDecimal klassi (3-qator) aniq monografiyani bajarish uchun ishlatiladi.
etar hisoblar. java.math paketining RoundingMode raqami (4-qator) ishlatiladi
BigDecimal qiymatlari hisob-kitoblar paytida yoki qachon yaxlitlanishini belgilash uchun
suzuvchi nuqtali raqamlarni Strings sifatida joylashtirish.
• Java.text to'plamining Class NumberFormat (5-qator) raqamli formatlashni ta'minlaydi
imkoniyatlar, masalan, mahalliy valyuta va foiz formatlari. Masalan,
AQSh tilida 34,56 pul qiymati 34,95 AQSh dollari sifatida formatlangan va har bir
15 foiz 15% sifatida formatlangan. Class NumberFormat faylning lokalizatsiyasini aniqlaydi
ilovangiz ishlaydigan tizim, keyin valyuta summalari va foizlarni formatlaydi
mos ravishda.
• Siz javafx.beans.value paketining ChangeListener interfeysini qo'llaysiz (satr
6) Slayderning bosh barmog'ini harakatlantirgan foydalanuvchiga javob berish. Ushbu interfeys o'zgartirildi

1 // TipCalculatorController.jav


2 // accountButton va tipPercentageSlider hodisalarini boshqaradigan kontroller
3 import java.math.BigDecimal;
4 import java.math.RoundingMode;
5 import java.text.NumberFormat;
6 import javafx.beans.value.ChangeListener;
7 import javafx.beans.value.ObservableValue;
8 import javafx.event.ActionEvent;
9 import javafx.fxml.FXML;
10 import javafx.scene.control.Label;
11 import javafx.scene.control.Slider;
12 import javafx.scene.control.TextField;
13

25.18-rasm | TipCalculatorController import deklaratsiyasi.


25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1129

Usul ObservableValue interfeysini amalga oshiradigan ob'ektni oladi (7-qator) -
ya'ni o'zgarganda hodisa hosil qiluvchi qiymat.
• Button hodisasi ishlovchisi ActionEvent ni oladi (8-qator; javafx.event paketi),
Bu tugma bosilganligini bildiradi. Onlayn 26-bobda ko'rganingizdek,
ko'pgina JavaFX boshqaruvlari ActionEvents-ni qo'llab-quvvatlaydi.
• FXML izohi (9-qator; javafx.fxml paketi) JavaFX kontrollerida ishlatiladi
JavaFX komponentlariga murojaat qilishi kerak bo'lgan misol o'zgaruvchilarini belgilash uchun sinf kodi
GUI ning FXML fayli va JavaFX com hodisalariga javob beradigan usullar
GUI ning FXML faylidagi ponentlar.
• javafx.scene.control paketi (10–12-qatorlar) koʻplab JavaFX boshqaruvlarini oʻz ichiga oladi.
sinflar, jumladan Label, Slider va TextField.
Turli sinflar va interfeyslar bilan kod yozishda siz NetBeans dan foydalanishingiz mumkin
IDE ning import bayonotlarini kiritishiga ruxsat berish uchun IDE ning Manba > Importni tashkil qilish buyrug'i
siz. Agar bir xil sinf yoki interfeys nomi bir nechta paketlarda paydo bo'lsa, IDE paydo bo'ladi
tegishli import bayonotini tanlashingiz mumkin bo'lgan dialog oynasini ko'rsating.
TipCalculatorController-ning statik o'zgaruvchilari va misol o'zgaruvchilari
25.19-rasmning 17–38-qatorlari mavjud TipCalculatorController ning statik va namunasi sinfi
o'zgaruvchilar. NumberFormat obyektlari (17–20-qatorlar) valyuta qiymatlarini formatlash uchun ishlatiladi va
mos ravishda foizlar. getCurrencyInstance usuli NumberFormat obyektini qaytaradi
bu ilova joylashgan tizim uchun standart til yordamida qiymatlarni valyuta sifatida formatlaydi
yugurish. Xuddi shunday, getPercentInstance usuli quyidagi uchun NumberFormat obyektini qaytaradi:
mats qiymatlari tizimning standart tildan foydalangan holda foiz sifatida. BigDecimal ob'ekt maslahati -
Foiz (22-satr) joriy uchi foizini saqlaydi va maslahatni hisoblashda ishlatiladi
(25.20-rasm) foydalanuvchi ilovaning Hisoblash tugmasini bosganida.

14 umumiy sinf TipCalculatorController


15 {
16 // valyuta va foizlar uchun formatlovchilar
17 xususiy statik yakuniy NumberFormat valyuta =
18 NumberFormat.getCurrencyInstance();
19 xususiy statik yakuniy NumberFormat foiz =
20 NumberFormat.getPercentInstance();
21
22 xususiy BigDecimal tipPercentage = yangi BigDecimal(0,15); // 15% standart
23
24 // FXML da aniqlangan va kontroller kodi tomonidan ishlatiladigan GUI boshqaruv elementlari
25
26 xususiy TextField summasiTextField;
27
28
29 xususiy Label tipPercentageLabel;
30
31
32 xususiy Slider tipPercentageSlider;
33

25.19-rasm | TipCalculatorController-ning statik o'zgaruvchilari va misol o'zgaruvchilari. (2-qismning 1-qismi.)

@FXML

@FXML


@FXML

1130 25-bob JavaFX GUI: 1-qism

@FXML izohi
25.5.3-bo'limda ushbu ilova o'zining Java manbasida boshqaradigan har bir boshqaruvni eslang
kodga fx: id kerak. 25–38-qatorlar (25.19-rasm) boshqaruvchi sinfining mos kelishini e'lon qiladi.
misol o'zgaruvchilari. Har bir deklaratsiya oldidan @FXML izohi (25, 28, 31-qatorlar,
34 va 37) o'zgaruvchi nomini tavsiflovchi FXML faylida foydalanish mumkinligini ko'rsatadi.
ilovaning GUI. Controller sinfida ko'rsatgan o'zgaruvchilar nomlari aniq bo'lishi kerak
GUI yaratishda ko'rsatgan fx: id qiymatlariga mos keling. FXMLLoader yuklanganda
GUI yaratish uchun TipCalculator.fxml, shuningdek, kontrollerning har bir nusxasini ishga tushiradi
@FXML bilan e'lon qilingan o'zgaruvchilar tegishli GUIga murojaat qilishlarini ta'minlash uchun
FXML faylidagi komponentlar.
TipCalculatorControllerning hisoblash tugmasi bosilgan hodisalarni qayta ishlash moslamasi
25.20-rasmda TipCalculatorController-ning hisoblash tugmasi bosilgan usuli ko'rsatilgan.
od, bu foydalanuvchi Hisoblash tugmasini bosish bilan chaqiriladi. @FXML izohi (satr
41) usul oldidagi bu usul boshqaruvni belgilash uchun ishlatilishi mumkinligini bildiradi
ilovaning GUI-ni tavsiflovchi FXML faylidagi voqea ishlovchisi. hosil qiluvchi nazorat uchun
ActionEvent (ko'pgina JavaFX boshqaruvlari uchun bo'lgani kabi), hodisalarni boshqarish usuli
voidni qaytarishi va bitta ActionEvent parametrini olishi kerak (42-qator).

34
35 xususiy TextField tipTextField;


36
37
38 xususiy TextField totalTextField;
39

40 // maslahat va umumiy miqdorlarni hisoblab chiqadi va ko'rsatadi


41
42
43 {
44 urinib ko'ring
45 {
46 BigDecimal miqdori = yangi BigDecimal(amountTextField.getText());
47 BigDecimal uchi = summa.multiply(tipPercentage);
48 BigDecimal jami = summa.add(tip);
49
50 tipTextField.setText(valyuta.format(maslahat));
51 totalTextField.setText(valyuta.format(jami));
52 }
53 catch (NumberFormatException oldingi)
54 {
55 summaTextField.setText("Miqdorni kiriting");
56 summaTextField.selectAll();
57 summaTextField.requestFocus();
58 }
59 }
60

25.20-rasm | TipCalculatorControllerning accountButtonPressed hodisasi ishlovchisi.

25.19-rasm | TipCalculatorController-ning statik o'zgaruvchilari va misol o'zgaruvchilari. (2-qismning 2-qismi.)

@FXML


@FXML

@FXML
private void accountButtonPressed(ActionEvent hodisasi)


25.5 Maslahat kalkulyatori ilovasi — Voqealarni boshqarishga kirish 1131



Scene Builderda Hisoblash tugmachasining Hodisa ishlov beruvchisini belgilash
NetBeans bilan TipCalculator loyihasini yaratganingizda, u sinfni oldindan sozlagan
TipCalculatorController TipCalculator.fxml da GUI uchun boshqaruvchi sifatida. Siz
buni sahnaning ildiz tugunini (ya'ni, GridPane) tanlash orqali Scene Builder'da ko'rish mumkin, keyin
Inspektor oynasining kodi bo'limini kengaytirish. Nazoratchi sinfining nomi ko'rsatilgan
Controller sinf maydoni. Agar siz con-da accountButtonPressed usulini e'lon qilsangiz.
FXML da Hisoblash tugmasi hodisasi ishlovchisini belgilashdan oldin troller sinfi.
Scene Builder-ni oching, u @FXML prefiksli usullar uchun kontroller sinfini skanerlaydi va ruxsat beradi
voqea ishlov beruvchilarini sozlash uchun ushbu usullardan birini tanlashingiz kerak.
Foydalanuvchi tugmani bosganida accountButtonPressed chaqirilishi kerakligini ko'rsatish uchun
Hisoblash tugmasi, Scene Builder-da TipCalculator.fxml-ni oching, so'ngra:
1. Hisoblash tugmasini tanlang.
2. Inspektor oynasida Kod bo'limini kengaytiring.
3. On Action ostida, ochiladigan ro'yxatdan #hisoblashButtonPressed-ni tanlang va
FXML faylini saqlang.
FXMLLoader GUI yaratish uchun TipCalculator.fxml ni yuklaganida, u yaratadi va qayd qiladi
Hisoblash tugmasi ActionEvent uchun voqea ishlov beruvchisi. ActionEvent ishlovchisi
EventHandler interfeysini amalga oshiradigan sinf ob'ekti bo'lib, qaysi
voidni qaytaradigan va ActionEvent parametrini oladigan ishlov berish usulini o'z ichiga oladi. Bu
usul, o'z navbatida, foydalanuvchi Hisoblash tugmachasini bosganda, accountButtonPressed usulini chaqiradi.
kech tugma. FXMLLoader siz ko'rsatgan har bir voqea tinglovchisi uchun shunga o'xshash vazifalarni bajaradi
Inspektor oynasining Kod bo'limi orqali.
Maslahat va umumiy miqdorlarni hisoblash va ko'rsatish
46-51 qatorlar uch va umumiy miqdorni hisoblab chiqadi va ko'rsatadi. 46-qator getText usulini chaqiradi
summaTextField dan foydalanuvchi tomonidan kiritilgan hisob miqdorini olish uchun. Bu String uzatiladi
BigDecimal konstruktoriga, agar uning argumenti bo'lsa, NumberFormatException ni chiqaradi
raqam emas. Bunday holda, 55-qator ko'rsatish uchun summaTextField ning setText usulini chaqiradi
TextField-da "Miqdorni kiriting" xabari. 56-qator keyin selectAll usulini chaqiradi
TextField matnini va 57-qatorni so'rovFocus chaqiruvini tanlang, bu TextField-ga
diqqat. Bu foydalanuvchiga summaTextField-ga darhol yangi qiymat kiritish imkonini beradi.
avval uning matnini tanlash kerak. getText, setText va selectAll usullari meros qilib olingan
TextInputControl sinfidan TextField sinfiga (javafx.scene.control paketi),
va requestFocus usuli Node sinfidan TextField sinfiga meros qilib olingan (paket
javafx.scene).
Agar 46-satr istisno qilmasa, 47-satr maslahatni chaqirish usuli bilan hisoblab chiqadi
miqdorni tipPercentage ga ko'paytirish uchun ko'paytiring va 48-satr umumiy miqdorni hisoblab chiqadi
qo'ng'iroq qilish usuli bilan hisob miqdoriga maslahat qo'shish uchun qo'shing. Keyingi qatorlar 50 va 51 dan foydalanadi
ni ifodalovchi valyuta formatidagi satrlarni yaratish uchun valyuta ob'ektining formatlash usuli
maslahat va umumiy miqdorlar - bular mos ravishda tipTextField va totalTextField-da ko'rsatiladi.
ehtiyotkorlik bilan.
TipCalculatorControllerning initalizatsiya usuli
25.21-rasmda TipCalculatorController sinfining ishga tushirish usuli ko'rsatilgan. Qachon
FXMLLoader TipCalculatorController sinfining ob'ektini yaratadi, u yoki yo'qligini aniqlaydi
sinf hech qanday parametrsiz ishga tushirish usulini o'z ichiga oladi va agar shunday bo'lsa, bu usulni chaqiradi

1132 25-bob JavaFX GUI: 1-qism

boshqaruvchini ishga tushirish uchun. Ushbu usuldan oldin tekshirgichni sozlash uchun foydalanish mumkin
GUI ko'rsatiladi. 65-qator belgilash uchun valyuta obyektining setRoundingMode usulini chaqiradi
valyuta qiymatlari qanday yaxlitlanishi kerak. RoundingMode.HALF_UP qiymati shuni bildiradi
.5 dan katta yoki unga teng qiymatlarni yaxlitlash kerak - masalan, 34,567 uchun -
34.57 sifatida matlangan va 34.564 34.56 sifatida formatlanadi.

Voqealarni boshqarish uchun anonim ichki sinfdan foydalanish


Har bir JavaFX boshqaruvi turli xil xususiyatlarga ega, ulardan ba'zilari, masalan, Slayderning qiymati -
ular o'zgarganda voqea tinglovchisini xabardor qilishi mumkin. Bunday xususiyatlar uchun siz qo'lda kerak
ChangeListener dasturini amalga oshiradigan sinf ob'ektini voqea ishlovchisi sifatida ro'yxatdan o'tkazing.
javafx.beans.value paketidan interfeys. Agar bunday hodisa ishlov beruvchisi qayta ishlatilmasa, siz
odatda uni anonim ichki sinfning namunasi sifatida aniqlang - bu bilan e'lon qilingan sinf -
nomni chiqaradi va odatda usul deklaratsiyasida paydo bo'ladi. 68–80 qatorlar bitta holat-
hodisa tinglovchisining sinfini e'lon qiladigan, shu sinfning ob'ektini yaratadigan va uni ro'yxatdan o'tkazadigan ment
tipPercentageSlider qiymatidagi o'zgarishlar uchun tinglovchi sifatida.
ValueProperty usuliga qo'ng'iroq qilish (68-qator) DoubleProp sinfining ob'ektini qaytaradi.
Slider qiymatini ifodalovchi erty (javax.beans.property paketi). DoublePro-
perty - bu ObservableValue bo'lib, qiymat o'zgarganda tinglovchilarni xabardor qiladi. Har bir sinf
ObservableValue interfeysini amalga oshiradigan addListener usulini taqdim etadi (onlayn
68) ChangeListenerni ro'yxatdan o'tkazish uchun. Slider qiymati bo'lsa, addListener argu-
ment ChangeListener ni amalga oshiradigan ob'ektdir, chunki Sliderning qiymati
raqamli qiymatdir.
Anonim ichki sinfning nomi yo'qligi sababli, sinfning bitta ob'ekti yaratilishi kerak
sinf e'lon qilingan nuqtada (69-qatordan boshlab). AddListener argu- usuli
ment 69–79-qatorlarda anonni e'lon qiluvchi sinf namunasini yaratish ifodasi sifatida belgilangan.

61 // FXMLLoader tomonidan tekshirgichni ishga tushirish uchun chaqirilgan


62
63 {
64 // 0-4 tur pastga, 5-9 tur yuqoriga
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 }
82 }

25.21-rasm | TipCalculatorControllerning initalizatsiya usuli.

public void initialize()

currency.setRoundingMode(RoundingMode.HALF_UP);

// tipPercentageSlider qiymatiga o'zgartirishlar uchun tinglovchi
tipPercentageSlider.valueProperty().addListener(
yangi ChangeListener()
{
@Override
umumiy bekor o'zgartirildi (ObservableValue ov,
OldValue raqam, yangi raqam)
{
uchi foiz =
BigDecimal.valueOf(newValue.intValue() / 100.0);
tipPercentageLabel.setText(foiz.format(tipPercentage));
}
}
);

25.6 Onlayn JavaFX 1133 boblarida yoritilgan xususiyatlar

ymous ichki sinfi va shu sinfning bitta ob'ektini yaratadi. Keyin bu ob'ektga havola
addListener-ga o'tkazildi. Yangi kalit so'zdan keyin ChangeListener() sintaksisi
(69-satr) interfeysni amalga oshiradigan anonim ichki sinf deklaratsiyasini boshlaydi
ChangeListener. Bu sinf deklaratsiyasini boshlashga o'xshaydi

70-da ochiladigan chap qavs va 79-qatordagi oʻng yopuvchi qavs ning tanasini chegaralaydi


anonim ichki sinf. 71–78 qatorlar ChangeListener-ning o'zgartirilganligini e'lon qiladi
o'zgartirilgan ObservableValue ga havolani oladigan usul, raqamni o'z ichiga oladi.
voqea sodir bo'lishidan oldin Slayderning eski qiymatini va o'z ichiga olgan raqamni olish
Slayderning yangi qiymati. Foydalanuvchi Slayderning bosh barmog'ini harakatga keltirganda, 75–76 qatorlar yangisini saqlaydi
uch foizi va 77-qator tipPercentageLabelni yangilaydi.
Anonim ichki sinf o'zining yuqori darajali sinfining statik o'zgaruvchilariga kirishi mumkin.
o'zgaruvchilar va usullar - bu holda, anonim ichki sinf misol o'zgaruvchilardan foydalanadi
tipPercentage va tipPercentageLabel va statik o'zgaruvchi foiz. Biroq, an
anonim ichki sinf o'zi joylashgan usulning mahalliy o'zgaruvchilariga cheklangan kirish huquqiga ega
e'lon qilingan - u faqat qo'shimcha usulda e'lon qilingan yakuniy mahalliy o'zgaruvchilarga kirishi mumkin.
tanasi. (Java SE 8 dan boshlab, anonim ichki sinf sinfning samarali yakuniy qismiga ham kirishi mumkin.
mahalliy o'zgaruvchilar - qo'shimcha ma'lumot uchun 17.3.1-bo'limga qarang.)
Java SE 8: ChangeListenerni amalga oshirish uchun lambdadan foydalanish
Eslatib o'tamiz, 10.10-bo'lim Java SE 8 da bitta usulni o'z ichiga olgan interfeys funktsiya-
tional interfeys va 17-bobdan bunday interfeyslar bilan amalga oshirilishi mumkinligini eslang
lambdalar. 17.9-bo'lim voqealarni boshqarish funktsional interfeysini qanday amalga oshirishni ko'rsatdi
lambda yordamida. 25.21-rasmdagi hodisa ishlov beruvchisi sifatida lambda bilan amalga oshirilishi mumkin
quyidagicha:

25.6 Onlayn JavaFX boblarida yoritilgan xususiyatlar


JavaFX mustahkam grafik interfeys, grafik va multimedia texnologiyasidir. Onlayn bo'limlarda 26
va 27, siz:
• Qo'shimcha JavaFX tartiblari va boshqaruvlarini o'rganing.
• Boshqa hodisa turlarini boshqarish (masalan, MouseEvents).
• Transformatsiyalar (harakatlanish, aylantirish, masshtablash va burish kabi) va effektlarni qo‘llang
(masalan, soyalar, xiraliklar, aks ettirish va yoritish) sahna grafigining tugunlariga.
• Boshqaruv elementlarining ko'rinishi va hissiyotini belgilash uchun CSS-dan foydalaning.
• Boshqaruv elementlarini avtomatik yangilashni yoqish uchun JavaFX xususiyatlaridan va ma'lumotlarni ulashdan foydalaning
mos keladigan ma'lumotlar o'zgarishi bilan.
• JavaFX grafik imkoniyatlaridan foydalaning.

ommaviy klass MyHandler ChangeListener-ni amalga oshiradi

tipPercentageSlider.valueProperty().addListener(
(ov, oldValue, newValue) ->
{
uch foiz =
BigDecimal.valueOf(newValue.intValue() / 100.0);
tipPercentageLabel.setText(foiz.format(tipPercentage));
});

1134 25-bob JavaFX GUI: 1-qism

• JavaFX animatsiyalarini bajarish.
• Audio va videoni ijro etish uchun JavaFX multimedia imkoniyatlaridan foydalaning.
Bundan tashqari, bizning JavaFX Resurs Markazimiz

JavaFX imkoniyatlari haqida ko'proq bilib olishingiz mumkin bo'lgan onlayn resurslarga havolalarni o'z ichiga oladi.


25.7 Yakunlash
Ushbu bobda biz JavaFX bilan tanishdik. Biz JavaFX bosqichining tuzilishini taqdim etdik (
ilova oynasi). Siz sahnada sahna grafigini ko'rsatishini bilib oldingiz
sahna grafigi tugunlardan tashkil topgan va bu tugunlar tartib va boshqaruv elementlaridan iborat.
Siz JavaFX Scene Builder-da vizual dasturlash texnikasidan foydalangan holda GUI-larni yaratdingiz,
Bu sizga Java kodini yozmasdan GUI yaratish imkonini berdi. Yorliqni tartibga keltirdingiz,
VBox va GridPane sxemasidan foydalangan holda ImageView, TextField, Slayder va tugmachalarni boshqarish
konteynerlar. Siz FXMLLoader sinfi Scene Builder-da yaratilgan FXML-dan qanday foydalanishini bilib oldingiz
GUI yarating.
Siz Tugma va yordamida foydalanuvchilarning oʻzaro aloqalariga javob berish uchun kontroller sinfini joriy qildingiz
Slayder boshqaruvlari. Biz ma'lum voqea ishlov beruvchilarini to'g'ridan-to'g'ri FXMLda ko'rsatish mumkinligini ko'rsatdik
Scene Builder'dan, lekin boshqaruvning xususiyat qiymatlariga o'zgartirishlar uchun hodisa ishlov beruvchilari bo'lishi kerak
to'g'ridan-to'g'ri kontrollerlar kodida amalga oshiriladi. FXMLLoader yaratishini ham bilib oldingiz
va ilova boshqaruvchi sinfining namunasini ishga tushiradi, boshqaruvchini ishga tushiradi
@FXML izohi bilan e'lon qilingan va yaratadigan va ro'yxatga oladigan misol o'zgaruvchilari
FXMLda ko'rsatilgan har qanday hodisalar uchun hodisa ishlov beruvchilari.
Keyingi bobda siz qo'shimcha JavaFX boshqaruvlari va maketlaridan foydalanasiz va CSS dan foydalanasiz
GUI-ni uslublang. Shuningdek, siz JavaFX xususiyatlari va texnikadan qanday foydalanish haqida ko'proq bilib olasiz
GUI-dagi elementlarni yangi ma'lumotlar bilan avtomatik yangilash uchun ma'lumotlarni ulash deb ataladi.

http://www.deitel.com/JavaFX

Xulosa
25.1-bo'lim Kirish
• Grafik foydalanuvchi interfeysi (GUI) ilova bilan ishlash uchun qulay mexanizmni taqdim etadi.
GUI ("GOO-ee" deb talaffuz qilinadi) ilovaga o'ziga xos "ko'rinish va his" beradi.
• GUI-lar GUI komponentlaridan tuzilgan - ba'zan boshqaruvlar yoki vidjetlar deb ataladi.
• Turli ilovalarni izchil, intuitiv foydalanuvchi interfeysi komponentlari bilan ta'minlash foydalanuvchilarga ma'no beradi
yangi ilova bilan tanishish, ular uni tezroq o'rganishlari va undan samaraliroq foydalanishlari uchun.
• Java-ning GUI, grafik va kelajakdagi multimedia API-si JavaFX.
25.2-bo'lim JavaFX Scene Builder va NetBeans IDE
• JavaFX Scene Builder mustaqil JavaFX GUI vizual maket vositasi bo‘lib, u bilan ham foydalanish mumkin.
turli xil IDElar.
• JavaFX Scene Builder GUI komponentlarini sudrab olib tashlash orqali GUI yaratish imkonini beradi
Scene Builder kutubxonasidan dizayn maydoniga o'ting, so'ngra GUI-ni o'zgartirish va uslublash - barchasi bilan:
har qanday kodni yozish.
• JavaFX Scene Builder FXML (FX Markup Language) - aniqlash uchun XML lug'atini yaratadi.
JavaFX GUI boshqaruvlarini hech qanday Java kodini yozmasdan kiritish va tartibga solish.

Xulosa 1135



• FXML kodi Java manba kodida belgilangan dastur mantig'idan alohida - bu sep-
Interfeysning (GUI) amalga oshirishdan (Java kodi) o'rnatilishi buni osonlashtiradi
JavaFX GUI ilovalarini disk raskadrovka qilish, o'zgartirish va saqlash.
25.3-bo'lim JavaFX ilova oynasi tuzilishi
• JavaFX ilovasining grafik interfeysi ko'rsatiladigan oyna sahna sifatida tanilgan va namunadir
sinfning Stage (javafx.stage to'plami).
• Sahna GUIni sahna grafigi sifatida belgilaydigan bitta sahnani o'z ichiga oladi - ilovaning daraxt tuzilishi
vizual elementlar, masalan, GUI boshqaruvlari, shakllar, tasvirlar, video, matn va boshqalar. Sahna - bu -
Scene sinfining pozitsiyasi (javafx.scene to'plami).
• Sahna grafigidagi har bir vizual element tugundir — tugun (paket) kichik sinfining namunasi
javafx.scene), bu sahna grafigidagi barcha tugunlar uchun umumiy atributlar va xatti-harakatlarni belgilaydi.
• Sahna grafigidagi birinchi tugun ildiz tugun deb nomlanadi.
• Bolalarga ega bo'lgan tugunlar odatda o'z bola tugunlarini joylashtiradigan joylashuv konteynerlaridir
sahna.
• Tartib konteynerida joylashgan tugunlar boshqaruv elementlari va ehtimol boshqa tartiblarning birikmasidir.
konteynerlar.
• Foydalanuvchi boshqaruv elementi bilan o'zaro aloqada bo'lganda, u hodisa hosil qiladi. Dasturlar hodisalarni boshqarishdan foydalanishi mumkin
har bir foydalanuvchi o'zaro aloqasi sodir bo'lganda nima bo'lishi kerakligini belgilash.
• Hodisa ishlov beruvchisi foydalanuvchi o‘zaro ta’siriga javob beruvchi usuldir. FXML GUI voqea ishlovchilari
nazorat qiluvchi sinfda aniqlanadi.
25.4-bo'lim Xush kelibsiz ilovasi - matn va rasmni ko'rsatish
• NetBeans'da ilova yaratish uchun avvalo loyiha yaratishingiz kerak — masalan, tegishli fayllar guruhi
ilovani tashkil etuvchi kodli fayllar va rasmlar.
• NetBeans Projects oynasi barcha loyihalaringizga kirish imkonini beradi. Loyiha tugunida,
tarkibi papkalar va fayllarga ajratilgan.
• NetBeans JavaFX FXML Ilova loyihasi uchun uchta fayl yaratadi: FXML belgilash fayli
GUI, ilovaning asosiy sinfini o'z ichiga olgan fayl va ilovaning boshqaruvchi sinfini o'z ichiga olgan fayl.
• JavaFX Scene Builder dasturida loyihaning FXML faylini ochish uchun Projects-dagi FXML faylini o‘ng tugmasini bosing.
oyna, keyin Ochish-ni tanlang.
• Layout konteynerlari GUI komponentlarini tartibga solishga yordam beradi. VBox o'z tugunlarini vertikal ravishda joylashtiradi
yuqoridan pastga.
• Joylashtirish konteynerini sahna grafigidagi ildiz tuguniga aylantirish uchun joylashuv konteynerini tanlang, so‘ng
Scene Builder-ning Tahrirlash > Hujjatni tanlash menyusi bandiga qirqish.
• VBox-ning hizalanishi uning bolalarining joylashuvini belgilaydi.
• Sahna grafigining ildiz tugunining afzal qilingan o'lchami (kengligi va balandligi) sahna tomonidan o'chirish uchun ishlatiladi.
ilova ishga tusha boshlaganda uning oyna hajmini to'xtating.
• Yorliq matnini ikki marta bosish va matnni terish yoki Label-ni tanlash orqali sozlashingiz mumkin.
bel va Inspektorning xususiyatlari bo'limida uning Matn xususiyatini o'rnating.
• VBox-ga boshqaruv elementlari qo'shilganda, har bir yangi boshqaruv sukut bo'yicha oldingilarining ostiga joylashtiriladi.
Scene Builder ierarxiyasi oynasida bolalarni sudrab borish orqali tartibni o'zgartirishingiz mumkin.
• Tasvirni ko'rsatishni sozlash uchun ImageView-ni tanlang, so'ng uning Tasvir xususiyatini Inspektorda o'rnating
Xususiyatlar bo'limi. Rasmning tomonlar nisbati - bu tasvir kengligining balandligiga nisbati.
• ImageView o‘lchamini belgilash uchun Inspektor tartibida uning Fit Width va Fit Height xususiyatlarini o‘rnating.
Bo'lim.

1136 25-bob JavaFX GUI: 1-qism



25.5.2-bo'lim Texnologiyalar haqida umumiy ma'lumot
• JavaFX ilovasining asosiy klassi Ilovadan (javafx.application.Application paketi) meros oladi.
• Asosiy sinfning asosiy usuli sinfni bajarishni boshlash uchun Ilovaning statik ishga tushirish usulini chaqiradi
JavaFX ilovasi. Bu usul, o'z navbatida, JavaFX ish vaqti ilova ob'ektini yaratishga olib keladi.
kation kichik sinfini tanlang va uning boshlang'ich usulini chaqiring, u GUI ni yaratib, uni Sahnaga biriktiradi va joylashtiradi.
Sahnada bu usul argument sifatida qabul qilishni boshlaydi.
• GridPane (javafx.scene.layout paketi) JavaFX tugunlarini ustunlar va satrlarga joylashtiradi.
to'rtburchaklar panjara.
• GridPane’dagi har bir katak bo‘sh bo‘lishi mumkin yoki bir yoki bir nechta JavaFX komponentlarini, jumladan,
boshqa boshqaruv elementlarini tartibga soluvchi layout konteynerlari.
• GridPane’dagi har bir komponent bir nechta ustun yoki qatorlarni qamrab olishi mumkin.
• TextField (javafx.scene.control paketi) matn kiritishni qabul qilishi yoki matnni ko‘rsatishi mumkin.
• Slayder (javafx.scene.control paketi) sukut bo‘yicha 0,0–100,0 oralig‘idagi qiymatni ifodalaydi
va foydalanuvchiga Slayderning bosh barmog'ini harakatlantirish orqali ushbu diapazondagi raqamni tanlash imkonini beradi.
• Tugma (javafx.scene.control paketi) foydalanuvchiga harakatni boshlash imkonini beradi.
• Class NumberFormat (java.text paketi) mahalliy valyuta va foiz qatorlarini formatlashi mumkin.
• GUI'lar voqealarga asoslangan. Foydalanuvchi GUI komponenti bilan o'zaro aloqada bo'lganda, o'zaro ta'sir - ma'lum
hodisa sifatida - dasturni vazifani bajarish uchun boshqaradi.
• Hodisaga javoban vazifani bajaradigan kod hodisa ishlov beruvchisi deyiladi.
• Muayyan hodisalar uchun Kod bo'limidan foydalanib, boshqaruvni uning hodisalarni boshqarish usuliga bog'lashingiz mumkin
Sahna quruvchisi inspektori oynasi. Bunday holda, voqea-tinglovchini amalga oshiradigan sinf -
siz uchun interfeys yaratiladi va siz ko'rsatgan usulni chaqiradi.
• Boshqaruv xususiyatining qiymati o'zgarganda sodir bo'ladigan hodisalar uchun siz hodisani yaratishingiz kerak
ishlov beruvchi butunlay kodda.
• Siz javob berish uchun ChangeListener interfeysini (javafx.beans.value paketi) ishlatasiz.
foydalanuvchi Slayderning bosh barmog'ini harakatga keltiradi.
• GUI FXML sifatida amalga oshirilgan JavaFX ilovalari Model-View-ga mos keladi.
Ilova ma'lumotlarini (modelda mavjud) ajratib turadigan Controller (MVC) dizayn namunasi
ilovaning GUI (ko‘rinish) va ilovani qayta ishlash mantig‘i (nazoratchi). Tekshirish moslamasi -
foydalanuvchi ma'lumotlarini qayta ishlash uchun mantiq. Ko'rinish modelda saqlangan ma'lumotlarni taqdim etadi. Qachon a
foydalanuvchi kiritishni ta'minlaydi, boshqaruvchi berilgan kirish bilan modelni o'zgartiradi. Model qachon
o'zgartirilganda, boshqaruvchi o'zgartirilgan ma'lumotlarni taqdim etish uchun ko'rinishni yangilaydi. Oddiy ilovada, model
va kontroller ko'pincha bitta sinfga birlashtiriladi.
• JavaFX FXML ilovasida siz nazoratchi sinfida ilovaning hodisa ishlov beruvchilarini aniqlaysiz. Nazoratchi
sinf boshqaruv elementlari bilan dasturiy ta'sir o'tkazish uchun misol o'zgaruvchilarini belgilaydi, shuningdek, hodisa-
ishlov berish usullari.
• Class FXMLLoaderning statik usul yuklashi yaratish uchun ilovaning GUI-ni ifodalovchi FXML faylidan foydalanadi.
GUI sahna grafigini ko'radi va sahnaga Ota (javafx.scene paketi) havolasini qaytaradi
grafikning ildiz tuguni. Shuningdek, u kontrollerning misol o'zgaruvchilarini ishga tushiradi va yaratadi va qayd qiladi
FXMLda ko'rsatilgan har qanday hodisalar uchun hodisa ishlov beruvchilari.
25.5.3-bo'lim Ilovaning grafik interfeysini yaratish
• Agar boshqaruvchi yoki tartib boshqaruvchi sinfida dasturiy tarzda boshqarilsa, siz pro-
ushbu boshqaruv yoki tartib uchun nom bering. Har bir ob'ekt nomi uning fx:id xususiyati orqali aniqlanadi. Siz
sahnangizdagi komponentni tanlash va keyin Inspektorni kengaytirish orqali ushbu xususiyat qiymatini belgilashi mumkin
oynaning Kod bo'limi - fx: id xususiyati tepada paydo bo'ladi.

Xulosa 1137



• Odatiy bo'lib, GridPane ikkita ustun va uchta qatorni o'z ichiga oladi. Siz yuqoriga qator qo'shishingiz yoki bo'lishingiz mumkin -
satrni o'ng tugmasini bosib, Grid paneli > Yuqoridagi qatorni qo'shish yoki Grid-ni tanlash orqali mavjud qatorni pasaytiring
Panel > Pastga qator qo‘shish. Siz satr yoki ustunni o'z ichiga olgan yorliqni o'ng tugmasini bosib o'chirishingiz mumkin
qator yoki ustun raqamini tanlang va O'chirish-ni tanlang.
• Siz tugmachaning matnini ikki marta bosish yoki tugmani tanlab, keyin uning matnini o‘rnatish orqali o‘rnatishingiz mumkin
Inspektor oynasining Xususiyatlar bo'limidagi xususiyat.
• GridPane ustunining mazmuni sukut bo'yicha chapga hizalanadi. Hizalashni o'zgartirish uchun ni tanlang
ustunning yuqori yoki pastki qismidagi yorliqni bosish orqali, so'ngra Inspektorning tartibida
bo'limida Halignment xususiyatini o'rnating.
• GridPane ustunining tugunning Pref Width xususiyatini USE_COMPUTED_SIZE ga o‘rnatish shuni ko‘rsatadiki,
kengligi eng keng bolaga asoslangan bo'lishi kerak.
• Tugmaning o‘lchamini GridPane ustunidagi boshqa boshqaruv elementlari bilan bir xil kenglikda o‘rnatish uchun tugmani tanlang,
keyin Inspector's Layout bo'limida Max Width xususiyatini MAX_VALUE ga o'rnating.
• GUI-ni loyihalashda uni Scene Builder dasturida Ko‘rib chiqish > Ko‘rib chiqishni ko‘rsatishni tanlash orqali ko‘rishingiz mumkin.
Oynada.
• Tugun tarkibi va uning yuqori, o'ng, pastki va chap qirralari orasidagi bo'shliq deb nomlanadi
tarkibni tugunning chetidan ajratib turadigan plomba. To'ldirishni o'rnatish uchun tugunni tanlang,
keyin Inspector's Layout bo'limida Padding xususiyatining qiymatlarini o'rnating.
• GridPane ustunlari va satrlari orasidagi standart bo'shliq miqdorini uning yordamida belgilashingiz mumkin
Hgap (gorizontal bo'shliq) va Vgap (vertikal bo'shliq) xususiyatlari.
• TextFieldga faqat “fokusda” bo‘lsa, ya’ni foydalanuvchi o‘rtasida bo‘ladigan boshqaruv elementi bo‘lsagina kiritishingiz mumkin.
bilan harakat qilish. Interaktiv boshqaruvni bosganingizda, u diqqatni oladi. Xuddi shunday, siz qachon
Tab tugmasini bosing, fokus joriy fokuslanadigan boshqaruvdan keyingisiga o'tadi - bu
boshqaruv elementlari GUIga qo'shilgan tartibda sodir bo'ladi.
25.5.4-bo'lim MaslahatKalkulyator sinfi
• GUIni ko‘rsatish uchun uni Sahnaga biriktirishingiz, keyin sahnani o‘tgan Sahnaga biriktirishingiz kerak.
Ilova usulini ishga tushiring.
• Odatiy bo'lib, Sahna o'lchami sahna grafigining ildiz tugunining o'lchami bilan belgilanadi. Haddan tashqari yuklangan
Scene konstruktorining versiyalari Sahna oʻlchamini va toʻldirishni (rang, gradient) belgilash imkonini beradi.
yoki rasm), bu c fonida paydo bo'ladi.
• Sahna usuli setTitle Sahna oynasining sarlavha satrida paydo bo'ladigan matnni belgilaydi.
• Stage usuli setScene Sahnani Sahnaga joylashtiradi.
• Bosqich usullarini ko'rsatish Stage oynasini ko'rsatadi.
25.5.5-bo'lim TipCalculatorController klassi
• BigDecimal qiymatlari qanday ekanligini aniqlash uchun java.math paketining RoundingMode raqami ishlatiladi.
hisoblar paytida yoki suzuvchi nuqtali raqamlarni Strings sifatida formatlashda yaxlitlanadi.
• Java.text to'plamining Class NumberFormati raqamli formatlash imkoniyatlarini ta'minlaydi, masalan:
kale-maxsus valyuta va foiz formatlari.
• Button hodisasi ishlovchisi ActionEventni oladi, bu Tugma bosilganligini bildiradi.
Ko'pgina JavaFX boshqaruvlari ActionEvents-ni qo'llab-quvvatlaydi.
• javafx.scene.control paketida ko'plab JavaFX boshqaruv sinflari mavjud.
• Oʻzgaruvchining namunasi oldidagi @FXML izohi oʻzgaruvchi nomi boʻlishi mumkinligini bildiradi.
ilovaning GUI-ni tavsiflovchi FXML faylida ishlatiladi. Siz ko'rsatgan o'zgaruvchilar nomlari
kontroller klassi GUI yaratishda ko'rsatgan fx: id qiymatlariga aniq mos kelishi kerak.

1138 25-bob JavaFX GUI: 1-qism



• FXMLLoader GUI yaratish uchun FXML faylini yuklaganida, u har bir boshqaruvni ishga tushiradi-
ler namunasi o'zgaruvchilari tegishli bo'lganlarga murojaat qilishlarini ta'minlash uchun @FXML bilan e'lon qilinadi.
FXML faylidagi GUI komponentlari.
• Usul oldidagi @FXML izohi ushbu usuldan a ni belgilash uchun ishlatilishi mumkinligini bildiradi
ilovaning GUI-ni tavsiflovchi FXML faylidagi boshqaruv hodisasi ishlovchisi.
• FXMLLoader nazoratchi sinfining ob'ektini yaratganda, u sinf mos keladimi-yo'qligini aniqlaydi.
Parametrsiz ishga tushirish usulini o'z ichiga oladi va agar shunday bo'lsa, tarkibni ishga tushirish uchun ushbu usulni chaqiradi.
troller. Ushbu usul GUI ko'rsatilishidan oldin kontrollerni sozlash uchun ishlatilishi mumkin.
• Anonim ichki sinf - bu nomsiz e'lon qilingan va odatda ichida paydo bo'ladigan sinf
usul deklaratsiyasi.
• Anonim ichki sinf nomiga ega bo'lmagani uchun nuqtada sinfning bitta ob'ekti yaratilishi kerak
sinf e'lon qilingan joyda.
• Anonim ichki sinf o'zining yuqori darajadagi sinfining misol o'zgaruvchilari, statik o'zgaruvchilari va
usullar, lekin u e'lon qilingan usulning mahalliy o'zgaruvchilariga cheklangan kirish huquqiga ega - u mumkin
faqat biriktiruvchi usul tanasida e'lon qilingan yakuniy mahalliy o'zgaruvchilarga kirish. (Java SE 8 dan boshlab,
anonim ichki sinf sinfning samarali yakuniy mahalliy o'zgaruvchilariga ham kirishi mumkin.)
O'z-o'zini tekshirish mashqlari
25.1 Quyidagi gaplarning har biridagi bo'sh joylarni to'ldiring:
a) A(n) matnni ko'rsatishi va foydalanuvchidan matn kiritishni qabul qilishi mumkin.
b) GUI komponentlarini to'rtburchaklar panjaradagi katakchalarga joylashtirish uchun a(n) dan foydalaning.
c) JavaFX Scene Builder oynasi GUI tuzilishini ko'rsatadi va ruxsat beradi
boshqaruv elementlarini tanlash va qayta tashkil qilish.
d) Foydalanuvchi Slayderni siljitganda hodisalarga javob berish uchun interfeysni amalga oshirasiz
bosh barmog'i.
e) A(n) ilova oynasini ifodalaydi.
f) GUI ko'rsatilishidan oldin usul FXMLLoader tomonidan chaqiriladi.
g) Sahna mazmuni uning ichiga joylashtiriladi.
h) Sahna grafigidagi elementlar deyiladi.
i) sudrab tashlash usullaridan foydalangan holda JavaFX grafik interfeyslarini yaratishga imkon beradi.
j) A(n) faylida JavaFX GUI tavsifi mavjud.
25.2 Quyidagilarning har biri to'g'ri yoki noto'g'ri ekanligini ko'rsating. Agar yolg'on bo'lsa, sababini tushuntiring.
a) Java-da qo'lda kodlash orqali JavaFX GUI-larni yaratishingiz kerak.
b) VBox maketi komponentlarni sahnada vertikal ravishda joylashtiradi.
c) GridPane ustunidagi boshqaruv elementlarini o'ngga tekislash uchun uning Alignment xossasini O'RG'ga o'rnating.
d) FXMLLoader tekshirgichning @FXML misol o'zgaruvchilarini ishga tushiradi.
e) JavaFX ilovasining bosqichini ko'rsatish uchun sinf Ilovasining ishga tushirish usulini bekor qilasiz.
f) Foydalanuvchi bilan o'zaro aloqada bo'lgan boshqaruv "fokusga ega".
g) Sukut bo'yicha Slayder 0 dan 255 gacha qiymatlarni tanlash imkonini beradi.
h) Tugun GridPane-da bir nechta ustunlarni qamrab olishi mumkin.
i) Har bir Ilova kichik klassi boshlash usulini bekor qilishi kerak.
O'z-o'zini tekshirish mashqlariga javoblar
25.1 a) TextField. b) GridPane. c) ierarxiya. d) ChangeListener. e) Bosqich. f) boshlang'ich -
iz. g) sahna grafigi. h) tugunlar. i) JavaFX Scene Builder. j) FXML.
25.2 a) Noto'g'ri. Hech qanday yozmasdan JavaFX GUI yaratish uchun JavaFX Scene Builder dasturidan foydalanishingiz mumkin
kod. b) To'g'ri. c) yolg'on. Mulkning nomi - Halignment. d) To'g'ri. e) yolg'on. Siz sinfni bekor qilasiz

1139-mashqlar



JavaFX ilovasining bosqichini ko'rsatish uchun ilovani ishga tushirish usuli. f) To'g'ri. g) yolg'on. Odatiy bo'lib Slayder
0,0 dan 100,0 gacha qiymatlarni tanlash imkonini beradi. h) To'g'ri. i) To'g'ri.
Mashqlar
25.3 (Scrapbooking ilovasi) Flickr kabi veb-saytlar yordamida mashhur diqqatga sazovor joylarning to'rtta rasmini toping.
Tasvirlarni kollajda joylashtirgan Xush kelibsiz ilovasiga oʻxshash ilova yarating. Matn qo'shish
bu har bir belgini belgilaydi. Loyihangizning bir qismi bo'lgan tasvirlardan foydalanishingiz mumkin yoki siz belgilashingiz mumkin
onlayn bo'lgan rasmning URL manzili.
25.4 (Kengaytirilgan Maslahat Kalkulyator ilovasi) Maslahat Kalkulyator ilovasini foydalanuvchiga kirishiga ruxsat berish uchun o‘zgartiring.
partiyadagi odamlar soni. Hisob-kitob bo'lsa, har bir shaxsning qarz miqdorini hisoblang va ko'rsating

Download 1.33 Mb.

Do'stlaringiz bilan baham:
  1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling