Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Documenti analoghi
R. Focardi 2002 Laboratorio di Ingegneria del Software Slide 1. Applicazioni = programmi stand-alone

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Fondamenti di Informatica I

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Le basi del linguaggio Java

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

Programmazione Java: Variabili membro, Metodi La parola chiave final

OO puro. Primi concetti di Java. Tipi primitivi. Ogni cosa è un oggetto. Java è object-oriented puro Non come il C+ + (OO ibrido) Lorenzo Bettini

Laboratorio di programmazione

Proprietà delle Classi e degli Oggetti in Java

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

Eredità e Polimorfismo in Java

Oggetti Lezione 3. aspetti generali e definizione di classi I

Il linguaggio C. Notate che...

Esempio su strutture dati dinamiche: ArrayList

Programmazione Orientata agli Oggetti in Linguaggio Java

Laboratorio di Programmazione 1 [Java]

Programmazione 1 A.A. 2015/2016

Ereditarietà e Polimorfismo

Uso di metodi statici. Walter Didimo

Fondamenti di Informatica T-1. Costruttori Ereditarietà

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

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

INTRODUZIONE INTRODUZIONE JAVA JAVA

Le variabili. Olga Scotti

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

Definizione di classi

Programmazione in Java (I modulo)

LABORATORIO DI INFORMATICA: PROGRAMMAZIONE

Gerarchia di classi Java 1

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

Il linguaggio C# Struct e Classi

Introduzione a Classi e Oggetti

Lezione 9 programmazione in Java Classi come contenitori

Programmazione ad Oggetti

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Linguaggio C - sezione dichiarativa: costanti e variabili

Definizione di metodi in Java

Esercizio 3. Oppure fare queste operazioni nel metodo main all interno della classe Persona.

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Specifica: la sintassi. Specifica: la semantica. Specifica: la semantica

Java Native Interface Appunti

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

4 GLI ARRAY E LE STRINGHE

Informatica Generale Andrea Corradini I linguaggi di programmazione

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Corso sul linguaggio Java

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Fondamenti di Informatica T1 Mappe

Programmazione I. 11 gennaio Considerate la seguente gerarchia di classi (rappresentata mediante un diagramma UML): +f(double x):

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Transcript:

Programmazione Java Struttura di una classe, Costruttore, Riferimento this romina.eramo@univaq.it http://www.di.univaq.it/romina.eramo/tlp

Roadmap > Struttura di una classe > Costruttore > Riferimento this > Inizializzazione di dati static

Struttura di una classe [ public abstract final ] class <nome della classe> [extends Tipo] [implements ListaTipi] { [<dichiarazione di attributi>] [<dichiarazione dei costruttori>] [<dichiarazione dei metodi>] Corpo della classe

( 2 ) Struttura di una classe Esempio public class Point { private int x, y; public Point(int dx, int dy) { x = dx; y = dy; public void move(int dx, int dy) { x += dx; y += dy;

( 3 ) Struttura di una classe Attributi <modificatore> <tipo> <identificatore> [ = <inizializzazione> ] Esempio public class Point { private int x; private int y = 100;

( 4 ) Struttura di una classe Metodo <modificatore> <tipo ritorno> <identificatore> ([lista parametri]) { Esempio [<istruzioni>] public class Point { private int x, y; public void move(int dx, int dy) { x += dx; y += dy;

( 5 ) Struttura di una classe Costruttore <modificatore> <nome della classe> ([<lista parametri>]) { [<istruzioni>] Esempio E possibile ometterlo, in tal caso verrà considerato il modificatore package public class Persona { private String nome; public Persona(String n) { nome = n;

( 6 ) Struttura di una classe Accesso ai membri di un oggetto <oggetto>.<membro> Il membro può essere sia un attributo che un metodo Esempi p.move(50,50); p.x = 100;

Inizializzazione ed eliminazione In linguaggi come il C molti errori si verificano quando il programmatore dimentica di inizializzare una variabile Anche l eliminazione può comportare problemi: è facile dimenticarsi di un elemento quando si smette di utilizzarlo» Le risorse utilizzate da quell elemento vengono trattenute ed è facile che si esauriscano C++ ha introdotto il concetto di costruttore, un metodo speciale che viene automaticamente chiamato quando si crea un oggetto Anche Java ha adottato il costruttore, in più ha un garbage collector per gestire l eliminazione degli oggetti non più utilizzati

Overloading Si ha overloading quando una classe contiene due o più metodi (statici e non) con» Stesso nome» Diversa segnatura Numero di parametri diversi Stesso numero di parametri ma tipo diverso in almeno uno Tipo di ritorno non considerato Esempio public void print(int i) public void print(float f) public void print(string s) public void print(string s, int x) public void print(int x, String s)

Overloading: distinguere i metodi ridefiniti Ciascun metodo ridefinito deve avere una lista univoca di tipi degli argomenti» Persino le differenze nell ordine degli argomenti sono sufficienti per distinguere fra due metodi (anche se normalmente si preferisce non seguire questo approccio, perche genera codice difficile da gestire) Esempio» vedere OverloadingOrder.java

Overloading: ridefinizione con tipi di dato primitivi Un tipo di dato primitivo può essere automaticamente promosso da un tipo minore a uno maggiore Cosa accade quando un tipo di dato primitivo viene passato a un metodo ridefinito?» vedere PrimitiveOverloading.java» Nell esempio il valore costante 5 viene trattato come un int, per cui se è disponibile un metodo ridefinito che richiede un parametro di tipo int esso viene utilizzato» In tutti gli altri casi, se si ha un tipo di dato che è più piccolo del tipo dell argomento del metodo, quel tipo di dato viene promosso» Char produce un effetto leggermente diverso, se non trova un esatta corrispondenza, viene promosso a int

Overloading: ridefinizione con tipi di dato primitivi Cosa accade se il tipo dell argomento è più grande del tipo dell argomento previsto dal metodo ridefinito?» vedere Demotion.java» Occorre effettuare un cast nel tipo necessario utilizzando il tipo tra parentesi, altrimenti il compilatore genererà un messaggio di errore

( 1 ) Costruttore Viene utilizzato per creare un oggetto Sintassi [ public private protected ] nomeclasse (lista parametri) { body Viene fornito un costruttore di default qualora non se ne dichiari uno» Non prende argomenti e non ha corpo» Se è presente un costruttore quello di default scompare E possibile effettuare l overloading anche dei costruttori Esempio public class Point { public Point(int x, int y) { (vedere DefaultConstructor.java, Overloading.java)

( 2 ) Costruttore Point origin_one = new Point(23, 94); Rectangle rect_one = new Rectangle(origin_one, 100, 200); Rectangle rect_two = new Rectangle(50, 100); Dichiarazione» E necessario dichiarare una variabile con un tipo che rappresenta l oggetto Istanziazione» Operatore new crea un nuovo oggetto» Viene allocato nell heap dello spazio per contenere l oggetto» Se non c è spazio sufficiente viene lanciata eccezione OutOfMemoryError» Tutte le variabili di istanza vengono inizializzate al loro valore di default

( 3 ) Costruttore Inizializzazione 1. Vengono assegnati i valori ai parametri formali del ( sono costruttore (se ce ne 2. Vengono eseguiti le inizializzazioni esplicite delle variabili di istanza come appaiono nel codice sorgente 3. Vengono eseguiti gli inizializzatori di istanza 4. Viene eseguito il corpo del costruttore Se il corpo inizia con l invocazione di un altro costruttore (this) si ritorna al passo 1 Altrimenti viene invocato il costruttore (ripetendo i passi) del padre (super) fino ad arrivare ad Object (vedi ConstructorOrder.java, Flower.java, ConstructorOrder2.java, ConstructorOrder3.java)

( 4 ) Costruttore Valore di default per le variabili di istanza (valido ( classe anche per quelle di» byte: (byte)0» short: (short)0» int: 0» float: 0F» double: 0» char: \u0000» boolean: false» reference: null

( 5 ) Costruttore class Point { int x = 100; int y = 100; { x = 200; y = 200; Point() { x = 300; y = 300; Point(int dx, int dy) { this(); x = dx; y = dy;

( 6 ) Costruttore class ColoredPoint extends Point { int color = 0xFF00FF; class ConstructorPoint{ public static void main(string[] args) { ColoredPoint cp = new ColoredPoint(); System.out.println(cp.color); (vedi ConstructorPoint.java)

Ordine di inizializzazione All interno di una classe, l ordine di inizializzazione è determinato dall ordine in cui le variabili sono definite nella classe Le definizioni delle variabili possono essere sparpagliate tra le definizioni dei metodi, ma vengono sempre inizializzate prima che venga chiamato un metodo perfino il costruttore (Vedere OrderOfInitialization.java)

( 1 ) Riferimento this Indica il riferimento all oggetto stesso Viene utilizzato nei seguenti ambiti» Per invocare all interno di un costruttore un altro» All interno di metodi e/o costruttori per riferirsi a variabili di istanza e/o metodi (vedere Leaf.java)

( 2 ) Riferimento this public class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; public Point(Point p) { this.x = p.x; this.y = p.y; public void move(int x, int y) { this.x = x; this.y = y; public Point clonepoint() { return new Point(this);

( 3 ) Riferimento this public class Test { public static void main(string[] args) { Point p = new Point(100, 100); Point p1 = p.clonepoint(); p.move(200, 200); System.out.println( p.x: + p.x); System.out.println( p.y: + p.y); System.out.println( p1.x: + p1.x); System.out.println( p1.y: + p1.y); (Vedere This2.java)

this and static Non si può usare this per invocare un particolare metodo statico Non si possono chiamare metodi non static all interno di metodi static (anche se si può fare il contrario) Con un metodo static non si invia un messaggio a un oggetto, poichè non c e this (Vedere Static.java)

Esercizio Date le classi class Point { int x; int y; Point (int x1, int y1) { x = x1; y = y1; double distancetoorigin() { return sqrt(x * x + y * y); class Line { Point pt1; Point pt2; Line (Point p, Point q){ pt1 = p; pt2 = q; scrivere per Point e Line un metodo equals tale che pt1.equals(pt2) ritorna true se i due punti coincidono, l1.equals(l2) ritorna true se le due linee coincidono