Introduzione alla Java Collections Framework

Documenti analoghi
Programmazione orientata agli oggetti Classi astratte e interfacce

TIPI PRIMITIVI E CLASSI WRAPPER

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

TIPI PRIMITIVI: LIMITI

Uso di metodi statici. Walter Didimo

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

La classe java.lang.object

Esempio 2: Subtyping

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

18 - Classi parzialmente definite: Classi Astratte e Interfacce

e il loro uso: esistente e cambiare quel che va cambiato specializzare (per ereditarietà) la classe Counter public class EsempioNuovo {

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Uguaglianza e copia di oggetti

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Programmazione orientata agli oggetti Ereditarietà

Esempi in Java di program.ne O-O

Programmazione Java Avanzata Programmazione Object- Oriented in Java

Programmazione ad oggetti

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Programmazione orientata agli oggetti Subtyping e polimorfismo

Operazioni numeriche - Input

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Eredità e Polimorfismo in Java

IL CONCETTO DI CLASSE

Classi astratte. Nella gerarchia delle classi, potrebbe essere utile prevedere un supertipo generale per le classi che si usano. Ad esempio: Figura

Esempio su strutture dati dinamiche: ArrayList

14 - Metodi e Costruttori

Uso di classi e oggetti. Prof. Francesco Acarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Proprietà delle Classi e degli Oggetti in Java

Esempio su strutture dati dinamiche: ArrayList

Esempio su strutture dati dinamiche: ArrayList

Oggetti Composti (1) Oggetti Composti (2)

Esempio: Costruttori ed ereditarietà

Programmazione orientata agli oggetti Classi, package e file system. Package

Java Le stringhe. Stringhe

Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Introduzione agli oggetti

Programmazione a oggetti

Classi, Ereditarietà e Polimorfismo. Lezione 7

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Java. Ereditarieta RIUSO DEL CODICE

CLASSI ASTRATTE - ESERCIZIO

Ereditarietà e Polimorfismo. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Fondamenti di Informatica I

Introduzione. Java. Esempio. Esempio

Ereditarietà (ultima)

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Corso sul linguaggio Java

16 - Ereditarietà, tipi e gerarchie

ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:

Basi della programmazione in Java. Anteprima. Uso delle variabili. Il concetto di variabile Uso delle variabili. Input da tastiera I tipi Esercizi

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Definizione di classi. Walter Didimo

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Le basi del linguaggio Java

Programmazione Orientata agli Oggetti

Programmazione con Java

UML Diagrammi delle classi. UML Diagramma classi 1

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

Riferimenti ad oggetti: Fondamenti di Informatica L-B Esercitazione n 4 Java: I/O, Costruttori e altro. Riferimenti ad oggetti: (Esempio)

Fondamenti di Programmazione Prof.ssa Elisa Tiezzi. Programmazione orientata a oggetti

Capitolo 6. Uso della gerarchia. c 2005 Pearson Education Italia Capitolo 6-1 / 125

Programmazione ad Oggetti. Java Parte II

L ereditarieta` Riuso del software: Ereditarieta`, Composizione, Polimorfismo e Binding Dinamico Ereditarietà Ereditarietà

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Obiettivi. Comprendere i vantaggi offerti dal meccanismo dell ereditarietà Attivare processi di astrazione e specializzazione.

Introduzione Programmazione Java

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro

Capitolo 4. Tipi di dati fondamentali. Cay S. Horstmann Concetti di informatica e fondamenti di Java quarta edizione

Subtype Polymorphism. Conversioni di tipo. Conversioni di tipo. Subtyping. Conversioni di tipo. Interfacce e subtype polimorfismo

Java: Definire Classi e Creare Oggetti

Introduzione all uso degli oggetti in Java (parte II) Walter Didimo

Fondamenti di Informatica T-1

Definizione di una classe

Programmazione Java Variabili membro, Metodi La parola chiave final

CLASSI e FILE I PACKAGE

public protected private private package

Fondamenti di Informatica T-1. Classi e metodi astratti

Linguaggi di Programmazione II Matricole con le due ultime cifre dispari

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Sul pattern Iterator

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

I costruttori. Il costruttore standard. Esempio di valori di default. Alterare il costruttore standard

Oggetti e classi. Cos è un oggetto

Unità B2.1. I tipi di dato

Il linguaggio Java: aggiunte in Java 1.5

RETI DI CALCOLATORI Linguaggio Java: Ereditarietà

Confronti, equals. Operatori Relazionali, confronti Confronti fra Oggetti, ridefinizione di equals. Laboratorio di Programmazione - Luca Tesei

Tipi di dato semplici

Transcript:

OGGI (RI)VEDIAMO Recap ereditarietà, Object, final Classi wrapper Introduzione alla Java Collections Framework Tabelle hash 1

Ereditarietà - recap Una classe può derivare da un altra - extends Eredita metodi e attributi (no i costruttori) Aggiunge attributi e metodi, ma può anche ridefinire metodi - overriding Il reference di un oggetto o può essere dichiarato di una classe C, e l istanza creata di una sottoclasse SC L oggetto o sa rispondere ai metodi di C (ereditarietà di interfaccia, o subtyping), per risolvere i metodi invocati, usa la versione di codice di SC (binding dinamico) In Java tutte le classi discendono, direttamente o indirettamente, dalla classe Object Ogni classe extends Object Object 2

La classe Object La classe Object è il capostipite della gerarchia di classi, definisce alcuni metodi (equals, tostring, etc) che possono essere ridefiniti ad-hoc nelle sotto classi Object 3

Metodi e classi final In Java final in generale serve per indicare qualcosa che non può cambiare Può essere utilizzato anche con i metodi e con le classi: Un metodo marcato come final non può essere ridefinito (si inibisce l overriding) Una classe marcata come final non può essere estesa mediante ereditarietà. Non è cioè possibile creare sue sottoclassi Object 4

this Java definisce una parola chiave per rappresentare l istanza corrente: this L istanza corrente è quella su cui un metodo sta lavorando Questa parola chiave ha due utilizzi: Eliminare i conflitti di nome quando un parametro o una variabile locale hanno lo stesso nome di un attributo dell oggetto Poter passare l istanza corrente come parametro ad un metodo Object 5

Esempio 1: this per eliminare i conflitti di nome Scriviamo una variante di Counter in cui definiamo un costruttore che permette di stabilire il valore iniziale mediante un parametro: public class Counter { private int val; public Counter(int val) { this.val = val public void reset() { val = 0; public void inc() { val++; public int getvalue() { return val; Avendo dato al parametro del costruttore lo stesso nome dell attributo dobbiamo usare this per distinguere fra il parametro e l attributo Object 6

Esempio 2: this come parametro Aggiungiamo alla classe Deposito il metodo print() che stampa a video l oggetto corrente public class Deposito { float soldi; public Deposito() { soldi=0; public Deposito(float s) { soldi=s; public String tostring() { return Soldi: +soldi public void print() { System.out.println(this) System.out.println() richiede un oggetto come parametro Usiamo quindi this per indicare che vogliamo scrivere a video l oggetto corrente Object 7

Esempio 2: this come parametro Aggiungiamo alla classe Counter il metodo print() che stampa a video l oggetto corrente public class Counter {... public void print() { System.out.println(this) System.out.println() richiede un oggetto come parametro Usiamo quindi this per indicare che vogliamo scrivere a video l oggetto corrente Object 8

Classi astratte e interfacce (recap) Classi astratte - Interfacce 9

Classi astratte Java ci consente di definire classi in cui uno o più metodi non sono implementati, ma solo dichiarati Questi metodi sono detti astratti e vengono marcati con la parola chiave abstract Non hanno un corpo tra parentesi graffe ma solo la dichiarazione terminata con ; M Attenzione: un metodo vuoto ({) e un metodo astratto sono due cose diverse Una classe che ha almeno un metodo astratto si dice classe astratta Le classi non astratte si dicono concrete Una classe astratta deve essere marcata a sua volta con la parola chiave abstract Classi astratte - Interfacce 10

Esempio - 1 Scriviamo la classe astratta Shape che definisce una generica figura geometrica di cui possiamo calcolare area e perimetro public abstract class Shape { public abstract double area(); public abstract double perimeter(); A lato vediamo la rapprsentazione UML: metodi e classi astratte sono in corsivo Definiamo quindi due classi concrete, Circle e Rectangle che discendono da Shape e forniscono un implementazione dei metodi astratti di Shape Shape +area() : double +perimeter() : double Classi astratte - Interfacce 11

Esempio - 2 Vediamo l implementazione di Circle e di Rectangle: public class Circle extends Shape { protected double r; public Circle(double r) { this.r = r; public double area() { return Math.PI * r * r; public double perimeter() { return 2 * r * Math.PI; public double getradius() { return r public class Rectangle extends Shape { protected double w,h; public Rectangle(double w, double h) {this.w = w; this.h = h; public double area() { return w * h; public double perimeter() { return 2 * (w + h); public double getwidth() { return w; public double getheight() { return h; Classi astratte - Interfacce 12

Interfacce Classi astratte - Interfacce 13

Interfacce Le interfacce definiscono un insieme di signature di metodi Nessun metodo può avere implementazione in una interfaccia (non è cosi nelle classi astratte) Possiamo definire l interfaccia Drawable in questo modo: public interface Drawable { public void setcolor(int c); public void setposition(double x, double y); public void draw(); «interface» Drawable +setcolor() +setposition() +draw() A lato la rappresentazione UML Classi astratte - Interfacce 14

Uso delle interfacce Possiamo scrivere DrawableRectangle così: public class DrawableRectangle extends Rectangle implements Drawable { protected int c; protected double x, y; public DrawableRectangle(double w, double h) { super(w,h); public void setcolor(int c) { this.c = c; public void setposition(double x, double y) { this.x = x; this.y = y; public void draw() { System.out.println( Rettangolo, posizione +x + +y+ colore +c); Classi astratte - Interfacce 15

Uso delle interfacce In maniera del tutto simile possiamo definire DrawableCircle che sarà dichiarata come: public class DrawableCircle extends Circle implements Drawable { protected int c; protected double x, y; public DrawableCircle(double r) { super(r); public void setcolor(int c) { this.c = c; public void setposition(double x, double y) { this.x = x; this.y = y; public void draw() { System.out.println( Cerchio, posizione +x + +y+ colore +c); Classi astratte - Interfacce 16

Istanze Il reference di un oggetto o può essere dichiarato di tipo C (classe, o classe astratta, o interfaccia) e l istanza creata di tipo sotto-classe SC (sottoclasse, classe non astratta, classe che implementa l interfaccia) L oggetto o sa rispondere ai metodi di C (ereditarietà di interfaccia, o subtyping), per risolvere i metodi invocati, usa la versione di codice di SC (binding dinamico) C o; o= new SC(); Object 17

Java Classi wrapper e classi di servizio Classi di servizio 18

Classi wrapper Concetti di base In varie situazioni, può essere comodo poter trattare i tipi primitivi come oggetti. Una classe wrapper (involucro) incapsula una variabile di un tipo primitivo In qualche modo trasforma un tipo primitivo in un oggetto equivalente la classe Boolean incapsula un boolean la classe Double incapsula un double la classe Integer incapsula un int La classe wrapper ha nome (quasi) identico al tipo primitivo che incapsula, ma con l iniziale maiuscola Classi di servizio 19

Classi wrapper - Elenco Nella tabella sottostante sono riportati i tipi primitivi e le relative classi wrapper. Attenzione alle differenze di nome: int/integer e char/ Character Tipo primitivo Classe wrapper corrispondente boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double oggetto Integer int Classi di servizio 20

Classi wrapper - Funzionamento Ogni classe wrapper ha come stato semplicemente un attributo del tipo che incapsula: Integer avrà un attributo di tipo int, Double un attributo di tipo double e così via. Le classi wrapper sono state costruite per essere immutabili: assumono un valore al momento della creazione e non lo cambiano mai più. Quindi per ogni classe esiste un costruttore che prende come parametro una variabile del tipo incapsulato e lo memorizza nello stato. Esiste poi un metodo selettore che consente di leggere in modo protetto il valore dello stato. Classi di servizio 21

Classi wrapper - Funzionamento Ogni classe wrapper definisce metodi per estrarre il valore della variabile incapsulata e viceversa. Per estrarre il valore incapsulato:! Integer fornisce il metodo "intvalue() Double fornisce il metodo "doublevalue() Boolean fornisce il metodo "booleanvalue() Character fornisce il metodo "charvalue()... Per creare un oggetto da un valore primitivo:! Integer i = new Integer(valore int) Double d = new Double(valore double) Boolean b = new Boolean(valore boolean) Character c = new Character(valore char)... 22

Integer Ipotesi di implementazione Possiamo immaginare (è un ipotesi semplificata) che la classe Integer sia fatta così: class Integer { private int value; public Integer(int val) { value = val; public int intvalue() { return value; Classi di servizio 23

Integer - Esempio Vediamo un semplice esempio di uso della classe Integer: public class EsempioWrapper { public static void main(string args[]) { int x = 35; Integer ix = new Integer(x); x = 2*ix.intValue(); System.out.println("x =" + x); Classi di servizio 24

Integer Altri metodi In realtà la classe Integer, come tutte le classi wrapper, è più complessa e mette a disposizione molti altri metodi Abbiamo innanzitutto un secondo costruttore che prende come parametro una stringa e la converte in un intero per memorizzarne il valore nello stato public Integer(String s); Abbiamo poi alcuni metodi che convertono il valore interno in un altro tipo Per esempio: public String tostring(); public double doublevalue(); Classi di servizio 25

Classi wrapper come classi di servizio Le funzionalità di Integer che abbiamo visto fino ad ora sono collegate al ruolo della classe come generatore di istanze. Le classi wrapper mettono a disposizione un gran numero di metodi static Queste funzionalità sono quindi legate all idea di classe come fornitore di servizi, indipendentemente dalla creazione di istanze. Sono metodi che possiamo invocare senza creare un istanza L esempio più tipico è: public static int parseint(string s); Questo metodo converte una stringa in un intero senza creare un istanza di Integer Classi di servizio 26

Due modi per convertire stringhe in interi Sulla base di quanto detto finora abbiamo due modi per convertire una stringa in un intero. 1. Costruiamo un istanza di Integer usando il costruttore che prende come parametro una stringa e poi leggiamo il valore intero: Integer in; int n; in = new Integer( 23 ); n = in.intvalue(); 2. Oppure invochiamo semplicemente il metodo parseint() sulla classe Integer senza creare istanze: int n; n = Integer.parseInt( 23 ); E evidente che il secondo metodo è più semplice e non comporta la creazione di un istanza, e quindi è quello più usato M Attenzione: notate la differenza di utilizzo dei due metodi. intvalue() viene invocato su un istanza mentre parseint() viene invocato sulla classe Classi di servizio 27

TIPI PRIMITIVI E CLASSI WRAPPER! Esempio: tostring() nella classe Integer! versione statica:! public static String tostring(int x); prende un valore int e ne produce la rappresentazione sotto forma di stringa" versione metodo:! public String tostring(); è implicitamente invocato su un oggetto Integer" ne recupera il valore e ne produce la rappresentazione sotto forma di stringa." 28

ESEMPIO public class EsempioWrapper { public static void main(string args[]){ int x = 35; Integer ix = new Integer(x); x = 2 * ix.intvalue(); System.out.println("ix ="+ix.tostring()); System.out.println("x ="+Integer.toString(x)) ix = 35 x = 70 Conversione esplicita da Integer a String (usando il metodo tostring()di Integer) Conversione esplicita da int a String (usando la funzione statica tostring()di Integer) 29

ESEMPIO public class EsempioWrapper { public static void main(string args[]){ int x = 35; Integer ix = new Integer(x); x = 2 * ix.intvalue(); System.out.println("ix ="+ix); System.out.println("x ="+x); ix = 35 x = 70 Conversione implicita da Integer a String (usando il metodo tostring()di Integer) Conversione implicita da int a String (usando la funzione statica tostring()di Integer) 30

Classi di servizio Normalmente il ruolo principale di una classe è quello di creare istanze: tutte le classi che abbiamo creato nei nostri esempi (Counter, Orologio, ecc.) avevano questa impostazione Abbiamo però visto che nel caso dei wrapper ci troviamo di fronte a classi in cui il ruolo di creazione di istanze e quello di fornitura di servizi sono egualmente importanti Esistono addirittura classi che svolgono solo il ruolo di fornitori di servizi e non hanno la capacità di creare istanze Sono classi che: Non hanno costruttori Hanno tutti i metodi dichiarati come static Classi di servizio 31

La classe Math (libreria, più costanti) L esempio più evidente di classe di servizio in Java è la classe Math La classe Math risolve un problema di questo tipo Dal momento che in Java: Non esistono funzioni ma solo metodi di una qualche classe I numeri reali - float o double - non sono oggetti ma tipi primitivi e quindi non hanno metodi Come si fa a calcolare la radice quadrata, il logaritmo, il seno o il coseno di un numero? Una possibile soluzione sarebbe quella di inserire nella classe wrapper Double (e in Float) un metodo per ogni funzione matematica Abbiamo però visto che questo approccio è complicato e poco efficiente: ogni volta che devo calcolare una funzione matematica dovrei creare un istanza di Double Si è quindi scelta una strada più semplice: esiste una classe, denominata Math, che definisce solo metodi statici e ogni metodo corrisponde ad una funzione matematica. Classi di servizio 32

I metodi di Math Math contiene un gran numero di metodi Tutti i metodi sono dichiarati come public static Vediamoli per categorie: Potenze radici: pow() e sqrt() Funzioni trigonometriche: sin(), cos(), tan() Logaritmo naturale ed esponenziale: log(), exp() Funzioni di conversione da reali a interi: round() Varie ed eventuali: abs(), max() Di molti metodi esistono versioni overloaded per gestire i vari tipi. Per esempio max() ha 4 definizioni: public static int max(int a, int b) public static long max(long a, long b) public static float max(float a, float b) public static double max(double a, double b) Classi di servizio 33

Esempio di uso di Math Vediamo un esempio di utilizzo di Math Math è contenuta nel package java.lang e quindi non è necessario usare import public class EsempioMath { public static void main(string args[]) { double x,y; x = 5; y = Math.log(x); System.out.println( Il logaritmo di +x+ è +y); x = Math.PI / 2; // Pi greco/2 y = Math.sin(x); System.out.println( Il seno di +x+ è +y); Classi di servizio 34

Math: che cos è PI Nell esempio appena visto c è un istruzione strana: x = Math.PI / 2; Math.PI evidentemente non è un metodo (non ha le parentesi), è un attributo che ha come valore π (3.14 ) Però c è qualcosa che non torna: Gli attributi costituiscono lo stato di un istanza Però abbiamo detto che la classe Math non genera istanze Che cos è PI? Classi di servizio 35

Attributi di classe - 1 E un attributo statico della classe Math La sua definizione è public static final double PI; E marcato come static e come tale ha un significato simile ai metodi static: Non appartiene ad una istanza ma alla classe È un attributo che esiste per tutto il tempo di vita dell applicazione Per usarlo facciamo riferimento al nome della classe e non ad una variabile di tipo Math x = Math.PI PI è definito anche come final perché è una costante: non deve essere possibile cambiare il suo valore Classi di servizio 36

Attributi di classe - 2 M Attenzione: si tratta di un caso speciale: normalmente gli attributi si trovano nell istanza: costituiscono lo stato dell istanza. Se però marchiamo un attributo con il modificatore static questo attributo viene messo nella classe e non entra a far parte dello stato dell istanza Gli attributi static vengono chiamati attributi di classe, in quanto non appartengono ad un istanza ma alla classe nel suo insieme Si usa anche in questo caso il marcatore static perché questi attributi esistono per tutto il tempo di vita dell applicazione Non vengono creati dinamicamente come avviene per gli attributi che costituiscono lo stato dell istanza Classi di servizio 37