1
Overriding
Programmazione in Rete e Laboratorio
Matteo Baldoni Dipartimento di Informatica Universita` degli Studi di Torino C.so Svizzera, 185 I-10149 Torino baldoni@di.unito.it
http://www.di.unito.it/~baldoni/didattica
2
Overloading, overriding, …
■ Firma o signature: nome + lista dei tipi dei parametri
■ Overloading:
stesso nome ma diversa lista dei tipi di parametri
■ Overriding:
stessa firma ma classi diverse (purché nella stessa gerarchia)
class ClasseA {
public void metodo (int x) {
System.out.println("Metodo di Classe A: " + x);
}
public void metodo() {
System.out.println("Metodo di Classe A");
this.versamento(-1);
} }
class ClasseB extends ClasseA { public void metodo (int x) {
System.out.println("Metodo di Classe B esteso");
super.versamento(x);
}
public void metodo() {
System.out.println("Metodo di Classe B esteso");
super.versamento();
} }
OVERLOADING
OVERLOADING OVERRIDING OVERLOADING
3
Overloading, overriding, … anche per i costruttori
■ La chiamata di this(… ) o super(…) deve essere la prima istruzione del costruttore!
class ClasseSopra { public ClasseSopra(int x) {
System.out.println("Costruttore ClasseSopra: " + x);
}
public ClasseSopra() { this(-1);
System.out.println("Costruttore ClasseSopra");
} }
class ClasseSotto extends ClasseSopra { public ClasseSotto (int x) { super(x);
System.out.println("Costruttore ClasseSotto");
}
public ClasseSotto() { super();
System.out.println("ostruttore ClasseSotto");
} }
OVERLOADING
OVERLOADING OVERRIDING OVERLOADING
4
Overriding di metodi privati
■ Se invio il messaggio metodo1 ad un oggetto di tipo ClasseDue quale metodo metodo2 viene eseguito?
■ Binding dinamico?
■ Dichiarare che un metodo è privato equivale a “cambiargli nome”
■ In effetti a parte ClasseUno nessuno sa o deve sapere dell’esistenza di metodo2 di ClasseUno
class ClasseUno { public void metodo1 () { System.out.println("Eseguito metodo 1 nella classe Uno");
this.metodo2();
}
private void metodo2() { System.out.println("Eseguito metodo 2 nella classe Uno");
} }
class ClasseDue extends ClasseUno { public void metodo2 () { System.out.println("Eseguito metodo 2 nella classe Due");
} }
5
Overriding di campi
■ È possibile ridefinire dei campi
MA
■ Ai campi non si applica il binding dinamico!
class ClassePadre { public int x = 1;
public int y = 2;
public void getValue() {
System.out.println("Valore della x: "
+ this.x);
System.out.println("Valore della y: ” + this.y);
} }
class ClasseFiglia extends ClassePadre { public String x = “3”;
public int z = 4;
public void getValue() { super.getValue();
System.out.println("Valore della x estesa: " + this.x);
System.out.println("Valore della z: ” + this.z);
} }
6
Overriding di variabili nei blocchi
■ È possibile definire variabili locali ad un blocco
MA
■ A differenza del C o del Pascal, in un blocco interno Java non è possibile ridefinire una variabile esterna
class ProvaVariabiliLocali {
public static void main(String[] args) {
{
int z = 2;
}
System.out.println(z);
int x = 1;
if (x > 0) {
int y = 3;
} else {
int x = 2;
int y = 5;
} int y = 4;
} }