esattamente....i campi statici di una classe sono condivisi da tutte le istanze della stessa e se ne viene cambiato uno cambiano tutte.
posso metterci anke un po' del mio x aiutarti a capire bene la differenza tra metodi statici e non. Praticamente i metodi non static (di solito) accedono allo stato dell'oggetto su cui stai operando e vanno richiamati con la solita forma:
<oggetto>.<nome metodo non statico> (<parametri>)
i metodi statici invece non hanno un oggetto implicito che viene passato (come è stato giustamente detto) e quindi la loro forma è la seguente:
<nome metodo non statico> (<parametri>)
proprio per questo vanno chiamati (dall'esterno della classe) metendoci prima il nome della classe stessa che li contiene;
ti faccio un esempio (si tratta di una classe che gestisce un Vector di interi)
codice:
import java.util.*;
public class intVector {
private Vector v;
public intVector () {
v = new Vector();
}
public void addElem (int k) {
v.addElement(new Integer(k));
}
public int len () {
return v.size();
}
public void setAt (int a , int index) {
v.setElementAt(new Integer(a) , index);
}
public void removeElem (int index) {
if (index < len()) v.removeElementAt(index);
}
public int get (int index) {
return ((Integer) (v.elementAt(index))).intValue();
}
public static void swap (int index1 , int index2 , intVector p) {
int tmp = p.get(index1);
int tmp2 =p.get(index2);
p.setAt(tmp , index2);
p.setAt(tmp2 , index1);
}
}
praticamente con questa classe se devi invocare un metodo qualsiasi (tranne swap) lo chiami come <oggetto intVector>.<metodo>
altrimenti con la sintassi scritta prima.
"e l'utilità di tutto questo casino?" dirai tu?
serve...in praticolare in un caso (correggetemi se sbaglio)
quando hai bisogno di una funzione particolare (e non di scrivere un intera classe per definire un nuovo Tipo di dato) che dati degli input ti dia un output...semplicissima..tipo la seguente:
codice:
public static void main (String [] args) {
int a;
a = fatt(3);
}
public int fatt (int a) {
if (a<2) return 1;
return a*fatt(a-1);
}
bene...questa cosa non te la compilerà mai...dato che fatt non è un metodo statico e quindi si aspetta di essere chiamato con un oggetto "dietro". C'è di più...se tu metti questo main e questa funzione nella classe di prima, per chiamare questo metodo x calcolare il fattoriale di 5 devi usare la scomoda (e inutile) procedura:
intVector a;
int k;
.
.
.
.
k = a.fatt(5);
perchè richiede (essendo non statico) un oggetto implicito. se invece fatt è statico basta fare come nel primo main e cioè:
spero di non avere sparato cavolate (anche se effettivamente il compilatore mi sta dando ragione
ma soprattutto spero di averti aiutato.
ciauz!