Gyakorlati alapok II.

Külön (nem rendőrségi) eljárás

 

Az eljárás és függvény fogalmainak tisztázása már alapszinten megtörtént az Adat, művelet, metódus, osztály, csomag, objektum című fejezetben. Fontossága miatt a vonatkozó szöveget ide másolom:

 

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

 

A metódus bemeneti adato(ka)t és legtöbbször több műveletet foglal magába, valamint általában egy, de a műveletnél magasabb szintű probléma megoldására hivatott. Ilyen lehet például a százalékszámítás, amely során 2, esetleg 3 bemeneti adat felhasználásával osztanunk és szoroznunk is kell (lásd az alábbi, nem futtatható Java-kódot).

 

A metódus további fontos tulajdonsága, hogy lehet 1 visszatérési értéke (return), amely voltaképpen a metódus egyetlen kimeneti adata. (A metódusnak lehet több kimeneti adata is, ha összetett típusba, például tömbbe van csomagolva.) Ezzel valójában nem mondtunk újat, mert a cél mindig is a helyes kimeneti adat produkálása volt, de ha megtesszük, hogy a metódust egyetlen, kívülről nem, vagy csak nagyon szabályozott feltételekkel módosítható egységbe zárjuk, akkor programozás-technikailag nagyot léptünk egy új, még fejlettebb irányba, ez pedig az objektumorientált programozás.

 

Az újfajta metódusszemlélet azonban még tovább fokozható: számos metódust előre megírhatunk és később könnyen felhasználhatjuk őket, ha pedig rendszerezve lesznek, akkor egy elképesztően praktikus „programozási közkönyvtárrá” fognak válni.

 

Az alábbi futtatható Java-kódban egy százalékszámító metódus 2 bemeneti paramétert vár, amelyből 1 kimeneti adatot állít elő. Ez az előre gyártott kód azonban bármelyik projektbe megfelelően beillesztve azonnal képes százalékszámításra:

 

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

 

 

 

 

 

 

 

 

public class Main {
public static double szazalekSzamitas(double szazSzazalek, int szazalek){
    double eredmeny = 0;
    double egySzazalek = szazSzazalek / 100;
    eredmeny = egySzazalek * szazalek;
    return eredmeny;
}

public static void main(String[] args) {
    double szazSzazalek = 50;
    int szazalek = 20;
    double eredmeny = szazalekSzamitas(szazSzazalek, szazalek);
    System.out.println(eredmeny);
    }
}

 

Végeredmény:

10.0

 

A fenti algoritmus kissé tömörebben:

 

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

 

 

 

 

 

 

 

 

public class Main {
public static double szazalekSzamitas(double szazSzazalek, int szazalek){
    return (szazSzazalek / 100) * szazalek;
}

public static void main(String[] args) {
    double szazSzazalek = 50;
    int szazalek = 20;
    System.out.println(szazalekSzamitas(szazSzazalek, szazalek));
    }
}

 

Végeredmény:

10.0

 

Néhány régebbi programozási szakkönyvekben a metódus, mint fogalom kétféle formában kerül definiálásra:

Újabb szakkönyvekben már nem találkoztam ilyen definícióval, noha a metódus szinonimájaként ezekben is használatosak az említett szavak, főként a függvény. Példák:

A fenti definíciók tehát remek gyakorlati kiindulópontként szolgálhatnak néhány példához. Kezdjük a példálózást az eljárással!

 

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

 

Ismétlésképpen: az eljárás olyan metódus, amelynek nincs kimeneti értéke (void).

 

Először vegyünk egy üres main() függvényt, amint azt tettük például A main() tulajdonságai című fejezetben:

 

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

 

 

 

 

 

 

 

 

public class Main {
    public static void main(String[] args) {

    }
}

 

Ugyan ez a függvény nem csinál semmit, de már megvan a működéshez szükséges kódkeret. Írjunk ki egy hibaüzenetet a konzolra:

 

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

 

 

 

 

 

 

 

 

public class Main {
    public static void main(String[] args) {
        System.out.println("Ez egy hibaüzenet!");
    }
}

 

Végeredmény:

Ez egy hibaüzenet!

 

Láthatjuk: a hibaüzenet a főprogramon (main) belül van. Most pedig ezt a hibaüzenetet tegyük ki a Main osztályon belül egy külön eljárásba. No, ez nem lesz zökkenőmentes!

www.informatika-programozas.hu - Ez a programozási feladat nehéz lesz!

 

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

 

 

 

 

 

 

 

 

public class Main {


    public static void hibaUzenet(){
        System.out.println("Ez egy hibaüzenet!");
    }

    public static void main(String[] args) {
        hibaUzenet();
    }
}

 

Végeredmény:

Ez egy hibaüzenet!

 

A végeredmény ugyanaz, ám a kódban fontos újdonságok tapasztalhatók. Vegyük őket sorra:

Mivel a hibaUzenet() metódus static jelzővel illetett, a main futtatásának pillanatában azonnal létrejön (azaz példányosított), ezért a főprogramban elég csak a nevével hivatkozni rá:

 

    public static void main(String[] args) {
        hibaUzenet();
    }
}

 

Ha azonban a static jelzőt elvesszük a Hibauzenet() metódus fejlécéből...

 

public void hibaUzenet()

 

...futtatás esetén a következő hibaüzenetet kapjuk:

 

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static method Hibauzenet() from the type Main

at Main.main(Main.java:7)
 

Ezt azt jelenti, hogy mivel a hibaUzenet() metódus nem statikus, a main futtatásának pillanatában a JVM nem találja, mert kódja nincs a műveleti memóriában. E mögött egy egyszerű hozzáférési szabály húzódik meg:

 

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

 

Statikus változók és metódusok nem férhetnek hozzá NEM statikus változókhoz, metódusokhoz. Viszont NEM statikus változók és metódusok hozzáférhetnek  statikus változókhoz, metódusokhoz, hiszen éppen ez a statikusság fő előnye.

 

Érdekességként az alábbi kódban megnézhetjük, hogy miként lehet kikerülni a fenti problémát, azaz miként tudjuk mégis elérni a Main osztályon belüli, de nem statikus metódust. Az eljárás hajmeresztő, alkalmazását nem javaslom, de érdekességnek megteszi:

 

www.informatika-programozas.hu - Érdekes, futtatható Java-kód!

Érdekes futtatható Java-kód! - Miként tudjuk elérni az osztályon belüli, de nem statikus metódust?