Překrývání metod

Tomáš Pitner, upravil Marek Šabo
tomp@fi.muni.cz

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.

/