vuoi
o PayPal
tutte le volte che vuoi
Vantaggi dell'OOP
L'approccio orientato agli oggetti semplifica:
● Creazione di applicazioni complesse: Oggetti progettati e realizzati separatamente
(anche da sviluppatori diversi, a patto di aver definito le interfacce).
● Manutenzione: Si può intervenire solo sugli oggetti coinvolti in caso di errori o
miglioramenti.
2. Costrutti Fondamentali di Java
Linguaggio Java
● Creato da Sun Microsystems e presentato ufficialmente nel 1995.
● Obiettivo principale: portabilità ("Write once, run everywhere").
● Schema di Traduzione: Il codice sorgente Java viene compilato in bytecode, che
poi viene eseguito dalla JVM (Java Virtual Machine). La JVM è specifica per ogni
piattaforma, rendendo il bytecode portabile. Le versioni più recenti della JVM usano
la compilazione JIT (Just-In-Time).
Struttura di un Programma Java
● Composto da un insieme di classi.
● Ogni classe va scritta in un file di testo con il nome della classe e l'estensione
".java".
● Una delle classi deve contenere un metodo speciale, chiamato "main", da cui inizia
l'esecuzione del programma.
Modificatori di Accesso
Controllano la visibilità di classi, attributi e metodi:
public:
● Accessibile da ogni altra classe.
private:
● Accessibile solo da istruzioni di metodi della sua classe. Utile per
l'incapsulamento dello stato dell'oggetto.
protected:
● Livello intermedio di accesso, visibile nel package e nelle sottoclassi.
● Default (nessun modificatore): Accessibile solo da classi del suo stesso package.
Variabili
Contenitori che possono memorizzare valori di uno specifico tipo di dato.
Tipi di Dato
● Tipi Primitivi: Insieme predefinito e non estendibile, modellano dati:
short, int, long);
○ Numerici: interi (byte, in virgola mobile (float,
double).
○ Caratteri: (char).
○ Booleani: (boolean). Sono manipolati più efficientemente degli oggetti.
● Tipi Riferimento: Associati alle classi, i loro valori sono riferimenti (indirizzi) ad
oggetti. null:
○ Letterale Valore riferimento costante che indica che una variabile non
referenzia alcun oggetto.
Classificazione in Base alla Posizione nel Codice
● Variabili di Istanza: Dichiarate all'interno del corpo della classe ma fuori dai metodi
private).
(tipicamente Rappresentano la memoria di un oggetto e sono uniche per
ogni istanza. Il loro ciclo di vita coincide con quello dell'oggetto a cui appartengono.
● Variabili di Classe (Statiche): Simili alle variabili di istanza, ma dichiarate con la
static.
parola chiave Ne esiste un'unica copia per la classe, non una per ogni
oggetto. Il loro ciclo di vita coincide con quello della classe. Si riferiscono tramite il
NomeClasse.nomeVariabileStatica).
nome della classe (es.
● Variabili Locali: Dichiarate all'interno dei metodi. Sono visibili solo all'interno del
metodo in cui sono definite e vengono allocate e deallocate con il record di
attivazione del metodo. Non vengono inizializzate con valori di default dalla JVM.
● Parametri Formali: Variabili usate per passare dati di input a un metodo o
costruttore. Sono un caso particolare di variabili locali, la loro esistenza è limitata al
metodo.
Scope (Campo di Visibilità)
Indica in quali porzioni di codice una variabile può essere richiamata. Le variabili di istanza e
di classe sono visibili in tutti i metodi della classe; le variabili locali sono visibili solo nel
metodo in cui sono definite.
Costruttori
Metodi speciali usati per creare e inizializzare lo stato di un oggetto.
● Hanno sempre lo stesso nome della classe.
void).
● Non hanno tipo di ritorno (nemmeno
public static.
● Possono essere (tipicamente) ma non
new
● La parola chiave è usata per invocare un costruttore e creare un oggetto,
restituendone un riferimento.
● Se non si definisce un costruttore, la classe ne viene dotata automaticamente di uno
di default (senza parametri e non modifica lo stato).
this():
● Usato all'interno di un costruttore per richiamare un altro costruttore della
stessa classe (es. costruttore di copia).
Metodi
Definiscono un servizio che un oggetto può offrire.
● Sono definiti da un'intestazione (nome, parametri formali, tipo di ritorno) e un corpo
(implementazione).
● Il prototipo di un metodo include nome, parametri formali e tipo di ritorno.
● La signature (firma) include nome del metodo e la lista dei suoi parametri. In una
classe non possono esserci due metodi con la stessa signature (per evitare
ambiguità).
● Invocazione: Chiedere a un oggetto di eseguire un suo metodo, inviandogli un
messaggio. Si usa la sintassi
<riferimento_oggetto>.<nome_metodo>(<parametri>).
● Passaggio di parametri: Sempre per valore in Java.
this:
● Parola chiave che si riferisce all'oggetto corrente su cui è stato invocato un
metodo o un costruttore.
return:
● Usata in metodi che dichiarano di restituire un valore; causa la terminazione
immediata del metodo.
● Metodi di accesso (getter): Accedono allo stato di un oggetto in lettura (non lo
modificano).
● Metodi di modifica (setter): Modificano lo stato di un oggetto.
● Metodi Statici (di classe): Servizi offerti dalla classe stessa, vanno invocati
NomeClasse.nomeMetodo()), non su un'istanza.
direttamente sulla classe (es.
this implicito.
Non hanno un riferimento
● Overloading: Più metodi possono avere lo stesso nome purché abbiano una
signature diversa (diverso numero o tipo di parametri). Il tipo di ritorno non fa parte
della signature per l'overloading.
Classi Wrapper
java.lang,
Nel package forniscono classi che rappresentano i tipi di dati primitivi (es.
Integer int, Double double).
per per
● Ogni oggetto wrapper "incarta" il valore primitivo da rappresentare, che costituisce il
suo stato.
● Sono immutabili (il loro stato non può essere cambiato dopo la creazione).
● Usate per creare collezioni di dati primitivi.
● Autoboxing: Meccanismo automatico che agevola il passaggio tra dati wrapper e
primitivi.
Classe String
● Modella sequenze di caratteri.
String
● Gli oggetti sono immutabili. new.
● Possono essere creati usando letterali stringa (tra apici doppi) o con l'operatore
length(), charAt(), compareTo(), indexOf(), split().
● Metodi comuni:
Classe Math
Contiene metodi e costanti statiche per operazioni matematiche. Ha un costruttore privato
per impedirne l'istanziazione, offrendo tutti i servizi tramite metodi statici.
Array n
Contenitori per memorizzare elementi dello stesso tipo.
0 n-1.
● Ogni elemento è associato a un indice da a
length
● Hanno un attributo pubblico che memorizza la loro dimensione; è di sola
lettura.
● La dimensione di un array non può essere cambiata dopo la creazione.
ArrayIndexOutOfBoundException
● L'accesso a un indice non valido causa a
runtime.
● Gli elementi vengono inizializzati con il valore di default del loro tipo alla creazione.
● Letterali array: Permettono di creare e inizializzare array contestualmente alla
dichiarazione.
● La copia di un array implica la creazione di un nuovo array e la copia elemento per
elemento, non solo del riferimento.
● Array bidimensionali: Array i cui elementi sono a loro volta array (es. matrici).
Possono essere "frastagliati" (righe con lunghezze diverse).
Tipi Generici (Generics)
Permettono di definire classi/interfacce parametricamente rispetto ad un altro tipo
riferimento. E Coppia<E>) String
● Tipo parametro (es. in e Tipo argomento (es. in
Coppia<String>).
● Vantaggi: Maggiore sicurezza (controlli sul tipo a compilazione) e eliminazione di
cast espliciti.
● Restrizioni: Non possono essere usati per campi statici, creare array o istanziare
oggetti del tipo parametro.
● Tipi parametro vincolati: Permettono di restringere i tipi che possono essere usati
<E extends Number> <E super Number>).
come tipi argomento (es. o
?):
● Segnaposto (wildcard, Indica un tipo argomento non specificato, può essere
extends T>, <? super T>) o non vincolato (<?>).
vincolato (<?
Java Collections Framework (JCF)
Fornisce un insieme di interfacce e classi per gestire collezioni di oggetti.
● Strutture Dati Astratte: Definiscono solo le operazioni possibili, non come sono
realizzate (es. Pila).
● Strutture Dati Concrete: Realizzazioni delle strutture dati astratte.
Collection<E>:
● Interfaccia generica che rappresenta una collezione di oggetti,
Map).
super-tipo di quasi tutte le strutture dati astratte del JCF (esclusa
size(), isEmpty(), contains(Object o), add(E e),
○ Metodi comuni:
remove(Object o). equals.
L'uguaglianza è basata sul metodo
Iterator<E>:
● Oggetto che permette di scandire gli elementi di una collezione.
hasNext(), next().
Metodi: Collection Map):
● Principali Interfacce (che estendono o
List<E>:
○ Sequenza ordinata di elementi. Permette duplicati.
ArrayList LinkedList
Implementazioni comuni: (array) e (liste collegate).
Set<E>:
○ Insieme (matematico), non contiene duplicati. Implementazioni
HashSet TreeSet
comuni: (tabelle hash), (alberi bilanciati),
LinkedHashSet (tabelle hash e liste collegate).
Queue<E>:
○ Coda, elementi estratti in ordine (spesso FIFO - First In First Out).
Deque<E> Queue,
○ (Double Ended Queue): Estende permette operazioni su
Queue Deque: ArrayDeque,
testa e coda. Implementazioni comuni per e
LinkedList.
Map<K,V>: Collection.
○ Non estende Memorizza coppie (chiave, valore),
recupero efficiente del valore tramite chiave. Le chiavi sono uniche, i valori
possono essere duplicati.
size(), isEmpty(), get(Object key), put(K
■ Metodi comuni: containsKey(Object key),
key, V value),
containsValue(Object value), keySet(), values(),
entrySet(). HashMap TreeMap
■ Implementazioni comuni: (tabelle hash), (alberi
LinkedHashMap (tabelle hash e liste collegate).
bilanciati),
● Esistono interfacce che estendono le precedenti per aggiungere funzionalità, come
SortedSet<E> SortedMap<K,V>
e che mantengono gli elementi ordinati.
3. Gestione della Memoria in Java
La memoria in Java è gestita principalmente in tre aree:
● Pila di Attivazione (Stack): Area di memoria gestita secondo la politica LIFO
(Last-In-First-Out).
○ Record di Attivazione: Blocchi