Objektově orientované programování
- přístup k programování
- objekt jako datový typ
Principy OOP
- zapouzdření, dědičnost (příště), polymorfismus (příště)
- objekt vs. třída vs. instance
Zapouzdření (encapsulation)
- spojení dat a příslušných funkcí
- atributy a metody
- metody mají viditelnost, která určuje, kdo je může volat
- jen z ostatních metod téže třídy
- pomocné funkce, mohou se spolehnout na vstup
- jako předchozí + navíc metody předků
- pomocné funkce, co se mohou hodit i předkům
- kdokoliv
- u atributů lze též určit viditelnost
- dobré pravidlo je, že na atributy smí sáhnout pouze daná třída
- přístup k nim je přes metody (tzv. gettery a settery)
Různé poznámky
- třídy mi umožní skrýt implementaci
- lze pracovat stylem "mám objekt, který se umí nakreslit", ale
- nemusím vědět, jak se nakreslí
- nemusím řešit, kam se nakreslí
- vytvoření objektu: konstruktor
- spousta skryté práce, kterou připraví překladač
Statické atributy a metody
- patří ke třídě, nikoliv k objektu
- např. třída pro matematické funkce
- nepotřebuji instanci matematiky, stačí mi funkcionalita
- dosud všechny námi vytvářené metody
OOP v Javě
- co soubor, to třída
- metody už známe
- atributy jsou proměnné zapsané mimo třídu
- viditelnost
-
private
, protected
, public
- statické atributy:
static
-
main()
je statická, protože je to tak nejjednodušší
- konstruktor: metoda se stejným jménem jako je jméno třídy (bez návratového typu)
-
this
: proměnnou s aktuálním objektem (instancí)
-
super
: volání na předkovi
Příklad
public class Kalendar {
private int den;
private int mesic;
private int rok;
public Kalendar(int r, int m, int d) {
rok = r;
mesic = m;
den = d;
}
public boolean jePrestupnyRok() {
boolean delitelny4 = (rok % 4) == 0;
boolean delitelny100 = (rok % 100) == 0;
boolean delitelny400 = (rok % 400) == 0;
if (delitelny400) {
return true;
} else if (delitelny100) {
return false;
} else {
return delitelny4;
}
}
@Override
public String toString() {
return String.format("%04d-%02d-%02d", rok, mesic, den);
}
}
public class Ukazka {
public static void main(String[] args) {
Kalendar kal = new Kalendar(2015, 11, 12);
if (kal.jePrestupnyRok()) {
/* Interne se zavola kal.toString() */
System.out.printf("%s je z prestupneho roku.\n", kal);
} else {
System.out.printf("%s neni z prestupneho roku.\n", kal);
}
}
}