Modificatori di visibilità

Documenti analoghi
Proprietà delle Classi e degli Oggetti in Java

14 - Metodi e Costruttori

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

Polimorfismo. Un tipo numerico può sempre essere esteso a un altro tipo numerico se più generale. ad esempio int double.

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

18 - Classi parzialmente definite: Classi Astratte e Interfacce

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

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

Fondamenti di Informatica I

La classe java.lang.object

I costruttori. Il costruttore standard. Esempio di valori di default. Alterare il costruttore standard

TIPI PRIMITIVI: LIMITI

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Ereditarietà e Polimorfismo. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

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. Java. Esempio. Esempio

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

Introduzione alla Programmazione in Java attraverso un esempio commentato

Programmazione ad Oggetti. Java Parte II

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

Java Le stringhe. Stringhe

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Programmazione ad oggetti

Riassunto. La programmazione OO. Oggi. Esempio

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

Uso di metodi statici. Walter Didimo

Modulo 2: Strutture fondamentali della programmazione Java

La classe Object. L2-Linguaggi di Programmazione II-unina 1

Ereditarietà e Polimorfismo

Parola chiave extends

Polimorfismo parametrico vs polimorfismo per inclusione

1 Il Paradigma ad Oggetti

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

Pubblico e privato. Per capire il concetto di pubblico e privato è possibile pensare a diversi oggetti del mondo reale. Ad esempio: bancomat.

public double getlato() restituisce la lunghezza del lato del quadrato che esegue il metodo.

Oggetti e classi. Cos è un oggetto

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

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

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

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

IL CONCETTO DI CLASSE

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

Esempio: il conto bancario

In questa lezione. Polimorfismo

Programmazione Orientata agli Oggetti in Linguaggio Java

Asserzioni in Java fondamenti

Riferimenti ad oggetti: Fondamenti di Informatica L-B Esercitazione n 4 Java: I/O, Costruttori e altro. Riferimenti ad oggetti: (Esempio)

Variabili e Metodi di classe Interfacce e Package Gestione di File in Java

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

Lezione 13 Classi interne

Esempio: Costruttori ed ereditarietà

Esercizi della lezione 5 di Java

Programmazione 1 A.A. 2015/2016

Classi Inner. Una Inner class è una classe la cui dichiarazione si trova all interno di un altra classe (La classe ospitante è detta top level):

Le basi del linguaggio Java

Programmazione orientata agli oggetti Classi, package e file system. Package

Definizione di metodi in Java

Il linguaggio Java. La superclasse universale Object

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

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

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Ingredienti sintattici di Java

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Gerarchia di classi Java 1

Fondamenti di Informatica T2 Modulo 2. Corso di Laurea in Ingegneria Informatica Anno accademico 2008/2009. Enumerativi

CLASSI ASTRATTE - ESERCIZIO

Definizione di una classe

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Esercizi sui metodi. Carla Limongelli. Maggio Esercizi 1

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Laboratorio Progettazione Web Le funzioni in PHP. Angelica Lo Duca IIT-CNR 2012/2013

Esempio: Interfacce. Gioco Interfacce

Laboratorio di Programmazione 1 [Java]

Confronti, equals. Operatori Relazionali, confronti Confronti fra Oggetti, ridefinizione di equals. Laboratorio di Programmazione - Luca Tesei

Gestione delle eccezioni

Programmazione a Oggetti Lezione 10. Ereditarieta

INFORMATICA GRAFICA - FONDAMENTI DI INFORMATICA Ing. Civile - Edile/Architettura Dott. Penzo SOLUZIONE PROVA SCRITTA DEL 16/09/2002.

Esempio: L EURO-CONVERTITORE (1) Scopo

Java, Oggetti e Strutture Dati di G. Callegarin - Edizioni CEDAM

Eredità e Polimorfismo in Java

Indice. Prefazione. 3 Oggetti e Java 53

Programmazione Java: Variabili membro, Metodi La parola chiave final

Programmazione ad oggetti Prova scritta 15 Gennaio 2013

Il paradigma di programmazione a oggetti

Programmazione Java: Polimorfismo

Algoritmi di Ricerca. Esempi di programmi Java

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

Introduzione a Java. Riferimenti

Progettazione del Software

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }

Corso di Fondamenti di Informatica I

Programmazione ad oggetti

Laboratorio di programmazione

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Definizione di metodi

Scope e visibilità per classi

Fondamenti di Informatica T-1. Ereditarietà & Polimorfismo

Transcript:

Modificatori di visibilità Attenzione nell overriding dei metodi: la restrizione di visibilità può essere allentata, ma mai resa più restrittiva. In particolare non si può ridefinire come privato un metodo che era inizialmente pubblico. public class classebase { public int operazione() {... public class classeestesa extends ClasseBase { private int operazione() {... //ERRORE!

Modificatori di visibilità Il compilatore segnala errore perché dare visibilità ridotta al metodo operazione() di ClasseEstesa è illusorio. this.operazione(); //PRIVATO, ma... super.operazione(); //PUBBLICO Il metodo ridefinito non può essere invocato da altre classi, quello di partenza resta pubblico. Si viola il principio per cui un istanza della sottoclasse è anche istanza della superclasse (e quindi può fare più cose, non meno).

Modificatore protected Le sottoclassi ereditano dalle superclassi, ma sono classi distinte. Quindi le sottoclassi non possono interagire con i membri privati della loro superclasse. Tuttavia, oltre ai modificatori public e private, Java consente anche l uso del modificatore protected. Il modificatore protected serve a consentire l accesso alle sottoclassi.

Modificatore protected Il modificatore protected corrisponde a fornire visibilità package-friendly (come se non fosse messo alcun modificatore). Non si può applicare alla classe nel complesso, ma solo a un membro. All interno del package, questo membro è visibile a tutte le classi del package. All esterno, è visibile solo alle sottoclassi che estendono la classe di cui è membro.

Modificatore protected In altre parole, un membro dichiarato protected ha un livello di protezione intermedio tra pubblico e package-friendly possiede sicuramente visibilità package-friendly è visibile da istanze della stessa classe però è visibile anche da classi di altri package se estendono quella in cui è definito Se il membro in questione è un metodo, se ne può fare l override solo definendo il nuovo metodo come public o protected non si può restringere la visibilità, solo ampliarla

Modificatore protected Se un costruttore è protected, può essere invocato come super() solo dai costruttori delle sottoclassi che estendono direttamente la sua classe. Se un metodo o un campo sono protected, possono essere acceduti da una sottoclasse (anche non diretta). Però l oggetto di cui vengono invocati come membri dev essere di un livello non superiore alla sottoclasse (ad esempio, la superclasse non va bene)

Modificatore protected Esempio package miopackage; public class ClasseBase { protected int x; protected ClasseBase(int x) { this.x = x; protected String mvisibile() { return metodo visibile! ;

Modificatore protected Uso corretto import miopackage.*; class ClasseEstesa extends ClasseBase { public ClasseEstesa(int x) { super(x); public void usaprotetto() { System.out.println( x vale: + x; System.out.println( mvisibile() ); public static void main(string[] args) { ClasseEstesa e = new ClasseEstesa(3); e.usaprotetto(); costrut tore metodo

Modificatore protected Uso non corretto import miopackage.*; class ClasseEstesa extends ClasseBase { public ClasseEstesa(int x) { super(x); public void usaprotetto() { System.out.println( x vale: + x; System.out.println( mvisibile() ); public static void main(string[] args) { ClasseBase b = new ClasseBase(3); e.usaprotetto(); non si può usare qua, ma solo nel costruttore come super() costrut tore

Modificatore protected Uso non corretto import miopackage.*; class ClasseEstesa extends ClasseBase { public ClasseEstesa(int x) { super(x); public void usaprotetto(classebase b) { System.out.println( x vale: + b.x ; metodo System.out.println( b.mvisibile() ); public static void main(string[] args) { ClasseEstesa e = new ClasseEstesa(3); e.usaprotetto(e); sono errati perché usano un oggetto della superclasse (prima invece si usava this)

Regole sulla visibilità Il problema di accedere un campo della superclasse si può risolvere ponendolo protected. Ad esempio potevamo scrivere: class BankAccount { protected double balance;... class CheckingAccount extends BankAccount { private int transactions;... public void deposit(double x) { transactions++; balance += x;

Regole sulla visibilità In realtà all atto pratico si verifica spesso che usare campi protected è poco efficace, e comporta problemi simili ad averli public. Tipicamente, il programmatore non ha il controllo su chi può scrivere le sottoclassi. Parti di implementazione dichiarate protected risultano poi difficili da cambiare perché chi ha scritto una sottoclasse conta che esistano. Spesso la cosa migliore è specificare campi privati e gestirli con metodi set e get pubblici.

Modificatore final Il modificatore final si può usare per indicare che qualcosa non può essere più cambiato. Si può applicare a variabili, metodi, classi. Un campo final è una costante, dato che non cambia più il proprio valore Le costanti sono spesso poste anche public. Un metodo final non può essere ridefinito in alcuna sottoclasse. Una classe final non può essere estesa; implicitamente i suoi metodi sono tutti final.

Modificatore final Nel caso di variabile riferimento, quello che è immutabile è il riferimento all oggetto. final String str = Hello ; str = str +! ; final Punto a = new Punto(); a.setx(5.0); Ricordiamo che quando si usa il modificatore final a una variabile si può comunque anche attendere prima di dare il valore (blank final). final dice che si può fare un solo assegnamento. Tuttavia, ne occorre uno prima dell uso!

Modificatore final Perciò, se un campo statico (variabile di classe) viene denotato come final bisogna dirne subito il valore (blank final non ammesso). Altrimenti l assegnamento di default (0 per gli int, 0.0 per i double, null per i tipi riferimento) conterebbe come primo e unico assegnamento Per un campo non statico (variabile d istanza) invece è ammesso di porlo blank final ma prima di usare l oggetto questo deve avere valore. Quindi dev essere esplicitamente inizializzato all interno di ogni costruttore della classe.

Modificatore final Il campo RGL è posto esplicitamente a 0 per ogni oggetto della classe. Il campo BLK invece deve essere inizializzato da ogni costruttore, altrimenti il compilatore segnalerà un errore. class Prova { final int RGL = 2; final int BLK; public Prova() { BLK = 1; public Prova(int x) { BLK = x;...

Modificatore final Il modificatore final si può anche usare in altri contesti (non identici, ma simili). Se abbinato a un parametro di un metodo, il valore di questo non può essere modificato. public void unmetodo(final int X) {... X = 0; //NON AMMESSO (non è un bello // stile in ogni caso!)

Modificatore final Porre un metodo final significa che non se ne può fare overriding nelle sottoclassi. Questo serve a: impedire alle sottoclassi di cambiarne il significato ottimizzare la compilazione (il compilatore tratta questi metodi costanti in modo diverso, più efficiente) Supponiamo di avere una classe Test con un metodo verifica per valutare certe condizioni Una classe estesa Imbroglio vorrebbe sovrascrivere verifica per fargli ritornare sempre true.

Modificatore final class Test { public final boolean verifica(parametri) { //valuta parametri : responso return responso; non ammesso! verifica() deve essere quello originale di Test class Imbroglio extends Test { public boolean verifica(parametri) { return true; if (p.verifica(parametri)) {...... per forza questo

Modificatore final Per le classi, il modificatore final specifica semplicemente che non possono essere estese. Il tentativo di estendere una classe indicata come final dà un errore in compilazione. Come per i metodi, ci sono aspetti di: efficienza: il compilatore tratta diversamente una classe del genere correttezza: si può impedire che qualcuno violi il contratto estendendo la classe in modo errato La classe String è final: non si può estendere

Modificatore final Usare il modificatore final su una classe, assomiglia ad usarlo per tutti i suoi metodi. Tuttavia, se usiamo final per la classe non possiamo più estenderla, mentre se usiamo final per tutti i metodi non ci pregiudichiamo la possibilità di estendere la classe in futuro. I campi su cui si basano dei metodi finali dovrebbero essere dichiarati privati. Questo perché porre il metodo finale significa che non si considera utente come particolarmente esperto.

Modificatore final Se invochiamo un metodo non-final, la JVM seguirà questa strada: determina il tipo dell oggetto che esegue il metodo ricerca e associa al metodo l implementazione corretta, verificando corrispondenze di tipi e firme invoca l implementazione del metodo Nel caso di un metodo finale basta questo, mentre i primi passaggi, che non sono necessari, possono essere saltati (sono già fatti dall early binding).

Classi interne In Java una classe può essere dichiarata in (quasi) qualsiasi punto. Se compare dentro un altra classe si chiama classe interna. Un oggetto istanza della classe interna si crea come di consueto dentro la classe che lo contiene. Al di fuori invece la sintassi è: Esterna.Interna i = new Esterna().new Interna(); oppure Esterna e = new Esterna(); Esterna.Interna i = new e.interna();

Classi interne La classe interna accede i membri della classe esterna in modo naturale. public class Esterna { private String messaggio = nella classe ; private void stampa() { System.out.println(messaggio+ Esterna ); public class Interna public void metodo() {System.out.println(messaggio+ Interna );

Classi annidate statiche Può risultare utile definire una classe interna per raggruppare certe funzionalità comuni. Si chiama classe annidata una classe interna che è un membro statico di quella esterna. Meglio ancora classe annidata per il caso base, chiamando questa classe annidata statica, e classe interna l altro caso Una classe B annidata in una classe A è sempre riferita come A.B (se nel package P: P.A.B). Esempio di sintassi: Esterna.Annidata i = new Esterna.Annidata();

Classi annidate statiche Una classe annidata statica raggruppa funzionalità usate solo localmente. public class Lista {... private static class Nodo { Object info; Nodo next; Nodo(Object info, Nodo next) { this.info = info; this.next = next;...

Classi annidate: proprietà L annidamento di classi semplifica l organizzazione logica del codice. Incapsulamento più forte Migliore leggibilità La classe annidata ha accesso privilegiato alla classe ospite: non viene ereditato al di fuori. Dato che sono membri di altre classi, possono essere anche private (mentre una classe potrebbe essere solo public o -niente-).

Classi annidate: proprietà Le classi interne non statiche non possono avere membri statici (poiché dipendono da un istanza della classe esterna). Le classi annidate e interne hanno una doppia versione di this e super (e anche di new). normale: quello della classe stessa dopo Esterna. : quello della classe esterna Ad esempio, Esterna.super.x accede al campo x della superclasse di Esterna

Classi annidate public class Lista2 { private int count = 0; private Nodo2 testa = null; private static class Nodo2 { Object info; Nodo2 next; Nodo2(Object info, Nodo2 next) { this.info = info; this.next = next; count++;... vale come Lista2.this.count++

Classi interne locali Se una classe interna è definita nel corpo di un metodo, è detta classe interna locale. Analogamente alle variabili locali, questa classe viene usata solo internamente al blocco dove è definita. Se ne possono usare i metodi, quante volte si vuole.

Esempio classe locale public class Esterna { private int[] vett = new int[20]; public Esterna() { for (int i=0; i<20; i++) {vett[i] = i; public void indicipari() { private class Pari { private int n = -2; public boolean hasnext() {return (n < 18); public int getnext() { return vett[n=n+2]; Pari aaa = new Pari(); classe locale while (aaa.hasnext()) { System.out.print(aaa.getNext() + ); public static void main (String[] args) { Esterna z = new Esterna(); z.indicipari();

Classi anonime Una classe anonima è analoga a una classe interna locale, ma non ha nome. Quindi serve per essere usata una volta sola. public class Gatto { private String color; public Gatto(String x) {this.color = x; public String getcolor() {return color; public void setcolor(string x) {color = x; public String tostring() {return Gatto + color;

Esempio classe anonima public class ListaDeiGatti { public static void main(string[] args) { Gatto[] prova = new Gatto[3]; prova[0] = new Gatto( Bianco ); prova[1] = new Gatto( Nero ); prova[2] = new Gatto( Tigrato ) { public String tostring() { return( gattino... + getcolor()); ; classe anonima for (Gatto g : prova) { System.out.println ( C è un + g.tostring() );