Post on 01-May-2015
Java base IV:Java base IV:Java e la programmazione Java e la programmazione
O.O.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 Ricapitoliamo quanto detto della programmazione ad oggetti…programmazione ad oggetti…
OOP è un paradigma di programmazione nel quale i problemi sono OOP è un paradigma di programmazione nel quale i problemi sono modellati come in insieme di modellati come in insieme di oggettioggetti
Un oggetto è una istanza di una classeclasse
Insieme di oggetti con le stesse caratteristiche e gli stessi comportamenti
Agli oggetti si applicano i principi di
Ereditarietà Incapsulamento
Polimorfismo
Esempio…un videogiocoEsempio…un videogioco
Attributi Descrivono lo stato dell’oggetto
Oggetti e classi di oggettiOggetti e classi di oggetti
OrcoOrco
CavaliereCavaliere
Classi
Istanze (Oggetti)
Le classiLe classi
Implementazione di un oggetto
Modificatore d’accesso11 Tutti gli attributi della classe
22 Tutti i metodi della classe
package it.miopackage.itMaster;
import java.util.Iterator;
public class Classe{int attributo;
public void metodo(){//implementazione metodo
}}
11
22
= nome del file
Esempio di classe JavaEsempio di classe Java
class Auto {
public int numeroRuote; public int cilindrata; public int porte; ….. public void frenare(){ //.... }
}
File Auto.java Astrarre il concetto di Auto
attraverso la definizione degli
attributi/variabili dichiarate di
tipo intero (int) e pubbliche
(public)
Variabili (di) istanzaVariabili (di) istanza
VsVs
Variabili localiVariabili locali
Modificatori di accesso Modificatori di accesso In Java l’accesso (la visibilità) di proprietà e metodi è regolata dal
programmatore facendo ricorso a parole chiaveparole chiave riconosciute dal compilatore
private
default
protected
public
Accessibili solo all’interno della classe
Accessibili all’interno dello stesso package e da tutte le classifiglie anche se definite in altri packageAccessibili da tutte le classi del programma
Accessibili all’interno dello stesso package (compilatore)
Modificatori public e private
Visibilità delle variabiliVisibilità delle variabili
Come C e C++ Java consente di dichiarare variabili Come C e C++ Java consente di dichiarare variabili in qualunque punto del codice della applicazione in qualunque punto del codice della applicazione
Necessario stabilire le regole di visibilità delle variabili SCOPESCOPE
In generale diremo che una variabile ha “scope” limitato al blocco all’interno del quale è stata dichiarata
I metodi in JavaI 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 MAINMAIN
Permette l’esecuzione di Permette l’esecuzione di un programma Javaun programma Java Almeno uno per applicazioneAlmeno uno per applicazione
public static void main (String args[]) { }
Dichiarazione di un metodoDichiarazione di un metodo
modificatori tipo_di_ritorno nome_del_metodo (parametri) {corpo 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.
FIRMA DEL METODO
Dichiarazione di un metodo. EsempioDichiarazione di un metodo. Esempiopublic 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 ritornaqualche valore
Invocazione di un metodoInvocazione 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 variabiliEs. fiat500.cilindrata
Vedremo che non è così!
Istanziazione di un oggetto: i Istanziazione di un oggetto: i costruttoricostruttori
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.OggettoX istanzaOggetto = newnew OggettoX();
Di solito un costruttore è utilizzato per inizializzare le variabili d’istanza di un oggetto.
EsempioEsempio
Viene allocata la memoria necessaria per il nostro oggetto e viene ritornata la locazione in memoria della entità creata
OverloadingOverloading dei costruttori. Al programmatore è consentito scrivere più di un costruttore per una data classe a seconda delle necessità di disegno dell’oggetto
I costruttori: esempioI 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
numeroRuoteCostruttore 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
IncapsulamentoIncapsulamento
Processo di mascheramento dei dettagli dell’implementazione ad altri Processo di mascheramento dei dettagli dell’implementazione ad altri oggetti per evitare riferimenti incrociati oggetti per evitare riferimenti incrociati
In Java si ottiene costruendo delle Classi dotate diIn Java si ottiene costruendo delle Classi dotate di
ATTRIBUTI ATTRIBUTI PRIVATEPRIVATE METODI DI ACCESSOMETODI DI ACCESSO AGLI ATTRIBUTI AGLI ATTRIBUTI PUBLICPUBLIC
Lettura attributoLettura attributo Modifica attributoModifica attributo
GETTER SETTER
private int attributo;
public int getAttributo(){ return this.attributo;}
public void setAttributo(int nuovoValore ){ this.attributo= nuovoValore;}
Esempio: costruiamo la classe Esempio: costruiamo la classe AutomobileAutomobile
• Quali proprietà possiede?• Quali valori possono assumere? • Possono essere modificate?• Quali azioni può svolgere?• …
Poniamoci queste domande:Poniamoci queste domande:
Scriviamo la
classe in Java
Creiamo
diagramma della
classe secondo
standard UML
Istanziamola e
chiamiamo dei
metodi
Parentesi necessaria…Parentesi necessaria…
GC e oggetti non più referenziatiGC e oggetti non più referenziati
2 tipi di dato2 tipi di dato
PrimitiviPrimitivi
OggettiOggetti RIFERIMENTIRIFERIMENTI
Cambia modalità di memorizzazione
int a=5;
String b=“test”;
aa55
bb
valorevalore
puntatorepuntatore test
StringString
HEAPHEAPSTACKSTACK
0B345
Diversità:Diversità:
Inizializzazione e creazione,Inizializzazione e creazione,
Valore di default,Valore di default,
Metodi associati alle istanzeMetodi associati alle istanze == confronta indirizzi di memoria== confronta indirizzi di memoria
NBNB
Riferimento Vs ValoreRiferimento 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?Qual è l’output?
Riferimento Vs Valore (2)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?Qual è l’output?
EreditarietàEreditarietà
Creazione di una Creazione di una gerarchiagerarchia tra le classitra le classi
Meccanismo tramite il quale un oggetto è in una relazione logicarelazione logica con un altro
Sconveniente scrivere una classe per ogni oggetto che contenga tutte
le caratteristiche
Definita in modo generico
Perfezionata
EREDITAEREDITA proprietà e
metodi
AGGIUNGEAGGIUNGE proprietà e
metodi
super-classesuper-classe
sotto-classesotto-classe
EXTENDSEXTENDS
PADREPADRE
FIGLIAFIGLIA
Aumenta specificità
Esercizio: Mezzi di trasporto. Disegniamo la gerarchiaEsercizio: Mezzi di trasporto. Disegniamo la gerarchia
Ereditarietà in JavaEreditarietà in Java
Parola chiave Parola chiave EXTENDSEXTENDS per definire la relazione di ereditarietà per definire la relazione di ereditarietà
class Auto extendsextends MezziDiTrasporto{ ….. }
Tutte le classi in Java ereditano da Tutte le classi in Java ereditano da ObjectObject. Se non viene specificato, il . Se non viene specificato, il compilatore lo fa implicitamente.compilatore lo fa implicitamente.
Java Java nonnon permette l’ereditarietà Multipla (Vs C++). permette l’ereditarietà Multipla (Vs C++).
Eseguita attraverso le Eseguita attraverso le INTERFACCEINTERFACCE
Classe che eredita accede alla classe padre attraverso l’istruzione Classe che eredita accede alla classe padre attraverso l’istruzione SUPER.SUPER.
Classe figlia si distingue dalla classe padre:Classe figlia si distingue dalla classe padre:
Per Per estensioneestensione Per Per ridefinizioneridefinizione
Aggiunge nuovi attributi/metodiAggiunge nuovi attributi/metodi Implementa in modo diverso i metodi della Implementa in modo diverso i metodi della classe padreclasse padre
Ereditarietà e costruttoriEreditarietà e costruttoripublic class Persona { String nome; public Persona(){}
public Persona(String nome){ this.nome=nome; }}
public class Studente extends Persona { String matricola; public Studente (){}
public Studente (String nome, String matricola){ super(nome);super(nome); this. matricola = matricola; }}
Prima operazione di ogni costruttorePrima operazione di ogni costruttore
Chiamata costruttore classe padreChiamata costruttore classe padre
Classe estesaClasse estesa
Se manca, chiamato costruttore vuotoSe manca, chiamato costruttore vuoto
ObjectObject
Lavoriamo su questo esempioLavoriamo su questo esempio
Creiamo le due classiCreiamo le due classi
In una terza classe con Main, istanziamo eIn una terza classe con Main, istanziamo elavoriamo sui due oggettilavoriamo sui due oggetti
11
22
Ereditarietà e classi AstratteEreditarietà e classi Astratte
• 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
L’ereditarietà porta riflettere sul processo di astrazione e di modellizzazione del dominio
Spesso è utile scrivere una o più classi GENERICHEGENERICHE, il cui scopo è predisporre un’interfaccia di metodi implementati diversamente da tutte le classi figlie
Progettata soltanto per svolgere la
funzione di classe classe basebase
non viene creata per derivarne istanze ma per derivarne altre classi, che dettaglieranno (specificandole) le
operazioni qui solo dichiarate
ABSTRACTABSTRACT
public abstract class Animale {
public abstract String verso();
public abstract String si_muove();
public abstract String vive();
}
Esempio di classi AstratteEsempio di classi Astratte
IL REGNO ANIMALEIL 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”?perché introdurre una tale classe “animali”?
per fattorizzare aspetti comuni classificazione degli oggetti del mondo
Procediamo con la tassonomia..Procediamo con la tassonomia..
Java e il PolimorfismoJava e il PolimorfismoPossibilità per i metodi di assumere forme, cioè implementazioni, diverse Possibilità per i metodi di assumere forme, cioè implementazioni, diverse
all’interno della gerarchia delle classiall’interno della gerarchia delle classi
Tutti i veicoli a motore possiedono il metodo Tutti i veicoli a motore possiedono il metodo acceleraaccelera
automobile
pressione del pedale
moto
movimento della manopola
Consente ad oggetti differenti (ma collegati tra Consente ad oggetti differenti (ma collegati tra loro) la flessibilità di rispondere in modo loro) la flessibilità di rispondere in modo differente allo stesso tipo di messaggio. 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
Le Interfacce in JavaLe Interfacce in Java
• CostruttoriCostruttori,,
• Variabili statiche,Variabili statiche,
• Variabili di istanzaVariabili di istanza,,
• Metodi statici.Metodi statici.
La parola chiave interface serve a creare classi astratte pure
Può contenere SOLO
costanti metodi d'istanza astratti
Non può contenere:Non può contenere:
PRIVI DI IMPLEMENTAZIONEPRIVI DI IMPLEMENTAZIONE
Serve a fornire una FORMAServe 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: esempioInterfacce: esempio
interface Strumenti {
String descrizione = "strumento musicale";
void suona() ;
}
IMPLICITAMENTE IMPLICITAMENTE static e finalstatic e final
class Flauto implements Strumenti {
public void suona() {
System.out.println(" fiuuuuuuu ");
}
}
PROTOTIPO del metodo:PROTOTIPO del metodo:
Tipo RitornoTipo Ritorno
NomeNome
ParametriParametri
Metodi e variabili Metodi e variabili StaticheStatiche
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 DIRETTAMENTEPOSSONO ESSERE INVOCATI ACCEDENDO DIRETTAMENTEALLA CLASSE, SENZA PRIMA ISTANZIARLAALLA CLASSE, SENZA PRIMA ISTANZIARLA
Dichiarati con la Dichiarati con la parolaparola riservata riservata STATICSTATIC
Esempi di metodi statici classici:Esempi di metodi statici classici:
Metodo MAINMetodo MAIN
System.out….System.out….