1. Obiecte

Totul în Java este un obiect.

Mai precis, există foarte puține lucruri în Java care să nu fie obiecte. De exemplu, tipurile primitive. Dar aceasta este o excepție destul de rară de la regulă.

Deci, ce este un obiect?

Un obiect este o entitate care grupează datele împreună cu metode care procesează datele . Când spunem „date”, ne referim la variabile, desigur.

Variabilele unui obiect sunt numite „date” sau „stare”.

Se spune că metodele unui obiect sunt „comportamentul” acestuia. Se obișnuiește să se schimbe starea (variabilele) unui obiect numai folosind metodele acelui obiect. Modificarea directă a variabilelor unui obiect (fără utilizarea metodelor acestuia) este considerată o formă proastă.

Fiecare obiect , precum și fiecare variabilă, are un tip . Acest tip este determinat o dată când obiectul este creat și nu poate fi schimbat în viitor. Tipul unui obiect este clasa sa.

Fiecare obiect are propria copie a variabilelor de instanță (câmpuri). Dacă o variabilă int non-statică este declarată într-o clasă, iar programul dvs. creează 10 obiecte din acea clasă, atunci fiecare obiect va avea propria sa variabilă int.

Interacțiunea cu un obiect

Cel mai convenabil mod de a lucra cu un obiect este de a stoca o referință la acesta într-o variabilă și apoi de a apela metode pe acea variabilă. Acest lucru vă va părea familiar:

variable.method()

Unde variableeste o variabilă care stochează o referință la un obiect și methodeste o metodă a acelei clase.

Dacă doriți să vă referiți la un câmp (variabilă) al unui obiect, atunci trebuie să utilizați și operatorul punct :

variable.field

Unde variableeste o variabilă care stochează o referință la un obiect și fieldeste o variabilă de instanță (câmp).


2. newoperator

Pentru a crea un obiect dintr-o anumită clasă, trebuie să utilizați operatorul new. În general, iată cum arată crearea unui obiect:

Class variable = new Class(arguments);

Unde Classeste numele clasei variabilei, variableprecum și numele clasei obiectului care urmează să fie creat. Și variable este o variabilă care stochează o referință la obiectul creat. Și argumentseste un substituent pentru o listă de argumente delimitată prin virgulă transmisă constructorului.

Lista specifică de argumente care pot fi transmise este decisă de programatorii care scriu clasa.

Ați creat obiecte înainte și chiar ați folosit această construcție specială. Nu ai uitat, sper?

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

Scanner console— aceasta creează o consolevariabilă al cărei tip este Scanner. — aceasta creează un nou obiect. Și operatorul de atribuire setează variabila egală cu o referință la obiectul nou creat.new Scanner(System.in)Scannerconsole

În a doua linie, apelăm nextInt()metoda pe Scannerobiect, folosind consolevariabila, care stochează o referință la Scannerobiect.

Exemple de creare de obiecte:

Cod Descriere
String s = new String("Hello");
Creați un Stringobiect
Scanner console = new Scanner("");
Creați un Scannerobiect
int[] data = new int[10];
Creați un int[]: un container de 10 intelemente

Obiectele create sunt numite obiecte ale clasei sau instanțe ale clasei , în timp ce clasa este numită clasa obiectului . De exemplu, svariabila stochează o referință la o instanță a Stringclasei.



3. Introducerea cursurilor

Cred că ați văzut deja cât de convenabil este să folosiți clase scrise de alți programatori. Dar ce zici de a-ți scrie propriile clase?

De unde știi când și unde ai nevoie de propria clasă și cum să faci una?

De obicei, programatorii își creează propriile clase atunci când doresc să aducă o nouă entitate în program. Sună confuz? Apoi voi încerca să explic, dar o să încep de departe.

Grup de date

Simplificând puțin, putem spune că un obiect în Java este un bloc de memorie care conține variabilele declarate într-o clasă (câmpuri de instanță). Sau, cu alte cuvinte, variabile combinate într-un grup.

Să presupunem că programul dvs. trebuie să stocheze coordonatele 100punctelor și are nevoie de o metodă pentru a le afișa pe ecran. Acest lucru se poate face folosind matrice. De exemplu, așa:

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

Ar fi mult mai convenabil dacă am avea un singur tip pentru stocarea tuturor informațiilor despre un punct: x, y, color. Dacă un astfel de tip nu există în Java, îl puteți crea singur.

Pentru a face acest lucru, vom scrie cod pentru o Pointclasă:

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

Acum codul de mai sus poate fi rescris ca:

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

Acum să adăugăm o metodă la Pointclasă care va afișa informații despre obiect:

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

Acum Solutionclasa arată astfel:

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

Am ascuns cu pricepere coordonatele punctului și informațiile de culoare în interiorul Pointclasei, împreună cu metoda care afișează starea punctului.

Clasele sunt o modalitate de a gestiona complexitatea programului. Un program mare devine mai puțin complex atunci când este împărțit în mai multe clase mici.


4. Obiecte mutabile vs imuabile

Cândva, am studiat constantele în Java și am ajuns la o concluzie care nu este foarte reconfortantă. Constantele vă permit să protejați variabilele împotriva modificării, dar nu pot împiedica modificări ale obiectelor la care se referă.

Pentru a rezolva această problemă, Java a venit cu obiecte constante. Sau, cum sunt numite mai frecvent, obiecte imuabile.

Apropo, știți deja o astfel de clasă, ale cărei obiecte nu pot fi modificate: String. Un Stringobiect rămâne pentru totdeauna neschimbat după ce este creat. Și cum au reușit creatorii lui Java acest lucru?

În primul rând, toate variabilele clasei Stringsunt ascunse, adică declarate private.

În al doilea rând, nu puteți moșteni Stringclasa: declarația sa de clasă include modificatorul final.

În al treilea rând, și cel mai interesant, toate metodele clasei String, la care, în teorie, te-ai aștepta să schimbe obiectul existent, nu îl schimbă de fapt, ci în schimb returnează unul nou.

De exemplu, toUpperCase()metoda face toate literele din șir cu majuscule. Dar, în loc să schimbe obiectul pe care este apelată metoda, returnează un nou Stringobiect format din majuscule:

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

Iată ce va fi în memorie după executarea acestui cod:

Obiecte mutabile vs imuabile

Așa că nu ezitați să vă treceți sforile la orice metodă: nimeni nu le va schimba.