Programmazione Java: Variabili membro, Metodi La parola chiave final

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

Classi ed Oggetti in JAVA

Programmazione a Oggetti Lezione 10. Ereditarieta

Oggetti Lezione 3. aspetti generali e definizione di classi I

Java: Compilatore e Interprete

Modulo 4: Ereditarietà, interfacce e clonazione

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:Struttura di Programma. Fabio Scanu a.s. 2014/2015

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

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

Parola chiave extends

Esercizi della lezione 5 di Java

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

Introduzione a Classi e Oggetti

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

Inizializzazione, Assegnamento e Distruzione di Classi

Funzioni in C. Violetta Lonati

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

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

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

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

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

Concetto di Funzione e Procedura METODI in Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Introduzione alla programmazione in C

Le variabili. Olga Scotti

Ottava Esercitazione. introduzione ai thread java mutua esclusione

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

Prova di Laboratorio di Programmazione

costruttori e distruttori

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

Telematica II 17. Esercitazione/Laboratorio 6

Introduzione al linguaggio C Gli array

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

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

UML Diagrammi delle classi. UML Diagramma classi 1

Pila di interi. Car 1. Car n. Pila di interi: Pila di Oggetti: Gli elementi che sono inseriti e tolti dalla pila sono numeri interi

Controllo degli accessi

Progettazione : Design Pattern Creazionali

Architettura MVC-2: i JavaBeans

Programmazione a Oggetti Modulo B

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

Fondamenti di Informatica C Esercitazioni di Laboratorio / 3 Outline

Corso di Informatica

Programmazione ad Oggetti: JAVA. Esercitazione

Un esercizio d esame. Flavio De Paoli

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

Esercitazione n 4. Obiettivi

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

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

Corso di Fondamenti di Informatica

Multithreading in Java. Fondamenti di Sistemi Informativi

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

Object Oriented Programming

Client e Server comunicano tramite il protocollo SOAP.

Come si può vedere, la regola è stata fatta in modo da spostare tutti i messaggi di Spam nella cartella del cestino.

Realizzazione di una classe con un associazione

Visibilità dei Membri di una Classe

Livelli di astrazione

esercizi Esercizi / problemi

GESTIONE DEI PROCESSI

Programmare in Java. Olga Scotti

Main System Monitor Keyboard

Eclipse. Avviare un progetto e compilare un semplice programma

Algoritmi di Ricerca. Esempi di programmi Java

Soluzione dell esercizio del 2 Febbraio 2004

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Struttura di un programma Java

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

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

Programmazione Orientata agli Oggetti in Linguaggio Java

dall argomento argomento della malloc()

Object Oriented Software Design

Allocazione dinamica della memoria - riepilogo

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

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

La struttura dati ad albero binario

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

Java Virtual Machine

Appunti di Informatica 1

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

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Programmazione Orientata agli Oggetti in Linguaggio Java

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

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Corso Eclipse. Prerequisiti. 1 Introduzione

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

Scrivere un programma in Java


Informatica. Prof. A. Longheu. Introduzione ai Linguaggi Object-Oriented

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

Definizione di classi con array di oggetti

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

19. LA PROGRAMMAZIONE LATO SERVER

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Programmazione ad oggetti

Transcript:

Programmazione Java: Variabili membro, Metodi La parola chiave final romina.eramo@univaq.it http://www.di.univaq.it/romina.eramo/tlp

Roadmap Definire una classe» Variabili membro» Metodi La parola chiave final

Definire una classe Programmare in Java significa definire classi» oltre che creare oggetti da queste classi» e inviare messaggi a questi oggetti Quando si definisce una classe è possibile includere due tipi di elementi (membri):» i campi, chiamati anche attributi o variabili membro o membri dati» i metodi, noti anche come funzioni membro Una volta dichiarati i membri di una classe, è possibile accedere ad essi utilizzando il carattere. : <nome_oggetto>.<nome_membro>

Definire una classe (2) Quando progettiamo una classe, decidiamo quali metodi e quali campi essa contiene:» i campi e i metodi definiti in una classe saranno poi utilizzati dall esterno della classe dal programmatore (con le debite limitazioni) Questo modo di pensare al design di una classe come ad un processo di creazione di elementi visibili dal programmatore, ci porta a vedere i campi e i metodi di una classe come una interfaccia della classe:» cioè possiamo pensare all oggetto come ad una scatola nera di cui noi vediamo solamente l interfaccia» inoltre possiamo anche non interessarci a come tale interfaccia è stata implementata

Progettare l interfaccia Quindi per definire una classe è opportuno prima pensare all interfaccia della classe, cioè a cosa quella classe deve mostrare al mondo esterno:» Rectangle -> translate, rotate, ecc E possibile definire dei metodi e delle variabili di una classe non visibili all esterno e quindi utilizzabili solamente dall interno della classe:» tali elementi non faranno parte dell interfaccia della classe ma serviranno alla classe stessa per realizzare operazioni interne

Proteggere l accesso dei membri Quando progettiamo una classe è necessario individuare ciò che sarà possibile utilizzare e cosa invece è solamente necessario al corretto funzionamento della classe:» nel secondo caso, diventa pericoloso permettere che altre classi possano modificare variabili o utilizzare funzioni pensate per lavorare sullo stato interno della classe stessa Esistono perciò diversi tipi di elementi membro di una classe:» public, la cui visibilità è totale: le variabili così sono leggibili e modificabili e le funzioni sono invocabili da chiunque» private, la cui visibilità è ristretta alla classe proprietaria» protected, la cui visibilità è limitata alle classi derivate

Variabili membro Una volta aperta la definizione di una classe, è possibile dichiarare le variabili membro della classe Tale dichiarazione avviene con una semplice istruzione di dichiarazione di variabile: public class Prova { public int a; private double b; Car auto; In tale forma le variabili non sono inizializzate e sarà necessario farlo o nel costruttore oppure nel codice di qualche metodo, comunque prima che vengano utilizzate

membro Variabili Sintassi [modificatoriaccesso] [static final transient volatile]* <tipo> <nome> modificatoriaccesso = [ public private protected ] Non possono apparire più di una volta Esempio» public static final String HELLO = Hello ;

Variabili membro E possibile però utilizzare la forma di dichiarazione delle variabili con inizializzazione immediata: public class Prova { public int x=3; private double b=2.3; Tale inizializzazione ha il risultato di inizializzare le variabili ai valori prescelti a tempo di costruzione, ossia come se tale inizializzazione fosse fatta nel costruttore

Metodi Sintassi [modificatoriaccesso] [ static abstract final native synchronized ]* ( nomemetodo(listaparametri tiporitorno [ throws exceptions] modificatoriaccesso = [ public private protected ] Non possono apparire più di una volta Esempio public static final String gethello() { return Hello World ;

Metodi Oltre alle variabili membro, è possibile specificare funzioni membro per una classe La dichiarazione di una funzione membro è del tutto simile ad una dichiarazione di funzione normale: public void translate(int dx, int dy, Car C) JAVA prevede di implementare la classe in fase di dichiarazione, quindi alla sintassi qui sopra seguirà immediatamente il blocco di implementazione: public void translate(int dx, int dy, Car C) { x=x+dx; y=y+dy; C.color= white ;

Metodi public class Rectangle { /** Variabili membro : coordinate del vertice alto a sx */ private int x; private int y; /** * Funzione membro : sposta il rect di dx e dy * @param dx * @param dy */ public void translate(int dx, int dy, Car C) { x = x + dx; y = y + dy; C.color = white ;

La parola chiave final Ha significati diversi a seconda del contesto, ma in generale dice: Questo non può essere cambiato Può essere utilizzato in tre casi:» Dati» Metodi» Classi

La parola chiave final > Dati Modo per dire al compilatore che un dato è costante Una costante è utile per due ragioni:» Può essere una costante nota in fase di compilazione che non cambierà mai Il compilatore può scrivere direttamente il valore costante in qualsiasi calcolo dove esso è utilizzato» Può essere un valore inizializzato in fase di esecuzione che non si vuole cambiare

La parola chiave final > Dati Indica una variabile (di istanza o di classe) che può essere assegnata una sola volta ovvero costante Una volta assegnata non può essere più modificata» Tipo reference non può essere modificato il riferimento» Valori all interno dell oggetto possono essere modificati Java non fornisce un modo per rendere costante un oggetto arbitrario. Questa limitazione comprende anche gli array Generalmente le costanti scritte in maiuscolo Generalmente vengono utilizzate in congiunzione con parola chiave static const parola chiave riservata ma non utilizzata

La parola chiave final > Dati public class FinalData { private static Random rand = new Random(); private String id; public FinalData(String id) { this.id = id; // Can be compile-time constants: Entrambi possono essere private final int VAL_ONE = 9; utilizzati come costanti in private static final int VAL_TWO = 99; fase di compilazione // Typical public constant: public static final int VAL_THREE = 39; // Cannot be compile-time constants: private final int i4 = rand.nextint(20); static final int i5 = rand.nextint(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value v3 = new Value(33); // Arrays: private final int[] a = { 1, 2, 3, 4, 5, 6 ; public String tostring() { return id + ": " + "i4 = " + i4 + ", i5 = " + i5; (vedere FinalData.java)

La parola chiave final > Dati public class FinalData { private static Random rand = new Random(); private String id; public FinalData(String id) { this.id = id; // Can be compile-time constants: Modo tipico di definire private final int VAL_ONE = 9; costanti, in questo modo è private static final int VAL_TWO = 99; possibile utilizzarle anche // Typical public constant: fuori dal package. Static per public static final int VAL_THREE = 39; mettere in rilievo che ce n è // Cannot be compile-time constants: una sola e final per dire che private final int i4 = rand.nextint(20); è una costante static final int i5 = rand.nextint(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value v3 = new Value(33); // Arrays: private final int[] a = { 1, 2, 3, 4, 5, 6 ; public String tostring() { return id + ": " + "i4 = " + i4 + ", i5 = " + i5; (vedere FinalData.java)

La parola chiave final > Dati public class FinalData { private static Random rand = new Random(); private String id; public FinalData(String id) { this.id = id; // Can be compile-time constants: private final int VAL_ONE = 9; private static final int VAL_TWO = 99; // Typical public constant: public static final int VAL_THREE = 39; // Cannot be compile-time constants: private final int i4 = rand.nextint(20); static final int i5 = rand.nextint(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value v3 = new Value(33); // Arrays: private final int[] a = { 1, 2, 3, 4, 5, 6 ; public String tostring() { return id + ": " + "i4 = " + i4 + ", i5 = " + i5; Il fatto di essere final non significa essere noto in fase di compilazione Tale differenza si ha solo quando i valori vengono inizializzati in fase di esecuzione (vedere FinalData.java)

La parola chiave final > Dati public class FinalData { private static Random rand = new Random(); private String id; public FinalData(String id) { this.id = id; // Can be compile-time constants: In questo caso emerge la private final int VAL_ONE = 9; differenza tra final static e private static final int VAL_TWO = 99; solo final // Typical public constant: il valore di i4 cambia per public static final int VAL_THREE = 39; ogni istanza di FinalData // Cannot be compile-time constants: private final int i4 = rand.nextint(20); static final int i5 = rand.nextint(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value v3 = new Value(33); // Arrays: private final int[] a = { 1, 2, 3, 4, 5, 6 ; public String tostring() { Il valore di i5 rimane sempre uguale a quello dell inizializzazione avvenuta con la creazione della prima istanza di FinalData return id + ": " + "i4 = " + i4 + ", i5 = " + i5; (vedere FinalData.java)

La parola chiave final > Dati public class FinalData { private static Random rand = new Random(); private String id; public FinalData(String id) { this.id = id; // Can be compile-time constants: private final int VAL_ONE = 9; private static final int VAL_TWO = 99; // Typical public constant: public static final int VAL_THREE = 39; // Cannot be compile-time constants: private final int i4 = rand.nextint(20); static final int i5 = rand.nextint(20); private Value v1 = new Value(11); private final Value v2 = new Value(22); private static final Value v3 = new Value(33); // Arrays: private final int[] a = { 1, 2, 3, 4, 5, 6 ; public String tostring() { return id + ": " + "i4 = " + i4 + ", i5 = " + i5; v2 è final ma il suo valore (l oggetto Value) può essere cambiato Non si può però cambiare il riferimento v2 ad un nuovo oggetto Stessa cosa anche per gli array (vedere FinalData.java)

La parola chiave final > Dati E possibile assegnare il valore della variabile NON ( final contestualmente alla dichiarazione (blank E necessario inizializzare le variabili final prima di poter essere utilizzato» Variabile di istanza E necessario inizializzarla in tutti i costruttori oppure all interno di un inizializzatore di istanza» Variabile di classe E necessario inizializzarla all interno di un inizializzatore statico Un errore in fase di compilazione viene restituito in caso contrario

La parola chiave final > Dati I blank final forniscono molta più flessibilità nell utilizzo» Ad esempio un campo final di una classe può così essere diverso per ciascun oggetto (Vedere BlankFinal.java)

La parola chiave final > Dati class Poppet { private int i; Poppet(int ii) { i = ii; public class BlankFinal { private final int i = 0; private final int j; private final Poppet p; // Initialized final // Blank final // Blank final reference // Blank finals MUST be initialized in the constructor: public BlankFinal() { j = 1; // Initialize blank final p = new Poppet(1); // Initialize blank final reference public BlankFinal(int x) { j = x; // Initialize blank final p = new Poppet(x); // Initialize blank final reference public static void main(string[] args) { new BlankFinal(); new BlankFinal(47); (vedere BlankFinal.java)

La parola chiave final > Dati public class Constants { public static void main(string[] args) { final double CM_PER_INCH = 2.54; System.out.println( Centimetri per inch: + CM_PER_INCH); CM_PER_INCH = 10.30; //ERRORE IN COMPILAZIONE //OPPURE public static final double CM_PER_INCH = 2.54;

La parola chiave final > Dati class Point { int x,y; final Point root; static final Point ORIGIN; static { ORIGIN = new Point(0,0); public Point(int x, int y ){ this.x = x; this.y = y; root = null; public Point(int x, int y, Point root ){ this.x = x; this.y = y; this.root = root;

La parola chiave final > Dati class Test { public static void main(string[] args) { Point p1 = new Point(100,100); Point p2 = new Point(200,200,p1); p1.root = new Point(300,300); //ERRORE p2.root.x = 300; //OK System.out.println("ORIGIN.x:" + Point.ORIGIN.x); Point.ORIGIN = new Point(1000, 1000); //ERRORE Point.ORIGIN.x = 400; //OK

La parola chiave final > Argomenti Java permette di rendere final gli argomenti dichiarandoli come tali nell elenco degli argomenti All interno del metodo si può cambiare ciò a cui punta il riferimento all argomento (vedere FinalArguments.java)

La parola chiave final > Argomenti class Gizmo { public void spin() { public class FinalArguments { void with(final Gizmo g) { //! g = new Gizmo(); // Illegal -- g is final void without(gizmo g) { g = new Gizmo(); // OK -- g not final g.spin(); // void f(final int i) { i++; // Can't change // You can only read from a final primitive: int g(final int i) { return i + 1; public static void main(string[] args) { FinalArguments bf = new FinalArguments(); bf.without(null); bf.with(null); (vedere FinalArguments.java)

La parola chiave final > Metodi Un metodo può essere definito final:» Per evitare che una classe che eredita ne cambi il significato» Per ragioni di efficienza public class A { final void m1(){ void m2(){ public class B extends A{ //! void m1() { Illegal void m2() {

La parola chiave final > Metodi Tutti i metodi private di una classe sono implicitamente final» Poiché non si può accedere ad un metodo private, non si può ridefinirlo (Vedere FinalOverridingIllusion.java)

La parola chiave final > Classi Definendo una class final si stabilisce che non si vuole ereditare da quella classe o permettere a qualcun altro di farlo I campi di una classe final possono essere o non essere final Poiché con final si impedisce l ereditarietà, tutti I metodi di una classe final sono implicitamente final, dato che non c è modo di ridefinirli (Vedere Jurassic.java)