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;
}
}