









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
appunti java che vanno dalla base con spiegazione di polimorfismo, ereditarietà e incapsulamento
Tipologia: Appunti
1 / 16
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!










-linguaggio orientato agli oggetti -più semplice di altri linguaggi -funzionalità di rete -linguaggio interpretato, ma esistono i compilatori jit Just in time (jit) —-> vedere -robusto -sicuro -portabile -dinamico, classi ricercate dinamicamente run-time -applicazione scalabili Io programmo una volta e il programma è portatile su quasi tutti i dispositivi. Java ha un compilatore (legge il programma e lo traduce in linguaggio macchina) crea un bytecode che poi viene interpretato (legge riga x riga e lo esegue) dalla java virtual machine. Più veloce il linguaggio compilato che quello interpretato. Il bytecode (il linguaggio java compilato) è una via di mezzo, non è leggibile ma si può tornare al codice scritto dal programmatore, cosa non possibile (o molto complicata) per altri linguaggi. Perché robusto? -forte controllo dei tipi -gestisce le eccezioni (obbliga il programmatore a gestire situazioni anomale) -controllo puntatori nulli -controllo nei limiti degli indici degli array (impossibile accedere in una posizione degli array fuori indice) Perché sicuro? All’epoca poter eseguire un applet java in una finestra a parte del browser tramite la java virtual machine era molto sicuro. Perché portabili? -Bytecode eseguibile su ogni java virtual machine. -Caratteri UNICODE -Numero di byte per i tipi uguale per tutte le piattaforme Java è un linguaggio Multithread.
Java è un istanza di più classi. Ogni classe pubblica deve essere contenuta in un file separato avente lo stesso identificatore (idClasse.java) Per eseguire un programma si invoca l’interprete main che può essere presente in più classi, l’interprete esegue il metodo main() fino alla sua terminazione. Tramite terminale si usa java per compilare la classe e poi si utilizza java per avviare il nostro codice. Un’applicazione java è costituita da più classi in relazione tra di loro organizzate in pacchetti (package). Le variabili non sono globali, sono visibili solo nelle classi in cui vengono dichiarate. Un IDENTIFICATORE è il nome che do alle variabili, metodi o classi. In particolare scriviamo le classi in CamelCase. Alcune parole non possono essere usate come identificatore. Una VARIABILE è una “casella” con un nome a cui posso assegnare un valore. Posso eseguire operazioni con le variabili (+ - ecc.). Per convenzione per le variabili usiamo il camelCase minuscolo. Sono caratterizzate da un TIPO, uno SCOPE (durata o Life time) e VISIBILITÀ. Le variabili hanno un TIPO, i tipi possono essere: Primitivi ( byte, short, int, long, float, double, char, boolean) String (essendo una classe inizia con la Maiuscola) Number (essendo una classe inizia con la Maiuscola In java non esiste il tipo puntatore. I literals è il modo in cui noi codifichiamo i valori all’interno di java (42, 0x2a, 0b00101010, sono la stessa cosa scritta in maniera diversa) Per scrivere un certo numero in long usiamo la L affianco al numero (9876543210L) Quando devo scrivere un numero decimale utilizzo il. ed è di tipo double, se metto la f alla fine del numero è un tipo float. In Java i caratteri sono appunti Unicode quindi posso scrivere i char anche con gli Unicode ed utilizzo i singoli apici ‘ ‘. Lo SCOPE o Life Time di una variabile LOCALE (che sta all’interno di un metodo) è il tempo in cui resta in vita, ed esiste solo all’interno del metodo in cui è stata creata. Le variabili di ISTANZA sono variabili dichiarate all’interno della classe ma fuori dal metodo. Le variabili di CLASSE (static) sono variabili di istanza che non possono essere modificate. La VISIBILITÀ riguarda le variabili di istanza o di classe e possono essere: Private: accessibile solo all’interno della classe. Public: accessibile da qualsiasi parte del codice. Protected: accessibile ad ogni altra classe che appartiene al package ed ogni altra classe che ne deriva. Di Default la variabile è visibile all’interno di tutte le classe dello stesso package. Ci sono alcuni variabili dette COSTANTI che non cambiano mai valore, per dichiararle si utilizza final. Una variabile final per convenzione si scrive lo SNAKE_UNDER_CASE maiuscolo.
For for (inizializzazione; condizione; incremento) { istruzione } Viene eseguito il codice finché la condizione è vera e viene analizzata ad ogni ciclo. Il break può essere usato anche nei cicli e serve per uscire completamente. Il continue serve per saltare una singola iterazione. Per gestire l’input da tastiera possiamo usare Scan. METODI È possibile raggruppare blocchi di codice in METODI, questi sono delle funzioni che eseguono una serie di istruzioni ed è possibile richiamare ogni volta che vogliamo. Il metodo main è un metodo statico, al cui interno richiamo gli altri metodi. Il nuovo metodo fa scritto quindi al di fuori del main ma all’interno della classe. Un metodo ha il seguente costrutto: [public|protected|private] [static] [final] Tipo identificatore ([Tipo1 parametro1, Tipo2 parametro2, ….TipoN parametroN]) [throw Eccezione1, Eccezione2,…..] { //codice return varTipo; } Il return è opzionale nel caso di un void e serve per far tornare alla fine delle istruzioni il risultato, la variabile o numero restituita deve essere del tipo del metodo e quando viene invocata oltre a ritornare il valore della variabile termina il metodo. Il tipo void indica che il metodo non restituisce nessun valore. Per convenzione l’identificatore è scritto con il camelCase minuscolo. I parametri sono delle variabili passate in ingresso quando si invoca il metodo che ci servono all’interno del metodo. Throws serve a gestire le situazioni anomale ( chiamate eccezioni) che si possono verificare nel nostro metodo, e termina l’esecuzione del codice sollevando un eccezione. Un metodo è univocamente determinato dalla sua firma, cioè dal nome e dalla lista di parametri. Public metodo visibile ovunque Private metodo visibile solo nella classe Protected metodo visibile nelle classe dello stesso package e in quelle estese Default visibile solo nello stesso package Se un metodo viene contrassegnato come final, le classi figlie potranno usare il metodo ma non potranno fare l’override del metodo.
Se un metodo viene contrassegnato con static vuol dire che è un metodo associato ad una classe e non ad un istanza. Normalmente i metodi non sono statici, viene prima creata un istanza e poi il metodo. Metodo statico ———-> NomeClasse.nomeMetodo(…) Metodo non statico ——-> nomeIstanza.nomeMetodo(…) ARRAY Contenitore che permette di gestire una sequenza di lunghezza fissa di elementi tutti del medesimo tipo. Tipo[ ] nome; Dopo la definizione di un array la variabile sono inizializzate col valore null. Quindi prima va inizializzato: nome = new Tipo[n] Una volta creato l’array è possibile accedere alla posizione indicata dal numero nella parentesi quadra. nome[3]; indica la quarta posizione Si può accedere alla lunghezza dell’array con: nome.lenght; //indica il numero di elementi di un array È possibile caricare un array di valori anche tramite una lista nel seguente modo: int[ ] numeroGiorniPerMese = {31, 28, 31 …. }; Gli array possono essere multidimensionali: int [ ] [ ] [ ] arrayConDimensione3 = new int [4][5][6] il limite delle dimensioni è la memoria del computer. Java mette a disposizione la classe java.util.Arrays che mette a disposizione numerosi algoritmi per lavorare sugli array (ricerca, ordinamento, ecc) STRINGHE String titolo = “Lezione sulle stringhe” Sono un insieme di caratteri contenuti tra “ “ Ma come funziona? String titolo = new String (“Titolo dell’opera”) char[ ] arraySottotitolo = { ’s’,’o’,’t’,’t’,’o’,’t’,’i’,’t’,’o’,’l’,’o’}; String sottotitolo = new String (arraySottotitolo); Le String espongono diversi metodi: int lenght(); //ritorna il numero di caratteri contenuti nell’oggetto È possibile concatenare le stringhe con concat al posto del +
Overload ——-> metodi con lo stesso nome nella stessa classe con parametri diversi. Override ——-> metodi con lo stesso nome tra classe padre e figlio ma con codice diverso. Quando si utilizza una classe statica non c’è bisogno di allocare un oggetto di quella classe ma si può usare direttamente l’identificatore per agire sui metodi (perchè priva di costruttore e quindi inutile stanziare un oggetto). EREDITARIETÀ PT Classe derivata come specializzazione della classe base. -La classe base modella un concetto generico -La classe derivata un concetto più specifico La classe derivata: -Dispone di attributi e metodi della base -Può aggiungere nuovi attributi e metodi -Può effettuare l’override di metodi della classe base VECTOR (Collection) Caratterizzato da una dimensione e una capacita. La capacita indica quanti elementi POTREI contenere nel mio vector, ed è possibili aumentarla in run-time. Lo fa in automatico o con un metodo ensureCapacity() (poco utilizzato perché lo fa in automatico) trimToSize m accorcia il vector e fa in modo che la capacita diventi uguale alla dimensione. CLASSI WRAPPER Per ogni tipo primitivo esiste una classe wrapper, cioè un oggetto corrispondete al tipo primitivo. Int ———-> Integer I tipi primitivi non sono oggetti quindi sarebbe impossibili usarli nelle Collection Quindi le classi wrapper “avvolgono” i tipi primitivi per poterli usare con le Collection aggiungendogli dei metodi. Tutti i tipi primitivi derivano da Number tranne Character e Boolean che derivano da Object. BOXING UNBOXING AUTOBOXING Boxing Integer x = new Integer (10); Double y = new Double (5.5); Boolean z = Boolean.parseBoolean(“true”); L’autoboxing è una funzione di java che fa la cosa sopra in automatico. Integer x = 10; Double y = 5.5f; Boolean z = true; Number n = 0.0f; L’unboxing mi trasforma in automatico il mio oggetto in primitivo nel seguente modo: Integer x = -1; Int y = x; ARRAYLIST Funziona come il vector ma è più veloce. La capacity è gestita in automatico dalla classe e non è visibile a noi.
È una coda in cui è possibile inserire elementi da entrambi le parti. ——>\\\\<——- La linkedList è più efficiente rispetto alla arrayList se inserisco o rimuovo dai vertici della coda e non dal centro (anche se è possibile farlo) FOREACH È un nuovo costrutto che è possibile usare con le liste e gli array(di oggetti). for (Integer i : l) questo è un foreach. Per ogni elemento i della mia lista L Integer presuppone che ogni elemento sia di tipo intero, se dovessi avere tipi diversi utilizzo Object perché ogni classe di java deriva da Object. MULTITASKING (CONCORRENZA) e MULTITHREADING È la possibilità di eseguire più programmi contemporaneamente dividendo il tempo di esecuzione tra i vari programmi. I programmi quindi competono per l’uso delle risorse (cpu) ma lo fa in modo talmente veloce che noi percepiamo un esecuzione simultanea. Quindi la cpu divide la sua attenzione tra tutti i programmi del pc tra cui la JAVA VIRTUAL MACHINE, che a sua volta divide la sua attenzione ai rispettivi THREAD (multithread). Ogni thread viene eseguito in uno spazio di memoria a lui dedicato che scambia “messaggi” con gli altri thread. Per DICHIARARE UN THREAD avremmo bisogno di una sua classe e possiamo farlo in 2 modi:
Successivamente dovremmo dichiarare PER FORZA un metodo di nome public void run( ) in cui andremmo a mettere il nostro codice che verrà eseguito in concorrenza. Ciclo di vita: Nasce con start(); Rimane in esecuzione eseguendo le istruzioni del metodo run(); Posso sospendere il thread con il codice sleep(n); Termino il thread con il metodo stop(); Il metodo stop(); è considerato deprecato perché il mio thread potrebbe trovarsi in uno stato inconsistente (cioè viene stoppato mentre sta facendo qualcosa) e quindi consigliato l’uso di variabili “osservabili”. Parliamo di SINCRONIZZAZIONE quando due thread accedono alla stessa variabile condivisa nello stesso momento, per non far verificare errori possiamo usare un modificatore (synchronized) che mi va a dire che solo un thread per volta possa usare un oggetto condiviso. Possiamo usare il modificatore synchronized sia per un blocco di codice che per un metodo.
Un comparatore implementa un metodo compare per comparare due oggetti. Java.util Interface Comparatoruna funzione che mappa un oggetto in un numero intero (codice hash) Object.hashCode Il metodo hashCode deve produrre lo stesso numero anche quando invocato più volte sullo stesso oggetto. Regola: si deve sovrascrivere hashCode() in tutte le classi ove viene sovrascritto equal︎(Object o) INTERFACCIA MAPPA È un gruppo di coppie di oggetti chiave-valore. Una Map puo resti︎tuire un Set di chiavi, una Collection di valori o un Set delle sue coppie. Idea: associare oggetti (chiave) a oggetti (valore), invece di associare numeri a oggetti (come ArrayList) CICLO DI VITA DEL SOFTWARE: MODELLI DI SVILUPPO Progettazione del software —> Realizzazione —> Collaudo —> Manutenzione Negli anni 60 il processo di realizzazione del software è passato da quello artigianale a quello industriale. Esistono vari modelli per descrivere e gestire il ciclo di vita del software, uno dei più diffusi è lo standard internazionale ISO/IEC 12207:2008. È POSSIBILE INDIVIDUARE ALCUNE CATEGORIE DI METODOLOGIE DI SVILUPPO: -Metodologie pesanti —> modello a cascata —> esecuzione lineare -Metodologie iterative —> modello a spirale —>esecuzione ciclica delle quattro fasi (identificazione degli obbiettivi, valutazione, sviluppo, verifica) -Metodologie agili —> manifesto agile —>forte coinvolgimento del cliente e impegno a consegnare nuovi rilasci software frequentemente e velocemente.
Modello a spirale 1.Analisi: Indagine preliminare del contesto all’interno del quale deve essere inserito il prodotto. analisi dei requisiti, analisi del dominio applicativo, fattibilità…. quindi identificare il problema che deve essere risolto e arrivare ad un elaborazione di un documento.
I flussi hanno una sorgente:
E hanno una destinazione:
Fornisce varie operazioni per manipolare i file già esistenti. File inputFile = new File (“input.txt”); Non possiamo leggere direttamente un oggetto di tipo file ( per leggerlo FileReader) Alcuni metodi:
Ci permettono di memorizzare tutte le caratteristiche di un oggetto Scrittura —-> ObjectOutputStream Ripristinare un oggetto —-> ObjectInputStream La memorizzazione di oggetti in un flusso viene detta serializzazzione. Quindi implementa l’interfaccia serializable. Per scrivere l’oggetto —-> MyClass mc = new ….. ObjectOutputStream = new ObjectOutputStream( new FileOutputStream(“mc.dat”)); out.writeObject(mc); Per leggerlo ——-> ObjectInputStream in = new ObjectInputStream( new FileInputStream(“mc.dat”)); MyClass mc = (MyClass) in.readObject(); ACCESSO CASUALE Fino ad ora abbiamo letto un file in modo sequenziale, con l’accesso casuale possiamo accedere a posizioni arbitrarie del file. Random access —-> il tempo di lettura o di accesso alla memoria è lo stesso ovunque Per spostare il puntatore del file usiamo un oggetto di tipo RandomAccessFile. E il metodo che mi permette di spostarmi è seek: f.seek(n); //n posizione in byte F.getFilePointer() //fonrinsce la posizione corrente. LA COMUNICAZIONE TRA COMPUTER Java offre delle classi per la scrittura di applicazioni client-server, attraverso un Socket. Il socket è un’astrazione software per interfacciare 2 programmi. Attraverso il pocket passa un flusso(stream). La classe URLConnection accetta in ingresso un url html e restituisce la pagina. Per connetterci tra computer dobbiamo conoscere l’IP del computer e un particolare numero di Porta.
Nel protocollo TCP/IP (v4) i numeri di porta (rappresentati in numeri da 16 bit) che possono variare da 0 a 65535. Da 0 a 1024 sono riservati a particolari servizi (http, pop3, smtp, ecc) CLASSI Socket E ServerSocket La prima si occuperà del client e la seconda del server. Il server si mette in ascolto su una porta, quando il client tenera di aprire una porta il server si limiterà a richiamare il metodo accept(). Il client apre la connessione costruendo un oggetto tipo Socket a cui verra passato l’indirizzo IP e la porta, quindi le due macchine potranno comunicare attraverso lo stream che si è aperto. PATTERN - PROGRAMMAZIONE AD OGGETTI Progettazione software —-> individuazione di un insieme di oggetti. oggetto correttamente individuato il più possibile riusabile definendo le relazioni tra classi, gerarchie e ereditarietà Design pattern —-> - soluzioni a problematiche ricorrenti.