


















Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Argomenti trattati: • Cos'è un Metodo e la sua sintassi • Procedure in Java (metodi void) • Funzioni in Java (metodi con tipo di ritorno) • Passaggio dei parametri • Regole di visibilità delle variabili • Convenzione sul nome dei metodi • Overloading dei metodi • Flusso del controllo • Esercizio pratico completo • Passaggio dei parametri in Java
Tipologia: Schemi e mappe concettuali
1 / 26
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!



















Argomenti trattati:
1. Cos'è un Metodo
1.1 Definizione
Tutti i linguaggi di programmazione permettono di raggruppare istruzioni sotto un unico nome in modo da poterle richiamare senza riscriverle. In Java questi blocchi di codice riutilizzabili si chiamano metodi (in altri linguaggi: funzioni, procedure, sottoprogrammi).
1.2 Sintassi di dichiarazione
Ogni metodo deve essere dichiarato all'interno di una classe. La struttura generale è:
[specificatore_accesso] [static] tipo_ritorno nomeMetodo(tipo1 param1, tipo2 param2, ...) { // blocco di codice }
Esempio concreto:
public static int calcolaAreaRettangolo(int base, int altezza) { // blocco di codice }
1.3 Elementi della dichiarazione
Elemento Obbligatori o
Descrizione
Specificatore di accesso public / private / protected
No Stabilisce quali altri metodi possono chiamare questo metodo.
Tipo dichiarazione static No Indica che il metodo appartiene alla classe (static) e non alle singole istanze. Per ora si usano solo metodi static.
Tipo di ritorno int, double, String, …, void
Sì Tipo del valore restituito. void indica che il metodo non restituisce nulla.
Nome del metodo Sì Identificatore usato per richiamare il metodo (es. calcolaArea, stampa).
Parametri No Valori di input del metodo, indicati con tipo e nome separati da virgola.
2. Procedure in Java
2.1 Caratteristiche
Una procedura raggruppa istruzioni riutilizzabili senza produrre un valore di ritorno. In Java si dichiara con tipo di ritorno void :
public static void nomeProcedura(... parametri ...) { // blocco di codice }
void indica che il metodo esegue operazioni (stampa, modifica stato, ecc.) ma non restituisce nessun valore al chiamante.
2.2 Chiamata di una procedura
Dopo la dichiarazione, la procedura si invoca usando solo il suo nome e i valori degli eventuali parametri:
nomeProcedura(param1, param2, ...);
2.3 Esempio completo
Dichiarazione della procedura:
public static void hello(String nome) { System.out.println("Hello " + nome); }
Chiamata nel main:
hello("Mario"); // stampa: Hello Mario
2.4 Regola importante
I valori passati alla procedura devono essere dello stesso tipo dei parametri formali dichiarati nell'intestazione. Se la procedura dichiara String nome, la chiamata deve passare una String; non è possibile passare un int.
3. Funzioni in Java
3.1 Caratteristiche
Una funzione è una procedura speciale che calcola e restituisce un valore al chiamante. Il tipo di ritorno non è mai void, ma il tipo concreto del valore restituito (int, double, String, ecc.). La restituzione avviene con l'istruzione return.
public static tipo-ritorno nomeFunzione(... parametri ...) { tipo-ritorno risultato = ...; .... return risultato; }
3.2 L'istruzione return
return termina l'esecuzione della funzione e restituisce il valore al chiamante. Il tipo del valore restituito deve essere uguale o compatibile (più capiente) con il tipo di ritorno dichiarato:
Tipo ritorno dichiarato Variabile ricevente Esito
int double numero = esempio(); OK — double è più capiente di int
int short numero = esempio(); ERRORE — short è più piccolo di int
3.3 Esempio completo
Dichiarazione della funzione:
public static int calcolaPerimetroQuadrato(int lato) { int perimetro = lato * 4; return perimetro; }
Chiamata nel main:
int lato = 5; int p = calcolaPerimetroQuadrato(lato); // p = 20
La variabile p riceve il valore restituito dalla return. Anche qui vale la regola della compatibilità dei tipi tra parametri chiamante e dichiarazione.
3.4 Confronto sintetico: procedura vs funzione
4. Passaggio dei Parametri
Esistono due modalità generali con cui i linguaggi di programmazione passano i parametri a un metodo: per valore e per riferimento.
4.1 Passaggio per valore
Nel passaggio per valore il chiamante crea una copia del parametro e la passa al metodo. Il metodo lavora sulla copia, quindi qualsiasi modifica effettuata al parametro all'interno del metodo non ha effetto sulla variabile originale del chiamante. Ogni metodo ha il proprio ambiente locale di esecuzione, con celle di memoria separate.
Flusso: base e altezza del main vengono copiati nei parametri b e a del metodo; il valore calcolato (result) viene poi copiato indietro nella variabile area del main.
4.2 Passaggio per riferimento
Nel passaggio per riferimento, invece di copiare il valore, si passa l' indirizzo di memoria della variabile originale. Il metodo accede e modifica direttamente la cella di memoria del chiamante, quindi le modifiche si riflettono sulla variabile originale.
Esempio mnemonico: la variabile nome è memorizzata all'indirizzo 1040 con valore 'Mario'. Per valore si passa 'Mario' (copia); per riferimento si passa 1040 (l'indirizzo), e le modifiche al metodo cambiano direttamente il contenuto di quella cella.
Modalità Cosa si passa Modifica originale?
Per valore Copia del valore No — la variabile originale non cambia
Per riferimento Indirizzo di memoria Sì — la variabile originale viene modificata
5. Passaggio dei Parametri in Java
5.1 Premessa: tipi primitivi e oggetti
In Java ogni valore appartiene a una di queste due categorie:
Quando si copia un tipo primitivo si ottengono due valori indipendenti; quando si copia un riferimento a oggetto, sia l'originale che la copia puntano allo stesso oggetto in memoria.
5.2 Regola in Java
Java usa sempre e solo il passaggio per valore. Tuttavia, per i tipi riferimento (array e oggetti) il valore passato è l'indirizzo di memoria, quindi le modifiche all'oggetto puntato si riflettono sul chiamante:
5.3 Esempio — tipo primitivo (passaggio per valore)
public class Parametri {
public static void main(String[] args) { int var1 = 18; cambiaValore(var1); System.out.println(var1); // stampa: 18 }
public static void cambiaValore(int var1) { var1 = 45; // modifica solo la copia locale } }
L'output è 18 e non 45: la modifica al parametro var1 dentro cambiaValore agisce sulla copia locale, non sulla variabile del main.
5.4 Ordine dei parametri
L'ordine in cui i parametri vengono passati alla chiamata deve corrispondere esattamente all'ordine in cui sono dichiarati nell'intestazione del metodo:
Riepilogo Generale
Metodo: Blocco di codice con un nome, dichiarato in una classe. Unifica il concetto di procedura e funzione in Java. Struttura: [accesso] [static] tipo_ritorno nomeMetodo(params) { corpo } Procedura Java: Metodo con tipo di ritorno void. Non restituisce valori; si chiama con nomeProcedura(args); Funzione Java: Metodo con tipo di ritorno specifico (int, double, String, …). Contiene obbligatoriamente return valore; si assegna con var = nomeFunzione(args); Compatibilità tipi: I parametri nella chiamata devono avere tipo uguale o compatibile con i parametri formali. Il valore di return deve essere compatibile con il tipo dichiarato. Passaggio per valore: Java copia il valore nella variabile locale del metodo. Nessuna modifica al parametro formale cambia la variabile nel chiamante (per tipi primitivi). Passaggio per riferimento (implicito): Per array e oggetti, Java copia l'indirizzo (riferimento). Le modifiche all'oggetto puntato si riflettono nel chiamante. Ordine parametri: Deve corrispondere esattamente alla dichiarazione del metodo.
Attraverso i metodi possiamo riutilizzare un blocco di codice in molte parti del programma, semplicemente richiamando il nome con cui l'abbiamo definito, senza dover riscrivere lo stesso codice più volte.
Programmazione in Java
1. Regole di visibilità delle variabili
In Java, ogni dichiarazione di una variabile possiede una propria visibilità (o scope ). Lo scope determina l'ambiente in cui quella variabile può essere letta o modificata. Comprendere le regole di visibilità è fondamentale per evitare errori logici e garantire che i dati siano accessibili solo dove necessario.
All'interno di una classe Java esistono due grandi categorie di variabili:
1.1 Variabili locali
I parametri formali dichiarati nell'intestazione di un metodo sono considerati variabili locali di quel metodo: sono visibili soltanto all'interno del suo blocco di codice.
public static void metodo(int a, double b, String s) { // a, b ed s sono visibili SOLO qui dentro // ... } // <-- a, b, s cessano di esistere
Analogamente, le variabili dichiarate all'interno del corpo del metodo sono anch'esse locali e cessano di esistere al termine del blocco.
public static void metodo(int a, double b, String s) { int varLocale1 = 43; String varLocale2 = "Variabile locale di tipo stringa"; // varLocale1 e varLocale2 sono visibili solo qui }
Regola chiave: non è possibile dichiarare due variabili con lo stesso nome all'interno dello stesso metodo. È invece lecito che metodi diversi utilizzino variabili con lo stesso nome, poiché i loro scope sono separati.
public static void metodo(int a, double b, String s) { int varLocale1 = 43; // OK: prima dichiarazione int varLocale1 = 12; // KO: già dichiarata! double varLocale1 = 23.3; // KO: già dichiarata! int a = 33; // KO: 'a' è già un parametro
varLocale1 = 3; // OK: semplice assegnazione (non dichiarazione) a = 7; // OK: semplice assegnazione }
1.2 Variabili globali (statiche)
Le variabili globali sono visibili in tutti i metodi della classe: sia nel main sia negli altri metodi statici. Vengono dichiarate all'interno della classe ma fuori da qualsiasi metodo, di norma subito dopo l'intestazione della classe.
Poiché in questa fase non sono legate ad alcuna istanza di oggetto, devono essere dichiarate con il modificatore static :
// Solo dichiarazione static int variabileGlobale;
// Dichiarazione con inizializzazione static int variabileGlobale = 10;
Esempio completo – lettura e modifica di una variabile globale:
public class VisibilitaVariabili {
static int variabileGlobale = 10;
public static void main(String[] args) { System.out.println("Stampa1: " + variabileGlobale); // 10 variabileGlobale = 33; stampaModifica(); System.out.println("Stampa3: " + variabileGlobale); // 100 }
public static void stampaModifica() { System.out.println("Stampa2: " + variabileGlobale); // 33 variabileGlobale = 100; } }
Output atteso:
Stampa1: 10 Stampa2: 33 Stampa3: 100
1.3 Shadowing: variabile locale con lo stesso nome di una globale
È legalmente permesso dichiarare, all'interno di un metodo, una variabile locale con lo stesso nome di una variabile globale. In questo caso si parla di shadowing (oscuramento): all'interno di quel metodo la variabile locale nasconde la variabile globale, che diventa inaccessibile per la durata del metodo.
public class VisibilitaVariabili {
static int variabileGlobale = 10;
1.4 Nome dei parametri: chiamante vs chiamato
Un dettaglio importante: il nome del parametro formale dichiarato nell'intestazione del metodo non deve essere necessariamente uguale al nome della variabile utilizzata dal chiamante. Ciò che conta è l' ordine e il tipo degli argomenti.
// METODO CHIAMATO public static int calcolaPerimetroQuadrato(int lato) { int perimetro = lato * 4; return perimetro; }
// METODO CHIAMANTE (es. main) int l = 5; int p = calcolaPerimetroQuadrato(l); // 'l' viene passato come 'lato'
Il valore della variabile l viene copiato nel parametro lato : i due nomi sono indipendenti e possono differire senza alcun problema.
2. Convenzione sul nome dei metodi
In Java esistono delle convenzioni (o naming conventions ) riconosciute e adottate da sviluppatori di tutto il mondo, allo scopo di standardizzare il codice e migliorarne la leggibilità e la manutenibilità.
Le regole fondamentali per il nome dei metodi sono:
Esempi corretti:
calcola() // OK: minuscola, verbo calcolaArea() // OK: camelCase, verbo sommaDueNumeri() // OK: camelCase, verbo stampa() // OK: minuscola, verbo leggiCodiceCliente() // OK: camelCase, verbo
Esempi NON conformi alle convenzioni:
Calcola() // KO: inizia con maiuscola calcola_area() // KO: underscore non usato per i metodi area() // Accettabile ma privo di verbo
Rispettare queste convenzioni non influisce sul comportamento del programma, ma rende il codice più leggibile e professionale, facilitando la collaborazione in team e la manutenzione nel tempo.
4. Flusso del controllo
Quando un metodo ne chiama un altro, si instaura una catena di chiamate. Consideriamo la sequenza:
m1 --> m2 --> m
Il comportamento è il seguente:
Questo meccanismo è gestito internamente dalla call stack (pila delle chiamate): ad ogni chiamata viene aggiunto un nuovo frame alla pila; quando il metodo termina, il frame viene rimosso e l'esecuzione riprende nel metodo chiamante.
Rappresentazione schematica del flusso:
m1 invoca m |-- m2 invoca m | |-- m3 esegue e ritorna |-- m2 riprende e ritorna m1 riprende m1 termina