Principi di Progettazione del Software a.a. 2016-2017 Fondamenti di Java (pt. 1) ing. Roberto Vergallo Contatti ■ Ing. Roberto Vergallo, Ph.D. ■ Orario di ricevimento – Preferibile fissare un appuntamento tramite email: [email protected] ■ Laboratorio GSA Lab – http://gsalab.unisalento.it Fondamenti di java 2 Roberto Vergallo 1 Testi per esercitazione consigliati ■ M. tarquini, A. Luigi “Java Mattone dopo mattone”, HOEPLI informatica ■ Cay S. Horstmann “Concetti di Informatica e Fondamenti di Java” Terza Edizione, Apogeo Fondamenti di java 3 Roberto Vergallo Risorse ■ Pagina del prof. Mainetti (area materiale didattico): – http://www.ingegneria.unisalento.it/scheda_personale/-/people/ luca.mainetti/materiale Fondamenti di java 4 Roberto Vergallo 2 Obiettivi della lezione ■ PARTE 1: Introduzione alla Programmazione Object Oriented (OOP) – Paradigma Imperativo e Procedurale – Paradigma Object Oriented – Classi e Oggetti ■ PARTE 2: Introduzione al Linguaggio Java – Caratteristiche Principali di Java – Java Development Kit (JDK) ■ PARTE 3: Introduzione alla Sintassi di Java – Variabili, Operatori, Regole sintattiche di Java, ecc. – Primo esempio Fondamenti di java 5 Roberto Vergallo Risorse e strumenti ■ Tutorial Java – http://docs.oracle.com/javase/tutorial/?frontpage-spotlight – http://www.roseindia.net/java/ ■ MOOC Java – https://www.edx.org/course/introduction-programming-java-part-1-uc3mxit-1-1x-1# – https://www.edx.org/course/software-construction-java-mitx-6-005-1x ■ Java 2 Platform Standard Edition 7.0 – http://www.oracle.com/technetwork/java/javase/downloads/ index.html ■ Eclipse IDE for Java Developers – http://www.eclipse.org/downloads/ Fondamenti di java 6 Roberto Vergallo 3 http://docs.oracle.com/javase/7/docs/api/ Fondamenti di java 7 Roberto Vergallo PARTE 1 Introduzione alla Programmazione Object Orientented (OOP) 4 Evoluzione del modello di programmazione ■ Sviluppare software è un problema semantico Fondamenti di java 9 Roberto Vergallo Dominio del problema e dominio della soluzione ■ Il programmatore deve creare un mapping fra “dominio del problema” e “dominio della soluzione” – Tale mapping è spesso innaturale e di difficile comprensione Fondamenti di java 10 Roberto Vergallo 5 Evoluzione del modello di programmazione Linguaggio C Java Pascal C++ Assembler Fortran … Paradigma imperativo Paradigma Procedurale Paradigma Object Oriented Macchina 11 Fondamenti di java Tempo Roberto Vergallo Paradigma imperativo ■ I linguaggi imperativi definiscono un “dominio della soluzione” che “astrae” la macchina sottostante – Es. 1. read i 2. print i 3. goto 1 ■ Un tempo i programmi erano scritti in Assembler in cui ogni dato era globale e le funzioni andavano disegnate a basso livello. Fondamenti di java 12 Roberto Vergallo 6 Paradigma procedurale ■ Poi ci fu l’avvento dei linguaggi procedurali come il C che si basano sul modello detto “paradigma procedurale” riassumibile in due parole: “Divide et Impera”. • Un problema complesso viene suddiviso in problemi più semplici in modo che sia facilmente risolvibili mediante programmi procedurali. • Le procedure sono blocchi di codice riutilizzabile che possiedono un proprio insieme di dati e realizzano specifiche funzioni. • All’interno di un’applicazione è necessario che i dati vengano condivisi tra loro. Questo meccanismo si risolve mediante l’uso di variabili globali, passaggio di parametri e restituzione di valori. • Esempio: print usa output per scrivere su terminale, modificando variabili globali. • Problema: Cosa succede se un programmatore usa direttamente output? Fondamenti di java 13 Roberto Vergallo Paradigma Object Oriented ■ Per risolvere i problemi presentati dall’approccio procedurale, i programmatori hanno fatto sempre più uso di tecniche mirate a proteggere dati globali o funzioni nascondendone il codice. ■ Il paradigma Object Oriented accentra l’attenzione verso i dati. – L’applicazione viene suddivisa in un insieme di oggetti in grado di interagire tra di loro e codificati in modo tale che la macchina sia in grado di comprenderli. – Un linguaggio OO semplifica il meccanismo di creazione degli oggetti. – Il paradigma OO si basa sulla tecnica di incapsulare e raggruppare parti di un programma Fondamenti di java 14 Roberto Vergallo 7 Cos’è un Oggetto? ■ Definizione da vocabolario: “Un oggetto è un’entità che si possa immaginare dotata di determinate caratteristiche e funzionalità”. ■ Il confinamento di informazioni e funzionalità in oggetti permette livelli maggiori di astrazione e semplifica la gestione di sistemi complessi. 15 Fondamenti di java Roberto Vergallo Gli oggetti come modello naturale ■ Gli oggetti nel software possono rappresentare entità del mondo reale – Il primo uso di linguaggi a oggetti è stato fatto per effettuare simulazioni Interazioni tra diversi componenti = scambio di messaggi Fondamenti di java 16 Roberto Vergallo 8 Linguaggi orientati agli oggetti ■ Forniscono astrazioni che consentono di rappresentare direttamente nel dominio della soluzione gli elementi del dominio del problema – Oggetti – Classi – Messaggi • Il programmatore inizia analizzando tutti i singoli aspetti concettuali che compongono un programma. Questi concetti sono chiamati oggetti con nomi legati a ciò che rappresentano. • Gli oggetti sono costituiti da attributi (dati) e funzionalità (metodi). • L’analisi dovrà includere le modalità di interazione tra gli oggetti e proprio grazie a queste interazioni sarà possibile riunire gli oggetti per formare un’applicazione. • A differenza di procedure e funzioni, gli oggetti sono auto-documentanti e il funzionamento interno delle funzionalità di un oggetto è completamente nascosto al programmatore. Fondamenti di java 17 Roberto Vergallo Classi di oggetti ■ Pensiamo ad un libro come appartenente ad una classe di oggetti aventi caratteristiche comuni: numeri di pagine, testo inserito in ogni pagina, note inserite a fondo pagina (attributi). ■ Le azioni che tipicamente si compiono quando si utilizza un libro sono: voltare pagina, leggere il testo, guardare le figure, ecc.( metodi). ■ È interessante notare che si utilizza il termine libro per generalizzare un concetto relativo a qualcosa che contiene pagine da sfogliare, da leggere o da strappare ossia ci si riferisce ad un insieme di oggetti con attributi comuni, ma comunque composto da entità aventi ognuna caratteristiche proprie che rendono ognuna differente rispetto all’altra. ■ La classe è una categoria di oggetti che fornisce la descrizione generale del concetto di libro. ■ L’oggetto è una istanza della classe ( ogni nuovo libro) avente caratteristiche proprie. Fondamenti di java 18 Roberto Vergallo 9 Classi di oggetti ■ 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. comportamento struttura dichiarazione delle variabili metodi effettivi Roberto Vergallo 19 Fondamenti di java Un modello a oggetti ■ L’idea informale: rappresentare le entità della programmazione come aggregazioni di variabili e metodi Esempio: ContoCorrente comportamento giraPagina struttura titolo autore editore genere acquista variabili aggiungiBookmark metodi Fondamenti di java 20 Roberto Vergallo 10 Rappresentazione di un oggetto Mes Met sag gio odo Me ss gi o odo gg do sa to Me s Me Attributo ag Met Attributo Attributo io Fondamenti di java 21 Roberto Vergallo Messaggi ■ Gli oggetti sono gli elementi attivi di un programma – Come fanno gli oggetti a compiere le azioni desiderate ? ■ Gli oggetti sono attivati dalla ricezioni di un messaggio ■ Una classe determina i messaggi a cui un oggetto può rispondere – metodi ■ I messaggi sono inviati da altri oggetti Fondamenti di java 22 Roberto Vergallo 11 Scambio di messaggi ■ Il flusso dell’esecuzione viene visto come un flusso di messaggi Oggetto A Utente ricevente.nomeMetodo(parametri) Esempio: libro.vaiApagina(52) libro Oggetto B Libro messaggio ■ Componenti di un messaggio: – un riferimento al ricevente; – il nome del metodo; – i parametri. Roberto Vergallo 23 Fondamenti di java Classi e istanze: ContoCorrente class ContoCorrente { String codice; String titolare; float saldo; ... void deposita(float somma) { saldo += somma; } void preleva(float somma) { saldo -= somma; } ContoCorrente preleva codice titolare saldo istanza di deposita N58AB Giorgio 1.350 istanza di } c1.deposita(31) istanza di N58AB Marco 2.500 54Z Andrea 7.823 c2.preleva(275) c3.deposita(50) Fondamenti di java 24 Operatore Roberto Vergallo 12 Tipo delle variabili ■ In ogni linguaggio OOP 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 (puntatori!) ad oggetti “Fausto Coppi” class Ciclista { valore int mediaKmAlGiorno; Bicicletta bici; ... riferimento void allenamento() { int rapporto; ... bici.cambiaRapporto(rapporto); } Fondamenti di java 70 bici riferimento Bicicletta } 25 Roberto Vergallo PARTE 2 Introduzione al linguaggio Java 13 Nascita di Java ■ Java viene sviluppato nei laboratori della Sun Microsystem a partire dal 1990 ■ Il suo scopo iniziale era quello di equipaggiare apparecchiature elettroniche come televisori o altre apparecchiature analoghe ■ Uno dei presupposti di progetto era quello di creare un linguaggio indipendente dal processore ■ Il linguaggio avrebbe dovuto essere usato per gestire le reti e le comunicazioni ■ Doveva essere un linguaggio ad oggetti ■ L'apprendimento del linguaggio doveva essere semplice per chi fosse già pratico di C++ Fondamenti di java 27 Roberto Vergallo Nascita di Java ■ 1990 - Specificato da James Gosling con un gruppo (detto Green Team) di ricercatori della Sun Microsystem ■ 1991 - Usato per progetti in ambito consumer electronic con il nome Oak (da un albero visto dalla finestra di Gosling). ■ 1992 - Presentazione del primo prototipo di dispositivo simile ad un calcolatore con sola interfaccia grafica intuitiva (uso dell'animazione Duke). ■ 1993 - Usato per sviluppare sistemi di TV interattiva ■ 1995 - Cambio di nome in Java (non è un acronimo) Fondamenti di java 28 Roberto Vergallo 14 Il linguaggio Java ■ Semplice ■ Sicuro ■ Indipendente dalla piattaforma – "write once, run anywhere" ■ Libreria molto ricca – packages ■ Pensato per Internet – applet Roberto Vergallo 29 Fondamenti di java Linguaggi e traduzione ■ I programmi sono scritti in un Linguaggio di Programmazione Linguaggio macchina Linguaggio simbolico Traduzione Fondamenti di java 30 Roberto Vergallo 15 Linguaggi compilati e interpretati linguaggio compilato Il compilatore produce un eseguibile in codice macchina. L’esecuzione sarà molto veloce ma lo stesso eseguibile non può essere usato su piattaforme diverse. linguaggio interpretato Il codice é indipendente dalla piattaforma, ma deve essere eseguito attraverso un interprete che in genere è molto poco efficiente. Fondamenti di java Roberto Vergallo 31 Creare un programma in C x Windows Codice sorgente #include <stdio.h> ... main(int argc, char **argv) { ... initialize(argv[0]); run(argv[1], argv[2]); if (!errno) printf(”Done.\n”); else exit(errno); cc <opzioni> <nomi di file> Compilatore (windows) Binario Binario (windows) Programma eseguibile Linker (windows) } (windows) Librerie Librerie 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. Fondamenti di java 32 Roberto Vergallo 16 Creare un programma in C x Linux Codice sorgente cc <opzioni> <nomi di file> #include <stdio.h> ... main(int argc, char **argv) { ... initialize(argv[0]); run(argv[1], argv[2]); Compilatore (Linux) Binario Binario (Linux) Programma eseguibile Linker (Linux) if (!errno) printf(”Done.\n”); else exit(errno); } (Linux) Librerie Librerie 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. 33 Fondamenti di java Roberto Vergallo Traduzione Java ■ Sfrutta sia la compilazione che l’interpretazione ■ Java Byte Code – Il linguaggio macchina di una macchina virtuale – Java Virtual Machine (JVM) – NON leggibile dall’uomo – Conservato in class files Fondamenti di java 34 Roberto Vergallo 17 Traduzione Java javac <opzioni> <nomi di file> Compilatore Codice sorgente Bytecode Binario public class Esempio1 { Programma in esecuzione Interprete public static void main(String[] args) { System.out.println(“Primo Programma Java”); … } Librerie Librerie Librerie } – non si produce un programma eseguibile indipendente; – il codice sorgente viene tradotto in bytecodes; – il collegamento tra ‘pezzi’ di programma viene fatto ‘al volo’; – le operazioni effettive vengono eseguite dall’interprete. Fondamenti di java 35 Roberto Vergallo Traduzione Java Fondamenti di java 36 Roberto Vergallo 18 Java Virtual Machine ■ Un programma Java NON può essere eseguito senza Java Virtual Machine – Interpreta il codice Java Byte Code – Oggi si utilizza la compilazione just-in-time – E’ a sua volta in esecuzione sul calcolatore Roberto Vergallo 37 Fondamenti di java Bootstrap dell’esecuzione ■ La macchina virtuale Java esegue come prima cosa il metodo main della classe di bootstrap java Copia DaUnFile.txt AUnAltroFile.txt class Copia { ... public static void main(String[] args) { if (args.length < 2) { System.out.println( ”Uso: Copia <from> <to>” System.exit(0); } else { copia(args[0], args[1]); } ... Copia.class CLASSPATH Copia.class Macchina virtuale } Fondamenti di java 38 Roberto Vergallo 19 PARTE 3 Introduzione alla sintassi Java 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; } Fondamenti di java } } temp = arg * this.fattoriale(arg - 1); return temp; 40 Roberto Vergallo 20 Elementi fondamentali dell’ambiente Java (cont.) ■ Requisiti per programmare in ambiente Java (JDK): – PC con processore Pentium 2 266MHz o superiore e 128 Mb di RAM. – 245 Mb di spazio libero sull’hd. – Java Development Kit (JDK). (http://www.oracle.com/it/technologies/java/index.html) • Java Runtime Environment (JRE) (\jre) – Permette di eseguire applicazioni scritte in Java e consiste della Java Virtual Machine (JVM), classi Java comprese le Java API e alcuni files di supporto ma non contiene strumenti di sviluppo come compilatori e debugger. • Development Tools (\bin). • Demo Applets and Applications (\demo). • Source Code (\include). • Additional libraries (\lib). Fondamenti di java 41 Roberto Vergallo Introduzione alle applicazioni Java (cont.) Il mio primo programma class Welcome1 { // linea public static void main (String args[]) { // linea System.out.println (“Welcome to Java Programming"); // linea } // linea } // linea 1 2 3 4 5 Un programma è composto da un insieme di dichiarazioni di classi. Nel nostro esempio abbiamo la classe Welcome1 la cui dichiarazione inizia a linea 1 e termina a linea 5. Una classe non può contenere direttamente delle istruzioni ma può contenere la dichiarazione di metodi che a loro volta contengono le istruzioni. La nostra classe contiene la dichiarazione di un solo metodo che inizia a linea 2. Un metodo è identificato da un nome, nel nostro caso main, e racchiude tutte le istruzioni e dichiarazioni tra una parentesi graffa aperta e una chiusa, dunque il nostro metodo termina a linea 4. Il Java è case sensitive: Welcome1<> welcome1 Fondamenti di java 42 Roberto Vergallo 21 Introduzione alle applicazioni Java (cont.) Il mio primo programma class Welcome1 { // linea public static void main (String args[]) { // linea System.out.println ("Welcome to Java Programming"); // linea } // linea } // linea 1 2 3 4 5 Un metodo può essere attivato solo dall’interno di un altro metodo. Al momento dell’attivazione è possibile fornire al metodo invocato dei parametri racchiusi tra parentesi tonde e separati da virgole e ricevere da questo un valore di ritorno. La linea 3 contiene l’unica istruzione eseguibile di tutto il programma e consiste nell’invocazione del metodo println, contenuto in una classe fornita con il linguaggio, che visualizza il parametro passato tra parentesi tonde seguito da un carattere di ritorno a capo. Commenti: // su singola linea /* e */ su più linee /** e */ commento di documentazione per l’utility JAVADOC Ogni istruzione DEVE terminare con il punto e virgola (;) Fondamenti di java 43 Roberto Vergallo Introduzione alle applicazioni Java (cont.) ■ Il programma deve essere contenuto in un file il cui nome deve corrispondere al nome della classe seguito dal postfisso .java e deve essere compilato. Supponendo di disporre dell’ambiente di sviluppo JDK, la compilazione si ottiene con il comando javac seguito dal nome della classe con estensione. javac Welcome1.java ■ Il compilatore produce un file il cui nome corrisponde a quello della classe seguito dal postfisso .class. ■ Per eseguire il nostro programma Welcome1.class è necessario richiamare l’interprete, che nell’ambiente JDK è java, seguito dal nome del file senza estensione. java Welcome1 Fondamenti di java 44 Roberto Vergallo 22