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:
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-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
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!