Onlayn kirish
Download 1.33 Mb.
|
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
www.allitebooks.com Tarkib ix 3.2.6 Shaxsiy misol o'zgaruvchilari bilan dasturiy ta'minot muhandisligi va
x Tarkib
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
Tarkib xiii 12.2 Java-ning Nimbus Look-and-Feel 475
xiv Tarkib 14.3.4 605-qatordagi belgilar va pastki qatorlarni joylashtirish
Mundarija xv 16.7 To'plamlar usullari 696
xvi Tarkib 17.6.2 Belgilangan diapazondagi ish haqi bilan xodimlarni filtrlash 751
Tarkib xvii 19.7.1 Qo'shishni saralashni amalga oshirish 825
xviii Tarkib 22.3 Java 916 da Windowsni tushunish
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
Tarkib xxi 31 JavaServer™ Faces veb-ilovalari: 2-qism
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
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
Java SE 8 xususiyatlari Lambda ifodalari
1-rasm | Ba'zi yangi Java SE 8 xususiyatlari. xxviii Muqaddima • Standart va statik usullarga ega Java SE 8 lambdalari, oqimlari va interfeyslari. The
• 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
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
va Java SE 8 hujjatlari uchun havolalar bilan boshlanadi Oracle Java SE 8-ni chiqarganida, bu havolalar o'zgarishi mumkin - ehtimol havolalar boshlanadi -
Nashr qilinganidan keyin o'zgargan havolalar uchun biz yangilanishlarni quyidagi manzilga joylashtiramiz Swing va JavaFX GUI, Grafika va Multimedia
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
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
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).
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,
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 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
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
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,
"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
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
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
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.
1.1 Kirish 3 (ilovalar) bozori 92 milliard dollarga yetishi kutilmoqda.4 Bu muhim martaba imkoniyatlarini yaratmoqda.
Qurilmalar Samolyot tizimlari Bankomatlar Avtomobil axborot-ko'ngilochar tizimlari
1.1-rasm | Java-dan foydalanadigan ba'zi qurilmalar. 4. https://www.abiresearch.com/press/tablets-will-generate-35-of-this-years-25-
4 1-bob Kompyuterlar, Internet va Java-ga kirish Java Micro Edition
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
Mantiqiy birlik tavsifi Kirish birligi Ushbu "qabul qiluvchi" bo'lim ma'lumotlarni (ma'lumotlar va kompyuter dasturlari) oladi.
1.2-rasm | Kompyuterning mantiqiy birliklari. (2-qismning 1-qismi.) 6 1-bob Kompyuterlar, Internet va Java-ga kirish 1.3 Ma'lumotlar ierarxiyasi
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
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.
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
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)
Fayllar
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
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.
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
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.
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
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 (
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
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.
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
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
...
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
4-bosqich: tasdiqlang ... Asosiy
Java virtual mashinasi (JVM) Asosiy
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
1.11-rasm | Windows 7, Linux va OS X da bajariladigan Painter ilovasi. a) Windows da ishlovchi Painter dasturi Yopish tugmasi Rang tanlang
ni tozalang butun chizma Oxirgisini bekor qiling shakl edi ga qo'shiladi chizish b) Linuxda ishlaydigan Painter ilovasi. Yopish
c) OS X da ishlovchi Painter ilovasi. Yopish
1.10 Java dasturini sinovdan o'tkazish 23 5. Moviy ko'zlarni chizish. Chizma rangi sifatida Moviyni tanlang, so'ngra ikkita kichik ovalni chizing
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
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
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
www.allitebooks.com 1.11 Internet va World Wide Web 27 1.11.4 Ajax
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/
28 1-bob Kompyuterlar, Internet va Java-ga kirish 1.12 Dasturiy ta'minot texnologiyalari
Texnologiya tavsifi Agile dasturiy ta'minot
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
Bulut
SaaS va PaaS bulutli hisoblash misollaridir. Siz dasturiy ta'minotdan foydalanishingiz mumkin va
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
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
Nashr URL AllThingsD allthingsd.com
1.20-rasm | Texnik va biznes nashrlari. O'z-o'zini tekshirish mashqlari
. 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-
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
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.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—
// 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
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
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
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
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-
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
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
} // 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
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
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
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
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");
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/
Qochish
\n Yangi qator. Ekran kursorini keyingi qatorning boshiga qo'ying.
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 -
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",
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
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
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
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,
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 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
"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
raqam1 = input.nextInt(); // foydalanuvchidan birinchi raqamni o'qish Yaxshi dasturlash amaliyoti 2.10
2.5 Boshqa dastur: Butun sonlarni qo'shish 49 2.5.7 Ikkinchi intni so'rash va kiritish
foydalanuvchini ikkinchi butun sonni kiritishni taklif qiladi. 21-qator ikkinchi butun sonni o'qiydi va uni raqam2 o'zgaruvchisiga tayinlaydi.
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
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-
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 2 2.7 Arifmetika 51 2.7 Arifmetika
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
raqam 1 raqam 2
so'm -xy-
a -b- 52 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar Pastki ifodalarni guruhlash uchun qavslar
Agar ifodada ichki qavslar bo'lsa, masalan Qavslarning eng ichki to'plamidagi ifoda (bu holda a + b) birinchi navbatda baholanadi.
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
To'g'ri chiziq tenglamasiga misol: Qavslar kerak emas. Ko'paytirish operatori birinchi bo'lib qo'llaniladi, chunki ko'paytirish
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:
Algebra:
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
2.13-rasm | Ikkinchi darajali polinom baholanadigan tartib. Algebraik
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-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
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)
agar (1-raqam!= raqam2) System.out.printf("%d != %d%n", 1-raqam, 2-raqam); agar (1-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.
foydalanuvchidan kiritilgan qiymatlarni saqlash uchun ishlatiladigan int o'zgaruvchilarni e'lon qilish. 31
Birinchi butun sonni kiriting: 777 Birinchi butun sonni kiriting: 1000 Birinchi butun sonni kiriting: 2000 umumiy sinfni taqqoslash Skaner kiritish = yangi Skaner(System.in);
int raqami 1; // solishtirish uchun birinchi raqam System.out.print("Birinchi butun sonni kiriting: "); // so'rov 2.15-rasm | If iboralari, relyatsion operatorlar va tenglik operatorlari yordamida butun sonlarni solishtiring. agar (1-raqam > 2-raqam) agar (1-raqam <= raqam2) agar (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
foydalanuvchini ikkinchi butun sonni kiritishni va mos ravishda qiymatni kiritishni taklif qiladi. Qiymat 1 va 2 sonining qiymatlarini solishtirib, ularning tengligini aniqlash. Agar Har bir if iborasining birinchi qatori oxirida nuqta-vergul (;) qo'yilmaydi. Bunday yarim- aslida Java tomonidan talqin qilinadi Bu erda chiziqdagi nuqta-vergulning o'zi - bo'sh gap deb ataladi - gap
System.out.print("Ikkinchi butun sonni kiriting: "); // so'rov agar (1-raqam == raqam2) Umumiy dasturlash xatosi 2.9 Yaxshi dasturlash amaliyoti 2.11 agar (1-raqam == raqam2); // mantiqiy xato agar (1-raqam == raqam2) 58 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar Oq bo'shliq
Operatorlar hozirgacha muhokama qilingan 2.9 Yakunlash Xatolarning oldini olish bo'yicha maslahat 2.5 Operatorlar assotsiativligi turi * /% chapdan o'ngga multiplikativ
2.16-rasm | Operatorlarning ustuvorligi va assotsiativligi muhokama qilindi. Yaxshi dasturlash amaliyoti 2.12
Xulosa 59 60 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar O'z-o'zini tekshirish mashqlari 61 • Butun sonni bo‘lish (51-bet) butun sonni beradi.
O'z-o'zini tekshirish mashqlari 62 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar 2.4 Quyidagi bayonotlarning har biridagi xatolarni aniqlang va tuzating:
O'z-o'zini tekshirish mashqlariga javoblar 63 2.5 a) // Uchta butun sonning ko‘paytmasini hisoblang
1 // Masalan. 2.6: Product.java Birinchi butun sonni kiriting: 10 64 2-bob Java ilovalariga kirish; Kirish/chiqish va operatorlar Mashqlar
.
e) arifmetik ifodadagi qavslar ichkariga kiritilganda qavslar to'plami- 65-mashqlar 2.15 (Arifmetik) Foydalanuvchidan ikkita butun sonni kiritishni so‘raydigan, ularni oladigan dastur yozing.
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.
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:
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
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-
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
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
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)
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
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
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 -
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
myAccount.getName() 3.2 Instance Variables, Methods ni o'rnating va Methods 75 ni oling Foydalanuvchidan ma'lumotlarni qabul qilish uchun skaner ob'ekti
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:
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.getName() 76 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish ifoda Skanerni System.in bilan ishga tushiradi, bu esa Skanerga qayerda ekanligini aytadi
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.
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
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
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
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
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
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.
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
84 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish Konstruktorni e'lon qiladigan sinfda standart konstruktor yo'q
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
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
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
3.5 Balans bilan hisob-kitoblar sinfi; Suzuvchi nuqtali raqamlar 87 4
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);
%.2f
%.2f account2.getBalance() double depositAmount = input.nextDouble(); // foydalanuvchi ma'lumotlarini olish %.2f account1.deposit(depositAmount); // hisob 1 balansiga qo'shing %.2f
depozitAmount = input.nextDouble(); // foydalanuvchi ma'lumotlarini olish %.2f account2.deposit(depositAmount); // hisob 2 balansiga qo'shing %.2f
88 3-bob Sinflar, ob'ektlar, usullar va qatorlarga kirish Hisob ob'ektlarining dastlabki qoldiqlarini ko'rsatish
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
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
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
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
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
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
Xulosa
• 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
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
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
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
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.
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
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 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
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
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 -
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
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 > 0,0) agar (o'rtacha <= 100,0) this.average = o'rtacha; // misol o'zgaruvchisiga tayinlash 4.8 Takrorlash bayonoti 113 Sinf talabalari testi
4.8 Takrorlash bayonoti Takrorlash iborasi dastur amalni ayni vaqtda takrorlashi kerakligini belgilash imkonini beradi ba'zi shartlar haqiqiyligicha qolmoqda. Pseudocode bayonoti 53
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
4.4-rasm | Talaba nomi va o'rtacha ma'lumotlarini saqlaydigan talaba sinfi. (2-qismning 2-qismi.) agar (o'rtacha >= 90,0)
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
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
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
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
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.
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
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
4.10 Algoritmlarni shakllantirish: Sentinel tomonidan boshqariladigan takrorlash 121 Faqat total va counter o'zgaruvchilari foydalanishdan oldin ishga tushirilishi kerak. O'zgaruvchilar
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.
Viktorina baholarini kiriting, jamlang va hisoblang Foydalanuvchiga birinchi sinfga kirishni taklif qiling
O'rtacha sinfni hisoblang va chop eting Hisoblagich nolga teng bo'lmasa
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.
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
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
gradeCounter != 0 // o'rtacha baholarni hisoblash uchun kasrli raqamdan foydalaning
124 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar Sentinel tomonidan boshqariladigan takrorlash va qarshi boshqariladigan takrorlash uchun dastur mantig'i
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
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
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
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.
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.
Imtihon natijalarini tahlil qiling va bonus to'lanishi kerakligini hal qiling O'zgaruvchilarni ishga tushirish
O'zgaruvchilarni ishga tushirish O'tishlarni nolga aylantiring
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
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
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
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
15
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
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.
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;
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
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
++ prefiksi
++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
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
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)
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("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
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
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
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
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
4.19-rasm | DrawPanel-ni ko'rsatish uchun JFrame yaratish. (2-qismning 1-qismi.) import java.awt.Graphics;
umumiy sinf DrawPanel JPanel-ni kengaytiradi public void paintComponent (Grafika g) super.paintComponent(g); int kengligi = getWidth(); // umumiy kenglik
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
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
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-
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.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-
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;
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.
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.
150 4-bob Nazorat bayonotlari: 1-qism; Tayinlash, ++ va -- Operatorlar 4.29 (Yulduzchalar kvadrati) Foydalanuvchiga tomonning o'lchamini kiritishni taklif qiladigan dastur yozing.
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
1
masalan 1 x -1---!- x2
x3
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
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
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.
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
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
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
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
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
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
bayonotga tengdir for iborasining ortishi ham manfiy boʻlishi mumkin, bu holda u kamayish hisoblanadi va
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
System.out.printf(“%d ”, hisoblagich); [hisoblagich > 10] [hisoblagich <= 10] int hisoblagichi = 1 hisoblagich ++ ni ko'rsatish
Boshlash
ni oshiring
5.4 For bayonotidan foydalanishga misollar 159 5.4 For bayonotidan foydalanishga misollar
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
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
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
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
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
5.5 takrorlash bayonnomasi 163 paytida… bajaring summalar (agar dollar summalari o'ng tomonda ikki raqam bilan ko'rsatilgan bo'lsa
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
------- 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
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
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
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
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
5.9-rasm | LetterGrades klassi harf baholarini hisoblash uchun switch iborasidan foydalanadi. (3 qismning 2-qismi.) int jami = 0; // baholar yig'indisi
input.hasNext() // tegishli harf darajasi hisoblagichini oshiring
5.6 167-sonli ko'p tanlovli kommutator Foydalanuvchining o'qish baholari
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 Windows tizimida 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,
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 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
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
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
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
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
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
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
"NJ"
"ME" 174 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar 5.8 Tanaffus va davom bayonotlari
12
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
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
1 // 5.14-rasm: ContinueTest.java
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.
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
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
5.15-rasm | && (shartli AND) operator haqiqat jadvali. agar ((semestr oʻrtacha >= 90) || (yakuniy imtihon >= 90))
(semestr o'rtacha >= 90) || (yakuniy imtihon >= 90) 178 5-bob Nazorat bayonotlari: 2-qism; Mantiqiy operatorlar Murakkab sharoitlarni qisqa tutashuvli 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
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 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
5.17-rasm | ^ (mantiqiy eksklyuziv OR) operator haqiqat jadvali. agar (! (baho == sentinelValue))
agar (baho!= sentinelValue) System.out.printf("Keyingi baho %d%n", baho); ifoda !ifoda yolg'on haqiqat
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.
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)
(noto'g'ri va noto'g'ri) (noto'g'ri va rost)
(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
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
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
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
Strukturaviy dasturlarni shakllantirish qoidalari 1. Eng oddiy faoliyat diagrammasidan boshlang (5.23-rasm).
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
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
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
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,
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
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,
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
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
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
5.29-rasm | Konsentrik doiralarni chizish. Xulosa
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 d o'z-o'zidan bir qatorda. Bu belgi bir vaqtning o'zida Ctrl va d tugmachalarini bosishni anglatadi. Windows tizimlarida • 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
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:
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++)
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.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:
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
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
4
4
4
= + + – ----- + … 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.
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
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
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
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
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 -
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
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
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
6.4 Ko'p parametrli usullarni e'lon qilish 207 Maksimal usul
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
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.
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.
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
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
Yaroqli aksiyalarni yozing ikki barobar Yo'q
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
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
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
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
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
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 +
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
6.8-rasm | Craps sinf zar o'yini craps simüle. (3 qismning 2-qismi.) // o'yin holatini ifodalovchi doimiylar bilan enum turi
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
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
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
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 // 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
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,
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
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 -
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
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)
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.
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
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.
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);
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
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
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
Xulosa
• 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-
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.
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)
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
Mashqlar
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
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
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
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.
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
1 6453 78 0 -89 1543 72 0 6 c[ 0 ]
Massiv nomi (c) ning indeksi (yoki pastki belgisi). c[ 7 ]
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.
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
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
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
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
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
String[] b = new String[100], x = new String[27]; String[] b = new String[100]; // b massivini yarating
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
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
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
7.4-rasm | Massiv elementlariga joylashtiriladigan qiymatlarni hisoblash. (2-qismning 1-qismi.) // ishga tushirish ro'yxati har bir element uchun boshlang'ich qiymatni belgilaydi
250 7-bob Massivlar va massivlar ro‘yxati 8-qator ARRAY_LENGTH doimiy o‘zgaruvchisini e’lon qilish uchun final modifikatoridan foydalanadi.
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
massiv[hisoblagich] = 2 + 2 * hisoblagich; 7.4 Massivlardan foydalanishga misollar 251 7.4.4 Massiv elementlarini yig'ish
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.
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
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
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 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
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
17
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
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
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
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
7.10-rasm | DeckOfCards klassi o'yin kartalari to'plamini ifodalaydi. (2-qismning 1-qismi.) // Kartaning string tasvirini qaytarish
7.6 Case Study: Kartalarni aralashtirish va muomala simulyatsiyasi 259 5 ommaviy toifadagi 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
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
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
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
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.
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
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
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
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
41
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.
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
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
7.14-rasm | Sinov baholarini saqlash uchun massivdan foydalanadigan GradeBook klassi. (3 qismning 2-qismi.) // baholar massivida aylanish
// 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
97
99 100 101 102 // har bir daraja chastotasi uchun diagrammadagi chiziqni chop eting 103 uchun (int count = 0; count 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 (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
9
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
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
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
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.
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[][] massivi // massiv qatorlari bo'ylab aylanish
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,
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 -
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
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
7.18-rasm | Baholarni saqlash uchun ikki o'lchovli massivdan foydalanadigan GradeBook klassi. (4 qismning 2-qismi.) // baholar massivi qatorlari bo'ylab aylanish
// 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:");
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
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
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
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
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)
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
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
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
18
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
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.
33
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
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 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 va ArrayList 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 ArrayList 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 ArrayList Usul tavsifi qo'shish ArrayList oxiriga element qo'shadi.
7.23-rasm | ArrayList 7.16 To'plamlar va sinf ArrayList 289-ga kirish 1 // 7.24-rasm: ArrayListCollection.java
7.24-rasm | Umumiy ArrayList 290 7-bob Massivlar va massivlar ro‘yxati Qo'shish usuli ArrayList ga elementlar qo'shadi (12-13 qatorlar). bilan qo'shish usuli
E'tibor bering, ArrayList 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 ArrayList 7.24-rasm | Umumiy ArrayList 7.17 (ixtiyoriy) GUI va grafik misol: Arcs 291 chizish 7.17 (ixtiyoriy) GUI va grafik misollar: chizmachilik
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
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 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
Xulosa
• 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 • 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
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
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
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
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
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-
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
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
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.
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
Operatsion kodining ma'nosi Kirish/chiqarish operatsiyalari:
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
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)
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.
Ko'rsatma tavsifi o'qing: "Butun sonni kiriting" so'rovini ko'rsating, keyin butun sonni kiriting va uni saqlang
7.36-rasm | Simpletronda bir nechta SML ko'rsatmalarining harakati. RO‘YXATDAN O‘TGANLAR:
Xotira:
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
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
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
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
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",
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
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
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
33
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
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
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
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
322 8-bob Sinflar va ob'ektlar: chuqurroq qarash 8.4 Joriy ob'ektning a'zolariga murojaat qilish
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,
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
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.
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
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
326 8-bob Sinflar va ob'ektlar: chuqurroq qarash 58 agar (soat < 0 || soat >= 24)
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
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
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-
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
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 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
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
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
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
20
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
10
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
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
11
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
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)
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.
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
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
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
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
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.
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
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
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
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
// 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
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.
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/
summa.setScale(2, RoundingMode.HALF_EVEN) 1 // 8.17-rasm: MyLine.java
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 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
13
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
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
Xulosa
• 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
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
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
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
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
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
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
// 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
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
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.
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
ToString tomonidan olingan yangilangan xodimlar ma'lumotlari: komissiya xodimi: Sue Jons
9.5-rasm | Komissiya xodimlari sinfi test dasturi. Komissiya xodimi = yangi komissiya xodimi(
staff.getFirstName() staff.getLastName() staff.getSocialSecurityNumber() staff.getGrossSales() staff.getCommissionRate() staff.setGrossSales(5000);
%s xodim 9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 371 9.4.2 BasePlusCommissionEmployee sinfini yaratish va undan foydalanish
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;
this.baseMaosh = asosiyMaosh; 9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 373 Class BasePlusCommissionEmployee 5-qatorda "Obyektni kengaytiradi" ni belgilamaydi, shuning uchun
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
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
Xodimlar to'g'risidagi ma'lumotlar get usullari bilan olinadi: Birinchi ismi Bob
ToString tomonidan olingan yangilangan xodimlar ma'lumotlari: bazaviy ish haqi komissiyasi xodimi: Bob Lyuis
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 –
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
9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabat 377 22 this.baseMaosh = asosiy ish haqi;
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
378 9-bob Obyektga yo‘naltirilgan dasturlash: Meros Subsinf konstruktori o'zining supersinf konstruktorini chaqirishi kerak
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
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
super(ism, familiya, socialSecurityNumber, yalpi savdo, komissiya stavkasi); Qaytish bazasiIsh haqi + (komissiyaRate * yalpi savdo); String.formatni qaytaring(
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
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.
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
384 9-bob Obyektga yo‘naltirilgan dasturlash: Meros Class BasePlusCommissionEmployee
63
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()
9.4 Yuqori sinflar va kichik sinflar o'rtasidagi munosabatlar 385 1 // 9.11-rasm: BasePlusCommissionEmployee.java
getBaseSalary() + super.earnings(); 386 9-bob Obyektga yo‘naltirilgan dasturlash: Meros Class BasePlusCommission Xodimning daromadi usuli
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
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
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
388 9-bob Obyektga yo‘naltirilgan dasturlash: Meros 9.7 (ixtiyoriy) GUI va grafik misollar:
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
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
9.14-rasm | JLabel shakl statistikasini ko'rsatadi. 9.8 Yakunlash 391 9.8 Yakunlash
Xulosa
• 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
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
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
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
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.
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
10.4 Referat darslari va usullari 403 O'zgaruvchilarni e'lon qilish uchun abstrakt sinflardan foydalanish
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
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
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
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
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
408 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar 1 // 10.5-rasm: SalariedEmployee.java
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,
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
10.6-rasm | HourlyEmployee sinfi Xodimni kengaytiradi. (3 qismning 2-qismi.) // daromadni hisoblash; Xodimda mavhum usuldagi daromadlarni bekor qilish
10.5 Tadqiq: Polimorfizmdan foydalangan holda ish haqi tizimi 411 10.5.4 Beton kichik sinf komissiyasi xodimi
68
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;
10.7-rasm | CommissionEmployee sinfi Xodimni kengaytiradi. (2-qismning 2-qismi.) // daromadni hisoblash; Xodimda mavhum usuldagi daromadlarni bekor qilish
// 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
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
27
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)
10.9-rasm | Xodimlar ierarxiyasi test dasturi. (4 qismning 2-qismi.) // pastki sinf ob'ektlarini yaratish
Xodim[] xodimlar = yangi xodim[4]; // massivni xodimlar bilan ishga tushirish
hozirgi xodim BasePlusCommissionEmployeening joriy xodim namunasi (BasePlusCommissionEmployee) joriy xodim 416 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar 58 System.out.printf(
Xodimlar individual ravishda qayta ishlanadi: maoshli xodim: Jon Smit
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
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
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
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.
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
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
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
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
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"
424 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar 10.9.3 Sinf hisob-fakturasi
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
10.12-rasm | To'lanadigan to'lovni amalga oshiradigan invoys klassi. (3-qismning 1-qismi.) umumiy interfeysi to'lanadi
umumiy sinf Invoice to'lanadigan to'lovlarni amalga oshiradi 10.9 Interfeyslarni yaratish va ulardan foydalanish 425 28 // qism raqamini oling
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
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
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
4
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.
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.
27
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
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
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:
faktura:
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.
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
currentPayable.toString() currentPayable.getPaymentAmount() 432 10-bob Obyektga yo‘naltirilgan dasturlash: polimorfizm va interfeyslar 10.10 Java SE 8 interfeysini yaxshilash
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”
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
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
Xulosa
• 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 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
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.
11.2 Misol: Nolga bo'lish istisnosiz ishlov berish 443 11.2 Misol: Istisnosiz nolga bo'linadi
Foydalanilgan istisnolar namunasi 7-bob ArrayIndexOutOfBoundsException
11.1-rasm | Ushbu kitob davomida ko'rishingiz mumkin bo'lgan har xil istisno turlari 1 // 11.2-rasm: DivideByZeroNoExceptionHandling.java
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
16
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,
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
Iltimos, butun sonni kiriting: 100 Butun sonni kiriting: 7 Natija: 100/7 = 14 Iltimos, butun sonni kiriting: 100
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
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
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
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
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
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
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 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
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
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
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
11.6, nihoyat, 457-blok System.out va System.err - bu oqimlar - baytlar ketma-ketligi. System.out paytida
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
458 11-bob Istisnolardan foydalanish: chuqurroq qarash Istisnolarni qayta tiklash
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
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
3-usulda berilgan istisno java.lang.Exception: 3-usulda berilgan istisno
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
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 №
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 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
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 -
ifoda noto'g'ri bo'lsa, AssertionError ni chiqaradi. Ikkinchi shakl u ifoda1 ni baholaydi va xato sifatida ifoda2 bilan AssertionError ni chiqaradi
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.
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
Xulosa
• 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
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
12.2 Java-ning Nimbus Look-and-Feel 475 GUI namunasi: SwingSet3 demo ilovasi
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
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
12.3 JOptionPane 477 bilan oddiy GUI-ga asoslangan kirish/chiqish Kirish dialoglari
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
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 =
// 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
478 12-bob GUI komponentlari: 1-qism komponentlar. Foydalanuvchi kiritish dialogining matn maydoniga istalgan belgilarni kiritishi mumkin. Bizning dasturimiz
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
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.
12.4-rasm | Ba'zi asosiy Swing GUI komponentlari. 480 12-bob GUI komponentlari: 1-qism Engil va og'ir vaznli grafik interfeys komponentlari
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
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");
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).
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
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,
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
// 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
36
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
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
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
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
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"
"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,
Quyidagi bayonot (12.9-rasmning 43-qatori) bajarilganda TextFieldHandler ob'ektiga havolani o'z ichiga olgan yangi yozuv joylashtirilgan
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
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
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
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"));
// 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
12.9 JButton 497 14-15 qatorlar JButton o'zgaruvchilari plainJButton va fancyJButtonni e'lon qiladi. to'g'ri -
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
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-
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
textField.setFont(yangi Shrift("Serif", Font.PLAIN, 14)); // JCheckBoxes uchun tinglovchilarni ro'yxatdan o'tkazish
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
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
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
12.19-rasm | ButtonGroup va JRadioButton yordamida radio tugmalarini yaratish. (2-qismning 1-qismi.) xususiy final JRadioButton plainJRadioButton; // oddiy matnni tanlaydi
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);
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.
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
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 = yangi JComboBox 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
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.
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
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
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;
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 = yangi JList // 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
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
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 15 xususiy yakuniy JList 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 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
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 JList JList List 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
MouseListener va MouseMotionListener interfeys usullari MouseListener interfeysi usullari
12.27-rasm | MouseListener va MouseMotionListener interfeys usullari. Dasturiy ta'minot muhandisligi kuzatuvi 12.5
12.14 Sichqoncha hodisalarini boshqarish 515 Java shuningdek, ilovalarga javob berish uchun MouseWheelListener interfeysini taqdim etadi
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();
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
12.28-rasm | Sichqoncha hodisasini boshqarish. (3 qismning 2-qismi.) xususiy sinf MouseHandler MouseListener-ni amalga oshiradi,
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()
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.
89
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
Java.awt.eventdagi voqea-adapter klassi interfeysni amalga oshiradi ComponentAdapter ComponentListener
12.30-rasm | Voqea-adapter sinflari va ular amalga oshiradigan interfeyslar. 1 // 12.31-rasm: MouseDetailsFrame.java
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
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
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
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
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.
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
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
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
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;
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
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
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
12.38-rasm | Dizayn menejerlari. 530 12-bob GUI komponentlari: 1-qism 12.18.1 FlowLayout
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(
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
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
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
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
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
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
vertikal
536 12-bob GUI komponentlari: 1-qism 12.18.3 GridLayout
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
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-
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
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),
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
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
Box box = Box.createHorizontalBox(); // quti yaratish textArea1 = yangi JTextArea(demo, 10, 15);
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)
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.
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.
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
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.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
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
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"
"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
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
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
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
13.5-rasm | Chizma ranglarini o'zgartirish. 1 // 13.6-rasm: ShowColors.java
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;
color.getRed() color.getGreen() color.getBlue() 562 13-bob Grafika va Java 2D 19-qator joriy rangda Stringni chizish uchun drawString Grafik usulidan foydalanadi.
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
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.
48
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
13.3 Rangni boshqarish 565 rang tanlash dialogini ko'rsatish uchun ushbu usulni chaqiring. showDialog usuli ni qaytaradi
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
Usul yoki doimiy tavsif Shrift konstantalari, konstruktorlari va usullari
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
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
13.11-rasm | Turli shriftlar va ranglardagi satrlarni ko'rsatish. 1 // 13.12-rasm: Fonts.java
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));
13.4 Shriftlarni boshqarish 569 Shrift ko'rsatkichlari
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
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()
13.5 Chiziqlar, to'rtburchaklar va tasvirlar chizish 571 13.15-rasmning 16-qatori joriy chizilgan shriftni yaratadi va o'rnatadi SansSerif, qalin,
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
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
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
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
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
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
Usul tavsifi Ko'pburchaklarni chizishning grafik usullari
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
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.
36
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
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
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.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
// 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
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
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.
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
Xulosa
• 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
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
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
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 =
s3 = tug'ilgan kun s4 = kun 14.1-rasm | String sinfi konstruktorlari. // String konstruktorlaridan foydalaning
14.3 Class String 599 12-qator String sinfining argumentsiz konstruktoridan foydalangan holda yangi Stringni yaratadi va
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
19
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
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
45
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
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
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.
"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
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.
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
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
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
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
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()
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.
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
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
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(doubleValue) String.valueOf(objectRef) 612 14-bob Satrlar, belgilar va oddiy iboralar 14.4.1 StringBuilder konstruktorlari
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();
14.4 Class StringBuilder 613 StringBuilder-da mos ravishda ko'proq xotira ajratmasdan. Ta'minlash usuli -
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
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.
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
17
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
14.13-rasm | StringBuilder qo'shish usullari. (2-qismning 1-qismi.) 14.12-rasm | StringBuilder usullari charAt, setCharAt, getChars va teskari. (2-qism
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
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.
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
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);
14.5 619-sinf belgisi Belgilar sinfida (va barcha turdagi o'rash sinflari) java.lang paketiga qarang
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
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
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
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
9
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
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
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-
Belgilar mos keladi Belgilar mos keladi \d har qanday raqam \D har qanday raqam bo'lmagan
14.19-rasm | Oldindan belgilangan belgilar sinflari. 1 // 14.20-rasm: ValidateInput.java
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(
return city.matches("([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)"); 626 14-bob Satrlar, belgilar va muntazam ifodalar 34
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
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
Miqdor moslamalari * Naqshning nol yoki undan ortiq takrorlanishiga mos keladi.
14.22-rasm | Muntazam iboralarda qo‘llaniladigan miqdor ko‘rsatkichlari. 1 // 14.23-rasm: RegexSubstitution.java
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)
18
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
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
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
Shakl ifodasi = Pattern.compile("J.*\\d[0-35-9]-\\d\\d-\\d\\d"); Matcher matcher = expression.matcher(string1); while (matcher.find())
14.8 Yakunlash 633 Java SE 8
Xulosa
• 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-
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
So'z uzunligi Voqealar 1 0
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.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
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,
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
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
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
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.
646 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish fayl oxiri ko'rsatkichi istisno sifatida yuzaga keladi. Boshqalarida ko'rsatkich qaytish qiymati hisoblanadi
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.
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
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
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;
// 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
uchun (p. yoʻl: DirectoryStream) 650 15-bob Fayllar, oqimlar va obyektlarni ketma-ketlashtirish Ajratuvchi belgilar
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);
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
15.3-rasm | Formatter sinfi bilan ketma-ket matn fayliga ma'lumotlarni yozish. (2-qismning 1-qismi.) import java.io.FileNotFoundException;
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
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.
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 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 namunasi 100 Bob Blue 24.98
15.5-rasm | 15.3-rasmdagi dastur uchun namuna ma'lumotlari. 1 // 15.6-rasm: ReadTextFile.java
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.
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.close(); 15.4 Ketma-ket kirish matnli fayllar 657 ReadRecords usuli (37–59-qatorlar) fayldagi yozuvlarni oʻqiydi va koʻrsatadi. Chiziqlar
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
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:
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
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
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,
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
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-
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.10-rasm | ObjectOutputStream yordamida yaratilgan ketma-ket fayl. (3 qismning 2-qismi.) chiqish = yangi ObjectOutputStream(
// 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
66
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
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.");
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
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
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
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",
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
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
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.
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.
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
Xulosa
• 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
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
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.
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
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
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'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
16.1-rasm | Ba'zi to'plamlar-ramka interfeyslari. Yaxshi dasturlash amaliyoti 16.1
16.3 Turi-o‘rash sinflari 687 Algoritm o'z vazifasini bajarish uchun ishlaydi - ishlov beriladigan ma'lumotlar elementlari soniga qarab.
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-
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.add(rang); // ro'yxat oxiriga rang qo'shadi List 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
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()
To'plam To'plam 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
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 692 16-bob Umumiy to'plamlar 1 // 16.3-rasm: ListTest.java
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 List 16.6 Ro'yxatlar 693 14 va 22-qatorlar String tipidagi LinkedLists ro'yxati1 va list2 ni yaratadi. LinkedList - bu
54
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:
ro'yxat:
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.hasNext() String rangi = iterator.next(); // elementni oling
List list.subList(boshlash, tugatish).clear(); // elementlarni o'chirish List ListIterator 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
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:
qora ko'k sariq yashil qizil pushti 16.4-rasm | Massivlarni Ro‘yxat sifatida ko‘rish va Ro‘yxatlarni massivlarga aylantirish. LinkedList 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
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.
16.5-rasm | To'plam usullari. 16.7 To'plamlar usullari 697 16.7.1 Usulni saralash
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 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 -
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 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
16.8-rasm | Ikki Time2 ob'ektini solishtiradigan Custom Comparator klassi. (2-qismning 1-qismi.) // komparator yordamida kamayish tartibida tartiblash
Taqqoslovchi Vaqt2 vaqt1 Vaqt2 vaqt2
16.7 To'plamlar usullari 699 Class TimeComparator umumiy turdagi Comparator interfeysini qo'llaydi
14
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 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
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;
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
702 16-bob Umumiy to‘plamlar Sinf kartasi (8-41-qatorlar) kartalar to'plamidagi kartani ifodalaydi. Har bir kartaning yuzi bor
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
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 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 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 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 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)
16.7 Yig'ish usullari 705 qiymat. BinarySearch usuli bu salbiy qiymatni avval qo'shishni hisoblash orqali aniqlaydi.
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 13 qator [] ranglar = {"qizil", "oq", "ko'k", "qora", "sariq", 14 "binafsharang", "to'ng'iz", "pushti"}; 15 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 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
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
7
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 15 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
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;
Stack 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).
41 emptyStackException.printStackTrace(); 42 } 43 } 44 45 // Stack tarkibini ko'rsatish 46 shaxsiy statik bekor printStack(Stack 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
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
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
// 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
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 Collection Set 16.10 713-to'plamlar element "apelsin" dan kamroq. Eshitish vositasidan qaytarilgan ko'rinish keyin bilan chiqariladi
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 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 tree.headSet("to'q sariq") tree.tailSet("apelsin") tree.first() tree.last() 714 16-bob Umumiy to'plamlar 16.11 Xaritalar
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
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;
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.containsKey(so'z) int count = map.get(word); // joriy hisobni olish
map.put(word, 1); // xaritaga 1 soni bilan yangi so'z qo'shing Set map.get(kalit) 16.11 Xaritalar 717 14-qator sukut bo'yicha boshlang'ich sig'imi (16 element) va bo'sh HashMap yaratadi.
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
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
16.19-rasm | java.util paketining xossalar klassi. (3 qismning 2-qismi.) // xususiyat qiymatini almashtiring
table.clear(); // bo'sh jadval // xususiyat rangi qiymatini oling
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
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
Mulk rangining qiymati qizil 16.19-rasm | java.util paketining xossalar klassi. (3 qismning 3-qismi.) Set props.getProperty((String) kaliti)
16.13 Sinxronlashtirilgan to'plamlar 721 72-qator Xususiyatlar mazmunini tiklash uchun Properties usuli yukini chaqiradi
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 List umumiy statik usul sarlavhalari 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
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 List 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 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
Xulosa
• 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.
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
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
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 17.4.1 Stream 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 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 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 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
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.
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;
732 17-bob Java SE 8 Lambdalar va oqimlar bajarishning bitta ipida tugaydigan boshlanish. Oldingi vazifani bajarish uchun siz ham
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
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
Interfeys tavsifi BinaryOperator 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
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
Intermediate Stream operatsiyalari filtri Natijalar faqat shartni qondiradigan elementlarni o'z ichiga olgan oqim hosil qiladi.
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
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)
IntStream.of(qiymatlar) .reduce(0, (x, y) -> x + y * y) 17.3 IntStream operatsiyalari 737 37
Asl qiymatlar: 3 10 6 1 4 8 2 5 9 7 Hisob: 10
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)
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
lekin Java SE 8 da siz shunchaki lambda yozasiz Qabul qilish usulining parametr nomi (qiymati) lambda parametriga aylanadi va
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
ishlab chiqaradi: 17.5-rasmdagi massiv qiymatlari uchun.
System.out.println(IntStream.of(qiymatlar).summaryStatistics()); IntSummaryStatistics{hisob=10, summa=55, min=1, oʻrtacha=5.500000,
740 17-bob Java SE 8 Lambdalar va oqimlar kamaytirishning ixtisoslashtirilgan amalga oshirilishi. Masalan, 31-satrda Int-ni qanday yig'ish kerakligi ko'rsatilgan.
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.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.
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 Oqim quvur liniyasini qayta ishlash
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 [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 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 16
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)
Ro'yxat 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 17.4.2 Oqimni saralash va natijalarni yig'ish
17.4.3 Oqimni filtrlash va natijalarni keyinroq ishlatish uchun saqlash 17.6-rasmning 24–27 qatorlari Stream 4 dan katta barcha qiymatlarni topish va natijalarni a ga yig'ish uchun Predikat oladi Ro'yxat 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 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 4. Keyingi 34-qator natijalarni tartiblashtirishni xohlayotganimizni bildiradi. Nihoyat, 35-qator yig'iladi natijalari List 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
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 17.5.1 Usul ma'lumotnomasi yordamida satrlarni bosh harfga solish
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 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 -
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
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 16 bu.ish haqi = ish haqi;
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 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 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;
17.6 Stream 31-qator Stream 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 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‘yxat • 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
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
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 list.stream() .filtr (to'rtta olti ming) .sorted(Comparator.comparing(Xodim::getSalary)) .forEach(System.out::println); .findFirst() .get() 17.6 Stream ularni ismi bilan. Buning uchun biz har biri qabul qiluvchi ikkita funktsiyani yaratishdan boshlaymiz
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 Comparator 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
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 17.6.5 Xodimlarni bo'lim bo'yicha guruhlash
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 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.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 list.stream() .collect(Collectors.groupingBy(Xodim::getDepartment, Collectors.counting())); 17.6 Stream ularning ish haqiga e'tiroz bildiramiz, shunda biz summani va o'rtachani hisoblashimiz mumkin. mapToDouble usuli
118–120 qatorlar Stream 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 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 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.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 Fayldagi har bir so'zning sodir bo'lishini umumlashtirish
A
va: 3 ilova: 2 arifmetik: 1 B
C
E
misollar: 1 F
dan: 1 H
I
J
jdk: 1 L
keyinroq: 1 o'rganing: 1 M
xabarlar: 2 N
O
P
hozir: 1 dastur: 1 dasturlash: 1 dasturlari: 2 R
natijalar: 2 yugurish: 1 S
ekran: 1 ko'rsatish: 1 yig'indisi: 1 T
: 7 ularning: 2 keyin: 2 bu: 2 uchun: 4 asboblar: 1 ikki: 2 U
foydalanuvchi: 1 V
bilan: 1 Y
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.
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 • 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 17.8 Tasodifiy qiymatlar oqimlarini yaratish 761 • Nihoyat, so'zlarning qisqacha mazmunini va ularning sonini harflar bo'yicha ko'rsatish uchun (ya'ni
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
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-
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
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
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 fayldan matn satrlari va IntStreamni olish uchun SecureRandom usuli ints dan foydalanilgan tasodifiy qiymatlar. Siz IntStreamni Stream (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 • 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 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 • Files usuli satrlari fayldan matn satrlarini o'qish uchun Stream • 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 • 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:
O'z-o'zini tekshirish mashqlariga javoblar 17.1 a) funksional interfeyslar. b) parallellashtirish. c) ichki. d) BinaryOperator 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
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 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
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.
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
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
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
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
n · (n – 1) · (n – 2) · … · 1 faktorial = 1;
n! = n · (n – 1)! 5! = 5 · 4 · 3 · 2 · 1
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
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. ...
... 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
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
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
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
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
784 18-bob Rekursiya Asosiydan Fibonachchi usuliga qo'ng'iroq (25-qator) rekursiv chaqiruv emas, balki barcha sub-
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
18.6-rasm | Fibonachchi (3) uchun rekursiv qo'ng'iroqlar to'plami. Ishlash bo'yicha maslahat 18.1
+ 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
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
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
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,
hal Towers(disklar - 1, sourcePeg, tempPeg, destinationPeg); hal Towers(disklar - 1, tempPeg, destinationPeg, sourcePeg);
18.9 Fraktallar 791 18.9 Fraktallar
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.
18.12-rasm | Koch egri fraktal. xC = (xA + xB) / 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.
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;
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.17-rasm | 2-darajada "Lo tuklar fraktal". 1 // 18.18-rasm: Fractal.java
18.18-rasm | Fraktal foydalanuvchi interfeysi. (3-qismning 1-qismi.) Kelib chiqishi (0, 0)
796 18-bob Rekursiya 23 super("Fraktal");
18.18-rasm | Fraktal foydalanuvchi interfeysi. (3 qismning 2-qismi.) int darajasi = drawSpace.getLevel();
levelJLabel.setText("Daraja: " + daraja); 18.9 Fraktallar 797 75
18.18-rasm | Fraktal foydalanuvchi interfeysi. (3 qismning 3-qismi.) drawSpace.setLevel(daraja);
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
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
18.9 Fraktallar 799 30
18.19-rasm | Rekursiya yordamida “Lo tuklar fraktalini” chizish. (4 qismning 2-qismi.) // asosiy holat: berilgan ikkita nuqtani tutashtiruvchi chiziq chizish
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
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
• 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.
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:
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
18.13 Quyidagi dastur nima qiladi? 1 // 18.12-mashq Yechim: MysteryClass.java
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.
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.
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
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
Bo'lim algoritmining joylashuvi Qidiruv algoritmlari:
16.12-rasm 19 Chiziqli 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
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
19.2-rasm | Element uchun massivni ketma-ket qidirish. (2-qismning 1-qismi.) // ma'lumotlar bo'yicha chiziqli qidiruvni amalga oshirish
Arrays.toString(ma'lumotlar) linearSearch(ma'lumotlar, searchInt)
814 19-bob Qidiruv, saralash va katta O LinearSearch usuli
[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
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
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
elementni qidirish uchun do // tsikli 818 19-bob Qidiruv, saralash va katta O 22 // tekislash uchun chiqish joylari
// agar element o'rtada topilsa agar (kalit == ma'lumotlar [o'rta]) joylashuv = o'rta; // joylashuv - joriy o'rta else if (key 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
[13, 18, 29, 36, 42, 47, 56, 57, 63, 68, 80, 81, 82, 88, 88] Iltimos, butun sonni kiriting (chiqish uchun -1): 18
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
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
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 -
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
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
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
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,
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
// 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
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
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
19.6-rasm | Birlashtirish tartibi bilan massivni saralash. (5-qismning 3-qismi.) mergeSort(ma'lumotlar); // massivni tartiblash
19.8 831 ni birlashtirish Saralanmagan massiv:
19.6-rasm | Birlashtirish tartibi bilan massivni saralash. (5-qismning 4-qismi.) 832 19-bob Qidiruv, saralash va katta O Birlashtirish usuli.Sort
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
Algoritm joylashuvi Katta O Qidiruv algoritmlari:
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
Xulosa
• 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
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
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
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
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
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
12
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.
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
Umumiy usulning parametr bo'limini yozing 22-qator printArray deklaratsiyasi usulini boshlaydi. Barcha umumiy usul deklaratsiyasi mavjud turi-parametr bo'limi (bu misolda 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 // 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
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 Yaxshi dasturlash amaliyoti 20.1
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
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 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 teger ob'ektlari, integer1 va integer2, ularni ifoda bilan solishtirish mumkin: Comparable compareTo shundayki, u o'sha sinfning ikkita ob'ekti mazmunini solishtiradi va qaytaradi taqqoslash natijalari. Comparable 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 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
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
20.4 Qaytish turi sifatida tur parametrini ishlatadigan usullar 847 Umumiy usul maksimal va tur parametrining yuqori chegarasini belgilash
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 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 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 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
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 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
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 elementlar = yangi ArrayList 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.
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 "Stack of Double") va Stack 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
20.9-rasm | Stack umumiy sinf sinov dasturi. (3-qismning 1-qismi.) // Stack 852 20-bob Umumiy sinflar va usullar 15 // doubleElements elementlarini doubleStack-ga suring
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
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 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
PopValue ga tayinlangan qiymat pop tomonidan qaytarilgan Double ob'ektidan chiqariladi. testPushInteger va testPopInteger usullari
popValue ga tayinlangan qiymat pop tomonidan qaytarilgan Integer obyektidan qutidan chiqariladi. Sinf stekini sinash uchun umumiy usullarni yaratish popValue = (Ikki) stack.pop(); popValue = (Integer) stack.pop();
20.6 Umumiy sinflar 855 1 // 20.10-rasm: StackTest2.java
20.10-rasm | Umumiy Stack ob'ektlarini umumiy usullarga o'tkazish. (2-qismning 1-qismi.) Ikki marta
// 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 T[] elementlar) T elementi: elementlar umumiy statik T popValue; // stekdan olib tashlangan elementni saqlash 856 20-bob Umumiy sinflar va usullar 11–12 qatorlar mos ravishda Stack 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.
chunki Double turi Ob'ektning pastki sinfidir. Ushbu topshiriqga ruxsat beriladi, chunki ele- Stack 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 turi. 17-qator Stack 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 Stack 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
858 20-bob Umumiy sinflar va usullar 12
20.11-rasm | Xom turdagi test dasturi. (3 qismning 2-qismi.) // Stack // Stack Stack 20.7 Xom turlari 859 Kompilyator haqida ogohlantirishlar
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
RawTypeTest.java: 17: ogohlantirish: [belgilanmagan] tekshirilmagan konvertatsiya topildi: Stack talab qilinadi: Stack Stack ^ RawTypeTest.java: 19: ogohlantirish: [checked] tekshirilmagan konvertatsiya topildi: Stack talab qilinadi: Stack testPush("rawTypeStack1", rawTypeStack1, doubleElements); ^ RawTypeTest.java:19: ogohlantirish: [checked] belgilanmagan usulni chaqirish: (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: (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: (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: (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
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 // ArrayList 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 | ArrayList Raqam[] raqamlar = {1, 2.4, 3, 4.1}; // Butun sonlar va juftliklar
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
Raqam butun sonning yuqori sinfi bo'lsa-da, kompilyator Array- turini hisobga olmaydi. Ro'yxat ArrayList ArrayList Bu raqam, lekin siz ArrayList 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 20), ArrayList sum(java.util.ArrayList (java.util.ArrayList ArrayList Raqamni kengaytiradi> 20.8 Tur parametrlarini qabul qiluvchi usullardagi joker belgilar 863 1 // 20.14-rasm: WildcardTest.java
20.14-rasm | Joker belgilar test dasturi. (2-qismning 1-qismi.) ArrayList summa (integerList) ArrayList summa (doublelist) ArrayList yig'indisi (raqamlar ro'yxati) ArrayList Raqamni kengaytiradi>
864 20-bob Umumiy sinflar va usullar 11–20 qatorlar ArrayList 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 Umumiy dasturlash xatosi 20.3
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
Xulosa
• 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.
. 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
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 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.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 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
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.
ikkita xususiy misol o'zgaruvchisiga ega - ma'lumotlar (umumiy turdagi T) va Node keyingi tugun. NextNode o'zgaruvchisi Node Bu erda e'lon qilingan - shuning uchun "o'z-o'ziga murojaat qiluvchi sinf" atamasi. Field nextNode - bu havola - u "bog'lanadi" Node 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 umumiy tugun (T ma'lumotlari) { /* konstruktor tanasi */ } public void setData(T data) { /* metod tanasi */ } umumiy T getData() { /* usul tanasi */ } public void setNext(tugun umumiy tugun } 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
Node 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 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
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
21.3-rasm | ListNode va List sinf deklaratsiyasi. (4-qismning 1-qismi.) HDQ birinchi tugun oxirgi tugun ... com.deitel.datastructures paketi; sinf ListNode ListNode 874 21-bob Maxsus umumiy ma'lumotlar tuzilmalari 18 // konstruktor ko'rsatilganlarga ishora qiluvchi ListNode ni yaratadi
21.3-rasm | ListNode va List sinf deklaratsiyasi. (4 qismning 2-qismi.) umumiy sinf ro'yxati xususiy ListNode xususiy ListNode 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
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
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
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 // 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 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 List 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.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
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
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
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
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
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
ma'lumotlar tuzilmalari javac -d. List.java EmptyListException.java javac -d .. List.java EmptyListException.java com.deitel.datastructures.List new com.deitel.datastructures.List<>(); 21.4 Bog'langan ro'yxatlar 885 Yagona turdagi import va talab bo'yicha import deklaratsiyasi
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
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
Windows yoki buyruqda UNIX/Linux/Mac OS X da. The . sinf yo'lida sinf yuklovchisiga List-ni topishga imkon beradi.
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 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 21.10 va 21.11-rasmlar List 21.3-rasm. Biz stekda push, pop, isEmpty va chop etish usullari bo'lishini xohlaymiz. Muhim - ly, bular List Albatta, List Orqaga) biz umumiy interfeys orqali stekga kirishni xohlamaymiz sinf. Shuni yodda tutish kerakki, List StackInheritance StackInheritance insertAtFront qo'ng'iroqlari va pop qo'ng'iroqlari removeFromFront usuli. StackInheritance ents isEmpty usullarini chaqirishi va chop etishi mumkin, chunki ular List StackInheritance foydalanish. StackInheritance Class StackInheritanceTestning asosiy usuli (21.11-rasm) sinf ob'ektini yaratadi. StackInheritance (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
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 // surish usulidan foydalaning
21.5 Stacks 889 Merosdan ko'ra kompozitsiya orqali stek sinfini shakllantirish
18
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
1 ochildi
0 chiqdi
-1 ochildi
21.11-rasm | Stack manipulyatsiyasi dasturi. (2-qismning 2-qismi.) 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 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 umumiy StackComposition() stackList = new List 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
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 = yangi ro'yxat 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 20
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 // navbat usulidan foydalaning
21.7 Daraxtlar 893 21.7 Daraxtlar
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
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 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
klassi TreeNode TreeNode TreeNode umumiy bekor kiritish (T insertValue) umumiy sinf Tree xususiy TreeNode public void insertNode (T insertValue) 896 21-bob Maxsus umumiy ma'lumotlar tuzilmalari 58 agar (ildiz == null)
root = yangi TreeNode root.insert(insertValue); // kiritish usulini chaqiring public void preorderTraversal() private void preorderHelper(TreeNode preorderHelper(node.leftNode); // chap pastki daraxtni aylantiring preorderHelper(node.rightNode); // o'ng pastki daraxtni aylantiring public void inorderTraversal() xususiy void inorderHelper(TreeNode inorderHelper(node.leftNode); // chap pastki daraxtni aylantiring inorderHelper(node.rightNode); // o'ng pastki daraxtni aylantiring public void postorderTraversal() xususiy bekor postorderHelper(TreeNode 21.7 Daraxtlar 897 110
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 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 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:
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
• 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
21.20-rasm | 15 tugunli ikkilik qidiruv daraxti. 49 28
83 11 19 32 44 69 72 92 99 904 21-bob Maxsus umumiy ma'lumotlar tuzilmalari O'z-o'zini tekshirish mashqlariga javoblar
Mashqlar
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 (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 argument va o'sha Ro'yxatning nusxasini qaytaradi 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 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 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:
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
22.1-rasm | Gorizontal orientatsiyaga ega JSlider komponenti. 1 // 22.2-rasm: OvalPanel.java
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
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
import javax.swing.JSlider; import javax.swing.event.ChangeListener;
xususiy yakuniy JSlider diametriJSlider; // diametrni tanlash uchun slayder // diametr qiymatini boshqarish uchun JSlider-ni o'rnating
22.2 JSlider 915 OvalPanel sinfida (22.2-rasm) paintComponent usuli mavjud (12-17-qatorlar).
30
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
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.
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.JMenu; import javax.swing.JMenuItem; import javax.swing.JMenuBar; 22.4 Menyularni ramkalar bilan ishlatish 919 25
22.5-rasm | JMenyular va mnemonika. (5-qismning 2-qismi.) xususiy yakuniy JRadioButtonMenuItem[] colorItems; // rangli menyu 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
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
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
22.5-rasm | JMenyular va mnemonika. (5-qismning 4-qismi.) styleItems[hisoblash] =
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
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
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
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.
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;
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
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
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
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;
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
22.6 Pluggable Look-and-Feel 931 73
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
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
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
22.11-rasm | Ko'p hujjatli interfeys. (2-qismning 2-qismi.) JInternalFrame ramkasi = yangi JInternalFrame(
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(),
22.7 JDesktopPane va JInternalFrame 935 27–33 qatorlar JMenuBar, JMenu va JMenuItemni yaratadi, JMenuItem-ni
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
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
22.8 JTabbedPane 937 yorliq ustiga joylashtirilishi mumkin. Agar komponent idish bo'lsa, masalan, panel, u har qanday foydalanishi mumkin
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
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
Layout menejeri Tavsif BoxLayout GUI komponentlarini chapdan o'ngga yoki yuqoridan pastgacha tartibga solish imkonini beradi.
22.15-rasm | Qo'shimcha tartib menejerlari. 1 // 22.16-rasm: BoxLayoutFrame.java
import javax.swing.BoxLayout; Horizontal1 quti = Box.createHorizontalBox();
horizontal1.add(yangi JButton("Button" + hisoblash)); vertical1.add(Box.createVerticalStrut(25));
940 22-bob GUI komponentlari: 2-qism 36
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());
JTabbedPane yorliqlari = yangi JTabbedPane( JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); 22.9 BoxLayout Layout Manager 941 Quti konteynerlarini yaratish
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
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
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 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 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;
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
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.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
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
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" };
22.23-rasm | GridBagConstraints konstantalari RELATIVE va REAINDER. (2-qismning 2-qismi.) constraints.weightx = 1;
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
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]
Xulosa
• 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
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
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
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
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.1-rasm | Mavzuning hayot davri UML holati diagrammasi. vazifa
qulfni olish xalaqit berish I/U tugallanadi Kutmoq
xabar bering
Kutmoq
interval muddati tugaydi xabar bering hammaga xabar bering yugurish mumkin dastur boshlanadi
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
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
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
27
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
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
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
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.
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
++writeIndex; // keyingi yoziladigan elementning o'sish indeksi 23.4 Mavzuni sinxronlashtirish 971 Class ArrayWriter
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;
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
mantiqiy topshiriqlarEnded = excutorService.awaitTermination(1, TimeUnit.MINUTES); pool-1-thread-1 0 elementiga 1 yozdi. Birinchi pool-1-thread-1 qiymatini yozdi
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
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
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-
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
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
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
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
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
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
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:
// 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
Iste'molchi 7 14 ni o'qiydi Ishlab chiqaruvchi 8 36 yozadi
Ishlab chiqaruvchi 9 45 yozadi Ishlab chiqaruvchi ishlab chiqarishni tugatdi
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
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
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 o'qiydi -1 -1 o'qiydi -1 yomon ma'lumot 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
984 23-bob Parametrlilik Ushbu misolning umumiy ko'rinishidan Prodyuser birinchi va har bir narsani bajarishi kerakligini eslang
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 -
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 bufer = new ArrayBlockingQueue 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
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,
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
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
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
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
990 23-bob Bir vaqtdalik Sinxronlashtirilgan bufer sinfining maydonlari va usullari
48
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
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
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
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
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 -
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)
// 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
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
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)
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)
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.
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
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
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
// 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
accessLock.unlock(); // ushbu ob'ektni qulfdan chiqaring 1006 23-bob Parametrlilik 52
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.
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;
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.
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
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
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.
1010 23-bob Parametrlilik Java SE 7:
To'plam tavsifi ArrayBlockingQueue Ishlab chiqaruvchi/iste'molchi munosabatlarini qo'llab-quvvatlaydigan qat'iy o'lchamdagi navbat -
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
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.
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
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 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
19
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
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;
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)
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
110
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
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 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
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
1020 23-bob Parametrlilik Class PrimeCalculator SwingWorker-ni (13-qator) birinchi turdagi parametr bilan kengaytiradi
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
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;
23.11 GUI bilan ko'p qirrali: SwingWorker 1023 65
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
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
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();
Instant parallelSortStart = Instant.now(); 1026 23-bob Parametrlilik Massivlarni yaratish
33
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);
Duration.been(parallelSortStart, parallelSortEnd).toMillis() String foizi = NumberFormat.getPercentInstance().format(
23.13 Java SE 8: Ketma-ket va parallel oqimlar 1027 Parallel massivning boshqa operatsiyalari
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
23.29-rasm | Ketma-ket va parallel oqim operatsiyalari samaradorligini solishtirish. (3 qismning 2-qismi.) Instant separatStart = 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
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;
23.14 (Kengaytirilgan) Chaqiriladigan va kelajak 1031 interfeyslari 9 // ikki lahzani o'z vaqtida saqlaydigan sinf
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 CompletableFuture.supplyAsync(() -> startFibonachchi(45)); CompletableFuture CompletableFuture.supplyAsync(() -> startFibonachchi(44)); TimeData asynchronousResult1 = futureResult1.get(); TimeData asynchronousResult2 = futureResult2.get(); 1032 23-bob Parametrlilik 61 // vaqtni saqlash uchun TimeData obyektini yarating
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
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 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
• 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.
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
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
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
24.2 Relyatsion ma'lumotlar bazalari 1047 Eng mashhur ma'lumotlar bazasini boshqarish tizimlari JDBC drayverlarini taqdim etadi. Ushbu bobda,
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
Jons
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
Nyu-Jersi Orlando Los Anjeles Bo'limning joylashuvi 24.3 A kitoblar ma'lumotlar bazasi 1049 Sarlavhalar jadvali
AuthorID FirstName Familiya 1 Pol Deytel
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
10 2015 yil 013299044X C 7 2013-yilni qanday dasturlash kerak
2 2014 yil 0132121360 Dasturchilar uchun Android: Ilova-
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
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.
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
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
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
24.11-rasm | Mualliflar jadvalidagi AuthorID va Familiya ma'lumotlarining namunasi. 24.4 SQL 1053 24.4.2 WHERE bandi
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
Title EditionNumber Mualliflik huquqi Java qanday dasturlash 10 2015
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
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
24.13-rasm | Mualliflar jadvalidagi familiyasi D harfi bilan boshlangan mualliflar. Portativlik bo'yicha maslahat 24.1
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
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
24.15-rasm | Familiya bo'yicha o'sish tartibida mualliflar jadvalidagi namuna ma'lumotlari. Muallif identifikatori, ismi, familiyasini tanlang
AuthorID FirstName Familiya 4 Dan Quirk
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
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
24.17-rasm | Familiya va familiya bo'yicha o'sish tartibida mualliflardan namuna ma'lumotlari. ISBN, sarlavha, nashr raqami, mualliflik huquqini tanlang
ISBN Title EditionNumber Mualliflik huquqi 0133764036 Android 2 dastur 2015
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
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
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
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
24.4 SQL 1059 24.4.6 YANGILANISH to'g'risidagi bayonot
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
AuthorID FirstName Familiya 1 Pol Deytel
24.20-rasm | INSERT operatsiyasidan keyin Mualliflar jadvalidagi namuna ma'lumotlari. Jadval nomini YANGILASH
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
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
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 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:
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.
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.
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
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
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
24.23-rasm | Mualliflar jadvalining mazmunini ko'rsatish. (2-qismning 2-qismi.) final String DATABASE_URL = "jdbc:derbi:kitoblar";
// 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
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
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
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
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
24.25-rasm | JTablega ResultSet ma'lumotlarini ta'minlovchi TableModel. (4 qismning 2-qismi.) // ma'lumotlar bazasiga ulanish holatini yangilash
umumiy sinf getColumnClass(int ustuni) // ma'lumotlar bazasiga ulanish mavjudligiga ishonch hosil qiling
String className = metaData.getColumnClassName(ustun + 1); // className ni ifodalovchi Class obyektini qaytaring
public int getColumnCount() 1070 24-bob JDBC yordamida ma'lumotlar bazalariga kirish 91 // ResultSet-da ma'lum bir ustun nomini oling
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
142
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
// 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
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.
24.26-rasm | ResultSet turini belgilash uchun ResultSet konstantalari. Portativlik bo'yicha maslahat 24.3
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.
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
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;
24.28-rasm | Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish. (5-qismning 2-qismi.) import javax.swing.RowFilter;
// 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();
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
24.6 JDBC 1077 bilan ma'lumotlar bazalarini manipulyatsiya qilish 121
24.28-rasm | Kitoblar ma'lumotlar bazasida Mualliflar jadvalining mazmunini ko'rsatish. (5-qismning 4-qismi.) final TableRowSorter sorter.setRowFilter(null); sorter.setRowFilter(
// 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.
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
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
24.29-rasm | JdbcRowSet yordamida Mualliflar jadvalining mazmunini ko'rsatish. (2-qismning 1-qismi.) import javax.sql.rowset.JdbcRowSet;
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
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
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
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
1084 24-bob JDBC yordamida ma'lumotlar bazalariga kirish bu manzillar kitobida bir kishini ifodalaydi. Sinfda manzil uchun maydonlar mavjud
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
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;
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
24.31-rasm | Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements. (5-qismning 3-qismi.) // executeQuery mos yozuvlarni o'z ichiga olgan ResultSet-ni qaytaradi
selectPeopleByLastName.setString(1, ism); // familiyani belgilang // executeQuery mos yozuvlarni o'z ichiga olgan ResultSet-ni qaytaradi
1088 24-bob JDBC yordamida ma'lumotlar bazalariga kirish 110 natijalar.add(yangi shaxs(resultSet.getInt("adresID"),
24.31-rasm | Manzillar kitobi ilovasi tomonidan ishlatiladigan PreparedStatements. (5-qismning 4-qismi.) insertNewPerson.setString(1, fname);
// yangi yozuvni kiriting; yangilangan # qatorni qaytaradi natija = insertNewPerson.executeUpdate(); 24.8 Tayyorlangan bayonotlar 1089 PreparedStatements yaratish
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-
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 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;
24.32-rasm | Oddiy manzillar kitobi. (8-qismning 2-qismi.) // ma'lumotlar bazasiga ulanishni o'rnating va PreparedStatements-ni o'rnating
1092 24-bob JDBC yordamida ma'lumotlar bazalariga kirish 100 oldingiButtonActionPerformed(evt);
24.32-rasm | Oddiy manzillar kitobi. (8-qismning 3-qismi.) 24.8 Tayyorlangan bayonotlar 1093 153 idTextField.setEditable(noto'g'ri);
24.32-rasm | Oddiy manzillar kitobi. (8-qismning 4-qismi.) 1094 24-bob JDBC yordamida ma'lumotlar bazalariga kirish 206 browseButtonActionPerformed(evt);
24.32-rasm | Oddiy manzillar kitobi. (8-qismning 5-qismi.) 24.8 Tayyorlangan bayonotlar 1095 259
24.32-rasm | Oddiy manzillar kitobi. (8-qismning 6-qismi.) natijalar =
1096 24-bob JDBC yordamida ma'lumotlar bazalariga kirish 311 urinib ko'ring
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,
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
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
Xulosa
• 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
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
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?
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 sahna sahnasining ildiz tugunlari grafik - bu joylashtirish konteyneridir boshqa tugunlarni tartibga soladi Deraza sahna sifatida tanilgan Sahna sahnasi o'z ichiga oladi
25.4 Xush kelibsiz ilovasi — matn va tasvirni ko‘rsatish 1111 • Bolalari bo'lgan tugunlar, odatda, ularning bolasini tartibga soluvchi tartibli konteynerlardir
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
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
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 > 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 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
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
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
25.9-rasm | Hisob-kitob miqdorini kiritish va uchini hisoblash. Slayder bosh barmog'ini quyidagiga o'tkazing
a) Boshlang'ich Maslahat Kalkulyator GUI Joriy maslahat foizi
Bunda foydalanuvchi hisob miqdorini kiritadi TextField Sarlavha paneli b) foydalanuvchi 34.56 miqdorini kiritgandan so'ng GUI
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.
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
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.
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
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
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
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
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
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 =
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
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) -
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
34
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
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 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
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 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
25.6 Onlayn JavaFX 1133 boblarida yoritilgan xususiyatlar ymous ichki sinfi va shu sinfning bitta ob'ektini yaratadi. Keyin bu ob'ektga havola
70-da ochiladigan chap qavs va 79-qatordagi oʻng yopuvchi qavs ning tanasini chegaralaydi anonim ichki sinf. 71–78 qatorlar ChangeListener 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 tipPercentageSlider.valueProperty().addListener(
1134 25-bob JavaFX GUI: 1-qism • JavaFX animatsiyalarini bajarish.
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
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 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: |
ma'muriyatiga murojaat qiling