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 variable
este o variabilă care stochează o referință la un obiect și method
este 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 variable
este o variabilă care stochează o referință la un obiect și field
este o variabilă de instanță (câmp).
2. new
operator
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 Class
este numele clasei variabilei, variable
precum și numele clasei obiectului care urmează să fie creat. Și variable
este o variabilă care stochează o referință la obiectul creat. Și arguments
este 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 console
variabilă 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)
Scanner
console
În a doua linie, apelăm nextInt()
metoda pe Scanner
obiect, folosind console
variabila, care stochează o referință la Scanner
obiect.
Exemple de creare de obiecte:
Cod | Descriere |
---|---|
|
Creați un String obiect |
|
Creați un Scanner obiect |
|
Creați un int[] : un container de 10 int elemente |
Obiectele create sunt numite obiecte ale clasei sau instanțe ale clasei , în timp ce clasa este numită clasa obiectului . De exemplu, s
variabila stochează o referință la o instanță a String
clasei.
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 100
punctelor ș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 Point
clasă:
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 Point
clasă 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 Solution
clasa 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 Point
clasei, î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 String
obiect 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 String
sunt ascunse, adică declarate private
.
În al doilea rând, nu puteți moșteni String
clasa: 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 String
obiect 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:
Așa că nu ezitați să vă treceți sforile la orice metodă: nimeni nu le va schimba.
GO TO FULL VERSION