Attributi e Metodi Static in Java

Nelle lezioni precedenti abbiamo scritto del codice come esempio per dei semplici programmi ed abbiamo utilizzato delle classi di sistema che il linguaggio Java mette a disposizione e della cui implementazione non dobbiamo preoccuparci. Sono dei componenti preconfezionati che qualcuno ha già scritto per noi, pensate ad esempio alla funzione println che abbiamo utilizzato per scrivere nella console oppure la classe String per la gestione dei caratteri alfanumerici. Tutto questo codice risiede nelle librerie di sistema ed organizzate in package, dei pacchetti di classi che consentono di gestire vari aspetti della programmazione, ovviamente anche noi possiamo ampliare questa libreria di classi attraverso lo sviluppo di nostri package, classi e funzioni.
Sin dalla prima lezione abbiamo incontrato una parola chiave utilizzata nella funzione main, si tratta di static. In generale questa parola viene utilizzata per definire i cosiddetti metodi o variabili di classe. Qual’è la differenza tra una variabile normale ed una variabile di classe? Supponiamo di avere la classe CFamiglia con una serie di attributi e tra questi il cognome di tipo stringa. Supponiamo che questa famiglia sia composta da n persone, quando questa viene istanziata vengono create n oggetti tutti con lo stesso cognome, quindi ci sarà l’utilizzo di n locazioni di memoria per scrivere sempre la stessa informazione, uno spreco che potremmo evitare scrivendo una volta soltanto il valore per tutte le n persone della famiglia. Questo è per l’appunto l’utilizzo di static, se cambiamo il valore di uno solo dei cognomi della famiglia, cambiano anche gli altri n-1 valori del cognome, come ci aspetteremmo perché abbiamo voluto la stringa cognome di tipo static. Altra caratteristica interessante è che potremmo scrivere CFamiglia.m_strCognome che migliora di molto la leggibilità del codice. I metodi di classe sono simili alle variabili ed è possibile richiamarli senza istanziare la classe stessa, ad esempio la classe Math nel package java.lang non si può istanziare, ma è possibile utilizzare tutti i metodi al suo interno, perché formata solo da metodi static. Quando si utilizzano i metodi di classe occorre tener presente che al loro interno non è possibile richiamare metodi non-static, questo perché non è possibile utilizzare un metodo non-static se non si è istanziata la classe e tutto questo potrebbe causare ambiguità tra metodi in memoria e non istanziati. Vediamo due semplici esempi che ci consentano di capirne il funzionamento:

// File CFamiglia.java

package corso;

public class CFamiglia
{
    private String m_strNome;
    public static String m_strCognome;
    private String m_strDataNasc;

    CFamiglia(String strNome, String strDataNasc)
    {
         m_strNome = strNome;
         m_strDataNasc = strDataNasc;
    }

    public void Stampa()
    {
         System.out.println(m_strNome + " " +
           m_strCognome + " nato/a il " + m_strDataNasc);
    }
}

// file Main.java

package corso;

public class Main
{
  public static void main(String[] args)
  {
    CFamiglia padre = new
         CFamiglia("Antonio", "12/03/1956");
    CFamiglia figlio1 = new
         CFamiglia("Marco", "10/08/1985");
    CFamiglia figlio2 = new
         CFamiglia("Giovanni", "03/11/1989");
    CFamiglia figlio3 = new
         CFamiglia("Luca", "30/08/1992");

    CFamiglia.m_strCognome = "Rossi";

    padre.Stampa();
    figlio1.Stampa();
    figlio2.Stampa();
    figlio3.Stampa();
  }
}

Come è possibile notare da questo esempio è bastato cambiare il cognome alla classe famiglia per avere anche i figli con lo stesso valore e questo perché ho dichiarato l’attributo cognome come static.
Vediamo ora un esempio per comprendere meglio l’uso dei metodi di classe:

// File CNumero.java

package corso;

public class CNumero
{
    public static int Somma(int a, int b)
    {
       return a + b;
    }
    public static int Sottrazione(int a, int b)
    {
       return a - b;
    }
    public static int Moltiplicazione(int a, int b)
    {
       return a * b;
    }
    public static double Divisione(int a, int b)
    {
       return (double)a / (double)b;
    }
}

// file Main.java

package corso;

public class Main
{
   public static void main(String[] args)
   {
     int a = 18;
     int b = 7;

     System.out.println(a + " più " + b
         + " fa " + CNumero.Somma(a, b));
     System.out.println(a + " meno " + b
         + " fa " + CNumero.Sottrazione(a, b));
     System.out.println(a + " per " + b
         + " fa " + CNumero.Moltiplicazione(a, b));
     System.out.println(a + " diviso " + b
         + " fa " + CNumero.Divisione(a, b));
   }
}

Credo non ci sia bisogno di ulteriori spiegazioni e comunque casomai vi invito ad iscrivervi nel forum per richiedere assistenza ed informazioni gratuite.

<< Lezione Precedente – Inizio CorsoLezione Successiva >>

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in Java. Contrassegna il permalink.