PDA

View Full Version : problema main[java]


nuovoUtente86
28-06-2007, 15:35
quando faccio qualcosa del genere

public Classe{

costruttore
metodi.....

public static void main(String[]args){

Classe=new Classe();}}

Mi dice che non posso utilizzare un oggetto o metodo non statico in un contesto statico e sono costretto a fare il metodo main in una classe a parte però vedo in giro che molti lo inseriscono come nell esempio su indicato a me.Dove sbaglio?

PGI-Bis
28-06-2007, 17:08
Il breve esempio che riporti è corretto.

public class Classe {

public static void main(String[] args) {
Classe istanzaDi = new Classe();
}
}

L'unica cosa che occorre ricordare è che in un contesto statico (metodo statico, blocco di inizializzazione statico, inizializzatore di un campo statico, invocazione di super costruttore e invocazione di costruttore alternato) non esiste il "this". Il resto è una conseguenza diretta di questa mancanza.

nuovoUtente86
28-06-2007, 17:42
come mai mi da quell' errore?

PGI-Bis
28-06-2007, 18:39
Il compilatore rileva nel tuo codice l'uso di un identificatore (il nome di un campo o di un metodo) che non può essere risolto se non preponendo il riferimento "this".

Poichè tale riferimento non esiste in un contesto statico, ti arriva il messaggio di errore: in un contesto statico non puoi usare qualcosa che richieda la preposizione di this.

Ad esempio:

public class Classe {
private int valore;

public static void main(String[] args) {
int x = valore;
}
}

L'unica cosa che il compilatore può riconoscere in "valore" è l'intero dichiarato come campo delle istanze di Classe.

Si dice che certe cose siano membri di (istanza) per sottolineare il fatto che non è possibile usarli senza passare per chi li possieda.

Per valore, il possessore è una qualsiasi istanza di Classe.

Questa istanza non è specificata nell'enunciato in rosso. Se l'istanza a cui appartiene un membro non è specificata, allora il compilatore usa il valore "this". Cioè dice:

int x = this.valore

In un contesto statico non esiste un'istanza corrente, non c'è un this. E salta fuori quel messaggio di errore.

E' corretto invece dire:

public class Classe {
private int valore;

public static void main(String[] args) {
Classe istanza = new Classe();
int x = istanza.valore;
}
}

Qui l'accesso al campo "valore" è fatto non rispetto a "this" ma rispetto ad un riferimento che esiste in un contesto statico, essendo "istanza" dichiarata nel corpo del metodo statico main.

E' anche corretto dire:

public class Classe {
private static Classe istanza = new Classe();

private int valore;

public static void main(String[] args) {
int x = istanza.valore;
}
}

Dal punto di vista della questione esiste o non esiste un riferimento dichiarato in un contesto statico, questa situazione è identica alla precendete.

"instanza" è dichiarato "static", esiste in un contesto statico.

Nell'altro contesto statico, quello del metodo main, l'uso di "istanza" è quindi pienamente legittimo.