Java'da Ob'ektlar

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Ob'ektlar

Java'da hamma narsa ob'ektdir.

To'g'rirog'i, Java'da ob'ekt bo'lmagan juda kam narsa bor. Masalan, primitiv turlar. Ammo bu ko'proq istisno hisoblanadi, qoidaga emas.

Xo'sh, ob'ekt nimadan iborat?

Ob'ekt — bu birlashtirilgan ma'lumotlar va bu ma'lumotlarni qayta ishlash uchun metodlar. Ma'lumotlar haqida gapirganda, bu albatta o'zgaruvchilarni nazarda tutadi.

Ob'ektning o'zgaruvchilari haqida shunday deyishadi: bu "ob'ektning ma'lumotlari" yoki "ob'ektning holati".

Ob'ekt metodlari haqida esa shunday deyishadi: bu "ob'ektning xulq-atvori". Ob'ektning holati (ob'ekt o'zgaruvchilari) faqat shu ob'ektning metodlari orqali o'zgartirilishi qabul qilingan. Ob'ekt o'zgaruvchilarini to'g'ridan-to'g'ri (ob'ekt metodlari orqali emas) o'zgartirish yomon odat hisoblanadi.

Har bir ob'ektda, xuddi har bir o'zgaruvchida bo'lgani kabi, tur mavjud. Bu tur ob'ektni yaratishda bir marta aniqlanadi va keyinchalik o'zgartirilishi mumkin emas. Ob'ekt turi uning sinfi hisoblanadi.

Har bir ob'ektda sinf o'zgaruvchilarining o'ziga xos nusxasi (sinf maydonlari) mavjud. Agar sinfda int a nomli statik bo'lmagan o'zgaruvchi e'lon qilingan bo'lsa va dasturingiz ish paytida ushbu sinfning 10 ta ob'ektini yaratgan bo'lsa, endi har bir ob'ektda o'ziga xos int a o'zgaruvchisi mavjud.

Ob'ekt bilan ishlash

Ob'ekt bilan ishlashning eng qulay usuli — ob'ektga havolani o'zgaruvchiga saqlash, va keyin shu o'zgaruvchida metodlarni chaqirish. Bu sizga tanish bo'lib ko'rinadi:

o'zgaruvchi.metod()

Bu yerda o'zgaruvchi — ob'ektga havolani saqlaydigan o'zgaruvchi, metod esa ob'ekt sinfining metodidir.

Agar siz ob'ekt maydoniga (o'zgaruvchisiga) murojaat qilmoqchi bo'lsangiz, nuqta operatorini ishlatishingiz kerak:

o'zgaruvchi.maydon

Bu yerda o'zgaruvchi — ob'ektga havolani saqlaydigan o'zgaruvchi, maydon esa sinf maydoni (ob'ekt maydoni) hisoblanadi.


2. new operatori

Aniq sinfda ob'ekt yaratish uchun, new operatoridan foydalanishingiz kerak. Bu yerda ob'ekt yaratish qanday ko'rinishga ega:

Sinf o'zgaruvchi = new Sinf(parametrlar);

Bu yerda Sinf — bu o'zgaruvchi e'lon qilish uchun sinf nomi va yaratilayotgan sinf ob'ektining nomi. O'zgaruvchi — yaratilgan ob'ektga havolani saqlaydigan o'zgaruvchi. Va parametrlar — bu ob'ektni yaratish metodining parametrlaridir.

Ob'ektning qaysi parametrlariga ega bo'lishini ob'ekt sinfini yozuvchi dasturchilar hal qilishadi.

Siz ob'ektlar yaratgan edingiz, va hatto ushbu konstruksiya bilan foydalangan edingiz. Umid qilamanki, unutmadingiz?

Scanner console = new Scanner(System.in);
int x = console.nextInt();

Scanner console — bu console o'zgaruvchisining Scanner turini yaratadi. new Scanner(System.in) — Scanner turidagi ob'ektni yaratadi. Xo'sh, tayinlash operatori console o'zgaruvchisiga yangi yaratilgan ob'ektga havolani joylashtiradi.

Ikkinchi qatorda biz Scanner ob'ektidan nextInt() metodini console o'zgaruvchisi orqali chaqiramiz, u Scanner turidagi ob'ektga havolani saqlaydi.

Ob'ekt yaratish misollari:

Kod Tavsif
String s = new String("Salom");
String turidagi ob'ektni yaratadi
Scanner console = new Scanner("");
Scanner turidagi ob'ektni yaratadi
int[] data = new int[10];
int[] turidagi ob'ektni yaratadi: 10 ta int turidagi elementlardan iborat konteyner

Yaratilgan ob'ektlar ob'ekt sinfi yoki sinf nusxasi deb ataladi, va sinf — ob'ekt sinfi. Masalan: s o'zgaruvchisi String sinfi nusxasiga havolani saqlaydi.



3. Sinflar bilan tanishish

O'ylaymanki, boshqa dasturchilar tomonidan yozilgan sinflardan foydalanish juda qulay ekanligiga allaqachon ishonchingiz komil. O'z sinflaringizni yozishga nima dersiz?

Qachon va qaerda o'z sinfingiz kerakligini va uni qanday yaratishingiz mumkinligini qanday tushunasiz?

Dasturchilar odatda yangi obyekt tushunchasini dasturda joriy qilishlari kerak bo'lganda o'z sinflarini yaratadilar. Bu tushunarsiz ko'rinishi mumkinmi? Shunda, izohlab berishga urinaman, lekin uzoqdan boshlayman.

Ma'lumotlarni guruhlash

Agar bir oz soddalashtirsak, Java'da ob'ekt — bu sinfda e'lon qilingan o'zgaruvchilarni (sinf maydonlari) o'z ichiga olgan xotira maydoni. Yoki boshqacha qilib aytganda, guruhlangan o'zgaruvchilar.

Faraz qilaylik, dasturingizda 100 nuqtaning koordinatalarini saqlash va ularni ekranga chiqarish uchun metod kerak. Buni massivlar yordamida amalga oshirish mumkin. Masalan, shunday:

class Solution
{
   public static void printPoints(int[] x, int[] y, int[] color)
   {
     for (int i = 0; i < x.length; i++)
       System.out.println("Nuqta rangi x=" + x[i] + ", y=" + y[i] + " " + color[i]);
   }

   public static void main(String[] args)
   {
     int[] x = new int[100];
     int[] y = new int[100];
     int[] color = new int[100];
     printPoints(x, y, color);
   }
}

Ko'p osonroq bo'lar edi, agar nuqtalar haqida barcha ma'lumotlarni saqlash uchun bizda darhol tur mavjud bo'lsa: x, y, rang. Java'da bunday tur mavjud bo'lmasa, uni o'zingiz yaratishingiz mumkin.

Buning uchun Point sinfini yaratish kodini yozamiz:

public class Point
{
   public int x;
   public int y;
   public int color;
}

Shunda yuqoridagi kodni quyidagicha qayta yozish mumkin:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Nuqta rangi x=" + points[i].x + ", y=" + points[i].y + " " + points[i].color);
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Endi Point sinfga metod qo'shamiz, u ob'ekt haqidagi ma'lumotlarni chiqarib beradi:

public class Point
{
   public int x;
   public int y;
   public int color;
   public void print()
   {
     System.out.println("Nuqta rangi x=" + x + ", y=" + y + " " + color);
   }
}

Shunda Solution sinfi quyidagicha ko'rinish oladi:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       points[i].print();
   }

   public static void main(String[] args)
   {
     Point[] data = new Point[100];
     for (int i = 0; i < data.length; i++)
       data[i] = new Point();
     printPoints(data);
   }
}

Biz nuqta ichidagi ma'lumotlarni (x, y, rang) va ob'ektning holatni ekranga chiqarish metodini chiroyli tarzda yashirdik (klass Point).

Sinflar — bu dasturning murakkabligini boshqarishga javobdir. Katta dasturni ko'plab kichik sinflarga bo'ladilar, shunda u yanada sodda bo'ladi.


4. Mutable vs Immutable ob'ektlar

Bir vaqtlar biz Java'da konstantlarni o'rganganimizda, juda taskin beruvchi emas edi. Konstantlar o'zgaruvchilarni o'zgarishdan himoya qiladi, lekin bu o'zgaruvchilar ishora qilayotgan ob'ektlarni o'zgartirishdan himoya qila olmaydi.

Ushbu muammo javobida Java'da konstanta-ob'ektlar ixtiro qilindi. Yoki ularning boshqacha nomi bilan, immutable-objects — o'zgarmas ob'ektlar.

Aytgancha, siz shunday sinfni bilasiz, uning ob'ektlari o'zgartirilishi mumkin emas — String. String sinfi ob'ekti yaratilgandan so'ng o'zgarmaydi. Va Java ishlab chiquvchilari bunga qanday erishdilar?

Birinchidan, String sinfining barcha o'zgaruvchilari yashirin – private deb e'lon qilingan.

Ikkinchidan, String sinfidan meros olish mumkin emas: u final modifikatori bilan sinf e'lon qilishda mavjud.

Uchinchidan, qiziqarli tomoni, String sinfining barcha metodlari, ular ob'ektni o'zgartirish kerak edi, mavjud ob'ektni o'zgartirish emas, balki yangi qaytaradi.

Masalan, toUpperCase() metodi satrning barcha harflarini katta harflarga aylantiradi. Lekin, u chaqirilgan ob'ektni o'zgartirish o'rniga, ushbu metod katta harflardan iborat yangi String ob'ektini qaytaradi:

String text = "Bu juda muhim xabar";
String message = text.toUpperCase();

Ushbu kodni ishlatgandan so'ng xotirada mana qanday ko'rinishda bo'ladi:

Mutable vs Immutable ob'ektlar

Shunday qilib, sizning satrlaringizni har qanday metodlarga bemalol uzatishingiz mumkin: hech kim ularni o'zgartirmaydi.


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION