TIPI PRIMITIVI: LIMITI

Documenti analoghi
TIPI PRIMITIVI E CLASSI WRAPPER

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

Introduzione alla Java Collections Framework

Uso di metodi statici. Walter Didimo

Esempio su strutture dati dinamiche: ArrayList

Java Le stringhe. Stringhe

Esempio su strutture dati dinamiche: ArrayList

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

14 - Metodi e Costruttori

Introduzione Programmazione Java

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Esempio su strutture dati dinamiche: ArrayList

Corso sul linguaggio Java

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

Metodi statici. Dichiarazione e chiamata di metodi statici

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

Fondamenti di Informatica L-B Esercitazione n 6 Java: Collezioni, Classe Wrapper & Generics

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

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

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

Laboratorio di Programmazione 1 [Java]

Java: Compilatore e Interprete

GESTIONE DEGLI ERRORI

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Introduzione alla Programmazione in Java attraverso un esempio commentato

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Input. Il tipo char Alcune modalità di acquisizione di input. Laboratorio di Programmazione - Luca Tesei

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

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

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

Definizione di una classe

Programmazione Orientata agli Oggetti in Linguaggio Java

Concetto di Funzione e Procedura METODI in Java

Il linguaggio C. Puntatori e dintorni

3. Il sistema dei tipi I tipi wrapper

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

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

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

IL CONCETTO DI CLASSE

Unità B2.1. I tipi di dato

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

Programmazione ad oggetti

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

ESERCIZIO 1 (FILE DI TESTO)

Programmazione II Compitino (Vers. B)

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro

Definizione di metodi

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

ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:

Metodi. Un metodo è una porzione di codice a cui si associa un nome. Un istruzione eseguita da un metodo può essere:

Classi Wrapper. int Integer float Float char Char byte Byte double Double. classe "wrapper"

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5

Programmazione orientata agli oggetti Oggetti Composti. Oggetti composti

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Esempio 2: Subtyping

Java: Compilazione e Traduzione. Fondamenti di Informatica L-B Esercitazione n 3 Introduzione a JAVA. C: Editing, compilazione, esecuzione

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

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

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

Lezione 6 programmazione in Java

Laboratorio di Programmazione 1 [Java]

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Futures Esempi di codice

Fondamenti di informatica T-1 (A K) Esercitazione 2: Linguaggio Java, basi e controllo del flusso

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

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 16 Tipi riferimento e stringhe. Carla Limongelli.

Operazioni numeriche - Input

Laboratorio di Programmazione Anno Accademico

Esempio: Costruttori ed ereditarietà

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

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

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

Esercitazione n 2. Obiettivi

16 - Ereditarietà, tipi e gerarchie

Esonero di Informatica I. Ingegneria Medica

Modulo 2: Strutture fondamentali della programmazione Java

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

Il linguaggio Java: aggiunte in Java 1.5

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Programmazione 1 A.A. 2015/2016

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

Eredità e Polimorfismo in Java

Le variabili. Olga Scotti

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

Introduzione a Java. Riferimenti

3) Descrivere l architettura di un elaboratore tramite astrazione a livelli

Polimorfismo parametrico vs polimorfismo per inclusione

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algoritmi di Ricerca. Esempi di programmi Java

Corso di Laurea in Matematica Corso di Informatica Prova d Esame del 02/02/2010

La programmazione ad oggetti (OOP)

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

Programmazione II Compitino (Vers. A)

Transcript:

TIPI PRIMITIVI: LIMITI I tipi primitivi sono i "mattoni elementari" del linguaggio In varie situazioni può però essere necessario trattare i tipi primitivi come oggetti quando una funzione pretende come parametro (o restituisce) un Object quando occorre inserirli in una struttura dati (un array, uno stack, una lista..) che per ipotesi contiene degli Object Poiché una variabile di un tipo primitivo non è un oggetto, ciò non è direttamente possibile.

DAI TIPI PRIMITIVI AGLI OGGETTI Soluzione: costruirsi una classe che incapsuli una variabile di un tipo primitivo una classe MyInt che incapsuli un int una classe MyFloat che incapsuli un float... Ma non ce n'è bisogno: sono già fatte! Tali classi sono note in Java con l'appellativo di classi wrapper (classi "avvolgenti") Ogni classe wrapper ha un nome (quasi) identico al tipo primitivo che incapsula, ma con l iniziale maiuscola.

TIPI PRIMITIVI E CLASSI WRAPPER oggetto Integer int Ogni classe wrapper definisce metodi per estrarre il valore della variabile incapsulata e viceversa.

TIPI PRIMITIVI E CLASSI WRAPPER 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)...

CLASSI WRAPPER : FUNZIONALITÀ Cosa offre una classe wrapper? un costruttore per incapsulare un valore primitivo. Ad esempio, Integer wi = new Integer(33); un metodo per estrarre il valore incapsulato. Ad esempio, int k = wi.intvalue(); un metodo tostring per rappresentare come stringa il valore incapsulato. Ad esempio: System.out.println(wi);

CLASSI WRAPPER : FUNZIONALITÀ Cosa non offre una classe wrapper? operatori aritmetici per fare le operazioni. Ad esempio, non si può scrivere: new Integer(3) + new Integer(2); E allora come si fa? si estraggono i valori primitivi incapsulati, si svolgono le operazioni su essi, e infine si costruisce un nuovo oggetto: Integer wk = new Integer(wi.intValue() + wj.intvalue());

CLASSI WRAPPER - ESEMPIO 1 public class EsempioWrapper1 { public static void main(string args[]){ int x = 35; Integer wx = new Integer(x); Integer wy = new Integer(4); // Integer wz = wx + wy; // NO! System.out.println(wx); System.out.println(wy); Integer wz = new Integer( wx.intvalue() + wy.intvalue() ); System.out.println(wz); 35 4 39 Si passa nel dominio degli int per svolgere l'operazione di somma (che non esiste fra Integer)

CLASSI WRAPPER - ESEMPIO 2 public class EsempioWrapper2 { public static void main(string args[]){ Integer wx = new Integer(35); int x = 2 * wx.intvalue(); System.out.println("wx = " + wx); System.out.println("x = " + x); wx = 35 x = 70 La prima stampa usa la tostring di Integer per ottenere la stringa "35" e concatenarla alla costante "wx = " La seconda stampa usa invece la conversione automatica int/string per ottenere la stringa "70" da concatenare alla costante "x = "

CLASSI WRAPPER MA NON SOLO La classe wrapper non svolge solo la funzione di "classe avvolgente" per un tipo primitivo Nella sua parte statica ospita anche funzioni che operano sul tipo primitivo corrispondente Si tratta di funzioni (statiche) che non hanno nulla a che vedere con la classe wrapper in quanto ADT! Sono "messe lì" semplicemente perché si doveva pur metterle da qualche parte... (in Java, non possono esistere funzioni definite "fuori" da una qualche classe) e la classe wrapper era il posto più logico in cui metterle.

CLASSI WRAPPER : PARTE STATICA Quali funzioni statiche notevoli ospita? Conversione stringa / numero Conversione numero / stringa In effetti, una variabile di un tipo primitivo non è un oggetto, quindi non è possibile invocare su di essa un metodo nello stile "a invio di messaggi"! Occorre tornare allo stile "a funzioni" classico: NON valoreprimitivo.convertitiin() MA converti(valoreprimitivo, stringa)

CLASSI WRAPPER : PARTE STATICA Conversione stringa / numero Funzioni della forma parsexxx Ad esempio, per gli interi, int x = Integer.parseInt("-1234"); Questa funzione statica della classe Integer analizza una stringa fornita come parametro e, se rappresenta un valore intero, produce un int inizializzato a tale valore e lo restituisce (come la atoi del C).

CLASSI WRAPPER : PARTE STATICA E se non è un numero? Ad esempio, per gli interi, int x = Integer.parseInt("-ciao"); o anche int x = Integer.parseInt("7.54"); Cosa succede in questi casi? Errore: la conversione non ha senso, è una contraddizione che deve essere segnalata.

CONVERSIONI STRINGA / NUMERO Funzioni di conversione da stringa ai vari tipi di numeri: Versioni con specifica della base di conversione (per tipi interi):

CLASSI WRAPPER : PARTE STATICA Oltre alle funzioni parsexxx, che restituiscono un valore primitivo, esistono anche le funzioni (statiche) valueof, che restituiscono un oggetto della classe wrapper Ad esempio, per gli interi, Integer wx = Integer.valueOf("-1234"); Il risultato non è più un valore int (come nel caso di parseint) ma bensì una istanza di Integer

CONVERSIONI STRINGA / NUMERO Versioni che restituiscono un oggetto della classe wrapper: La funzione valueof esiste anche per i booleani: restituisce un oggetto Boolean che incapsula il valore boolean corrispondente alla stringa passata come parametro.

CLASSI WRAPPER : PARTE STATICA Conversione numero / stringa Per gli oggetti, la fa il metodo tostring E per i tipi primitivi? Vi siete mai chiesti come fa println a stampare int, float? E come fa il + a concatenare int, float a stringhe?? Esiste una funzione statica che svolge la stessa operazione per i tipi primitivi... e si chiama anche lei tostring!!

TIPI PRIMITIVI E CLASSI WRAPPER Esempio: tostring() nella classe Integer versione metodo: public String tostring(); è implicitamente invocato su un oggetto Integer ne recupera il valore e ne produce la rappresentazione sotto forma di stringa. versione funzione statica: public static String tostring(int x); prende un valore int e ne produce la rappresentazione sotto forma di stringa è implementata tipicamente appoggiandosi all altra per i Boolean è stata introdotta solo con il JDK 1.4

ESEMPIO public class EsempioWrapper3 { 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);

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

UN ESERCIZIO correlato

ESERCIZIO Problema Scrivere una funzione che scambi due interi non opera su oggetti fi funzione statica scritta dentro a una classe contenitore Quale signature? public static void scambia(...,... ) Forse questa? public static void scambia(int, int) NO: il passaggio sarebbe per valore!

ESERCIZIO Serve un passaggio per riferimento. Come ottenerlo in Java su un tipo primitivo?? Java non offre scelta: i tipi primitivi passano sempre e solo per valore! Solo gli oggetti passano per riferimento. Ma allora... basta definire una classe che incapsuli il tipo primitivo, e poi passare a scambia oggetti di quel tipo: public static void scambia(intbuf, IntBuf)

LA CLASSE IntBuf Definiamo una classe IntBuf che incapsuli il tipo primitivo int Costruttore: costruisce un oggetto IntBuf a partire da un int Metodo getvalue: recupera il valore int da un oggetto IntBuf Metodo setvalue: cambia il valore int contenuto in un oggetto IntBuf oggetto IntBuf int public class IntBuf { private int val; public IntBuf(int v) { val = v; public int getvalue() { return val; public void setvalue(int v) { val = v;

LA FUNZIONE scambia La funzione scambia può quindi lavorare su due oggetti IntBuf oggetto IntBuf int Per scambiare i valori di due oggetti a e b si salva in un temporaneo il valore dell'oggetto a si cambia il valore dell'oggetto a rendendolo pari a b si cambia il valore dell'oggetto b rendendolo pari all'intero temporaneo che ospita il vecchio valore di a

LA FUNZIONE scambia La funzione scambia può quindi lavorare su due oggetti IntBuf oggetto IntBuf int public class MyLib { public static void scambia(intbuf a, IntBuf b){ int temp = a.getvalue(); a.setvalue(b.getvalue()); b.setvalue(temp);

public class Prova { UN MAIN DI PROVA public static void main(string args[]){ int x = 10, y = 30; System.out.println("x, y = " + x + ", " + y); IntBuf a = new IntBuf(x), b = new IntBuf(y); System.out.println("a, b = " + a.getvalue() + ", " + b.getvalue()); MyLib.scambia(a,b); System.out.println("a, b = " + a.getvalue() + ", " + b.getvalue());

UN MAIN DI PROVA public class Prova { public static void main(string args[]){ int x = 10, y = 30; System.out.println("x, y = " + x + ", " + y); IntBuf a = new IntBuf(x), b = new IntBuf(y); System.out.println("a, b = " + a.getvalue() + ", "+ b.getvalue()); MyLib.scambia(a,b); System.out.println("a, b = " + a.getvalue() + ", "+ b.getvalue()); C:\temp>java Prova x, y = 10, 30 a, b = 10, 30 a, b = 30, 10

UNA RIFLESSIONE La classe IntBuf prevede un metodo che modifica il valore: Costruttore: costruisce un oggetto IntBuf a partire da un int Metodo getvalue: recupera il valore int da un oggetto IntBuf Metodo setvalue: cambia il valore int contenuto in un oggetto IntBuf oggetto IntBuf int public class IntBuf { private int val; public IntBuf(int v) { val = v; public int getvalue() { return val; public void setvalue(int v) { val = v;

UNA RIFLESSIONE Dunque: gli oggetti IntBuf non sono valori, sono contenitori il metodo setvalue appartiene alla categoria dei trasformatori oggetto IntBuf int public class IntBuf { private int val; public IntBuf(int v) { val = v; public int getvalue() { return val; public void setvalue(int v) { val = v;

CLASSI WRAPPER Java prevede già classi standard per incapsulare valori primitivi: le classi "wrapper" esse però sono valori non hanno trasformatori Il costruttore costruisce un oggetto "wrapper" a partire da un valore primitivo Un metodo permette di recuperare il valore primitivo incapsulato in un oggetto "wrapper" Dunque, le classi "wrapper" di Java non sono adatte a fungere da contenitori per ottenere il passaggio per riferimento di tipi primitivi.