Ripasso • Classe (class): un template per un oggetto • Oggetti: una istanza di una classe o di una interfaccia (esiste in memoria) • Metodi: funzioni dell’oggetto • Attributi: variabili dell’oggetto • Metodi statici: funzioni della classe • Attributi statici: variabili della classe • Tipi di dati – Primitivi – Riferimenti ad oggetti Package • All’inizio del programma trovo: import classpath.classe • sono rintracciate dal compilatore e/o dalla JVM tramite il classpath – java.lang – java.io – java.net • Il classpath è una variabile di ambiente o un opzione specificata di java [-cp lista_di_cartelle]) – Esiste comunque sempre un package senza nome che corrisponde a tutte le classi presenti (file .java o .class) nella cartella corrente di lavoro In pratica • in fase di compilazione ed in fase di esecuzione le classi che si usano devono essere: – nello stesso package • Oppure nella cartella di lavoro – In package diversi, ma che vengono importati – nei package importati implicitamente Template di classi [access] [abstract /final] class NomeClasse [extends NomeSuperClasse] [implements NomeInterfacce] { //costruttori //metodi //attributi } Esempio public class Esame{ String nome; public Esame(){ … } public Esame(String nm){ … } } Esempio 2 public class ContoBancario{ String utente; int deposito; public ContoBancario(String nm){ … } public void deposita(int val){ …. } } Overloading dei metodi • Due metodi della classe possono avere lo stesso nome se gli argomenti sono differenti • Esempio: void foo () {…} void foo (int bar) {…} • Esiste una “firma” dei metodi che dice a Java quale metodo deve richiamare • Esempio : myClass.foo() myClass.foo(7) Visibilità • Nel template: [access] • Ci sono 4 parole chiave che determinano la visibilità: • public – tutti • protected – le sottoclassi • (default) – classi nello stesso package • private – solo la classe (oggetto) stessa • Ci servono a nascondere lo stato degli oggetti ed a decidere chi può cambiarlo Ereditarietà • Permette alle sottoclassi di ereditare delle proprietà di altre classi (superclassi) – Classe padre e classe figlia • Permette una forte astrazione – Astrazione progressiva – Abbatto la complessità in programmi grandi Biciclette • Estendo un concetto Bicicletta MountainBike BiciclettadaCorsa Interfacce • Una interfaccia specifica una classe – Dichiara i metodi ma non li definisce • Le interfacce non hanno il costruttore • Template: [ access] interface NomeInterfaccia [ extends AltraInterfaccia]{ //metodi } Esempio public interface Bicicletta{ public void accelera(int velocita); public void frena(int velocita); } Usare le interfacce • Le classi implementano le interfacce – Fornisco a tutti i metodi un corpo (definisco i metodi) – Aggiungo attributi – Aggiungo metodi • Le interfacce estendono le interfacce – Dichiaro altri metodi • Una classe può implementare più interfacce – Devo definire tutti i metodi di tutte le interfacce Esempio public class BiciclettaDaCorsa implemnts Bicicletta{ int marciaCorrente; public void accelera(int velocita){ }; public void frena(int velocita){ }; public void cambia(int marcia){ }; } Classi Astratte • Sono un mix fra classi ed interfacce – Possono avere dei metodi definiti – Possono avere attributi • Specifico dei metodi “comuni” • Lascio alcuni generici per le implemntazioni specifiche • Template: • Come quello delle classi ma usando abstract Esempio public abstract class Bicicletta{ int velocita; public void accelera(int vel){ velocita= velocita+vel; }; public void frena(int vel){ velocita= velocita-vel; }; public void cambia(int mar) } Estendere una classe public class BiciclettadaCorsa extends Bicicletta { int marciaCorrente; int marceMax=5; public BiciclettadaCorsa(int nummarce){ marceMax= nummarce; } public void cambia(int mar){ marciaCorrente=mar; } }