Constructors
wCând creezi un obiect nou, Java apelează o metodă specială numită constructor. Este codul care rulează la naștere, pregătind obiectul înainte ca cineva să-l poată folosi
Gândește-te așa: când Tommy Vercetti ajunge în Vice City, începe cu un nume, o reputație și poate ceva bani. Constructorul este cel care îi dă acele statistici de start
Primul tău Constructor
class Jucator {
String nume;
int scor;
Jucator(String nume, int scor) {
this.nume = nume;
this.scor = scor;
}
}
public class Main {
public static void main(String[] args) {
Jucator p = new Jucator("Tommy", 100);
System.out.println(p.nume);
System.out.println(p.scor);
}
}
Ieșire
Tommy
100
Câteva lucruri de observat:
- Constructorul are același nume ca și clasa:
Jucator - Nu are niciun tip de retur. Nici
void, niciint, literalmente nimic înainte de nume. Așa știe Java că este un constructor și nu o metodă obișnuită - Folosim
new Jucator("Tommy", 100)ca să creăm obiectul și să apelăm constructorul în același timp
Cuvântul cheie this
Probabil ai remarcat this.nume = nume și te-ai întrebat ce se întâmplă. Iată cum stă treaba:
nume(fărăthis) se referă la parametru, valoarea pasatăthis.numese referă la câmpul de pe obiectul însuși
E ca și cum ai spune „numele acestui obiect este egal cu numele pe care mi l-ai dat"
class Jucator {
String nume;
int scor;
Jucator(String nume, int scor) {
this.nume = nume; // numele obiectului = parametrul nume
this.scor = scor; // scorul obiectului = parametrul scor
}
}
public class Main {
public static void main(String[] args) {
Jucator p = new Jucator("Tommy", 100);
System.out.println(p.nume + " " + p.scor);
}
}
Dacă parametrul ar avea un nume diferit, nici nu ai avea nevoie de this:
class Jucator {
String nume;
int scor;
Jucator(String n, int s) {
nume = n; // nicio confuzie, deci "this" e optional
scor = s;
}
}
public class Main {
public static void main(String[] args) {
Jucator p = new Jucator("Lance", 80);
System.out.println(p.nume + " " + p.scor);
}
}
Dar folosirea lui this este considerată stil bun: îți face intenția clară
Constructorul Implicit
Dacă scrii o clasă fără niciun constructor, Java îți oferă unul gratuit, fără parametri:
class Inamic {
String tip;
int viata;
}
public class Main {
public static void main(String[] args) {
Inamic e = new Inamic(); // merge! Java a facut un constructor implicit
System.out.println(e.tip); // null (String-urile pornesc implicit de la null)
System.out.println(e.viata); // 0 (int-urile pornesc implicit de la 0)
}
}
Dar în momentul în care scrii tu însuți orice constructor, Java nu-ți mai oferă unul gratuit:
class Inamic {
String tip;
int viata;
Inamic(String tip) {
this.tip = tip;
this.viata = 50;
}
}
public class Main {
public static void main(String[] args) {
// Inamic e = new Inamic(); // nu compileaza, nu mai exista constructor fara argumente
Inamic e = new Inamic("Goon"); // asta merge
System.out.println(e.tip);
System.out.println(e.viata);
}
}
Ieșire
Goon
50
Constructori Multipli
Poți avea mai mult de un constructor, atâta timp cât primesc parametri diferiți. Asta se numește supraîncărcare (overloading):
class Arma {
String nume;
int dauna;
Arma(String nume, int dauna) {
this.nume = nume;
this.dauna = dauna;
}
Arma(String nume) {
this.nume = nume;
this.dauna = 10; // dauna implicita
}
}
public class Main {
public static void main(String[] args) {
Arma a1 = new Arma("Katana", 75);
Arma a2 = new Arma("Fists");
System.out.println(a1.nume + " provoaca " + a1.dauna + " daune");
System.out.println(a2.nume + " provoaca " + a2.dauna + " daune");
}
}
Ieșire
Katana provoaca 75 daune
Fists provoaca 10 daune
Misiune: Fișa de Scor a Echipajului
Tommy ține o evidență a echipajului său din Vice City. Fiecare membru este înregistrat cu un nume și un scor: reputația lui pe străzi.
Creează o clasă Jucator care reprezintă un membru al echipajului, cu un câmp pentru nume (String) și unul pentru scor (int). Scrie un constructor care primește ambele valori și le setează folosind this.
În main, stochează mai întâi valorile în variabile locale: nume1 și scor1 pentru primul membru, nume2 și scor2 pentru al doilea. Apoi construiește doi membri pasând acele variabile constructorului și afișează fiecare pe linia lui în formatul Nume are Scor puncte.
Exemplu pentru Tommy Vercetti cu scorul 500 și Lance Vance cu scorul 300
Tommy Vercetti are 500 puncte
Lance Vance are 300 puncte
Exemplu pentru Diaz cu scorul 800 și Cortez cu scorul 650
Diaz are 800 puncte
Cortez are 650 puncte