Cosa sono i metodi statici in java?
Creato il 09 maggio 2011 da Magnus
Finora abbiamo mostrato segmenti di codice dando per scontato che siano parte di un processo attivo: in tutto questo c’è una falla. Per tapparla dobbiamo fare alcune considerazioni: primo, ogni metodo deve essere definito all’interno di una classe (questo incoraggia ad utilizzare il paradigma object oriented). Secondo, i metodi devono essere invocati utilizzando una variabile reference inizializzata in modo che tenga traccia della istanza di un oggetto.
Questo meccanismo rende possibile l’auto referenziazione inquanto se un metodo viene chiamato senza che l’oggetto di cui è membro sia attivo, this non sarebbe inizializzato. Il problema quindi è che in questo scenario un metodo per essere eseguito richiede un oggetto attivo, ma fino a che non c’è qualcosa in esecuzione un oggetto non può essere istanziato.
L’unica possibile soluzione è quindi quella di creare metodi speciali che non richiedano l’attività da parte dell’oggetto di cui sono membro così che possano essere utilizzati in qualsiasi momento.
La risposta è nei metodi statici, ossia metodi che appartengono a classi, ma non richiedono oggetti attivi. Questi metodi possono essere creati utilizzando la parola chiave static a sinistra della dichiarazione di un metodo come mostrato nella dichiarazione di static_method() nell’esempio che segue:
1 class esempio
2 {
3 static int static_method()
4 {
5 … … .
6 }
7 int non_static_method()
8 {
9 return static_method();
10 }
11 }
12 class altra_classe
13 {
14 void un_metodo_qualunque()
15 {
16 int i = esempio. static_method();
17 }
18 }
Un metodo statico esiste sempre a prescindere dallo stato dell’oggetto; tuttavia la locazione o classe incapsulante del metodo deve sempre essere ben qualificata.
Questa tecnica è chiamata “scope resolution” e può essere realizzata in svariati modi. Uno di questi consiste nell’utilizzare il nome della classe come se fosse una variabile reference:
esempio.static_metod();
Oppure si può utilizzare una variabile reference nel modo che conosciamo:
esempio _ese = new esempio();
_ese.static_metod();
Se il metodo statico viene chiamato da un altro membro della stessa classe non è necessario alcun accorgimento. E’ importante tener bene a mente che un metodo statico non inizializza l’oggetto “this”; di conseguenza un oggetto statico non può utilizzare membri non statici della classe di appartenenza.