Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 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 2 Parametry metod U metod je možné definovat 0 n parametrů (formální parametry) Parametry, argumenty public void nastavznamku(int znamka) { znamkaprogramovani = znamka; Student studentnovy = new Student(); studentnovy.nastavznamku(1); Argumenty vstupují do metod prostřednictvím parametrů Argumety někdy též aktuální parametry 3 4 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 public void vyhledejstudenta(string id, int znamka) {... Volání metod vkládáme argumenty polestudentu.vyhledejstudenta("st123", 2); Parametry metod 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é V některých jazycích lze realizovat dva typy předávání parametrů (např. Pascal) 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) 5 6 1
Primitivní datové typy Bity reprezentující hodnotu jsou kopírovány do metody void prictidvojku(int prom) { prom = prom + 2; Referenční proměnné Opět se jedná o bitové kopie referenční proměnné Příklad 1: public class Student { String jmeno;... int a = 10; System.out.println("a = " + a); cislo.prictidvojku(a); System.out.println("a = " + a); void zmenjmeno(student student) { student.jmeno = "Adam"; Student st = new Student(); st.jmeno = "Evzen"; st.zmenjmeno(st); 7 8 (ref. prom.) Předávání kopie referenční proměnné Jedná se o bitové kopie referenční proměnné Příklad 2: public class Student2 { String jmeno; Student void zmenstudenta(student2 student) { student = new Student2(); student.jmeno = "Adam"; st (argument) referenční proměnná 1000111 1111 referenční proměnná 1000111 1111 Student2 st = new Student2(); st.jmeno = "Evzen"; st.zmenjmeno(st); 9 10 st (argument, lok. prom.) Rekapitulace Předávání parametrů v jazyce Java vždy dochází k vytváření kopií hodnot argumentů st (argument, lok. proměnná) Nezáleží na typu parametrů (primitivní, referenční) 11 12 2
Metody mohou vracet hodnoty, ale nemusí Pokud nevrací hodnotu void Klíčové slovo return Lze vracet hodnoty Primitivního datového typu Referenčního datového typu (např. pole) Lze použít i pro okamžité ukončení vykonávané metody Vracení hodnot Vždy hodnoty kompatibilní s definovaným návratovým typem [modifikator] <navratovy_typ> <nazev> ([parametry]) { 13 14 Příklady: public Student vytvorstudenta(string id) { if (lzevytvorit()) { return new Student(); else { return null; public String[] gettext () { return new String[] {"I", "Z", "A", "P", "R"; 15 Příklady: public int vypocet() { char c = 'a'; return c; public int vypocet() { float f = 32.5f; return (int) f; public void vypocet() { return "vysledek"; public void vypocet() { return; 16 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 { Klíčové slovo this String jmeno; void zmenjmeno(string jmeno) { this.jmeno = jmeno; Student st = new Student(); st.zmenjmeno("adam"); 17 18 3
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ů) Metody volání metod 19 20 Volání metod Volání metod zásobník 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í) public void metodajedna() { boolean b = true; metodadve(4); public void metodadve(int x) { int z = x + 24; metodatri(); Volání metody 1. 2. Umístění na vrchol zásobníku i s lokálními proměnnými Volání metod v rámci jedné třídy Bez uvádění referenční proměnné Volání metod z jiné třídy Musí být uvedena referenční proměnná public void metodatri() { char c = 'a'; public static void main(string[] args) {.metodajedna(); 3. 21 22 Volání metod zásobník Volání metod zásobník public void metodajedna() { boolean b = true; metodadve(4); public void metodadve(int x) { int z = x + 24; metodatri(); public void metodatri() { char c = 'a'; public static void main(string[] args) {.metodajedna(); Volání metody 3. 4. Umístění na vrchol zásobníku i s lokálními proměnnými Vrchol zásobníku Aktuálně vykonávaná metoda Stack frame Zásobníků může být i více Vícevláknové programování (další semestry studia) 23 24 4
Přetěžování metod a konstruktorů (overloading) Stejné názvy metod a konstruktorů (více variant jedné metody nebo konstruktoru) Přetěžování metod a konstruktorů Nelze pouze změnit návratový typ 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 26 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 27 28 Metoda main Programování v metodě main Nejedná se o ově orientované programování Reálné aplikace v jazyce Java Objekty komunikující s jinými y (posílání zpráv, volání metod) 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 29 30 5
umožňují 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 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 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.*;) 31 32 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 Java API 33 34 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 Balíček java.lang, třídu Math Ballíček java.util, třídu Scanner Rozhraní, implementace, signatura, kontrakt Pro jednotlivé verze jazyka se API může značně lišit 35 36 6
Rozhraní, implementace 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í) Implementace Způsob naprogramování třídy, realizace nabízených funkcí třídy Jak je uděláno to, co třída umí Rozhraní signatura, kontrakt Rozhraní lze dále rozdělit na: Signaturu Kombinace modifikátoru, názvu metody, seznamu parametrů a návratového typu Překladač dokáže kontrolovat správnost Kontrakt 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 37 38 Ikona třídy Název třídy Instanční proměnné (atributy) Metody Obdelnik stranaa stranab vypocitejobvod() vypocitejobsah() vypocitejdelkuuhlopricky() Stavy (co y znají) Chování (co y dělají) obdelnik1 : Obdelnik obdelnik2 : Obdelnik obdelnik3 : Obdelnik 39 7