Corso Basilare di Java e OOP - ITI Majorana, Grugliasco(TO) Primo Incontro – Venerdì 8 maggio 2009 • • • • • • • • • • • Presentazione del corso Breve storia di Java Problemi di programmazione che hanno portato alla nascita di Java Caratteristiche di Java Analisi del primo programma “Hello World!!!” Concetti di Classe e Oggetto Classe punto e istanza di oggetti Concetto di Metodo Classe prodotto, istanza di oggetti e implementazione di metodi Metodo Costruttore Cenno all’Input utente in Java Presentazione del corso Il corso nasce dalla necessità di alcuni studenti delle classi quarte del corso di informatica dell’ITI Majorana, Grugliasco(TO) di affrontare i paradigmi della programmazione ad oggetti in vista dello stage estivo. È stato dunque scelto Java come linguaggio di programmazione base del percorso, che permette una piena e corretta comprensione dei paradigmi della programmazione orientata ad oggetti. Durante il corso verranno mostrate le principali tecniche legate all’OOP ed affrontati stili di programmazione professionale. Il corso è condotto da Carabetta Luca e il libro scelto da guida è “Manuale di Java 6”, Claudio De Sio Cesari, Hoepli Editore. Il materiale prodotto durante ogni lezione verrà successivamente riassunto e raccolto su uno spazio web accessibile a tutti presso l’indirizzo http://luxxweb.altervista.org/corsojava/. Breve Storia di Java Java è un linguaggio di programmazione orientato agli oggetti nato in casa Sun Microsystem ufficialmente nel 1995. Il nome Java deriva da una pianta di caffè indonesiana. Dal boom di internet negli USA nel 1993, si iniziò a pensare di dover distribuire codice eseguibile sulla rete web, Java nasce quindi come elemento web ma fino ad oggi si è evoluto e può essere distribuito ed eseguito su qualsiasi architettura e sistema purchè esso supporti JVM. Carabetta Luca - Corso Basilare di Java e OOP - Primo Incontro 1 Problemi di programmazione che hanno portato alla nascita di Java La struttura di Java è stata definita basandosi su una riflessione sulle tecniche di programmazione di uso comune, emersero quindi tre problematiche, elementi di intralcio al corretto funzionamento di un programma. • • • Scorretto uso dell’aritmetica dei puntatori; i puntatori permettono una gestione della memoria migliore ma il loro uso è spesso antagonista a molti programmatori e la maggioranza degli applicativi C/C++ delgi anni ‘90 soffriva di problemi legati alla stessa aritmetica dei puntatori. Abuso delle variabili globali, esse rappresentano una facilitazione per il programmatore, ma essendo condivise tra i sottoprogrammi, se ne può facilmente perdere il controllo. Utilizzo non controllato del comando goto che rappresenta anch’esso una facilitazione per i programmatori ma facilmente induce in errore. Java quindi elimina l’utilizzo dei puntatori e il comando goto dalla sua struttura. Caratteristiche di Java • • • • • • • • Sintassi simile a C/C++, Case Sensistive. Gratuito. Robustezza, soprattutto nella gestione delle eccezioni. Librerie e standardizzazione rilasciate direttamente da Sun Microsystem. Indipendenza dall’architettura e portabilità del software. Java Virtual Machine, è un applicativo che si occupa dell'interpretazione dell'oggetto Java, il quale non è tradotto direttamente in linguaggio macchina, ma in uno pseudo linguaggio macchina chiamato bytecode, ogni architettura che è provvista e supporta la JVM può eseguire programmi Java, questa è la chiave della portabilità del software Java. OOP gestita in modo preciso, si è obbligati a sfruttare i paradigmi della programmazione ad oggetti. Un punto a sfavore della programmazione in Java deriva dall’eliminazione dei puntatori, essi permettono una migliore e veloce gestione della memoria; in assenza di queste tecniche gli applicativi Java risultano di prestazioni e velocità minori rispetto ad un codice C++ ad esempio. Analisi del primo programma “Hello World!!!” public class Principale { } public static void main(String args[]) { System.out.println("Hello World!!!"); } Carabetta Luca - Corso Basilare di Java e OOP - Primo Incontro 2 “public class Principale” indica che stiamo operando su una classe(vedi paragrafo successivo) chiamata Principale e definita come pubblica(vedi paragrafi successivi). “public static void main(String args[]){...}” è il metodo che per primo viene chiamato in un applicazione Java, il parametro del sottoprogramma è un array di stringhe che rappresenta i parametri passati da riga di comando all’applicazione. “System.out.println("Hello World!!!");” rappresenta la via per realizzare un output in un codice Java; è complessa nella sua struttura e prevede elementi che affronteremo più avanti nel percorso. Concetti di Classe e Oggetto La programmazione orientata agli oggetti o OOP(Object Oriented Programming) prevede la simulazione della realtà nel codice. Definiamo classe una struttura di un certo gruppo presente o concepibile nella realtà, possiamo ad esempio definire la classe “i Computer”; essa non rappresenta un’entità fisica tangibile ma delinea le caratteristiche che tutti i computer dovrebbero avere. Definiamo come oggetto un’istanza di una classe, nel nostro esempio potrebbe essere un computer preciso mioComputer che rispecchia le caratteristiche della sua classe di appartenenza(“i Computer”) ma che esiste fisicamente nella realtà. 3 Classe Punto e istanza di oggetti Punto public class Punto { int x; int y; } public class Principale { public static void main(String args[]) { Punto p1 = new Punto(); p1.x = 10; p1.y = 20; System.out.println("ascissa:" + p1.x + "; ordinata: " + p1.y); } } La classe punto definisce la struttura che tutti i punti dovrebbero avere ovvero la struttura P(x, y). Nella classe Principale abbiamo utilizzato la parola chiave new per creare(istanziare) un oggetto appartenente alla classe punto chiamato p1. Il modificatore public definisce che la classe, o un suo membro, sono visibili da altre classi. Carabetta Luca - Corso Basilare di Java e OOP - Primo Incontro La forma per l’istanza di un oggetto è la seguente <<classe>> <<nome oggetto>> = new <<classe>>(<<eventuali parametri>>); Si può scegliere una seconda via che prevede per prima cosa la dichiarazione di un oggetto appartenente ad una certa classe e successivamente l’istanza dell’oggetto stesso. <<classe>> <<nome oggetto>>; <<nome oggetto>> = new <<classe>>(<<eventuali parametri>>); Possiamo notare che, una volta istanziato l’oggetto, è possibile accedere ai suoi campi, ovvero quei valori che sono stati definiti nella classe punto ovvero i valori interi x e y. L’accesso a questi valori avviene tramite l’operatore di accesso ‘.’ e si struttura nella seguente forma: <<oggetto>>.<<campo>> Concetto di Metodo Un metodo può essere interpretato come un’azione che un oggetto compie o subisce. Ad esempio se noi avessimo l’oggetto “MioComputer”, i metodi potrebbero essere “Accendi”, “Spegni”, “Riavvia” e così via e l’accesso a questi metodi dovrebbe avvenire, secondo la sintassi descritta precedentemente, nel seguente modo “MioComputer.Accendi”, “MioComputer.Spegni” e così via. Classe prodotto, istanza di oggetti e implementazione di metodi public class Prodotto { double prezzo; public void InserisciPrezzo(double prezzo) { this.prezzo = prezzo; } } public class Principale { public static void main(String args[]) { Prodotto mioProdotto = new Prodotto(); mioProdotto.InserisciPrezzo(8.9); System.out.println("Il prodotto costa " + mioProdotto.prezzo + "€"); } } Carabetta Luca - Corso Basilare di Java e OOP - Primo Incontro 4 Osserviamo la classe Prodotto, possiamo notare questo: public void InserisciPrezzo(double prezzo) { this.prezzo = prezzo; } Che per l’appunto è un metodo della classe Prodotto, esso potrà essere associato ad un eventuale oggetto istanziato. Una particolarità che si nota nel codice è la parola chiave this, essa indica l’elemento che attualmente è considerato, in questo caso c’è differenza tra this.prezzo e prezzo poichè this.prezzo rappresenta la variabile propria della classe mentre prezzo è il parametro. Il metodo in sostanza preleva da parametro un valore e lo va a scrivere nella variabile prezzo propria dell’oggetto considerato. Normalmente i programmatori Java non scelgono dei nomi diversi per le variabili ma preferiscono utilizzare la parola chiave this per distinguere. Osserviamo il metodo main nella classe Principale, in sequenza possiamo trovare un’istanza di un oggetto di nome “mioProdotto” che segue la classe Prodotto. Successivamente viene richiamato il metodo InserisciPrezzo e ad esso viene passato come parametro il valore 8.9 che verrà quindi scritto nella variabile prezzo dell’oggetto mioProdotto. Questo fatto è dimostrato dal fatto che la terza riga, andando a stampare a video la variabile prezzo, manda in output effettivamente il valore 8.9. Metodo Costruttore Il metodo costruttore è un elemento caratteristico della programmazione ad oggetti, è un metodo che viene richiamato direttamente all’istanza(quando utiliziamo la parola chiave new) di un oggetto. Un metodo costruttore viene dichiarato nella classe interessata e ha lo stesso nome della sua classe. Potremmo ad esempio dichiarare il metodo costruttore della classe Prodotto, che svolge le stesse operazioni del metodo InserisciPrezzo con la differenza che in questo caso il prezzo verrà inserito nel momento dell’istanza di un prodotto. public void Prodotto(double prezzo) { this.prezzo = prezzo; } Carabetta Luca - Corso Basilare di Java e OOP - Primo Incontro 5 L’istanza dell’oggetto quindi dovrà avere come parametro un valore double che verrà poi assegnato alla variabile prezzo dell’oggetto. Prodotto mioProdotto = new Prodotto(8.9); Cenno all’Input utente in Java Durante l’incontro è sorta la necessità di conoscere quelle tecniche che permettono la gestione dell’input dell’utente. Purtroppo Java gestisce anche un banale input da tastiera secondo un procedimento alquanto complesso, il motivo deriva dal fatto che questa stessa metodologia è utilizzata per leggere da stream diversi. Vediamo un breve codice per la lettura di una stringa da tastiera premettendo che verranno mostrati meccanismi come decorazione di oggetti, eccezioni e stream che verranno in seguito trattati in modo più approfondito. import java.io.*; public class principale { public static void main(String args[]) { String stringa = null; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(isr); System.out.println("Digita qualcosa e premi invio"); try { stringa = in.readLine(); System.out.println("hai scritto " + stringa); } catch(IOException e){} } } La prima istruzione indica che stiamo andando ad importare tutto il contenuto delle librerie java.io. Inizializiamo una stringa a null. Viene istanziato un oggetto isr di tipo InputStreamReader il cui costruttore riceve come parametro System.in ovvero l’input standard del sistema che solitamente è la tastiera; InputStreamReader permette di convertire uno stream di byte in caratteri. Viene quindi creato un oggetto in che rappresenta un’evoluzione di isr, in quanto è un isr modificato, questo procedimento si chiama decorazione e verrà analizzato in seguito. La classe BufferedReader ci permette l’accesso ad un metodo, readLine() che ci consente di leggere dall’input definito. Carabetta Luca - Corso Basilare di Java e OOP - Primo Incontro 6 Brevemente il costrutto “try ... catch” è una gestione delle eccezioni che non è completa in questo codice ma comunque è necessaria per avere un corretto funzionamento del metodo readLine(). Brevemente il meccanismo di controllo delle eccezioni è utilizzato per prevenire errori gravi che potrebbero compromettere il corretto funzionamento del programma, Java è un linguaggio di programmazione sicuro in quanto prevede una forte e precisa gestione delle eccezioni che vedremo in dettaglio in seguito. L’editor utilizzato durante il corso è eclipse ed è reperibile gratuitamente presso il sito http://www.eclipse.org/ Link diretto: http://tinyurl.com/cdu8qh Questo documento può essere scaricato in formato pdf presso l’indirizzo http://luxxweb.altervista.org/corsojava/1.pdf Tutto il materiale sarà raccolto presso questo indirizzo http://luxxweb.altervista.org/corsojava/ 7 Carabetta Luca - Corso Basilare di Java e OOP - Primo Incontro