Introduzione al linguaggio Java
Cosa c’è di nuovo in Java?
Java ed Internet.
Applicazioni ed Applets: come scriverli e farli girare.
Caratteristiche originali e differenze con C / C++.
Dove trovare informazioni?
1
Che cosa è Java?
È un linguaggio di programmazione
orientato agli oggetti.
Le applicazioni Java sono indipendenti dalla
piattaforma su cui vengono prodotte.
Java è stato progettato con l’intento di realizzare
un linguaggio semplice, robusto e sicuro.
Java è particolarmente adatto per l’ambiente
grafico e per applicazioni in rete.
2
Java ed Internet
Java è un linguaggio OO come molti altri, tuttavia suo sviluppo ha subito
una enorme spinta dalla diffusione di Internet.
Portabilità e sicurezza sono le caratteristiche che hanno
decretato il successo di Java per le applicazioni di rete.
L’indipendenza dalla piattaforma fa sì che un programma
Java possa essere scaricato dalla rete e direttamente
eseguito su tutte le più diffuse architetture di computer (PC,
Unix, Mac ...).
3
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.
Java ha un compilatore ed un interprete.
4
La novità di Java : il BYTECODE
Il compilatore non produce codice macchina, ma un insieme
ottimizzato di istruzioni detto BYTECODE.
Il sistema run-time di Java emula una macchina virtuale (Java
Virtual Machine) che esegue il BYTECODE .
Ogni architettura per la quale la Virtual Machine sia
implementata, può eseguire lo stesso programma Java.
L’efficienza di esecuzione di Java è superiore rispetto agli altri linguaggi
interpretati (Tcl, Perl...), anche se non raggiunge quella dei linguaggi compilati.
Inoltre l’interprete Java fornisce compilatori “just in time” per trasformare a runtime il BYTECODE in codice macchina, guadagnando in velocità, ma perdendone
la portabilità.
5
Sicurezza
Un eseguibile prodotto da altri e scaricato via rete sulla
propria macchina potrebbe trasmettere virus o accedere a
dati privati.
Un programma Java non può violare la
sicurezza!
 L’esecuzione di un BYTECODE Java é confinata nel sistema
run-time che lo interpreta.
 Nel linguaggio non esistono i puntatori.
 L’ applet non può scrivere né leggere sul client, né aprire
connessioni con altri sistemi.
6
Possiamo produrre due tipi di programmi Java :
Applicazioni e Applets.
Un’applicazione viene eseguita sul proprio computer ed é
equivalente ad un programma C o C++.
Un applet é fatto per essere trasmesso in rete tra un Web
server ed un client, eseguito attraverso un browser.
In un programma Java tutto il codice è contenuto
all’interno di classi.
Java non è concepito per essere compatibile con altri linguaggi,
tuttavia è possibile invocare “Metodi Nativi” in linguaggi compilati.
Si perde però la portabilità.
7
Un esempio di Applicazione
• Installare il JDK !!
• Scrivere il codice in un file Example.java
Example.java
class Example {
public static void main (){
System.out.println(“Hello World!”);
}
}
Il “programma” é
costituito da una classe
che implementa un
metodo main
Example.class
javac Example.java
• Eseguire l’applicazione:
java Example
• Compilare :
8
Java vs C++
La sintassi è fondata sul C++, con alcune semplificazioni.
Java non consente l’uso dei puntatori.
Un sistema di garbage collection si occupa della
gestione automatica della memoria.
Non è possibile l’ereditarietà multipla, ma
Java fornisce le interfacce.
Le classi ed i metodi di I/O sono diversi da quelli del C++.
9
Creazione degli oggetti
L’allocazione di nuovi oggetti avviene con new
esattamente come in C++:
Box mybox = new Box( );
Gli oggetti non hanno un distruttore, sostituito dal sistema
di garbage collection di Java, associato al metodo
finalize.
10
Ereditarietà
Una sottoclasse viene creata con l’istruzione extends;
class HeavyBox extends Box {...}
Ogni sottoclasse può ereditare da una sola
superclasse.
È consentita la ridefinizione (override) dei metodi.
Si possono definire classi abstract, di cui non si possono
creare istanze, ma possono essere usate come riferimento alle
sottoclassi, risolto a run-time (Polimorfismo).
11
Interfacce
Una interface è definita in modo analogo ad una classe, ma
ha metodi non implementati e non ha variabili di istanza.
Una interface può contenere la definizione di costanti, che
sono condivise dalle classi che implementano l’ interface.
Più classi possono implementare la stessa interfaccia,
definendone tutti i metodi.
class MyClass implements MyInterface { ... }
Risoluzione dinamica dei metodi.
12
FixedStack.java
IntStack.java
interface IntStack {
void push(int item);
int pop( );
}
class FixedStack implements IntStack {
… variabili di istanza e metodi propri ...
public void push(int item) {
… corpo di push per FixedStack…
}
public int pop( ) {
… corpo di pop per FixedStack…
}
}
DynStack.java
class DynStack implements IntStack {
… variabili di istanza e metodi propri ...
public void push(int item) {
… corpo di push per DynStack…
}
public int pop( ) {
… corpo di pop per DynStack…
}
}
13
Uso delle Interfacce
FixedStack.java
DynStack.java
class FixedStack
implementsIntStack
IntStack{ {
DynStack implements
… variabili di istanza e metodi propri
...
IntStack.java
public void push(int item) {
interface IntStack {
… corpo di push per FixedStack…
DynStack…
void push(int item);
}
int pop( );
public int pop( ) {
}
… corpo di pop per FixedStack…
DynStack…
}
}
14
InterfaceTest.java
class InterfaceTest {
public static void main (String args[]) {
IntStack mystack;
FixStack fs = new FixStack(8);
DynStack ds = new DynStack(5);
mystack = ds;
for (int i=0; i<12; i++) mystack.push(i);
mystack = fs;
for (int i=0; i<8; i++) mystack.push(i);
}
}
15
Pacchetti
Un package raggruppa un insieme di classi correlate, che
possono essere importate nelle applicazioni.
L’appartenenza ad un pacchetto si realizza inserendo all’inizio
del file l’istruzione : package MyPackage;
Per importare in una applicazione le classi del pacchetto:
import MyPackage.*;
java.lang
java.io
java.util
java.net
java.applet
java.awt
java.awt.image
java.awt.peer
16
Finalmente un Applet!
import
java.awt.*;
L’applet è pilotato
import
java.applet.*;
ad eventi.
Un applet non
ha metodo
main.
public class SimpleApplet extends
Applet {
public void paint(Graphics g) {
g.drawString(“Hello
World!”);
L’ I/O è realizzato attraverso
}
AWT (Abstract Window
Toolkit).
}
17
L’esecuzione dell’ applet
Un applet può essere eseguito dall’ appletviewer
oppure attraverso un web browser.
Per accedere all’ applet bisogna inserirlo in un file HTML
con il tag APPLET.
public void init( ){...}
Nell’applet si ridefiniscono i
metodi delle classi Applet e
AWT che vengono poi
chiamati dall’appletviewer.
public
public
public
public
void
void
void
void
start( ){...}
paint( ){...}
stop( ){...}
destroy( ){...}
È comune l’uso dei threads, per I quali Java fornisce la
classe Thread e l’interfaccia Runnable.
18
L’esecuzione dell’ applet
Un applet può essere eseguito dall’ appletviewer
oppure attraverso un web browser.
Per accedere all’ applet bisogna inserirlo in un file
HTML con il tag APPLET.
L’Applet non ha un metodo main...
Nell’applet si ridefiniscono i metodi delle classi
Applet e AWT che vengono poi chiamati
dall’appletviewer.
19
L’esecuzione dell’ applet
Metodi della classe Applet
public
public
public
public
public
public
void init( ){...}
void start( ){...}
void paint( ){...}
void stop( ){...}
void destroy( ){...}
boolean action( ) {...}
20
Un esempio di Applet
Scriviamo un esempio con 3 bottoni che
provocano il cambio di colore dello sfondo
Implementeremo i metodi:
init per definire lo stato iniziale
action per rivelare gli eventi connessi
alla pressione dei bottoni
paint per ridisegnare l’applet
21
import java.awt.*;
import java.applet.*;
Esempio
public class ButtonDemo extends Applet {
String msg = “Ti piace Java?”;
public void init() {
Button yes = new Button(“Si”);
Button no = new Button(“No”);
Button maybe = new Button(“Non so”);
SetBackground(Color.white);
add(yes);
add(no);
add(maybe);
}
public void paint(Graphics g) {
g.drawString(msg,6,100);
}
22
public boolean action(Event evtObj,
Object arg) {
if (evtObj.target instanceof Button) {
if (arg.equals(“Si”)) {
setBackground(Color.green);
msg = “I love Java!”;
}
if (arg.equals(“No”)) {
setBackground(Color.red);
msg = “Io odio Java!”;
}
if (arg.equals(“Non so”)) {
setBackground(Color.yellow);
msg = “Non me ne importa niente!”;
}
}
}
La programmazione multithreaded
Più parti del programma possono essere eseguite
contemporaneamente, in diversi threads.
Tutti i threads sono figli del main. Se un thread si
blocca in attesa di un evento, gli altri continuano a girare.
Si possono definire le priorità di esecuzione e sincronizzare
l’esecuzione mediante semafori.
Il metodo più semplice per creare un thread è creare
una classe che implementa l’interfaccia Runnable e
implementare il metodo run( ).
24
La gestione delle eccezioni
Una eccezione è una condizione di errore run-time.
In java una eccezione è un oggetto creato e lanciato
nel metodo che ha provocato l’errore.
class Exc1 {
public static void main(String args[]) {
int d, a;
try {
d = 0; a = 42 / d;
System.out.println(“This will not be printed”);
} catch (AritmeticException e) {
System.out.println(“Division by zero”); }
}}
Esiste un gestore default delle eccezioni.
Si possono lanciare eccezioni con l’istruzione throw
25
Riferimenti
Windows NT/95
Sun Solaris
Macintosh 1.0.2
http://www.javasoft.com
HP-UX 10.x
Digital UNIX
IBM AIX
http://java.sun.com/cgi-bin/java-ports.cgi
Linux
http://www.blackdown.org/java-linux.html
http://www.gamelan.com
Java - P.Naughton, H.Schildt McGraw Hill
Java in a nutshell - D.Flanagan O’Really
26