Объекты в Java

All lectures for TG purposes
Сатҳи , Дарс
дастрас

1. Объекты

Ҳама чиз дар Java объектист.

Рости гап, чизҳое ки дар Java объект нестанд, хеле кам аст. Масалан, типҳои примитив. Лекин ин бештар истисно аст, на қоида.

Объект чист?

Объект — ин маълумот ва методҳо, ки бо ҳамдигар ҷамъ шудаанд, ки ин маълумотро коркард кунанд. Вақте ки мо дар бораи маълумот гап мезанем, албатта манзур тағйирёбандаҳо ҳастанд.

Дар бораи тағйирёбандаҳои объект гап мезананд, ки ин «маълумоти объект» ё «ҳолати объект» мебошанд.

Дар бораи методҳои объект мегӯянд: ин «рафтори объект»-аст. Ҳолати объект (тағйирёбандаҳои объект) одатан бо истифодаи методҳои ҳамон объект тағйир дода мешавад. Тағйир додани тағйирёбандаҳои объект бевосита (на бо методҳои объект) одатан нодуруста ҳисоб мешавад.

Ҳар объект, инчунин ҳар тағйирёбанда, тип дорад. Ин тип як маротиба ҳангоми сохтани объект муайян карда мешавад ва онро минбаъд тағйир додан мумкин нест. Типи объект классаш ҳисобида мешавад.

Ҳар объект нусхаи худи тағйирёбандаҳои классро (тағйирёбандаи класс) дорад. Агар дар класс тағйирёбандаи нестатикӣ int a эълон шуда бошад ва барномаи шуморо ҳангоми иҷро 10 объект аз ин класс созад, ҳоло дар ҳар объект як тағйирёбандаи int a ҳаст.

Муошират бо объект

Усули хеле осони кор бо объект — ин нигоҳ доштани референс ба объект дар тағйирёбанда ва баъд аз он методҳоро ба ин тағйирёбанда даъват кардан аст. Ин чунин менамояд ки шумо аллакай онро медонед:

переменная.метод()

Ки дар он переменная — ин тағйирёбанда аст, ки дар худ референс ба объектро нигоҳ медорад ва метод — ин методи класс аст.

Агар шумо хоҳед ба майдони (тағйирёбандаи) объект муроҷиат кунед, пас низ бояд оператор нуқта-ро истифода кунед:

переменная.поле

Ки дар он переменная — ин тағйирёбанда аст, ки дар худ референс ба объектро нигоҳ медорад ва поле — ин тағйирёбандаи класс (майдони объект) аст.


2. Оператор new

Барои сохтани объект аз класс муайян, ба шумо лозим аст оператори new-ро истифода баред. Ин чӣ гуна намуд дорад сохтани объект дар ҳолати умумӣ:

Класс переменная = new Класс(параметры);

Дар он Класс — ин номи класс аст барои эълони переменной ва номи класс аст барои объекти сохташаванда. Переменная — ин тағйирёбанда аст, ки дар он референс ба объекти сохташуда нигоҳ дошта мешавад. А параметры — ин параметрҳои методи сохтани объект мебошанд.

Чӣ гуна параметрҳо метавонад дошта бошад объект, инро барномасозоне ҳал мекунанд, ки класс объекти мазкурро менависанд.

Шумо аллакай объектиҳоро сохта будед ва ҳатто маҳз ин конструксияро истифода бурда будед. Умедворам, ки онро фаромӯш накардаед?

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

Scanner console — ин эҷоди тағйирёбандаи console типи Scanner мебошад. new Scanner(System.in) — ин эҷоди объекти типи Scanner мебошад. Хуб, оператори таъинкунӣ ба тағйирёбандаи console ссылкаро ба объекти нави сохташуда мегузорад.

Дар сатри дуюм мо методи nextInt()-ро аз объекти Scanner бо ёрии тағйирёбандаи console, ки дар худ ссылкаро ба объекти типи Scanner нигоҳ медорад, даъват мекунем.

Мисолҳои сохтани объектҳо:

Код Тавсиф
String s = new String("Привет");
Создаёт объект типа String
Scanner console = new Scanner("");
Создаёт объект типа Scanner
int[] data = new int[10];
Создаёт объект типа int[]: контейнер на 10 элементов типа int

Созданные объекты называют объектом класса или экземпляром класса, а класс — классом объекта. Например: переменная s хранит ссылку на экземпляр класса String.



3. Знакомство с классами

Гумон мекунам, шумо аллакай боварӣ ҳосил кардед, ки истифодаи классҳои навиштаи дигар барномасозон хеле қулай аст. Ва чӣ дар бораи навиштани классҳои худи шумо?

Чӣ тавр фаҳмидан мумкин аст, ки кай ва дар куҷо ба шумо класс худи лозим аст ва чӣ гуна онро сохтан мумкин?

Барномасозон одатан классҳои худи худро месозанд, вақте ки мехоҳанд дар барнома як мавҷудияти навро дохил кунанд. Ин хеле фаҳмо наменамояд? Пас кӯшиш мекунам фаҳмонам, лекин аз дур сар мекунам.

Гурӯҳбандии маълумот

Агар каме соддатар карда шавад, гуфта мешавад, ки объект дар Java — ин минтақаи хотира аст, ки тағйирёбандаҳои эълоншудаи классро дар бар мегирад (майдонҳои класс). Ё бо роҳи дигар — тағйирёбандаҳое, ки дар гурӯҳҳо муттаҳид карда шудаанд.

Бигӯем, ки дар барномаи шумо лозим аст координатҳои 100 нуқта ва методро, ки онҳоро ба экран мебарорад, нигоҳ доред. Ин мумкин аст бо истифодаи массивҳо анҷом дода шавад. Масалан, чунин:

class Solution
{
   public static void printPoints(int[] x, int[] y, int[] color)
   {
     for (int i = 0; i < x.length; i++)
       System.out.println("Ранги нуқта 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);
   }
}

Бас онро хеле қулай мебуд, агар мо фавран як тип барои нигоҳ доштани ҳамаи маълумот дар бораи нуқтаҳо доштем: x, y, ранг. Агар дар Java чунин тип вуҷуд надошта бошад, пас онро худатон эҷод кардан мумкин аст.

Барои ин, мо коди сохтани класс Point-ро менависем:

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

Пас коди болоиро метавон дар чунин шакл тағйир дод:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Ранги нуқта 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);
   }
}

Ҳоло биёед методеро илова кунем дар класс Point, ки иттилоот дар бораи объектро мебарорад:

public class Point
{
   public int x;
   public int y;
   public int color;
   public void print()
   {
     System.out.println("Ранги нуқта x=" + x + ", y=" + y + " " + color);
   }
}

Пас класс Solution чунин менамояд:

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);
   }
}

Мо зебо дар дохили нуқта (класс Point) иттилоот дар бораи координатҳои он ва метод, ки ҳолати объект-нуқтаро ба экран мебарорад, пушидем.

Классҳо — ин ҷавоб ба идоракунии мураккабии барнома мебошанд. Барномаи бузург соддатар мешавад, вақте ки онро ба бисёр классҳои хурд тақсим мекунанд.


4. Mutable vs Immutable объекты

Вақте-то дар замон мо бо шумо константаҳо дар Java-ро омӯхтем ва ба хулосаи на он қадар умедбахш расидем. Константаҳо имкон намедиҳанд тағйирёбандаҳоро аз тағйирот ҳифз кунанд, аммо наметавонанд аз тағйирот объектҳои ин тағйирёбандаҳоро ҳифз кунанд.

Дар ҷавоби ин мушкилот дар Java объектиҳо-константаҳо фикр карда шуданд. Ё, чӣ тавр ки онҳоро боз мегӯянд, immutable-объектиҳо — объектҳо, ки тағйирнопазиранд.

Ба ростӣ, шумо ҳатто як классро медонед, ки объектиҳояшро тағйир додан мумкин нест — String. Объекти класса String ҳама вақт пас аз сохтани он тағйирнопазир мемонад. Ва чӣ тавр инро таҳиягарони Java ба ин ноил шуданд?

Аввалан, ҳамаи тағйирёбандаҳои класса String пинҳонанд – бо private эълон шудаанд.

Дуюман, аз класса String мерос гирифтан мумкин нест: он модификатори final дар эълони класси дорад.

Сеюм, ки махсусан ҷолиб аст, ҳамаи методҳои класса String, ки бояд объектро тағйир диҳанд, объекти мавҷударо тағйир намедиҳанд, балки объект навро бармегардонанд.

Масалан, методы toUpperCase() ҳамаи ҳарфҳои сатрро ба ҳарфҳои калон (сарҳадӣ) месозад. Аммо ба ҷойи тағйир додани объект, ки дар он даъват шудааст, ин метод объект навро типи String, ки аз ҳарфҳои калон иборат аст, бармегардонад:

String text = "Ин хабар хеле муҳим аст";
String message = text.toUpperCase();

Ҳоло пас аз иҷрои ин код дар хотира чунин хоҳад монд:

Mutable vs Immutable объекты

Ҳамин тавр, ҷуръат кунед, сатри худро ба ҳар як метод партоед: ҳеҷ кас онро тағйир намедиҳад.


Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION