Základní principy OOP
-
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í.
-
Viditelnost
-
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žší.
Typy viditelnosti / přístupu
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ý
Tabulka viditelností
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 !
|
Použití typů viditelnosti v tomto kurzu
- public
-
třídy/rozhraní, metody, konstanty
- private
-
atributy, metody, konstanty
- protected
-
pravděpobně nebudeme používat, výjimečně metody, atributy
- package-private
-
pravděpobně nebudeme používat
Veřejný, 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
Soukromý, 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.
|
Soukromé třídy
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é. |
Lokální v balíku, 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
.
Chráněný, 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.
Shrnutí viditelnosti
Obvykle se řídíme následujícím:
- metoda
-
-
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
-
- atribut
-
-
obvykle
private
-
výjimečně
protected
, je-li potřeba přímý přístup v podtřídě
-
- třída
-
-
obvykle
public
-
výjimečně
package-private
neboprivate
-