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.