Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Programmazione in Java - Parte 4 - Classi e Librerie, Schemi e mappe concettuali di Programmazione Java

ARGOMENTI: • Il Formato JAR • Risoluzione dei problemi più comuni • Stringhe di caratteri • Concatenazione di Stringhe • Confronto tra Stringhe • Elaborazioni di Stringhe • Caratteri di Escape • Le Stringhe come Oggetti Immutabili • Passaggio dei Parametri (tipi primitivi vs oggetti) • Memorizzare una Data (classe Date) • SimpleDateFormat • classe Calendar • Confronto tra Date (compareTo, equals, before, after) • Librerie Standard di Java (API e Package) • Come funzionano: import e java.lang • Documentazione Java API • Risoluzione di Conflitti tra Librerie • Input e Output in Java: il concetto di Stream • Input da tastiera: la classe Scanner • Output a video: System.out e sequenze di escape • Input da file: Scanner + File • Output su file: PrintWriter • Classe Math • Esponenziale – Math.pow() • Valore Assoluto – Math.abs() • Minimo e Massimo – Math.min() / Math.max() • Arrotondamento – Math.round(), Math.floor(), Math.ceil() • Radice Quadrata – Math.sqrt() • Altri metodi utili

Tipologia: Schemi e mappe concettuali

2025/2026

In vendita dal 17/04/2026

airruh
airruh 🇮🇹

4.7

(17)

73 documenti

1 / 49

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Le Librerie Standard di Java
API, Package, Documentazione e Risoluzione dei Conflitti
Argomenti trattati
• Cosa sono le Librerie Standard di Java (API e Package)
• Come funzionano: import e java.lang
• Documentazione Java API: struttura e navigazione
• Risoluzione di Conflitti tra Librerie con lo stesso nome di classe
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31

Anteprima parziale del testo

Scarica Programmazione in Java - Parte 4 - Classi e Librerie e più Schemi e mappe concettuali in PDF di Programmazione Java solo su Docsity!

Le Librerie Standard di Java

API, Package, Documentazione e Risoluzione dei Conflitti

Argomenti trattati

  • Cosa sono le Librerie Standard di Java (API e Package)
  • Come funzionano: import e java.lang
  • Documentazione Java API: struttura e navigazione
  • Risoluzione di Conflitti tra Librerie con lo stesso nome di classe

1. Cosa sono le Librerie Standard di Java

Java include una vastissima raccolta di classi già pronte all'uso, nota come API (Application Programming Interface). Questa libreria standard è uno dei principali punti di forza del linguaggio: fornisce strumenti per affrontare le più disparate esigenze di programmazione senza dover reinventare la ruota.

I Package: cartelle organizzative

Le classi della libreria standard sono organizzate in package (e sotto-package), che funzionano come cartelle che raggruppano classi logicamente correlate. I package assolvono a tre funzioni fondamentali:

  • Classificazione: raggruppano le classi per campo di utilizzo, rendendo più semplice trovarle.
  • Prevenzione dei conflitti: permettono l'esistenza di classi con lo stesso nome in package diversi senza ambiguità.
  • Controllo dell'accesso: definiscono la visibilità delle classi.

I package più importanti della libreria standard

Package Contenuto Classi di esempio

java.lang Classi^ fondamentali^ del^ linguaggio (importate automaticamente)

String, System, Math, Object

java.util (^) Classi di utilità generale Date,^ Calendar, Scanner, ArrayList

java.io (^) Input/Output su file e stream File,^ FileReader, BufferedReader

java.net (^) Connessioni di rete Socket,^ URL, HttpURLConnection

java.text (^) Formattazione di testo e numeri SimpleDateFormat, NumberFormat

java.awt / javax.swing Interfacce grafiche desktop^

JFrame, JButton, JTextField

2. Come Funzionano le Librerie Standard

Per poter usare una classe di libreria è necessario prima importarla nel proprio file sorgente, tramite la parola chiave import in cima al file.

Sintassi dell'import

Esistono due modalità:

// Importazione di una singola classe import java.util.Date;

// Importazione di tutte le classi di un package (wildcard ) import java.util.;

Una volta importata, una classe di libreria si usa esattamente come una classe creata da noi: nessuna differenza sintattica o operativa.

Il package java.lang: l'eccezione alla regola

Classi fondamentali come String , System , Math e Object vengono usate in ogni programma Java senza mai scrivere un import esplicito. Il motivo è che appartengono al package java.lang , che la JVM importa automaticamente in ogni file sorgente.

Regola: java.lang è il solo package importato automaticamente dalla JVM. Tutti gli altri package — incluso java.util — richiedono un import esplicito.

3. Documentazione Java API

La documentazione ufficiale Java (Javadoc) descrive in modo completo tutti i package, le classi e i metodi disponibili nella libreria standard. È la risorsa di riferimento per ogni programmatore Java.

Struttura della documentazione

Le pagine di documentazione sono organizzate in tre aree principali:

Area Contenuto

Pannello in alto a sinistra Elenco di tutti i package disponibili nella libreria standard.

Pannello in basso a sinistra

Elenco delle classi contenute nel package selezionato.

Pannello centrale Descrizione dettagliata del package o della classe selezionata.

Come cercare una classe nella documentazione

1 Fare clic sul nome del package nel pannello in alto a sinistra.

Nel pannello in basso a sinistra compariranno tutte le classi di quel package. Fare clic sul nome della classe cercata.

Nel pannello centrale apparirà la documentazione completa della classe selezionata.

Elementi presenti nella pagina di ogni classe

Sezione Descrizione

  1. Descrizione della classe

Nome, package di appartenenza, gerarchia delle classi, modalità di utilizzo e implementazione.

  1. Field Summary Elenco degli attributi (campi) della classe con tipo, visibilità e breve descrizione.

  2. Method Summary Elenco dei metodi con tipo di ritorno e descrizione sintetica.

4. Risoluzione di Conflitti tra Librerie

Può accadere che classi diverse abbiano lo stesso nome ma rappresentino concetti completamente diversi. Ad esempio, una classe Articolo potrebbe esistere sia in un package negozio sia in un package giornale. In Java questo non è un problema: i package permettono a entrambe le classi di coesistere.

Il problema: ambiguità al momento dell'uso

Se si importano entrambi i package con il wildcard ***** e si prova poi a istanziare un oggetto della classe ambigua, il compilatore genera un errore perché non sa quale delle due versioni usare:

import sport.; import veicoli.;**

// ERRORE DI COMPILAZIONE: The type Golf is ambiguous Golf g = new Golf();

Errore tipico: importare due package con il wildcard (*) che contengono classi con lo stesso nome produce un errore di ambiguità al momento dell'istanziazione.

Soluzione 1 — Usare il percorso completo (fully qualified name)

La soluzione più semplice è non usare import e specificare sempre il percorso completo della classe. In questo caso gli import non sono necessari:

// Nessun import necessario sport.Golf golf1 = new sport.Golf(); veicoli.Golf golf2 = new veicoli.Golf();

// Funziona anche per i metodi statici sport.Golf.selezionaMazza(); veicoli.Golf.getPotenza();

Soluzione 2 — Importare una sola classe, usare il percorso per l'altra

Se una delle due classi è usata più frequentemente, si può importarla con il nome semplice e riferirsi all'altra con il percorso completo:

import sport.Golf; // importata: si usa con nome semplice

// La classe importata si usa normalmente Golf golf1 = new Golf();

// L'altra si riferisce con percorso completo veicoli.Golf golf2 = new veicoli.Golf();

Riepilogo

Concetto Spiegazione sintetica

API / Libreria standard Raccolta di classi già implementate, pronte all'uso, organizzate in package.

Package Raggruppamenti logici di classi correlate; equivalenti a cartelle nel filesystem.

import Parola chiave per rendere disponibile una classe di libreria nel file corrente.

java.lang Unico package importato automaticamente; contiene String, System, Math, ecc.

Javadoc Documentazione ufficiale navigabile per package, classe e metodo.

Conflitto di nomi Risolto usando il fully qualified name (percorso.Package.Classe) oppure importando una sola delle classi ambigue.

Una variabile String non è una variabile semplice come int ; è un oggetto appartenente alla classe String. Gli oggetti possiedono metodi e dati.

I metodi della classe String consentono di elaborare i dati stringa. La maggior parte restituisce un valore. Per esempio, il metodo length() restituisce il numero di caratteri:

String saluto = "Ciao"; int n = saluto.length(); // restituisce 4

2. Concatenazione di Stringhe

L'operatore di concatenazione

Due stringhe possono essere unite per formare una stringa più lunga. Questa operazione è detta concatenazione e in Java viene effettuata con l'operatore +. Quando applicato alle stringhe, questo operatore è chiamato operatore di concatenamento.

Esempio: concatenare due stringhe

String nome = "Mario"; String cognome = "Rossi"; String nomeCompleto = nome + cognome; // "MarioRossi" Nessuno spazio viene aggiunto automaticamente. Per separare con uno spazio:

String nomeCompleto = nome + " " + cognome; // "Mario Rossi"

Concatenazione con altri tipi

L'operatore + può concatenare una stringa con qualsiasi altro tipo di oggetto; il risultato è sempre una String. Java converte automaticamente il valore nell'equivalente stringa:

String risposta = "La risposta è " + 54; // Java converte 54 in "54", risultato: "La risposta è 54"

3. Confronto tra Stringhe

Per confrontare due stringhe si possono utilizzare tre metodi diversi, in base alle esigenze.

Metodo equals()

Controlla se due stringhe sono esattamente identiche. Restituisce true se sono uguali, false altrimenti:

String strA = "Ciao Mondo"; String strB = "Ciao Mondo"; boolean confronto = strA.equals(strB); // true

Metodo equalsIgnoreCase()

Il metodo equals() è sensibile alle maiuscole/minuscole. Se le stringhe sono uguali ma hanno case diverso, restituisce false:

String strA = "Ciao Mondo"; String strB = "ciao mondo"; boolean c1 = strA.equals(strB); // false boolean c2 = strA.equalsIgnoreCase(strB); // true Il metodo equalsIgnoreCase() ignora la distinzione tra maiuscole e minuscole.

Metodo compareTo()

Permette di stabilire l'ordine alfabetico tra due stringhe. Restituisce un valore intero:

  • valore negativo : la stringa corrente viene prima dell'altra alfabeticamente
  • valore 0 : le due stringhe sono uguali
  • valore positivo : la stringa corrente viene dopo l'altra alfabeticamente String strA = "Albero"; String strB = "Fiore"; int confronto = strA.compareTo(strB); // valore negativo Il valore è negativo perché "Albero" precede "Fiore" nell'ordine alfabetico. 4. Elaborazioni di Stringhe

Vediamo i principali metodi per elaborare stringhe: estrarre sottostringhe, cercarle, sostituirle, convertire maiuscolo/minuscolo e rimuovere spazi.

Estrarre una sottostringa: substring()

Il metodo substring() estrae una porzione della stringa. Accetta uno o due parametri (gli indici partono da 0):

  • substring(inizio) : dalla posizione inizio fino alla fine
  • substring(inizio, fine) : dalla posizione inizio alla posizione fine (esclusa) String str = "Ciao come stai?"; // indici: C=0, i=1, a=2, o=3, ' '=4, c= ... String s1 = str.substring(0, 5); // "Ciao " (indici 0-4) String s2 = str.substring(5); // "come stai?"

Cercare una sottostringa: indexOf() e lastIndexOf()

  • indexOf(str) : indice della prima occorrenza. Restituisce -1 se assente.
  • lastIndexOf(str) : indice dell'ultima occorrenza. Restituisce -1 se assente. String str = "Ciao come stai? Ma come stai?"; int i1 = str.indexOf("come stai"); // 5 (prima occorrenza)

Tabella delle sequenze di escape

Ecco i principali caratteri speciali che devono essere rappresentati con una sequenza di escape:

Sequenza Descrizione

' Apice singolo (delimitatore di char in Java)

" Doppio apice (delimitatore di String in Java)

\r Ritorno carrello (spesso accoppiato con \n)

\n Nuova riga (daccapo)

\t Tab orizzontale

\ Backslash letterale

Esempi pratici

Il carattere \n provoca un'andata a capo nella posizione in cui compare:

System.out.println("La vita è \nBELLA"); Produce l'output:

La vita è BELLA

Per includere un backslash letterale occorrono due backslash. La stringa "nato\a" visualizza:

nato\a

Ogni sequenza di escape rappresenta un solo carattere , anche se è scritta con due simboli. Questo è fondamentale per calcolare correttamente la lunghezza di una stringa e gestire gli indici.

Riepilogo dei metodi della classe String

Ecco una tabella riepilogativa dei principali metodi trattati in questo modulo:

Metodo Descrizione length() Numero di caratteri della stringa substring(inizio) Sottostringa dall'indice inizio fino alla fine substring(inizio, fine) Sottostringa da inizio fino a fine (escluso) indexOf(str) Indice della prima occorrenza di str (-1 se assente) lastIndexOf(str) Indice dell'ultima occorrenza di str (-1 se assente)

equals(str) true se le due stringhe sono identiche

equalsIgnoreCase(str) true ignorando maiuscole/minuscole

compareTo(str) Confronto alfabetico (negativo, 0 o positivo)

replace(old, new) Sostituisce tutte le occorrenze di old con new

replaceFirst(old, new) Sostituisce solo la prima occorrenza

toUpperCase() Converte tutte le lettere in maiuscolo

toLowerCase() Converte tutte le lettere in minuscolo

trim() Rimuove spazi iniziali e finali

charAt(indice) Carattere alla posizione indicata

1. Le Stringhe come Oggetti Immutabili

In Java le stringhe sono oggetti immutabili. Un oggetto si definisce immutabile se il suo stato — e quindi il suo valore — non può essere modificato dopo che è stato creato. Di conseguenza, gli oggetti di tipo String non possono essere alterati una volta istanziati.

Cosa significa concretamente?

Consideriamo il seguente frammento di codice:

String saluto = "Ciao"; saluto = "Hello";

Intuitivamente sembrerebbe che la stringa "Ciao" venga modificata e sovrascritta con "Hello". In realtà non è così. Ecco cosa accade internamente:

  • Alla prima istruzione, la JVM crea in memoria un oggetto String con valore "Ciao" e la variabile saluto punta a quell'oggetto.
  • Alla seconda istruzione, la JVM crea un nuovo oggetto String con valore "Hello" e sposta il riferimento della variabile saluto verso di esso.
  • L'oggetto originale "Ciao" rimane in memoria invariato (finché il garbage collector non lo elimina, non essendoci più riferimenti attivi).

Regola fondamentale: nessun metodo della classe String modifica l'oggetto su cui è chiamato. Ogni operazione (substring, toUpperCase, replace, ecc.) restituisce SEMPRE un nuovo oggetto String, lasciando l'originale intatto.

Un errore classico dovuto all'immutabilità

L'immutabilità è spesso fonte di bug subdoli. Osserva il codice seguente:

String testo = "Arcobaleno"; testo.substring(0, 3); // risultato IGNORATO System.out.println(testo); // stampa: Arcobaleno

Attenzione: l'output è "Arcobaleno" perché il risultato di substring() non viene assegnato a nessuna variabile. Il metodo produce un nuovo oggetto "Arc", ma tale oggetto viene immediatamente scartato.

La versione corretta è:

String testo = "Arcobaleno"; testo = testo.substring(0, 3); // riassegna il risultato System.out.println(testo); // stampa: Arc

In questo caso la variabile testo abbandona il riferimento all'oggetto "Arcobaleno" e punta al nuovo oggetto "Arc" creato da substring(). L'oggetto precedente verrà eliminato dal garbage collector.

L'output è 18 perché il metodo cambiaValore() riceve una copia del valore intero. La riga var = 45 modifica solo la copia locale, senza alcun effetto sulla variabile originale nel main.

3. Il Comportamento Anomalo delle Stringhe nei Metodi

Le stringhe sono oggetti, quindi ci si aspetterebbe che — come tutti gli oggetti — le modifiche effettuate all'interno di un metodo siano visibili anche nel chiamante. In realtà, a causa della loro immutabilità , le stringhe si comportano diversamente.

Il paradosso della stringa nel metodo

Consideriamo lo stesso esempio precedente, ma con una variabile di tipo String invece di int :

public class Parametri { public static void main(String[] args) { String var = "Ciao"; cambiaValore(var); System.out.println(var); // stampa: Ciao } public static void cambiaValore(String var) { var = "Hello"; // crea un nuovo oggetto, non modifica l'originale } }

Risultato sorprendente: l'output è "Ciao", NON "Hello"! Anche se String è un oggetto (e ci aspetteremmo un passaggio per riferimento), la stringa originale non viene modificata.

Spiegazione dettagliata

Ecco perché avviene questo comportamento, passo per passo:

Nel main , la variabile var è un riferimento che punta all'oggetto String "Ciao" in memoria.

Quando si chiama cambiaValore(var) , Java passa al metodo una copia del riferimento. Ora esistono due riferimenti distinti che puntano entrambi al medesimo oggetto "Ciao".

All'interno di cambiaValore() , l'istruzione var = "Hello" crea un nuovo oggetto String con valore "Hello" e fa puntare la copia locale del riferimento a questo nuovo oggetto.

Il riferimento originale nel main rimane invariato: continua a puntare all'oggetto "Ciao". Nulla di ciò che è accaduto dentro il metodo ha toccato quell'oggetto.