Lezioni del modulo (2/2)
Metodi e Overloading
I metodi definiscono il comportamento di un oggetto. Possiamo vederli come funzioni dichiarate all'interno di una classe che operano sui campi istanza dell'oggetto o sui parametri in ingresso.
Definire un Metodo
Un metodo in Java è composto da:
- Modificatore di accesso (es.
public,private). - Tipo di ritorno (es.
int,String, ovoidse non restituisce nulla). - Nome del metodo in
camelCase. - Parametri racchiusi tra parentesi tonde.
- Corpo del metodo racchiusi tra parentesi graffe.
class Person {
String name;
public Person(String name) {
this.name = name;
}
// Metodo con tipo di ritorno String
public String greet() {
return "Ciao, mi chiamo " + name;
}
}
Chiamare un Metodo
Per invocare un metodo su un oggetto creato, usiamo la sintassi del punto .:
public class Main {
public static void main(String[] args) {
Person p = new Person("Marco");
String message = p.greet(); // Chiamata del metodo
System.out.println(message);
}
}
Sovraccarico dei Metodi (Method Overloading)
In Java, due o più metodi all'interno della stessa classe possono avere lo stesso nome, a patto che abbiano una lista di parametri diversa (per numero, ordine o tipo di parametri). Questo concetto è noto come Overloading.
Il compilatore deciderà quale metodo invocare analizzando gli argomenti passati durante la chiamata.
class Printer {
// Metodo per stampare un intero
public void printValue(int number) {
System.out.println("Intero: " + number);
}
// Metodo sovraccaricato per stampare una stringa
public void printValue(String text) {
System.out.println("Testo: " + text);
}
}
Passaggio dei Parametri per Valore
In Java, tutti i parametri vengono passati per valore (pass-by-value). Questo significa che quando si passa un argomento a un metodo, Java crea una copia del valore della variabile e la passa al metodo.
- Per i tipi primitivi, il valore originale all'esterno del metodo non cambia mai, anche se viene modificato all'interno del metodo.
- Per gli oggetti/riferimenti, viene copiata la referenza all'oggetto. Questo significa che, mentre non possiamo cambiare l'indirizzo a cui punta l'oggetto originale, possiamo modificarne lo stato interno (es. i campi) e le modifiche saranno visibili all'esterno.
Limitazioni dell'Overloading: Il Tipo di Ritorno
È importante sottolineare che non è possibile sovraccaricare un metodo basandosi solo sul tipo di ritorno. Ad esempio, il seguente codice genererà un errore di compilazione:
class Example {
// ERRORE: La firma dei due metodi è considerata identica
public int getNumber() { return 42; }
public double getNumber() { return 42.0; }
}
Il compilatore ha bisogno di distinguere i metodi unicamente in base ai parametri per decidere quale versione chiamare a compile-time (l'overloading si risolve interamente a compile-time).
Prova tu
Aggiungi alla classe Calculator un metodo public int add(int a, int b) che ritorna la somma dei due numeri. Nel main chiama il metodo sull'oggetto calc e assegna il risultato ad una variabile intera.
Mostra suggerimento
Dichiara il metodo come `public int add(int a, int b) { return a + b; }` ed invocalo nel main come `int result = calc.add(5, 10);`.
Soluzione disponibile dopo 3 tentativi
Fai l'overload del metodo add nella classe Calculator creando un altro metodo che accetta due double e restituisce la loro somma.
Mostra suggerimento
Scrivi `public double add(double a, double b) { return a + b; }` subito sotto il primo metodo add.
Soluzione disponibile dopo 3 tentativi
Aggiungi alla classe Calculator un metodo public int multiply(int a, int b) che ritorna il prodotto dei due numeri. Nel main chiama il metodo sull'oggetto calc e assegna il risultato ad una variabile intera.
Mostra suggerimento
Dichiara il metodo come `public int multiply(int a, int b) { return a * b; }` ed invocalo nel main come `int result = calc.multiply(5, 10);`.
Soluzione disponibile dopo 3 tentativi