Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
34 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
package structures; import java.util.*; public abstract class Stack extends ArrayList { public void inserisci(int x) { Number n = new Number(x); this.add(n); } abstract public int estrai(); }
Stack
e se avessi esteso HashSet?
35 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
public static void main(String[] args) { Stack s=new Coda(); s.inserisci(3); s.inserisci(2); s.inserisci(3); s.inserisci(1); for (int k=0;k<=4;k++){ int v=s.estrai(); System.out.println(v); } }
Stack
36 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
public static void main(String[] args) { Stack s=new Coda(); s.inserisci(3); s.inserisci(2); s.inserisci(3); s.inserisci(1); for (int k=0;k<=4;k++){ int v=s.estrai(); System.out.println(v); } }
Stack
3 3 2 1
37 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Fondamenti di Java
Uguali o identici?
38 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Class P
class P {
int x; int y; public String toString() {
return ("x="+x+" ; y="+y);
}
}
39 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Main di test public class Test {
public static void main(String []a){new Test();}
Test() {
P p1=new P(); p1.x=1;
p1.y=2;
System.out.println(p1);
P p2=p1;
p2.x=3; System.out.println(p1);
}
}
class P {
int x; int y; public String toString() {
return ("x="+x+" ; y="+y);
}
}
40 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Main di test public class Test {
public static void main(String []a){new Test();}
Test() {
P p1=new P(); p1.x=1;
p1.y=2;
System.out.println(p1);
P p2=p1;
p2.x=3; System.out.println(p1);
}
}
class P {
int x; int y; public String toString() {
return ("x="+x+" ; y="+y);
}
}
x=1 ; y=2
x=3 ; y=2
p1 and p2 refer to te same object!
41 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Oggetti diversi public class Test {
public static void main(String a[]) {new Test();} Test() {
P p1=new P();
p1.x=1; p1.y=2;
System.out.println(p1);
P p2=new P(); p2.x=1; p2.y=2;
System.out.println(p2);
p1.x=3;
System.out.println(p1);
System.out.println(p2); }
}
x=1 ; y=2
x=1 ; y=2
x=3 ; y=2
x=1 ; y=2
42 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Come testare l'eguaglianza?
public class Test {
public static void main(String a[]){new Test();} Test() {
P p1=new P();
p1.x=1; p1.y=2;
P p2=new P();
p2.x=1; p2.y=2; // come testare l'uguaglianza di p1 e p2?
}
}
43 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Operatore ==
public class Test {
public static void main(String[] a){new Test();} Test() {
P p1=new P();
p1.x=1; p1.y=2;
P p2=new P();
p2.x=1; p2.y=2; System.out.println(p1==p2); }
}
false
44 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Metodo equals()
public class Test {
public static void main(String[] a){new Test();} Test() {
P p1=new P();
p1.x=1; p1.y=2;
P p2=new P();
p2.x=1; p2.y=2; System.out.println(p1.equals(p2));
}
}
false
45 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Metodo equals()
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any reference values x and y, this method returns true if and only if x and y refer to the same object (x==y has the value true).
Ma allora a che serve?
46 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
equals per la classe P
class P {
int x; int y; public String toString() {
return ("x="+x+" ; y="+y);
}
public boolean equals(P var){
return (x==var.x && y==var.y) }
}
Equals di Object è la base per implementare il vostro equals
47 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
equals() e ==
public class Test {
public static void main(String[] a){new Test();} Test() {
P p1=new P();
p1.x=1; p1.y=2;
P p2=new P();
p2.x=1; p2.y=2; System.out.println(p1.equals(p2));
System.out.println(p1==p2); }
}
true
false
48 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Problema 1…
public class Test {
public static void main(String[] a)}new Test();} Test() {
P p1=new P();
p1.x=1; p1.y=2;
P p2=null;
System.out.println(p1.equals(p2)); System.out.println(p1==p2); }
}
Error!
49 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
equals per la classe P, v.2 class P {
int x; int y; public String toString() {
return ("x="+x+" ; y="+y);
}
public boolean equals(P var){
if(var==null) return false; return (x==var.x && y=var.y)
}
}
50 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Problema 2… Equals deve comparare due Objects!
public class Test {
public static void main(String[] a)}new Test();} Test() {
P p1=new P();
p1.x=1; P1.y=2;
Integer p2=new Integer(3);
System.out.println(p1.equals(p2)); System.out.println(p1==p2); }
}
false
false
51 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
equals per la classe P, v.3 class P {
int x; int y; public String toString() {
return ("x="+x+" ; y="+y);
}
public boolean equals(Object var){
if (!(var instanceof P)) return false; if(var==null) return false;
return (x==((P)var).x && y=((P)var).y)
}
}
52 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Problema 3…
public class Test {
public static void main(String[] a)}new Test();} Test() {
P p1=new P();
p1.x=1; p1.y=2;
Q p2=new Q();
p2.x=1; p2.y=2; System.out.println(p1.equals(p2));
System.out.println(p1==p2); }
}
true
false
Class Q extends P {
int z; }
53 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
equals per la classe P, v.3b class P {
int x; int y; public String toString() {
return ("x="+x+" ; y="+y);
}
public boolean equals(Object var){
if(var==null) return false; if (var.getClass() != this.getClass()) return false;
return (x==((P)var).x && y=((P)var).y)
}
}
54 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
e ora…
public class Test {
public static void main(String[] a)}new Test();} Test() {
P z1=new P();
p1.x=1; P1.y=2;
Q p2=new Q();
p2.x=1; p2.y=2; System.out.println(p1.equals(p2));
System.out.println(p1==p2); }
}
false
false
Class Q extends P {
int z; }
55 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Quale soluzione scegliere? if (o.getClass() != this.getClass()) return false;
oppure
if (!(var instanceof P)) return false;
?
Dipende...
56 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Proprietà richieste ad equals The equals method implements an equivalence relation:
It is reflexive: for any reference value x, x.equals(x) should return true.
It is symmetric: for any reference values x and y, x.equals(y)
should return true if and only if y.equals(x) returns true. It is transitive: for any reference values x, y, and z, if x.equals(y)
returns true and y.equals(z) returns true, then x.equals(z) should return true.
57 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Proprietà richieste ad equals Additional properties:
It is consistent: for any reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the object is modified.
For any non-null reference value x, x.equals(null) should return
false.
58 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
equals e hashCode Programmers should take note that
any class that overrides the Object.equals method must also override the
Object.hashCode method in order to satisfy the general contract for the
Object.hashCode method. In particular, c1.equals(c2) implies that
c1.hashCode()==c2.hashCode() (the vice versa need not be true)
59 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Sezione: Costruttori
Costruttori
60 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Definizione dei costruttori
Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il
costruttore A();
Se invece definisco almeno un costruttore non void, ad es. A(int s), il sistema non crea il
costruttore A();
61 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Definizione dei costruttori
Se B è figlia di A, il costruttore di B come prima cosa invoca A(), a meno che la prima istruzione
non sia una super.
B(int k) { super(k)... }
A(int k) { ... }
A() { ... }
B(int k) { ... }
62 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Invocazione dei costruttori public class A { public A() {
System.out.println("Creo A"); } }
public class B extends A { public B() {
System.out.println("Creo B"); }
public B(int k) { System.out.println("Creo B_int”);
} }
Output: Creo A Creo B_int
public static void main(String [] a) { B b=new B(1); }
63 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Invocazione dei costruttori public class A {
public A(int k) { System.out.println("Creo A");
} }
public class B extends A { public B() {
System.out.println("Creo B"); }
public B(int k) { System.out.println("Creo B_int”);
} }
Output: ERRORE ! Perchè ?
public static void main(String [] a) { B b=new B(1); }
64 Fa
c.Sc
ienz
e –
Uni
vers
ità d
i Tre
nto
Programmazione 2 - Marco Ronchetti
Unified Modeling Language
class C {…} class B extends C {…}
Esiste una notazione grafica per mostrare le relazioni di ereditarietà.
Object
String C
B
Tutte le classi ereditano da Object!