













































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
ARGOMENTI: - Oggetto - Classe - Variabili d'Istanza e Variabili di Classe 3. I Costruttori 4. I Metodi 5. Overloading 1. Polimorfismo 2. Upcast e Downcast 3. L'operatore instanceof 4. Dynamic Binding 5. Metodi final e classi final 6. Limiti del Dynamic Binding 7. La Superclasse Universale Object 8. I metodi equals e toString 1. Le Classi Astratte 2. Metodi Astratti 3. Regole delle Classi Astratte 4. Variabili di tipo astratto 5. Perché usare le classi astratte 6. Le Interfacce 7. Implementare un'interfaccia 8. Ereditarietà multipla con le interfacce 9. Interfacce come tipo riferimento 10. Ereditarietà tra interfacce 11. Riepilogo comparativo • 1. Concetti di base sull'Ereditarietà • 2. Overriding • 3. Overriding vs Overloading • 4. Modalità d'accesso: Variabili e Metodi Privati 1. Concetti base sulle Eccezioni • 2. Tipi di Eccezioni • 3. Catturare un'Eccezione (try / catch / finally) • 4. Propagare un'Eccezione (throws)
Tipologia: Schemi e mappe concettuali
1 / 53
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!














































Classi e Oggetti — Dispensa didattica Java Pagina 2
Nella programmazione, i programmi gestiscono spesso insiemi di informazioni che sono tra loro correlate. Queste informazioni potrebbero essere raggruppate in un'unica entità: tali entità prendono il nome di Oggetti.
Si consideri il caso di un programma che debba memorizzare le informazioni di una lista di persone. Usando solo variabili primitive, per ogni persona dovremmo dichiararne una distinta per ciascuna caratteristica:
Caratteristica Tipo Java suggerito
Nome String
Cognome String
Età int
Altezza double
Peso double
Residenza String
Data di Nascita String
Domicilio String
Con 8 caratteristiche per persona e 10 persone, occorrerebbero 80 variabili separate , senza alcun collegamento logico tra loro. Il programmatore dovrebbe ricordare manualmente quale variabile appartiene a quale persona.
La programmazione a oggetti risolve questo problema permettendo di raggruppare tutte le informazioni correlate in un'unica entità chiamata Oggetto. Invece di 80 variabili sparse, avremo 10 oggetti ordinati, ciascuno contenente i propri dati:
PERSONA 1 PERSONA 2 PERSONA 3 Giuseppe / Rossi 32 anni / 180 cm
Maurizio / Verdi 42 anni / 170 cm Francesca / Sapori 24 anni / 175 cm
Classi e Oggetti — Dispensa didattica Java Pagina 4
Gli oggetti non nascono dal nulla: vengono prodotti da strutture chiamate Classi. Le classi sono le fabbriche degli oggetti.
Una Classe è un'astrazione che rappresenta le proprietà comuni (struttura e comportamento) di un insieme di oggetti concreti. Dal punto di vista della programmazione, la classe funge da tipo di dato per gli oggetti che ne sono istanze.
Concetto Spiegazione
Classe Descrive la struttura (attributi) e il comportamento (metodi) comuni a un gruppo di oggetti. È il "modello" o "stampo".
Oggetto Una specifica realizzazione (istanza) della classe, con valori concreti per ogni attributo.
Istanza Termine tecnico per indicare un particolare oggetto appartenente a una classe. Si dice che l'oggetto è un'istanza della classe.
Tipo di dato Quando si dichiara una variabile di tipo oggetto, il tipo è il nome della classe stessa (es. Persona p1).
La classe Persona definisce attributi e metodi in modo astratto. Ogni oggetto (istanza) creato a partire da essa contiene valori concreti per quegli stessi attributi e può invocare gli stessi metodi:
CLASSE Persona Attributi: nome, cognome, eta, altezza peso, residenza, statoCivile, domicilio Metodi: stampaPersona() aggiornaEta(data)
OGGETTO — istanza 1 (attributi con valori concreti) stampaPersona() aggiornaEta(data)
OGGETTO — istanza 2 (attributi con valori concreti) stampaPersona() aggiornaEta(data)
OGGETTO — istanza 3 (attributi con valori concreti) stampaPersona() aggiornaEta(data)
La freccia dalla classe verso ciascun oggetto rappresenta il legame di istanziazione: la classe è il modello, l'oggetto è la sua realizzazione concreta.
Classi e Oggetti — Dispensa didattica Java Pagina 5
Per creare un oggetto a partire da una classe è necessario utilizzare l'operatore new. Il processo che crea un nuovo oggetto si chiama costruzione.
// Dichiarazione della variabile e costruzione dell'oggetto Persona p1 = new Persona(); // Equivalente in due passi separati: Persona p1; // 1. dichiarazione (p1 punta a null) p1 = new Persona(); // 2. costruzione (p1 punta all'oggetto)
Elemento Significato
Persona (prima occorrenza)
Tipo della variabile: indica che p1 conterrà un riferimento a un oggetto di tipo Persona.
p1 Nome della variabile (riferimento all'oggetto).
new Operatore che costruisce l'oggetto in memoria.
Persona() Chiamata al costruttore della classe (può accettare parametri).
IMPORTANTE: quando si dichiara una variabile con tipo-classe, la variabile non contiene l'oggetto, ma un riferimento (indirizzo) all'oggetto in memoria. Due variabili possono riferirsi allo stesso oggetto.
Se si assegna una variabile oggetto a un'altra variabile dello stesso tipo, non si copia l'oggetto : entrambe le variabili punteranno allo stesso oggetto in memoria. Le modifiche effettuate tramite una variabile saranno visibili anche attraverso l'altra:
Persona p1 = new Persona(...); // p1 → oggetto A Persona p2 = new Persona(...); // p2 → oggetto B p2 = p1; // p2 ora punta allo stesso oggetto di p1 (oggetto A) // l'oggetto B non è più raggiungibile tramite p
Classi e Oggetti — Dispensa didattica Java Pagina 7
// Passo 1 – dichiarazione Persona p1; Persona p2; // Passo 2 – costruzione p1 = new Persona(); p2 = new Persona(); // Passo 3 – utilizzo p1.nome = "Mario"; p1.cognome = "Bianchi"; p1.stampaPersona(); // stampa i dati di p // Assegnazione di riferimento (NON è una copia!) p2 = p1; p2.nome = "Luigi"; // modifica anche p1.nome! p1.stampaPersona(); // stampa: Luigi Bianchi
Classi e Oggetti — Dispensa didattica Java Pagina 8
Termine Definizione
Oggetto Entità che raggruppa informazioni correlate (attributi) e comportamenti (metodi). Viene creato a partire da una classe con l'operatore new.
Attributo Variabile interna all'oggetto che ne descrive le proprietà (es. nome, età, peso).
Metodo Funzione interna all'oggetto che ne definisce il comportamento (es. stampaPersona(), aggiornaEta(data)).
Classe Modello (o stampo) che definisce struttura e comportamento comuni a un insieme di oggetti. Funge da tipo di dato per le variabili oggetto.
Istanza Un oggetto concreto creato a partire da una classe. Si dice che l'oggetto è un'istanza della classe.
Operatore new Costrutto Java che crea (costruisce) un nuovo oggetto in memoria e restituisce un riferimento ad esso.
Riferimento Il valore contenuto in una variabile oggetto: non è l'oggetto stesso, ma l'indirizzo in memoria in cui l'oggetto si trova.
null Valore speciale che indica l'assenza di un riferimento valido. Accedere a un oggetto null provoca NullPointerException a runtime.
Costruzione Il processo che crea un nuovo oggetto tramite l'operatore new e il costruttore della classe.
NullPointerExceptio n
Errore a runtime generato quando si tenta di invocare metodi o accedere ad attributi di una variabile che vale null.
Devo creare un nuovo oggetto? Usa new NomeClasse() e assegnalo a una variabile del tipo corretto.
Devo accedere agli attributi o ai metodi? Usa la notazione punto: variabile.attributo o variabile.metodo().
Ho bisogno dei dati dopo la costruzione? La variabile deve essere dichiarata nello scope giusto (prima del blocco in cui se
Devo copiare un oggetto? Assegnare p2 = p1 non copia l'oggetto: crea un secondo riferimento allo
Programmazione Orientata agli Oggetti in Java Documento educativo — Corso Java da Zero
1. L'Anatomia di un Oggetto Java
Un oggetto in Java è composto da una serie di componenti fondamentali che ne definiscono la struttura e il comportamento. Questi componenti sono:
L'insieme di variabili d'istanza, costruttori e metodi d'istanza forma quella che viene definita l'anatomia di un Oggetto Java.
Schema strutturale di una classe Java:
Componente Parola chiave / Caratteristica Scopo
Variabile d'istanza private / public (campo) Memorizza lo stato dell'oggetto
Variabile di classe static Valore condiviso tra tutti gli oggetti
Costruttore Stesso nome della classe, no return Crea e inizializza l'oggetto
Metodo d'istanza Legato all'oggetto (this) Definisce le azioni dell'oggetto
Metodo di classe static Agisce sulla classe, non su un'istanza
nn Modificare una variabile static attraverso un'istanza aggiorna il valore per tutti gli oggetti della classe, non solo per quell'istanza.
Esempio — dichiarazione di variabili d'istanza e di classe:
public class Prodotto { // Variabili d'istanza (ogni oggetto ha il proprio valore) private String nome; private float prezzo; // Variabile di classe (condivisa da tutti gli oggetti) public static String nomeProduttore; }
3. I Costruttori
Il costruttore è un metodo speciale di una classe il cui scopo è creare una nuova istanza e inizializzarne lo stato, ovvero assegnare valori iniziali alle variabili d'istanza. Viene invocato automaticamente da Java quando si utilizza l'operatore new.
La parola chiave this
All'interno di un costruttore (o di un qualsiasi metodo d'istanza), la parola chiave this fa riferimento all'oggetto corrente. È particolarmente utile per distinguere le variabili d'istanza dai parametri del costruttore quando hanno lo stesso nome.
nn IMPORTANTE: la parola chiave this ha senso solo quando dalla classe viene generato un oggetto (non nei metodi statici).
Esempio — classe con tre costruttori:
public class Prodotto { private String nome; private float prezzo; public static String nomeProduttore; // Costruttore 1: nome e prezzo public Prodotto(String nome, float prezzo) { this.nome = nome; this.prezzo = prezzo; } // Costruttore 2: solo nome public Prodotto(String nome) { this.nome = nome; } // Costruttore 3: senza parametri (default) public Prodotto() { } }
Come Java seleziona il costruttore:
Java determina quale costruttore invocare in base al numero e al tipo dei parametri passati con l'operatore new:
Prodotto p1 = new Prodotto("Pane", 2); // -> Costruttore 1 Prodotto p2 = new Prodotto("Latte"); // -> Costruttore 2 Prodotto p3 = new Prodotto(); // -> Costruttore 3
4.2 Metodi di Classe (static)
I metodi di classe sono definiti con la parola chiave static e agiscono sulla classe nel suo insieme, non su una specifica istanza. Possono essere invocati direttamente tramite il nome della classe, senza creare un oggetto:
Esempio — metodi statici:
public class Operazioni { public static int somma(int a, int b) { return a
5. Overloading dei Metodi
In Java ogni metodo è identificato dalla propria firma (o signature ), che comprende il nome del metodo e la lista dei tipi dei parametri. La firma deve essere unica all'interno di una classe.
L' overloading consiste nel definire più metodi con lo stesso nome ma con firme diverse, cioè con numero e/o tipi di parametri differenti. Sarà il compilatore a selezionare automaticamente il metodo corretto in base agli argomenti passati al momento della chiamata.
Regole fondamentali:
Esempio — overloading valido:
public void stampa(char x) { ... } // OK: tipo diverso public void stampa(int x) { ... } // OK: tipo diverso public void stampa(int x, int y) { ... } // OK: numero diverso
Esempio — overloading NON valido (errore di compilazione):
public int getNumero(int lato) { ... } public float getNumero(int lato) { ... } // ERRORE: stessa firma!
I due metodi hanno la stessa firma (nome + lista tipi parametri = getNumero(int)), quindi non sono ammissibili. Per risolvere occorre usare un nome diverso, un numero di parametri diverso o tipi di parametri diversi.
L'overloading e i costruttori:
Il concetto di overloading si applica anche ai costruttori: è proprio grazie all'overloading che una classe può avere più costruttori con parametri diversi, come visto nell'esempio della classe Prodotto nella sezione 3.
Riepilogo — L'insieme di variabili d'istanza, costruttori e metodi d'istanza forma l' anatomia di un Oggetto Java.
L' ereditarietà è uno dei pilastri fondamentali della programmazione orientata agli oggetti. Permette di definire una classe generale e, successivamente, di creare classi specializzate che aggiungono nuovi dettagli alla classe di partenza, ereditando automaticamente metodi e variabili di istanza già definiti.
Vantaggi principali:
Caso di studio – Sistema universitario
Si consideri un programma per la gestione delle informazioni di un'università. Il sistema deve trattare studenti, docenti e altro personale. Tutti questi soggetti condividono informazioni comuni (nome, cognome, ecc.) perché sono, anzitutto, Persone.
Gerarchia di classi:
Classe Superclasse Note Persona — Classe radice con attributi comuni Studente Persona Aggiunge la matricola Dipendente Persona Include docenti e impiegati NonLaureato Studente Studente senza laurea LaureatoTriennale Studente Laurea di primo livello LaureatoMagistrale LaureatoTriennale Laurea di secondo livello Docente Dipendente Personale docente Impiegati Dipendente Personale amministrativo
La classe Persona in Java:
La classe Persona contiene le variabili di istanza e i metodi comuni a tutti i tipi di persona gestiti dal sistema:
public class Persona { private String nome; private String cognome; public Persona(String nome, String cognome) { this.nome = nome; this.cognome = cognome; } public Persona() { } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCognome() { return cognome; } public void setCognome(String cognome) { this.cognome = cognome; } public void stampaInfo() { System.out.println("Nome: " + nome + "\nCognome: " + cognome); } }
La classe Studente – classe derivata:
La classe Studente estende Persona con la parola chiave extends. Una classe derivata (o sottoclasse ) è una classe definita aggiungendo variabili e metodi a una classe esistente, chiamata classe base (o superclasse ).
public class Studente extends Persona { private int matricola; public Studente(String nome, String cognome, int matricola) { super(nome, cognome); // invoca il costruttore di Persona this.matricola = matricola; } public Studente() { super(); } public int getMatricola() { return matricola; } public void setMatricola(int matricola) { this.matricola = matricola; } }
Grazie all'ereditarietà, un oggetto Studente possiede già tutti i metodi pubblici di Persona senza doverli ridichiarare:
Studente s = new Studente(); s.setNome("Mario"); // metodo ereditato da Persona s.setMatricola(12345);
La parola chiave super nei costruttori
Quando si scrive il costruttore di una classe derivata, la prima azione tipica è invocare un costruttore della superclasse tramite super:
Ereditarietà singola in Java
A differenza di linguaggi come C++, Java supporta solo l' ereditarietà singola : una classe può estendere una sola classe base. È tuttavia possibile creare catene di ereditarietà (A → B → C), ma questo non è ereditarietà multipla.
Terminologia
Termine Sinonimi Significato Classe base Superclasse, Classe padre La classe da cui si eredita Classe derivata Sottoclasse, Classe figlia La classe che eredita Riepilogo – Sintassi della classe derivata: public class NomeClasseDerivata extends NomeClasseBase { // dichiarazione variabili aggiuntive // costruttori della classe derivata // definizione metodi aggiuntivi }