public class Account { ... }
Tomáš Pitner, Radek Ošlejšek, Marek Šabo, Jakub Čecháček pitner@muni.cz
Dědičnost umožňuje vztah X is Y (X je Y) mezi objekty.
Umožňuje rozšířit již existující třídu, tedy vytvořit její podtřídu (podtyp), která od svého rodiče zdědí jeho atributy a metody
Proč? Znovupoužití kódu.
Polymorfismus je schopnost objektu měnit chování počas běhu.
Object o = new String("String, but can be Object")
.
Na místo, kde je očekávána instance třídy Object
, je možné dosadit instanci jakékoli její podtřídy.
Odkazovaný objekt se chová podle toho, jaké třídy je instancí.
Zapouzdření je zabalení dat a metod do jedné komponenty (třídy), souvisí s viditelností objektů.
Cokoli, co nemusí být viditelné, nemá být viditelné.
Proč? Vede ke skrývání dat, informací.
Použití tříd i jejich metod a atributů lze regulovat (uvedením tzv. modifikátoru přístupu).
Nastavením správné viditelnosti jsme schopni docílit zapouzdření.
Omezení viditelnosti je kontrolováno při překladu → není-li přístup povolen, nelze program přeložit.
Metody i atributy uvnitř třídy mohou mít viditelnost stejnou jako třída nebo nižší.
Existují čtyři možnosti:
public
= veřejný
protected
= chráněný
modifikátor neuveden = říká se privátní v balíku (package-private)
private
= soukromý
Modifier | Class | Package | Subclass (diff. package) | World |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
no modifier | Y | Y | N | N |
private | Y | N | N | N |
např. atribut typu private
je viditelný pouze v rámci dané třídy
Třídy nemohou být protected ! |
třídy/rozhraní, metody, konstanty
atributy, metody, konstanty
pravděpobně nebudeme používat, výjimečně metody, atributy
pravděpobně nebudeme používat
public
Přístupné odevšad.
public class Account { ... }
U třídy Account
lze např.
vytvořit objekt typu Account
v metodě jiné třídy
deklarovat podtřídu třídy Account
ve stejném i jiném balíku
ne všechny vlastnosti uvnitř Account
musejí vždy být veřejné
veřejné bývají obvykle některé konstruktory a některé metody
veřejné jsou typicky metody předepsané implementovaným rozhraním
třídy deklarované jako veřejné musí být umístěné do souboru s totožným názvem: Account.java
private
Viditelné jen v rámci třídy.
public class Account {
private String owner;
...
public void add(Account another) {
another.owner; // can be accessed!
...
}
}
K atributu owner
nelze přistoupit v podtřídě, pouze v dané třídě.
Pro zpřístupnění proměnné pro "vnější" potřeby je nutno použít gettery/settery.
Skrýváme konkrétní implementaci datové položky.
Např. metoda getAge()
nemusí existovat jako proměnná, ale může se v případě volání spočítat.
Volbou private nic zásadně nepokazíme. |
Třídy mohou mít viditelnost private
.
Proč by někdo chtěl privátní třídu?
public class SomeClass {
private class InnerDataStructure { ... }
// code using InnerDataStructure
}
Používá se u vnořených tříd (tříd uvnitř tříd).
Mimo rozsah předmětu, nebudeme používat!
Ve stejném souboru může být libovolný počet deklarací neveřejných tříd. Není to však hezké. |
package-private
Přístupné jen ze tříd stejného balíku, používá se málo.
Jsou-li podtřídy v jiném balíku, třída není přístupná!
package cz.some.pkg;
class Account {
// package-private class
// available only in cz.some.pkg
}
Svazuje viditelnost s organizací do balíků (ta se může měnit častěji než např. vztah nadtřída-podtřída).
Občasné využití, když nechceme mít konstruktor private
nebo rozhraní public
.
protected
Viditelnost protected
, tj. přístupné jen z podtříd a tříd stejného balíku.
public class Account {
// attribute can be protected (but it is better to have it private)
protected float creditLimit;
}
U metod tam, kde se nutně očekává použití z podtříd nebo překrývání.
Vcelku často u konstruktorů — často se volá právě ze stejné (pod)třídy.
Obvykle se řídíme následujícím:
obvykle public
, je-li užitečná i mimo třídu či balík
protected
je-li je vhodná k překrytí v případných podtřídách
jinak private
obvykle private
výjimečně protected
, je-li potřeba přímý přístup v podtřídě
obvykle public
výjimečně package-private
nebo private