Gyakorlati alapok III.
1 osztály + több main()
A tanítványi kérdés a következő volt: Létre tudunk-e hozni a
Main osztályon belül és a
main() főprogram mellett egy másik
main() metódust?
Igen, de kezdjük még távolabbról és lépésről lépésre haladva!
Bevezetésképpen először is nézzünk meg egy olyan kódot, amelyben a
Main osztályt példányosítjuk, ám a nevek,
azaz a referenciák még különbözőek (Ezt sajnos most kell tisztáznunk: mutató és referencia
című fejezet). A Main
osztályon belül van egy message() nevű
üdvözletkiíró metódusunk, ezt szeretnénk futtatható állapotba hozni:
public class Main {
public void message() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
Main m = new Main();
m.message();
}
}
Végeredmény:
Hello world!
Az m referencia (Main m
= new Main()) átnevezhető main
referenciára is, a rendszernek ez nem okoz gondot:
public class Main {
public void message() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
Main main = new Main();
main.message();
}
}
Végeredmény:
Hello world!
Közelítsünk az eredeti kérdéshez: most a message()
metódusnevet is átnevezzük main referenciára.
Ekkor tehát már 2 db main() metódusunk van:
public class Main {
public void main() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
Main main = new Main();
main.main();
}
}
Végeredmény:
Hello world!
A rendszer még mindig tud különbséget tenni. Most az üdvözletkiírós
main() metódust is tegyük szintén statikussá:
public class Main {
public static void main() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
Main main = new Main();
main.main();
}
}
Végeredmény:
Hello world!
A kód még mindig gond nélkül lefut. De miért? - vetődik fel a kérdés. Nos,
mert a main() főprogram és a
main() metódus szignatúrái még mindig
különbözők, erről értekeznek a következő fejezetek:
Egyedül akkor lesz ütközés, ha az üdvözletkiíró main() metódus szintén kap egy String[] típusú bemeneti paramétert:
public class Main {
public static void main(String[] tomb) {
System.out.println("Hello world!");
}
public static void main(String[] args) {
Main main = new Main();
main.main();
}
}
Végeredmény:
Duplicate method main(String[]) in type Main
Láthatjuk, hogy itt már az sem számít, ha a bemeneti paraméternek más a
neve (itt tomb).
Ezzel a kis példával tehát leteszteltük a rendszer ilyen jellegű határait,
ez pedig a szignatúra-azonosság vagy különbözőség. Következésképpen a
main() főprogram, vele minden metódus
túlterhelhető (overloading –
Ahol az elnevezésnek köze nincs a tartalomhoz: a metódus-túlterhelés
című fejezet).
Ám ezt semmiféleképpen ne alkalmazzuk a main() főprogramon vagy annak közvetlen környezetében, mert ez még működőképessége ellenére is kapitális hibának számít.