OO puro Primi concetti di Java Java è object-oriented puro Non come il C+ + (OO ibrido) Per compatibilità col C Lorenzo Bettini Ogni cosa è un oggetto Gli oggetti si manipolano tramite riferimenti String s; I riferimenti devono essere inizializzati String s = new String(“foo”); String s1 = “foo”; String s2; S2 = new String(“foo”); Tipi primitivi Caso speciale: i tipi primitivi: int i = 10; char c = ‘a’; bool b = true; Wrapper per tipi primitivi: Integer i = new Integer(10); Character c = new Character(‘a’); Boolean b = new Boolean(true); 1 Allocazione di memoria Ambito di visibilità o portata È determinato dal posizionamento delle parentesi graffe (blocchi di codice): Gli oggetti creati con new sono allocati nello heap Non è necessario liberare questa memoria (cioè distruggere un oggetto) Ci pensa il Garbage Collector { int x = 12; /* solo x è disponibile */ { int q = 96; /* x e q entrambi disponibili */ } /* solo x è disponibile */ /* q è fuori portata (“out of scope”) */ } Hello world! Hello world! Classe “globale” // HelloWorld.java // HelloWorld.java public class HelloWorld { public class HelloWorld { public static void main(String args[]) { public static void main(String args[]) { System.out.println("Hello world!"); System.out.println("Hello world!"); } } Nome = al file } } 2 Hello world! Visibile all’esterno della class Hello world! Non legato ad un particolare oggetto della classe public class HelloWorld { Punto di ingresso per eseguire un’applicazione public class HelloWorld { public static void main(String args[]) { public static void main(String args[]) { System.out.println("Hello world!"); System.out.println("Hello world!"); } } } } Hello world! Modo standard di stampare una stringa sullo schermo public class HelloWorld { public static void main(String args[]) { System.out.println("Hello world!"); Gestione array Dichiarazione di un array int [] a1; int a1[]; Inizializzazione int[] a1 = {1, 2, 3, 4, 5}; int[] a2 = new int[d]; } } 3 Esempio di uso di array public class Arrays { public static void main(String[] args) { int[] a1 = { 1, 2, 3, 4, 5 }; int[] a2; a2 = a1; I Java package for(int i = 0; i < a2.length; i++) a2[i]++; for(int i = 0; i < a1.length; i++) System.out.println( "a1[" + i + "] = " + a1[i]); } Basati sui lucidi di Matteo Baldoni, Dip. di Informatica, Univ. di Torino } Cos’è un package? Perché usiamo le cartelle (direttori, folder) sul nostro desktop? Perché desideriamo tenere insieme i file che hanno uno stesso scopo o utilità Per ritrovare i file con maggiore facilità in un momento successivo Per archiviare i file più facilmente e passarli a qualcun’altro Per garantire l’unicità ai nomi dei file Spesso un direttorio è strutturato in sottodirettori Un package può essere visto come una cartella di classi Java Package La cartella dove sviluppiamo un applicativo Java è un package, il package di default di Java I package possono essere strutturati in sottopackage come le cartelle Possono essere archiviati in file compressi (JAR file) Definiscono spazi dei nomi separati per garantire unicità agli identificatori da noi utilizzati Le librerie di Java sono tutte organizzate in package e sottopackage 4 Package Package j ava ut il package pu blic Come fare della nostra semplice cartella di classi un vero e proprio package? classi inter facce awt event Come utilizzare un package all’interno di un file e quindi rendere disponibili le utilità in esso definite? ... L’istruzione package Posso definire che un certo file che contiene una certa classe pubblica e un certo numero di altre classi (non pubbliche!) fa parte di un certo package mediante la parola chiave package Un esempio Voglio definire un package di nome geometria contenente a sua volta due package di nome poligoni e prismi package nomedelpackage ; class nomedellaclasse { . . . } prim a ist ruzione! nomedelpackage . nomedellaclasse 5 Dichiarazione di un package I n ogni file .java del sottodirettorio poligoni di geometria aggiungerò come prima istruzione package geometria.poligoni; I n ogni file .java del sottodirettorio prismi di geometria aggiungerò come prima istruzione package geometria.prismi; Package, javac e java package geometria.poligoni; public class Rettangolo { […] } Nel direttorio esempiPackage: Per la compilazione javac geometria\poligoni\Rettangolo.java Per l’esecuzione java geometria.poligoni.Rettangolo Effetto Effetto della precedente dichiarazione sarà quella di associare alla classe Poligono e Prisma il nome di geometria.poligoni.Poligono geometria.prismi.Prisma Questi sono i veri nomi delle classi ed è così che andranno identificate Organizzazione e nomi simile a quella dei file nei direttori L’istruzione import Scrivere i nomi delle classi è diventato meno agevole e sicuramente più tedioso L’istruzione import permette di semplificare la scrittura dei nomi delle classi in package include in C/C+ + vs import in Java I m port o il nom e della import geometria.poligoni.Rettangolo; classe Poligono nel import geometria.poligoni.*; package geom et ria.poligoni I m port o t ut t i i nom i del package geom et ria.poligoni 6 CLASSPATH: lo spazio dei nomi Dove andare a cercare i vari package e classi? Come rendere accessibili i miei package da un direttorio qualsiasi? Java fa uso (sia in compilazione che in esecuzione) della variabile di ambiente CLASSPATH in m odo definit ivo ( nel file aut oexec.bat) SET CLASSPATH=.;C:\esempi\esempiPackage Classpath: lo spazio dei nomi javac -classpath .;C:\esempi\provaclasspath\directory1; C:\esempi\provaclasspath\directory2 ProvaClassPath.java import javamio.util.*; import corso.*; class ProvaClassPath { A a = new A(); } javac -classpath .;C:\esempi\esempiPackage java -classpath .;C:\esempi\esempiPackage t em poraneam ent e Visibilità dei membri delle classi Ad ogni membro di una classe può essere associata una delle parole chiave: nessuna visibile a tutte le classi dello stesso package public visibile a tutti (parte dell’interfaccia dell’oggetto) HelloDate Come HelloWorld ma Voglio stampare anche la data corrente Come posso stampare la data in Java? private visibile solo alla classe stessa protected visibile a tutte le sottoclassi ed alle classi dello stesso package 7 HelloDate // HelloDate.java import java.util.*; public class HelloDate { public static void main(String[] args) { System.out.println("Hello, it’s: "); System.out.println(new Date()); } } 8