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


Struttura e Gestione di un Programma Java: Package, Classi, Errori e Thread, Appunti di Fondamenti di informatica

Una panoramica dettagliata sulla struttura di un programma Java, dal package al sistema di gestione degli errori e delle eccezioni, passando per la programmazione concorrente e la creazione di thread. Vengono spiegati concetti come il package, la compilation unit, il linguaggio Java in dettaglio, la visibilità e l'importazione di classi, il gestione degli errori, le eccezioni, i processi e i thread, la preemption e la cooperazione, la creazione di nuovi thread e la sincronizzazione.

Tipologia: Appunti

2020/2021

Caricato il 04/06/2021

davide1825
davide1825 🇮🇹

5

(2)

3 documenti

1 / 71

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
INGEGNERIA DEL SOFTWARE
JAVA
Avvertenza: gli appunti si basano sul corso di
Ingegneria del Software tenuto dal prof. Picco
della facoltà di Ingegneria del Politecnico di
Milano (che ringrazio per aver acconsentito alla
pubblicazione). Essendo stati integrati da me con
appunti presi a lezione, il suddetto docente non ha
alcuna responsabilità su eventuali errori, che vi
sarei grato mi segnalaste in modo da poterli
correggere.
web: http://www.morpheusweb.it
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
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47

Anteprima parziale del testo

Scarica Struttura e Gestione di un Programma Java: Package, Classi, Errori e Thread e più Appunti in PDF di Fondamenti di informatica solo su Docsity!

INGEGNERIA DEL SOFTWARE

JAVA

Avvertenza: gli appunti si basano sul corso di

Ingegneria del Software tenuto dal prof. Picco

della facoltà di Ingegneria del Politecnico di

Milano (che ringrazio per aver acconsentito alla

pubblicazione). Essendo stati integrati da me con

appunti presi a lezione, il suddetto docente non ha

alcuna responsabilità su eventuali errori, che vi

sarei grato mi segnalaste in modo da poterli

correggere.

e-mail: [email protected]

web: http://www.morpheusweb.it

  • L’AMBIENTE JAVA
  • NOZIONI PRELIMINARI..................................................................................
    • IL PRIMO PROGRAMMA..........................................................................................................
      • COMPILAZIONE ED ESECUZIONE........................................................................................
    • LA STRUTTURA DI UN PROGRAMMA JAVA......................................................................
    • JAVA - IL PRIMO PROGRAMMA GRAFICO........................................................................
    • LA STRUTTURA DI UN PROGRAMMA JAVA......................................................................
    • IL LINGUAGGIO JAVA IN DETTAGLIO
  • TIPI PRIMITIVI E VARIABILI.......................................................................
    • DICHIARAZIONE DI VARIABILI
    • I TIPI DI RIFERIMENTO
    • TIPI ARRAY................................................................................................................................
      • TIPI ARRAY: DICHIARAZIONE E INIZIALIZZAZIONE
      • TIPI ARRAY: ALLOCAZIONE DI MEMORIA
      • ARRAY DI OGGETTI: DEFINIZIONE...................................................................................
      • ARRAY DI OGGETTI VS. ARRAY DI TIPI BASE...............................................................
  • DEFINIZIONE DI UNA NUOVA CLASSE......................................................
    • CLASSI DEFINITE A LIVELLO PUBLIC O PACKAGE
    • DEFINIZIONE DI ATTRIBUTI
    • DEFINIZIONE DI METODI......................................................................................................
  • CLASSI E OGGETTI........................................................................................
    • ACCESSO AD ATTRIBUTI E METODI DI UN OGGETTO
    • ACCESSO AD ATTRIBUTI E METODI LOCALI
    • VISIBILITÀ DEI NOMI.............................................................................................................
    • OVERLOADING DI METODI..................................................................................................
    • CREAZIONE E DISTRUZIONE DEGLI OGGETTI
    • CLASSI E COSTRUTTORI.......................................................................................................
      • COSTRUTTORI: ESEMPIO
      • ANCORA SUI COSTRUTTORI...............................................................................................
  • METODI E ATTRIBUTI DI CLASSE..............................................................
    • METODI E ATTRIBUTI DI CLASSE: VINCOLI
    • METODI E ATTRIBUTI DI CLASSE: ESEMPIO
    • ATTRIBUTI COSTANTI
  • LA GERARCHIA DI EREDITARIETÀ...........................................................
    • LA CLASSE OBJECT
    • OVERRIDING.............................................................................................................................
    • LA PSEUDO VARIABILE SUPER
    • EREDITARIETÀ E COSTRUTTORI: RIASSUNTO
    • INFORMATION HIDING IN JAVA.........................................................................................
    • CLASSI E METODI ASTRATTI
      • CLASSI E METODI ASTRATTI: ESEMPIO
    • CLASSI E METODI FINAL
    • EREDITARIETÀ ED ARRAY...................................................................................................
    • INTERFACCE
      • I LIMITI DELL’EREDITARIETÀ SEMPLICE
      • I PROBLEMI DELL’EREDITARIETÀ MULTIPLA
      • LA SOLUZIONE DI JAVA: LE INTERFACCE......................................................................
      • INTERFACCE ED EREDITARIETÀ.......................................................................................
      • LA GERARCHIA DI IMPLEMENTAZIONE
    • POLIMORFISMO.......................................................................................................................
      • POLIMORFISMO: ESEMPIO
      • POLIMORFISMO ED INTERFACCE
      • POLIMORFISMO: TIPO STATICO E TIPO DINAMICO......................................................
      • POLIMORFISMO E BINDING DINAMICO...........................................................................
      • ESEMPIO FINALE E CONCLUSIONI....................................................................................
      • TAGGING INTERFACES
      • CONSTANTS
    • CONVERSIONI FORZATE TRA TIPI RIFERIMENTO: CASTING
    • PACKAGE ED INFORMATION HIDING
      • IL PACKAGE JAVA.LANG.....................................................................................................
  • GESTIONE DEGLI ERRORI...........................................................................
    • LE ECCEZIONI IN JAVA
      • ESEMPIO...................................................................................................................................
      • ESEMPIO: PROPAGAZIONE DEGLI ERRORI
    • THROW........................................................................................................................................
    • COME DELIMITARE E GESTIRE L’ECCEZIONE
    • LA PROPAGAZIONE DEGLI ERRORI
    • GESTIRE L’ERRORE O PROPAGARLO?
    • LA CLAUSOLA FINALLY........................................................................................................
    • ECCEZIONI ED EREDITARIETA’
    • SPECIFICARE PIU’ GESTORI................................................................................................
    • ECCEZIONI E POLIMORFISMO
    • THROWABLE E SOTTOCLASSI
      • RUNTIME EXCEPTION
    • FORNIRE INFORMAZIONI CIRCA L’ECCEZIONE..........................................................
    • ECCEZIONI E DEBUGGING
    • SUGGERIMENTI PRATICI......................................................................................................
    • ESEMPIO FINALE
  • LA PROGRAMMAZIONE CONCORRENTE.................................................
    • PROCESSI E THREAD
    • PREEMPTION VS COOPERAZIONE
  • LA PROGRAMMAZIONE CONCORRENTE IN JAVA.................................
  • CREAZIONE DI NUOVI THREAD
    • THREAD: ESEMPIO
    • CREAZIONE DI NUOVI THREAD: UN PROBLEMA..........................................................
  • CREAZIONE DI NUOVI THREAD: UN METODO ALTERNATIVO
    • NON DETERMINISMO
    • NON DETERMINISMO E RISORSE CONDIVISE................................................................
  • MONITOR....................................................................................................................................
    • ACCESSO AL MONITOR........................................................................................................
    • BLOCCO SYNCHRONIZED
  • SINCRONIZZARE ATTIVITA’ CONCORRENTI
  • SOSPENDERE UN THREAD
  • RISVEGLIARE UN THREAD
  • PRODUTTORE-CONSUMATORE IN JAVA.........................................................................
  • CICLO DI VITA DI UN THREAD
    • SPIN LOCK...............................................................................................................................
  • SAFETY E LIVENESS
  • DEADLOCK E STARVATION
  • TERMINARE UN THREAD
    • TERMINARE UN THREAD IN MAINERA SICURA............................................................
  • INTERROMPERE UN THREAD..............................................................................................
  • ALTRE PRIMITIVE PER LA GESTIONE DEI THREAD
    • JOIN
    • CURRENTTHREAD.................................................................................................................
  • GESTIONE DELLA PRIORITA’..............................................................................................
  • GRUPPI DI THREAD
  • CONSIDERAZIONI FINALI

L’AMBIENTE JAVA

Java è in parte compilato ed in parte interpretato.

All’inizio il sorgente viene compilato del COMPILATORE tramite il comando:

javac programma.class ,

che genera un file chiamato programma.class contenente il byte code. E’ la traduzione del programma in un linguaggio intermedio

Il byte code può essere interpretato su qualsiasi piattaforma che supporta Java tramite il comando:

java programma

programma.java

javac programma.java

programma.class

NOZIONI PRELIMINARI

IL PRIMO PROGRAMMA

public class HelloWorld { public static void main(String args[]){ System.out.println(“Hello world!”); } }

Il main non è una funzione, è un metodo. Quando eseguo un programma java, devo lanciare il programma che contiene il metodo main.

Nota: Per il debug, si consiglia di mettere un metodo main in ogni classe così da poter fare il testing delle unità.

public class HelloWorld {

specifico il metodo di accesso alla classe

public static void main(String args[]){

può esserci o meno davanti ad un metodo a attributo, indica che sono metodi o attributi di classe.

Per gli attributi: ne esiste uno per ogni classe, non uno per ogni oggetto (potrebbe essere ad esempio usato per implementare le variabili globali), un esempio classico è dato dall’implementazione di un contatore di oggetti allocati.

I metodi static possono essere usati per modificare attributi static oppure anche per realizzare delle librerie di funzioni.

COMPILAZIONE ED ESECUZIONE

c:\classes>javac HelloWorld.java c:\classes>java HelloWorld HelloWorld! c:\classes>

LA STRUTTURA DI UN PROGRAMMA JAVA

Un programma Java è organizzato come un insieme di classi Classi diverse possono essere raggruppate all’interno della stessa “Compilation unit” che hanno un estensione .java

Il programma principale è rappresentato da un metodo speciale (main) della classe il cui nome coincide con il nome del programma

JAVA - IL PRIMO PROGRAMMA GRAFICO

import java.awt.; package examples, class HelloWorldWindow { public static void main(String args[]) { Frame f=new Frame("HelloWorldWindow"); f.add(new Label("HelloWorld!",Label.CENTER),"Center"); f.pack(); f.setVisible(true); } }*

import : importa caratteristiche particolari di un particolare package.

package examples : il programma è dichiarato nel package examples. Il file deve essere nella directory examples. lo compilo li e lo eseguo (oppure in una dir esterna, ma riferendomi al nome comple to della classe che è: examples.HelloWorld)

Un package definisce uno spazio dei nomi; consente di avere un meccanismo per strutturare lo spazio dei nomi (posso ad esempio definire due classi con lo stesso nome in package diversi). Vincola inoltre il modo in cui i file sono memorizzati nel file system.

I package possono essere annidati: ad esempio

myProg

examples lectures

accederei ad una classe di examples con la notazione puntata: myProg.examples.NomeClasse

COMPILIAZIONE ED ESECUZIONE

c:\classes>cd examples c:\classes\examples>javac HelloWorldWindow.java c:\classes\examples>cd .. c:\classes>java examples.HelloWorldWindow c:\classes>

TIPI PRIMITIVI E VARIABILI

Tipi numerici:

  • byte: 8 bit
  • short: 16 bit
  • int: 32 bit
  • long: 64 bit
  • float: 32 bit
  • double: 64 bit

Altri tipi:

  • boolean: true o false
  • char: 16 bit, carattere Unicode

I tipi primitivi sono allocati nello stack (sempre), mentre in C++ li potevo allocare nello heap mediante i puntatori.

Per allocare i tipi primitivi nello heap si possono usare i wrapper, che mi permettono di avvolgere all’interno di una classe un tipo primitivo.

DICHIARAZIONE DI VARIABILI

byte un_byte; int a, b=3, c; char c=‘h’, car; boolean trovato=false;

I TIPI DI RIFERIMENTO

  • Tipi array
  • Tipi definiti dall’utente

o Classi

o Interfacce

I tipi oggetto sono sempre allocati nello heap (mentre in C++ se li definivo come tipi normali, venivano allocati sullo stack e venivano allocati nello heap solo con la new )

TIPI ARRAY

Anche gli array sono considerati tipi riferimento e sono allocati nello heap.

Dato un tipo T (predefinito o definito dall’utente) un array di T è definito come: T[]

Similmente sono dichiarati gli array multidimensionali: T[][] T[][][]

Esempi: int[] //array di interi float[][] //matrice di float Persona[] //array di elementi riferimento

TIPI ARRAY: DICHIARAZIONE E INIZIALIZZAZIONE

Dichiarazione: int[] ai1, ai2; float[] af1; double ad[]; Persona[][] ap;

Inizializzazione: int[] ai={1,2,3}; double[][] ad={{1.2, 2.5}, {1.0, 1.5}}

Posso anche inizializzarli al volo.

TIPI ARRAY: ALLOCAZIONE DI MEMORIA

In mancanza di inizializzazione, la dichiarazione di un array non alloca spazio per gli elementi dell’array.

L’allocazione si realizza dinamicamente tramite l’operatore:

new []

La dimensione dell’array deve essere nota. Esiste una classe Vector che consente di avere più oggetti dello stesso tipo, senza dover dichiararne il numero.

Esempi: int[] i=new int[10], j={10,11,12}; float[][] f=new float[10][10]; Persona[] p=new Persona[30];

Se gli elementi non sono di un tipo primitivo, l’operatore “new” alloca solo lo spazio per i riferimenti. In C++ se dichiaro una variabile senza inizializzarla, a questa non viene assegnato nessun valore, in Java viene assegnato un valore di default che per i riferimenti è “null”.

ARRAY DI OGGETTI VS. ARRAY DI TIPI BASE

L’istruzione:

float f[] = new float[20];

crea un oggetto di tipo array di float e alloca spazio per 20 float

L’istruzione:

Person p[] = new Person[20];

crea un oggetto di tipo array di Person e alloca spazio per 20 riferimenti a oggetti di tipo Person

Non viene allocato spazio per gli oggetti veri e propri

Diverso dal C++, in cui potrei scrivere Person p[20]; poiché l’array è allocato staticamente ed ogni cella di memoria contiene lo spazio per un oggetto di tipo persona. Se faccio allocazione dinamica con la new è come Java.

person

f

DEFINIZIONE DI UNA NUOVA CLASSE

Una nuova classe viene definita nel seguente modo:

class { }

Esempio: class Automobile {... }

CLASSI DEFINITE A LIVELLO PUBLIC O PACKAGE

Le due classi C sono distinte. Il package permette di restringere la visibilità della classe.

public class C

C è visibile a tutte le classi che hanno importato il package dove c’è C

class C

C è visibile solo dentro il package in cui è definita.

In un package ci deve essere almeno una classe public che serva da interfaccia con l’esterno. Se non definiamo nessun package, le classi sono messe in un package di default e sono tutte tra di loro visibili.

DEFINIZIONE DI ATTRIBUTI

Gli attributi costituiscono lo “stato” degli oggetti appartenenti ad una classe Gli attributi si definiscono usando la stessa sintassi della dichiarazione di variabili

Esempio class Automobile { String colore, marca, modello; int cilindrata, numPorte; boolean accesa; }

class C class C

package p package q

CLASSI E OGGETTI

Le istanze di una classe si chiamano oggetti

Ogni variabile il cui tipo sia una classe (o un interfaccia) contiene un riferimento ad un oggetto

Ad ogni variabile di tipo riferimento può essere assegnato il riferimento null: Automobile a=null;

Regola per il passaggio parametri:

  • I parametri il cui tipo sia uno dei tipi semplici sono passati per copia
  • I parametri il cui tipo sia un tipo riferimento (classi, interfacce e array) sono passati per riferimento (ovvero per copia del riferimento)
  • Quindi, gli oggetti sono sempre passati per riferimento

ESEMPIO

Abbiamo una classe che definisce un metodo

class NomeClasse{ … m (int x, Stack s) { … } … }

Invochiamo:

NomeClasse o = new NomeClasse(); int 5; Stack s1 = new Stack(20); o.m(y, s1);

Vediamo cosa succede

Nell’AR di m, davo avere due celle, una per x ed una per s

Il 5 viene copiato nel parametro formale x, mentre per s copiamo il valore del puntatore.

x

s

m( )

y s

s viene passato per riferimento.

ACCESSO AD ATTRIBUTI E METODI DI UN OGGETTO

L’accesso ad attributi e metodi di un oggetto per il quale si abbia un riferimento si effettua tramite la “notazione punto” (inglese: dot-notation )

Esempio: Automobile a; .... if(a!=null){ a.accendi(); a.dipingi(“Blu”); }

ACCESSO AD ATTRIBUTI E METODI LOCALI

Nella definizione di un metodo ci si riferisce ad attributi e metodi dell’oggetto sul quale il metodo sia stato invocato direttamente (senza notazione punto)

Esempio class Automobile { String colore; void dipingi(String col) {colore=col;} ... }

x 5

s

m( )

y s

CREAZIONE E DISTRUZIONE DEGLI OGGETTI

Nuovi oggetti sono costruiti usando l’operatore new

Automobile a=new Automobile();

La creazione di un oggetto comporta l’invocazione di un particolare metodo dell’oggetto chiamato costruttore.

Il costruttore svolge due operazioni fondamentali: l’allocazione della memoria necessaria a contenere l’oggetto l’inizializzazione dello spazio allocato

A differenza del C++, in Java non è necessario deallocare esplicitamente gli oggetti. Di ciò si occupa il garbage collector.

CLASSI E COSTRUTTORI

Nella definizione di una classe è possibile specificare uno o più (vedi overloading) costruttori

  • Un costruttore è un metodo particolare che ha lo stesso nome della classe
  • Per i costruttori non viene indicato il tipo del risultato

Se non si definisce nessun costruttore, il compilatore fornisce il costruttore di default (senza parametri), che svolge le seguenti funzioni:

  • Alloca lo spazio per gli attributi di tipo primitivo
  • Alloca lo spazio per i riferimenti agli attributi di tipo definito dall’utente
  • Inizializza a null tutti i riferimenti

NOTA: Se in una classe definiamo un costruttore con pa rametri, nelle classi figlie non posso utilizzare il costruttore di default.

COSTRUTTORI: ESEMPIO

class Automobile { String colore, marca, modello; int cilindrata, numPorte; boolean accesa;

Automobile() { colore=marca=modello=null; cilindrata=numPorte=0; }

Automobile(String colore, String marca, String modello) { this.colore=colore; this.marca=marca; this.modello=modello;

cilindrata=numPorte=0; }

void accendi() {accesa=true;} boolean puoPartire() {return accesa;} void dipingi(String col) {this.colore=col;} }

ANCORA SUI COSTRUTTORI

A volte è comodo fattorizzare il codice dei costruttori

È possibile invocare un costruttore dall’interno di un altro tramite la notazione: this();

Esempio: class Persona { String nome; int eta;

Persona(String nome) {this.nome=nome; eta=0;}

Persona(String nome, int eta) { this(nome); this.eta=eta; } }

Per evitare di riscrivere il codice.

this(nome); //richiama il costruttore che gestisce il nome (il costruttore associato all’oggetto corrente)

METODI E ATTRIBUTI DI CLASSE

Sintassi:

static <definizione dell’attributo o metodo>

Un attributo di classe è condiviso da tutti gli oggetti della classe

Si può accedere ad un attributo di classe senza bisogno di creare un oggetto tramite la notazione :

.

Poiché sono statici, i metodi di classe può essere invocato senza bisogno di creare un oggetto tramite la notazione:

.(<par. attuali>)