SCHEMI DI ELABORAZIONE AUTOMATICA DEI DATI Documentazione disponibile su java.sun.com (oracle.com,netbeans.org) Java è un linguaggio di alto livello orientato agli oggetti sviluppato dalla Sun Microsystem Linguaggio macchina Linguaggio assembler Linguaggio di alto livello ( java) Sviluppato dalla Sun Microsystem Java IDE: (java integrated Deveolpment Environment); ambiente software; ambiente integrativo di sviluppo. Esso comprende: Java SDK: (java software Development Kit); kit di sviluppo (serve per far girare java) Java RE: (java Runtime Environment); ambiente di esecuzione Java API: (java Application Programming Interface) interfaccia di applicazione (sono librerie o package) Java è nato con lo scopo di girare su tutte le macchine L’ambiente di programmazione può variare STORIA: correggere linguaggio C++ (anni 90) su tutte le macchine ’94 stasi del linguaggio risolto dall’incontro col fondatore di Netscape ’95 ufficialmente nasce Java; free, comincia la sua evoluzione 2010: Oracle compra SunMicrosystem, che così muore tuttavia continua lo sviluppo di java CARATTERISTICHE: interpretato (e compilato) orientato agli oggetti portabile sicuro LOGICA DI JAVA: 1 Programma.java (file) (tramite compilatore) pogramma.class (è a metà fra linguaggio macchina e uomo) java VM (è richiesta la sua istallazione sulla macchina affinché funzioni) (010011) mio programma. Oss. Se apro un file.class non capisco nulla NB: necessaria installazione di Java Virtual Machine sulla macchina scrivo una volta sola ma eseguo i comandi ovunque C’è la stessa idea di Visual Basic: compilatore TIPI DI PROGRAMMI CHE COSTRUISCO CON JAVA: Applicazionie (mia) Applet: programma da eseguire nel borwser COS’E’ LA PIATTAFORMA JAVA? È costituita da : Java Virtual Machine e da java API (Application Programming Interface) Myprogram.java (questi 2 formano la piattaforma java) Java API Java Virtual Machine Hardware-Based Platform COSA OCCORRE PER PROGRAMMARE? Programma Java e block-Notes (si avvia tramite prompt dei comandi il PrimoProgramma.java creando così il PrimoProgramma.Class) , ma è folle pensare di usarlo così. Userò il kit di java SDK reperibile su java.sun.com L’Ide Netbeans reperibili presso www.netbeans.org BROWSER java.sun.com java SE download NetBeans Donwload JPK Java API’S descrive le librerie a seconda della versione del linguaggio (per me la 7). Per avere velocemente informazioni su classi e librerie; si consulta o senno si usano i tutorial 2 1. Tutorials (creating a Gui Swing) 2. Learning java language DOWNLOAD Scaricare JDK il pacchetto java Se di netbeans ide (Netbeans comprensivo del JVK) CREAZIONE PROGETTO File- new project-java application Project name + cartella dove salvare (è la sottocartella del progetto che ha lo stesso nome) – main class? Se spuntata stabilisce quale fra i file.java parte per prima. È caratterizzata dal fatto che inizia per prima. Progetto = cartella con più sottocartelle, nelle sottocartelle ci sono tanti file.java che una volta compilati diventano file.class Una volta creato il progetto: File Classe : è formata da tutto ciò che sta dentro le parentesi { }. Dentro una classe ci sono variabili e metodi. Public static void main (string[] args){ System.out.println(“ciao”; } Main: metodo Void: è una subroutine con (parametri) cioè argomenti In Blu: modificatori del metodo NB: tutte le istruzioni vanno concluse con un ; CREAZIONE DI UN FRAME Click destro su JavaApplication (in un progetto) – new- other- Swing Gui From – Jframe form. Ciò mi permette di gestire la finestra la pdv visivo si forma NewJFrame.java (anche qui c’è la modifica di un codice sorgente) 3 CAPITOLO 1: INTRODUZIONE Println è un metodo di System.out; “visualizza e vai a capo” utilità pratica: per vedere delle variabili quando qualcosa non va nel programma METODO È una sequenza di istruzioni che accede ai dati di un oggetto. La definizione di un metodo specifica il tipo di parametri espliciti ed il valore restituito. Tipo di parametro esplicito = classe corrente; non menzionato nella definizione del metodo (equivalente di function o Subroutine in VB) Davanti al nome del metodo c’è il tipo di dati restituito Oggetto.metodo(parametri) System.out.println(“Hello World!”) Classe.oggetto.metodo (parametri) - Metodi della classe String: o length() conta numero caratteri in una strnga (parentesi vuote) String greeting =”Hello World”; int n = greeting.length(); o toUpperCase(): crea un altro oggetto String che contiene I caratteri della stringa originale, con le minuscule convertite in maiuscole o Replace(“è sostituto”,“sostitutore”): crea un nuovo oggetto (sostituzione di stringhe) String river = “Missouri”; river.replace(“our”,”issip”) “Missisippi” - Metodi della classe Rectangle: o Intersection: Rectangle box1 intersection(box2); box2 è il rettangolo con cui voglio intersecarlo ( è parametro esplicito), box1 è implicito - Metodi della classe Graphics2D: o draw() disegna forme come rettangoli, ellissi e segmenti all’interno di un metodo, scrivere: Rectangle box = New Rectangle(5,10,20,20); g2.draw(box); La classe string è “immutabile”, tutti i suoi metodi non operano sull’oggetto dove è chiamato. Parametri impliciti ed espliciti: - Esplicito se fra () nei metodi: è l’input di un metodo; es. System.out.println(greeting) Implicito è l’oggetto su cui viene chiamato il metodo; es. System.out.println(greeting) I valori restituiti dai metodi possono essere impiegati come parametri per altri metodi: System.out.println(greeting.length()); La definizione di un metodo specifica il tipo di parametri espliciti ed il valore restituito; il tipo di parametro implicito è quello della classe corrente 4 Se c’è il “void” allora il metodo è una subroutine. Un metodo si dice “sovraccaricato” se una classe ha più metodi con lo stesso nome, ma diversi parametri (come VB MessaBox) 5 CAPITOLO 2: USARE OGGETTI Identificatore: nome di una variabile, metodo o classe = è carattere di assegnazione( non opera confronti: if A==B) Oggetto: entità che può essere manipolata nel programma (attraverso la chiamata di metodi), ogni oggetto appartiene ad una classe VARIABILE = locazione di memoria, identificata da un nome (nome variabile); per convenzione comincia con lettera minuscola. Per i nomi composti il nome che segue il primo è bene che cominci con la lettera maiuscola. Si può manipolare un oggetto chiamando i suoi metodi. Assegnazione TypeName variableName=value; typeName variableName; esempio String greeting = “Hello Dave”; CLASSE: Definisce oggetti con lo stesso comportamento. La classe determina i metodi validi. Per convenzione il suo nome inizia con una lettera maiuscola; = carattere di assegnazione( non opera confronti: if A==B) - String: è una classe “immutabile”, tutti i suoi metodi non operano sull’oggetto dove è chiamato (motivi efficienza String Buffer) River.replace(“issip”,”our”) CLASSI ED OGGETTI La classe è lo stampino per creare gli oggetti. Una classe contiene dati(=variabili) e metodi (=cioè funzioni e subroutine che sono le azioni\operazioni). La classe “istanziata” per creare oggetti (\\ conto corrente o bank account: CC è la classe, ha delle proprietà quali saldo e valore iniziale; istanziare il CC significa che il mio conto corrente avrà un certo saldo e valore iniziale così come il tuo ed il suo) TIPI NUMERICI La variabile contiene proprio il valore, non l’indirizzo come per gli oggetti. I tipi numerici sono “primitivi” NB: i numeri non sono oggetti. Possono essere integer, short, long o float, double FORME RETTANGOLARI: 6 (ho 3 istanze della classe: (x,y) = origine in alto a sinistra, h e larghezza. Oggetti di tipo rectangle descrivono forme rettangolari La classe rectangle identifica l’idea del rettangolo . Avrà dati e metodi Per costruire oggetti uso l’operatore New. Un oggetto Rectangle non è una forma rettangolare- esso è un oggetto che contiene un insieme di numeri che descrivono il rettangolo L’operatore new crea un oggetto rectangle Esso impiega dei parametri (5,10,20,30,) pe inizializzare i dati dell’oggetto Esso restituisce l’oggetto Rectangle box= new Rectangle (5,10,20,30) Oss. Contiene http di memoria dove stanno davvero i 4 dati che servono ad identificare il rettangolo ISTANZIARE OGGETTI Il processo di creazione di nuovi oggetti è detto “istanziazione” “parametri di istanziazione” Se non do valori alla classe, chi ha creato la classe ha detto che è un rettangolo degenere ( come 0,0,0,0) CREAZIONE DI OGGETTI New ClassName(parameters) New Rectangle(5,10,20,30) METODI DI ACCESSO E MODIFICATORI Di accesso: accedono ma non cambiano i dati (es. getwidth(): double width=box.getWidth() ) Modificatori: cambiano lo stato del loro parametro implicito (es. box.translate(15,25) IMPORTARE PACKAGES Le classi java sono raggruppate in packages. Si possono importare classi specificando il package ed il nome della classe Ogni package contiene molte classi (es. Swing), in certi casi, se voglio usare la classe Rectangle, devo scrivere import e nome package. Si possono importare classi specificando il package ed il nome della classe: Import packageName.ClassName; import java.awt.Rectangle; Ma non occorre importare java.lang e quindi si hanno a disposizione ad esempio String e System Per importare un classe che è in un package diverso da quello che si sta usando si fa: 7 import java.util.Randoom; all’inizio del programma DOCUMENTAZIONE API: Application Programming Interface; elenca classi e metodi della libreria Java http://java.sun.com/javase/6/docs/api/index.html Field = sono i dati di istanza RIFERIMENTI AD OGGETTI Essi descrivono la posizione degli oggetti nella memoria del computer. New restituisce un riferimento ad un nuovo oggetto. Oss. Variabili oggetto diverse possono riferirsi allo stesso oggetto Rectangle box NB: Le variabili oggetto hanno l’indirizzo della zona di memoria dove sta realmente l’oggetto Rectangle box = new Rectangle (5,10,20,30); Rectangle box2 = box; assegnato a box2 l’indirizzo che box contiene box e box2 si riferiscono allo stesso oggetto CREARE UNA CLASSE file – new file – java class Nb: deve essere nello stesso package (es. javaapplication) APPLICAZIONE GRAFICHE E FINESTRE Per visualizzare un frame: all’interno di una classe Main 1. Costruire un oggetto della classe JFrame – lo istanzio JFrame pippo =newJFrame(): 2. Stabilire le dimensioni del frame – chiamo il metodo setSize per h e larghezza pippo.setSize( , ); 3. Eventualmente definire il titolo del frame pippo.setTitle(“An empty Frame”); 4. Fissare la “default close operation” – cosa fare quando chiudo il frame? Stabilisco una operazione di default di chiusura. Exit on close è maiuscolo perché è una costante. pippo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 5. Rendere il frame visibile – fra () parametro booleano pippo.setVisible(true); Import java.swing.JFrame; 8 Public class EmptyFrameViewer { Public static void main(String[] args){ JFrame frame = new JFrame(); frame.setSize(300,400); frame.setTitle(“An empty Frame”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible;} } DISEGNARE IN UN FRAME Oss. Anziché scrivere tutti i pacchetti da richiamare, si va su Source-fix imports (lo fa java in automatico) Non si può disegnare direttamente sul frame, si disegna su un adesivo trasparente che viene poi appiccicato sul frame: disegno su lui, viene incollato disegno sul frame) Esso deve essere della classe JComponent che appartiene alla Swing: questa classe ha il comando paintComponent con un unico parametro. Purtroppo non uso JComponent, ma una sua sottoclasse un figlio, che “estende” cioè “eredita” da JComponent tutto ciò che ha. Pertanto il procedimento seguito e da fare è: JC, creo classe figlio, ridefinisco metodo Jcomponent con istruzioni, e dentro scrivo ciò che voglio disegnare. Per visualizzare un disegno in un frame, definire innanzi tutto una classe che estende la classe JComponent Sistemare le istruzioni di disegno dentro il metodo paintComponent. Tale metodo viene chiamato ogni volta che il componente necessita di essere ridisegnato Public class RectangleComponent extends JComponent { Public void paintComponent(Graphics g){ Drawing instructions go here} } g può cambiare, g appartiene alla classe Graphics ma la classe Graphics è povera di roba uso la classe Graphics2D: ma allora devo cambiare g convertendolo: Graphics2D g2 = (Graphics2D) g; assegno g a g2, cioè assegno lo stesso indirizzo di memoria ; (da convertire) Graphics è una classe che consente di manipolare le caratteristiche grafiche (es. colore) Graphics2D è una classe con metodi per disegnare forme (quadrati, cerchi,..). Devo usare una conversione per recuperare l’oggetto Graphics2D dal parametro Graphics esempio: 9 public class RectangleComponent extends JComponent { public static void paintComponent (Graphics g) { Graphics2D g2 = (Graphics2D) g; } } DISEGNARE 2 RETTANGOLI Per appiccicare il component al frame: frame.add(component); Il disegno verrà fatto in fase di lancio del programma e java lo rilancerà ogni volta che occorrerà farlo vedere Il metodo Intersection appartiene alla classe Rectangle: import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JComponent; public class RectangleComponent extends JComponent { public void paintComponent(Graphics2D g); Graphics2D g2 = (Graphics2D) g; Rectangle box = new Rectangle(5,10,20,30); g2.draw(box); box.translate(15,25); g2.draw(box); // oppure avrei potuto fare Rectangle box1 = new Rectangle(10,20,20,30) e // g2.draw(box1) } Ora scrivo le istruzioni complete, rendo visibili i rettangoli: import.java.swing.JFrame; public class RectangleViewer { public static void main(String[] args){ JFrame frame = new JFrame(); frame.setSize(300,400); frame.setTitle(“2 rettangoli”); 10 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); RectangleComponent component = new RectangleComponent(); Frame.add(component) Frame.setVisibile(true); } } ELLISSI Ellipse2D.double; descrive un ellisse Per disegnarla: Ellipse2D.double pippo = new Ellipse2D.double (x,y, width, height); g2.draw(pippo); (progetto Moodle): ogni volta che cambio la dimensione della finestra scatta il paint-component , e siccome l’ellisse ha delle opportune coordinate che dipendono dalla grandezza del frame si modifica la sua dimensione. Le dimensioni dell’etichetta del JComponent sono le stesse del frame. Quindi sulla documentazione API alla voce Jcomponent che cosa può essere utile? GetHeight() che dà l’altezza del jcomponent e GetWeight() che ne dà l’ampiezza. Oss. Dentro ogni nome-cartella del processo: la cartella biuld c’è un file .jar ( file di tipo .zip). Esso contiene i file bytecode del progetto (.class): se clicco 2 volte la JVM fa partire il progetto. Questo è il fileprogetto che va distribuito. La cartella SRC contiene il file .java. Con questo posso usare il progetto con altri software. Il resto dei file è un contorno. NB. Se copio i file.java posso modificare il progetto. Se invece voglio solo distribuire il progetto allora devo copiare i file .class LINEA Line2D.Double pluto = new Line2D.Double(x1,y1,x2,y2); g2.draw(segment); TESTO g2.drawstring(“Message”,50,100); COLORI 11 Color.BLUE, Color.RED g2.setcolor(magenta); per stabilire il colore g2.fill(pippo); per riempire forme CAPITOLO 3: COSTRUZIONE DELLE CLASSI Incapsulamento: caratteristica delle classi di nascondere le caratteristiche/ i dettagli non importanti. E’ il processo di nascondere i dati dell’oggetto e fornire i metodi per l’accesso a tali dati. Incapsulare significa dichiarare le variabili di istanza come private e definire metodi pubblici che accedono a tali dati. I metodi pubblici garantiscono l’accesso alle variabili private Come una scatola nera. Basta sapere che cosa fanno e a cosa servono le classi, non servono tutti i dettagli: quando costruisco una classe, la base della mia classe sarà un’altra classe. Di questa ultima mi interessa solo sapere cosa fa e a cosa serve. Ad ogni incapsulamento corrisponde un concetto, i concetti sono individuati tramite l’astrazione. Nella programmazione ad oggetti le scatole nere che costituiscono il programma sono chiamate oggetti. Agendo tramite incapsulamento si costruiscono programmi efficienti e chiari (es. il meccanico controlla e risolve solo alcuni problemi dell’auto; i guidatori sanno solo guidare il veicolo; l’utente usa il programma; un programmatore sa costruire alcune cose del programma, un altro altre;..). L’astrazione viene usata per inventare tipi di dati di alto livello Una regola pratica per progettare una classe è definirne dapprima il comportamento e poi si può procedere a realizzarla. Esempio: realizzare classe che rappresenti i conti correnti bancari Definisco comportamento di un conto corrente bancario: effettuare deposito, ritirare un importo, ottenere un saldo. Cioè per ogni soggetto vorrei fosse possibile sapere il bilancio del suo conto, il deposito ed i prelievi. Deposito_di_Mario_Checking.deposit(2000); Deposito_di_Mario_Checking.withdraw(500); System.out.println(Deposito_di_Mario_Checking.getBalancce() ); DEFINIZIONE DI UN COSTRUTTORE Un costruttore inizializza le variabili di istanza. I costruttori sono sempre (quasi tutti) pubblici! Ha lo stesso nome della classe ove si trova. Più costruttori di una stessa classe avranno lo stesso nome purché però abbiano parametri diversi (come i metodi) nel nome o nel tipo Es. Nella classe ContoCorrente ci sarà: public ContoCorrente() { //fare qualcosa } Il corpo del costruttore viene invece eseguito quando un nuovo oggetto viene creato. 12 Se costruisco una classe senza costruttori, allora ne esiste uno che non fa nulla. Le istruzioni nel corpo del costruttore fisseranno i valori dei dati interni all’oggetto che viene istanziato. Grammatica (scopo: definire comportamento di un costruttore) I costruttori si dichiarano all'interno di una classe essenzialmente come i metodi, ma rispettando le seguenti regole: - Nome = nome della classe Tipo di costruttore non specificato ‘static’ no va usato AccessSPecifier ClassName(tipo di parametro nome del parametro,..) { corpo del costruttore } Esempio di costruttore Public account { Bilancio =0 (variabile bilancio inizializzata a 0) } Chiamata di un costruttore (=ContoCorrente) ContoCorrente contoCorrenteDiHenryChecking = new ContoCorrente(100); oss. Ciò crea un nuovo oggetto di tipo ContoCorrente, inizializzando il parametro bilancioIniziale a 1000, cioè inizializza il dato di istanza bilancio del nuovo oggetto creato al valore di 1000. Esso restituisce il riferimento ad un oggetto, cioè l’indirizzo di memoria dell’oggetto. Memorizza il riferimento dell’oggetto, nella variabile contoCorrenteDiHenryChecking vs Chiamata di un metodo contoCorrenteDiHenryChecking.deposit(500); inizializza il parametro amount a 500. Va a prendere il campo bilancio dell’oggetto il cui indirizzo è memorizzato in contoCorrenteDiHenryChecking. Aggiunge il valore dell’importo a bilancio e memorizza il risultato nella variabile nuovoBilancio. (vd pg 13 e 14) RETURN grammatica return espresisone; ad esempio return bilancio DEFINIZIONE DI UNA CLASSE 13 Grammatica (definire una classe, la sua interfaccia pubblica ed i suoi dettagli costruttivi) Interfaccia pubblica: è l’insieme dei metodi e dei costruttori pubblici. Se un metodo è private, può essere usato solo all’interno della classe ove è definito, se è public lo si può usare anche in altre classi. AccessSpecifier class ClassName { costruttori Metodi Dati di istanza = fields } Es. Public class ContoCorrente { Public ContoCorrente (double BilancioIniziale) { } Public void deposito(double ammontare) { } } Alcuni metodi non restituiscono alcun valore, public void withdraw(double amount){ double nuovoBIlancio= balance – amount; balance = nuovoBilancio; } , altri invece restituiscono un valore di output public double getBalance() { return balance } COMMENTI: /** */ VARIABILI DI ISTANZA (o variabili di istanza o fields) Un oggetto memorizza i suoi dati in variabili di istanza (campi di esemplare, dove campo=indirizzo in un blocco di memoria). Logicamente prima si creano le variabili di istanza e poi i metodi La istanza di una classe è un oggetto di una classe! 14 La dichiarazione di una classe specifica le avariabili di istanza Public class ContoCorrente { Private double bilancio; } - Specificatore di accesso (public / private) Tipo di variabile (double/..) Nome della variabile Ciascun oggetto della classe ha il proprio insieme di dati di istanza Nb. Di norma tutte le variabili di istanza vanno dichiarate come private! Nella classe ContoCorrente è stata definita la variabile bilancio: le variabili di istanza sono due valori che la variabile bilancio assume in corrispondenza di due diversi conti correnti. Grammatica- dichiarazione: accessSpecifier classe NomeDellaClasse { accessSpecifier TipoDiField NomediField; } Esempio – scopo: definire un campo che è presente in ogni oggetto della classe Public class ContoCorrente { Private double balance } CATEGORIE DI VARIABILI V DI ISTANZA: Appartiene all’oggetto. Visibilità dell’oggetto. Inizializzate di defalut Muore qnd l’oggetto muore V PARAMETRO: appartiene ad un appartiene ad un metodo metodo V LOCALI: Devono essere inizializzate *esplicitamente( Sono inzializzate di default Esistono e vivono Esistono e vivono fintanto fintanto che è in che è in esecuzione il esecuzione il metodo metodo THIS 15 Parola chiave che indica il parametro implicito. L’uso del nome di una variabile di istanza in un metodo indica la variabile di istanza del parametro implicito. Il parametro implicito è sempre chiamato this., a aprte i metodi statici. Quando ci si riferisce ad una variabile di istanza in un metodo, il compilatore automaticamente gli applica il parametro this ( parametro implicito this, tipo ContoCorrente). CLASSI PER DISEGNARE FIGURE (esericizio) Disegnare una classe per ogni figura Struttura della classe car: costruttore e parametri (x,y), metodo draw (da creare= Car Viewer, Car component, e altra // è un costruttore il seguente Public car (int x, int y) { x Left = x y left = y } Quando creerò car1, i suoi dati di istanza saranno dati dal metodo. Nel paintComponent chiamo il metodo draw della classe car, Car.draw(g2) dove g2 è un indirizzo di memoria passato al metodo draw della classe car. CAR – MOODLE Un oggetto Car deve essere identificato da x,y e da un colore (aggiunta che devo fare io). modifico la classe car.java inserendo un nuovo dato di istanza. Devo modificare la car.java 16