federico992 ha scritto:
Ho capito vagamente le variabili di istanza che in sostanza sono un attributo di una classe/oggetto???? boh..
Le variabili "di istanza" (non static) appartengono distintamente a ciascun oggetto mentre le variabili "di classe" (static) appartengono alla classe, sono "uniche", indipendentemente da quante istanze ci sono della classe.
public class Prova {
public static int numeroA; // variabile "di classe"
public int numeroB; // variabile "di istanza"
}
numeroA è di classe, ne esiste uno solo, mentre ciascun oggetto istanza di Prova ha il
suo proprio campo numeroB.
Se fai:
Prova p1 = new Prova();
Prova p2 = new Prova();
Le espressioni Prova.numeroA (questo è il modo convenzionale di accederci) oppure p1.numeroA oppure p2.numeroA fanno riferimento alla stessa identica variabile. Il valore è unico.
Mentre p1.numeroB può avere un valore e p2.numeroB può averne un altro.
federico992 ha scritto:
e non ho proprio capito set e get
I metodi getter/setter permettono di applicare la tecnica del "incapsulamento".
Se in Prova sopra volessi garantire che numeroB sia sempre e solo maggiore di 0, non potrei farlo. Il campo è pubblico, chiunque ha il riferimento all'oggetto può cambiarne il valore senza vincoli.
Allora si mette il campo private e si mettono i metodi getter/setter pubblici:
public class Prova {
private int numeroB;
public int getNumeroB() {
return numeroB;
}
public void setNumeroB(int numeroB) {
if (numeroB <= 0) {
throw new IllegalArgumentException("numeroB deve essere maggiore di 0");
}
this.numeroB = numeroB;
}
}
Così posso garantire quel vincolo.
federico992 ha scritto:
The method printf(String, Object[]) in the type PrintStream is not applicable for the arguments (String, String)
printf è di Java 5 ed è un metodo "varargs" (con numero variabile di argomenti).
Sicuramente hai un JDK 5 o superiore (altrimenti printf non esisterebbe proprio) ma assicurati che il compilatore stia compilando per Java 5 o più .... e non con target es. 1.4)