14.4.2010
Obsah přednášky 7
Základy programování (IZAPR) Přednáška 7
Parametry metod, předávání odkazem a hodnotou Přetěžování metod Metody, metoda main Rozhraní, implementace, signatura, kontrakt Ikona třídy
Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií
[email protected]
KST, FEI – IZAPR, přednáška 7
2
14. dubna 2010
Parametry metod
U metod je možné definovat 0–n parametrů (formální parametry) public void nastavZnamku(int znamka) { znamkaProgramovani = znamka; }
Parametry, argumenty
Student studentNovy = new Student(); studentNovy.nastavZnamku(1);
3
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
Parametry metod
Argumenty vstupují do metod prostřednictvím parametrů Argumety – někdy též aktuální parametry
KST, FEI – IZAPR, přednáška 7
4
14. dubna 2010
Parametry metod
Žádný parametr – musí být uvedeny prázdné závorky Pokud je parametrů více, oddělují se čárkou U každého parametru musí být uveden jeho typ
Parametry
Lze je využívat jako lokální proměnné metod (jen mají definovanou hodnotu, lze ji měnit)
Typ argumentů musí vždy odpovídat typu parametrů Argumenty mohou být literální hodnoty i proměnné
public void vyhledejStudenta(String id, int znamka) { ...
}
V některých jazycích lze realizovat dva typy předávání parametrů (např. Pascal)
Volání metod – vkládáme argumenty
poleStudentu.vyhledejStudenta("st123", 2);
KST, FEI – IZAPR, přednáška 7
5
14. dubna 2010
Hodnotou – kopírování hodnoty argumentu do parametru Odkazem – propojení formálního parametru a skutečného argumentu
Jazyk Java – předávání parametrů hodnotou (pass by value)
KST, FEI – IZAPR, přednáška 7
6
14. dubna 2010
1
14.4.2010
Parametry – předávání hodnotou
Parametry – předávání hodnotou
Primitivní datové typy Bity reprezentující hodnotu jsou kopírovány do metody
Referenční proměnné Opět se jedná o bitové kopie referenční proměnné
Příklad 1:
void prictiDvojku(int prom) {
public class Student {
prom = prom + 2;
String jmeno;
} void zmenJmeno(Student student) {
public static void main(String[] args) {
student.jmeno = "Adam";
...
}
int a = 10; public static void main(String[] args) {
System.out.println("a = " + a); cislo.prictiDvojku(a);
Student st = new Student();
System.out.println("a = " + a);
st.jmeno = "Evzen"; st.zmenJmeno(st);
} } } KST, FEI – IZAPR, přednáška 7
7
14. dubna 2010
Parametry – předávání hodnotou (ref. prom.)
Předávání kopie referenční proměnné Jedná se o bitové kopie referenční proměnné
KST, FEI – IZAPR, přednáška 7
8
14. dubna 2010
Parametry – předávání hodnotou
Příklad 2:
public class Student2 { String jmeno; void zmenStudenta(Student2 student) { student = new Student2();
Student – objekt
student.jmeno = "Adam"; }
st (argument) referenční proměnná 1000111…1111
public static void main(String[] args) {
student (parametr) referenční proměnná 1000111…1111
Student2 st = new Student2(); st.jmeno = "Evzen"; st.zmenJmeno(st); } }
KST, FEI – IZAPR, přednáška 7
9
14. dubna 2010
Parametry – předávání hodnotou
KST, FEI – IZAPR, přednáška 7
st (argument, lok. prom.)
Student2 – Student2 – objekt objekt student (parametr)
14. dubna 2010
Parametry – předávání hodnotou
Rekapitulace
Předávání parametrů v jazyce Java – vždy dochází k vytváření kopií hodnot argumentů
Nezáleží na typu parametrů (primitivní, referenční)
Student2 – objekt student (parametr)
10
st (argument, lok. proměnná)
Student2 – objekt student (parametr) KST, FEI – IZAPR, přednáška 7
11
14. dubna 2010
KST, FEI – IZAPR, přednáška 7
12
14. dubna 2010
2
14.4.2010
Metody – návratové hodnoty
Metody mohou vracet hodnoty, ale nemusí Pokud nevrací hodnotu – void Klíčové slovo return Lze vracet hodnoty
Metody – návratové hodnoty
Lze použít i pro okamžité ukončení vykonávané metody
Primitivního datového typu Referenčního datového typu (např. pole)
Vracení hodnot Vždy hodnoty kompatibilní s definovaným návratovým typem
[modifikator]
([parametry]) { } 13
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
Metody – návratové hodnoty
KST, FEI – IZAPR, přednáška 7
14
14. dubna 2010
Metody – návratové hodnoty
Příklady:
Příklady:
public int vypocet() {
public Student vytvorStudenta(String id) {
char c = 'a';
if (lzeVytvorit()) {
return c;
return new Student();
}
} else {
public int vypocet() {
return null;
float f = 32.5f;
}
return (int) f;
}
} public void vypocet() {
public String[] getText () { return new String[] {"I", "Z", "A", "P", "R"};
return "vysledek"; }
} public void vypocet() { return; } KST, FEI – IZAPR, přednáška 7
15
14. dubna 2010
KST, FEI – IZAPR, přednáška 7
16
14. dubna 2010
Parametry – klíč. slovo this
Stejné názvy instančních proměnných a parametrů – použije se vždy bližší definice proměnné this – přístup k instančním proměnným a metodám public class Student { String jmeno;
Klíčové slovo this
void zmenJmeno(String jmeno) { this.jmeno = jmeno; } public static void main(String[] args) { Student st = new Student(); st.zmenJmeno("Adam"); } }
17
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
KST, FEI – IZAPR, přednáška 7
18
14. dubna 2010
3
14.4.2010
Parametry – klíč. slovo this
Není nutné používat vždy Pouze v případech, kdy dochází k překryvu identifikátorů (např. lokální vs. instanční proměnná) Používá se i v jiných případech (např. při přetěžování konstruktorů)
KST, FEI – IZAPR, přednáška 7
19
Metody – volání metod
14. dubna 2010
20
Volání metod
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
Volání metod – zásobník public void metodaJedna() {
Neexistuje žádný limit týkající se počtu volaných metod Volající a volaná metoda mohou být ve stejné třídě i ve třídách různých (způsob volání se odlišuje) Na pořadí definice metod ve třídě nezáleží (vzhledem k pořadí jejich volání)
boolean b = true;
Volání metody
metodaDve(4); } public void metodaDve(int x) {
1.
2.
3.
Umístění na vrchol zásobníku i s lokálními proměnnými
int z = x + 24; metodaTri(); } public void metodaTri() {
Volání metod v rámci jedné třídy
char c = 'a'; }
Bez uvádění referenční proměnné
Volání metod z jiné třídy
public static void main(String[] args) {
Musí být uvedena referenční proměnná
objekt.metodaJedna(); }
KST, FEI – IZAPR, přednáška 7
21
14. dubna 2010
Volání metod – zásobník public void metodaJedna() {
boolean b = true; }
public void metodaDve(int x) {
22
14. dubna 2010
Volání metod – zásobník
Volání metody
metodaDve(4);
KST, FEI – IZAPR, přednáška 7
Umístění na vrchol zásobníku i s lokálními proměnnými
Vrchol zásobníku
3.
Aktuálně vykonávaná metoda Stack frame
int z = x + 24; metodaTri(); }
public void metodaTri() {
Zásobníků může být i více
char c = 'a'; }
4.
Vícevláknové programování (další semestry studia)
public static void main(String[] args) { objekt.metodaJedna(); } KST, FEI – IZAPR, přednáška 7
23
14. dubna 2010
KST, FEI – IZAPR, přednáška 7
24
14. dubna 2010
4
14.4.2010
Přetěžování metod a konstruktorů (overloading)
Stejné názvy metod a konstruktorů (více variant jedné metody nebo konstruktoru)
Nelze pouze změnit návratový typ
Přetěžování metod a konstruktorů
Pokud změněn pouze návratový typ, nejedná se o přetížení Návratový typ může být změněn
Přetížení (není přepis metod – další přednášky na téma základů dědičnosti) Musí být změněn počet nebo typ parametrů
25
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
KST, FEI – IZAPR, přednáška 7
26
14. dubna 2010
Přetěžování metod a konstruktorů
Přetěžování – rekapitulace
Musí být změněn seznam parametrů Může být změněn návratový typ Mohou být změněny modifikátory
Metody – metoda main
KST, FEI – IZAPR, přednáška 7
27
14. dubna 2010
28
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
Metoda main
Programování v metodě main
Reálné aplikace v jazyce Java
Nejedná se o objektově orientované programování
Objekty komunikující s jinými objekty (posílání zpráv, volání metod)
Balíčky
Další průběh semestru – používání metody main
"Testování" připravené aplikace (pokročilejší způsoby testování programování neprobíhají v metodě main – předmět OOP) Spuštění aplikace
Aplikace startuje vždy metodou main
KST, FEI – IZAPR, přednáška 7
29
14. dubna 2010
30
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
5
14.4.2010
Balíčky
Balíčky umožňují
Jedná se o podobnou práci jako se složkami v operačním systému Plný název třídy se skládá z uvedení balíčků a názvu třídy (např. java.lang.Math, java.lang.String) Při využívání tříd z balíčků je nutné uvádět příkaz import
Organizovat velké projekty Členit programy na logické celky Vytvářet jmenné prostory – v každém balíčku vždy jen jedna třída stejného názvu
Balíčky
KST, FEI – IZAPR, přednáška 7
31
14. dubna 2010
Každá třída v Java API je umístěna v balíčku Import není nutné uvádět pro balíček java.lang Používali jsme bez importu např. třídu Math, String apod. Vytváření většího počtu tříd – přemýšlet nad uspořádáním tříd Předcházení konfliktů při volbě názvů balíčků – doménové jméno v opačném pořadí (doménová jména jsou unikátní) (např. import cz.upce.fei.matematika.Matice; import cz.upce.fei.matematika.*;)
KST, FEI – IZAPR, přednáška 7
32
14. dubna 2010
Balíčky
Příkaz package Třída se nachází v balíčku – příkaz import na prvním řádku zdroj. kódu třídy Pouze jeden příkaz package v souboru Pokud více tříd v jednom souboru, musí být ve stejném balíčku (včetně vnitřních tříd) Struktura balíčků musí odpovídat struktuře složek
KST, FEI – IZAPR, přednáška 7
33
14. dubna 2010
Java API
34
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
Java API (Application Programming Interface)
Dokumentace k API Přehled balíčků, tříd, konstruktorů, atributů a metod http://java.sun.com/reference/api/
Zatím jsme např. využívali
Rozhraní, implementace, signatura, kontrakt
Balíček java.lang, třídu Math Ballíček java.util, třídu Scanner
Pro jednotlivé verze jazyka se API může značně lišit
KST, FEI – IZAPR, přednáška 7
35
14. dubna 2010
36
KST, FEI – IZAPR, přednáška 7
14. dubna 2010
6
14.4.2010
Rozhraní, implementace
Rozhraní – signatura, kontrakt
Rozhraní
Množina informací, které o sobě třída zveřejní Např. vše označené jako public Příklad rozhraní tříd – Java API Co nechceme aby bylo přístupné označíme private (nebude součástí rozhraní)
Rozhraní lze dále rozdělit na:
Signaturu
Kontrakt
Implementace
Způsob naprogramování třídy, realizace nabízených funkcí třídy Jak je uděláno to, co třída umí
KST, FEI – IZAPR, přednáška 7
37
14. dubna 2010
Kombinace modifikátoru, názvu metody, seznamu parametrů a návratového typu Překladač dokáže kontrolovat správnost
Dohoda mezi tvůrcem třídy či metody a jejím uživatelem Měl by být uveden v dokumentačních komentářích (popis funkce, význam parametrů, omezení hodnot parametrů, význam návratové hodnoty, seznam chybových stavů apod.) Nedokáže kontrolovat překladač Nedodržení kontraktu často vede k havárii programu
KST, FEI – IZAPR, přednáška 7
38
14. dubna 2010
Ikona třídy Název třídy Instanční proměnné (atributy) Metody
obdelnik1 : Obdelnik
KST, FEI – IZAPR, přednáška 7
Obdelnik stranaA stranaB vypocitejObvod() vypocitejObsah() vypocitejDelkuUhlopricky()
Stavy (co objekty znají)
Chování (co objekty dělají)
obdelnik2 : Obdelnik
obdelnik3 : Obdelnik
39
14. dubna 2010
7