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


Programmazione orientata agli oggetti e Java, Sbobinature di Programmazione Java

appunti di Java ben presi, inclusi esercizi fatti in classe. indice: - come nasce - idea dell'object oriented programming - introduzione a Java - classi - costruttori - metodi - proprietà static - sottoclassi e ereditarietà - binding dinamico e statico - overriding e overloading - array - metodi ricorsivi - classi astratte - interfacce - collections - arraylist -hashmap - eccezioni -package, file voto conseguito con questi appunti: 30L

Tipologia: Sbobinature

2018/2019
In offerta
30 Punti
Discount

Offerta a tempo limitato


Caricato il 30/12/2021

vittoria.demaria
vittoria.demaria 🇮🇹

5

(2)

3 documenti

1 / 106

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
1
Introduzione al Future Internet – Object Oriented
programming
Lezione 1.
- Laboratori da terza settimana online/presenza.
Presenza: disponibilità pomeriggi di lunedì, martedì, mercoledì.
4 assignment durante il corso. Il primo sarà intorno a metà ottobre. Costruiremo
un progetto Java. Chi fa tutti e 4 gli assignement l’esame sarà una discussione del
progetto.
Solo per chi ha consegnato gli assignement ci sarà un pre-appello.
Corso di Fondamenti di Informatica vediamo alcuni aspetti di algoritmi più
avanzati.
Esistono vari modi di programmare i calcolatori. Linguaggi di basso e alto livello.
Prevalentemente abbiamo visto la programmazione imperativa (procedurale)
si basa sul processo di memoria e assegnamento. Abbiamo una serie di variabili e
un algoritmo. La programmazione imperativa va in crisi quando si passa alla
programmazione di grandi dimensioni, la programmazione imperativa è ideale
per il singolo programmatore che ha il controllo dell’intero programma, ma nel
momento in cui il programma diventa di grandi dimensioni le cose si complicano.
Avere un unico pool di variabili diventa complicato quando ci sono più persone
che lavorano al progetto. Diventa difficile anche avere semplicemente
un’organizzazione fatta solamente da strutture dati e algoritmo
Nasce l’esigenza di poter gestire parti di programmi separatamente e di poter
lavorare in modo indipendente sullo sviluppo di parti di sistema.
Esistono però altri paradigmi
Es.
Funzionale programmi in ambito matematico-scientifico. Basato su funzioni
matematiche.
Object Oriented
Logico
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64
Discount

In offerta

Anteprima parziale del testo

Scarica Programmazione orientata agli oggetti e Java e più Sbobinature in PDF di Programmazione Java solo su Docsity!

Introduzione al Future Internet – Object Oriented programming Lezione 1.

  • Laboratori da terza settimana online/presenza. Presenza: disponibilità pomeriggi di lunedì, martedì, mercoledì. 4 assignment durante il corso. Il primo sarà intorno a metà ottobre. Costruiremo un progetto Java. Chi fa tutti e 4 gli assignement l’esame sarà una discussione del progetto. Solo per chi ha consegnato gli assignement ci sarà un pre-appello. Corso di Fondamenti di Informatica vediamo alcuni aspetti di algoritmi più avanzati. Esistono vari modi di programmare i calcolatori. Linguaggi di basso e alto livello. Prevalentemente abbiamo visto la programmazione imperativa (procedurale) si basa sul processo di memoria e assegnamento. Abbiamo una serie di variabili e un algoritmo. La programmazione imperativa va in crisi quando si passa alla programmazione di grandi dimensioni, la programmazione imperativa è ideale per il singolo programmatore che ha il controllo dell’intero programma, ma nel momento in cui il programma diventa di grandi dimensioni le cose si complicano. Avere un unico pool di variabili diventa complicato quando ci sono più persone che lavorano al progetto. Diventa difficile anche avere semplicemente un’organizzazione fatta solamente da strutture dati e algoritmo Nasce l’esigenza di poter gestire parti di programmi separatamente e di poter lavorare in modo indipendente sullo sviluppo di parti di sistema. Esistono però altri paradigmi Es. Funzionale programmi in ambito matematico-scientifico. Basato su funzioni matematiche. Object Oriented Logico

Constraint Parallel PHP I annoProcedurale. In questo periodo nasce l’esigenza di ripensare globalmente come l’informatica si stava evolvendo. Siamo a metà degli anni ’70 il problema nasce da una serie di esigenze

  • Ripensare l’interazione. L’uso del calcolatore comincia a spostarsi, dagli specialisti verso tutti, quindi, bisogna ripensare completamente come la macchina interagisce con le persone.
  • Programmazione va ripensata. I programmi diventano “in the large” quindi servono nuovi strumenti e linguaggi.
  • I database cominciano ad assumere una importanza centrale. Bisogna ora gestire grandi quantità di dati.
  • Nascono i primi sistemi di AI e rappresentazione della conoscenza. Pensare a nuovi modi per rappresentare conoscenza Bisogna trovare un modo per ripensare a queste cose in un quadro uniforme. Tra le varie proposte di quel periodo c’è un gruppo di ricerca guidato da Alan Key. Nascono una serie di idee rivoluzionarie in un centro chiamato Xerox Parc (Palo Alto Research Center). Dynabook Propone la sua nuova idea di informatica e calcolatore. Secondo lui il calcolatore doveva essere una sorta di libro che poteva stare nello zaino, questo oggetto doveva essere usato con la manipolazione diretta perché i bambini imparano per immagini e suoni non per testo. Lavorare con il computer doveva essere fatto manipolando gli oggetti direttamente GUI e Mouse. Personal Computer Computer deve essere sul tavolo di ogni persona

Cercare di fare in modo di individuare quali sono le strutture dati e le funzionalità su quelle strutture dati. Nei linguaggi di programmazione nasce l’idea di introdurre attraverso il class diagram le strutture dato che mi servono. Tipi di dati verso Object Oriented 2 principi.

  1. Encapsulation : Raggruppare insieme strutture dati e funzioni che operano su quei dati.
  2. Hiding : Nascondere implementazione dei dati e offrire solo API delle funzioni.  Classi in Java Classe Tipo di dato astratto Per raccogliere in un’unica struttura la struttura dati e le operazioni su quella struttura, nascondendo l’implementazione. Es. dobbiamo gestire una tessera punti con matricola del possessore. Dobbiamo fare delle operazioni: sapere quanti punti ci sono, incrementare i punti ecc.. Quando poi andiamo ad implementare questa cosa andiamo a definire una variabile intera n matricola e in un file separato la variabile intera punti. Dopo definisco una serie di funzioni di utilità. In php: Function incrementa punti ($x) {$punti=$punti+$i} Function dimmipunti( ) {return $punti} Sul main faccio include tessera.php Da qui posso usare le variabili della tessera, come leggere i punti.

Ci sono però dei problemi: La definizione non è nascosta, non è nascosto che ho quelle variabili che si chiamano in quel modo. Nella programmazione tradizionale non ho nessun modo per nascondere all’esterno l’implementazione. Se poi questo programma è gestito da altre persone si complicano le cose (se due persone chiamano due variabili allo stesso modo poi si creano conflitti). IDEA DELL’OBJECT ORIENTED public class Tessera { private int punti; private int matricola; Public Tessera() {punti=0; matricola=0;} public void reset() {punti=0; matricola=0} public void inc(int x) {punti=punti+x;} public void setMatricola (int x) {matricola = x;} public int getValue() {return punti;} } Tutto ciò che riguarda una tessera punti deve essere incapsulato nella classe; ciò che è etichettato private non è visibile all’esterno, public sono le API esterne Vado a definire la classe tessera e andrò a metterla in un file chiamato tessera.java. il nome del file dovrà essere lo stesso del nome della classe !!

Ad esempio, se io voglio che dall’esterno nessuno veda quelle variabili quelle variabili int punti e int matricola saranno precedute dalla parola chiave private. Nel Main io posso crearmi degli oggetti di tipo tessera : dichiarando una variabile tessera t= new tessera ()  con questo comando dico che voglio creare una nuova tessera. A questo oggetto t posso mandare dei messaggi per operare su quella tessera. Ad una tessera posso chiedere di incrementare punti e dire i punti. Come mandare messaggi ad un oggetto? t.  la sintassi che si usa è il punto quando metto il punto vuol dire che sto mandando un messaggio es.: t. incrementa Punti ($x) Se la variabile viene impostata con privata, qualsiasi tentativo di leggere la variabile dall’esterno fallisce. Dentro al file java deve esserci la lettera maiuscola T essera.java Usare programma: IntelliJ “tessera” è una classe e definisce una struttura dati astratta e le operazioni che deve supportare (metodi). Di una classe posso creare delle istanze che prendono nome di OGGETTI. Offre l’operatore new che crea e inizializza un oggetto (crea istanze di classi) Ogni istanza è caratterizzata da una copia locale. T1 e t2 sono puntatori a tali due istanze Il punto permette di operare sulle istanze messaggio è invocazione di metodo.

La funzione di inizializzazione che ha lo stesso nome della classe prende il nome di costruttore. Questo permette il raggruppamento e hiding dell’implementazione. Public perché quelle funzioni sono usabili dall’esterno, posso mandare messaggi. Sottoclassi ed ereditarietà Idea che posso fare il riuso del software senza scriverlo nuovo ogni volta per funzionalità simili. Es. immaginiamo che esistono due tipi di tessera (sottoclassi): tessera gold e normale. Ereditano le variabili ed i metodi ma si possono aggiungere nuove variabili e nuovi metodi. Verso i linguaggi Object Oriented

  • Linguaggi che nascono O.O puri Java e smalltalk
  • Linguaggi imperativi a cui viene aggiunto O.O ( ibridi ) C++ e PHP Introduzione Java Sintassi simile a C, PHP Case sensitive Java nasce con internet e per essere portabile quindi indipendente dall’architettura portatile. Misto di interpretato e compilato: compilatore genera codice intermedio che viene interpretato. A.Java Sorgente -> viene compilato in un codice intermedio che prende il nome di byte code che è machine independent.

B= a+ c  variabile di tipo byte e variabile di tipo int. In questo caso il byte viene trasformato in int. Posso però forzare il cambio di tipo verso l’alto (non viene fatta in automatico). Se scrivo int= decimale viene fuori un errore perché non posso metterle un decimale dentro un intero però posso forzare la conversione mettendo il tipo tra parentesi. A= (byte) (a2). In alcuni casi java fa un’operazione chiamata Casting modifica il tipo di una variabile per adattarlo ad un’espressione ma solo da più stretto a più grande (per widening). Se in un’espressione compaiono Byte, short e int il risultato è sempre promosso a int. Posso anche renderli più bassi ma non viene fatto in automatico! In questo caso posso forzare la conversione mettendo il tipo tra parentesi. Es. byte a= a=(byte)(a2); Usuali operatori aritmetici:

  • +, - (anche unario), *, /
  • % modulo (su interi e floating) Es. int x=24; double y=13.14; int z = x % 10; int i = x/y; // ERRORE IN COMPILAZIONE
  • assegnamenti aritmetici: +=, -=, *=, /=, %= Es. x = x+4 equivalente a x+= x = x%2 equivalente a x%=
  • incremento e decremento : ++x, x++, --x, x  DIFFERENZA: cosa succede alla variabile C=b++ significa che prima incremento b e poi lo assegno a C Se invece scrivo

C=++b  stesso risultato ma operazione al contrario quindi prima assegnamento a C e poi incremento di b. int a=1, b=2; int c=++b, //c: prima ++ poi assegno d=a++; //d: prima assegno poi++ c++; System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); } } stampa: 2 3 4 1 Operatori bitwise su interi

  • bitwise NOT: ~ Es. 42 in bit è 00101010 bitwise NOT diventa 11010101
  • in modo simile bitwise AND (&), OR (|), XOR (^)
  • operatori di shift di bit
  • << N shift left di N posizioni
  • N shift right di N posizioni in versioni con e senza segno (a seconda di come trattano il bit più a sinistra)

  • anche in versioni con assegnamento Es. x=x&1011 equivale a x &=
  • Operatori relazionali tra interi
  • uguaglianza: ==
  • diverso da: !=
  • confronto: >, <, >=, <=
  • Operatori booleani
  • NOT (!), AND (&), OR (|), XOR (^) anche in versione con assigment x = x & y equivale a x=& y COSTRUTTI CONTROLLO Uguali a php come sintassi
  • Sequenza
  • { A; B ; …;}
  • Alternativa
  • if (C) {} else {}
  • if (C) {} else if (C2) { } else {}
  • switch (C) { case valore1: {};

$punto= array (5,3); $punto[0]; $punto[1]; $rettangolo=array( array(1,2), array(5,3)); $rettangolo [0,0]; un rettangolo posso definirlo come un array con dentro due punti. CLASSE JAVA Pensate per rappresentare delle informazioni composte costruite a partire da queste informazioni Class Point ( nome della struttura dati che vogliamo introdurre) {definizione della classe fatta da 3 parti Insieme di variabili (definiscono la struttura informativa corrispondendo a quella classe) ….. Insieme di funzioni (operazioni che vogliamo definire su quella struttura dati) } SINTASSI DELLE CLASSI. Le variabili devono essere tipate. Class point { int x; int y; … Setx( parametro: int cx)

{x=cx;} int Get x( ) { return x;} …. Void trasla ( int tx, int ty) { x=x+tx ; y= y+ty;} DistanzaOrigine( ) { Le classi vanno messe in un singolo file java con lo stesso nome della classe. Es classe Point - file Point.java Può anche essere compilata con Point.class che può essere eseguito da una macchina java. Come usare la classe in un main? Il main di un programma è fatto da una serie di dichiarazioni di variabili, eventualmente inizializzate e poi da una sequenza di istruzioni. Nel momento in cui si dichiara una variabile queste possono essere associate ad un tipo base. Posso definire delle variabili di tipo punto, che rappresenterà un oggetto appartenente a quella classe. Il modo in cui viene inizializzato è con new seguito dal nome della classe ed eventualmente dei parametri. Questa istruzione crea un oggetto.

SECONDO COSTRUTTORE

Public car (string a, string b, int p, int d){ Color=a; model=b; power=p; porte=d; } NEL MAIN Car auto2= new Car(“grigia”, “alfa romeo giulia”, 140, 4); TERZO ESEMPIO COSTRUTTORE Public Car (String a, String b, int p){ Color=a; model=b; power=p; porte=4; } NEL MAIN Car auto3=new Car(“blu”, “merchedez”, 90); crea auto3 del colore, tipo, potenza attuali e 4 porte (usa quello che abbiamo inserito nel costruttore). UN ALTRO ESEMPIO: PUNTO IN UN PIANO CARTESIANO Class Point ( ) { int x; int y;

costruttore/i Point ( ) { x=0; y=0; } Point ( int cx, int cy) {x=cx; y=cy; } Metodi void setx (int cx) {x=cx;} Int getx ( ) {return x;} Void sety (int cy) {y=cy;} Ecc… } Nel main posso creare delle istanze quindi dichiaro Point p=new Point();  quello che faccio è andare ad usare il costruttore associato alla classe per creare la nuova istanza e inizializzarla. Dentro una classe devo avere sempre almeno un metodo con lo stesso nome della classe e che svolge il ruolo di ALLOCARE all’istanza all’interno della memoria del programma, cosicché quella istanza sia utilizzabile. L’operazione di new è l’operazione con cui creo l’istanza e deve corrispondere ad uno dei costruttori che ho nella classe. Nel momento in cui eseguo questa chiamata nel main viene creato un punto p, inizializzando le coordinate e 0,0; SIGNATURE deve essere sempre diversa. CLASSE PUNTO IN UN PIANO CARTESIANO. DEFINIZIONE CLASSE class Point { int x; int y; costruttorePoint()

  • tipicamente le variabili dentro una classe vengono definite come private.
  • Quando definiamo il costruttore es. un costruttore con i parametri, i parametri vengono scritti con lo stesso nome delle variabili private delle classi. Questo non è un obbligo ma è uno standard che si usa per vedere immediatamente quali sono le variabili inizializzate con quel costruttore.
  • All’interno di un oggetto vogliamo far riferimento all’oggetto stesso si usa la parola chiave this.  this.x=x  significa che quando l’oggetto viene creato nella variabile x viene messo il valore x passato come primo parametro. Esempio: vogliamo costruire un programma java per gestire una banca. In particolare, vogliamo definire il concetto di conto bancario. Vogliamo sapere il titolare: string; la cifra sul conto: int; come azioni vogliamo fare: versamento; prelievo; disponibilità; operazioni quante; Class conto { Private string cognome; private string nome; private int cifra; private int operazioni; public conto ( ) { this.cognome=” “; this.nome=””; this.cifra= “”; this operazioni= “”; } public conto (string cognome, string nome) { this.cognome= cognome; this.nome= nome; this.cifra=0; this operazioni=0; } public conto (string cognome, string nome, int cifra)

{ …. This.operazioni:0; } METODI Un altro standard: il primo gruppo di metodi che si introducono sono i getter e setter. Sono metodi che permettono di leggere o scrivere il valore di singole variabili. Se su un oggetto di tipo conto voglio sapere il cognome del titolare o settare il cognome andrò a mettere i metodi rispettivamente di getter o setter. Sono tipicamente dei metodi pubblici e void nel caso del setter ( va a settare la variabile ). Tipicamente hanno un nome standard ovvero: setnomevariabile. Nel caso di nomi composti mettere la maiuscola Public void setCognome (string cognome) {This.cognome=cognome; } Public string getCognome ( )  non ha parametri {return this.cognome;} Questa coppia di metodi si usa per tutte le variabili che vogliamo leggere o scrivere dall’esterno. Public void setNome (string nome) {…} Public string getNome () {…} Tutti questi standard sono implementati negli ambienti java. Public void versa ( int x )  con void non restituisce nulla {this.cifra=this .cifra+x; }  incrementa il valore della variabile cifra. Public int versa (int x)