arckép

Neuwirth István

programtervező informatikus MSc – ELTE

Computational and Software Techniques MSc – Cranfield, UK

Elérhetőség
pitta2@gmail.com
+36 30 329 3039

Valid XHTML 1.0 Transitional

Valid CSS!

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.

Feladatok

Letöltés

Vissza