Programmazione ad oggetti

Documenti analoghi
Scope e visibilità per classi

Programmazione ad oggetti

Il linguaggio Java. Concetti base. I packages

Java: Compilatore e Interprete

Programmazione a Oggetti Lezione 10. Ereditarieta

Parola chiave extends

I metodi statici -1. Variabili statiche Vogliamo assegnare a ciascuncontoun numeroidentificativo diverso. I metodi statici -2

Oggetti Lezione 3. aspetti generali e definizione di classi I

Modulo 4: Ereditarietà, interfacce e clonazione

Dichiarazioni di import: Introduzione

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Inizializzazione, Assegnamento e Distruzione di Classi

Programmazione a Oggetti Modulo B

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Esempio: il conto bancario

Introduzione a Classi e Oggetti

Esercitazione n 4. Obiettivi

! Programmazione strutturata ! TDA. ! Classi, incapsulamento, ! OO. ! Scambio messaggi, eredità, polimorfismo. ! OO in Java

Telematica II 17. Esercitazione/Laboratorio 6

Test di unità con JUnit4

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Corso Linguaggi di programmazione II - Unina Esercitazione (prova intercorso)

Progettazione : Design Pattern Creazionali

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

Concetto di Funzione e Procedura METODI in Java

Visibilità dei Membri di una Classe

Programmazione Java: Variabili membro, Metodi La parola chiave final

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

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Controllo degli accessi

Programmazione in Java Parte I: Fondamenti

Prova Finale a.a. 2011/2012. Laboratorio 1: Introduzione a Java e Eclipse

Realizzazione di una classe con un associazione

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Java Virtual Machine

Programmazione Orientata agli Oggetti in Linguaggio Java

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Carte Laurea triennale in Comunicazione Digitale Laboratorio di Informatica Generale

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Programmazione ad Oggetti. Java Parte I

Object Oriented Programming

P a s q u a l e t t i V e r o n i c a

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Corso di Programmazione ad Oggetti

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Informatica 3. LEZIONE 7: Fondamenti di programmazione orientata agli oggetti (1)

Linguaggio Java. Robusto. Orientato agli oggetti. Protegge e gestisce dagli errori. Non permette costrutti pericolosi

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Multithreading in Java. Fondamenti di Sistemi Informativi

Livelli di astrazione

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

JAIL: Javacard Abstract Interpretation-based Lifeguard

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

GESTIONE DEI PROCESSI

Progettazione di classi

esercizi Esercizi / problemi

Main System Monitor Keyboard

Programmazione Orientata agli Oggetti in Linguaggio Java

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

Funzioni in C. Violetta Lonati

Database. Si ringrazia Marco Bertini per le slides

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

I Canvas. import java.awt.*; import javax.swing.*; public class Graf{ public Graf () { JFrame f = new JFrame("Finestra"); // crea frame invisibile

costruttori e distruttori

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Eredità in C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

RMI: metodi equals e hashcode

Synchronized (ancora)

Tutorial per l installazione del J2SE 6 e configurazione del sistema operativo

Il web server Apache Lezione n. 3. Introduzione

Laboratorio di Basi di Dati

L interfaccia grafica in Java

DATI IDENTIFICATIVI DEL PROGETTO

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

RMI Remote Method Invocation

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Il Gestore Eventi di OpenSPCoop i. Il Gestore Eventi di OpenSPCoop

Eclipse. Avviare un progetto e compilare un semplice programma

UML Diagrammi delle classi. UML Diagramma classi 1

La struttura dati ad albero binario

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Prova di Laboratorio di Programmazione

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Transcript:

DAIS Univ. Ca' Foscari Venezia Programmazione ad oggetti Samuel Rota Bulò

Classi astratte Le classi astratte sono un ibrido tra le classi concrete e le interfacce. Hanno le stesse caratteristiche di una classe concreta con 2 differenze principali: possono contenere metodi astratti, di cui si specifica solo la firma e saranno le sottoclassi che eventualmente forniranno un'implementazione non possono essere istanziati oggetti di una classe astratta direttamente Una classe astratta, sebbene non sia istanziabile, può avere costruttori invocabili dalle eventuali sue sottoclassi. public abstract class NomeClasse //campi //costruttori //metodi con implementazione //metodi astratti

Metodi astratti Un metodo viene dichiarato astratto aggiungendo la keyword abstract. public abstract nomemetodo(tipo nomeparam, tipo nomeparam, ); Un metodo astratto non fornisce l'implementazione del metodo. Una sottoclasse che estende una classe astratta può fare l'overriding di un metodo astratto per fornirne l'implementazione. Se non lo fa dovrà essere definita a sua volta classe astratta. Una classe astratta può non avere metodi astratti ma, essendo dichiarata astratta, non può comunque essere istanziata.

public abstract class AccountTransaction{ private BankAccount bacc; Esempio public AccountTransaction(BankAccount bacc){ this.bacc=bacc; public BankAccount getbankaccount(){ return bacc; public abstract void esegui(); //metodo astratto public class Prelievo extends AccountTransaction{ private double amount; public Prelievo(BankAccount bacc,double amount){ super(bacc); this.amount=amount; public void esegui(){ getbankaccount().withdraw(amount);

Metodi e classi final Aggiungendo ad un metodo la keyword final impediamo l'overriding del metodo in una sottoclasse. Se aggiungiamo la keyword final alla dichiarazione di classe questa non sarà estendibile da altre classi. Motivazioni: efficienza: metodi final hanno dispatch statico e quindi la virtual machine non ha l'overhead della ricerca del metodo da invocare a runtime. sicurezza: impediamo che qualcuno possa by-passare un check di controllo estendendo la classe.

Modalità di accesso Java ha 4 livelli di accesso agli elementi di una classe: public: accessibile dai metodi di qualunque classe private: accessibile dai metodi della stessa classe protected: accessibile dai metodi di una sottoclasse package (default): accessibile dai metodi di tutte le classi dello stesso package. public abstract class AccountTransaction{ private BankAccount bacc; protected AccountTransaction(BankAccount bacc){ this.bacc=bacc; protected BankAccount getbankaccount(){ return bacc; public abstract void esegui(); //metodo astratto

La classe Object Tutte le classe che non estendono esplicitamente una classe estendono la classe Object. La classe Object definisce alcuni metodi tra cui: String tostring() serve per descrivere l'oggetto con una stringa in Object ritorna il nome della classe + hashcode dell'oggetto boolean equals(object anotherobject) serve per confrontare due oggetti in Object ha la stessa semantica di == (confronto dei riferimenti) Object clone() effetua una copia fisica dell'oggetto Spesso questi metodi sono ridefiniti public class BankAccount{... public String tostring(){ return BankAccount[balance= +balance+ ] ;

equals public class Rectangle{ boolean equals(object anotherrectangle){ if(anotherrectangle!=null && anotherrectangle instanceof Rectangle) { Rectangle r=(rectangle) anotherrectangle; return width==r.width && height==r.height && x==r.x && y==r.y; return false;

clone Quando assegnamo riferimenti effettuiamo una copia dei riferimenti ma non degli oggetti Il metodo clone ritorna un nuovo oggetto i cui campi sono una copia dei campi dell'oggetto su cui clone è invocato. Attenzione: la clonazione non avviene ricorsivamente su eventuali campi riferimento ad oggetto. Se vogliamo creare una copia degli oggetti a cui dei campi riferiscono dobbiamo ridefinire il metodo clone. Il metodo clone è protected per proibirne l'invocazione se non è stato ridefinito esplicitamente. Il metodo clone di Object controlla che this implementi l'interfaccia Clonable. In caso contrario, lancia un'eccezione. Clone ritorna un Object che andrà opportunamente convertito previo casting.

Packages

Packages Insieme di classi e interfacce in relazione Le classi appartenenti ad un package hanno come prima istruzione la direttiva: package nomepackage; Può esserci una sola direttiva package per file sorgente. Classi che non dichiarano il package di appartenenza vengono incluse in un package anonimo. è buona norma assegnare tutte le classi ad un package, evitando il package anonimo.

Packages Package java.lang java.util java.io java.awt java.applet java.net java.sql java.swing Finalità Supporto al linguaggio Utilità Input/Output Interfacce utente AWT Applets Networking Database Interfaccia utente Swing......

Accesso ai package Per accedere alle classi di un package utilizziamo il nome qualificato java.util.scanner in = new java.util.scanner(system.in); con la direttiva import possiamo evitare l'uso verboso del nome qualificato: import java.util.scanner;... Scanner in = new Scanner(System.in); possiamo importare in un colpo tutte le classi di un package (ma non dei sottopackage) import java.util.*; possiamo importare anche costanti e metodi statici con la keyword import static import static java.lang.math.pi; import static java.lang.math.*;

Nomi di package Packages sono utili anche come namespaces per evitare conflitti di nomi (di classi/interfacce) per es: java.util.timer e javax.swing.timer I nomi dei package devono essere univoci convenzione: utlizzare i prefissi dei domini internet o degli indirizzi email (in ordine inverso) es: it.unive.dais Il nome di un package deve essere consistente con i path della directory che lo contiene it.unive.dais deve essere localizzato in <base dir>/it/unive/dais CLASSPATH: definisce le directory base o gli archivi JAR in cui localizzare i packages spesso sono usate due directory distinte per sorgenti e compilati

Classi annidate

Classi annidate Una classe può essere dichiarata all'interno di un'altra classe (classe annidata) Una classe annidata è riferibile da qualunque punto della classe in cui è dichiarata e in particolari casi anche esternamente Può essere dichiarata come private, public, protected static, non static Quando usarle: se è utile solo per la classe in cui è dichiarata per aumentare l'incapsulamento per rendere il codice più leggibile a manutenibile

Classi annidate class OuterClass{... class NestedClass{... Modalità di accesso: private: sono visibili solo per la classe in cui è dichiarata protected: visibili solo dalle sottoclassi della classe in cui è dichiarata public: visibili anche all'esterno package: visibile dalle classi nello stesso package della classe in cui è dichiarata

Classi annidate: statiche Classi annidate statiche: possono accedere ai metodi e campi statici della classe in cui sono dichiarate non possono accedere a metodi e variabili di istanza esternamente possiamo accedere alla classe statica annidata usando il nome della classe che la include: OuterClass.StaticNestedClass public class OuterClass{... public static class StaticNestedClass{... OuterClass.StaticNestedClass nestedobject=new OuterClass.StaticNestedClass();

Classi interne public class OuterClass{... public class InnerClass{... OuterClass outerobject=new OuterClass(); OuterClass.InnerClass innerobject=outerobject.new InnerClass(); Classi annidate non-statiche (o interne): ogni istanza della classe interna è legata ad un'istanza della classe che la include OuterClass.this: riferimento dell'istanza della classe esterna a cui l'istanza della classe interna è legata dai metodi della classe interna possiamo accedere a metodi e campi della classe in cui sono dichiarate (anche d'istanza)

Esempio public class IntList{ private int[] elements; private int size; public IntList(int maxsize){ elements=new int[maxsize]; public void add(int i){elements[size++]=i; public ListIterator iterator(){return new ListIterator(); public class ListIterator{ private int pos; public boolean hasnext(){ return pos<size; public int next(){ int i=elements[pos++]; return i;

Classi interne locali Una classe locale è una classe che viene dichiarata all'interno di un metodo Una classe locale può essere riferita solo nel corpo del metodo in cui è dichiarata Possiamo riferire a: campi e metodi della classe esterna variabili locali costanti (final) Se il metodo in cui è inserita è statico, allora potremo accedere solo a campi e metodi statici della classe esterna. Una classe locale non può avere metodi, o campi non costanti, statici. Può avere costanti statiche. Una classe locale non può essere: private, public, protected e static.

Classi locali anonime Consentono di creare una classe al volo per istanziare un singolo oggetto. Una classe anonima viene creata estendendo una classe già esistente o fornendo l'implementazione di un'interfaccia. A differenza delle dichiarazioni di classe viste finora, sono create all'interno di un'espressione. Quando usarle: la classe ha un corpo corto è necessaria solo un'istanza della classe la classe viene utilizzata immediatamente dopo la sua definizione il nome della classe non rende il codice più leggibile new classname(param1,...,paramn){ class-body oppure new interface-name(){class-body

Esempio public interface ListIterator{ boolean hasnext(); int next(); public class IntList{ private int[] elements; private int size; public IntList(int maxsize){ elements=new int[maxsize]; public void add(int i){elements[size++]=i; public ListIterator iterator(){ return new ListIterator(){ private int pos; public boolean hasnext(){ return pos<size; public int next(){ int i=elements[pos++]; return i;