public class Person { private String name; private int age; // konstruktor se dvěma parametry // - inicializuje hodnoty proměnných ve vytvořeném objektu public Person(String name, int age) { this.name = name; this.age = age; } ... }
new
k vytvoření nové instance třídy — nového objektu, evt. volat z jiného konstruktoru
public class Person { private String name; private int age; // konstruktor se dvěma parametry // - inicializuje hodnoty proměnných ve vytvořeném objektu public Person(String name, int age) { this.name = name; this.age = age; } ... }
Příklad využití tohoto konstruktoru:
... Person pepa = new Person("Pepa z Hongkongu", 105); ...
Toto volání vytvoří objekt pepa
a naplní ho jménem a věkem.
Jak je psát a co s nimi lze dělat?
void
- to už vůbec ne !!!);
super
, které zastupuje jméno konstruktoru předka — to nás bude zajímat, jakmile začneme používat dědičnost.
super()
— pak se bezparametrický konstruktor zavolá automaticky.
Ve třídě Account
přetížíme metodu transferTo
.
public void transferTo(Account whereTo) { whereTo.add(balance); balance = 0; }
Ve třídě Account nyní koexistují dvě různé metody se stejným názvem, ale jinými parametry.
Pozn: I když jsou to teoreticky dvě úplně různé metody, pak když už se jmenují stejně, měly by dělat něco podobného.
Často přetížená metoda volá jiné "vydání" metody se stejným názvem:
public void transferTo(Account whereTo) { transferTo(whereTo, balance); }
Toto je jednodušší, přehlednější, udělá se tam potenciálně méně chyb. Lze doporučit. Je to přesně postup divide-et-impera, rozděl a panuj, dělba práce mezi metodami!
public void transferAllMoneyTo(Account whereTo) { transferTo(whereTo, balance); }
Deklarace proměnné objektového typu sama o sobě ještě žádný objekt nevytváří.
To se děje až příkazem (operátorem) new
:
V následující ukázce vytvoříme dva účty:
p = petrsAccount;
)
odkaz na objekt skrývající se pod odkazem petrsAccount.
p.transferTo(ivansAccount, 50);
... public static void main(String[] args) { Account petrsAccount = new Account(); Account ivansAccount = new Account(); Account p; petrsAccount.add(100); ivansAccount.add(220); p = petrsAccount; p.transferTo(ivansAccount, 50); // odečte se z také Petrova účtu petrsAccount.writeBalance(); // vypíše 50 ivansAccount.writeBalance(); }
Metoda může vracet odkaz na objekt, nad nímž je volána pomocí + return this;+
Příklad - upravený Account
s metodou transferTo
vracející odkaz na sebe
public class Account { private double balance; public void add(double amt) { balance += amt; } public void writeBalance() { System.out.println(balance); } public Account transferTo(Account whereTo, double a) { add(-a); whereTo.add(a); return this; } }
Vracení odkazu na sebe (tj. na objekt, na němž se metoda volala) lze s výhodou využít k "řetězení" volání:
... public static void main(String[] args) { Account petrsAccount = new Account(); Account ivansAccount = new Accont(); Account igorsAccount = new Account(); petrsAccount.add(100); ivansAccount.add(100); igorsAccount.add(100); // budeme řetězit volání: petrsAccount .transferTo(ivansAccount, 50) .transferTo(igorsAccount, 20); petrsAccount.writeBalance(); // vypíše 30 ivansAccount.writeBalance(); // vypíše 150 igorsAccount.writeBalance(); // vypíše 120 }