Lecții din modul (2/2)
Metode și supraîncărcare
Metodele definesc comportamentul unui obiect. Ne putem gândi la ele ca funcții declarate în interiorul unei clase care operează pe câmpurile de instanță ale obiectului sau parametrii de intrare.
Definirea unei metode
O metodă în Java constă din:
- Modificator de acces (de exemplu,
public,private). - Tip de returnare (de exemplu,
int,Stringsauvoiddacă nu returnează nimic). - Numele metodei în
camelCase. - Parametri încadrați în paranteze.
- Corpul metodei închis în bretele.
class Person {
String name;
public Person(String name) {
this.name = name;
}
// Method with return type String
public String greet() {
return "Ciao, mi chiamo " + name;
}
}Apelarea unei metode
Pentru a invoca o metodă pe un obiect creat, folosim notația cu puncte .:
public class Main {
public static void main(String[] args) {
Person p = new Person("Marco");
String message = p.greet(); // Calling the method
System.out.println(message);
}
}Supraîncărcarea metodei
În Java, două sau mai multe metode din aceeași clasă pot avea același nume, atâta timp cât au o listă de parametri diferiti (în număr, ordine sau tipuri de parametri). Acest concept este cunoscut sub numele de Supraîncărcare.
Compilatorul decide ce metodă să invoce analizând argumentele transmise în timpul apelului.
class Printer {
// Method to print an integer
public void printValue(int number) {
System.out.println("Intero: " + number);
}
// Overloaded method to print a string
public void printValue(String text) {
System.out.println("Testo: " + text);
}
}Parametrul trece prin valoare
În Java, toți parametrii sunt transferați după valoare (pass-by-value). Aceasta înseamnă că atunci când treceți un argument unei metode, Java creează o copie a valorii variabilei și o transmite metodei.
- Pentru tipurile primitive, valoarea originală din afara metodei nu se schimbă niciodată, chiar dacă este modificată în interiorul metodei.
- Pentru obiecte/referințe, referința la obiect este copiată. Aceasta înseamnă că, deși nu putem schimba adresa de memorie către care obiectul inițial indică, putem modifica starea sa internă (de exemplu, câmpurile) și acele modificări vor fi vizibile în exterior.
Limitări de supraîncărcare: Tipul de returnare
Este important să rețineți că nu puteți supraîncărca o metodă bazată exclusiv pe tipul de returnare. De exemplu, următorul cod va provoca o eroare de compilare:
class Example {
// ERROR: The signature of the two methods is considered identical
public int getNumber() { return 42; }
public double getNumber() { return 42.0; }
}Compilatorul trebuie să facă distincția între metodele bazate doar pe parametrii pentru a decide ce versiune să apeleze la compilare (supraîncărcarea este rezolvată la compilare).
Încercați-l singur
Adăugați o metodă public int add(int a, int b) la clasa Calculator care returnează suma celor două numere. În metoda principală, apelați această metodă pe obiectul calc și atribuiți rezultatul unei variabile întregi.
Afișează indiciu
Declarați metoda ca `public int add(int a, int b) { return a + b; }` și invocați-l în metoda principală ca `int result = calc.add(5, 10);`.
Soluție disponibilă după 3 încercări
Supraîncărcați metoda add din clasa Calculator prin crearea unei alte metode care acceptă doi parametri dubli și returnează suma acestora.
Afișează indiciu
Scrie `public double add(double a, double b) { return a + b; }` direct sub prima metodă de adăugare.
Soluție disponibilă după 3 încercări
Adăugați o metodă public int multiplicare(int a, int b) la clasa Calculator care returnează produsul celor două numere. În metoda principală, apelați această metodă pe obiectul calc și atribuiți rezultatul unei variabile întregi.
Afișează indiciu
Declarați metoda ca `public int multiplicare(int a, int b) { return a * b; }` și invocați-l în metoda principală ca `int result = calc.multiply(5, 10);`.
Soluție disponibilă după 3 încercări