1. óra (2012.09.11.)
Java programok fordítása, futtatása
A Java fordító például a C++-tól eltérően nem állít elő natív gépi kódot, így az közvetlenül nem is futtatható, a lefordított bájtkód végrehajtását a Java Virtuális Masina (JVM) végzi. A virtuális géppel való futtatáshoz a java parancsot szükséges kiadnunk, azonban paraméterként nem fájlnevet vár, hanem osztálynevet (lásd az alábbi példákban).
Fájl elnevezése: egy fájlba egy publikus osztály kerülhet, amelynek meg kell egyeznie a fájl kiterjesztés nélküli nevével. Azaz például a
public class HelloWorld{ public static void main(String[] args) { System.out.println("Hello World!"); } }
programkód egy HelloWorld.java fájlba kell, hogy kerüljön. Ebben az esetben a fordítás és futtatás nagyon egyszerű (tegyük fel, hogy a fájlt tartalmazó könyvtárban "álunk"):
javac HelloWorld.java java HelloWorld
Fontos: fordításnál a fájlnév relatív elérési útvonallal, futtatáskor az osztálynév (ha csomagba ágyazott, akkor minősített névvel).
Vezérlési szerkezetek szintaxisa
Kb. C++.
// elágazás if (boolean_kifejezés) { // utasítások } else if (boolean_kifejezés) { // utasítások } else { // utasítások } // többágú elágazás (switch) switch (vmi) { case vmi1: // utasítások case vmi2: // utasítások case vmi3: // utasítások break; default: // utasítások } /* alkalmazható típusok (itt a vmi típusa): byte, short, char, int és csomagolóosztályaik (Byte, Short, Character, Integer), enum-ok */ // for ciklus for (int i = 0; i < 10; i++) { // utasítások } // elöltesztelős ciklus while (boolean_kifejezés) { // utasítások } // hátultesztelős ciklus do { // utasítások } while (boolean_kifejezés); /* Ciklusokhoz: van break (címkézhető is!) és continue is. */
Konvenciók
Indentálás (tabolás): lásd a vezérlési szerkezetek példáit.
Névkonvenció: csomagnevek csupa kicsivel, osztálynevek PascalCase stílusban, metódus- és változónevek camelCase stílusban.
Alaptípusok
Primitív típusok: byte, short, int, long, float, double, boolean, char. Ezek csak értékek! A végrehajtási vermen foglalódnak, közvetlenül nem érhetők el rajtuk műveletek (pl. toString, parse műveletek). Megjegyzés: mindegyik számot reprezentáló típus előjeles, nincs unsigned.
Csomagolóosztályok: a fentiekhez tartozó Byte, Short, Integer, Long, Float, Double, Boolean, Character osztályok.
int i = 5; Integer iWrapper = Integer.valueOf(i); String string = iWrapper.toString(); // vagy Integer iWrapper = Integer.valueOf(5); String string = iWrapper.toString(); // lehetne, de inkább ne használjuk (lásd beépített cachek): Integer iWrapper = new Integer(i);
String osztály (nincs hozzá tartozó primitív típus (mi is lenne?...)).
Csomagok
Hierarchikus egymásbaágyazás, a csomagok hierarchiáját reprezentálja a forráskódokhoz tartozó könyvtárszerkezet. Lásd a csomagos és az állatos feladatot.
Szemétgyűjtő (Garbage Collector)
Egész jó leírás és legalább magyar: http://hu.wikipedia.org/wiki/Garbage_collection.
Egyenlőségvizsgálat
A más nyelvekben megszokott == használata nem várt működéshez vezethet, itt ez – a primitíveket leszámítva – referenciaegyenlőséget jelent, azaz az operandusok egyezőségét vizsgálja (mindkét referencia ugyanarra az objektumpéldányra mutat-e).
Referenciatípusok esetén célszerű az equals metódust használni:
String alma1 = "alma"; String alma2 = "alm" + "a"; String alma3 = new String("alma"); String alma4 = "alm" + getChar();
Az alma1 és alma2 változók ugyanarra az objektumpéldányra fognak mutatni, ugyanis a Java fordítási időben kiértékeli az alma2 jobb oldalán álló kifejezést, a memóriafoglalást csökkentendő pedig az azonos szövegek nem foglalódnak külön karakterláncként. Eredmény: az alma1 == alma2 kifejezés értéke true.
Az alma3 esetén explicit új String példányt hoztunk létre, tehát az alma1 == alma3 kifejezés értéke false, azonban az alma1.equals(alma3) vagy az alma3.equals(alma1) kifejezés értéke igaz.
Az alma1 == alma4 kifejezés értéke szintén hamis, alma4 változó jobboldala futási időben kerül kiértékelésre.
Házi feladat
Keressük meg azon p számokat, amelyekre prim(p) ÉS p2|(p-1)!+1 tulajdonság igaz. A faktoriális kiszámítás során alkalmazzatok rekurzív függvényt, és a prímtesztelésre is írjatok külön függvényt! Megjegyzés: mivel a faktoriális nagyon gyorsan nő, a 32 bites int alaptípussal ábrázolható legnagyobb faktoriális szám a 12!, így maximum a 13-as szám tesztelhető még. Így csak két Wilson-prím található meg, mind a három ismert Wilson-prímet megtalálálásához ajánlom a java.math.BigInteger osztályt.