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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 



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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 



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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 



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á:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 



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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 



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).

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Á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.