• Non ci sono risultati.

Fondamenti di Informatica II a.a Utilizzare oggetti Prof. Luca Mainetti Università del Salento

N/A
N/A
Protected

Academic year: 2022

Condividi "Fondamenti di Informatica II a.a Utilizzare oggetti Prof. Luca Mainetti Università del Salento"

Copied!
26
0
0

Testo completo

(1)

Fondamenti di Informatica II a.a. 2020-2021

Utilizzare oggetti Prof. Luca Mainetti Università del Salento

(2)

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

(3)

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

(4)

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

(5)

Utilizzare oggetti (cont.)

! In sintesi, la struttura è

rappresentata in figura

! Non sappiamo come

println

e

print

siano

implementati ma

ne conosciamo il

comportamento

(6)

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

(7)

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

(8)

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

(9)

Sintassi della dichiarazione di variabile

(10)

Esempi di dichiarazione di variabile

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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();

(16)

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);

(17)

Valori restituiti dai metodi

int numberOfCharacters = greeting.length()

System.out.println(greeting.length());

river = river.replace("issipp", "our");

(18)

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)

(19)

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)

(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();

(21)

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();

(22)

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;

(23)

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

(24)

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;

(25)

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);

(26)

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 }

Riferimenti

Documenti correlati

Arricchire inoltre il codice del metodo main in modo che scriva il messaggio “io sono lo standard output” sullo standard output (cioè usando l’oggetto System.out)... La soluzione

Arricchire inoltre il codice del metodo main in modo che scriva il messaggio “io sono lo standard output” sullo standard output (cioè usando l’oggetto System.out).. Esercizio

Utilizzando i metodi degli oggetti Cerchio creati visualizza all’utente su una finestra grafica i perimetri dei due cerchi, le aree dei due cerchi e la somma delle

Esercizio 5 Supponi di poter utilizzare le classi InputWindow ed OutputWindow studiate a lezione ed una classe AnalizzatoreDiFrase, i cui oggetti sono in grado di rappresentare

Vista la sua semplicità, il programma viene realizzato attraverso la definizione di una semplice classe (di nome Esercizio1), in cui tutte le azioni richieste sono effettuate nel

Esercizio 2 Scrivere un programma Java che chiede all’utente di inserire due stringhe e che visualizza all’utente true se le stringhe sono uguali e false se sono diverse.. Esercizio

Si scriva un programma in linguaggio C che riceva sulla riga di comando i nomi di due file come sopra descritto (il primo il file che riporta lo stato attuale dei distributori,

Si scriva un programma in linguaggio C che riceva sulla riga di comando i nomi di due file come sopra descritto (il primo il file che riporta lo stato attuale dei distributori,