- Comprendere la struttura sintattica di base di un programma Java
- Analizzare il ruolo della Java Virtual Machine nell'esecuzione del codice
- Utilizzare funzioni di output per interagire con l'utente via console
- Configurare e testare il primo applicativo in un ambiente IDE cloud
Java è un linguaggio fortemente tipizzato e orientato agli oggetti. Ogni applicazione Java deve essere strutturata internamente a una classe. Vediamo il codice sorgente minimale per l'avvio di un applicativo, il celebre Hello World:
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Analisi strutturale dei componenti sintattici:
- public class Main: Dichiarazione della classe principale. In Java, tutto il codice eseguibile deve risiedere all'interno di un blocco classe.
- public static void main: Rappresenta il metodo di ingresso (entry-point) del programma. Senza questa esatta firma, la Java Virtual Machine non può avviare l'applicazione.
- System.out.println: Chiamata al metodo di sistema per inviare una stringa di testo allo stream di output standard (la console) con un ritorno a capo automatico.
L'architettura di esecuzione:
A differenza di linguaggi puramente compilati come il C++, Java adotta un approccio ibrido. Il codice sorgente non viene convertito direttamente in codice macchina specifico per un processore, ma viene tradotto in un formato intermedio standardizzato chiamato Bytecode. Sarà compito della JVM (Java Virtual Machine) installata sull'host interpretare ed eseguire il bytecode, garantendo la portabilità del software.
LABORATORIO
Primo Programma
In questa fase passeremo dalla semplice stampa a video alla ricezione di dati dall'esterno.
- OnlineGDB.com (Selezionare "Java" nel menu Language)
1 Compilazione ed esecuzione
Aprire l'IDE cloud OnlineGDB e impostare il selettore del linguaggio su Java. Sostituire il codice predefinito con l'algoritmo di "Hello World" precedentemente analizzato. Premere il pulsante Run. La console inferiore mostrerà l'output testuale generato dall'esecuzione del bytecode all'interno della JVM remota.
2 Sviluppo di un flusso Interattivo
Per rendere l'applicazione dinamica, introduciamo l'acquisizione dei dati provenienti dalla periferica di input. Questa operazione richiede l'importazione della classe utility Scanner dal pacchetto standard del JDK.
import java.util.Scanner; // Importazione della classe per la gestione dell'input
public class Main {
public static void main(String[] args) {
// Istanza dell'oggetto Scanner collegato allo stream di input standard (System.in)
Scanner lettore = new Scanner(System.in);
System.out.print("Come ti chiami? ");
String nome = lettore.nextLine(); // Lettura dell'intera riga inserita dall'utente
System.out.println("Benvenuto nel laboratorio di Informatica, " + nome + "!");
lettore.close(); // Chiusura formale dello stream per prevenire memory leak
}
}
cin in C++). È necessario creare esplicitamente un oggetto (tramite l'operatore new) preposto alla tokenizzazione dei flussi di byte in ingresso.
1. Gestione dei flussi di Output
Il canale di output System.out espone due metodi principali per la scrittura di informazioni nel terminale:
| Metodo | Comportamento Operativo | Sintassi d'Esempio |
|---|---|---|
| print() | Invia il testo alla console mantenendo il cursore sulla medesima riga, consentendo input consecutivi. | System.out.print("Voto: "); |
| println() | Invia il testo alla console e appone un carattere di fine riga (newline), spostando il cursore a capo. | System.out.println("Fine Programma"); |
2. Gestione dei flussi di Input
L'utilizzo della classe Scanner per mappare e catturare i flussi dalla tastiera si articola in tre fasi sequenziali stabili:
- Importazione: Dichiarazione esterna alla classe tramite
import java.util.Scanner;. - Istanziazione: Allocazione dell'oggetto di gestione:
Scanner tastiera = new Scanner(System.in);. - Estrazione (Parsing): Invocazione del metodo coerente con il tipo di dato primitivo atteso dal flusso.
| Tipo di dato | Metodo di Lettura dedicato | Implementazione Tipica nel Codice |
|---|---|---|
| Intero (int) | nextInt() |
int anni = tastiera.nextInt(); |
| Decimale (double) | nextDouble() |
double prezzo = tastiera.nextDouble(); |
| Stringa (Parola singola) | next() |
String nome = tastiera.next(); |
| Stringa (Riga completa) | nextLine() |
String frase = tastiera.nextLine(); |
3 Esercizio di Consolidamento: Calcolo Spesa Energetica
Scenario di Laboratorio: Un tecnico deve calcolare il costo del consumo elettrico di un server in laboratorio. Scrivere un programma Java strutturato che implementi le seguenti specifiche:
- Acquisisca in input il consumo espresso in kWh (tipo double, es: 150.5).
- Acquisisca in input il costo unitario per singola unità di kWh (tipo double, es: 0.22).
- Elabori il costo totale moltiplicando i valori inseriti.
- Visualizzi sul terminale la stringa di output formattata:
"Il costo totale dell'energia è: [risultato] Euro".
In sintesi
Argomenti: concetti principali, riepilogo, competenze
- Ogni applicazione Java è vincolata a risiedere all'interno di una classe e richiede un metodo entry-point
public static void main. - Il codice sorgente Java non produce eseguibili nativi, ma viene tradotto dal compilatore in bytecode indipendente dall'hardware.
- I flussi di output standard verso il terminale sono gestiti dai metodi di istanza
print()eprintln(). - L'acquisizione dei flussi di input standard da console richiede l'importazione ed istanziazione esplicita della classe
java.util.Scanner.
- A decodificare la struttura sintattica e i modificatori di accesso del punto di ingresso principale di un software Java.
- La differenza operativa tra l'interruzione di riga fornita da
println()rispetto al posizionamento del cursore diprint(). - L'applicazione della parola chiave
newper allocare in memoria l'oggetto di scansione dello streamSystem.in. - La manipolazione e l'estrazione di dati primitivi e testuali tramite i metodi tokenizzatori dello Scanner.