Documento di Università sulla programmazione orientata agli oggetti in Java. Il Pdf, per la materia Informatica, spiega i principi della programmazione orientata agli oggetti (OOP) in Java, con concetti chiave come astrazione, information hiding, classi, oggetti, metodi, ereditarietà e polimorfismo.
Ver más22 páginas
Visualiza gratis el PDF completo
Regístrate para acceder al documento completo y transformarlo con la IA.
La programmazione orientata agli oggetti utilizza i concetti di astrazione e di information hiding Astrazione: la visione di un oggetto che si concentra su informazioni che sono utili all'implementazione di un programma ignorando tutte le altre che non sono necessarie. Quindi si ha una semplificazione di una certa realtà, andando a considerare le sole caratteristiche utili alla risoluzione di un problema. Una stessa realtà può avere astrazioni diverse a seconda del problema da risolvere. Information hiding: tecnica di sviluppo software in cui ciascuna interfaccia di ciascun modulo (sottoprogramma) rivela il meno possibile su how il modulo lavora. Nella programmazione O-O il modulo è rappresentato dalle classi.
Il concetto di astrazione è strettamente legato ai modelli, cioè ad una semplificazione di una realtà. Gli elementi di un modello sono gli oggetti, i quali appartengo ad una classe e ne costituiscono un'istanza, mentre le caratteristiche sono i dati i quali sono passivi e di solito privati (variabili d'istanza). Quando vengono assegnati i dati, allora viene creato un oggetto di quella classe (è il concetto del costruttore, cioè un metodo che non ha nessun valore di ritorno) Una categoria di oggetti forma una classe. Una classe descrive i comportamenti (i metodi in Java) comuni a tutti gli oggetti che ne fanno parte Gli oggetti sono elementi attivi di una classe, perché eseguono delle azioni. Essi sono attivati dalla ricezione di un messaggio. I messaggi a cui un oggetto può rispondere vengono determinati da una classe attraverso la dichiarazione di metodi Le classi hanno un nome, mentre gli oggetti no, ma sono identificati da riferimenti (reference)
Java è un linguaggio di programmazione orientato agli oggetti che viene utilizzato per sviluppare applicazioni per diverse piattaforme, come desktop, mobile, web e cloud. Quando si scrive un codice Java, si creano classi che contengono variabili e metodi. Le variabili rappresentano gli stati di un oggetto mentre i metodi rappresentano le azioni che un oggetto può compiere. Una volta che le classi sono state create, è possibile creare oggetti di quelle classi, ognuno con le proprie variabili e metodi. Java utilizza un compilatore per convertire il codice sorgente in bytecode, che viene eseguito dalla Java Virtual Machine (JVM). La JVM è presente sulla maggior parte dei sistemi operativi e garantisce che il codice Java viene eseguito in modo uniforme su diverse piattaforme. Java è sia compilato che interpretato. Nel processo di traduzione un codice viene prima compilato e si genera un file scritto in un linguaggio intermedio che è il JAVA BYTECODE il quale è codice binario ma non linguaggio macchina. Successivamente interviene la JAVA VIRTUAL MACHINE, specifica per la macchina utilizzata, che interpreta il bytecode (lo traduce in linguaggio macchina) e lo esegue.
Un metodo è un comportamento che può avere un oggetto di una classe. Due oggetti comunicano tra loro attraverso l'invio e ricezione di messaggi, quindi attraverso i metodi Esistono due tipi di metodi:
Il casting è la capacità di trattare un oggetto di una classe come se fosse di un'altra classe. Ad esempio: Animale a = new Gatto(); Gatto g = (Gatto) a; In this esempio, l'oggetto a di tipo Animale viene trattato come se fosse di tipo Gatto e viene assegnato alla variabile g di tipo Gatto. Il casting può essere utilizzato anche per trattare un oggetto di una classe come se fosse di un tipo primitivo, ad esempio: int i = (int) 3.14; In questo caso, il valore 3.14 viene trattato come se fosse di tipo intero e viene assegnato alla variabile i.
Se non si specifica nessun specificatore di accesso per un elemento di una classe in Java (ad esempio, un campo o un metodo), allora l'elemento sarà considerato "package-private" di default. Ciò significa che l'elemento sarà accessibile solo all'interno del package in cui è definito.
Static e abstract non sono specificatori di accesso in Java. Cosa significa che un membro di classe è statico? Significa che appartiene alla classe stessa e non alle istanze della classe, e può essere utilizzato indipendentemente dall'esistenza di istanze della classe. Qual è l'effetto del modificatore di accesso static sulla visibilità di un membro di classe? Non ha alcun effetto sulla visibilità del membro di classe. La visibilità di un membro statico è determinata dallo specificatore di accesso (ad esempio, public, private, etc.). Qual è la differenza principale tra i membri di classe statici e i membri di istanza? I membri di classe statici appartengono alla classe stessa e non alle istanze della classe, mentre i membri di istanza appartengono alle istanze della classe. Inoltre, i membri di classe statici possono essere utilizzati indipendentemente dall'esistenza di istanze della classe, mentre i membri di istanza possono essere utilizzati solo a seguito della creazione di un'istanza della classe. Posso accedere ai membri di istanza all'interno di un metodo statico? No, i metodi statici possono accedere solo ai membri di classe statici e non ai membri di istanza. Se si tenta di accedere a un membro di istanza all'interno di un metodo statico, il compilatore segnalerà un errore. Posso invocare un metodo non statico utilizzando il nome della classe anziché l'istanza della classe? No, i metodi non statici possono essere invocati solo a seguito della creazione di un'istanza della classe e utilizzando l'istanza stessa. Tentare di invocare un metodo non statico utilizzando il nome della classe genererà un errore del compilatore. Abstract è un modificatore di classe che viene utilizzato per indicare che una classe è astratta. Una classe astratta è una classe che non può essere istanziata e deve essere estesa da una sottoclasse concreta. Una classe astratta contiene almeno un metodo astratto, cioè un metodo senza implementazione che deve essere implementato dalle sottoclassi.
Il garbage collector (GC) di Java è un componente del sistema di runtime Java che si occupa di gestire l'allocazione e la liberazione della memoria. Quando un oggetto non viene più utilizzato nell'applicazione, il garbage collector può liberare la memoria occupata dall'oggetto per poterla riutilizzare in seguito. In particolare il GC vede gli oggetti non più raggiungibili, cioè che non sono più referenziati, e recupera la memoria occupata da questi Il periodo di vita (scope) dell'oggetto inizia con la creazione e continua ad esistere finché c'è una variabile di riferimento che si riferisce ad esso
Sono cicli del tipo: leggi il primo oggetto while(un oggetto valido è stato letto) { esegui delle operazioni con l'oggetto leggi il prossimo oggetto } Questo tipo di ciclo viene chiamato read process loop pattern Viene utilizzato nelle classi gestore per popolare una collezione di una classe base Per usare questo pattern è necessario definire:
La responsabilità di una classe può essere definita come l'insieme di operazioni che la classe è in grado di eseguire e di informazioni che è in grado di gestire. Ad esempio, una classe "Libro" potrebbe essere responsabile di gestire informazioni come il titolo, l'autore e il numero di pagine di un libro, mentre operazioni come il prestito o il ritorno di un libro saranno gestite dalla classe "Biblioteca". Il concetto di responsabilità delle classi è importante poiché aiuta a definire il ruolo di ogni classe all'interno di un programma e a garantire che ogni classe svolga solo il compito per cui è stata progettata, evitando il sovraccarico di funzionalità. Inoltre, il rispetto delle responsabilità delle classi contribuisce a garantire la coerenza del programma e a rendere il suo codice più facile da comprendere e da mantenere. Ecco un esempio di classe che non rispetta la responsabilità: // costruttore public Studente(String nome, String cognome, int matricola, double mediaVoti, String password) { this. nome = nome; this. cognome = cognome; this.matricola = matricola; this.mediaVoti = mediaVoti; this. password = password; // metodi public void cambiaPassword(String vecchiaPassword, String nuovaPassword) { if (vecchiaPassword. equals ( this. password) ) { this. password = nuovaPassword; } public void inviaEmail(String destinatario, String oggetto, String testo) { // codice per inviare un'email } public void prenotaLibro(String titolo, String autore) { // codice per prenotare un libro in biblioteca public void pagaTassa(double importo) { // codice per effettuare un pagamento online } private String nome; private String cognome; private int matricola; private double mediaVoti; private String password; Questa classe "Studente" ha diverse responsabilità, come gestire il nome, il cognome, la matricola e la media dei voti di uno studente, e fornire il metodo "cambiaPassword" per modificare la password dello studente. Tuttavia, la classe ha anche altre responsabilità, come inviare email, prenotare libri in biblioteca e effettuare pagamenti online, che non sono strettamente correlate alla sua principale responsabilità di gestire le informazioni di uno studente. Questo potrebbe rendere la classe più difficile da comprendere e da mantenere e potrebbe creare confusione su quali siano le sue effettive responsabilità.