Programmazione e algoritmi
Introduzione alla programmazione ad oggetti
Java è un linguaggio puramente Object Oriented e, come tale, ci impone questo tipo di logica strutturale. Quindi, se il lettore ha solide conoscenze di programmazione procedurale, dovrà solamente adattare queste competenze al paradigma della programmazione ad oggetti.
Diciamo che la logica della programmazione ad oggetti si basa su due concetti principali:
- Classe: una classe è un'astrazione che rappresenta un insieme di oggetti che condividono le stesse caratteristiche e le stesse funzionalità.
- Oggetto: un oggetto è un'istanza o più precisamente una realizzazione concreta di una classe.
Una classe può essere vista come un contenitore all'interno del quale troviamo due elementi principali: attributi e metodi. Gli attributi della classe sono quelle variabili che identificano la classe e che vengono usati dai vari metodi per compiere qualche operazione. I metodi sono delle funzioni che espletano un certo compito.
Quindi, se creerò una classe "Numeri", avremo, ad esempio, due attributi del tipo "numero1" e "numero2" (e potrò definire un metodo per assegnare i valori agli attributi) e due metodi "somma" e "sottrazione" che compiono rispettivamente la somma e la sottrazione del "numero1" e "numero2".
La classe è un'entità a sé stante, quindi adesso avremo necessità di istanziare la classe "Numeri" per poi fare una chiamata al metodo che assegna i valori agli attributi della classe (passando i valori desiderati come parametri del metodo) ed in seguito i metodi di somma e sottrazione.
Come detto precedentemente, ogni istanza della classe è una realizzazione fisica della classe, quindi le due istanze sono completamente indipendenti l'una dall'altra e quindi se creiamo due oggetti di tipo "Numeri" e richiamiamo il metodo di assegnazione passando numeri diversi otterremo due oggetti diversi. Dunque la somma e la sottrazione relative ai due oggetti saranno generalmente diversi.
Come si creano classi ed oggetti in Java?
Creiamo la nostra classe "Numeri" con due attributi "numeroX" e "numeroY":
public class Numeri {
public int numeroX;
public int numeroY;
}
Come si può vedere un attributo viene dichiarato secondo la sintassi: ModificatoreDiVisibilità (nell'esempio public), TipoDellaVariabile (nell'esempio int), NomeVariabile (numeroX e numeroY). Per quanto riguarda la parola chiave public rappresenta un modificatore di visibilità, indica che numeroX e numeroY sono due attributi che possono essere richiamati anche fuori dalla classe.
Abbiamo adesso creato la classe "Numeri" e la salviamo in un file chiamato "Numeri.java". Compilando adesso il file con il comando javac Numeri.java, faremo ottenere un file compilato "Numeri.class".
Adesso potremo essere tentati di mandare in esecuzione il file (anche se è logico che non faccia niente) con il comando presente, ma otterremo solamente un messaggio di errore, dato che una classe è soltanto una definizione di una struttura e all'interno della classe che abbiamo scritto non c'è un metodo main nel quale viene istanziata la classe.
Definiamo dunque un'altra classe nella maniera seguente e la chiamiamo "Implementazione":
public class Implementazione {
public static void main(String args[]) {
//Prima istanza della classe Numeri
Numeri numeri1;
numeri1 = new Numeri();
numeri1.numeroX = 2;
numeri1.numeroY = 3;
//Seconda istanza della classe numeri
Numeri numeri2;
numeri2 = new Numeri();
numeri2.numeroX = 5;
numeri2.numeroY = 6;
//Mostriamo a video i valori numeroX e numeroY delle due istanze
System.out.println(numeri1.numeroX); //Stampa 2
System.out.println(numeri1.numeroY); //Stampa 3
System.out.println(numeri2.numeroX); //Stampa 5
System.out.println(numeri2.numeroY); //Stampa 6
}
}
Il parametro String args[] salva nell'array args eventuali stringhe scritte dall'utente in fase di lancio del programma. Il significato della stringa numeri1.numeroX=2; è accedi all'oggetto identificato da numeri1 e inserisci il valore 2 nell'attributo numeroX.
Le variabili di istanza sono quelle variabili che sono definite all'interno di una classe, ma fuori dai metodi della classe stessa, ovvero sono gli attributi della classe.
public class Numeri {
public int numeroX;
public int numeroY;
}
Le variabili "numeroX" e "numeroY" sono dunque delle variabili di istanza. Le variabili di istanza verranno deallocate dalla memoria non appena l'oggetto, istanza della classe, non terminerà di esistere per esempio non appena il flusso dell'applicazione è terminato.
Spesso alcune variabili di istanza vengono definite come costanti, ovvero sono variabili il cui valore rimarrà costante (non potrà essere modificato). Per definire una costante si usa la sintassi seguente:
public final int NUMEROZ = 10; //dichiaro una costante pari a 10
Le variabili locali sono tutte quelle variabili che vengono dichiarate ed utilizzate all'interno dei metodi di una classe.
public int sottrazione(int x, int y) {
int sottrazione;
sottrazione = x - y;
return sottrazione;
}
La variabile "sottrazione" sarà dunque una variabile locale. È importante specificare che la visibilità delle variabili locali è relativa al metodo nel quale viene dichiarata. Per esempio, se scrivessi un altro metodo all'interno della classe e facessi riferimento alla variabile "sottrazione", riceverei un messaggio di errore del compilatore che richiede di dichiarare la variabile perché, per quel metodo, di fatto non esiste.
Una variabile locale viene deallocata non appena il metodo effettua il return e quindi ritorna al metodo principale main della classe.
I parametri formali sono quelle variabili che vengono dichiarate all'interno delle parentesi tonde di un determinato metodo. Sempre prendendo spunto dal codice precedentemente scritto:
public int sottrazione(int x, int y)
Le variabili "x" ed "y" sono parametri formali. Con la dichiarazione soprastante, le variabili "x" e "y" di fatto sono state solo dichiarate e quindi non contengono nessun valore. L'inizializzazione della variabile avverrà non appena verrà richiamato il metodo sottrazione e verranno passati tra parentesi i due numeri sui quali effettuare la somma.
Che differenza c'è tra un parametro formale e una variabile locale? All'atto pratico non c'è nessuna differenza, ma possiamo dire che un parametro formale è una sottocategoria delle variabili locali. Dato che appartengono alla famiglia delle variabili locali, i parametri formali avranno ovviamente identica visibilità e verranno deallocati non appena il metodo effettua il return.
È buona norma strutturare la classe seguendo la lista sottostante:
- Le variabili di istanza ed eventuali costanti
- Il costruttore
- Tutti gli altri metodi della classe
L'ereditarietà: sottoclassi e superclassi
Premessa: l'astrazione è la base di tutto e se combinata con altri elementi fondamentali della programmazione ad oggetti come l'incapsulamento, l'ereditarietà e il polimorfismo, si arriva all'essenza finale della programmazione ad oggetti ovvero la possibilità del riuso del codice per lo sviluppo di altro software.
L'ereditarietà costituisce il secondo principio fondamentale della programmazione ad oggetti. In generale, essa rappresenta un meccanismo che consente di creare nuovi oggetti che siano basati su altri già definiti. Permette:
- Riutilizzo del codice
- Mantenibilità del codice
- Relazione genitore-figlio
Es. Un oggetto Mammifero ingloba tutte le caratteristiche comuni ad ogni mammifero. Da esso, poi, deriverebbero gli altri child object o sottoclassi: Cane, Gatto, Uomo, Balena, etc.
public class Dipendente {
public String nome;
public String cognome;
public int stipendio;
}
Immaginiamo adesso di voler creare una classe per i dipendenti che però sono responsabili di un progetto. Avremo che gli attributi della classe "Dipendete" saranno comuni sia alla figura del dipendente che a quella del responsabile di progetto, ma quest'ultimo avrà un ulteriore attributo che indica il progetto di cui è responsabile.
La cosa migliore da fare è, dunque, estendere la classe "Dipendente" utilizzando la parola chiave extends:
public class DipendenteResponsabile extends Dipendente {
public String progetto;
}
A questo punto avremo una classe "DipendenteResponsabile" che conterrà l'attributo "progetto" più gli altri attributi ereditati dalla classe "Dipendente".
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.