typová konverze typová inference



Podobné dokumenty
Seminář Java IV p.1/38

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

Programování v Javě I. Leden 2008

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

Výčtový typ strana 67

Úvod do programovacích jazyků (Java)

Abstraktní třída a rozhraní

Základy objektové orientace I. Únor 2010

Generické programování

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

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

Teoretické minimum z PJV

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

1. Programování proti rozhraní

Seminář Java II p.1/43

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

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

Typický prvek kolekce pro české řazení

20. Projekt Domácí mediotéka

7. Dynamické datové struktury

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

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

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

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Dědění, polymorfismus

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

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

9. Polymorfismus a rozhraní

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

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

3. Třídy. Základní pojmy objektového programování. Třídy

11. Dědičnost. Dědičnost strana 103

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

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

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/

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Principy objektově orientovaného programování

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

PREPROCESOR POKRAČOVÁNÍ

1. Dědičnost a polymorfismus

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

Abstraktní datové typy: zásobník

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Java - řazení objektů

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

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

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

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

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Třída jako zdroj funkcí

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Java Enum Java, zimní semestr ,2017 1

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

10 Generické implementace

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

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

Jazyk C# (seminář 6)

Jazyk C# (seminář 3)

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

UJO Framework. revoluční architektura beans. verze

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

Úvod do programovacích jazyků (Java)

IRAE 07/08 Přednáška č. 1

Semin aˇr Java X Radek Koˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2011 Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady...

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

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

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Datové typy strana 29

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Programování II. Abstraktní třída Vícenásobná dědičnost 2018/19

Abstraktní třídy, polymorfní struktury

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

7.5 Diagram tříd pokročilé techniky

Třídy a objekty -příklady

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

JAVA. Další jazyky kompilovatelné do Java byte-code

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Dědičnost (inheritance)

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

Algoritmizace a programování

OOPR_05. Případové studie

Algoritmizace a programování

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

7.5 Diagram tříd pokročilé techniky

Zápis programu v jazyce C#

Programování II. Dědičnost změna chování 2018/19

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

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

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

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

Datové struktury. alg12 1

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

Transkript:

Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36

Téma přednášky Rozhraní: použití, dědičnost Hierarchie dědičnosti typová konverze typová inference Porovnávání objektů Radek Kočí Seminář Java Programování v Javě (2) 2/ 36

Typy, kontrola typů Význam typování určit sémantický význam elementům (hodnoty v paměti) pokud má paměťová hodnota přiřazený typ, můžeme s ní pracovat na vyšší úrovni víme jaké operace je možné provést, můžeme provádět kontrolu typové konzistence atp. Staticky typované jazyky k typové kontrole dochází v době kompilace C++, Java,... Dynamicky typované jazyky k typové kontrole dochází v době běhu programu Smalltalk, Self, Python, Lisp... Radek Kočí Seminář Java Programování v Javě (2) 3/ 36

Typy, kontrola typů x x := self get. x message. "překlad: neznámý typ" Type x; x = this.get(); x.message(); //překlad: Type a odvozené Radek Kočí Seminář Java Programování v Javě (2) 4/ 36

Typy, kontrola typů Dynamická kontrola probíhá u všech jazyků jako dynamicky typované se označují ty, které nemají statickou kontrolu některé staticky typované jazyky (C + +, Java) umožňují dynamické přetypování, čímž částečně obcházejí statickou typovou kontrolu Radek Kočí Seminář Java Programování v Javě (2) 5/ 36

Hierarchie dědičnosti Třída Object je předkem všech tříd. Definuje základní množinu operací public boolean equals(object obj); public int hashcode(); public String tostring(); Do proměnné, jejíž typ je deklarován jako třída A, lze dosadit všechny instance třídy A a všechny instance podtříd třídy A. Radek Kočí Seminář Java Programování v Javě (2) 6/ 36

Operátor zřetězení + Výsledkem je vždy řetězec, ale argumenty mohou být i jiných typů, např. např. System.out.println("objekt o = " + o); je-li o == null použije se řetězec null je-li o!= null použije se hodnota vrácená metodou o.tostring() (tu lze překrýt a dosáhnout tak očekávaného řetězcového výstupu) Radek Kočí Seminář Java Programování v Javě (2) 7/ 36

Operátory typové konverze (přetypování) píše se ( typ ) hodnota např. (int) o, kde o byla proměnná deklarovaná jako long. s konverzí primitivního typu může dojít ke změně hodnoty např. (Ucet) o, kde o byla proměnná deklarovaná jako Object. pro objektové typy se ve skutečnosti nejedná o žádnou konverzi spojenou se změnou obsahu objektu, nýbrž pouze o potvrzení, že běhový typ objektu je požadovaného typu např. (viz výše) že o je typu Ucet. Radek Kočí Seminář Java Programování v Javě (2) 8/ 36

Porovnávání objektů Porovnávání objektů prostřednictvím operátoru == (!=) true jedná se o dva odkazy na tentýž objekt tj. o dva totožné objekty false jedná se o dva odkazy na různé samostatné objekty mohou být i stejné třídy i se stejným obsahem test identity (totožnosti) Porovnávání objektů na základě jejich obsahu (tedy ne podle referencí) tj. dva objekty jsou rovné (rovnocenné, nikoli totožné), mají-li stejný obsah metoda equals(object o) test rovnocenosti Radek Kočí Seminář Java Programování v Javě (2) 9/ 36

Porovnávání objektů Metoda equals je deklarovaná ve třídě Object (tj. každý objekt má metodu equals) tato metoda (ve třídě Object) funguje přísným způsobem, tj. rovné si budou jen totožné objekty! Chceme-li chápat rovnost objektů podle obsahu musíme pro danou třídu překrýt metodu equals, která musí vrátit true, právě když se obsah výchozího a srovnávaného objektu rovná Radek Kočí Seminář Java Programování v Javě (2) 10/ 36

Porovnávání objektů příklad Dva objekty třídy Ucet jsou shodné, mají-li stejného majitele a zůstatek. public class Ucet { protected String majitel; protected double zustatek; public Ucet (String jmeno) { majitel = jmeno;... Radek Kočí Seminář Java Programování v Javě (2) 11/ 36

Porovnávání objektů příklad... public boolean equals(object o) { if (o instanceof Ucet) { Ucet c = (Ucet)o; return (zustatek == c.zustatek? majitel.equals(c.majitel): else return false; false); Radek Kočí Seminář Java Programování v Javě (2) 12/ 36

Metoda hashcode Jakmile u třídy překryjeme metodu equals, měli bychom současně překrýt i metodu hashcode(): hashcode vrací celé číslo (int) co nejlépe charakterizující obsah objektu pro dva stejné (equals) objekty musí vždy vrátit stejnou hodnotu pro dva obsahově různé objekty by hashcode naopak měl vracet různé hodnoty (ale není to stoprocentně nezbytné a ani nemůže být vždy splněno) Radek Kočí Seminář Java Programování v Javě (2) 13/ 36

Metoda hashcode - příklad V těle hashcode často delegujeme řešení na volání hashcode jednotlivých složek objektu a to těch, které figurují v equals: public class Ucet { protected String majitel; protected double zustatek; public Ucet (String jmeno) { majitel = jmeno; public boolean equals(object o) {... public int hashcode() { return majitel.hashcode(); Radek Kočí Seminář Java Programování v Javě (2) 14/ 36

Rozhraní V Javě, na rozdíl od C++ neexistuje vícenásobná dědičnost to nám ušetří řadu komplikací (problém nejednoznačnosti) ale je třeba to něčím nahradit Pokud po třídě chceme, aby disponovala vlastnostmi z několika různých množin (skupin), můžeme ji deklarovat tak, že implementuje více rozhraní Radek Kočí Seminář Java Programování v Javě (2) 15/ 36

Třída, rozhraní a typová zaměnitelnost Rozhraní a třída rozhraní specifikuje množinu vlastností, ale neimplementuje je rozhraní definuje typ objektu objekt je typu A, pokud její třída implementuje rozhraní A třída sama o sobě deklaruje rozhraní třída také definuje typ objektu objekt může mít více typů (implementovat více rozhraní) Radek Kočí Seminář Java Programování v Javě (2) 16/ 36

Třída, rozhraní a typová zaměnitelnost Typová zaměnitelnost Do proměnné, jejíž typ je deklarován jako třída A, lze dosadit všechny instance třídy A a všechny instance podříd třídy A. Do proměnné, jejíž typ je deklarován jako rozhraní A, lze dosadit všechny instance tříd, které implementují rozhraní A. Radek Kočí Seminář Java Programování v Javě (2) 17/ 36

Rozhraní A + do() : void B + do() : void public void m1(a obj) { obj.do(); m1(new A()); m1(new B()); <-! Radek Kočí Seminář Java Programování v Javě (2) 18/ 36

Rozhraní TypeDO + do() : void G + print() : void A + do() : void B + do() : void public void m1(typedo obj) { obj.do(); m1(new A()); m1(new B()); public void m2(a obj) { obj.print(); m2(new A()); m2(new G()); <-! Radek Kočí Seminář Java Programování v Javě (2) 19/ 36

Rozhraní TypeDO + do() : void + print() : void G + print() : void + do() : void A + do() : void + print() : void B + do() : void + print() : void public void m1(typedo obj) { obj.do(); public void m2(typedo obj) { obj.print(); m1(new A()); <-- B, G m2(new A()); <-- B, G Radek Kočí Seminář Java Programování v Javě (2) 20/ 36

Rozhraní! TypePRINT + print() : void TypeDO + do() : void G + print() : void A + do() : void + print() : void B + do() : void public void m1(typedo obj) { obj.do(); public void m2(typeprint obj) { obj.do(); method(new A()); <-- B method(new A()); <-- G Radek Kočí Seminář Java Programování v Javě (2) 21/ 36

Rozhraní «interface» TypePRINT + print() : void «interface» TypeDO + do() : void G + print() : void A + do() : void + print() : void B + do() : void public void m1(typedo obj) { obj.do(); public void m2(typeprint obj) { obj.do(); method(new A()); <-- B method(new A()); <-- G Radek Kočí Seminář Java Programování v Javě (2) 22/ 36

Rozhraní Co je rozhraní popis (specifikace) množiny vlastností (metod), aniž bychom tyto vlastnosti ihned implementovali. určitá třída implementuje rozhraní, pokud implementuje všechny metody, které jsou daným rozhraním předepsány. Rozhraní v Javě je specifikováno množinou hlaviček metod označenou identifikátorem názvem rozhraní ucelenou specifikací tj. popisem, co přesně má metoda dělat (vstupy/výstupy metody, její vedlejší efekty... ) Radek Kočí Seminář Java Programování v Javě (2) 23/ 36

Deklarace rozhraní Vypadá i umisťuje se do souborů podobně jako deklarace třídy Všechny metody v rozhraní musí být public a v hlavičce se to ani nemusí uvádět. Všechny metody v rozhraní jsou zároveň automaticky abstraktní těla metod se neuvádějí. Rozhraní může obsahovat proměnné jedná se vždy o konstantu (modifikátor final se uvádět nemusí) Příklad deklarace rozhraní public interface Informator { public void vypisinfo(); Radek Kočí Seminář Java Programování v Javě (2) 24/ 36

Implementace rozhraní public class Ucet implements Informator {... public void vypisinfo() {... Třída implementuje všechny metody předepsané rozhraním. Třída může implementovat více rozhraní současně. public class Name implements Interface1, Interface2 {... Radek Kočí Seminář Java Programování v Javě (2) 25/ 36

Použití rozhraní Tam, kde stačí funkcionalita definovaná rozhraním. Proměnnou můžeme definovat jako typ rozhraní (ne třídu, která rozhraní implementuje). Do proměnné lze přiřadit libovolný objekt, který implementuje uvedené rozhraní. Lze používat pouze metody deklarované rozhraním! (viz dále... ) Umožňuje větší flexibilitu kódu při zachování (statické) typové kontroly. Informator petruvucet = new Ucet("Petr"); petruvucet.vypisinfo(); Radek Kočí Seminář Java Programování v Javě (2) 26/ 36

Rozšiřování rozhraní Podobně jako u tříd i rozhraní může být děděno. Třída dědí maximálně z jednoho předka. Rozhraní může dědit z více předků (vícenásobná dědičnost). public interface DobryInformator extends Informator { public void vypisviceinfo(); Radek Kočí Seminář Java Programování v Javě (2) 27/ 36

Rozšiřování rozhraní Třída, která implementuje rozhraní DobryInformator musí implementovat obě metody: public class Ucet implements DobryInformator {... public void vypisinfo() {... public void vypisviceinfo() {... Radek Kočí Seminář Java Programování v Javě (2) 28/ 36

Třída, rozhraní a typová zaměnitelnost Typová zaměnitelnost Do proměnné, jejíž typ je deklarován jako třída A, lze dosadit všechny instance třídy A a všechny instance podříd třídy A. Do proměnné, jejíž typ je deklarován jako rozhraní A, lze dosadit všechny instance tříd, které implementují rozhraní A, nebo které jsou jejich podtřídami. Do proměnné, jejíž typ je deklarován jako rozhraní A, lze dosadit všechny instance tříd (a podtříd), které implementují rozhraní A nebo odvozené rozhraní. Radek Kočí Seminář Java Programování v Javě (2) 29/ 36

Dosazení objektu do proměnné I Object ClassA InterfaceA ClassD ClassB InterfaceB ClassC void method(classa o) {... o ClassA, ClassB, ClassC o == ClassB (ClassB) o Radek Kočí Seminář Java Programování v Javě (2) 30/ 36

Dosazení objektu do proměnné II Object ClassA ClassB InterfaceA InterfaceB ClassD ClassC void method(interfaceb o) {... o ClassB, ClassC void method(interfacea o) {... o ClassB, ClassC, ClassD o == ClassC (InterfaceB) o o == ClassC (ClassC) o Radek Kočí Seminář Java Programování v Javě (2) 31/ 36

Dosazení objektu do proměnné příklad public abstract class Vehicle { public abstract int price(int km); public class Car extends Vehicle { public int price(int km) {... public class Bus extends Vehicle { public int price(int km) {... method(new Bus()); public void method(vehicle v) { Car c = (Car) v; (ClassCastException) System.out.println(a.price(200); Radek Kočí Seminář Java Programování v Javě (2) 32/ 36

Dosazení objektu do proměnné příklad Radek Kočí Seminář Java Programování v Javě (2) 33/ 36

Dosazení objektu do proměnné příklad (1) Car c = new Car(); (2) Bus b = new Bus(); (3) Vehicle vc = c; (4) Object ob = b; (5) Car cc = (Car) ob; (6) Bus bb = (Bus) ob; (7) Car ccc = (Car) vc; Radek Kočí Seminář Java Programování v Javě (2) 34/ 36

Použití rozhraní «interface» Iterable AbstractCollection «interface» Collection AbstractSet AbstractList «interface» List HashSet ArrayList Vector «interface» RandomAccess Radek Kočí Seminář Java Programování v Javě (2) 35/ 36

Použití rozhraní Rozhraní (java.util): public interface Collection... Implementující třídy: AbstractCollection, AbstractList, AbstractSet, ArrayList, BeanContextServicesSupport, BeanContextSupport, HashSet, LinkedHashSet, LinkedList, TreeSet, Vector Třída Vector: public class Vector... {... public Vector(Collection c)...... Radek Kočí Seminář Java Programování v Javě (2) 36/ 36