Ce face new
new face trei lucruri: alocă memorie pentru un obiect nou, pune valorile implicite în câmpuri (0, false, null) și apelează constructorul cu argumentele date. Rezultatul este o referință pe care o păstrezi într-o variabilă.
Pentru array-uri, new int[5] creează un tablou cu 5 elemente egale cu 0, iar new String[] {"a", "b"} unul deja completat. Fiecare new produce un obiect distinct, chiar dacă argumentele sunt identice.
Nu există delete în Java. Când niciun cod nu mai are o referință către obiect, colectorul de gunoi (garbage collector) eliberează memoria automat. Pentru unele tipuri există metode „fabrică” care folosesc new în interior: List.of(...), LocalDate.of(...).
Ce returnează
O referință către obiectul (sau array-ul) nou creat. new nu returnează niciodată null.
Exemple
Exemplul 1: Obiecte și array-uri create cu new
Constructorul primește datele în paranteze. Array-ul nou are elementele inițializate cu 0, iar cel cu acolade are deja valorile.
import java.util.ArrayList;
class Carte {
String titlu;
String autor;
Carte(String titlu, String autor) {
this.titlu = titlu;
this.autor = autor;
}
}
public class Main {
public static void main(String[] args) {
Carte c = new Carte("Amintiri din copilărie", "Ion Creangă");
System.out.println(c.titlu + " de " + c.autor);
int[] note = new int[4];
note[0] = 10;
System.out.println("note: " + note[0] + " " + note[1] + " " + note[2] + " " + note[3]);
String[] orase = new String[] {"Iași", "Cluj", "Brașov"};
System.out.println("orașe: " + orase.length);
ArrayList<String> lista = new ArrayList<>();
lista.add("Suceava");
System.out.println("listă: " + lista);
}
}
Rezultat
Amintiri din copilărie de Ion Creangă
note: 10 0 0 0
orașe: 3
listă: [Suceava]
Exemplul 2: Fiecare new dă un obiect distinct
Două apeluri new cu aceleași date creează două obiecte diferite: == dă false. Un contor static arată de câte ori a rulat constructorul.
class Bilet {
static int create = 0;
String traseu;
Bilet(String traseu) {
this.traseu = traseu;
create++;
}
}
public class Main {
public static void main(String[] args) {
Bilet a = new Bilet("Iași - București");
Bilet b = new Bilet("Iași - București");
System.out.println("a == b? " + (a == b));
System.out.println("același traseu? " + a.traseu.equals(b.traseu));
for (int i = 0; i < 3; i++) {
new Bilet("Cluj - Oradea"); // obiect creat și abandonat imediat
}
System.out.println("bilete create: " + Bilet.create);
}
}
Rezultat
a == b? false
același traseu? true
bilete create: 5
Greșeli frecvente
- Uiți
newla un array:int[] a; a[0] = 1;nu compilează (variable a might not have been initialized). - Creezi un array de obiecte și crezi că obiectele există:
new Carte[3]conține treinull; fiecare element trebuie construit separat. - Scrii
newpentru o interfață sau o clasă abstractă (new List<String>()):is abstract; cannot be instantiated. Folosește o clasă concretă, de exemplunew ArrayList<>().
Comenzi înrudite
Constructori: Constructorul are numele clasei, nu are tip returnat și pregătește obiectul nou; o clasă poate avea mai mulți constructori.Clase și obiecte (class): O clasă (cuvântul cheie class) descrie un tip nou: câmpuri pentru date și metode pentru comportament; obiectele sunt instanțele ei.Array-uri: Un array păstrează un număr fix de elemente de același tip, accesate prin indice de la 0 la length – 1.Clase interne și anonime: O clasă poate fi declarată în altă clasă (statică sau interioară), într-o metodă (locală) sau direct la folosire, fără nume (anonimă).