Základy programování (IZAPR, IZKPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky Postup při vytváření objektů Metody, metoda main() Parametry metod, předávání odkazem a hodnotou Přetěžování metod Statické metody a atributy Postup při vytváření objektů Postup při vytváření objektů Student studentnovy = new Student(); new Student() vykoná: A lokaci paměti pro objekt Inicializaci hodnot atributů objektu Spuštění konstruktoru Náv rat reference na objekt pomocí operátoru new Reference na objekt je přiřazena do proměnné studentnovy Reference studentnovy je typu Student Alokace paměti Deklarace ref. proměnné alokace paměti pouze pro referenční proměnnou Student studentnovy; Použití operátoru new alokace paměti pro objekt studentnovy = new Student(); Inicializace hodnot atributů S trin g pr ijme ni; i nt r ocni kstu dia; i nt z namk apro gram ovan i; Student studentnovy = new Student(); Inicializace hodnot atributů, standardní hodnoty instančních proměnný ch: Ref. proměnné null byte, short, int, long 0 float, double 0.0 boolean false char '\u0000' 1
Inicializace hodnot atributů I přes standardní hodnoty instančních proměnných je přehlednější inicializační hodnoty uvádět S trin g jm eno = nu ll; S trin g pr ijme ni = nul l; i nt r ocni kstu dia = 0; i nt z namk apro gram ovan i = 0; Třídy, atributy, metody syntaktická pravidla Tyto standardní hodnoty mají všechny objekty vytvořené na základě třídy (pokud nezabezpečíme hodnoty jiné) Lokální proměnné žádné standardní hodnoty nemají, viz programování v metodě main() Syntaxe třídy Příklad: [modifikator] class <JmenoTridy> { <atributy> <konstruktory> <metody> i nt z namk apro gram ovan i = 1; v oid vyho dnot Znam ku() { i f (z namk apro gram ovan i == 1) { S yste m.ou t.pr intl n("s tud ent ma z namk u vy born e"); els e... Atributy Základní syntaxe [modifikator] <typ> <identifikator> [ = < inic. hodnota>]; public c lass Obdelnik { int delka ; int sirka ; boolean jezobrazen; String oznaceni ; Přístup k atributům tečková notace obdelnik1.delka = 5; Metody Metody Představují místa, kde je uchována logika programu Obsahují algoritmy a dochází v nich ke zpracování dat Instanční metody jsou volány na objektech (např. studentnovak.nastavznamku(1)) Základní syntaxe [modifikator] <navratovy_typ> <nazev> ([parametry]) { prikaz1; prikaz2;... 2
Metody Základní syntaxe [modif.] <navratovy_typ> <nazev> ([formální parametry]) { prikaz1; prikaz2;... public v oid nastavznamku(int znamka) { znamkaprogramovani = znamka; Volání metod tečková notace, argumenty studentnovak.nastavznamku(1); Parametry metody Definice metody (formální parametry) public void vytisknipole(int[] pole) { for (int i = 0; i < pole.length; i++) { System.out.print(pole[i] + " "); Volání metody (skutečné parametry, argumenty) int[] znamky = {3, 1, 2, 6, 4, 2 student. vytis knipol e(znamky); student. vytis knipol e(new int[] {3, 1, 2, 6, 4); Anonymní pole (anonymní objekty) není žádná explicitní reference Parametry metody Parametry metody se stávají její lokální proměnnou Metody - příklad Prvky pole v opačném pořadí public int[] zmenporadi(int[] pole) { int[] vyslpole = new int[pole.length]; for (int i = 0, j = vyslpole.length - 1; i < pole.length; i++, j--) { vyslpole[j] = pole[i]; return vyslpole; Návratový typ pole Metody volání metod Volání metod 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í) 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 uv edena referenční proměnná 3
Volání metod zásobník p ubli c vo id m etod ajed na() { b oole an b = t rue; m etod adve (4); p ubli c vo id m etod adva (int x) { i nt z = x + 2 4; m etod atri (); Volání metody Umístění na vrchol zásobníku i s lokálními proměnnými 1. 2. Volání metod zásobník p ubli c vo id m etod ajed na() { b oole an b = t rue; m etod adve (4); p ubli c vo id m etod adve (int x) { i nt z = x + 2 4; m etod atri (); Volání metody Umístění na vrchol zásobníku i s lokálními proměnnými 3. p ubli c vo id m etod atri () { p ubli c vo id m etod atri () { c har c = 'a'; c har c = 'a'; 3. 4. publi c st atic voi d ma in(s trin g[] arg s) { publi c st atic voi d ma in(s trin g[] arg s) { o bjek t.me toda Jedn a(); o bjek t.me toda Jedn a(); Volání metod zásobník Vrchol zásobníku A ktuálně vykonávaná metoda Stack frame Zásobníků může být i více V ícev láknové programování (další semestry studia) Metody mohou vracet hodnoty, ale nemusí Pokud nevrací hodnotu void Klíčové slovo return Lze v racet hodnoty Primitivního datového typu Referenčního datového typu (např. pole) Lze použít i pro okamžité ukončení v ykonávané metody Vracení hodnot V ždy hodnoty kompatibilní s definovaným návratovým ty pem [modifikator] <navratovy_typ> <nazev> ([parametry]) { Příklady: public S tuden t vytv orstudenta(string id) { if ( lzevytvorit ()) { return new Student(); else { return null; public String[] gettext () { return new String[] {"I", "Z", "A", "P", "R"; 4
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"; Metody metoda main public void vypocet() { return; Metoda main Programov ání v metodě main Nejedná se o objektově orientované programování Zdaleka ne všechny třídy disponují metodou main() Reálné aplikace v jazy ce Jav a Objekty komunikující s jinými objekty (posílání zpráv, volání metod) Další průběh semestru použív ání metody main Zkoušení 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 Při vytváření objektů se používají konstruktory Nastavují vlastnosti objektů S využitím parametrů Bez parametrů Nemá žádný návratový typ nic nevrací Každá třída disponuje alespoň jedním konstruktorem i pokud nevytváříme konstruktor vlastní (implicitní, bez parametrů) Název konstruktoru se vždy shoduje s názvem třídy a konstruktor je vždy doplněn závorkami jako metody Pokud vytvoříme vlastní konstruktor, tak implicitní konstruktor není k dispozici (pokud si takový konstruktor nevytvoříme) implicitní public class Student { String jmeno; String prijmeni; int rocnikstudia; Student() { Ukázka pomocí příkazu javap 5
- explicitní Student stude ntnovy = new Student("Jan", "Novy", 1, 1); S trin g pr ijme ni; i nt r ocni kstu dia; i nt z namk apro gram ovan i; S tude nt ( Stri ng j m, S trin g pr, i nt r ocni k, i nt z namk a) { j meno = jm; p rijm eni = pr ; r ocni kstu dia = ro cnik ; z namk apro gram ovan i = znam ka; Z hlediska syntaxe jsou velmi podobné metodám, ale jejich poslání je jiné Nikdy nemohou mít uveden návratový typ Dle konvencí jazyka se od metod odlišují počátečním velkým písmenem Název musí být vždy shodný s názvem třídy Více detailních informací o konstruktorech při výkladu základů dědičnosti Konstruktor příklady S tude nt(s trin g pr ijme ni) { v oid Stud ent( ) { S tude nt() { S tude nt(s trin g pr ijme ni) { Přístupov á práv a jsou u implicitního konstruktoru v ždy stejná jako přístupov á práv a třídy Přetěžov ání konstruktorů alternativ ní možnosti pro v y tváření objektů public class Student { String prijmeni; String jmeno; Student(String prij) { prijmeni = prij; Student() { 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áv ratový typ, nejedná se o přetížení Náv ratový 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 ty p parametrů 6
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áv ratový typ Mohou bý t změněny modifikátory Klíčové slovo this 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 v oid zmen Jmen o(st ring jme no) { t his. jmen o = jmen o; p ubli c st atic voi d ma in(s trin g[] arg s) { S tude nt st = new Stud ent( ); s t.zm enjm eno( "Ada m"); 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ů) klíč. slovo this S trin g pr ijme ni; S tude nt(s trin g pr ijme ni) { S tude nt() { t his( "Nez name pri jmen i"); p ubli c st atic voi d ma in(s trin g[] arg s) { S tude nt s tude nt = new Stu den t(); 7