Tvorba objektů. Nový objekt se vytváří konstruktorem a event. nestatickými inicializátory.

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

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

Úvod do programovacích jazyků (Java)

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

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

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

Teoretické minimum z PJV

Java Enum Java, zimní semestr ,2017 1

Programování v Javě I. Leden 2008

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

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

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

OOP - Objektově Orientované Programování

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

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

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

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

Principy objektově orientovaného programování

typová konverze typová inference

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

Výčtový typ strana 67

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/

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

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

Seminář Java II p.1/43

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

Typický prvek kolekce pro české řazení

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Algoritmizace a programování

Java efektivně. Lukáš Zapletal liberix.cz. Pokročilejší techniky programování v Javě

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

7. Statické prvky třídy

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

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

Abstraktní datové typy: zásobník

PREPROCESOR POKRAČOVÁNÍ

20. Projekt Domácí mediotéka

Java Výjimky Java, zimní semestr

Java - řazení objektů

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

Programování v jazyku Java základy OOP

Generické programování

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

JAVA. Krátke poznámky:

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

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

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

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

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

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

Úvod do programovacích jazyků (Java)

RMI Remote Method Invocation

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

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

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

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

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

Základy objektové orientace I. Únor 2010

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

O autorovi O odborném korektorovi Úvod 17 Vývoj jazyka Java Java SE 8 Struktura této knihy Předchozí zkušenosti s programováním nejsou potřebné

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.

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

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

Seminář Java IV p.1/38

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

1. Dědičnost a polymorfismus

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

Vláknové programování část V

PB161 Programování v jazyce C++ Přednáška 4

6. PRÁCE S DATOVÝMI PROUDY

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

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

1. Programování proti rozhraní

Úvod do programovacích jazyků (Java)

Datové abstrakce v programovacích jazycích

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

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

Design time - vytváří se program - metadata - vytváří se např. třída. Run time - běh programu - ukládá se do paměti počítače - vytváří se např.

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

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

Abstraktní třída a rozhraní

Čipové karty Lekařská informatika

Z. Kotala, P. Toman: Java ( Obsah )

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

Více o konstruktorech a destruktorech

Návrhové vzory Tvorba objektů

Konstruktory a destruktory

UJO Framework. revoluční architektura beans. verze

Java Řetězce Java, zimní semestr

Dědičnost (inheritance)

JAVA V jar Java, zimní semestr

ADT/ADS = abstraktní datové typy / struktury

JAVA. Krátce o Reflection API

Třída jako zdroj funkcí

Pokročilé programování na platformě Java. Úvod

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

Dědění, polymorfismus

Zápis programu v jazyce C#

Transkript:

Tvorba objektů Objekty lze vytvářet, operovat nad nimi, ukládat je ve vnější paměti, přenášet je či využívat telekomunikačně pouze v čase běhu (run-time). Objekt ( čili instance třídy ) se vytváří v operační paměti na tzv. haldě. Obsahuje nestatickéčili instanční atributy primitivních i referenčních typů. Objekt nemusí být kontinuální v paměti. Nový objekt se vytváří konstruktorem a event. nestatickými inicializátory. Každý objekt referuje jedinečný class-object popisující jeho třídu. Onen obsahuje statickéčili třídní atributy a reference ke kódům metod, konstruktorů a inicializátorů. Kódy existují jen v jediném exempláři, neb jsou tzv. reentrantní ( tj. neobsahují proměnná data ) a tudíž dle nich může postupovat více vláken současně. JVM vede evidenci vytvořených objektů a referencí, které na ně odkazují. Nereferované objekty ruší při nedostatku paměti garbage collector. Ten lze programově zavolat metodou System.gc( ) či Runtime.gc( ) ; PJV02 1

Konstruktory Konstruktor vytváří na haldě objekt a dle parametrů nastavuje jeho atributy. Připomíná konkrétní nestatickou metodu ( funkci ), která: má jméno stejné jako třída. nevyznačuje návratový typ, tj. ani void, neboť vrací právě referenci svého typu na objekt, který vytvořil. má modifikátor viditelnosti ( i private ). neníčlenem třídy, nedědí se a nemůže být abstraktní ani finální. konstruktory lze přetěžovat. Každá třída - tedy i abstraktní - má alespoň jeden konstruktor. Není-li ve třídě žádný konstruktor definován, vytvoří se skrytý implicitní konstruktor bez parametrů, který volá pouze konstruktor přímého předka bez parametrů: public JménoTřídy ( ) { super( ); } Je-li však nějaký konstruktor explicitně definován, pak se implicitní nevytvoří a eventuálně požadovaný konstruktor bez parametrů je nutno definovat explicitně případně i s neprázdným tělem. PJV02 2

Vzájemné volání konstruktorů Pro začátek těl konstruktorů platí tato pravidla pro tři případy: 1. public JménoTřídy (... ) { super( ); } Zprvu se volá příslušný existující konstruktor přímého předka. 2. public JménoTřídy (... ) { this( ); } Zprvu se volá existující přetížený konstruktor téže třídy. Tuto fintu lze použít i několikrát, avšak nesmí dojít k cyklu. 3. public JménoTřídy (... ) { } public JménoTřídy (... ) { super( ); } jsou ekvivalentní Začíná-li jinak než v případech 1 a 2, skrytě se na začátek přidá volání super( ); tj. konstruktoru přímého předka bez parametrů. Neexistuje-li onen, kompilátor ohlásí chybu. Vyhodí-li konstruktorči nestatický inicializátor výjimku, objekt nevznikne. PJV02 3

Vytvoření objektu Objekt vytváří konstruktor instanciací třídy jedním z těchto způsobů: aktivací konstruktoru pomocí klíčového slova: new Type( ) resp. new Type( ) {... } - kde Type je jméno třídy resp. interfejsu pro pole: new Type[ num ] resp. new Type[ ] {...,...,... } - kde Type je jméno třídy, interfejsu nebo primitivní typ. Každé pole (i primitivů) lze referovat též typem java.lang.object. klonováním pomocí generální metody clone( ) natažením ze serializovaného proudu nestatickou metodou java.lang.class.newinstance( ) - např. takto: Class c = Class.forName( "ÚplnéJménoTřídy" ); Object x = c.newinstance( ); ÚplnéJménoTřídy z = ( ÚplnéJménoTřídy ) x; PJV02 4

Inicializace nestatických atributů Nestatické atributy se inicializují při konstrukci každého objektu. Nejdříve dle společného pořadí deklarací a nestatických inicializátorů a pak v pořadí dokončovaných těl konstruktorů. Nestatickéčili instanční inicializátory připomínají metody, které mají přístup ke nestatickému i statickému kontextu, nic nevracejí, nemají signaturu, nevyznačují vyhazování výjimek, nelze je volat, nejsou členy třídy a nedědí se. Lze jich deklarovat i více. Syntakticky jsou to pouhé bloky: {... } Příklad: final static byte MARK = 0xff; byte[ ] a = new byte [ 256 ] ; { for ( int i = 0; i < a.length; i++ ) a[ i ] = ( byte ) i; } { a[ 100 ] = MARK; } PJV02 5

Postup konstrukce Konstrukce objektu je tím složitější proces, čím je jeho třída dále od kořene a čím je její bohatství větší. Po zavolání konstruktoru se: Alokuje paměť a inicializují se nestatické atributy na defaultní hodnoty. Postupně volají konstruktory všech nadtříd ( směrem nahoru ) až k java.lang.object a to příkazem super( ) volající některý existující konstruktor příslušné signatury. Pak se (směrem dolů) postupně dle každé třídy re-inicializují nestatické atributy (případně i nestatickými inicializátory) a teprve pak se dokončí těla jejich volaných konstruktorů. Proces konstrukce se může i stromově větvit - např.: int i = 100, j = i+10, w = 300, h = w/2 ; Rectangle r = new Rectangle( new Point( i, j ), new Dimension( w, h ) ); PJV02 6

Postup konstrukce Těla konstruktorů a nestatických inicializátorů mohou obsahovat definice, příkazy a také volání statických i nestatických metod. Upozornění: Je-li nestatická metoda přepsána v potomkovi a je volána v konstruktoru či nestatickém inicializátoru předka, pak se vezme metoda potomka. Tomuto jevu lze zabránit: metoda předka se skryje přísnějším přístupovým modifikátorem ( např. private ), čímž se tato metoda nepřepíše. či použitím statické metody. PJV02 7

Rozhraní (Interface) Comparable < T > vyznačuje porovnávatelné objekty tím, že definuje metodu public int compareto ( T that ) ; kde T je parametrický typ (od v. 1.5), která vrací >0, 0, <0 pro this > that, this == that, this < that Lexikografické porovnánířetězů: int n = s1.compareto( s2 ); class Item implements Comparable { String title; float price=0.0; public int compareto( Object o ) { Item that = ( Item ) o; float diff = this.price that.price; if ( diff == 0 ) return 0; return diff > 0? 1 : -1 ; } } // řazení vzestupně PJV02 8

Příklad class Book implements Comparable { private static int total; private int id; private String title; public Book( String title ) { this.title = title; id = ++total; } public static int gettotal( ) { return total; } public int getld( ) { return id; } public String gettitle( ) { return title; } public int compareto( Object o ) { if (! (o instanceof Book) ) System.out.println( "ClassCast" ); Book that = ( Book ) o; // can be thrown here return this.title.compareto( that.title ); } public String tostring( ) { return " Book: " +id+ " "+title; } } // Inicializace vytvoří objekty a reference ( viz dále ): Book b0 = null, b1 = new Book("A"), b2 = new Book("B"), b3 = new Book("JAVA_6") ; PJV02 9

Třídy, metody, atributy, objekty, reference non-static context garbage collected heap Object.class static context class loader b1 b2 b3 Book references Book objects b0 Comparable.class int compareto( ); non-static general methods: clone( ), equals(, hashcode( ), finalize( ), getclass( ), notify( ), notifyall( ), tostring( ), wait( ) Book.class int id 3 String title String object static int total 3 String.class static gettotal( ) getid( ), gettitle( ), tostring( ), compareto( ) char[ ] final int length 6 JAVA_6 static format( ), valueof() tostring( ), compareto( ), length( ), charat( ), equals( ) PJV02 10

Balíček java.lang Tento balíček je základní a nutný pro fungování Javy. Je defaultní takže netřeba psát import java.lang.*; Obsahuje základní interfejsy, třídy, Enum, s a s. Podbalíčky: java.lang.annotation pro podporu anotací (od v. 1.5) java.lang.instrument pro redefinici tříd (od v. 1.5) java.lang.management pro sledování a řízení JVM (od v. 1.5) java.lang.ref pro práci s referencemi a garbage collectorem. java.lang.reflect pro detailní práci s třídami a objekty. PJV02 11

java.lang Object Cloneable Runnable Runtime Comparable Enum Iterable Thread Process <T> <E extends Enum <E> > <T> String Thread.Uncaught Handler Security Manager CharSequence System Class ThreadGroup RMISecurity Manager <T> StringBuffer syn Class Loader ThreadLocal <T> Permission StringBuilder nosyn Readable SecureClass Loader Inheritable ThreadLocal <T> Basic Permission Appendable java.io URLClass Loader StackTrace Element Runtime Permission PJV02 12

java.lang Number Byte Short Character Character. Subset Character. static Math Integer Boolean UnicodeBlock java.awt InputSubset StrictMath Long Float Package Double Wrapper classes java.math Compiler BigInteger Process Builder java.math BigDecimal Comparable <T> podle typu Void PJV02 13

PJV02 14 java.lang IndexOutOf Bounds ArrayIndexOutOf Bounds StringIndexOutOf Bounds NullPointer Runtime Arithmetic ArrayStore ClassCast IllegalArgument NumberFormat IllegalMonitor State NegativeArray Size Unsupported Op ClassNotFound CloneNotSupported IllegalAccess IllegalThread State Illegal State Instantiation Interrupted NoSuchField NoSuchMethod Security Throwable EnumConstNot Present TypeNot Present unchecked checked

Throwable unchecked Linkage java.lang Assertion ClassCircularity ThreadDeath ClassFormat UnsupportedClass Version Virtual Machine IncompatibleClass Change Abstract Method Unknown In IllegalAccess Initializer StackOverflow NoClassDef Instantiation Found OutOfMemory Unsatisfied NoSuchField Link Internal Verify NoSuchMethod PJV02 15

Třída java.lang.object kořenem jediného stromu všech tříd. Nemá žádné dostupné atributy, má jen implicitní konstruktor a 11 přetížených, dostupných, instančních metod, které zdědí všechny další třídy. public boolean equals( Object obj ) - definuje relaci ekvivalence objektů: x.equals( y ) vrací true při identitě, tj. právě tehdy, když x = = y. Je-li tato metoda přepsána, je také nutno přepsat metodu hashcode pro dodržení uzance, aby ekvivalentní objekty vracely stejné hash kódy. public native int hashcode( ) - vracíčíslo, které dle uzance: - vrací totéžčíslo v jednom běhu - pokud se nezměnily žádné informace použité pro výpočet výsledku funkce equals( ). ( Např. deserializovaný transient atribut zhatí kontrakt. ) - ekvivalentní objekty - dle equals( ) - musejí vracet totéžčíslo. - neekvivalentní objekty - dle equals( ) - nemusejí vracet různáčísla. Důsledek pro objekty téže třídy: hash1!= hash2 pak o1!= o2. Dosti rovnoměrně rozrůzněnáčísla zlepšují funkci hešových tabulek. PJV02 16

Třída java.lang.object public final native Class<?> getclass( ) - vrací objekt typu Class, který popisuje jeho třídu a tak lze typ každého objektu přesně identifikovat. public String tostring( ) - vydává popisný řetěz. Doporučuje se tuto metodu v potomcích přepsat tak, aby vracený popisný řetěz vyjadřoval typ a stav objektu. Metoda se automaticky volá při konkatenaci a v metodách print(...) či println(...). public native final void wait(...) throws Interrupted - tyto metody umožňují zablokovat vlákno a zařadit ho do čekárny určitého objektu. A případně zadat maximální délku čekání. public native final void notifyall( ) - uvolňuje všechna vlákna z čekání. public native final void notify( ) - uvolňuje některé vlákno z čekání. PJV02 17

Třída java.lang.object protected native Object clone( ) throws CloneNotSupported - umožňuje mělké klonování potomků. protected void finalize( ) throws Throwable - tuto metodu volá garbage collector když hodlá objekt zrušit. Potomek může tuto metodu přepsat a provést: - nějaké úkony před zrušením objektu např. získat jeho data. Metoda musí zavolat super.finalize( ). - zachránit tento objekt tím, že předá jeho referenci objektu, který je referován nějakým živým vláknem. Garbage collector lze vyvolat metodou System.gc( ) či Runtime.gc( ), Sám se aktivuje při nedostatku požadované souvislé paměti Neaktivuje se při ukončování aplikace. PJV02 18

Třída String Řetězy tj. objekty typu String jsou imutabilní. Řetězové literály se ukládají do String Constant Poolu. char charat( int index ) int compareto( Object o ) String concat( String s ) boolean equals ( Object o ) boolean equalsignorecase ( String s ) int length( ) int indexof( String s ) int lastindexof( String s ) String[ ] split(string regex ) String replace( char old, char new ) String substring( int begin ) String substring( int begin, int end ) String trim( String s ) String touppercase( String s ) String tolowercase( String s ) PJV02 19

Třídy StringBuffer a StringBuilder Umožňují shodné operace s řetězy. StringBuffer je synchronizovaný, StringBuilder není ale je však rychlejší a doporučuje se. Oba nejsou Comparable a nemají přepsanou metodu equals. char charat( int index ) StringBuilder append( ) StringBuilder insert( int offset, ) StringBuilder delete( int begin, int end ) int length( ) int indexof( String s ) int lastindexof( String s ) String replace( char old, char new ) String reverse( ) String substring( int begin ) String substring( int begin, int end ) String trimtosize( ) String tostring( ) PJV02 20

Třída System má statické atributy: InputStream in, PrintStream out, PrintStream err a dále jen statické metody: void arraycopy( Object src, int spos, Object d, int dpos, int length ) - kopie long currenttimemillis( ) UTC čas v milisekundách void exit( int code ) ukončení aplikace void gc( ) spustí garbage collector - skrze Runtime.gc( ) Map<String, String> getenv( ) - informace o prostředí Properties getproperties( ) - vlastnosti prostředí void setproperties( Properties props ) - nastavení vlastnosti prostředí void load( String filename ) void loadlibrary( String filename ) String maplibraryname( String libname ) void setin( InputStream is ) void seterr( PrintStream ps ) void setout( PrintStream ps ) SecurityManager getsecuritymanager( ) PJV02 21