class Subclass extends Superclass
Dědičnost. Nejlepší objektově-orientovaný způsob, jak zbohatnout.
class Subclass extends Superclass
class DogKeeper extends Person {
// methods & attributes for DogKeeper
// in addition to Person
}
DogKeeper
jsou současně typu Person
.Person p = new DogKeeper("Karel");
V Javě dědí každá třída od třídy |
Podtřída = subclass, "bezprostřední potomek", "dceřinná třída"
extends
)Dědění může být vícegenerační:
public class Manager extends Employee { ... }
public class Employee extends Person { ... }
Manažer podědí metody a atributy ze třídy Zaměstnanec i Osoba.
class DoggyManager extends Employee, DogKeeper { }
class Employee { public String toString() { "Employee"; } }
class DogKeeper { public String toString() { "DogKeeper"; } }
DoggyManager().toString(); // we have a problem!
Dědičnost (v kontextu Javy) znamená:
Account
Account
tak, aby zůstatek nebyl nižší než minimální zůstatekdebit
pomocí jejího překrytí (overriding)Account
:public class Account implements Informing {
private int balance;
...
public boolean debit(int amount) {
if(amount <= 0) return false;
balance -= amount;
return true;
}
}
CheckedAccount
public class CheckedAccount extends Account {
private int minimalBalance;
public CheckedAccount(Person owner, int minBal, int initBal) {
super(owner, initBal); // calling Account constructor
if(initBal < minBal) { // is initial balance sufficient?
throw new IllegalArgumentException("low initial balance");
}
this.minimalBalance = minBal;
}
@Override
public boolean debit(int amount) {
// check min. balance
if(getBalance() - amount >= minimalBalance) {
return super.debit(amount); // the debit is deducted
} else return false;
}
}
extends
značí, že třída CheckedAccount
je potomkem (subclass) třídy Account
.super.metoda(…);
značí, že je volána metoda předka, tedy třídy Account
.super
nepoužilo, zavolala by se metoda debit
třídy CheckedAccount
a program by se zacyklil!V konstruktoru potomka je vždy nutno zavolat konstruktor předka, protože se v něm inicializují vlastnosti dané třídy. |
Konstruktor předka je nutno zavolat jako první, protože by se pak dali použít vlastnosti, které zatím nejsou nainicializované. |
Často se používá skládání (kompozice) objektů, kdy objekt nedědí, ale nese odkaz na jiný objekt.
public class CheckedAccount {
private int minimalBalance;
private Account account;
public CheckedAccount(Person owner, int minBal, int initBal) {
account = new Account(owner, initBal);
...
}
// account.debit(amount)
}
Kompozicí se zabývá navazující kurz PV168 Seminář Javy.
/