Java base IV: Java e la programmazione O.O.
Argomenti Classi e oggetti in Java I metodi I costruttori Principi di programmazione O.O. in Java: Incapsulamento, Ereditarietà, Polimorfismo. Le classi Astratte Le interfacce Metodi e variabili static
Obiettivi Familiarizzare con l’implementazione Java dei principi dell’O.O. Conoscere i fondamenti della programmazione in Java
Ricapitoliamo quanto detto della programmazione ad oggetti… OOP è un paradigma di programmazione nel quale i problemi sono modellati come in insieme di oggetti Insieme di oggetti con le stesse caratteristiche e gli stessi comportamenti Un oggetto è una istanza di una classe Agli oggetti si applicano i principi di Ereditarietà Incapsulamento Polimorfismo
Esempio…un videogioco Attributi Descrivono lo stato dell’oggetto
Oggetti e classi di oggetti Orco Istanze (Oggetti) Cavaliere
Le classi 1 2 1 2 package it.miopackage.itMaster; Implementazione di un oggetto package it.miopackage.itMaster; import java.util.Iterator; public class Classe{ int attributo; public void metodo(){ //implementazione metodo } 1 2 = nome del file Tutti gli attributi della classe 1 Modificatore d’accesso Tutti i metodi della classe 2
Esempio di classe Java Astrarre il concetto di Auto attraverso la definizione degli attributi/variabili dichiarate di tipo intero (int) e pubbliche (public) File Auto.java class Auto { public int numeroRuote; public int cilindrata; public int porte; ….. public void frenare(){ //.... } Variabili (di) istanza Vs Variabili locali
Modificatori di accesso In Java l’accesso (la visibilità) di proprietà e metodi è regolata dal programmatore facendo ricorso a parole chiave riconosciute dal compilatore private Accessibili solo all’interno della classe default Accessibili all’interno dello stesso package (compilatore) protected Accessibili all’interno dello stesso package e da tutte le classi figlie anche se definite in altri package public Accessibili da tutte le classi del programma Modificatori public e private
Visibilità delle variabili Come C e C++ Java consente di dichiarare variabili in qualunque punto del codice della applicazione Necessario stabilire le regole di visibilità delle variabili SCOPE In generale diremo che una variabile ha “scope” limitato al blocco all’interno del quale è stata dichiarata
Permette l’esecuzione di un programma Java I metodi in Java Un Metodo è sinonimo di “azione”, attraverso cui un programma esegue istruzioni gli oggetti comunicano tra loro Il metodo più importante di Java è il MAIN Permette l’esecuzione di un programma Java Almeno uno per applicazione public static void main (String args[]) { }
Dichiarazione di un metodo modificatori tipo_di_ritorno nome_del_metodo (parametri) { corpo del metodo } FIRMA DEL METODO modificatori: parole chiave di Java che possono essere usate per modificare in qualche modo le funzionalità e le caratteristiche di un metodo. tipo di ritorno: il tipo di dato che un metodo restituisce dopo essere stato chiamato nome del metodo: identificatore utilizzato quando si chiama il metodo parametri: dichiarazioni di variabili che potranno essere passate al metodo quindi sfruttate nel corpo del metodo al momento della chiamata corpo del metodo: insieme di comandi che verranno eseguiti quando il metodo sarà chiamato.
Dichiarazione di un metodo. Esempio public class SerieNumeri { private int serie[ ]; private int n; public SerieNumeri ( String s[ ] ) { n = s.length; serie = new int[n]; for (int i=0 ;i < n; i++){ serie[i] = Integer.parseInt(s[i]); } public double calcoloMedia () { int totale = 0; for(int i=0; i < n; i++){ totale += serie[i]; return( (float) totale/n); File SerieNumeri.java Se il metodo ritorna qualche valore
Invocazione di un metodo public static void main (String args[ ] ){ SerieNumeri a = new SerieNumeri(args); System.out.println("La media e' "+a.calcoloMedia()); } } //chiusura classe SerieNumeri L’ accesso al metodo calcoloMedia avviene con l’operatore “dot” (.) La sintassi da utilizzare per l’invocazione è nomeOggetto.nomeMetodo; In linea teorica ciò vale anche per le variabili Es. fiat500.cilindrata Vedremo che non è così!
Istanziazione di un oggetto: i costruttori Il costruttore è un “metodo speciale” avente queste caratteristiche: 1. Ha lo stesso nome della classe 2. Non ha tipo di ritorno 3. È chiamato ogni volta che è istanziato un oggetto 4. È presente in ogni classe. Se il programmatore non lo introduce, ne viene generato uno vuoto dal compilatore a run-time. Esempio OggettoX istanzaOggetto = new OggettoX(); Viene allocata la memoria necessaria per il nostro oggetto e viene ritornata la locazione in memoria della entità creata Di solito un costruttore è utilizzato per inizializzare le variabili d’istanza di un oggetto. Overloading dei costruttori. Al programmatore è consentito scrivere più di un costruttore per una data classe a seconda delle necessità di disegno dell’oggetto
I costruttori: esempio class Auto { public int numeroRuote; public Auto(){ this.numeroRuote=4; } public Auto(int numeroRuote){ this.numeroRuote= numeroRuote; Costruttore vuoto che valorizza di default l’attributo numeroRuote Costruttore che valorizza l’attributo numeroRuote con il valore del parametro passato Si riferisce al valore dell’attributo numeroRuote per l’istanza che si sta creando
Incapsulamento Processo di mascheramento dei dettagli dell’implementazione ad altri oggetti per evitare riferimenti incrociati In Java si ottiene costruendo delle Classi dotate di ATTRIBUTI PRIVATE METODI DI ACCESSO AGLI ATTRIBUTI PUBLIC private int attributo; Lettura attributo Modifica attributo GETTER SETTER public int getAttributo(){ return this.attributo; } public void setAttributo(int nuovoValore ){ this.attributo= nuovoValore; }
Esempio: costruiamo la classe Automobile Poniamoci queste domande: Quali proprietà possiede? Quali valori possono assumere? Possono essere modificate? Quali azioni può svolgere? … Creiamo diagramma della classe secondo standard UML Istanziamola e chiamiamo dei metodi Scriviamo la classe in Java
Parentesi necessaria… Primitivi Cambia modalità di memorizzazione 2 tipi di dato Oggetti RIFERIMENTI int a=5; String b=“test”; a 5 b valore puntatore test String HEAP STACK 0B345 Diversità: Inizializzazione e creazione, Valore di default, Metodi associati alle istanze GC e oggetti non più referenziati NB == confronta indirizzi di memoria
Riferimento Vs Valore int x = 4; int y; y = x ; System.out.println("x vale : " + x) ; System.out.println("y vale : " + y) ; y = 7 ; System.out.println("x vale : " + x) ; System.out.println("y vale : " + y) ; Qual è l’output?
Riferimento Vs Valore (2) Dimension x = new Dimension(4, 4); Dimension y; y = x; System.out.println("x vale : " + x) ; System.out.println("y vale : " + y) ; y.setSize(2, 2); // Modifica le coordinate System.out.println("x vale : " + x) ; System.out.println("y vale : " + y) ; Qual è l’output?
Creazione di una gerarchia Ereditarietà Meccanismo tramite il quale un oggetto è in una relazione logica con un altro Sconveniente scrivere una classe per ogni oggetto che contenga tutte le caratteristiche Creazione di una gerarchia tra le classi super-classe sotto-classe EXTENDS Definita in modo generico Perfezionata EREDITA proprietà e metodi AGGIUNGE proprietà e metodi PADRE Aumenta specificità Esercizio: Mezzi di trasporto. Disegniamo la gerarchia FIGLIA
Implementa in modo diverso i metodi della classe padre Ereditarietà in Java Parola chiave EXTENDS per definire la relazione di ereditarietà class Auto extends MezziDiTrasporto{ ….. } Tutte le classi in Java ereditano da Object. Se non viene specificato, il compilatore lo fa implicitamente. Java non permette l’ereditarietà Multipla (Vs C++). Eseguita attraverso le INTERFACCE Classe che eredita accede alla classe padre attraverso l’istruzione SUPER. Classe figlia si distingue dalla classe padre: Per estensione Per ridefinizione Implementa in modo diverso i metodi della classe padre Aggiunge nuovi attributi/metodi
Ereditarietà e costruttori public class Persona { String nome; public Persona(){} public Persona(String nome){ this.nome=nome; } Prima operazione di ogni costruttore Chiamata costruttore classe padre Object Classe estesa public class Studente extends Persona { String matricola; public Studente (){} public Studente (String nome, String matricola){ super(nome); this. matricola = matricola; } Se manca, chiamato costruttore vuoto
Lavoriamo su questo esempio 1 Creiamo le due classi In una terza classe con Main, istanziamo e lavoriamo sui due oggetti 2
Ereditarietà e classi Astratte L’ereditarietà porta riflettere sul processo di astrazione e di modellizzazione del dominio Progettata soltanto per svolgere la funzione di classe base Spesso è utile scrivere una o più classi GENERICHE, il cui scopo è predisporre un’interfaccia di metodi implementati diversamente da tutte le classi figlie ma per derivarne altre classi, che dettaglieranno (specificandole) le operazioni qui solo dichiarate non viene creata per derivarne istanze ABSTRACT una classe avente anche solo un metodo abstract è astratta, e deve essere dichiarata abstract essa stessa una classe astratta può però anche non avere metodi dichiarati abstract una sottoclasse di una classe astratta è anch’essa astratta, se non ridefinisce tutti i metodi che erano astratti nella classe base
Esempio di classi Astratte IL REGNO ANIMALE • ogni animale ha un qualche verso • ogni animale si muove in qualche modo • ogni animale vive in un qualche ambiente non esiste “il generico animale”! perché introdurre una tale classe “animali”? per fattorizzare aspetti comuni classificazione degli oggetti del mondo public abstract class Animale { public abstract String verso(); public abstract String si_muove(); public abstract String vive(); } Procediamo con la tassonomia..
movimento della manopola Java e il Polimorfismo Possibilità per i metodi di assumere forme, cioè implementazioni, diverse all’interno della gerarchia delle classi Tutti i veicoli a motore possiedono il metodo accelera automobile moto pressione del pedale movimento della manopola Consente ad oggetti differenti (ma collegati tra loro) la flessibilità di rispondere in modo differente allo stesso tipo di messaggio. Creiamo classe Aeroporto che implementa un metodo abilita_decollo e che accetta come parametro un velivolo… Nel metodo main proviamo a chiamare il metodo passando i diversi tipi di velivolo e osserviamo cosa succede
La parola chiave interface serve a creare classi astratte pure Le Interfacce in Java La parola chiave interface serve a creare classi astratte pure Può contenere SOLO costanti metodi d'istanza astratti PRIVI DI IMPLEMENTAZIONE Non può contenere: Costruttori, Variabili statiche, Variabili di istanza, Metodi statici. Serve a fornire una FORMA Per crearne una è sufficiente utilizzare la parola chiave interface invece di class Per implementare una interfaccia si utilizza la parola chiave implements Interfacce possono estendere PIU’ interfacce contemporaneamente. Classe può implementare PIU’ interfacce contemporaneamente.
Interfacce: esempio interface Strumenti { String descrizione = "strumento musicale"; void suona() ; } IMPLICITAMENTE static e final PROTOTIPO del metodo: Tipo Ritorno Nome Parametri class Flauto implements Strumenti { public void suona() { System.out.println(" fiuuuuuuu "); }
Metodi e variabili Statiche Abbiamo visto che in Java per usare un metodo che serve sempre una istanza Per fortuna è possibile dichiarare un metodo in modo che non richieda una istanza per essere utilizzata POSSONO ESSERE INVOCATI ACCEDENDO DIRETTAMENTE ALLA CLASSE, SENZA PRIMA ISTANZIARLA Dichiarati con la parola riservata STATIC Esempi di metodi statici classici: Metodo MAIN System.out….