A Java programozási nyelv PPKE-ITK A Java programozási nyelv Programozási nyelvek és módszerek 1.gyakorlat Laki Sándor Email: lakis@inf.elte.hu lakis@inf.elte.hu
Követelmények Nagy házi (határidő: május 12. 24:00) 2 db ZH: beugró + géptermi ZH ZH-k időpontja: 1.ZH április 26., Szerda, 16-19 2.ZH május 22. , Hétfő, 9-12 PótZH és UV szeptemberben lakis@inf.elte.hu
Tematika Eclipse IDE C++-ról Javara Típusok, tömbök, osztályok, interface … Kivételkezelés, öröklődés Collection Framework Template … lakis@inf.elte.hu
A nyelvről röviden SUN Microsystems gyermeke Különböző kiadások: J2SE,J2EE,J2ME Mi a J2SE 1.5 –tel foglalkozunk A JAVA ősei: SmallTalk ill. a C++ Jelölésrendszere a C++ -ból átvett DE figyelem a szemantika nem mindenütt ugyanaz!!! lakis@inf.elte.hu
A nyelvről röviden Mutatók helyett referenciák! Futtató környezet(interpretált nyelv) => BÍZTONSÁGOS fejlesztés… lakis@inf.elte.hu
Interpretált jelleg Futtatás szintje Java sourcecode Solaris Virtual Machine Compiler(javac) … Windows XP Virtual Machine Java bytecode környezetfüggetlen lakis@inf.elte.hu
Különbségek a C++-tól Interpretált jelleg Nincsenek mutatók Tisztán OO nyelv( a C++ multiparadigmás) Egy java program objektumok és ezek mintáiúl szolgáló osztályok összessége. Minden fv. valamely osztály tagfv.-e! lakis@inf.elte.hu
Típusrendszer lakis@inf.elte.hu
Típusok C++ szemmel C/C++ -ban a beépített típusok pontos mérete és értéktartománya nincsen definiálva(pl. char előjeles vs előj. nélk.) Bár vannak garanciák: pl. short int legalább 16 bites… Oka: a C++ filozófiája(max. optimalitás minden platformon) lakis@inf.elte.hu
Mi a helyzet a Javaval? Cél: bináris kompatibilitás Ezért az egyes típusok mérete és értéktartománya is platformfüggetlen kell legyen Erős korlátozások a primitív típusokkal szemben (nem lehet futási időben létrehozni őket) Példányaik nem objektumok java értelemben lakis@inf.elte.hu
Primitív típusok és burkolók Méret Wrapper Hasonló C++ byte 8bites előjeles egész Byte signed char short 16bites előjeles egész Short int 32bites előjeles egész Integer long 64bites előjeles egész Long long long boolean Logikai (nem egész!) Boolean bool float 32bites lebegőpontos Float double 64bites lebegőpontos Double char 16bites Unicode kar. Character wchar_t lakis@inf.elte.hu
Primitív típusok Ilyen típusú változókat nem hozhatunk létre futási időben, ezek nem számítanak objektumoknak Változókat adhatunk át metódushíváskor Primitív típusokat érték szerint Míg objektumokat referencia szerint lakis@inf.elte.hu
Egy-két különbség a C++-hoz Nincsenek mutatók Nincsen delete A garbage collector automatikusan szabadítja fel az objektumokat Konstruktorok vannak Destruktorok nincsenek ( esetleg finalize()) lakis@inf.elte.hu
HelloWorld.java public class HelloWorld { Konvenció: A java osztályok neve nagy betűvel kezdődik! HelloWorld.java public class HelloWorld { public static void main(String[] args) System.out.println(”Hello World”); } A minden publikus osztályt külön – az osztály nevének megfelelő java kiterjesztésű – fájlba kell írni. Van egy kitüntetett osztály aminek van egy static main metódusa, ez lesz a főprogram! lakis@inf.elte.hu
Fontos A main metódus szignatúrája a következő KELL legyen: public static void main(String[] args) Ez C++-ban úgy volt: int main(int argc, char** argv); A statikus metódusok futtathatók példányoktól függetlenül. Futtatásnál a VM –nek megmondjuk, melyik a „főosztály”, aminek a main metódusát meg kell hívnia. Így indul a prg. lakis@inf.elte.hu
Eclipse IDE Letölthető a www.eclipse.org -ról Itt egy kis demózás jön… Kommentek, javaDoc Jar készítése Manifest fájl lakis@inf.elte.hu
Ismerkedés – Eclipse demo Algoritmus implementációk N! ciklussal VS rekurzív fv.-nyel LegNagyobb Közös Osztó ( külön statikus memberfv.-be) lakis@inf.elte.hu
Változók Stack – Heap ?mi is ez? int i; long big = 100000; boolean logical = true; String str = new String(”alma teve”); // ez objektum nem primitív típ. Vált. // az str úgy használható, mint C++-ban a mutató // (term. Ez egy referencia. ) String str2 = ”alma teve”; // String obj. Tartalmát nem lehet módosítani MyClass my = new MyClass(); lakis@inf.elte.hu
Hozzáférési kategóriák private Névtelen (félnyílvános-csomagszintű) protected public lakis@inf.elte.hu
Ami eddig kimaradt Betűkészlet azonosítókban: a Unicode 2.0 betűi Miért publikus/félig nyitott/private az osztály? Egybe tartozó részeket csomagokba tesszük! lakis@inf.elte.hu
Csomagoljunk Osztályainkat csomagokba szervezzük Csomagok nem ágyazhatók egymásba Azonos csomag osztályai látják egymást Ha más csomag osztályát használom, akkor minősítés v./és import a fájl elején import org.apache.xerces.sax.XMLReader; import org.apache.xerces.sax.*; lakis@inf.elte.hu
Csomagoljunk Azt, hogy az adott osztály melyik csomagban van, a fájl eleji package kulcsszóval adjuk meg. Ha nem adunk meg semmit, akkor a default csomag. package org.menrod.core; public class XMLPair { //variables protected String namespace = null; protected String element = null; … Az XMLPair az org.menrod.core nevű csomagba került! lakis@inf.elte.hu
Konstruktorok Ha nem adunk meg, akkor alapértelmezetten hozzáad egy ürest Ha megadunk egyet, és azt akarjuk, hogy létezzen üres konstr., akkor explicit meg kell adnunk!!! public class MyClass { // alapértelmezetten // létrejön egy def. // konstr. } public class MyClass { public MyClass(int i) { } } lakis@inf.elte.hu
Datum.java public class Datum { protected int ev; protected int ho; protected int nap; public Datum(int ev, int ho, int nap) { this.ev = ev; this.ho = ho; this.nap = nap; } } // end of Datum Nincs a végén pontosvessző!!!! lakis@inf.elte.hu
Example1.java public class Example1 { public static void main(String[] args) { Datum d = new Datum(2006,02,16); } lakis@inf.elte.hu
Bővítsük a „Datum”-ot public class Datum { protected int ev; protected int ho; protected int nap; public Datum(int ev, int ho, int nap) { … } public String kiir() { System.out.print(ev + ”.” + ho + ”.” + nap + ”\n”); return ev + ”.” + ho + ”.” + nap; } // end of Datum lakis@inf.elte.hu
Example2.java public class Example2 { public static void main(String[] args) { Datum d = new Datum(2006,02,16); d.kiir(); // de lehet így is System.out.println( d.kiir() ); // vajon ez mit ír ki: System.out.println( d ); } lakis@inf.elte.hu
1. Feladat Készíts egy motor nevű publikus osztályt! Attribútumok(legyenek protectedek): Hengerűrtartalom Teljesítmény Gyártás ideje( a korábbi Datum ) Legyen egy konstruktora, ahol ezeket be lehet állítani! Műveletek: getHUT getTeljesitmeny getGyartasiIdo ill. setGyartasiIdo(Datum d) lakis@inf.elte.hu
Referencia átadása public class Example3 { public static void main(String[] args) { Datum d = new Datum(2006, 02, 16); Motor m = new Motor(1998, 130, d); d.setEv(2009); m.getGyartasiIdo().kiir(); //???2006 v. 2009 lesz??? // lehetne így is m = new Motor(1198, 65, new Datum(2000, 1, 1) ); } lakis@inf.elte.hu
2.Feladat Készíts egy Gepkocsi osztályt! Attribútumok: Műveletek: Motor Gyártási idő Megtett kilométerek Műveletek: getEvjarat getMotor getKilometerek lakis@inf.elte.hu
Objectum hierarchia, operátorok Operátorok primitíveken ugyanúgy, ahogy C++-ban Objektum változóin/referenciákon a hagyományos operátorok olyanok, mint ha C++-ban mutatókon végeznénk ezeket. == helyett equals lakis@inf.elte.hu
Tömbök Tömb változók deklarációja: int t[]; int[] t; Változó dekl. nem hozza létre a tömböt Tömb típusok olyanok, mint az osztályok. Lesznek attribútumaik… Objektumok csak dinamikusan allokálhatók, hasonló a C++ dinamikus tömbkezeléséhez Hibásak: int t[10]; int[10] t; lakis@inf.elte.hu
Tömbök Tényleges objektumok létrehozása: Tömb vált. csak referencia int t[] = new int[10]; int[] t = new int[10]; int[] t = { 1, 2, 3, 4 }; t = new int[] { 1, 2, 3, 4 }; Tömb vált. csak referencia Tömbök 0-tól indexelődnek A hossz lekérdezése: t.length Tömb indexelése: t[i] Kivételt dob, ha elindexelünk ArrayIndexOutOfBoundsException lakis@inf.elte.hu
Objektumok tömbje Referenciákból álló tömb MyClass[] t = new MyClass[10]; for (int i=0; i<t.length; i++) t[i] = new MyClass(…); MyClass[] t = { new MyClass(…), new MyClass(…), … }; lakis@inf.elte.hu
Többdimenziós tömbök Nincs többdimenziós tömb, de helyette tömbök tömbje Hasonlóan a dinamikus C++-os módszerhez int[][] mx = new int[4][3]; for (int i=0;i<4;i++) for (int j=0;j<3;j++) mx[i][j] = i + j; int[][] mx; mx = new int[4][]; for (int i=0;i<4;i++) for (int j=0;j<3;j++) mx[i][j] = i + j; lakis@inf.elte.hu
Feladatok Írj verem típust(osztályt)! Amiben int-eket tárolhatsz! A megvalósításhoz használj tömböket! Írd át láncoltlistásra! Írj mátrix típust, annak műveleteivel! Figyelem operátorok túlterhelésére javaban nincs lehetőség!!!! lakis@inf.elte.hu