Le basi della programmazione Java

Un linguaggio veloce, sicuro e affidabile.

Un po' di teoria...

Java è un linguaggio di programmazione ad alto livello, orientato agli oggetti e a tipizzazione statica, che si appoggia sull'omonima piattaforma software di esecuzione, specificamente progettato per essere il più possibile indipendente dalla piattaforma hardware di esecuzione.
Java è stato creato a partire da ricerche effettuate alla Stanford University agli inizi degli anni novanta. Nel 1992 nasce il linguaggio Oak (in italiano "quercia"), prodotto da Sun Microsystems e realizzato da un gruppo di esperti sviluppatori capitanati da James Gosling. Questo nome fu successivamente cambiato in Java per problemi di copyright: il linguaggio di programmazione Oak esisteva già. Per facilitare il passaggio a Java ai programmatori old-fashioned, legati in particolare a linguaggi come il C++, la sintassi di base (strutture di controllo, operatori ecc.) è stata mantenuta pressoché identica a quella del C++.

In un primo momento Sun decise di destinare questo nuovo prodotto alla creazione di applicazioni complesse per piccoli dispositivi elettronici; fu solo nel 1993 con l'esplosione di internet che Java iniziò a farsi notare come strumento per iniziare a programmare per internet. Contemporaneamente Netscape Corporation annunciò la scelta di dotare il suo allora omonimo e celeberrimo browser della Java Virtual Machine (JVM). Questo segna una rivoluzione nel mondo di Internet: grazie agli applet le pagine web diventarono interattive a livello client, ovvero le applicazioni vengono eseguite direttamente sulla macchina dell'utente di internet e non su un server remoto. Per esempio gli utenti poterono utilizzare giochi direttamente sulle pagine web e usufruire di chat dinamiche e interattive.

Uno dei principi fondamentali del linguaggio è espresso dal motto WORA (write once, run anywhere, ossia "scrivi una volta, esegui ovunque"): il codice compilato che viene eseguito su una piattaforma non deve essere ricompilato per essere eseguito su una piattaforma diversa; infatti il prodotto della compilazione è in un formato chiamato bytecode che può essere eseguito da una qualunque implementazione di un processore virtuale detto Java Virtual Machine; al 2014 Java risulta essere uno dei linguaggi di programmazione più usati al mondo, specialmente per applicazioni client-server, con un numero di sviluppatori stimato intorno ai 9 milioni. Java venne creato per soddisfare cinque obiettivi primari:

  • essere "semplice, orientato agli oggetti e familiare";
  • essere "robusto e sicuro";
  • essere indipendente dalla piattaforma;
  • contenere strumenti e librerie per il networking;
  • essere progettato per eseguire codice da sorgenti remote in modo sicuro.

Nel dettaglio...

Quando ci si affaccia per la prima volta ad un linguaggio di programmazione la prima cosa da cui iniziare è il classico Hello World!

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

Type system

Java è un linguaggio type safe, a tipizzazione statica, con un nominative type system, e dotato di manifest typing. In virtù di queste caratteristiche, viene generalmente considerato un linguaggio a tipizzazione forte. Il linguaggio distingue chiaramente i tipi primitivi che definiscono valori atomici dai tipi strutturati che definiscono strutture dati composte. I tipi primitivi sono detti anche tipi atomici e tipi base e sono definiti nelle specifiche di linguaggio: di ognuno sono noti l'insieme esatto dei valori ammessi e gli operatori supportati. I tipi strutturati sono anche tipi riferimento, cioè definiscono oggetti, e sono classi o interfacce. Tra queste, le classi degli array sono definite nelle specifiche di linguaggio; tutti gli altri tipi strutturati sono "definiti dall'utente" (user-defined), cioè dal programmatore. I tipi definiti dall'utente che sono legati al linguaggio per qualche motivo sono riuniti nel package java.lang e nei suoi sottopackage; il linguaggio stabilisce per alcuni di essi (Object, String, Iterable, e altri) delle regole sintattiche o semantiche aggiuntive. I tipi riferimento includono le classi per la gestione delle stringhe, gli array e le collezioni (liste, mappe, ecc.).

Tipo Descrizione Classe contenitore
Byte intero con segno a 8 bit byte
Short intero con segno a 16 bit short
int intero con segno a 32 bit integer
Long intero con segno a 64 bit long
Float virgola mobile a 32 bit singola precisione float
Double virgola mobile a 64 bit doppia precisione double
Char carattere singolo Unicode (intero senza segno a 16 bit) character
Boolean true o false boolean

Da tutto ciò consegue che i valori dei tipi base non sono oggetti. Tuttavia per ogni tipo base è definita una corrispondente classe, definita in gergo tipo wrapper o tipo contenitore, nel package java.lang, classe che permette di incapsulare dentro un oggetto un valore di tipo primitivo. Opportuni metodi della classe wrapper permettono di ottenere l'oggetto che incapsula un certo valore, e il valore incapsulato da un certo oggetto. Dalla versione 5.0 in poi sono supportati l'autoboxing e l'unboxing che permettono di convertire da tipo primitivo a corrispondente classe wrapper e viceversa. Il compilatore, "dietro le quinte", traduce la conversione in una opportuna invocazione a metodo sulla classe contenitore; quindi non si tratta di una vera conversione, ma di una sintassi comoda che "nasconde" la creazione di un oggetto della classe wrapper. Come molti altri linguaggi di programmazione anche Java possiede tra le strutture dati gli array (vedi array in Java).

Costanti

Valori costanti in Java si identificano con le parole chiave prefisse: static final seguita dal tipo, nome della costante e dal valore assegnato:

static final tipo_costante  = valore;

esempio:

static final String SALUTO = "Ciao";

Per convenzione i nomi delle costanti sono tutti maiuscoli.

Strutture di controllo

Sono supportate le seguenti strutture di controllo:
  • Strutture selettive: if ... else e switch, come in C
  • Strutture iterative:while e do ... while come in C; for mutuato dal C; for each che agisce su un array o collezione
  • La gestione delle eccezioni in Java viene gestita dalla sintassi try ... catch ... finally simile a quella del C++.
Al di là dei costrutti per la programmazione ad oggetti il resto della sintassi di Java è detta like C, cioè derivata o simile a quella del linguaggio C.

Orientamento agli oggetti

Java è un linguaggio object-oriented. L'idea che sta alla base della OOP è di rappresentare le entità reali o astratte che determinano le dinamiche del problema risolto dal software sotto forma di entità unitarie, dotate di specifiche d'uso e di funzionamento definite a priori. Queste entità sono chiamate oggetti. Le specifiche che definiscono le caratteristiche di queste unità e in base a cui le stesse vengono create o in gergo istanziate, sono chiamate classi.

Java tuttavia non è un linguaggio ad oggetti puro, ma solamente object oriented (orientato agli oggetti): per esempio i valori dei tipi primitivi non sono oggetti.

Nel linguaggio Java gli oggetti sono dotati di campi (definiti anche attributi o variabili di istanza o di esemplare) e di metodi. I metodi sono abitualmente usati per implementare agevolmente molti altri costrutti che alcuni altri linguaggi forniscono nativamente, come la gestione degli eventi (implementata attraverso i listener) o delle proprietà, implementate tramite gli accessor method e, più in generale, con oggetti JavaBeans.

In Java non esistono le funzioni: i blocchi di codice che "non appartengono a nessun oggetto" sono implementati come metodi statici di una certa classe e quindi sono sempre dei metodi. In Java si pone un forte accento sulla distinzione tra interfaccia e implementazione di una classe o oggetto: la prima è l'insieme delle specifiche pubbliche di cui gli utilizzatori di un certo oggetto possono servirsi, mentre la seconda è l'insieme delle strutture interne e delle istruzioni eseguibili che, nel complesso, adempiono a tali specifiche. Il termine interfaccia è usato anche in un'altra accezione, spiegata nel seguito.

Ereditarietà

È supportata l'ereditarietà tra tipi. Questo permette di stabilire la gerarchia delle classi che compongono un programma. Il linguaggio impone che a capo della gerarchia ci sia la nota classe java.lang.Object.

In Java non esiste ereditarietà multipla tra classi. Da un lato questo vincolo permette di avere una gerarchia di classi lineare e previene gli svantaggi introdotti dall'ereditarietà multipla. Dall'altro esso viene agevolmente superato facendo ricorso alle interfacce, ovvero a tipi analoghi alle classi, ma progettati apposta per essere estesi e soggetti a determinate restrizioni imposte dal linguaggio. Di conseguenza esse forniscono alcuni vantaggi dell'ereditarietà multipla, come la possibilità che uno stesso oggetto appartenga a tipi diversi tra loro, senza gli svantaggi come l'ambiguità introdotta dal fatto che una classe possa ereditare implementazioni diverse di uno stesso metodo.

Abbiamo visto una parte decisamente minima del linguaggio di programmazione JAVA. Diventa veramente facile dilungarsi in lunghe e complesse spiegazioni, pertanto conviene affrontare le cose di volta in volta. Spero di aver fatto capire quanto possa essere potente ed utile questo linguaggio ausiliandolo alle pagine web, i software e le applicazioni mobile. Stesso discorso anche qui, invito chiunque ad approfondirne di più perchè c'è ancora moltissimo da scoprire ed imparare.

A presto, GG-CREATOR.

Si ringrazia Wikipedia.

« Articolo successivo:
I contenuti per il web
» Articolo precedente:
Le basi della programmazione Python