Fondamenti di Informatica II a.a. 2020-2021
Utilizzare oggetti Prof. Luca Mainetti Università del Salento
Obiettivi della lezione
! Imparare a utilizzare variabili
! Comprendere i concetti di classe e oggetto
! Imparare a invocare i metodi
! Usare parametri e valori restituiti dai metodi
! Consultare la documentazione dell’API di Java
! Realizzare programmi di collaudo
! Comprendere la differenza tra oggetti e riferimenti a oggetti
! Scrivere programmi con semplici interfacce grafiche
Oggetti e classi
! I domini applicativi industriali utilizzano dati complessi, non solo semplici numeri o stringhe
! Ad esempio, conti correnti, automobili, utenti, video ecc.
! Dati di questa natura in Java (e in tutti i linguaggi OO) sono rappresentati tramite oggetti
! Gli oggetti hanno dei dati e dei comportamenti
! Per descrivere il comportamento di un oggetto si utilizza una classe
! Un programma Java in esecuzione è quindi costituito da più oggetti che collaborano per ottenere il comportamento
funzionale desiderato; es: Utente, ContoCorrente, Banca
Utilizzare oggetti
! Un oggetto è un’entità (per ora pensiamolo come un
«contenitore di dati») che può essere manipolata (i suoi dati possono essere modificati) mediante l’invocazione di
metodi
! Un metodo (simile a una funzione C) è costituito da una sequenza di comandi
! Un metodo può essere invocato (chiamato)
! All’atto della chiamata, si conosce il comportamento del metodo ma non l’insieme dei suoi comandi
(incapsulamento)
! Il metodo println modifica i dati dell’oggetto System.out
Utilizzare oggetti (cont.)
! In sintesi, la struttura è
rappresentata in figura
! Non sappiamo come println e
siano
implementati ma
ne conosciamo il
comportamento
Classi
! Una classe descrive un insieme di oggetti con lo stesso comportamento
! Un oggetto è un’istanza di una specifica classe
! Ad esempio ″Hello, World″, ″Buongiorno″, ″Luca Mainetti″
sono tutti oggetti stringa
! Si possono invocare gli stessi metodi su tutte le stringhe
! System.out è un membro della classe PrintStream che scrive sulla console
! E’ possibile costruire altri oggetti di PrintStream che
possano scrivere su destinazioni diverse, ma tutti gli oggetti
PrintStream hanno i metodi println e print
Classi (cont.)
! Gli oggetti della classe PrintStream hanno un
comportamento differente dagli oggetti della classe String
! Questo perché classi diverse hanno responsabilità differenti in un sistema
! Quindi classi diverse hanno comportamenti differenti
! Non è possibile invocare i metodi println e print su oggetti della classe String
Variabili e dichiarazioni di variabili
! Quando manipoliamo oggetti abbiamo spesso la necessità di memorizzare gli oggetti stessi nei loro vari stati e i valori restituiti dai loro metodi in modo da usarli in seguito
! Per memorizzare valori in Java si utilizzano le variabili
! Come in C, le variabili devono essere dichiarate prima di poter essere utilizzate
! Ogni variabile ha un nome e contiene un valore
! Questo valore appartiene a uno specifico dominio che è determinato da un tipo
! Spesso quando dichiariamo una variabile specifichiamo anche il suo valore iniziale
Sintassi della dichiarazione di variabile
Esempi di dichiarazione di variabile
Tipi
! In Java esiste un insieme di tipi (https://www.w3schools.com/java/java_data_types.asp)
! Si distingue tra tipi primitivi e tipi non-primitivi
! I tipi primitivi specificano la dimensione del dominio dei valori e non espongono metodi
! I tipi non-primitivi sono costruiti dai programmatori e sono riferimenti a oggetti
! I tipi non-primitivi possono essere usati per invocare metodi
! I tipi primitivi iniziano con lettera minuscola mentre quelli non-primitivi con lettera maiuscola
! I tipi non-primitivi non sono predefiniti in Java ad esclusione del tipo String
Nomi e convenzioni
! Utilizzare nomi significativi
! Regole per i nomi di variabili, metodi e classi
– Iniziano con lettera o con «_»
e possono continuare con lettere, numeri e «_»
– Non possono contenere simboli come «?» o «%» né spazi
– Per nomi composti si usa la convenzione «camel case»
– I nomi sono «case sensitive»
– Non possono contenere parole riservate del linguaggio
– Variabili iniziano con
minuscola, classi iniziano con
Commenti
! Per i commenti al codice si utilizza la stessa sintassi del C
! «//» per commenti brevi e blocchi «/* */» per commenti lunghi cioè su più linee
! E’ bene che ogni classe e ogni metodo siano commentati
! I commenti devono (dovrebbero) chiarire il comportamenti di una classe o di un metodo ed esplicitarne il «contratto» di utilizzo
! Codice non commentato non è evolvibile
! Per essere rapidi nei nostri esempi ci permettiamo di non commentare il codice
Assegnamenti
! Modificare il valore di variabili
! LHS = RHS
! LHS = variabile
! RHS = espressione
! Le variabili devono essere dichiarate
prima di poter essere utilizzate sia nel LHS sia nel RHS
! Le variabili devono essere inizializzate prima di essere utilizzate nel RHS
Invocare metodi
! Gli oggetti si usano invocandone i metodi
! I metodi di una classe sono condivisi da tutti gli oggetti di quella classe
! L’insieme dei metodi (pubblici) di una classe costituiscono la sua interfaccia (pubblica)
! Una classe definisce una realizzazione (implementa- zione) privata che definisce i dati (attributi) della classe e l’implementazione dei suoi
String greeting = “Hello, World!”;
int numberOfCharacters = greeting.length();
String river = “Mississippi”;
String bigRiver = river.toUpperCase();
Parametri dei metodi
! La maggior parte dei metodi necessità di valori in input che i metodi elaborano
! Tali valori sono
denominati parametri o argomenti
! Alcuni metodi
standard degli oggetti creati dagli utenti
sono set(value) e
get()
System.out.println(greeting);
Valori restituiti dai metodi
int numberOfCharacters = greeting.length()
System.out.println(greeting.length());
river = river.replace("issipp", "our");
Dichiarazione di metodi
! Come per le variabili, anche i metodi devono essere dichiarati per essere usati
! Nella dichiarazione si deve definire il nome del metodo, il tipo del valore di ritorno e il tipo dei parametri
! Quando un metodo non
restituisce valori il tipo di valore restituito è void
! Una classe può definire due o più metodi con lo stesso nome ma con parametri diversi
(overloading)
public void println(int output) public int lenght()
public String replace(String target, String replacement)
public void println(String output)
Costruire oggetti
! Gli oggetti definiti dal program- matore devono essere costruiti prima di essere utilizzati
! Ad esempio, pensiamo a un oggetto che rappresenta un rettangolo, caratterizzato dalle coordinate x,y del vertice
superiore sinistro e da una
width e height
! Nella figura vi sono tre diverse istanze di rettangolo
rappresentate con i retativi dati
! La macchina virtuale Java riserva una zona di memoria per contenere quadruple di dati per ogni nuovo oggetto
new Rectangle(5, 10, 20, 30)
new Rectangle(35, 30, 20, 20)
new Rectangle(45, 0, 30, 20)
La sintassi per costruire oggetti
! L’operatore new – Costruisce un
oggetto di tipo
Rectangle
– Usa i parametri ricevuti per
inizializzare i dati dell’oggetto
– Restituisce l’oggetto
! I costruttori non sono metodi, possono essere utilizzati sono tramite new
Rectangle box = new Rectangle(5, 10, 20, 30);
box.Rectangle(20, 35, 20, 30);
Box = new Rectangle(20, 35, 20, 30);
Box = new Rectangle();
Metodi di accesso e metodi modificatori
! Classifichiamo i metodi di una classe in metodi di accesso e metodi
modificatori
! I metodi di accesso
restituiscono informazioni su oggetti senza
modificarli
! I metodi modificatori
modificano i dati interni di oggetti
! E’ bene tenerli separati
! Si usa la convenzione get
e set
box.translate(15, 25);
box.getX();
Classi di libreria e documentazione API
! Le classi di libreria
Java sono ampiamente documentate
! Ad esempio, è
possibile consultare la documentazione del JDK11 all’indirizzo
https://docs.oracle.com /en/java/javase/11/doc s/api/index.html
! Le classi di libreria standard sono
organizzare in package
! Per utilizzare classi di libreria è necessario importarle, tranne
import java.awt.Rectangle;
Collaudo delle classi
! Un metodo «naive» per
collaudare metodi di una classe è il seguente
– Definire una classe di collaudo – Definire in essa il metodo main
– Costruire uno o più oggetti all’interno del main
– Invocare metodi degli oggetti – Visualizzare i risultati prodotti
dalle invocazioni
– Visualizzare i valori previsti dal programmatore
! Questa è la base dello «unit testing» che introdurremo in Principi di Ingegneria del Software tramite JUnit
Rectangle box = new Rectangle(5, 10, 20, 30);
// Move the rectangle box.translate(15, 25);
// Print information about the moved rectangle System.out.print("x: ");
System.out.println(box.getX());
System.out.println("Expected: 20");
Ragionare sui valori attesi spinge il programmatore ad approfondire l’analisi
degli algoritmi
Riferimenti a oggetti
! Per motivi di
efficienza, in Java una variabile di tipo oggetto contiene solo il riferimento alla
locazione di memoria che contiene i dati dell’oggetto stesso
! Più variabili oggetto possono fare
riferimento al
medesimo oggetto
! Variabile e oggetto sono memorizzati in locazioni differenti
Rectangle box = new Rectangle(5, 10, 20, 30);
Rectangle box = new Rectangle(5, 10, 20, 30);
Rectangle box2 = box;
Variabili numeriche e variabili oggetto
! Sempre per motivi di efficienza, in Java una variabile numerica
contiene il dato, non il suo riferimento in memoria
int luckyNumber = 13;
int luckyNumber2 = luckyNumber;
luckyNumber2 = 12;
Rectangle box = new Rectangle(5, 10, 20, 30);
Rectangle box2 = box;
box2.translate(15, 25);
Un po’ di sintesi con un’applicazione grafica
! I paragrafi 2.9 e 2.10 del testo fanno sintesi sui concetti appresi mostrando esempi per lo sviluppo di semplici applicazioni grafiche
! E’ utile provare a familiarizzare con il codice, modificandolo in modo da
approfondirne il comportamento
! Anche in altri capitoli si riprenderanno le
librerie grafiche
1 import javax.swing.JFrame;
23 public class EmptyFrameViewer 4 {
5 public static void main(String[] args) 6 {
7 JFrame frame = new JFrame();
8 frame.setSize(300, 400);
9 frame.setTitle("An empty frame");
10 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11 frame.setVisible(true);
12 } 13 }