A toString() metódus

Mindenkinek van egy őse - az összes Java objektumnak az őse az Object nevű osztály. Amikor csináltunk egy Innivalo osztályt, az is mindent megörökölt az Objecttől (pedig nem is kértük rá).

Ha nyomsz egy CTRL+Space-t (autocomplete) mondjuk jack-en, akkor ezt látod:

Nyomokban Object részeket tartalmaz

Ez megmutatja, hogy milyen tulajdonságai és metódusai vannak Jack-nak, és azok honnan is származnak. Világosszürkével látszik, hogy mondjuk a fogyasztottAlkohol az az Ember osztályból jön.

De van pár fura dolog, ami az Object-ből öröklött, és ezek között ott a toString().

No most, ha bármikor olyan helyre kerül egy objektum példány, ahol String kifejezésben van, akkor a Java automatikusan meghívja a toString metódusát, és amit az visszaad, na azt fogja használni.

Mi nem csináltunk semmit, így a "gyári", Objecttől örökölt toString hajtódik végre, és az adja ezeket a vicces Palinka@7852e922 dolgokat:

Jack most feladta, mert szünetre van szüksége!
Jack ezt itta:
  Sor@15db9742
  Sor@6d06d69c
  Palinka@7852e922
Jane ezt itta:
  Sor@15db9742
  Sor@6d06d69c
  Palinka@7852e922

Mit kell tenni? Tanítsuk meg az Italokat kesztyűbe dudálni! Legyen nekik is rendes nevük, mint az Embereknek, és a toString metódusukat csináljuk meg úgy, hogy értelmes nevet adjon vissza!

public class Innivalo {
    double felszolgaltMeret=5; // dl
    double alkoholTartalomSzazalek=4; // %
    // ez az uj
    String nev;


    Innivalo(String nev,double felszolgaltMeret,double alkoholTartalomSzazalek) {
        // ez az uj
        this.nev=nev;
        this.felszolgaltMeret=felszolgaltMeret;
        this.alkoholTartalomSzazalek=alkoholTartalomSzazalek;
    }

    // es ez is uj
    public String toString() {
        return nev;
    }
}

Szóval lett neki egy új tulajdonsága, a nev. Meg csináltunk egy toString-et is, de ez hogyan is fog menni?

Az override

Az override-t tényleg nem fogom lefordítani magyarra, mert lehet belőle "felülbírálás", "áthágás", vagy akár "átlovaglás" is :)

Egyszerűen arról van szó, hogyha egy leszármazott osztályban újra létrehozunk egy metódust pont olyan névvel és paraméterekkel, mint az ősosztályban, akkor a leszármazott osztály példányai az így felülbírált metódust fogják használni.

Az eclipse egy pici zöld háromszöggel jelzi a sor mellett, hogy ez egy felülbírált metódus. A public String toString() a teljes neve az ős-osztályban, ezért itt is így kell írni, de ezzel a public dologgal mi csak később fogunk foglalkozni.

Magyarul innentől kezdve bárki bármiféle Innivalo-n vagy leszármazottjának a toStringjét meghívja, akkor a mi toString-ünk fog végrehajtódni, ami visszaadja az ital szép nevét. Hogy mit? Amit a konstruktorban megadtunk! Itt az idő hogy a Sor, Bor, Palinka osztályunkat megkukkantsuk, hiszen az új kezdőértéket oda is be kell vezetni:

public class Sor extends Innivalo {
    Sor() {
        super("Kozel sör",5,4); // 5 dl, 4%
    }
}
public class Bor extends Innivalo {
    Bor() {
        super("Kannás bor",1,12); // 1 dl, 12%
    }
}
public class Palinka extends Innivalo {
    Palinka() {
        super("Törkölypálinka",0.5,40); // 0.5 dl, 40%
    }
}

Na most lefuttatva a Kocsmát, ezt kapjuk:

Jack most feladta, mert szünetre van szüksége!
Jack ezt itta:
  Kozel sör
  Kozel sör
  Törkölypálinka
Jane ezt itta:
  Törkölypálinka

Okosabb toString()

Hm, mi lenne, ha kiírnánk, hogy mekkora mit ivott? Tehát a Kozel sör helyett *Kozel sör, 5 deci 4%-os * lenne az eredmény!

Feladat: próbáld meg megcsinálni!