Třída jako zdroj funkcí

Podobné dokumenty
9. přednáška - třídy, objekty

Třídy a dědičnost. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Paměť počítače. alg2 1

Úvod do programovacích jazyků (Java)

Řídicí struktury. alg3 1

typová konverze typová inference

Třídy a dědičnost. BD6B36PJV Fakulta elektrotechnická České vysoké učení technické

Třída jako datový typ. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Teoretické minimum z PJV

Datové struktury. alg12 1

Třída jako datový typ. BD6B36PJV 01 Fakulta elektrotechnická České vysoké učení technické

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Vytváření a použití knihoven tříd

PŘETĚŽOVÁNÍ OPERÁTORŮ

Soubor jako posloupnost bytů

Úvod do programovacích jazyků (Java)

Seminář Java II p.1/43

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Algoritmizace a programování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Algoritmizace a programování

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Spojové struktury. Spojová struktura (linked structure):

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programování - Java. Cvičení č.4

Programovací jazyk Pascal

Seminář Java IV p.1/38

Abstraktní datové typy: zásobník

Textové soubory. alg9 1

Výčtový typ strana 67

Principy objektově orientovaného programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Generické programování

Programování v Javě I. Leden 2008

Java a XML. 10/26/09 1/7 Java a XML

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PREPROCESOR POKRAČOVÁNÍ

Rozklad problému na podproblémy

Datové typy strana 29

Programování v Javě I. Únor 2009

7. Dynamické datové struktury

Zápis programu v jazyce C#

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Jazyk C# a platforma.net

Regulární výrazy. Vzory

8 Třídy, objekty, metody, předávání argumentů metod

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

OOPR_05. Případové studie

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Více o konstruktorech a destruktorech

7. Datové typy v Javě

5 Rekurze a zásobník. Rekurzivní volání metody

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

15. Projekt Kalkulačka

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Konstruktory a destruktory

boolean hasnext() Object next() void remove() Kolekce

KTE / ZPE Informační technologie

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

KTE / ZPE Informační technologie

8. přednáška: Soubory a proudy

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Typický prvek kolekce pro české řazení

Algoritmizace a programování

1. Dědičnost a polymorfismus

Java Výjimky Java, zimní semestr

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Programování II. Návrh programu I 2018/19

Abstraktní třídy, polymorfní struktury

1. Téma 12 - Textové soubory a výjimky

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Abstraktní třída a rozhraní

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Programovací jazyk Java

1. Programování proti rozhraní

Jak v Javě příkazy, operace a výrazy. BD6B36PJV 00 Fakulta elektrotechnická České vysoké učení technické

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Programování v C++ 3, 3. cvičení

Jazyk C# (seminář 5)

Algoritmizace a programování. Terminálový vstup a výstup

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

5 Přehled operátorů, příkazy, přetypování

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

KTE / ZPE Informační technologie

přetížení operátorů (o)

Transkript:

Třída jako zdroj funkcí Třída v jazyku Java je programová jednotka tvořená množinou identifikátorů, které mají třídou definovaný význam Základem uživatelského programu v jazyku Java je třída, ve které musí být deklarována hlavní funkce main mohou být deklarovány další pomocné funkce (procedury) mohou být deklarovány statické proměnné, které jsou použitelné jako nelokální proměnné ve funkcích dané třídy Takto koncipovaná třída je zdrojem funkcí popisujících řešení problému rozkladem na podproblémy Třída nemusí obsahovat deklaraci hlavní funkce main; třída bez hlavní funkce main nepředepisuje program, který lze spustit, ale zavádí prostředky, které lze v jiných třídách využít Příkladem je: knihovní třída Math poskytující matematické funkce třída Sys poskytující jednoduché funkce pro vstup a výstup alg7 1

Třída jako datový typ Třída s hlavní funkcí main tvořící základ programu je specialitou jazyka Java (v jiných jazycích, např. v C++, lze program vytvořit bez použití třídy) Obecně je třída popisem strukturovaného datového typu, tzn. specifikuje množinu hodnot datových objektů skládajících se ze složek, a množinu operací s datovými objekty Datové objekty typu třída (zkráceně jen objekty) se nazývají též instancemi třídy V jazyku Java lze objekty (instance tříd) vytvářet pouze dynamicky pomocí operátoru new a přistupovat k nim pomocí referenčních proměnných (podobně jako u pole) Třídy jako datové typy se nejprve naučíme používat pasivně Příkladem třídy jako datového typu je třída Complex v balíku sugar hodnotami jsou komplexní čísla tvořená dvojicemi čísel typu double (reálná a imaginární část) množinu operací tvoří obvyklé operace nad komplexními čísly (absolutní hodnota, sčítání, odčítání, násobení a dělení) alg7 2

Konstruktory Třída Complex umožňuje vytvořit a inicializovat objekt třemi způsoby: Complex c1 = new Complex(); c1 0 0 Complex c2 = new Complex(1); c2 1 0 Complex c3 = new Complex(1,1); c3 1 1 Tyto tři způsoby inicializace objektu jsou dány třemi konstruktory třídy Complex konstruktor bez parametrů Complex() inicializuje vytvořený objekt hodnotami 0,0 konstruktor s jedním parametrem Complex(double re) inicializuje vytvořený objekt hodnotami re,0 konstruktor se dvěma parametry Complex(double re, double im) inicializuje vytvořený objekt hodnotami re a im alg7 3

Instanční metody Operace s objekty se realizují pomocí instančních metod (dále jen metod) Metody mohou mít parametry a mohou vracet výsledek nějakého typu Volání (aplikace) metody m na objekt referencovaný proměnnou p má tvar: p.m(seznam skutečných parametrů) Zkráceně budeme říkat metoda m se volá na objekt p Příklady metod definovaných třídou Complex: double abs() výsledkem volání c.abs() je absolutní hodnota komplexního čísla c Complex plus(complex y) výsledkem volání c1.plus(c2) je reference na nový objekt typu Complex, jehož hodnotou je součet komplexních čísel c1 a c2 String tostring() výsledkem volání c.tostring() je řetězec tvořící znakovou reprezentaci komplexního čísla c (metodou je zavedena implicitní typová konverze z typu Complex na typ String) a další alg7 4

package alg7; Příklad použití třídy Complex import sugar.complex; import sugar.sys; public class KomplexniCisla { public static void main(string[] args) { Complex c1 = new Complex(10); Complex c2 = new Complex(3,4); Sys.pln("abs("+c1+")="+c1.abs()); Sys.pln("abs("+c2+")="+c2.abs()); Complex c3 = c1.plus(c2); Sys.pln(c1+"+"+c2+"="+c3); Program vypíše: abs([10.0, 0.0])=10.0 abs([3.0, 4.0])=5.0 [10.0, 0.0]+[3.0, 4.0]=[13.0, 4.0] alg7 5

Statické ~ instanční metody Rekapitulace významu termínu metoda v jazyku Java Třída může definovat dva druhy metod: statické metody instanční metody Metody obou druhů mohou mít parametry a mohou vracet výsledek nějakého typu Statická metoda označuje operaci (dílčí algoritmus, řešení dílčího podproblému), jejíž vyvolání (provedení) obsahuje jméno třídy, jméno metody a seznam skutečných parametrů jméno_třídy.jméno_metody(seznam skutečných parametrů) Statickým metodám třídy odpovídají v jiných jazycích procedury (nevracejí žádnou hodnotu) a funkce (vracejí hodnotu nějakého typu) Instanční metoda označuje operaci nad objektem (instancí) dané třídy, jejíž vyvolání obsahuje referenční proměnnou objektu, jméno metody a seznam skutečných parametrů referenční_proměnná.jméno_metody(seznam skut. parametrů) Statickým metodám třídy budeme i nadále říkat procedury a funkce Instančním metodám budeme zkráceně říkat metody alg7 6

Struktura objektu Hodnota objektu je strukturovaná, tzn. skládá se dílčích hodnot, které mohou různého typu Objekt je tedy abstrakcí paměťového místa skládajícího se z částí, ve kterých jsou uloženy dílčí hodnoty a které se nazývají položkami (složkami, atributy, instančními proměnnými, fields, attributes) objektu Položky objektu jsou označeny jmény, která mohou (ale nemusí) být třídou zveřejněna Příklad: objekty (instance) třídy Complex jsou tvořeny dvěma položkami typu double, jejichž jména jsou re a im a třída tato jména zveřejňuje Veřejnou položku se jménem f objektu, který je referencován proměnnou p, lze označit zápisem p.f Příklad: objektu vytvořenému deklarací Complex c = new Complex(); lze změnit hodnoty položek pomocí příkazů c.re = 1; c.im = 1; alg7 7

Více referencí na jeden objekt Objekt může být referencován několika referenčními proměnnými Jestliže hodnotu referenční proměnné typu T přiřadíme jiné referenční proměnné téhož typu, pak obě proměnné referencují tentýž objekt Příklad: Complex c1 = new Complex(); Complex c2 = c1; c1 0 0 c2 c1.re = 1; c1 1 0 c2 Sys.pln(c2.re); // vypíše 1 alg7 8

Sbírání smetí Dynamicky vytvořený objekt se stane smetím, jestliže není přístupný prostřednictvím žádné referenční proměnné Příklad: Complex c1 = new Complex(1,1); Complex c2 = new Complex(2,2); c2 = c2.plus(c1) c1 1 1 c2 2 2 c1 1 1 c2 2 2 smetí 3 3 Paměť přidělená nepřístupným objektům se uvolňuje automaticky (sbírání smětí, garbage collection) alg7 9

Třída String Objekty knihovní třídy String jsou řetězce znaků Od ostatních tříd se liší třemi specialitami: objekt typu String lze označit literálem (posloupnost znaků uzavřená mezi uvozovky) hodnotu objektu typu String nelze změnit jedna z operací (konkatenace neboli zřetězení) není realizována metodou, ale označuje ji operátor + Příklady referečních proměnných typu String: String str = Nazdar ; String str1 = str; str Nazdar str Nazdar str1 alg7 10

Spojení řetězců (konkatenace) + Příklad: "abc" + "123" Operace s řetězci výsledek je "abc123" Jestliže jeden operand operátoru + je typu String a druhý je jiného typu, pak druhý operand se převede na typ String a výsledkem je konkatenace řetězců Příklady: "abc" + 5 výsledek je "abc5 " "a" + 1 + 2 výsledek je "a12" "a" + 1 + (-2) výsledek je "a1-2" Porovnávání řetězců relační operátory == a!= porovnávají reference, nikoliv obsah řetězců pro porovnání řetězců na rovnost slouží metoda equals String s1 = "abcd"; String s2 = "ab"; String s3 = s2 + "cd"; Sys.pln(s1==s3); // vypíše false Sys.pln(s1.equals(s3)); // vypíše true alg7 11

Operace s řetězci Pro porovnání řetězců slouží další metoda compareto: String s = abcd ; Sys.pln(s1.compareTo( abdc )); // vypíše 1 Sys.pln(s1.compareTo( abcd )); // vypíše 0 Sys.pln( abdc.compareto(s1)); // vypíše 1 Některé další operace: String s = nazdar ; int delka = s.length(); // délka je 5 char znak = s.charat(1); // znak je a String ss = s.substring(2,4); // ss je zd int z1 = s.indexof( a ); // z1 je 1 int z2 = s.lastindexof( a ); // z2 je 4 Hodnotu referenční proměnné typu String lze změnit (odkazuje pak na jiný řetězec), vlastní řetězec změnit nelze alg7 12

Příklad - palindrom Napišme program, který přečte jeden řádek a zjistí, zda se po vynechání mezer jedná o palindrom (čte se stejně zpředu jako zezadu, např. kobyla ma maly bok ) Řešení funkce s parametrem typu String a výsledkem typu boolean: static boolean jepalindrom(string str) { int i = 0, j = str.length()-1; while (i<=j) { while (str.charat(i)==' ') i++; while (str.charat(j)==' ') j--; if (str.charat(i)!=str.charat(j)) return false; i++; j--; return true; alg7 13

Příklad - palindrom Výsledný program: public class Palindrom { public static void main(string[] args) { Sys.pln("Zadejte jeden řádek"); String radek = Sys.readLine(); String vysl; if (jepalindrom(radek)) vysl = "je"; else vysl = "není"; Sys.pln("Na řádku "+vysl+" palindrom"); static boolean jepalindrom(string str) {... alg7 14

Pole znaků a řetězec Příklad: funkce pro převod celého čísla na řetězec tvořený zápisem čísla v hexadecimální soustavě final static String hexa = "0123456789abcdef"; static String hexadecimal(int x) { if (x==0) return "0"; char[] znaky = new char[9]; int y; if (x<0) y=-x; else y=x; int prvni = 9; do { prvni--; znaky[prvni] = hexa.charat(y%16); y = y / 16; while (y>0); if (x<0) { prvni--; znaky[prvni] = '-'; return new String(znaky, prvni, 9-prvni); alg7 15

Kontejnerové třídy Kontejner je datová struktura obsahující proměnný počet prvků, pro kterou jsou (mimo jiné) definovány operace vytvoření prázdného kontejneru vložení prvku přístup k prvku V knihovnách Javy je řada tříd definujících vlastnosti různých typů kontejnerů Příkladem je třída ArrayList, ve které se vložené prvky rozlišují pomocí indexu vytvoření prázdného kontejneru: ArrayList kont = new ArrayList(); vložení prvků (první dostane index 0, druhý 1, atd.) kont.add( abcd ); kont.add( xyz ); získání hodnoty prvku Sys.pln(kont.get(0)); Sys.pln(kont.get(1)); // vypíše se abcd // vypíše se xyz získání počtu prvků Sys.pln(kont.size()); // vypíše se 2 alg7 16

Příklad použití třídy ArrayList Program, který přečte řádky zakončené prázdným řádkem a vypíše je v opačném pořadí import sugar.sys; import java.util.arraylist; public class KontejnerRadku { public static void main(string[] args) { ArrayList radky = new ArrayList(); Sys.pln("zadejte řádky zakončené prázdným řádkem"); String radek = Sys.readLine(); while (!radek.equals("")) { radky.add(radek); radek = Sys.readLine(); Sys.pln("výpis řádků v opačném pořadí"); for (int i=radky.size()-1; i>=0; i--) Sys.pln(radky.get(i)); alg7 17

Příklad použití třídy ArrayList Chceme-li z kontejneru radky vyzvednout např. referenci na první řetězec a uložit jí do referenční proměnné String prvni; nelze použít příkaz prvni = radky.get(0); který způsobí chybu při překladu, ale je třeba použít přetypování: prvni = (String)radky.get(0); Zjednodušené vysvětlení: metody add a get jsou specifikovány takto: void add(object obj) Object get() hodnotou proměnné, parametru nebo výsledkem metody typu Object může být reference na objekt jakéhokoliv typu jestliže o je proměnná, parametr nebo výsledek metody typu Object a její hodnotou je reference na objekt typu T, pak pro přístup k referencovanému objektu jako k objektu typu T je třeba použít operaci přetypování o na typ T ve tvaru (T)o operace zkontroluje, zda o skutečně referencuje objekt typu T; není-li tomu tak, nastane chyba při výpočtu alg7 18

Číslo jako objekt Do kontejnerů vytvořených pomocí knihovních tříd lze vkládat pouze reference na objekty, nelze do nich vložit přímo hodnotu jednoduchého typu Chceme-li do kontejneru ukládat např. čísla typu int, musíme je zabalit (wrap) do objektů předdefinované třídy Integer Příklad: ArrayList cisla = new ArrayList(); cisla.add(new Integer(10)); cisla.add(new Integer(20)); Sys.pln(cisla.get(0)); // vypíše se 10 Sys.pln(cisla.get(1)); // vypíše se 20 Integer prvni = (Integer)cisla.get(0); Číslo, které je v objektu typu Integer uloženo, získáme metodou intvalue: int n = prvni.intvalue(); Podobné obalovací třídy (wrapper classes) jsou v jazyku Java předdefinovany pro ostatní jednoduché typy alg7 19

Hierarchie tříd V on-line dokumentaci jazyka Java týkající se třídy ArrayList najdeme následující obrázek: java.lang.object +--java.util.abstractcollection +--java.util.abstractlist +--java.util.arraylist Tento obrázek vyjadřuje, že třída ArrayList (definovaná v balíku java.util) je podtřídou třídy AbstractList třída AbstractList je podtřídou třídy AbstractCollection třída AbstractCollection je podtřídou třídy Object pro zájemce alg7 20

Hierarchie tříd Třída Tpod, která je podtřídou třídy Tnad, dědí vlastnosti nadtřídy Tnad a rozšiřuje je o nové vlastnosti; některé zděděné vlastnosti mohou být v podtřídě modifikovány Pro instanční metody to znamená: každá metoda třídy Tnad je i metodou třídy Tpod, v podtřídě však může mít jinou implementaci v podtřídě mohou být definovány nové metody Pro strukturu objektu to znamená: instance třídy Tpod mají všechny položky třídy Tnad a případně další Pro referenční proměnné to znamená: proměnné typu Tnad může být přiřazena reference na objekt typu Tpod na objekt referencovaný proměnnou typu Tnad lze vyvolat pouze metodu deklarovanou ve třídě Tnad; jde-li o objekt typu Tpod, metoda se provede tak, jak je dáno třídou Tpod hodnotu referenční proměnné typu Tnad lze přiřadit referenční proměnné typu Tpod pouze s použitím přetypování, které zkontroluje, zda referencovaný objekt je typu Tpod Vztah nadtřída podtřída je tranzitivní pro zájemce alg7 21