CyberStars

toString()

Ce se întâmplă când încerci să afișezi un obiect direct?

class Masina {
    String marca;
    int an;

    Masina(String marca, int an) {
        this.marca = marca;
        this.an = an;
    }
}

public class Main {
    public static void main(String[] args) {
        Masina c = new Masina("Infernus", 1986);
        System.out.println(c);
    }
}

Ieșire

Masina@6d06d69c

Asta este... deloc util. Java nu știe cum vrei să fie afișat obiectul tău, așa că îți dă numele clasei și o adresă din memorie. Ca să reparăm asta, suprascriem (override) o metodă specială numită toString()


Suprascrierea lui toString()

Fiecare obiect din Java are o metodă toString() (moștenită de la o clasă de bază numită Object). În mod implicit afișează acea aiureală urâtă. Dar poți să o suprascrii: să scrii propria ta versiune:

class Masina {
    String marca;
    int an;

    Masina(String marca, int an) {
        this.marca = marca;
        this.an = an;
    }

    @Override
    public String toString() {
        return marca + " (" + an + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        Masina c = new Masina("Infernus", 1986);
        System.out.println(c);
    }
}

Ieșire

Infernus (1986)

Acum, când afișezi obiectul, Java apelează toString()-ul tău și folosește orice string întorci


Adnotarea @Override

Acel @Override de deasupra metodei este o adnotare. Îi spune lui Java "înlocuiesc intenționat o metodă din clasa părinte". Este opțional, dar puternic recomandat pentru că:

  • Dacă scrii din greșeală metoda greșit (cum ar fi tostring() cu S mic), Java îți va da o eroare în loc să creeze pe tăcute o metodă nouă care nu face nimic
  • Face codul tău mai clar pentru oricine îl citește
public class Main {
    @Override
    public String toString() {   // Java verifica: are parintele toString()? Da. Bun.
        return "altceva";
    }
}

toString() Este Apelat Automat

Java apelează toString() automat în mai multe situații:

class Arma {
    String nume;
    int daune;

    Arma(String nume, int daune) {
        this.nume = nume;
        this.daune = daune;
    }

    @Override
    public String toString() {
        return nume + " (daune: " + daune + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        Arma w = new Arma("Katana", 75);

        // Toate acestea apeleaza toString() automat:
        System.out.println(w);                    // afisare directa
        System.out.println("Arma: " + w);         // concatenare de string-uri
        String s = "Am primit o " + w;             // construirea unui string
        System.out.println(s);
    }
}

Ieșire

Katana (daune: 75)
Arma: Katana (daune: 75)
Am primit o Katana (daune: 75)

Oricând Java are nevoie să transforme obiectul tău într-un String, apelează toString(). Concatenarea cu + face asta, println() face asta. E peste tot


Un Exemplu Mai Detaliat

Echipa lui Tommy Vercetti are nevoie de reprezentări de string corespunzătoare:

class MembruBanda {
    String nume;
    String rol;
    int respect;

    MembruBanda(String nume, String rol, int respect) {
        this.nume = nume;
        this.rol = rol;
        this.respect = respect;
    }

    @Override
    public String toString() {
        return nume + " - " + rol + " (Respect: " + respect + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        MembruBanda t = new MembruBanda("Tommy Vercetti", "Sef", 100);
        MembruBanda l = new MembruBanda("Lance Vance", "Partener", 60);
        System.out.println(t);
        System.out.println(l);
    }
}

Ieșire

Tommy Vercetti - Sef (Respect: 100)
Lance Vance - Partener (Respect: 60)

Misiune: Garajul lui Tommy

Tommy își ține mașinile într-un garaj și vrea ca fiecare să se afișeze frumos când o tipărește, fără să construiască de mână string-ul de fiecare dată

Creează o clasă Masina cu un câmp marca (String) și unul an (int). Scrie un constructor și suprascrie toString() ca să întoarcă marca, apoi (, anul și ), de exemplu Infernus (1986)

În main, stochează mai întâi valorile în variabile locale: marca1 și an1 pentru prima mașină, marca2 și an2 pentru a doua. Apoi creează două mașini din acele variabile și afișează-le direct cu System.out.println

Exemplu: Infernus din 1986 și Cheetah din 1984

Infernus (1986)
Cheetah (1984)