1. Metodi statici

Oltre alle variabili statiche, le classi possono avere anche metodi statici.

I metodi regolari sono associati a oggetti (istanze) di una classe e possono fare riferimento a variabili ordinarie (non statiche) della classe (così come a variabili e metodi statici ). I metodi statici sono associati all'oggetto statico della classe e possono accedere solo alle variabili statiche e/o ad altri metodi statici della classe.

Per chiamare un metodo ordinario (non statico) su una classe, devi prima creare un oggetto della classe e quindi chiamare il metodo sull'oggetto. Non puoi chiamare un metodo ordinario sulla classe piuttosto che un oggetto.

Esempio:

Non puoi chiamare un metodo non statico su una classe!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Ma per chiamare un metodo statico, è sufficiente che l'oggetto statico della classe esista semplicemente (ed esiste sempre dopo che la classe è stata caricata in memoria). Questo è il motivo per cui il metodo main() è statico. È associato all'oggetto statico della classe, quindi non è necessario creare alcun oggetto per chiamarlo.

Per dichiarare un metodo static, è necessario scrivere la parola chiave static prima dell'intestazione del metodo. L'aspetto generale di questo costrutto è il seguente:

static Type name(parameters)
{
   method code
}

Esempi:

Codice Nota
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


La macchina Java chiama il mainmetodo con un comando come questo: Solution.main();



Il metodo statico test()viene chiamato nel main()metodo statico.

Per chiamare un metodo statico da un'altra classe, è necessario specificare il nome della classe prima del nome del metodo statico. L'aspetto generale di questo costrutto è il seguente:

Type name = ClassName.methodName(arguments)

Esempi:

Codice Metodo statico
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Metodi statici e metodi ordinari (non statici).

Qual è la differenza tra i metodi statici e quelli ordinari?

Un metodo ordinario è associato a un oggetto ordinario (un'istanza di una classe), mentre un metodo statico non lo è. Un metodo ordinario può accedere alle variabili nella sua istanza, ma un metodo statico non può: semplicemente non ha un'istanza associata.

Le differenze tra i due tipi di metodi sono espresse nella seguente tabella:

Capacità/proprietà Metodo ordinario Metodo statico
Associato a un'istanza della classe NO
Può chiamare metodi ordinari della classe NO
Può chiamare metodi statici della classe
Può accedere alle variabili ordinarie della classe NO
Può accedere alle variabili statiche della classe
Può essere chiamato su un oggetto
Può essere chiamato in classe NO

Perché tali metodi sono necessari se sono così severamente limitati? La risposta è che anche questo approccio ha i suoi vantaggi.

Innanzitutto, non è necessario passare alcun riferimento a un oggetto per accedere a metodi e variabili statici.

In secondo luogo, a volte è necessario che ci sia solo una singola istanza di una variabile. Ad esempio, System.out( la variabile out statica della classe System ).

E, terzo, a volte è necessario chiamare un metodo prima ancora che sia possibile creare oggetti. Ad esempio, la macchina Java chiama il metodo main() per avviare l'esecuzione del programma anche prima che venga creata un'istanza della classe.

Associato a un'istanza della classe

Quando viene chiamato un metodo ordinario, gli viene implicitamente passato un argomento, ovvero l'oggetto su cui viene chiamato il metodo . Questo parametro si chiama this. Questo parametro implicito (un riferimento all'oggetto su cui viene chiamato il metodo) distingue i metodi ordinari da quelli statici.

I metodi statici non hanno questo parametro implicito, quindi non è possibile utilizzare la thisparola chiave all'interno di metodi statici e non è possibile chiamare un metodo non statico all'interno di un metodo statico. Semplicemente non c'è nessun posto dove ottenere un riferimento a un'istanza di una classe.

Può chiamare metodi ordinari della classe

Un metodo ordinario ha sempre il thisparametro implicito, quindi hai sempre un riferimento all'oggetto su cui viene chiamato il metodo. Ogni volta che chiami un metodo ordinario all'interno di un altro metodo ordinario, il thisparametro implicito viene utilizzato per effettuare quella chiamata. Esempio

Codice Come funziona
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

Ecco perché non puoi chiamare un metodo ordinario da uno statico. Semplicemente non esiste una variabile implicita denominata thisall'interno di un metodo statico.

Oppure immagina un'altra situazione: nel nostro programma non è stato ancora creato un solo oggetto della nostra classe. Possiamo chiamare un metodo statico della nostra classe? SÌ. E questo metodo statico può chiamare un metodo ordinario (non statico)?

Ebbene, su quale oggetto lo invocheremmo? Dopotutto, non esiste ancora una sola istanza della nostra classe!

Può chiamare metodi statici della classe

I metodi statici possono essere chiamati da qualsiasi posizione, da qualsiasi punto del programma. Ciò significa che possono essere chiamati sia dai metodi statici che da quelli ordinari. Non ci sono restrizioni qui.

Può accedere alle variabili ordinarie della classe

È possibile accedere alle variabili ordinarie di una classe da un metodo ordinario, poiché può facilmente ottenere un riferimento a un'istanza della classe tramite il thisparametro implicito.

Un metodo statico non sa quale istanza della classe dovrebbe usare per ottenere valori di variabili ordinarie. E più in generale, possiamo facilmente avere una situazione in cui viene chiamato un metodo statico ma non è stata ancora creata una singola istanza della classe nel programma.

Di conseguenza, i metodi statici non possono accedere alle variabili ordinarie di una classe.

Supponiamo che un metodo statico chiami un metodo ordinario. Su quale oggetto dovrebbe essere invocato quel metodo ordinario?

Metodi statici

Nessuno sa! Ecco perché non puoi chiamare un metodo ordinario da uno statico senza passare un riferimento a un oggetto!

Può accedere alle variabili statiche della classe

La situazione con le chiamate a variabili statiche è la stessa delle chiamate a metodi statici. È possibile accedere alle variabili statiche da qualsiasi punto del programma. Ciò significa che puoi accedervi da metodi statici e ordinari.

Può essere chiamato su un oggetto

Entrambi i metodi statici e ordinari possono essere chiamati su un oggetto. È possibile una chiamata a un metodo ordinario, anzi, questo è l'unico modo per chiamare un metodo ordinario. Un metodo statico può essere chiamato anche su un oggetto: in questo caso il compilatore stesso determina il tipo della variabile e chiama il metodo statico in base al suo tipo:

Codice Come lo vede il compilatore
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Può essere chiamato in classe

Puoi chiamare solo un metodo statico su una classe. Per chiamare un metodo ordinario, è necessario un riferimento a un'istanza della classe. Pertanto, non è possibile chiamare un metodo ordinario utilizzando questo costrutto:ClassName.methodName(arguments)