Categories: Java

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

Share
Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.

Published by
Giampaolo Rossi

Recent Posts

Un Abbonamento per Tutti i Software

Sono arrivato alla convinzione che un abbonamento per tutti i miei software gestionali sia il…

1 anno ago

Software di Magazzino Gratuito

MerciGest è un software per la gestione del magazzino completamente gratuito. Continua a leggere→

1 anno ago

Mettere il PC in Lock Screen

In ufficio può capitare di doversi allontanare dal proprio posto di lavoro, ecco che allora…

3 anni ago

Fare il reset togliendo la corrente

In questo articolo vedremo quando è più o meno utile togliere la corrente ad un…

3 anni ago

Prossimi Aggiornamenti Software

Dopo la pausa invernale dovuta al lavoro che devo fare per sostentarmi, eccomi di nuovo…

3 anni ago

Come Eliminare i Files in Windows

Vediamo come eliminare i files direttamente da Windows senza utilizzare il cestino. Continua a leggere→

4 anni ago