Metode

Să presupunem că în flow-ul programului, la un moment dat vrem să executăm un task foarte specific, bine definit, care se întinde pe mai multe linii de cod, cum ar fi citiriea unei variabile de la utilizator sau calcularea unui rezultat folosind niște operații complexe.

Pentru că este un task bine definit, pentru a ușura citirea codului programului, putem muta tot acest bloc de linii de cod în altă parte și să îl referim prin apelarea unui denumiri pe care să i-o dăm. În acest fel codul nostru este mai bine structurat, mai lizibil și poate rula mai eficient.

Pe scurt metodele sunt:

  • Mai multe instrucţiuni cărora li se dă un nume
  • O modalitate de a ne organiza codul în paşi
  • O modalitate de a apela de mai multe ori aceleaşi instrucţiuni

În teorie, metodele au mai multe componente. Vom studia pe rând fiecare din ele.

Blocuri cu nume

La modul cel mai simplu, putem clasifica metodele ca fiind nişte blocuri de instrucțiuni care au o denumire. Acestea împart programul în mai multe bucăţele pentru a ne putea focusa pe sarcinile importante, nu pe implementarea propriu-zisă.

import java.util.Scanner;

public class ReadingWriting {

    public static void main(String[] args) {
        citesteSiScrieNume(); // apelul metodei
    }

    // definirea metodei
    public static void citesteSiScrieNume() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Cum te cheama?");
        String nume = sc.next();
        System.out.println("Numele tau este " + nume);
    }

}

Puteţi observa că pentru a defini o metodă aceasta este definită între acoladele clasei, în afara altor metode. Aceasta trebuie să înceapă cu cuvintele cheie public, static şi void. Vei învăţa mai târziu ceea ce reprezintă acestea şi cu ce altceva pot fi înlocuite. Pentru moment este bine să le foloseşti la toate metodele. După acestea, vom scrie numele metodei, care este format din litere şi cifre fără spaţii între ele. După numele ei, vom pune parantezele (). Apoi vom deschide un set de acolade şi vom descrie instrucţiunile pe care vrem ca acestea să le execute.

Pentru a apela o metodă, va trebui să îi scriem numele, urmat de parantezele rotunde.

Unul din scopurile metodelor este de a fi apelate de mai multe ori. În exemplul de mai jos sunt create 2 metode, care sunt apelate din metoda main. De asemenea, o metodă poate fi apelată de oriunde (adică și din orice altă metodă), cu câteva restricţii pe care le vom discuta ulterior.

import java.util.Scanner;

public class ReadingWriting {

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

    public static void citesteSiScrieNume() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Cum te cheama?");
        String nume = sc.next();
        System.out.println("Numele tau este " + nume);
    }
    
    public static void citesteSiScrieVarsta() {
    	Scanner sc = new Scanner(System.in);
        System.out.println("Cati ani ai?");
        int age = sc.nextInt();
        System.out.println("Varsta ta este de " + age + " ani");
    }

}

Observă că denumirea metodelor, chiar dacă este uneori mai lungă ajută mai bine la înţelegerea acesteia, mai exact la înţelegerea codului care va fi executat de metodă.

Când rulezi codul de mai sus, îţi va cere numele, apoi vârsta, apoi alt nume.

Blocuri ca valori

Metodele ne pot da rezultate pentru porţiunea de cod pe care o execută. Pentru a avea acces la acest mecanism, trebuie să schimbăm tipul metodelor. Cele de mai sus sunt create cu void. În locul acestui cuvânt putem scrie orice tip de dată pe care vrem ca metoda noastră să îl întoarcă (sau să îl returneze).

Pentru a putea folosi acest mecanism, se va scrie cuvântul cheie return urmat de o valoare corespunzătoare cu tipul declarat. După return nu se va mai putea scrie nicio instrucţiune, acesta reprezentând terminarea metodei.

Valoarea întoarsă de o metodă poate fi folosită normal, ca valoarea oricărei variabile. În exemplul de mai jos, se foloseşte o metodă pentru a returna vârsta citită, şi altă metodă pentru a returna numele.

import java.util.Scanner;

public class ReadingWritting {

    public static void main(String[] args) {
        String nume = citesteNume();
        int varsta = citesteVarsta();
        System.out.println("Te cheama " + nume + " si ai " + varsta);
        System.out.println("Te cheama " + citesteNume());
    }

    public static String citesteNume() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Cum te cheama?");
        String nume = sc.next();
        return nume;
    }
    
    public static int citesteVarsta() {
    	Scanner sc = new Scanner(System.in);
        System.out.println("Cati ani ai?");
        int age = sc.nextInt();
        return age;
    }

}

Observaţi că metodele care au alt tip în afară de void sunt folosite ca oricare alte variabile, singura diferenţă fiind că acestea au paranteze la sfârșit. Valorile acestora pot fi atribuite unor variabile care au acelaşi tip sau pot fi doar afişate.

Blocuri care au nevoie de informaţii

Parantezele de la metode au un scop - să scriem lista de parametri în ele. Există cazuri în care vrem să definim o metodă care să facă diferite lucruri în funcţie de diferite valori. În exemplul de mai jos, în cadrul metodei dorim să afişăm numele folosind un mesaj generic. Dar nu cunoaştem numele de la început şi vrem ca mesajul să fie afişat pentru absolut orice nume. Vom defini astfel, ca parametru, o valoare de tipul String.

public class Parameters {

    public static void main(String[] args) {
        String numeleMeu = "Mihai";
        afisareNume(numeleMeu);
        afisareNume("Costica");
    }

    public static void afisareNume(String nume) {
        System.out.println("Imi pare bine de cunostinta, " + nume);
    }

}

Atunci când ne creăm metoda, în lista de parametri ne "declarăm" variabilele de care avem nevoie, folosind un nume oarecare. Pentru instrucțiunile din corpul metodei vom folosi variabilele definite aici (parametrii), iar acestea vor fi înlocuite automat de către Java cu valorile pe care i le trimitem atunci când apelăm metoda.

Deci, metoda va afişa acelaşi mesaj generic, prima dată pentru Mihai, apoi pentru Costica.

Urmăreşte următoarea metodă care primeşte ca parametri două numere întregi, calculează şi afişează suma lor.

public class Parameters {

    public static void main(String[] args) {
        calculeazaSuma(235, 876);  // valorile din paranteză vor fi trimise către metodă ca parametri
        calculeazaSuma(-60, 48);
    }

    public static void calculeazaSuma(int a, int b) { // a și b sunt variabile generice ce vor fi
        int suma;                                     // înlocuite cu valorile trimise la apelare
        suma = a + b;
        System.out.println("Suma este " + suma);
    }
    
}

Componentele unei metode

Aşa cum indică imaginea de mai sus, metodele au în componenţa lor următoarele elemente:

  • public - access modifier, modificator de acces care menționează că metoda poată fi văzută din toate clasele din aplicație
  • static - un cuvânt cheie pe care îl vom înțelege în viitorul apropiat
  • void / int / double / String / boolean - return type, adică tipul de date returnat de metodă
  • citeste() - denumirea metodei. Parantezele sunt obligatorii
  • în paranteze putem specifica niște variabile (parametri) care să primească valori din metoda care o apelează

Aşadar, toate elementele pe care le-am studiat mai sus, pot fi combinate în orice modalitate, încât putem avea metode cu parametri care să ne întoarcă o valoare.

public class Metode {

    public static void main(String[] args) {
        int sumaMea = calculeazaSuma(235, 876);
        System.out.println("Suma returnata de metoda este " + sumaMea);
    }

    public static int calculeazaSuma(int a, int b) {
        int suma;
        suma = a + b;
        return suma;
    }

}

Următorul program este un pic mai complex: acesta preia valorile returnate de anumite metode şi le transmite ca parametri altor metode.

import java.util.Scanner;

public class Metode {

    public static void main(String[] args) {
        String nume = citesteNume();
        int varsta = citesteVarsta();
        
        afiseazaInformatii(nume, varsta);
    }

    public static String citesteNume() {
        Scanner sc = new Scanner(System.in);
        String nume = sc.next();
        return nume;
    }
    
    public static int citesteVarsta() {
        Scanner sc = new Scanner(System.in);
        int varsta = sc.nextInt();
        return varsta;
    }
    
    public static void afiseazaInformatii(String nume, int varsta) {
        System.out.println("Imi pare bine de cunostinta, " + nume + "! Stiu ca ai " + varsta + " ani");
    }
    
}

Observaţi că am declarat de 2 ori câte o variabilă Scanner care are aceeaşi denumire în 2 metode diferite. Acest lucru este posibil deoarece domeniul de vizibilitate a variabilelor este limitat la interiorul blocului (respectiv al metodei) în care sunt definite. Deci, cele două variabile nu vor fi văzute în afara metodelor.

Mai observaţi și că variabilele returnate de metode au alte denumiri (în exemplele anterioare) sau aceleaşi denumiri (în ultimul exemplu) faţă de variabilele în care sunt salvate. Acest lucru este valabil tot datorită domeniului de vizibilitate. Chiar dacă numele sunt la fel, ele sunt variabile diferite ce pot stoca valori diferite. Rezultatul metodei sau ceea ce aceasta întoarce este valoarea şi nu variabila scrisă după return.

Exerciţii

1. Să se creeze o metodă public static void sayHello() care afișează "Hello" de 10 ori. Să se invoce metoda.

Soluţie

Soluţie

public class Metode {

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

    public static void sayHello() {
        System.out.println("Hello");
        System.out.println("Hello");
        System.out.println("Hello");
        System.out.println("Hello");
        System.out.println("Hello");
        
        System.out.println("Hello");
        System.out.println("Hello");
        System.out.println("Hello");
        System.out.println("Hello");
        System.out.println("Hello");
    }
    
}


2. Să se creeze o metodă public static void afiseazaNr(int nr) care afişează numărul primit ca parametru. Numărul este introdus de la tastatură. Să se invoce metoda.

Soluţie

Soluţie

import java.util.Scanner;

public class Metode {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int nr = sc.nextInt();
        afiseazaNr(nr);
    }

    public static void afiseazaNr(int numar) {
        System.out.println("Numarul introdus este " + numar);
    }
    
}


3. Să se creeze o metoda public static int ridicaLaPatrat(int nr) care returnează pătratul unui număr. Numărul este introdus de la tastatură în altă metodă şi returnat ca parametru. Să se invoce metoda.

Soluţie

Soluţie

import java.util.Scanner;

public class Metode {

    public static void main(String[] args) {
        int nr = citesteNumar();
        int patrat = ridicaLaPatrat(nr);
        System.out.println("Patratul numarului este " + patrat);
    }

    public static int citesteNumar() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Citeste un numar de la tastaura si apasa enter:");
        int x = sc.nextInt();
        return x;
    }
    
    public static int ridicaLaPatrat(int numar) {
        int patrat = numar * numar;
        return patrat;
    }
    
}


4. Să se ţină cont de cerinţa de mai sus, dar să se creeze o metodă care returnează cubul unui număr (numărul la puterea a treia).

Soluţie

Soluţie

import java.util.Scanner;

public class Metode {

    public static void main(String[] args) {
        int nr = citesteNumar();
        int patrat = ridicaLaCub(nr);
        System.out.println("Patratul numarului este " + patrat);
    }

    public static int citesteNumar() {
        Scanner sc = new Scanner(System.in);
        System.out.println("Citeste un numar de la tastaura si apasa enter:");
        int x = sc.nextInt();
        return x;
    }
    
    public static int ridicaLaCub(int numar) {
        int patrat = numar * numar * numar;
        return patrat;
    }
    
}


You could leave a comment if you were logged in.