Argomenti: tipi primitivi, tipi reference, ugualianza per riferimento e ugualianza per valore.
Data una classe Persona
:
public class Persona {
String nome;
int eta;
public Persona(String nome, int eta) {
this.nome = nome;
this.eta = eta;
}
}
Se eseguo in un metodo (ad esempio il main
) il seguente codice:
Persona p = new Persona("Marco", 7);
int anno = 2011;
Disegnare lo stato della memoria facendo vedere differenza tra i tipi primitivi e i tipi reference.
Abbiamo due oggetti persA
e persB
della classe Persona
:
Persona persA = new Persona("A", 5);
Persona persB = new Persona("B", 6);
Fate vedere con disegno la situazione in memoria delle due variabili di tipo reference:
Ora se eseguo l'assegnamento:
persB = persA;
Fate vedere con disegno come le reference sono cambiate:
Ora eseguo il seguente assegnamento:
persA.nome = "Giuseppe";
Domanda: quanto vale persB.nome
?
Sempre con la classe Persona
abbiamo il seguente codice:
Persona persA = new Persona("A", 5);
Persona persB = new Persona("A", 5);
Domanda:
- il confronto
persA == persB
è TRUE o FALSE? RISPOSTA:
Ora eseguiamo il seguente assegnamento:
Persona persC = persA;
Domanda:
- ora il confronto
persC == persA
è TRUE o FALSE? RISPOSTA e motivazione: persC.equals(persA)
ritorna TRUE o FALSE? RISPOSTA e motivazione:persB.equals(persA)
ritorna FALSE, datene la spiegazione:
Cosa dovrei fare perchè ritorni TRUE e cioè esegua il confronto per valore? Spiega con tue parole e/o scrivendo il codice (anche se non perfetto, basta che sia chiaro il concetto):
Dato il seguente codice:
String aS = new String("Pippo");
String bS = new String("Pippo");
// 1
if(aS == bS) {
System.out.println("aS == bS");
} else {
System.out.println("aS NOT == bS");
}
// 2
if(aS.equals(bS)) {
System.out.println("aS equals bS");
} else {
System.out.println("aS NOT equals bS");
}
Integer a1 = new Integer(5);
Integer a2 = new Integer(5);
// 3
if(a1 == a2) {
System.out.println("a1 == a2");
} else {
System.out.println("a1 NOT == a2");
}
// 4
if(a1.equals(a2)) {
System.out.println("a1 equals a2");
} else {
System.out.println("a1 NOT equals a2");
}
Scrivete l'output del programma:
CONDIZIONE | OUTPUT |
---|---|
aS == bS |
_____________________________________________ |
aS.equals(bS) |
_____________________________________________ |
a1 == a2 |
_____________________________________________ |
a1.equals(a2) |
_____________________________________________ |
Data la funzione:
static void modificaTipoPrimitivo(int value) {
value++; // incremento value di 1
System.out.println("modificaTipoPrimitivo VALUE: " + value);
}
Eseguendo il seguente codice in un metodo (ad esempio nella funzione main):
int val = 8;
modificaTipoPrimitivo(val);
System.out.println("dopo funzione VALUE: " + val);
Scrivere l'output (all'interno del metodo e fuori dal metodo):
Ora data la funzione:
static void modificaTipoReference(Persona persona) {
persona.nome = "Ambrogio";
persona.eta++; // incremento di 1
System.out.println("modificaTipoReference: NOME: " +
persona.nome + " - ETA'; " + persona.eta);
}
eseguendo il codice:
Persona pA = new Persona("Mario", 20);
System.out.println("PRIMA - NOME: " + pA.nome + " - ETA': " + pA.eta);
modificaTipoReference(pA);
System.out.println("modificaTipoReference: NOME: " + pA.nome + " - ETA': " + pA.eta);
Scrivere l'output:
Ora data la funzione:
static void modificaTipoReferenceReassignment(Persona persona) {
Persona personaNew = new Persona(persona.nome, persona.eta);
personaNew.nome = "Ambrogio";
personaNew.eta++; // incremento di 1
System.out.println("modificaTipoReferenceReassignment: NOME: " +
personaNew.nome + " - ETA'; " + personaNew.eta);
}
eseguendo il codice:
Persona pB = new Persona("Chiara", 45);
System.out.println("PRIMA - NOME: " + pB.nome + " - ETA': " + pB.eta);
modificaTipoReferenceReassignment(pB);
System.out.println("modificaTipoReferenceReassignment: NOME: " + pB.nome + " - ETA': " + pB.eta);
Scrivere l'output:
Risposta alla domanda 3°, perché venga eseguito il confronto per valore su oggetti e non semplicemente per reference, è eseguire l'overrdide del metodo equals
: esempio la classe testbase.PersonaEqualsOverride
dove viene eseguito l'overrdide di equals per fare il contollo sul campo nome
ed eta
dell'oggetto. In testbase.DomandaTreTest
c'è il test.