Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Java: classi, oggetti, ereditarietà e polimorfismo, Dispense di Informatica

Java: ereditarietà, incapsulamento, polimorfismo, creazione di oggetti, costruttori, distruttori, getter e setter, la classe String.

Tipologia: Dispense

2020/2021

In vendita dal 07/12/2021

manuel-tentori
manuel-tentori 🇮🇹

4.4

(10)

23 documenti

1 / 14

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Java
Classi e oggetti
Un programma OOP si basa sull’utilizzo di moduli software già preparati.
L’elemento fondamentale nella OOP è l’oggetto che è appunto un “insieme di dati e di
funzioni” che prende “vita” da una classe.
Nella programmazione OOP l’oggetto è dunque un’istanza di una classe.
Aspetti fondamentali classi e oggetti:
Tra classe e oggetto vi è la stessa relazione che sussiste fra un tipo e una variabile
del paradigma imperativo.
Le classi definiscono dei prototipi per gli oggetti.
All’interno delle classi si incapsulano i dati e le funzioni, dove le funzioni sono
strettamente correlate con i dati che manipolano.
GLI OGGETTI
Ogni oggetto, anche se appartiene alla stessa classe, è generalmente differente dagli
altri, cioè ha proprietà (attributi) che lo caratterizzano, mentre condivide con gli altri suoi
simili il comportamento.
Un’oggetto è un’entità stratta dotato di specifici attributi e in grado di cooperare con
altri oggetti svolgendo specifiche azioni.
Un’oggetto è quindi la rappresentazione di una qualsiasi cosa che ha uno stato e un
comportamento.
LE CLASSI
La classe costituisce la base della OOP: essa descrive la natura di un oggetto e ne
definisce il suo comportamento.
Una classe è un “modello” per un insieme di oggetti “analoghi”, caratterizzati:
Dalla stessa rappresentazione interna;
JAVA
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe

Anteprima parziale del testo

Scarica Java: classi, oggetti, ereditarietà e polimorfismo e più Dispense in PDF di Informatica solo su Docsity!

Java

Classi e oggetti

Un programma OOP si basa sull’utilizzo di moduli software già preparati. L’elemento fondamentale nella OOP è l’ oggetto che è appunto un “insieme di dati e di funzioni” che prende “vita” da una classe. Nella programmazione OOP l’oggetto è dunque un’ istanza di una classe. Aspetti fondamentali classi e oggetti:

  • Tra^ classe^ e^ oggetto^ vi è la stessa relazione che sussiste fra un^ tipo^ e una^ variabile del paradigma imperativo.
  • Le^ classi^ definiscono dei^ prototipi^ per gli oggetti.
  • All’interno delle^ classi si incapsulano i dati e le funzioni , dove le funzioni sono strettamente correlate con i dati che manipolano. GLI OGGETTI Ogni oggetto , anche se appartiene alla stessa classe , è generalmente differente dagli altri, cioè ha proprietà (attributi) che lo caratterizzano, mentre condivide con gli altri suoi simili il comportamento. Un’ oggetto è un’entità stratta dotato di specifici attributi e in grado di cooperare con altri oggetti svolgendo specifiche azioni. Un’oggetto è quindi la rappresentazione di una qualsiasi cosa che ha uno stato e un comportamento. LE CLASSI La classe costituisce la base della OOP: essa descrive la natura di un oggetto e ne definisce il suo comportamento. Una classe è un “modello” per un insieme di oggetti “analoghi”, caratterizzati:
  • Dalla stessa^ rappresentazione interna ;
  • Dalle stesse^ operazioni^ con lo stesso^ funzionamento , che permettono di descrivere un insieme di classi che hanno gli stessi attributi (variabili) ed eseguono le stesse operazioni (funzioni o metodi). La classe si può definire come lo schema di base dal quale è possibile creare i singoli oggetti. La descrizione dei metodi e delle variabili è contenuta all’interno della classe e non negli oggetti. Tutti gli oggetti istanza di una stessa class:
  • Condividono la^ stessa struttura interna^ e lo stesso^ funzionamento.
  • Hanno ciascuno la^ propria identità^ e il proprio^ stato. Nella progettazione di una classe è necessario:
  • Definire (e nascondere) la rappresentazione dei dati all’utente;
  • Definire tutte le operazioni applicabili agli oggetti come elementi di un tipo di dato astratto;
  • Garantire che l’utente possa manipolare gli oggetti solo tramite operazioni del tipo di dato astratto a cui gli oggetti appartengono. Nei linguaggi di programmazione la classe viene dichiarata per mezzo della parola chiave class, con la seguente sintassi: All’interno della classe è possibile specificare il tipo di visibilità di dati e codice tramite i seguenti modificatori di accesso:

Il costruttore di default che appare nell’esempio è il costruttore che viene automaticamente creato quando si dichiara una classe e non contiene alcun codice. Oltre al costruttore di default nella classe si inseriscono altri costruttori che però hanno uno o più parametri in ingresso. OVERLOADING La possibilità offerta dai linguaggi a oggetti di consentire la coesistenza di più metodi con lo stesso nome prende il nome di overloading. Una classe può contenere più costruttori e metodi con con stesso nome purché distinti da intestazioni (signature) diverse, cioè:

  • Con un numero diverso di parametri (numerico);
  • Con un numero uguale di parametri ma di tipo diverso (tipale):
  • Con un numero uguale di parametri ma con ordine diverso (posizionale); DISTRUZIONE DEGLI OGGETTI Il distruttore serve per effettuare quelle azioni di “pulizia” che risultano necessarie prima della d’allocazione dell’oggetto, ovvero:
  • Deallocare i dati dinamici che sono stati allocati da funzioni membro dell’oggetto;
  • Chiudere i^ file che sono stati aperti dalle funzioni membro dell’oggetto.

La necessità di scrivere e richiamare direttamente il costruttore esiste solo nel caso di progetti articolati o complessi, mentre nelle classi semplici esiste un distruttore standard, che viene automaticamente chiamato dal sistema ogniqualvolta un oggetto viene deallocato in una delle tre seguenti situazioni:

  • L’oggetto è locale e si esce dal blocco in cui è dichiarato;
  • L’oggetto è nella memoria dinamica (heap) e viene rimosso il riferimento a esso;
  • L’oggetto è un membro di un altro oggetto e quest’ultimo viene deallocato. Il metodo distruttore viene indicato con la seguente notazione: METODI GETTER/SETTER Il linguaggio Java non prevede particolari meccanismi per implementare i metodi getter/setter: per ogni attributo vengono scritte due funzioni che, a seconda delle situazioni, possono essere definite pubbliche o private, antecedendo al nome del metodo l’opportuno qualificatore (o modificatore). CREAZIONE DI OGGETTI IN JAVA Una volta realizzare la classe, il linguaggio Java mette a disposizione una parola chiave per la creazione degli oggetti da aggiungere alla solita dichiarazione delle variabili: la parola new.

Classe String

Nei linguaggi imperativi le stringhe sono generalmente realizzate mediante un array di caratteri, in Java invece sono oggetti della classe String. La classe String mette a disposizione molteplici metodi per analizzare e manipolare le stringhe.

  • Concatenazione di stringhe: operatore + La concatenazione di due (o più) stringhe in una nuova stringa viene effettuata con il semplice operatore somma oppure con l’apposito metodo concat().
  • Confronto di stringhe: compareTo() Le istanze String possono essere confrontate con il metodo compareTo(): 0 se s1 è uguale a s2; <0 se s1<s2; >0 se s1>s2.
  • Confronto tra stringhe: equals()
  • Lunghezza di una stringa: lenght() Restituisce il numero di caratteri presenti nella stringa.
  • Sostituzione /rimozione di caratteri: replace Permette di sostituire uno o più caratteri.
  • Accesso a una sottostringa: substring() Estrae una parte di stringa (sottostringa) e la memorizza in una nuova variabile con il metodo substring(<pos_iniziale>) oppure substring(<pos_iniziale>,<pos_finale>).

Ereditarietà, polimorfismo e relazioni tra le classi

L’ereditarietà è uno dei principi basilari della OOP. L’ ereditarietà è un processo grazie al quale una classe acquisisce un bagaglio di proprietà da una classe più generica per ampliarla e specializzarla, in modo da permettere di descrivere una classificazione gerarchica di oggetti senza ridefinire ogni volta le singole caratteristiche comuni a ogni classe. Con il termine ereditarietà si indica un meccanismo per definire nuove classi in termini di classi esistenti già definite con un più alto livello di astrazione, dalle quali ereditare attributi e comportamenti. L’ereditarietà permette di raggruppare classi correlate in modo che possano essere:

  • Gestite collettivamente;
  • Riusate. Le classi vengono quindi organizzate secondo una classificazione gerarchica e viene determinato un concetto di antenato e discendente. La classificazione gerarchica permette di definire livelli di dettaglio e di aggregazione utili per il riutilizzo da parte di altre classi. La classe antenato di una nuova classe (il padre ) prende il nome di superclasse e la classe discendente di una classe (il figlio ) esistente prende il nome di sottoclasse. Ogni sottoclasse eredita le caratteristiche della sua superclasse e ogni istanza di una sottoclasse è (IS-A) un’istanza della sua superclasse. Vale inoltre la proprietà transitiva : ogni istanza di una sottoclasse è un’istanza di tutte le sue classi antenato.

La relazione IS-A è la relazione tra una classe (superclasse o classe base) e una o più versioni specializzate (sottoclassi). Prende il nome di regola di appartenenza o IS-A relationship. La verifica della relazione di appartenenza avviene ponendo due semplici domande in merito a un’oggetto per stabilire se esiste una relazione gerarchica:

  • È un ;
  • È un tipo di. GENERALIZZAZIONE E SPECIALIZZAZIONE I processi che portano all’implementazione dell’ereditarietà sono la generalizzazione e la specializzazione. Siamo in presenza di una specializzazione (o classificazione gerarchica ) quando, partendo da una classe generica, si definiscono una o più sottoclassi allo scopo di ottenere oggetti più specializzati, che abbiano tutte le caratteristiche della classe di partenza più un insieme di caratteristiche specifiche che li distinguono. L’ ereditarietà viene applicata seguendo una metodologia top-down. ES. Animali —> Vertebrati —> Mammiferi —> Equini —> Cavallo Siamo in presenza di una generalizzazione se, a partire da un certo numero di classi, si definisce una superclasse che ne raccolga le caratteristiche comuni, individuando quindi una classe più generica. L’ ereditarietà viene applicata seguendo una metodologia bottom-up. ES. Formula 1 —> Automobile —> MezzoAMotore —> MezzoDiTrasporto FUNZIONI DELLA SOTTOCLASSE La classe derivata (sottoclasse) può :
  • Aggiungere nuovi^ attributi^ e nuovi metodi a quelli della superclasse;
  • Ridefinire alcuni^ metodi^ ereditari dalla superclasse, riscrivendone il codice utilizzando lo stesso nome e firma ( override );

VISIBILITA’ DEGLI ATTRIBUTI

Gli attributi privati della classe padre non sono accessibili dalla classe figlio; Gli attributi pubblici della classe padre sono accessibili dalla classe figlio ma in Java rimangono pubblici. Una classe figlio quindi ha accesso solo ai metodi e attributi della classe padre che non sono di tipo privato. Dichiarare un attributo protected nella superclasse equivale a:

  • Dichiarare l’attributo^ public^ per le sottoclassi;
  • Dichiarare l’attributo^ private^ per tutte le classi esterne. Nella OOP i termini modificatore, qualificatore e specificatone sono spesso utilizzati come sinonimi e indicano il “livello” di visibilità di metodi e attributi. @OVERRIDE Nelle gerarchie è possibile indicare in modo esplicito un metodo che viene sovrascritto: viene aggiunta la parola riservata @Override prima della sua scrittura.

REALIZZAZIONE DI UNA GERARCHIA

Si definisce gerarchia di specializzazione il legame logico che esiste tra classi e sottoclassi. La regola pratica da seguire per la costruzione di un albero di eredità dice che se un oggetto A è anche un oggetto B, allora la classe A eredita dalla classe B. EREDITARIETA’ MULTIPLA Es. (animale che è contemporaneamente un mammifero terrestre e un rettile). Utilizzando l’ereditarietà multipla, è possibile che si verifichi il “ name clash ” cioè lo scontro tra metodi che hanno lo stesso nome. Per evitare problematiche dovute al name clash , Java realizza l’ereditarietà multipla non in modo diretto ma mediante il meccanismo delle interfacce , che gli permette inoltre di effettuare un miglior controllo nella gerarchia delle classi.