Breve introduzione a Java (ed alla programmazione ad oggetti)

Slides:



Advertisements
Presentazioni simili
Ambiente Java.
Advertisements

Unified Modeling Language
Recupero debito quarto anno Primo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Massa Laura Mela Enrica
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Le gerarchie di tipi.
Semantica Operazionale di un frammento di Java: lo stato
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Introduzione al linguaggio Java
eliana minicozzi linguaggi1a.a lezione2
Overriding.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Programmazione II: Tecniche Avanzate. (A.A. 1999/2000) - Lezione 6 1 Estensione di classi: il Contratto INTERFACCIA E REALIZZAZIONE Che cosa realizza una.
Oggetti e dati primitivi
Approfondimento delle classi
CAPITOLO 4 LINGUAGGIO JAVA: COSTRUTTI DI BASE. ALFABETO Java adotta la codifica standard Unicode della società Unicode, Inc. (ftp://ftp.unicode.org) definito.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Lab. Calc. 2005/06 Ereditarietà. Lab. Calc. 2005/06 Scopo di questa lezione: Imparare a creare nuove classi ereditando da classi già esistenti. Capire.
1 laboratorio di calcolo II AA 2003/04 quarta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Strutture di controllo in C -- Flow Chart --
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Dichiarazioni e tipi predefiniti nel linguaggio C
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Java base IV: Java e la programmazione O.O.
Argomenti della lezione
Programmazione in Java (8)
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
JAVA Franco Bombi 8 ottobre FB Introduzione Java è un linguaggio di impiego generale, basato su classi e orientato agli oggetti Java.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Unità Didattica 3 Linguaggio C
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Astrazione procedurale ed eccezioni
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
Programmazione ad oggetti
Lezione 1 Panoramica sui paradigmi di programmazione
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
1 Osservazioni Generali Struttura di programma Gerarchia di classi: overloading, overriding, e dispatching Analisi ed esecuzione Modificabilità e condivisione.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Programmazione in Java
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Intelligenza Artificiale
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Lezione 2 : Basi del linguaggio Variabili. Come visto nella lezione 1 le classi registrano il proprio stato nelle variabili  int cadenza = 0;  int velocita.
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Transcript della presentazione:

Breve introduzione a Java (ed alla programmazione ad oggetti) Marco Piastra

Argomenti 1. Modello astratto e modello implementativo (in un linguaggio di programmazione) 2. Modello astratto: rappresentazione ad oggetti 3. Modello implementativo: macchina virtuale 4. Aspetti particolari: - gestione implicita della memoria (garbage collection) - multi-threading; - programmazione distribuita.

Modello astratto e modello implementativo 1 Modello astratto e modello implementativo

Il progetto di un linguaggio Da tener presente: un ‘linguaggio di programmazione’ è progettato in riferimento ad modello implementativo specifico (linguaggio compilato, linguaggio interpretato) il progetto del linguaggio include un rilevante aspetto teorico, cioè un modello astratto (variabili, oggetti, classi, metodi) i due aspetti sono strettamente correlati

Il progetto di un linguaggio (2) Scelta di un modello astratto: entità di base della programmazione (e.g. variabili globali, variabili locali, array, puntatori, funzioni). modo di descrivere i programmi (e. g. programmazione strutturata); linguaggio (inteso come unione di una sintassi ed una semantica formale); Scelta di un modello implementativo: tecniche di compilazione (e.g. compilazione parziale) e di linking; esecuzione a run-time (e.g. gestione della memoria, gestione dello stack delle chiamate); possibilità di estensione (librerie specifiche).

Creare un programma in C #include <stdio.h> ... main(int argc, char **argv) { ... initialize(argv[0]); run(argv[1], argv[2]); if (!errno) printf(”Done.\n”); else exit(errno); } Codice sorgente cc <opzioni> <nomi di file> Binario Compilatore Programma eseguibile Linker Librerie Tipicamente: si creano uno o più moduli (file) di codice sorgente; si utilizzano librerie standard e/o librerie specifiche; il compilatore traduce il codice sorgente in un formato binario; il linker combina il prodotto della compilazione con le librerie.

Un interprete di programmi Interprete Lisp (Jess) ;; File fattoriale.lsp (defun fattoriale (n) (if (eq n 0) ;; then (return 1) ;; else (return (* n (fattoriale (- n 1))))) ) Codice sorgente Listener Jess> (batch “fattoriale.lsp”) OK Jess> (fattoriale 2) 2 Loader Binario Linker Librerie Tipicamente: non si produce un programma eseguibile indipendente il codice sorgente viene tradotto in un formato binario il collegamento tra ‘pezzi’ di programma viene fatto ‘al volo’ le operazioni effettive vengono eseguite dall’interprete

Il modello astratto di Java: programmazione ad oggetti 2 Il modello astratto di Java: programmazione ad oggetti

codice titolare saldo interesse fido Un modello ad oggetti L’idea informale: rappresentare le entità della programmazione come aggregazioni di variabili e metodi Esempio: ContoCorrente comportamento saldoAttuale deposita codice titolare saldo interesse fido ritira struttura variabili modificaFido modificaInteresse metodi Agli inizi, qualcuno ha suggerito l’idea di circuiti integrati software

Modello ad oggetti: variabili e valori “Una variabile è una cella di memoria” (sempre ricordare) la cella ha una dimensione prestabilita (p.es. 4 bytes) di solito ogni variabile ha un tipo (in alcuni linguaggi no – es. Lisp/Jess) Vi sono due categorie principali di variabili le variabili che contengono un valore immediato (p.es. int, long, char, etc.) le variabili che contengono un riferimento (p.es. un puntatore) saldo 100000 nome cella di memoria valore long tipo riferimento posizioni *Portfolio struct Portfolio

Modello ad oggetti: array e strutture Le variabili (le celle) possono essere aggregate in: strutture: tipi eterogenei, dimensione prefissata array: tipi omogenei, dimensione variabile posizioni riferimento *Portfolio struct Portfolio char *titolare long id G i n o \0 123465723 Vincoli *vincoli struct Vincoli Titolo** titoli struct Titolo struct Titolo

Scambio di messaggi Il flusso dell’esecuzione viene visto come un flusso di messaggi scambiati tra oggetti In generale gli oggetti ‘vedono’: la loro propria struttura interna la parte visibile (interfaccia?) degli altri oggetti Esempio: Oggetto A Ciclista ricevente.nomeMetodo(parametri) bici.cambiaRapporto(2) bici Oggetto B Bicicletta messaggio Componenti di un messaggio: un riferimento al ricevente; il nome del metodo; i parametri.

Classi Descrivere gli oggetti uno ad uno è poco vantaggioso. Infatti: ogni oggetto richiederebbe una descrizione specifica; la grande varietà ostacolerebbe la comunicazione. Al contrario, una classe è uno schema generale per la creazione di oggetti simili: la struttura degli oggetti è descritta come schema; il comportamento degli oggetti è definito in modo effettivo. struttura comportamento definizione dei metodi dichiarazione delle variabili [ 'public' ] [ ( 'abstract' | 'final' ) ] 'class' class_name '{' // metodi e variabili // sono definite qui '}'

Classi e istanze: ContoCorrente public class ContoCorrente { String codice; String titolare; float saldo; ... void deposita(float somma) { saldo += somma; } void preleva(float somma) { saldo -= somma; } } codice titolare saldo preleva ContoCorrente deposita N58AB Gino 1.350 istanza di istanza di AA54Z Pino 7.823 c1.deposita(31) istanza di N58AB Lino 2.500 c2.preleva(275) Operatore c3.deposita(50)

Ereditarietà L’idea di base è quella di classificare gli oggetti mettendo a fattor comune le analogie Animale Vertebrato Invertebrato Pesce Anfibio Rettile Uccello Mammifero Carnivoro Erbivoro Attenzione: la gerarchia dipende dallo scopo Animale Pericoloso Innocuo

Ereditarietà in Java Le sottoclassi ereditano la struttura (intesa come schema) ed il comportamento dalle superclassi var1 Alfa method1 class Alfa { String var1; void method1() { ... } } var1 var2 Beta method1 method2 class Beta extends Alfa { String var2; void method2() { ... } } var1 var2 var3 Gamma method1 method3 method2 class Gamma extends Beta { String var3; void method3() { ... } }

Struttura di classi Un programma Java è rappresentato da una gerarchia di classi La classe Object è la radice di tale gerarchia class A1 { ... } Object A1 B1 C1 Specializzazione Generalità A2 B2 B3 class A2 extends A1 { ... } B4 B5

Uso di una struttura di classi Per classificare, cioè per strutturare le differenze ma nella pratica, si usa raramente Per fattorizzare, cioè per scrivere meno codice Bicicletta Bicicletta Multirapporto Bicicletta Elettrica Bicicletta da Strada Mountain Bike ContoCorrente ContoManager preleva deposita codice titolare saldo ContoIO calcolaInteresse ContoFamiglia

OggettoTrasmissibile Uso di una struttura di classi Per disaccoppiare aspetti diversi di uno stesso programma e rendere lo stesso programma più facile da estendere a questo scopo in Java si usano spesso anche le interfacce contenuto estrai OggettoTrasmissibile inserisci Un ipotetico sistema di trasmissione usa solo questo livello della gerarchia ... Testo Immagine Video ... mentre le specializzazioni ulteriori sono pertinenti in altre parti del programma

Tipo delle variabili In Java ogni variabile deve avere un tipo dichiarato In prima approssimazione, vi sono due categorie di tipi: tipi primitivi: int, float, byte short, long, double, char, boolean); riferimenti ad oggetti (i.e. Object o sottoclasse). “Romano Prodi” class Ciclista extends Persona { int mediaKmAlGiorno; Bicicletta bici; ... void allenamento() { int rapporto; ... bici.cambiaRapporto(rapporto); } } valore 70 riferimento riferimento Bicicletta

Come si scrive un metodo In prima approssimazione, un metodo Java è molto simile ad una funzione C: dichiarazione formale: nome del metodo, tipo di valore ritornato, nome e tipo dei parametri formali; gli operatori sono quelli del C (e.g. +, *, =, +=, ==, !=, ...) le istruzioni di controllo sono quelle del C (i.e., if, else, switch, for, while, do) l’istruzione di ritorno è return. class Aritmetica { long fattoriale(long arg) { if (arg == 0) { return 1L; } else { long temp; temp = arg * this.fattoriale(arg - 1); return temp; } } }

Oscuramento dei metodi (Detto anche overriding) In una sottoclasse si può oscurare un metodo definito in una superclasse tramite una nuova definizione. class Bicicletta { ... void cambiaRapporto(int r) { ... } } Ciclista bici.cambiaRapporto(2) bici Bicicletta class MountainBike extends Bicicletta { ... void cambiaRapporto(int r) { ... } } La selezione viene effettuata (automaticamente) durante l’esecuzione in base al tipo effettivo

Specializzazione dei metodi (Detta anche overloading) La ‘risposta’ di un oggetto ad un messaggio può dipendere dal tipo dei parametri class Zoofilo extends Persona { ... void accarezza(Gattino g) { affettuosamente } void accarezza(Tigre t) { col pensiero } void accarezza(Object o) { informati prima } } Spiritoso amico.accarezza(animaleSconosciuto) amico Zoofilo La selezione è effettuata (automaticamente) in base al tipo dichiarato

Aritmetica.fattoriale(33) Classi come oggetti In Java anche le classi sono oggetti Quindi anche le classi: rispondono ai messaggi; hanno variabili (di classe); hanno metodi (di classe). Per definire le entità di classe si usa la parola chiave static Aritmetica 3.141592 fattoriale Aritmetica.fattoriale(33) class Aritmetica { static float piGreco = 3.141592; static long fattoriale(long arg) { ... } } Alle classi si può fare riferimento anche per nome

Nota: per chi conosce il C++ In C++ si usa la parola chiave static con lo stesso significato Ma in C++, le classi non sono oggetti ma solo dichiarazioni a beneficio del compilatore Conseguenza notevole: in Java si può determinare a run-time la classe di un oggetto, in C++ no. codice ContoCorrente class Zoofilo extends Persona { ... void accarezza(Object obj) { if (obj instanceof Serpente) { no grazie } else if (obj instanceof Pesciolino) { volentieri, ma come? } ... } } obj.getClass() N58AB istanza di

Protezioni L’accesso alle entità (metodi e variabili) di classe o di istanza può essere protetto le verifiche di accessibilità sono effettuate durante la compilazione In Java vi sono quattro livelli di protezione e tre parole chiave: public accesso senza restrizioni package solo nello stesso package protected solo nella classe o nelle sottoclassi private solo nella classe class ContoCorrente { private float saldo; ... float saldo(Persona richiedente) { if (richiedente.autorizzato()) return saldo; else nega informazione } } class MountainBike extends Bicicletta { void cambiaRapporto(int r) { attivaProtezione(); super.cambiaRapporto(); disattivaProtezione(); } private void attivaProtezione() {...} private void disattivaProtezione() {...} }

Protezioni: esempio class Automobile { // attributi di classe static int numeroDiRuote = 4; static public boolean haTarga = true; static private Vector archivio; // attributi di istanza public String marca; public String colore; public int annoDiImmatricolazione; public String targa; public int numero DiCavalli; protected Persona titolare; private int rapporto; // metodi di classe static protected void inserisciInArchivioAutoveicoli(Automobile a) { archivio.addElement(a); } ... // metodi di istanza public void cambiaRapporto(int r) { rapporto = r; public int rapporto() { return rapporto; }....

Costruttori Un oggetto Java viene sempre creato tramite un metodo speciale detto costruttore Ogni classe ha uno o piu` costruttori Valgono i principi di ereditarieta`, di specializzazione e di oscuramento class ContoCorrente { ContoCorrente() { generico } ContoCorrente(Persona richiedente) { intestato } } class ContoAziendale extends ContoCorrente { ContoAziendale() { // Oscuramento generico } ContoAziendale(Azienda richiedente) { // Specializzazione intestato } }

Pseudo-variabili Nei metodi di istanza, è possibile utilizzare le pseudo-variabili this e super this fa riferimento all’istanza stessa si usa per evitare ambiguità super fa riferimento all’istanza stessa come se appartenesse alla superclasse si usa per evitare ambiguità e per specializzare metodi class Ciclista extends Persona { Bicicletta bici; boolean dimmiSeTua(Bicicletta bici) { return this.bici = bici; } } class ContoAziendale extends ContoCorrente { RegistroCassa registro; void deposita(float somma) { super.deposita(somma); registro.annotaEntrata(somma); } } class ContoCorrente { float saldo; void deposita(float somma) { saldo += somma; } }

contribuente.dichiaraImponibile(2001) Interfacce L’idea di base è quella di un contratto tra oggetti, una sorta di accesso limitato ma garantito Fisco contribuente.dichiaraImponibile(2001) Persona interfaccia Contribuente interface Contribuente { float dichiaraImponibile(int anno); } class Ingegnere extends Persona implements Contribuente { ... float dichiaraImponibile(int anno) { ... } }

Uso delle interfacce Le interfacce contengono solo: la dichiarazione di metodi (come signature); la definizione di costanti Le interfacce sono un tipo valido per le variabili Le interfacce possono essere organizzate in strutture ad eredità multipla Una classe può implementare un numero qualsiasi di interfacce class Ingegnere extends Persona implements Contribuente, MembroOrdineIngegneri, PersonaTipicamenteNoiosa, ... { ... }

Tipi in Java I tipi di dati in Java sono organizzati in quattro categorie: tipi primitivi (boolean, byte, char, int, long, short, float, double) le classi (i.e. Object e tutte le sue sottoclassi) le interfacce gli array (dei tre tipi precedenti) Non esistono invece i tipi: puntatori funzioni

Array in Java Gli array in Java sono oggetti di un tipo particolare: sono formati da celle contigue e di tipo omogeneo (come in C) hanno una loro classe (e.g. int[], char[][], etc.) hanno un attributo length prevedono il controllo run-time degli accessi (a differenza del C) class Portfolio { long creaTitoli(int n) { Titolo[] titoli = new Titoli[n]; int[] ids = new long[n]; for(int i = 0; i < titoli.length; i++) { titoli[i] = new Titolo(); ids[i] = titoli[i].getId(); } } }

Gestione delle eccezioni La gestione delle eccezioni in Java è un sistema per governare il flusso dell’esecuzione a seguito di errori di fatto, sostituisce l’unico uso sensato della goto (che in Java non esiste) class Spiritoso extends Persona { ... void proponi(Zoofilo amico) { try { amico.accarezza(...); } catch (MaTuSeiMattoException e) { // Evidentemente, non gradisce } ... } } class Zoofilo extends Persona { ... void accarezza(Object obj) { if (obj instanceof ScorpioneVelenoso) { throw new MaTuSeiMattoException(); } ... } }

MaTuSeiMattoException Eccezioni Le eccezioni sono organizzate come una gerarchia di classi L’abbinamento throw / catch si stabilisce in base al tipo Due tipi fondamdentali: checked (sottoclassi di Exception) gestione obbligatoria, controllata al momento della compilazione uncheked (sottoclassi di RuntimeException) gestione facoltativa class Zoofilo extends Persona { ... void accarezza(Object obj) throws MaTuSeiMattoException { if (obj instanceof ScorpioneVelenoso) { throw new MaTuSeiMattoException(); } ... } } Throwable Exception RuntimeException MaTuSeiMattoException