Třída Object
-
I když v Javě vytvoříme prázdnou třídu, obsahuje 'skryté' metody.
public class Person { }
...
Person p = new Person();
p.toString(); // ???
-
Tyto vestavěné (tj. bez našeho vlivu existující) metody jsou ve skutečnosti poděděny z třídy
Object
. -
Seznam všech vestavěných metod najdete v javadocu třídy
Object
.
Některé metody třídy Object
-
getClass()
— vrátí název třídy -
equals
,hashCode
— bude probíráno později -
clone()
— vytvoří identickou kopii objektu (deep copy)-
tahle metoda však může způsobovat problémy (vysvětlíme později)
-
proto ji nepoužívejte
-
-
toString()
— vrátí textovou reprezentaci objektu
Person p = new Person();
System.out.println(p);
// it simply does this:
System.out.println(p.toString());
Překrytí metody
-
Podívejme se blíž na metodu
String toString()
. -
Co kdybychom chtěli její chování změnit?
-
Zkusme v naší třídě implementovat metodu se stejným jménem:
public class Person {
public String toString() {
return "it works";
}
}
Person p = new Person();
System.out.println(p); // it works
Metoda toString()
-
Javadoc říká, že každá třída by měla tuhle metodu překrýt.
-
Co se stane, když ji nepřekryjeme a přesto ji zavoláme?
-
Použije se výchozí implementace z třídy
Object
:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Person p = new Person();
System.out.println(p); // Person@14ae5a5
-
Vypíše se jméno třídy, zavináč, a pak hexadecimálně nějaký podivný hash.
Anotace @Override
— motivace
-
Bylo by fajn mít kontrolu nad tím, že překrýváme skutečně existující metodu.
-
Najdete chybu?
public class Person {
public String toStrng() {
return "not working";
}
}
Person p = new Person();
System.out.println(p); // Person@14ae5a5
Anotace @Override
-
Použijeme proto anotaci, která kompilátoru říká: přepisuji existující metodu.
-
Anotace se píše před definici metody:
@Override
public String toString() {
return "it works again";
}
-
Kdybychom udělali chybu např. v názvu překrývané metody, kód by nešel přeložit.
-
TIP: Vždy používejte anotaci
@Override
, když přepisujete metodu.