Classi ed Oggetti in Java

Nella lezione introduttiva di questo corso avevamo detto che il linguaggio Java è orientato agli oggetti e questo metodo è quello più utilizzato nei linguaggi di programmazione moderni come C# o C++.
Il modello generale di riferimento della programmazione object-oriented è chiamato classe, una sua particolare istanza viene invece chiamata oggetto. Istanziare una classe significa assegnare dei valori ben precisi ai suoi attributi: ad esempio porre colore = verde, lunghezza = 23, taglia = XL ecc. Per capire meglio questi concetti creiamo una semplicissima classe CPersona ( personalmente inserisco una C davanti ai nomi delle classi per farli differire dalle variabili ) che descriveremo tramite alcuni suoi attributi.

// file CPersona.java

package corso;

public class CPersona
{
   String m_strNome;
   String m_strCognome;
}

// file Main.java

package corso;

public class Main
{
   public static void main(String[] args)
   {
    CPersona pers = new CPersona();
    pers.m_strNome = "Giampaolo";
    pers.m_strCognome = "Rossi";
    System.out.println("La persona si chiama: " +
        pers.m_strNome + " " + pers.m_strCognome);
   }
}

Nell’esempio abbiamo creato un nuovo file per la classe CPersona ed abbiamo inserito due attributi condivisi da ogni persona, il nome ed il cognome. Come potete notare davanti alla parola chiave class, abbiamo inserito public per indicare che la classe è visibile ( derivabile ) anche al di fuori dello stesso package ( vedremo meglio questo concetto quando parleremo di classi derivate ), ma volendo public può essere anche omessa. Nel caso degli attributi di una classe il public significa che la variabile è visibile anche al di fuori della classe e non essendoci nulla davanti al tipo della variabile è come se ci fosse scritto public, questo è il motivo per cui possiamo tranquillamente richiamare queste variabili membro della classe anche dal di fuori della classe stessa. Per quanto riguarda gli attributi ( variabili membro ) ed i metodi ( funzioni membro ) di una classe, possiamo avere questi qualificatori:

  • public – la variabile o la funzione di una classe è visibile anche al di fuori della classe
  • protected – la variabile o la funzione di una classe è visibile solo alle classi derivate
  • private – la variabile o la funzione di una classe è visibile solo alla classe stessa

per comprendere meglio il concetto proviamo a mettere private davanti ai tipi delle variabili membro della classe CPersona. Se eseguite l’esempio dopo la modifica vedrete che vi sarà restituito un errore, perché le variabili membro private sono visibili solo all’interno della classe che le contiene. Come facciamo quindi in questo caso ad istanziare una classe? Utiliziamo una funzione speciale che si chiama costruttore della classe, in pratica è un metodo senza tipi e valori di ritorno ed argomenti che deve avere lo stesso nome della classe.

// file CPersona.java

package corso;

public class CPersona
{
   private String m_strNome;
   private String m_strCognome;
   CPersona(String strNome, String strCognome)
   {
     m_strNome = strNome;
     m_strCognome = strCognome;
   }
   String GetNome()
   {
     return m_strNome + " " + m_strCognome;
   }
}

// file Main.java

package corso;

public class Main
{
   public static void main(String[] args)
   {
     CPersona pers = new CPersona("Giampaolo", "Rossi");
     System.out.println("La persona si chiama: " + pers.GetNome());
   }
}

Abbiamo istanziato la classe CPersona con il costruttore e poi abbiamo scritto anche il metodo GetNome per restituire il nome ed il cognome della persona. Se ben vedete c’è un perché dell’uso dei private, in questo modo nessuno può stampare a video prima il cognome e poi il nome utilizzando questa classe, che quindi consente anche di fare ordine nella programmazione.
Qualcuno a questo punto potrebbe chiedersi: se istanziamo la classe e quindi la poniamo in memoria, quando il programma esce non rimane piena di quel valore? Per questo consiglio la lettura di un mio articolo sul garbage collector ( bidone della spazzatura ).
Concludiamo questa lezione dedicata alle classi ed oggetti con l’implementazione della classe cerchio.

// file CCerchio

package corso;
public class CCerchio
{
   private final double pi = 3.14159;
   private double m_dRaggio;
   CCerchio()
   {
     m_dRaggio = 0.0;
   }
   CCerchio(double dRaggio)
   {
     m_dRaggio = dRaggio;
   }
   void SetRaggio(double dRaggio)
   {
     m_dRaggio = dRaggio;
   }
   double GetRaggio()
   {
     return m_dRaggio;
   }
   double GetDiametro()
   {
     return m_dRaggio * 2;
   }
   double GetCirconferenza()
   {
     return 2 * pi * m_dRaggio;
   }
   double GetArea()
   {
     return m_dRaggio * m_dRaggio * pi;
   }
}

// file Main.java

package corso;

public class Main
{
 public static void main(String[] args)
 {
   CCerchio c1 = new CCerchio(12.65);
   CCerchio c2 = new CCerchio();
   c2.SetRaggio(24.76);
   System.out.println("La circonferenza del cerchio di raggio " +
        c1.GetRaggio() + " è: " + c1.GetCirconferenza());
   System.out.println("L'area del cerchio di raggio " +
        c1.GetRaggio() + " è: " + c1.GetArea());
   System.out.println("La circonferenza del cerchio di raggio " +
        c2.GetRaggio() + " è: " + c2.GetCirconferenza());
   System.out.println("L'area del cerchio di raggio " +
        c2.GetRaggio() + " è: " + c2.GetArea());
  }
}

Da notare la parola chiave final che nel caso delle variabili significa costante, come è giusto per il valore del pi greco ed inoltre abbiamo creato una classe con due costruttori differenziati solo dagli argomenti.

<< Lezione PrecedenteInizio CorsoLezione Successiva >>

Informazioni su Giampaolo Rossi

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