new în Java

new creează un obiect nou (sau un array) în memorie, apelează constructorul și returnează referința către el.

Sintaxă
Clasa ref = new Clasa(argumente);
int[] numere = new int[5];
String[] orase = new String[] {"Iași", "Cluj"};

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 new la 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 trei null; fiecare element trebuie construit separat.
  • Scrii new pentru o interfață sau o clasă abstractă (new List<String>()): is abstract; cannot be instantiated. Folosește o clasă concretă, de exemplu new 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ă).