Vai al contenuto
eLearner.app
Modulo 2 · Lezione 2 di 24/14 nel corso~12 min
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:

  1. Modificatore di accesso (es. public, private).
  2. Tipo di ritorno (es. int, String, o void se non restituisce nulla).
  3. Nome del metodo in camelCase.
  4. Parametri racchiusi tra parentesi tonde.
  5. Corpo del metodo racchiusi tra parentesi graffe.
Code
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 .:

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

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

Code
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

Esercizio#java.m2.l2.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
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

Esercizio#java.m2.l2.e2
Tentativi: 0Caricamento…

Fai l'overload del metodo add nella classe Calculator creando un altro metodo che accetta due double e restituisce la loro somma.

Caricamento editor…
Mostra suggerimento

Scrivi `public double add(double a, double b) { return a + b; }` subito sotto il primo metodo add.

Soluzione disponibile dopo 3 tentativi

Esercizio#java.m2.l2.e3
Tentativi: 0Caricamento…

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.

Caricamento editor…
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