Scope e visibilità per classi



Похожие документы
Programmazione ad oggetti

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

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

Il linguaggio Java. Concetti base. I packages

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

Dichiarazioni di import: Introduzione

L interfaccia grafica in Java

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:

Algoritmi di Ricerca. Esempi di programmi Java

Java: Compilatore e Interprete

Esercitazione n 4. Obiettivi

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Programmazione a Oggetti Lezione 10. Ereditarieta

Corso sul linguaggio Java

Introduzione a Classi e Oggetti

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

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

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

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

Inizializzazione, Assegnamento e Distruzione di Classi

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

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

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

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

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

Oggetti Lezione 3. aspetti generali e definizione di classi I

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

Le command line di Java

Telematica II 17. Esercitazione/Laboratorio 6

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

Progettazione di classi

Libreria standard Java possiede un enorme libreria di classi standard organizzata in vari package che raccolgono le classi secondo un organizzazione

Concetto di Funzione e Procedura METODI in Java

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

GESTIONE DEI PROCESSI

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

Multithreading in Java. Fondamenti di Sistemi Informativi

Grafico della parabola

Raffaella Brighi, a.a. 2005/06. Eventi e listener. Corso di Laboratorio II. A.A

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Eventi di azione. // con interfaccia per eventi di azione

RMI Remote Method Invocation

Java Virtual Machine

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

La struttura dati ad albero binario

Corso sul linguaggio Java

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

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

Programmazione Orientata agli Oggetti in Linguaggio Java

Interazioni col mondo: eventi

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

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

Controllo degli accessi

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Realizzazione di una classe con un associazione

Programmazione Java: Variabili membro, Metodi La parola chiave final

Esercizi della lezione 5 di Java

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

Architettura MVC-2: i JavaBeans

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Programmare in Java. Olga Scotti

Progettazione : Design Pattern Creazionali

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

GESTIONE INFORMATICA DEI DATI AZIENDALI

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione in Java Parte I: Fondamenti

RMI. Java RMI RMI. G. Prencipe

Programmazione a Oggetti Modulo B

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

UML Diagrammi delle classi. UML Diagramma classi 1

Visibilità dei Membri di una Classe

19. Introduzione al multi-threading

Modulo 4: Ereditarietà, interfacce e clonazione

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

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

INTERFACCE GRAFICHE IN JAVA CON SWING DISPENSE

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Programmazione ad oggetti

Corso di Informatica

Metodologie di progetto Estensione di classi Implementazione di interfacce Composizione

Introduzione JDBC interfaccia java.sql driver caricare i driver

Programmazione Orientata agli Oggetti in Linguaggio Java

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

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati

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

SAPIENZA Università di Roma, Facoltà di Ingegneria

I file di dati. Unità didattica D1 1

Livelli di astrazione

Java Applet. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

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

Programmazione ad Oggetti. Java Parte I

Introduzione alla programmazione Java. Dott. Ing. M. Banci, PhD

Транскрипт:

Scope e visibilità per classi

Packages Classi interne nelle loro diverse forme Interne / statiche / locali Utilizzo congiunto con interfacce Implementazione di iteratori Gestione di eventi

Packages Package: insieme di classi e interfacce in relazione Per formare un package basta inserire la direttiva package packagename; come prima istruzione nel file sorgente Una sola direttiva per file Classi contenute in file che non dichiarano packages vengono incluse in un package anonimo package anonimo OK solo per micro applicazioni, o in fase di sviluppo Continua

Packages Package Finalità Classe Tipica java.lang Supporto al linguaggio Math, String java.util Utilities Random java.io Input e Output PrintStream Java.awt Abstract Window Toolkit Color Java.applet Applets Applet Java.net Networking Socket Java.sql Accesso a database ResultSet Java.swing Ingerfaccia utente Swing JButton

Accesso agli elementi di un package Per accedere ai tipi di un package utilizziamo il nome qualificato java.util.scanner in = new java.util.scanner(system.in); Uso dei nomi qualificati verboso import permette sintesi import java.util.scanner; Scanner in = new Scanner(System.in)

Import di una classe import java.util.scanner; Scanner in = new Scanner(System.in) di tutte le classi di un package import java.util.*; Continua

Import Packages non formano gerarchie // import dei tipi di java.awt.color import java.awt.color.*; // import dei tipi di java.awt (non del package color!) import java.awt.*; Static import delle costanti e metodi statici dei tipi di un package import static java.lang.math.pi import static java.lang.math.*;.

Nomi di package Packages utili anche come namespaces per evitare conflitti di nomi (per classi/interfacce) Esempio, Java ha due classi Timer java.util.timer vs. javax.swing.timer Nomi di package devono essere univoci Convenzione: utilizziamo come prefissi domini internet, oppure indirizzi e-mail (in ordine inverso) it.unive.dais it.unive.dais.po Continua

Localizzazione di package Nomi di package devono essere consistenti con i path della directory che li contengono it.unive.dais.po.banking Deve essere contenuto in un folder/directory localizzato nel path corrispondente UNIX: <base directory>/it/unive/dais/po/banking WINDOWS: <base directory>\it\unive\dais\po\banking Continua

Localizzazione di package CLASSPATH: definisce le directory base dove localizzare i packages Spesso utili due directory base per file sorgenti (.java) per file compilati (.class) UNIX: export CLASSPATH=/home/po/java/src:/home/po/java/classes:. WINDOWS: set CLASSPATH=c:\home\po\java\src;\home\po\java\classes;.

Classi interne Una classe può essere dichiarata all interno di una classe, come i campi ed i metodi E a tutti gli effetti un elemento della classe che la racchiude (come campi e metodi). E riferibile da qualunque punto (e metodo) della classe in cui è dichiarata Può essere dichiarata private / public / protected static / non static

Classi interne Se private, una classe interna è visibile solo all interno della classe che la dichiara La classe interna ha accesso a tutti i campi della classe che la contiene se static solo ai campi static

Classi interne: static / non static Vale sempre la stessa regola Definiamo static tutte le classi interni non hanno necessità di riferire campi (non static) della classe che le include Ricordiamo static inner classes sono più efficienti possiamo comunque ottenere l accesso ai campi della classe esterna passandoli esplicitamente nel costruttore (in modo da poterli riferire nella classe interna).

Classi locali Classi che hanno interesse locale, possono essere dichiarate all interno di un metodo Se una classe è dichiarata localmente di un metodo può essere riferita solo nel corpo del metodo Continua

Classi locali: accesso a variabili esterne Da una classe locale possiamo riferire campi e metodi della classe esterna variabili locali final del metodo che la dichiara Da una classe locale a metodi static Da una classe locale a metodi static possiamo riferire campi e metodi static della classe esterna variabili locali final del metodo che la dichiara

Esempio: timer countdown

CountDownListener class CountDownListener implements ActionListener public CountDownListener(int initialcount) count = initialcount; public void actionperformed(actionevent event) if (count >= 0) System.out.println(count); if (count == 0) System.out.println("Liftoff!"); count--; private int count;

CountDownListener Soluzione con classi top-level public class CountDownTester public static void main(string[] args) CountDownListener listener = new CountDownListener(10); // Millisecondi tra due tick final int DELAY = 1000; Timer t = new Timer(DELAY, listener); t.start(); JOptionPane.showMessageDialog(null, "Quit?"); System.exit(0);

CountDownListener Con una classe interna class CountDownListener implements ActionListener public class CountDownTester public static void main(string[] args) CountDownListener listener = new CountDownListener(10); Timer t = new Timer(DELAY, listener); Continua

CountDownListener Con una classe interna (anche static?) public class CountDownTester class CountDownListener implements ActionListener public static void main(string[] args) CountDownListener listener = new CountDownListener(10); Timer t = new Timer(DELAY, listener);

CountDownListener Con una classe locale public class CountDownTester class CountDownListener implements ActionListener public static void main(string[] args) CountDownListener listener = new CountDownListener(10); Timer t = new Timer(DELAY, listener);

CountDownListener Con una classe locale public class CountDownTester public static void main(string[] args) class CountDownListener implements ActionListener CountDownListener listener = new CountDownListener(10); Timer t = new Timer(DELAY, listener);

Classi interne/locali anonime In molti casi le classi interne sono utilizzate per creare una sola istanza di una interfaccia Possono essere rese anonime se Implementano una interfaccia Hanno un default constructor Continua

Classi interne/locali public class CountDownTester public static void main(string[] args) CountDownListener listener = new CountDownListener(10); class CountDownListener implements ActionListener public CountDownListener(int initialcount) public void actionperformed(actionevent event) private int count = 10; Timer t = new Timer(DELAY, listener); t.start(); Rendiamo anonimizzabile Continua

Classi interne/locali public class CountDownTester public static void main(string[] args) CountDownListener listener = new CountDownListener(); class CountDownListener implements ActionListener public void actionperformed(actionevent event) private int count = 10; Timer t = new Timer(DELAY, listener); t.start(); Continua

Classi interne/locali anonime public class CountDownTester public static void main(string[] args) CountDownListener listener = new CountDownListener(10); class CountDownListener implements ActionListener() public void actionperformed(actionevent event) private int count = 10; Timer t = new Timer(DELAY, listener); t.start(); Continua

Classi interne/locali anonime public class CountDownTester public static void main(string[] args) ActionListener listener = new ActionListener() public void actionperformed(actionevent event) private int count = 10; Timer t = new Timer(DELAY, listener); t.start(); Continua

Classi interne/locali anonime Definite nel momento della loro istanzazione Hanno una sola istanza Non hanno qualificatori di accesso Implementano una interfaccia (o estendono una classe) quella menzionata nel costrutto new che le definisce (cf. java.sun.com/doc)

Domanda Con quale altro meccanismo potremmo garantire ad un metodi di una classe interna o locale l accesso ad una variabile esterna?

Risposta L alternativa è passare la variabile esterna come parametro per il costruttore della classe interna/locale, o per il metodo che deve accedere la variabile

Domanda Perché le variabili locali di un metodo devono essere final se acceduta da una classe locale?

Risposta Perché le variabili locali del metodo sono deallocate al termine al ritorno dal metodo, mentre le istanze della classe interna rimangono attive Per evitare riferimenti pendenti (dangling references), il valore della locale viene copiato nella classe interna (e dunque modifiche alla locale non verrebbero percepite dalla classe interna)

Esempio / LinkedLists Implementazione standard, con elementi collegati tra loro La struttura interna è mascherata gli elementi sono visitabili utilizzando un iteratore

Esempio / LinkedLists public class LinkedList<E> implements List<E> private Node<E> first; public ListIterator<E> mkiterator()

ListIterator<E> Fornisce accesso agli elementi contenuti in una LinkedList<E> Tiene traccia di una posizione all interno della lista Maschera la struttura interna e allo stesso tempo permette l accesso

Visione Concettuale Un cursore che scorre gli elementi della lista

ListIterator<E> Il metodo mkiterator associa l iteratore alla lista posiziona l iteratore sul primo elemento della lista Il metodo next() sposta il cursore sul prossimo elemento restituisce l elemento puntato prima del movimento NoSuchElementException se non c è un prossimo elemento Il metodo hasnext() restituisce true se esiste un prossimo elemento

ListIterator<E> LinkedList<String> mailbox = ; ListIterator<String> iterator = mailbox.mkiterator(); while iterator.hasnext() String email = iterator.next(); Do something with email NB: il metodo next() restituisce l elemento a cui l iteratore punta prima dello spostamento

ListIterator<E> Abbreviazione: for (String email: mailbox) Do something with email Dietro le quinte, il for loop usa un iteratore per visitare tutti gli elementi della lista

ListIterator<E> interface ListIterator<E> extends Iterator<E> // restituisce il prossimo elemento // NoSuchElementException se non esiste prossimo E next(); // true se esiste un prossimo elemento public boolean hasnext(); // aggiunge un elemento prima di next: opzionale // UnsupportedException se non implementata void add(e e);

LinkedListIterator<E> Implementa una versione semplificata dell interfaccia ListIterator<E> Realizzata come classe interna della classe LinkedList Ha accesso al campo first della lista ed alla classe interna Nodo Clienti di LinkedList non conoscono il nome della classe che viene mascherata dall interfaccia

LinkedListIterator<E> // classe interna a LinkedList<E> class LinkedListIterator<E> implements ListIterator<E> private E current = first; // first della classe esterna public E next() if (!hasnext()) thrown new NoSuchElementException(); E result = current.info; current = current.next; return result; public boolean hasnext() return current!= null;

LinkedList<E> class LinkedList<E> implements List<E> private Node E info; Node next; private class LinkedListIterator<E> implements ListIterator<E> // vedi slide precedente public ListIterator<E> mkiterator() return new LinkedListIterator<E>();