1. Обекти

Всичко в Java е обект.

По-точно, има много малко неща в Java, които не са обекти. Например примитивни типове. Но това е доста рядко изключение от правилото.

И така, Howво е обект?

Обектът е обект, който групира данни заедно с методи, които обработват данните . Когато казваме „данни“, имаме предвид променливи, разбира се.

Променливите на даден обект се наричат ​​негови „данни“ or „състояние“.

Казват, че методите на даден обект са неговото "поведение". Обичайно е да се променя състоянието на обект (променливи) само с помощта на методите на този обект. Директната промяна на променливите на обект (без използване на неговите методи) се счита за лоша форма.

Всеки обект , Howто и всяка променлива, има тип . Този тип се определя веднъж при създаването на обекта и не може да бъде променян в бъдеще. Типът на обекта е неговият клас.

Всеки обект има собствено копие на променливи (полета). Ако в клас е декларирана нестатична int a променлива и вашата програма създаде 10 обекта от този клас, тогава всеки обект ще има своя собствена int a променлива.

Взаимодействие с обект

Най-удобният начин за работа с обект е да съхраните препратка към него в променлива и след това да извикате методи на тази променлива. Това ще ви изглежда познато:

variable.method()

Къде variableе променлива, която съхранява препратка към обект и methodе метод от този клас.

Ако искате да се обърнете към поле (променлива) на обект, тогава трябва също да използвате оператора точка :

variable.field

Къде variableе променлива, която съхранява препратка към обект и fieldе променлива на екземпляр (поле).


2. newоператор

За да създадете обект от определен клас, трябва да използвате newоператора. Като цяло, ето How изглежда създаването на обект:

Class variable = new Class(arguments);

Къде Classе името на класа на variableпроменливата, Howто и името на класа на обекта, който ще бъде създаден. И variable е променлива, която съхранява препратка към създадения обект. И argumentsе контейнер за разделен със запетаи списък с аргументи, предадени на конструктора.

Конкретният списък от аргументи, които могат да бъдат предадени, се решава от програмистите, които пишат класа.

Създавали сте обекти преди и дори сте използвали тази конкретна конструкция. Не си забравил, надявам се?

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

Scanner console— това създава consoleпроменлива, чийто тип е Scanner. — това създава нов обект. И операторът за присвояване задава променливата равна на препратка към новосъздадения обект.new Scanner(System.in)Scannerconsole

Във втория ред извикваме nextInt()метода на Scannerобекта, като използваме consoleпроменливата, която съхранява препратка към Scannerобекта.

Примери за създаване на обект:

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

Създадените обекти се наричат ​​обекти на класа or екземпляри на класа , докато класът се нарича клас на обекта . Например, sпроменливата съхранява препратка към екземпляр на Stringкласа.



3. Представяне на часовете

Мисля, че вече видяхте колко удобно е да използвате класове, написани от други програмисти. Но Howво ще кажете за писането на вашите собствени класове?

Как да разберете кога и къде имате нужда от собствен клас и How да си направите такъв?

Програмистите обикновено създават свои собствени класове, когато искат да въведат нов обект в програмата. Звучи ли объркващо? Тогава ще се опитам да обясня, но ще започна отдалече.

Група от данни

Малко опростявайки, можем да кажем, че обектът в 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("Color of (" + x[i] + ", " + 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, color. Ако такъв тип не съществува в Java, можете да го създадете сами.

За да направим това, ще напишем code за Pointклас:

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

Сега codeът по-горе може да бъде пренаписан като:

class Solution
{
   public static void printPoints(Point[] points)
   {
     for (int i = 0; i < points.length; i++)
       System.out.println("Color of (" + points[i].x + ", " + point[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("Color of (" + x + ", " + 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. Променливи срещу неизменни обекти

Имало едно време изучавахме константи в Java и стигнахме до заключение, което не е много утешително. Константите ви позволяват да защитите променливите от промяна, но те не могат да предотвратят промени в обектите, към които се отнасят.

За да реши този проблем, Java излезе с постоянни обекти. Или, Howто по-често се наричат, неизменни обекти.

Между другото, вече знаете такъв клас, чиито обекти не могат да бъдат променяни: String. Един Stringобект остава завинаги непроменен след създаването си. И How създателите на Java са постигнали това?

Първо, всички променливи на Stringкласа са скрити, т.е. декларирани private.

Второ, не можете да наследите Stringкласа: неговата декларация за клас включва finalмодификатора.

Трето, и най-интересното, всички методи на Stringкласа, от които на теория бихте очаквали да променят съществуващия обект, всъщност не го променят, а instead of това връщат нов.

Например, toUpperCase()методът прави всички букви в низа главни. Но instead of да промени обекта, на който се извиква методът, той връща нов Stringобект, състоящ се от главни букви:

String text = "This is a very important message";
String message = text.toUpperCase();

Ето Howво ще бъде в паметта след изпълнение на този code:

Променливи срещу неизменни обекти

Така че не се колеbyteе да предадете своите низове на всеки метод: никой няма да ги промени.