Gyakorlati alapok III.
A main() tulajdonságai az osztályok környezetében
Egy rövid fejezet kedvéért el kell időznünk a main() főprogram tulajdonságainak magasabb szintű értelmezése felett, hiszen a Gyakorlati Alapok III. című fejezetcsomag ismerteti az objektumorientált programozás legfontosabb alkotóelemeinek, az osztályok működését és meg kell vizsgálnunk azok main() főprogramhoz fűződő viszonyát. Bevezetésképpen ismételjük az egyik legegyszerűbb futtatható Java-kódunkat:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Végeredmény:
Hello World!
class Main + Main.java
A fenti kód az Ön számítógépes környezetében csakis akkor lesz futtatható, ha az osztálynév (jelen esetben Main) és a kódot tartalmazó forrásállomány neve (jelen esetben Main.java) megegyezik; ezen egyezés nélkül fordítási hibát kapunk.
Amint azt Az adatok, metódusok elnevezésének problémái című fejezetben már tisztáztuk, a Java megkülönbözteti a kis-, és nagybetűket (case sensitive), így az alábbi betűpárosítás, valamint bármilyen variációi...
class Main + main.java
class main + Main.java
class Main + MAIN.java
stb.
...fordítási hibát fognak okozni.
A fentiek alapján már egyértelművé vált, hogy a Main osztálynév voltaképpen bármely szabványosnak mondható névre átnevezhető, ekkor tehát az osztálynévnek és a forrásállomány nevének kell pontosan megegyeznie, például:
class Alkalmazas + Alkalmazas.java
Ha a kódot egyszerű szövegszerkesztőben gépeljük be, akkor a keletkezett fájl kiterjesztését át kell neveznünk .java kiterjesztésre, például:
.txt -> .java
Figyelem! Bonyolultabb szövegszerkesztő használata esetén (például MS Word) egyéb, főként formázási karakterek is kerülhetnek a kódba, amelyet az Eclipse fordítási hibaként fog értékelni!
Java-projekt
Az Eclipse-ben sokféle, akár alapszintű kezdőállományt is létrehozhatunk, ám mégis érdemes kezdettől fogva inkább magasabb, projektszintről kiindulni. Egy Java-projektet az Eclipse önálló és egyszerre fordítható fordítási egységként értelmez, valamint egyúttal magas szinten rendszerez is.
Fordítás után a .java forrásállományok ugyanolyan névvel, de .class kiterjesztésű bájtkóddá szintén a megadott projekt-könyvtárba fordulnak le (Interpreter-compiler-linker-bytekód és egy kis pinjin-átírás című fejezet), de...
...minden osztály azonos néven külön .class kiterjesztésű bájtkód-állományba kerül, még akkor is, ha 1 db .java forrásállományban több osztály is volt!
Illetőleg importálás után külső, például API-osztályok is becsatlakozhatnak a projektbe.
Itt jegyezzük meg, hogy az API-osztálykönyvtár a Java-rendszer és környezet által voltaképpen folyamatosan használt, tehát elérhető jelenléte létkérdés az eredményes futtatáshoz, ám nem minden része az, ezért némelyik API-komponenst importálnunk kell, míg másokat nem.
1 vagy több osztály + main()
Egy Java-projekt 1 vagy több osztályt, vele .java forrásállományt is tartalmazhat. Alapjában véve nem alapkövetelmény, bár sok helyen mégis elvárt, hogy a projektben résztvevő .java forrásállomány csak 1 osztályt tartalmazzon (hiszen amint fentebb említettük, valójában tartalmazhat többet is). A kód átláthatósága, illetve magasabb szempontok szerinti rendszerezése érdekében azonban érdemes ezt, azaz az 1 osztály - 1 .java forrásállomány elvet követnünk, amint például én is teszem a Gyerekszámológép című projektemben:
Gyerekszamologep
-
package megjelenes
-
Ablak.java
-
Main.java
-
Nevjegy.java
-
Nyomogomb.java
-
Szinpaletta.java
-
-
package szamolas
-
Szamologep.java
-
A main() főprogramot tartalmazó osztálynak mindig publikusnak kell lennie!
Ha a projektben nincs main() főprogram, akkor a keletkezett állomány nem futtatható!
Bármennyi osztályt is tartalmaz a projekt, mégis csupán 1 db dedikált belépési pontja lehet, ez pedig valamelyik publikus osztályban 1 db main() főprogram.
Ugyanakkor semmit sem veszítünk, sőt, jobban rendszerezhetjük kódunkat, ha a main() főprogramot külön Main osztályba, vele külön .java forrásállományba tesszük. (Lásd a fenti gyerekszámolós példában!)
Több osztály + main()
Az Eclipse-n belül 1 projekt tartalmazhat több main() belépési pontot is. Ezt a lehetőséget nem javaslom, sőt a probléma kényes volta miatt külön fejezetben tárgyaljuk.
public static void main(String[] args)
Ezek már kizárólag a main() főprogram tulajdonságaihoz kötődnek:
-
public - A hozzáférés-módosítók című fejezet - A main() főprogramnak nyilvánosnak, mindenhonnan szabadon elérhetőnek kell lennie. Nélküle a programnak nem lesz belépési pontja, ezért nem tud lefutni.
-
static - Alapszinten a static módosítóról című fejezet - A static módosítóval illetett programkomponensek azonnal bekerülnek a műveleti memória egy, a JVM által kijelölt, statikus területére és onnan "nem is mozdulnak el". Pontosan ez a cél: hogy bizonyos programkomponensek számára jobban látható, stabilabb, ezáltal azonnali elérhetőséget biztosítson.
-
void - A main() főprogramnak nincs visszatérési értéke, azaz valójában nem függvény, "csak" eljárás.
-
String[] args - Egy .jar kiterjesztésű fájlt már parancssorból (konzolból) is indíthatunk (egy ehhez hasonló megoldás A "Hello World" Java-kód futtatása Windows-parancssorból című fejezetben tanulmányozható), a main() parancssoros futtatásához pedig további bemeneti paramétereket is beállíthatunk. Az args valójában bármire átnevezhető, például: String[] parameterek. Láthatóan itt a paraméterek típusa String tömb.