Salom! Java nima uchun shunday yaratilgani haqida hech o'ylab ko'rganmisiz? Siz sinflarni yaratasiz, ular asosida - ob'ektlar, sinflar usullari va boshqalar. Ammo nima uchun tilning tuzilishi shundayki, dasturlar boshqa narsadan emas, balki sinflar va ob'ektlardan iborat? Nima uchun "ob'ekt" tushunchasi ixtiro qilindi va birinchi o'ringa qo'yildi? Barcha tillar shu tarzda ishlaydimi va agar bo'lmasa, Java-ga qanday foyda keltiradi? Ko'rib turganingizdek, savollar juda ko'p :) Keling, bugungi ma'ruzamizda ularning har biriga javob berishga harakat qilaylik.
Kristen Nygaard va Ole Yoxan Dahl - Simula yaratuvchilari
Simula dasturlash standartlari bo'yicha qadimiy til bo'lib tuyuladi, ammo ularning Java bilan "oilaviy" aloqasi yalang'och ko'z bilan ko'rinadi. Katta ehtimol bilan siz unda yozilgan kodni osongina o'qishingiz va nima qilishini umumiy ma'noda tushuntirishingiz mumkin :)
OOP tamoyillari:
Ob'ektga yo'naltirilgan dasturlash (OOP) nima
Albatta, Java biron bir sababga ko'ra ob'ektlar va sinflardan iborat. Bu uni yaratuvchilarning injiqligi yoki hatto ularning ixtirosi ham emas. Ob'ektlarga asoslangan boshqa ko'plab tillar mavjud. Birinchi bunday til Simula deb nomlangan va u 1960-yillarda Norvegiyada ixtiro qilingan. Boshqa narsalar qatorida Simula " sinf " va " usul " tushunchalarini kiritdi .Begin
Class Rectangle (Width, Height); Real Width, Height;
Begin
Real Area, Perimeter;
Procedure Update;
Begin
Area := Width * Height;
OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
Perimeter := 2*(Width + Height);
OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
End of Update;
Update;
OutText("Rectangle created: "); OutFix(Width,2,6);
OutFix(Height,2,6); OutImage;
End of Rectangle;
Rectangle Class ColouredRectangle (Color); Text Color;
Begin
OutText("ColouredRectangle created, color = "); OutText(Color);
OutImage;
End of ColouredRectangle;
Ref(Rectangle) Cr;
Cr :- New ColouredRectangle(10, 20, "Green");
End;
Kod misoli maqoladan olingan Simula - OOP 50 yil . Ko'rib turganingizdek, Java va uning ajdodi bir-biridan unchalik farq qilmaydi :) Bu Simulaning paydo bo'lishi yangi kontseptsiya - ob'ektga yo'naltirilgan dasturlashning tug'ilishi bilan bog'liq. Vikipediya OOPning quyidagi taʼrifini beradi: Obʼyektga yoʻnaltirilgan dasturlash (OOP) bu dasturni obʼyektlar toʻplami sifatida koʻrsatishga asoslangan dasturlash metodologiyasi boʻlib, ularning har biri maʼlum bir sinfning namunasi boʻlib, sinflar meros ierarxiyasini tashkil qiladi. Menimcha, bu juda muvaffaqiyatli. Siz yaqinda Java tilini o'rganishni boshladingiz, lekin unda siz uchun notanish so'zlar deyarli yo'q :) Bugungi kunda OOP eng keng tarqalgan dasturlash metodologiyasi hisoblanadi. Java-dan tashqari, OOP tamoyillari siz eshitgan ko'plab mashhur tillarda qo'llaniladi. Bular C++ (kompyuter oʻyinlarini ishlab chiquvchilar tomonidan faol qoʻllaniladi), Objective-C va Swift (ular Apple qurilmalari uchun dasturlar yozadilar), Python (mashina oʻrganishda eng koʻp talab), PHP (eng mashhur veb-ishlab chiqish tillaridan biri), JavaScript (oddiyroq, ular nima qilmasligini aytadi) va boshqalar. Aslida, OOPning bu "tamoyillari" nima? Keling, sizga batafsilroq aytib beraylik.
OOP tamoyillari
Bu asoslar. Birgalikda ob'ektga yo'naltirilgan dasturlash paradigmasini tashkil etuvchi 4 ta asosiy xususiyat. Ularni tushunish muvaffaqiyatli dasturchi bo'lishning kalitidir.Prinsip 1. Meros
Yaxshi xabar shundaki, siz OOP ning ba'zi tamoyillari bilan allaqachon tanishsiz! :) Biz allaqachon ma'ruzalarda merosga bir necha bor duch kelganmiz va u bilan ishlashga ulgurdik. Meros - bu mavjud (ota-ona) asosida yangi sinfni tavsiflash imkonini beruvchi mexanizm. Bunday holda, ota-klassning xususiyatlari va funksionalligi yangi sinf tomonidan qarzga olinadi. Meros nima uchun zarur va u qanday imtiyozlarni beradi? Birinchidan, kodni qayta ishlatish. Ota-onalar sinflarida tasvirlangan maydonlar va usullar avlod sinflarida qo'llanilishi mumkin. Agar barcha turdagi avtomobillarda 10 ta umumiy maydon va 5 ta bir xil usul boʻlsa, ularni faqat ota-ona sinfiga qoʻyish kifoyaAuto
. Siz ularni hech qanday muammosiz avlod sinflarida ishlatishingiz mumkin. Qattiq afzalliklar: miqdoriy (kamroq kod) va natijada sifat jihatidan (sinflar ancha soddalashadi). Shu bilan birga, meros mexanizmi juda moslashuvchan va siz etishmayotgan funksiyalarni avlodlarga alohida qo'shishingiz mumkin (ba'zi maydonlar yoki ma'lum bir sinfga xos xatti-harakatlar). Umuman olganda, oddiy hayotda bo'lgani kabi: biz hammamiz ota-onamizga qaysidir ma'noda o'xshashmiz, lekin qaysidir jihatlari bilan ulardan farq qilamiz :)
2-tamoyil. Abstraktsiya
Bu juda oddiy printsip. Abstraktsiya ob'ektning asosiy, eng muhim xususiyatlarini ajratib ko'rsatishni va aksincha - ikkinchi darajali, ahamiyatsizlarini yo'q qilishni anglatadi. Keling, g'ildirakni qayta ixtiro qilmaylik va darslar haqidagi eski ma'ruzadan bir misolni eslaylik. Aytaylik, biz kompaniya xodimlarining fayllar kabinetini yaratamiz. Xodimlar ob'ektlarini yaratish uchun biz sinf yozdikEmployee
. Kompaniya faylida ularning tavsifi uchun qanday xususiyatlar muhim? To'liq ism, tug'ilgan sana, ijtimoiy sug'urta raqami, soliq identifikatsiya raqami. Ammo bu turdagi kartada uning bo'yi, ko'zlari va soch rangi kerak bo'lishi dargumon. Kompaniyaga xodim haqidagi bu ma'lumotlar kerak emas. Shuning uchun sinf uchun biz , , va , Employee
o'zgaruvchilarni o'rnatamiz va biz ko'z rangi kabi o'zimizga keraksiz ma'lumotlardan voz kechamiz va uni abstrakt qilamiz. Ammo agentlik uchun fotomodellar katalogini tuzadigan bo'lsak, vaziyat keskin o'zgaradi. Moda modelini tasvirlash uchun biz uchun balandlik, ko'z rangi va soch rangi juda muhim, ammo TIN raqami kerak emas. Shuning uchun sinfda biz , , o'zgaruvchilarni yaratamiz . String name
int age
int socialInsuranceNumber
int taxNumber
Model
String height
String hair
String eyes
3-tamoyil: Inkapsulyatsiya
Biz bunga allaqachon duch kelganmiz. Java-da inkapsulyatsiya ma'lumotlarga kirish va uni o'zgartirish imkoniyatini cheklashni anglatadi. Ko'rib turganingizdek, u "kapsula" so'ziga asoslangan. Ushbu "kapsula" da biz o'zimiz uchun muhim ma'lumotlarni yashiramiz, biz hech kimni o'zgartirishni xohlamaymiz. Hayotdan oddiy misol. Sizning ismingiz va familiyangiz bor. Siz bilgan hamma ularni biladi. Ammo ular sizning ismingiz va familiyangizni o'zgartirish huquqiga ega emaslar. Bu jarayon, deyish mumkinki, pasport idorasida "kapsullangan": u erda faqat ismingizni va familiyangizni o'zgartirishingiz mumkin va buni faqat siz qila olasiz. Boshqa "foydalanuvchilar" sizning ismingiz va familiyangizga faqat o'qish huquqiga ega :) Yana bir misol - sizning kvartirangizdagi pul. Ularni xonaning o'rtasida ko'rinadigan joyda qoldirish yaxshi fikr emas. Har qanday "foydalanuvchi" (uyingizga kelgan odam) sizning pulingiz raqamini o'zgartirishi mumkin, ya'ni. ularni oling. Ularni seyfga qo'yish yaxshiroqdir. Faqat siz va faqat maxsus kod bilan kirishingiz mumkin. Siz allaqachon ishlagan inkapsulyatsiyaning aniq misollari kirish modifikatorlari (private
, public
va hokazo) va getter-settersdir. Agar age
sinf maydoni Cat
inkapsullanmagan bo'lsa, har kim yozishi mumkin:
Cat.age = -1000;
Va inkapsulyatsiya mexanizmi bizga maydonni age
sozlash usuli bilan himoya qilish imkonini beradi, unda biz yoshning salbiy raqam bo'lishi mumkin emasligini tekshirishimiz mumkin.
4-tamoyil. Polimorfizm
Polimorfizm - bu bir nechta turlarga bir xil turdagi kabi munosabatda bo'lish qobiliyati. Bunday holda, ob'ektlarning xatti-harakati ular tegishli bo'lgan turga qarab farqlanadi. Biroz murakkab tuyuladimi? Keling, buni hozir aniqlaylik. Keling, eng oddiy misol - hayvonlarni olaylik.Animal
Keling, bitta usul bilan sinf yarataylik - voice()
, va uning ikkita avlodi - Cat
va Dog
.
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
public class Dog extends Animal {
@Override
public void voice() {
System.out.println("Bow-wow!");
}
}
public class Cat extends Animal {
@Override
public void voice() {
System.out.println("Meow!");
}
}
Animal
Keling, havola yaratishga va unga ob'ekt belgilashga harakat qilaylik Dog
.
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.voice();
}
}
Sizningcha, qaysi usul chaqiriladi? Animal.voice()
yoki Dog.voice()
? Sinf usuli quyidagicha nomlanadi Dog
: Woof-woof! Biz mos yozuvlar yaratdik Animal
, lekin ob'ekt o'zini shunday tutadi Dog
. Agar kerak bo'lsa, u mushuk, ot yoki boshqa hayvon kabi o'zini tutishi mumkin. Asosiysi, Animal
ma'lum bir avlod sinfining ob'ektiga umumiy turdagi havolani belgilash. Bu mantiqiy, chunki barcha itlar hayvonlardir. Biz "ob'ektlar qanday turiga qarab o'zini boshqacha tutadi" deganda nimani nazarda tutgan edik. Agar ob'ektni yaratadigan bo'lsak Cat
-
public static void main(String[] args) {
Animal cat = new Cat();
cat.voice();
}
usul voice()
"Miyav!" "Bir nechta turlar bilan bir xil turdagi kabi ishlash qobiliyati" nimani anglatadi? Bu ham ancha oson. Tasavvur qilaylik, biz hayvonlar uchun sartaroshxona yaratmoqdamiz. Bizning sartaroshxonamiz barcha hayvonlarni kesishga qodir bo'lishi kerak, shuning uchun biz kesadigan hayvon shear()
parametri bilan usulni ("kesish") yaratamiz.Animal
public class AnimalBarbershop {
public void shear(Animal animal) {
System.out.println("The haircut is ready!");
}
}
shear
Va endi biz ob'ektlarni ham Cat
, ob'ektlarni ham usulga o'tkazishimiz mumkin Dog
!
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
AnimalBarbershop barbershop = new AnimalBarbershop();
barbershop.shear(cat);
barbershop.shear(dog);
}
Mana yaqqol misol: sinf tiplar bilan xuddi bir turdagi kabi AnimalBarbershop
ishlaydi . Shu bilan birga, ular turli xil xatti-harakatlarga ega: ular o'z ovozlarini boshqacha ishlatishadi. Cat
Dog
Cat
Dog
GO TO FULL VERSION