Final PC

JAVA

« Older   Newer »
  Share  
xfab1994
view post Posted on 3/1/2010, 23:47




Java è un linguaggio di programmazione orientato agli oggetti, derivato dal C+ e quindi indirettamente dal C) e creato da James Gosling e altri ingegneri di Sun Microsystems. La piattaforma di programmazione Java è fondata sul linguaggio stesso, sulla Macchina virtuale Java (Java Virtual Machine o JVM) e sulle API Java. Java è un marchio registrato di Sun Microsystems.

Caratteristiche

Java venne creato per soddisfare quattro scopi:

1. essere orientato agli oggetti
2. essere indipendente dalla piattaforma
3. contenere strumenti e librerie per il networking
4. essere progettato per eseguire codice da sorgenti remote in modo sicuro

Per facilitare il passaggio a questo linguaggio per i programmatori old-fashioned legati in particolare a linguaggi come il C la sintassi di base (strutture di controllo, operatori e così via) è stata mantenuta pressoché identica.

Orientamento agli oggetti

La prima caratteristica, l'orientamento agli oggetti, si riferisce a un moderno metodo di programmazione e progettazione, la programmazione orientata agli oggetti (OOP).

L'idea alla base della OOP è di rappresentare, nella progettazione del software, le entità reali o astratte che compongono il problema sotto forma di oggetti. Gli oggetti sono caratterizzati da delle proprietà (definite variabili o campi di istanza o di esemplare) e di metodi applicabili sugli oggetti stessi, che possono ad esempio modificarne lo stato o estrarne informazioni.

I programmi scritti in Java possono essere unicamente orientati agli oggetti, di conseguenza tutto il codice deve essere necessariamente incluso in una classe.

Sebbene Java possa operare sia su oggetti che su tipi di dati primitivi, è considerato un linguaggio ad oggetti puro, ovvero nel quale gli oggetti sono le entità di base del linguaggio, anziché essere costruiti partendo da costrutti ad un inferiore livello di astrazione.

Ereditarietà

L'ereditarietà in java è implementata mediante la parola chiave extends, applicata nella dichiarazione di una classe.

CODICE
public class Quadrato extends Quadrilatero


Una classe estende sempre una e una sola altra classe (ovvero non esiste ereditarietà multipla), ma può a sua volta essere estesa da un numero arbitrario di classi. Se non si utilizza la clausola extends, la classe estende comunque una superclasse implicita, la classe Object.

Questo sistema rende disponibile un modo per creare gerarchie di classi ben definite, ad esempio una classe Quadrilatero può definire alcuni comportamenti generali per tutte le figure geometriche con 4 lati, tuttavia si può presentare la necessità di aver bisogno di caratteristiche più specifiche per i nostri oggetti, quindi si creerà una classe Quadrato che estende la classe Quadrilatero da cui deriva tutti gli attributi (le variabili di istanza) e tutti i comportamenti (i metodi), salvo poi riscrivere (tramite overriding) quei comportamenti che sono prettamente associati ai quadrati (ovvero legati alla proprietà specifica dei quadrati di avere 4 lati uguali).

L'overriding si attua semplicemente scrivendo all'interno della classe che estende (in questo caso la classe Quadrato) il metodo che vogliamo riscrivere, utilizzando la stessa firma del relativo metodo della superclasse (deve avere lo stesso nome e gli stessi attributi, in numero e tipo, e lo stesso ordine).

Java adotta un modello di ereditarietà basato sull'ereditarietà singola; in altre parole, una classe può estendere una sola superclasse. Su questo punto Java si differenzia dal C++, basato sul modello dell'ereditarietà multipla. Dopo l'avvento di Java, l'ereditarietà singola si è gradualmente affermata come modello standard di ereditarietà nelle tecnologie object-oriented, ed è stata abbracciata, per esempio, anche dai linguaggi del framework .NET Microsoft.

Interfacce

L'utilizzo di una interfaccia in Java consente di trattare in modo omogeneo tutti gli oggetti che forniscono un dato insieme di servizi, a prescindere dalla loro implementazione (e quindi dalla loro particolare classe di appartenenza). Dal punto di vista sintattico, una interfaccia Java consiste principalmente di una lista di dichiarazioni di metodi che tutte le classi che implementano l'interfaccia devono fornire.

CODICE
public class Quadrato implements FiguraGeometrica


dove l'interfaccia FiguraGeometrica potrebbe essere dichiarata come segue:

CODICE
public interface FiguraGeometrica {
public int calcolaPerimetro();
public int calcolaArea();
}

Si noti che nella dichiarazione di un metodo in un'interfaccia le parole chiave public e abstract sono sempre implicite e, dunque, facoltative. Con l'implementazione dell'interfaccia, la classe Quadrato deve contenere al suo interno i metodi calcolaPerimetro e calcolaArea propri (o possono essere ereditati dalla superclasse). L'utilizzo delle interfacce viene usato quando si hanno delle gerarchie di oggetti, o oggetti semplici che possiedono delle operazioni comuni (metodi), ma l'implementazione di queste sono differenti una dall'altra.

Indipendenza dalla piattaforma

La seconda caratteristica, l'indipendenza dalla piattaforma, significa che l'esecuzione di programmi scritti in Java deve avere un comportamento simile su hardware diverso. Si dovrebbe essere in grado di scrivere il programma una volta e farlo eseguire dovunque. Questo è possibile con la compilazione del codice di Java in un linguaggio intermedio detto bytecode, basato su istruzioni semplificate che ricalcano il linguaggio macchina. Il bytecode verrà quindi eseguito da una macchina virtuale. Inoltre, vengono fornite librerie standardizzate per permettere l'accesso alle caratteristiche della macchina (come grafica e networking) in modo unificato. Il linguaggio Java include anche il supporto per i programmi con multithread, necessario per molte applicazioni che usano la rete.

La portabilità è un obiettivo tecnicamente difficile da raggiungere, e il successo di Java in questo ambito è materia di alcune controversie. Sebbene sia in effetti possibile scrivere in Java programmi che si comportano in modo consistente attraverso molte piattaforme hardware diverse, bisogna tenere presente che questi poi dipendono dalle macchine virtuali che sono programmi a sé e che hanno inevitabilmente i loro bug, diversi l'una all'altra: per questo è nata una parodia dello slogan di Sun "Scrivi una volta, esegui dovunque" ("write once, run everywhere"), che è diventato "Scrivi una volta, fai il debug ovunque" ("write once, debug anywhere").

Compilazione Just-In-Time

Le prime implementazioni del linguaggio usavano una macchina virtuale Java che interpretava il bytecode per ottenere la massima portabilità, definita Architecture Neutral. Questa soluzione si è però rivelata poco efficiente, in quanto i programmi interpretati erano molto lenti. Per questo motivo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un compilatore just-in-time (JIT compiler), cioè un compilatore interno, che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel linguaggio macchina del computer ospite. Inoltre, questa ricompilazione è dinamica, cioè la macchina virtuale analizza costantemente il modello di esecuzione del codice (profiling), e ottimizza ulteriormente le parti più frequentemente eseguite, mentre il programma è in esecuzione.

Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permettono di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi compilati come il C++, scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come il garbage collector, che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano memoria e tempo di CPU in fase di esecuzione del programma finito.

Esecuzione sicura del codice remoto

La piattaforma Java fu uno dei primi sistemi a fornire un largo supporto per l'esecuzione del codice da sorgenti remote. Un Java applet è un particolare tipo di applicazione che può essere avviata all'interno del browser dell'utente, eseguendo codice scaricato da un server web remoto. Questo codice viene eseguito in un'area (sandbox) altamente ristretta, che protegge l'utente dalla possibilità che il codice sia malevolo o abbia un comportamento non desiderato; chi pubblica il codice può applicare un certificato che usa per firmare digitalmente le applet dichiarandole "sicure", dando loro il permesso di uscire dall'area ristretta e accedere al filesystem e al network, presumibilmente con l'approvazione e sotto il controllo dell'utente. In realtà gli applet non hanno avuto molta fortuna. Infatti presuppone che il client in cui essi vengono eseguiti abbia installata la JRE (deve eseguire il codice dell'applet). Hanno avuto fortuna le applicazioni che prevedono il cosiddetto thin-client, cioè un client 'leggero' che non ha bisogno di particolari strumenti per eseguire il codice remoto (a volte è necessario solo il browser).

Altri aspetti di interesse

Rispetto alla tradizione dei linguaggi a oggetti da cui deriva (e in particolare rispetto al suo diretto progenitore, il C++), Java ha introdotto una serie di notevoli novità rispetto all'estensione della sua semantica. Fra le più significative si possono citare probabilmente la possibilità di costruire GUI (interfacce grafiche) con strumenti standard e non proprietari utilizzando i package java.awt e javax.swing (per il C++ e altri linguaggi analoghi solitamente le GUI non fanno parte del linguaggio, ma sono delegate a librerie esterne), la possibilità di creare applicazioni multi-thread, ovvero che svolgono in modo concorrente molteplici attività, e il supporto per la riflessione, ovvero la capacità di un programma di agire sulla propria struttura e di utilizzare classi caricate dinamicamente dall'esterno.

Fra gli argomenti che depongono spesso a favore di Java nella scelta del linguaggio di implementazione di un progetto software moderno, inoltre, si deve certamente contare la vastità delle librerie standard di cui il linguaggio è dotato, e che in particolare contribuiscono a renderlo altamente integrabile con le altre tecnologie. Alcuni esempi di funzionalità di libreria di Java sono:

* accesso ai database tramite JDBC e ai DBMS con driver ODBC tramite il bridge JDBC-ODBC
* manipolazione documenti XML
* dialogo con piattaforme CORBA
* potenti strumenti per la programmazione lato server nel contesto Web
* supporto nativo per gran parte dei protocolli della famiglia IP, vedi ad esempio il Socket Java
* supporto per le applicazioni multimediali, streaming audio e video.

Linguaggio

Hello, world!

Il seguente esempio stampa il testo "Hello world".

CODICE
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}


Segue l'analisi riga per riga del frammento di codice:

CODICE
* public class HelloWorld


La classe porta il nome HelloWorld e, poiché è dichiarata "public", significa che anche il nome del file nel quale verra' scritto il programma dovra' chiamarsi HelloWorld.java. Quindi il nome del file .java e il nome della classe "pubblica" devono coincidere!

CODICE
* public static void main(String[] args)


La classe HelloWorld contiene un unico metodo, che si chiama "main". È un nome particolare. In effetti, al caricamento della classe, l'interprete java cerchera' il metodo che portera' questo nome.

* "public" perché il metodo deve essere raggiungibile da qualsiasi classe, e in particolare, dallo stesso interprete.
* "static" perché non deve essere invocato su un oggetto particolare (detto "d'invocazione").
* "void" perché non deve restituire alcun valore.

Il parametro args si riferisce all'array di stringhe passato all'interprete al momento del suo avvio. Se viene eseguito questo comando:

CODICE
$ java HelloWorld par1 par2


la stringa par1 sarà caricata nella variabile args[0] mentre par2 sarà caricata nella variabile args[1].

CODICE
* System.out.println("Hello world");


Questa operazione stampa sullo schermo la scritta "Hello world". Entrando più nel dettaglio, il metodo println() viene invocato su un oggetto statico di tipo PrintStream chiamato "out", il quale, a sua volta si trova all'interno della classe System.

Strutture di controllo


Cicli

CODICE
while (boolean expression)
{
statement(s)
}

do {
statement(s)
} while (boolean expression);

for (initialisation; termination condition; incrementing expr) {
statement(s)
}


Alternative

CODICE
if (boolean expression) {
statement(s)
}

if (boolean expression) {
statement(s)
} else {
statement(s)
}

if (boolean expression) {
statement(s)
} else if (boolean expression) {
statement(s)
} else if (boolean expression) {
statement(s)
} else {
statement(s)
}

switch (integer expression) {
case constant integer expr:
statement(s)
break;
...
default:
statement(s)
break;
}

(boolean expression) ? (statement on true condition) : (statement on false condition)


Gestione delle eccezioni


CODICE
try {
statement(s)
} catch (exception type) {
statement(s)
} catch (exception type) {
statement(s)
} finally {
statement(s)
}


Salti

È possibile inserire un'etichetta prima di ogni dichiarazione

CODICE
myLabel: aJavaStatement;


Il comando

CODICE
break;


termina il ciclo corrente.

Nel caso di cicli annidati, il break con label può essere usato per terminare uno qualsiasi di tali cicli:

CODICE
break cicloEsterno;


Un'espressione continue termina l'iterazione corrente e inizia quella successiva

CODICE
continue
;

Il continue con una label può essere usato per passare alla prossima iterazione di uno qualsiasi di un insieme di cicli annidati:

CODICE
continue cicloEsterno;


Tipi primitivi
Tipo di variabile Descrizione
CODICE
byte intero con segno a 8 bit
short intero con segno a 16 bit
int intero con segno a 32 bit
long intero con segno a 64 bit
float virgola mobile a 32 bit singola precisione (standard IEEE 754)
double virgola mobile a 64 bit doppia precisione (standard IEEE 754)
char carattere singolo Unicode
boolean vero o falso


I caratteri usano la codifica a 16 bit Unicode. Contiene tutti i caratteri usuali, oltre a tutti i set di caratteri di molte lingue come Greco, Cirillico, Cinese, Arabo, ecc. In Java si possono usare tutti questi caratteri, anche se molti editor non hanno il supporto per i set di caratteri diversi dal ASCII. Gli Array e le stringhe non sono tipi primitivi ma oggetti.

Versioni
CODICE
* JDK 1.1.4 (Sparkler) 12 settembre 1997
o JDK 1.1.5 (Pumpkin) 3 dicembre 1997
o JDK 1.1.6 (Abigail) 24 aprile 1998
o JDK 1.1.7 (Brutus) 28 settembre 1998
o JDK 1.1.8 (Chelsea) 8 aprile 1999
* J2SE 1.2 (Playground) 4 dicembre 1998
o J2SE 1.2.1 (none) 30 marzo 1999
o J2SE 1.2.2 (Cricket) 8 luglio 1999
* J2SE 1.3 (Kestrel) 8 maggio 2000
o J2SE 1.3.1 (Ladybird) 17 maggio 2001
* J2SE 1.4.0 (Merlin) 13 febbraio 2002
o J2SE 1.4.1 (Hopper) 16 settembre 2002
o J2SE 1.4.2 (Mantis) 26 giugno 2003
* J2SE 5.0 (1.5.0) (Tiger) 29 settembre 2004
* Java SE 6 (1.6.0) (Mustang) 11 dicembre 2006
* Java SE 7 (1.7.0) (Dolphin) Prevista per il 2008


Java fu inizialmente rilasciato come Java Development Kit 1.0 (JDK 1.0). Questo comprende Java Runtime (la virtual machine e le librerie di classi), e gli strumenti di sviluppo (es. il compilatore Java). Successivamente, Sun fornì un pacchetto che comprendeva solo Java runtime, chiamato Java RunTime Environment (JRE). Normalmente le persone si riferiscono ad una particolare versione di Java attraverso la versione del JDK (es. JDK 1.4) Le versioni JDK 1.2 e successive sono spesso chiamate Java 2. Per esempio, il nome ufficiale del JDK 1.4 è Java(TM) 2 Platform, Standard Edition 1.4.

Il linguaggio è rimasto stabile dal JDK 1.0; la libreria di classi che viene fornita con JDK è stata progressivamente ampliata e modificata in alcune parti.
Le estensioni e architetture legate al linguaggio Java comprendono:

CODICE
* GeoTools Libreria per il trattamento di dati geografici
* J2SE Java 2 Platform Standard Edition
* Java_EE Java Platform Enterprise Edition
* J2ME Java 2 Platform Micro Edition
* Servlet
* EJB Enterprise JavaBeans
* JSP JavaServer Pages
* JSF Java Server Faces
* JDO Java Data Objects
* JMS Java Message Service
* JAF JavaBeans Activation Framework
* JavaMail
* JNI Java Native Interface
* JNDI Java Naming and Directory Interface
* JSML Java Speech Grammar Specification
* JDBC Java Database Connectivity
* JAIN Java Integrated Networks
* JDMK Java Dynamic Management Kit
* Jini Java Intelligent Network Infrastructure
* Jiro Java Interface for Regular Objects
* JXTA sigla che sta per "juxtapose" (porre accanto)
* JavaSpaces
* JMI Java Metadata Interface
* JMX Java Management Extension
* JAXB Java Architecture for XML Binding
* JAXP Java API for XML Processing
* SAAJ SOAP with Attachments API for Java
* JAX-RPC Java API for XML-based RPC
* JAXR Java API for XML Registries
* Java 3D Java 3D API


Sebbene il linguaggio sia molto semplice da imparare, l'utilizzo delle architetture e delle specifiche richiede un tempo di apprendimento molto lungo.

Come programmare in Java

La programmazione in Java è una specializzazione della programmazione con linguaggi orientati agli oggetti.

Il linguaggio Java è un linguaggio orientato agli oggetti con una sintassi simile al linguaggio C e al linguaggio C++. Allo sviluppatore già esperto di programmazione OOP, alcuni punti dovrebbero essere evidenziati:

1. Java supporta solo la singola ereditarietà di classi, ma permette l'ereditarietà multipla di interfacce.
2. Java ha una libreria di classi molto grande (detta Java API) simile a SmallTalk, e supporta molte caratteristiche, dai contenitori di oggetti a complesse esigenze di sicurezza.
3. Java viene eseguito attraverso una Virtual Machine

L'apprendimento del linguaggio non è difficile. La vastità delle "librerie" (o più correttamente package) standard del linguaggio è tale da renderne praticamente impossibile la "padronanza"; per programmare in Java è dunque necessario avere a disposizione la documentazione delle API del linguaggio, disponibile in linea sul sito ufficiale.

Un buon punto di partenza per imparare Java è il tutorial di Sun.

Per sviluppare programmi in Java è teoricamente sufficiente un qualsiasi editor di testo; in pratica, se si vuole scrivere qualcosa di più del classico hello world, occorre un ambiente di sviluppo integrato. Esistono diversi IDE (Integrated Development Environment, ambiente di sviluppo integrato), alcuni gratuiti ed altri a pagamento.

Fra questi quello più premiato è IntelliJ IDEA vincitore fra l'altro del premio Best Java IDE 2005 rilasciato da JDJ. Si tratta di un IDE completo, molto funzionale ed in grado di garantire una padronanza completa del codice che si sta sviluppando.

Un ambiente di sviluppo per Java gratuito e soprattutto leggero è BlueJ, di chiara impostazione didattica, e disponibile per tutti i sistemi operativi al sito gratuito www.bluej.org/. Un altro ambiente per lo sviluppo in Java (e non solo) è Eclipse, donato alla comunità di sviluppatori da IBM e scaricabile dalla pagina www.eclipse.org. Eclipse è più avanzato e potente, è libero e disponibile per molti sistemi operativi; da notare che quest'ultimo è strutturato con un'architettura a plugin che permette l'aggiunta di ulteriori funzionalità semplicemente scaricando ed installando il relativo plugin (si veda ad esempio eclipse plugins).

La Sun stessa ha promosso lo sviluppo di un ambiente di sviluppo gratuito e open source chiamato NetBeans e lo mette a disposizione gratuitamente insieme a Sun Java Studio. Questi due ambienti sono scritti in Java e NetBeans è distribuito (opzionalmente) insieme alla macchina virtuale [1]. Come entità separata, NetBeans è scaricabile da netbeans.org. Uno degli IDE commerciali più diffusi è JBuilder prodotto dalla Borland.

GUIDA

Edited by Mefrio - 28/1/2010, 13:51
 
Top
zerbo2
view post Posted on 13/2/2011, 14:53




Molto interessante...ci voleva una bella guida.
 
Top
Dark volcano
view post Posted on 13/2/2011, 15:07




chissa che fine farà questo linguaggio con oracle
 
Top
2 replies since 3/1/2010, 23:47   195 views
  Share