Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni

Java

Il documento descrive il concetto di classe nel linguaggio Java, evidenziando che una classe riunisce dati e operazioni e funge da modello per creare oggetti. Viene spiegato il funzionamento delle classi e degli oggetti in Java, inclusi costruttori e meccanismi di ereditarietà, oltre a fornire esempi pratici. Infine, si discute l'importanza della riusabilità del codice e le limitazioni delle classi finali e dell'ereditarietà multipla.

Caricato da

dirig27381
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
3 visualizzazioni

Java

Il documento descrive il concetto di classe nel linguaggio Java, evidenziando che una classe riunisce dati e operazioni e funge da modello per creare oggetti. Viene spiegato il funzionamento delle classi e degli oggetti in Java, inclusi costruttori e meccanismi di ereditarietà, oltre a fornire esempi pratici. Infine, si discute l'importanza della riusabilità del codice e le limitazioni delle classi finali e dell'ereditarietà multipla.

Caricato da

dirig27381
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 22

IL CONCETTO DI CLASSE

Una CLASSE riunisce le proprietà di:


• componente software: può essere
dotata di suoi propri dati / operazioni
• moduli: riunisce dati e relative opera-
zioni, fornendo idonei meccanismi di
protezione
• tipi di dato astratto: può fungere da
“stampo” per creare nuovi oggetti
Java e Classi 1

IL LINGUAGGIO JAVA
• È un linguaggio totalmente a oggetti: tran-
ne i tipi primitivi di base (int, float, ...),
esistono solo classi e oggetti
• È fortemente ispirato al C++, ma riproget-
tato senza il requisito della piena compati-
bilità col C (a cui però assomiglia…)
• Un programma è un insieme di classi
• non esistono funzioni definite (come in C) a
livello esterno, né variabili globali esterne
• anche il main è definito dentro a una classe!
Java e Classi 2

1
CLASSI IN JAVA
Una classe Java è una entità sintatticamente
simile alle struct
• però, contiene non solo i dati...
• .. ma anche le funzioni che operano su
quei dati
• e ne specifica il livello di protezione
– pubblico: visibile anche dall’esterno
– privato: visibile solo entro la classe
– ...

Java e Classi 3

CLASSI E OGGETTI IN JAVA


Esclusi i tipi primitivi, in Java esistono solo:
• classi
– componenti software che possono avere i loro dati
e le loro funzioni (parte statica)
– ma anche fare da “schema” per costruire oggetti
(parte non-statica)
• oggetti
– entità dinamiche costruite al momento del bisogno
secondo lo "stampo" fornito dalla parte "Defini-
zione ADT" di una classe
Java e Classi 4

2
CLASSI COME ADT
Una classe con solo la parte NON-STATICA è
una pura definizione di ADT
• È simile a una struct + typedef del C…
• … ma riunisce dati e comportamento (funzioni)
in un unico costrutto linguistico
• Ha solo variabili e funzioni non-statiche
• Definisce un tipo, che potrà essere usato per
creare (istanziare) oggetti

Java e Classi 5

ESEMPIO: IL CONTATORE
• Questa classe non contiene dati o funzioni
sue proprie (statiche)
• Fornisce solo la definizione di un ADT che
potrà essere usata poi per istanziare oggetti
public class Counter {
linguistico per dati

Dati
Unico costrutto

private int val;


e operazioni

public void reset() { val = 0; }


public void inc() { val++; }
public int getValue() {
return val;
} Operazioni
} (comportamento) Java e Classi 6

3
ESEMPIO: LA CLASSE Counter
Il campo val è privato: può essere
• Questaacceduto
classe non solo contiene dati ode-
dalle operazioni funzioni
sue proprie (statiche)
finite nella medesima classe (reset,
inc, getValue), e nessun altro!
• Fornisce solo la definizione di un ADT che
Si garantisce l’incapsulamento
potrà essere usata poi per istanziare oggetti
public class Counter {

linguistico per dati


Dati

Unico costrutto
private int val;

e operazioni
public void reset() { val = 0; }
public void inc() { val++; }
public int getValue() {
return val;
} Operazioni
} (comportamento) Java e Classi 7

OGGETTI IN JAVA
• Gli OGGETTI sono componenti “dinamici”:
vengono creati “al volo”, al momento
dell’uso, tramite l’operatore new
• Sono creati a immagine e somiglianza (della
parte non statica) di una classe, che ne descri-
ve le proprietà
• Su di essi è possibile invocare le operazioni
pubbliche previste dalla classe
• Non occorre preoccuparsi della distruzione
degli oggetti: Java ha un garbage collector!
Java e Classi 8

4
CREAZIONE DI OGGETTI
Per creare un oggetto:
• prima si definisce un riferimento, il cui tipo
è il nome della classe che fa da modello
• poi si crea dinamicamente l’oggetto
tramite l’operatore new (simile a malloc in C)
Esempio:
Counter c; // def del riferimento
...
c = new Counter(); // creazione oggetto

Java e Classi 9

OGGETTI IN JAVA
Uso: stile a “invio di messaggi”
• non una funzione con l'oggetto come parametro…
• …ma bensì un oggetto su cui si invocano metodi

Ad esempio, se c è un Counter, un cliente


potrà scrivere:
c.reset();
c.inc(); c.inc();
int x = c.getValue();

Java e Classi 10

5
PROGRAMMI IN JAVA
Un programma Java è un
insieme di classi e oggetti
• Le classi sono compo-
nenti statici, che esisto-
no già all’inizio del pro-
gramma
• Gli oggetti sono invece
componenti dinamici,
che vengono creati dina-
micamente al momento
del bisogno Java e Classi 11

IL PIÙ SEMPLICE PROGRAMMA


• Il più semplice programma Java è dunque
costituito da una singola classe operante
come singolo componente software
• Essa avrà quindi la sola parte
statica
• Come minimo, tale parte dovrà
definire una singola funzione
(statica): il main

Java e Classi 12

6
IL MAIN IN JAVA
Il main in Java è una funzione pubblica con la
seguente interfaccia obbligatoria:
public static void
main(String args[]){
......
}
• Deve essere dichiarato public, static, void
• Non può avere valore di ritorno (è void)
• Deve sempre prevedere gli argomenti dalla linea di
comando, anche se non vengono usati, sotto forma di
array di String (il primo non è il nome del programma)
Java e Classi 13

ESEMPIO COMPLETO
Programma fatto di due classi:
• una che fa da componente software, e ha
come compito quello di definire il main
(solo parte statica)
• l’altra invece implementa il tipo Counter
(solo parte non-statica)

Classe Counter (pura Classe


definizione di ADT, solo Esempio1
parte non-statica) (solo parte
statica)

Java e Classi 14

7
ESEMPIO COMPLETO
public class Esempio1 {
public static void main(String v[]) {
Counter c = new Counter();
c.reset();
c.inc(); c.inc();
System.out.println(c.getValue());
}
}
• Il main crea un nuovo oggetto Counter…
• ... e poi lo usa per nome, con la notazione puntata…
• …senza bisogno di dereferenziarlo esplicitamente!
Java e Classi 15

COSTRUZIONE DI OGGETTI
• Molti errori nel software sono causati da
mancate inizializzazioni di variabili
• Perciò i linguaggi a oggetti introducono il
costruttore, un metodo particolare che
automatizza l’inizializzazione degli oggetti
– non viene mai chiamato esplicitamente
dall’utente
– è invocato automaticamente dal sistema
ogni volta che si crea un nuovo oggetto di
quella classe
Java e Classi 16

8
COSTRUTTORI
Il costruttore:
• ha un nome fisso, uguale al nome della
classe
• non ha tipo di ritorno, neppure void
• il suo scopo infatti non è “calcolare qualcosa”,
ma inizializzare un oggetto
• può non essere unico
• spesso vi sono più costruttori, con diverse liste
di parametri
• servono a inizializzare l’oggetto a partire da
situazioni diverse
Java e Classi 17

ESEMPIO
La classe Counter
public class Counter { Costruttore senza
private int val; parametri

public Counter() { val = 1; }


public Counter(int v) { val = v; }
Costruttore con un parametro
public void reset() { val = 0; }
public void inc() { val++; }
public int getValue() { return val;}
public boolean equals(Counter x) ...
} Java e Classi 18

9
ESEMPIO: UN CLIENTE
public class Esempio4 {
public static void main(String[] args){
Counter c1 = new Counter();
Qui scatta il costruttore/0
c1.inc(); → c1 inizializzato a 1
Counter c2 = new Counter(10);
c2.inc(); Qui scatta il costruttore/1 → c2 inizializzato a 10

System.out.println(c1.getValue()); // 2
System.out.println(c2.getValue()); // 11
}
}
Java e Classi 19

COSTRUTTORI - NOTE
• Una classe destinata a fungere da schema
per oggetti deve definire almeno un
costruttore pubblico
• in assenza di costruttori pubblici, oggetti di tale
classe non potrebbero essere costruiti
• il costruttore di default definito dal sistema è
pubblico
• È possibile definire costruttori non
pubblici per scopi particolari

Java e Classi 20

10
RIUSABILITÀ
• Si vuole riusare tutto ciò che può essere
riusato (componenti, codice, astrazioni)
• Non è utile né opportuno modificare
codice già funzionante e corretto
• il cui sviluppo ha richiesto tempo (anni-uomo)
• ed è costato (molto) denaro

• Occorre disporre nel linguaggio di un


modo per progettare alle differenze,
procedendo in modo incrementale
Java e Classi 21

L’OBIETTIVO
• Poter definire una nuova classe a partire
da una già esistente
• Bisognerà dire:
– quali dati la nuova classe ha in più
rispetto alla precedente
– quali metodi la nuova classe ha in più
rispetto alla precedente
– quali metodi la nuova classe modifica
rispetto alla precedente

Java e Classi 22

11
EREDITARIETÀ
• Una relazione tra classi: classe base
(superclasse)
si dice che
la nuova classe B A
eredita dalla
eredita_da
preesistente
classe A
B
classe derivata
(sottoclasse)
Java e Classi 23

EREDITARIETÀ
• La nuova classe ESTENDE una
classe già esistente
– può aggiungere nuovi dati o metodi
– può accedere ai dati ereditati purché il
livello di protezione lo consenta
– non può eliminare dati o metodi !!
• La classe derivata condivide la
struttura e il comportamento (per le
parti non ridefinite) della classe base
Java e Classi 24

12
EREDITARIETÀ
Cosa si eredita?
• tutti i dati della classe base
– anche quelli privati, a cui comunque la classe
derivata non potrà accedere direttamente
• tutti i metodi...
– anche quelli che la classe derivata non potrà
usare direttamente
• ... tranne i costruttori, perché sono
specifici di quella particolare classe
Java e Classi 25

EREDITARIETÀ E COSTRUTTORI
• Una classe derivata non può prescindere
dalla classe base, perché ogni istanza della
classe derivata comprende in sé, indiretta-
mente, un oggetto della classe base
• Quindi, ogni costruttore della classe derivata
deve invocare un costruttore della classe
base affinché esso costruisca la “parte di
oggetto” relativa alla classe base stessa:
“ognuno deve costruire
quello che gli compete”
Java e Classi 26

13
UN ESEMPIO COMPLETO
insieme di sottinsieme di
Persone Studenti

• Una classe Persona


• e una sottoclasse Studente
– è aderente alla realtà, perché è vero nel mondo
reale che tutti gli studenti sono persone
– compatibilità di tipo: potremo usare uno studente
(che è anche una persona) ovunque sia richiesta
una generica persona
ma non viceversa: se serve uno studente, non si
può accontentarsi di una generica persona!
Java e Classi 27

LA CLASSE Persona
public class Persona {
protected String nome;
protected int anni;
public Persona() {
nome = "sconosciuto"; anni = 0; }
public Persona(String n) {
nome = n; anni = 0; }
public Persona(String n, int a) {
nome=n; anni=a; }
public void print() {
System.out.print(”Mi chiamo " + nome);
System.out.println(" e ho ” + anni + "anni");
}
}
Java e Classi 28

14
LA CLASSE Studente
public class Studente extends Persona {
protected int matr;
public Studente() {
super(); matr = 9999; }
public Studente(String n) {
super(n); matr = 8888; }
public Studente(String n, int a) {
super(n,a); matr=7777; }
public Studente(String n, int a, int m) {
super(n,a); matr=m; }
public void print() {
super.print();
System.out.println("Matricola = " + matr);
}
} Java e Classi 29

LA CLASSE Studente
public class Studente extends Persona {
protected int matr;
public Studente() {
Ridefinisce il metodo void print()
super(); matr = 9999; }
• sovrascrive
public quello ereditato
Studente(String n) { da Persona
• è una versione
super(n); matr specializzata
= 8888; } per Studente
publicche però riusa quellon,
Studente(String di Persona
int a) {(super),
super(n,a); matr=7777;
estendendolo per stampare } la matricola
public Studente(String n, int a, int m) {
super(n,a); matr=m; }
public void print() {
super.print();
System.out.println("Matricola = " + matr);
}
} Java e Classi 30

15
CLASSI FINALI
• Una classe finale (final) è una classe di
cui si vuole impedire a priori che possano
essere definite, un domani, delle sottoclassi

• Esempio:
public final class TheLastCounter
extends Counter {
...
}

Java e Classi 31

OLTRE LE CLASSI
Possiamo anche avere classi e ereditarietà
multipla
• una classe può derivare da più di una classe
esistente
Nuova relazione tra classi
• implementazione difficile per possibili conflitti
• difficile gestione della gerarchia di ereditarietà delle
classi, sia uso, sia supporto

Java e Classi 32

16
OLTRE LE CLASSI
Può essere utile disporre di un nuovo costrutto
• simile alla (parte non statica di una) classe, nel
senso di consentire la definizione del "modo di
interagire" di un'entità...
• … ma non tenuto a fornire implementazioni…
• … né legato alla gerarchia di ereditarietà delle
classi, con i relativi vincoli

INTERFACCE
Java e Classi 33

INTERFACCE
Una interfaccia costituisce una pura
specifica di interfaccia
• contiene solo dichiarazioni di metodi
• ed eventualmente costanti
• ma non contiene né variabili
né definizioni di metodi

Java e Classi 34

17
INTERFACCE
Praticamente, una interfaccia
• è strutturalmente analoga alla parte di
interfaccia di una classe...
• ma è introdotta dalla parola chiave
interface anziché class
• contiene solo dichiarazioni di metodi

Esempio:
public interface Comparable {
public int compareTo(Object x);
Java e Classi 35
}

INTERFACCE E PROGETTO
Le interfacce inducono un diverso
modo di concepire il progetto
• prima si definiscono le interfacce delle
entità che costituiscono il sistema
– in questa fase si giocano scelte di progetto
(pulizia concettuale)
• poi si realizzeranno le classi che “imple-
menteranno” tali interfacce
– in questa fase entreranno in gioco scelte
implementative (efficienza ed efficacia)
Java e Classi 36

18
UN ESEMPIO di PURA SPECIFICA
Definizione dell’astrazione "Collezione"
• Cosa si intende per "Collezione"? ossia
• Come ci si aspetta di poter interagire con un'entità
qualificata come "Collezione"?
Indipendentemente da qualsiasi scelta o aspetto
implementativo, una "Collezione" è tale perché
• è un contenitore → è possibile chiedersi se è vuota e
quanti elementi contiene
• vi si possono aggiungere e togliere elementi
• è possibile chiedersi se un elemento è presente o no
• ... Java e Classi 37

UN ESEMPIO
Una "Collezione" è dunque una qualsiasi entità
che si conformi a questo "protocollo di accesso"
• è possibile chiedersi se è vuota
• è possibile chiedersi quanti elementi contiene
• vi si possono aggiungere e togliere elementi
• è possibile chiedersi se un elemento è presente o no
• …
È possibile (e utile!) definire questo concetto
prima ancora di iniziare a pensare come sarà
realmente realizzata una "Collezione"!
Java e Classi 38

19
un ESEMPIO di ASTRAZIONE PURA
Si definiscono così astrazioni di dato in termini
di comportamento osservabile, ossia di
• “cosa ci si aspetta” da esse
• “cosa si pretende che esse sappiano fare”
rinviando a tempi successivi la realizzazione pratica di
ADT (classi) che rispettino questa specifica.
public interface Collection {
public boolean add(Object x);
public boolean contains(Object x);
public boolean remove(Object x);
public boolean isEmpty();
public int size();
...
Java e Classi 39
}

GERARCHIE DI INTERFACCE
Le interfacce possono dare luogo a gerarchie,
proprio come le classi:
public interface List extends Collection {
...
} Collection

La gerarchia delle interfacce:


–è una gerarchia separata da quella
delle classi
List
–è slegata dagli aspetti implementativi
–esprime le relazioni concettuali della realtà
–guida il progetto del modello della realtà.
Java e Classi 40

20
GERARCHIE: ESEMPIO
Come in ogni gerarchia, anche qui le interfacce
derivate:
–possono aggiungere nuove dichiarazioni di metodi
–possono aggiungere nuove costanti
– non possono eliminare nulla
Significato: “Ogni lista è anche una collezione”
–ogni lista può interagire col mondo come
farebbe una collezione (magari in modo Collection

specializzato)…
–… ma può avere proprietà peculiari al
concetto di lista, che non valgono per
una “collezione” qualsiasi. List
Java e Classi 41

GERARCHIE: ESEMPIO
Ad esempio, una “Lista” ha un concetto di
sequenza, di ordine fra i suoi elementi
–esiste quindi un primo elemento, un secondo, …
–quando si aggiungono nuovi elementi bisogna dire
dove aggiungerli (ad esempio, in coda)
–è possibile recuperare un elemento a partire dalla
sua posizione (il primo, il decimo,…)
Collection
public interface List extends Collection {
public boolean add(int posizione, Object x);
public Object get(int posizione);
...
List
}
Java e Classi 42

21
INTERFACCE: UN ALTRO ASPETTO
In Java, l’ereditarietà fra classi
può essere solo singola Persona
• una classe può ereditare da
una sola superclasse
Questo può essere limitativo
Studenti Lavoratori
in alcune circostanze:
• se Studenti e Lavoratori
estendono Persona...
• ...dove collocare la classe
StudentiLavoratori?
Studenti-
Lavoratori ?
Java e Classi 43

Uso Interfacce per ESTENSIONI


• Le interfacce che introduciamo possono
servire a descrivere comportamenti
condivisi
→ Serializable, Runnable, ...
• Una classe può dichiarare molte interfacce
e differenziate, se ne implementa i metodi
Esempio
Public Class ActiveWindows implements
Runnable, Serializable, ... {
}

Java e Classi 44

22

Potrebbero piacerti anche