31
34 Fac.Scienze – Università di Trento 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?

package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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?

Page 2: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 3: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 4: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

37 Fa

c.Sc

ienz

e –

Uni

vers

ità d

i Tre

nto

Programmazione 2 - Marco Ronchetti

Fondamenti di Java

Uguali o identici?

Page 5: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

}

}

Page 6: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

}

}

Page 7: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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!

Page 8: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 9: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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?

}

}

Page 10: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 11: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 12: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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?

Page 13: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 14: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 15: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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!

Page 16: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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)

}

}

Page 17: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 18: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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)

}

}

Page 19: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 20: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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)

}

}

Page 21: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 22: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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...

Page 23: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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.

Page 24: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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.

Page 25: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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)

Page 26: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

59 Fa

c.Sc

ienz

e –

Uni

vers

ità d

i Tre

nto

Programmazione 2 - Marco Ronchetti

Sezione: Costruttori

Costruttori

Page 27: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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();

Page 28: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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) { ... }

Page 29: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 30: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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

Page 31: package structures; import java.util.*; public abstract ...latemar.science.unitn.it/segue_userFiles/2014Programmazione2/201… · 34 Programmazione 2 - Marco Ronchetti package structures;

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!