Newsgroup: it.comp.java
Titolo: Problema compilazione - metodo statico

salve a tutti, ho appena iniziato a programmare in java ma ho un problema
con la compilazione di un semplice programma.
E' un programma banale, che stampa gli interi minori di 37; se non uso il
metodo somma tutto ok, se provo con "somma" il risultato �:
non-static method somma(int) cannot be referenced from a static context
Ho cercato su google ma non riesco a capire perch� non funziona; cosa c'� di
sbagliato e cosa dovrei modificare per farlo compilare? (non uno eclipse o
simili, per ora mi accontento della riga di comando, "javac integers.java").
il listato del programma �
import java.util.*;
public class integers
{
        public static void main(String[] args)
        {
                int b=0;
                do
                {
                        b=somma(b);
                        System.out.println(b);
                }
                while(b<37);
        }
        public int somma(int a){
                return a+1;
        }
}
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 non-static method somma(int) cannot be referenced from a static context
La funzione "somma" non ï¿œ statica ma viene richiamata dalla funzione 
"main" che ï¿œ statica. Questo ovviamente non si puï¿œ fare. Per funzionare 
devi dichiarare statica anche la funzione "somma".
Il problema qui perï¿œ ï¿œ nei fondamenti della programmazione ad oggetti, 
non in Java in particolare. Un metodo "statico" ï¿œ un particolare metodo 
che esiste e puï¿œ essere eseguito senza creare un'istanza della classe, 
esattamente come gli attributi statici. E' ovvio quindi che quando un 
metodo statico viene chiamato ma non c'ï¿œ un'istanza, i metodi relativi 
all'oggetto di quella classe non esistono e non possono essere eseguiti.
Enrico


Grazie per la risposta, Enrico.
Quindi se ho ben capito, supponiamo di dichiarare una classe "cellulare" per
rappresentare un telefono mobile.
Dichiarer� una istanza di questa classe (un telefonino) con
cellulare telefonino=new cellulare;
Supponiamo inoltre di creare una classe sendSMS relativa a cellulare che
invii un sms. la dichiarazione sar� simile a
public int sendSMS()
(immagino che sendSMS restituisca 0 se tutto � andato bene e qualcosa
diverso da 0 in caso di errori).
quindi per richiamare la funzione far� qualcosa tipo
telefonino.sendSMS();
Se poi all'interno di sendSMS volessi inserire una funzione che dato in
ingresso il numero di caratteri inseriti restituisca il numero di caratteri
rimanenti facendo il semplice calcolo (160 - caratteriInseriti), avr�
qualcosa simile a
public static calcolaCaratteriRimanenti(int caratteriInseriti)
sendSMS non doveva (e non poteva, giusto?) essere dichiarata come static, ma
questa s�, indipendentemente da dove venga dichiarata (all'interno della
classe cellulare o in qualsiasi altro posto).
Esatto?


 Esatto?
sendSMS per logica (penso) non poteva essere dichiarata come static, 
mentre calcolaCaratteriRimanenti ad occhio puï¿œ essere static.
Quello che non puoi fare ï¿œ solo chiamare un metodo (o un attributo) da 
un contesto static ad uno non-static. Il resto si (static-static, 
non-static<->non-static, non-static<->static).
puoi usare calcolaCaratteriRimanenti sia senza un'istanza:
cellulare.calcolaCaratteriRimanenti()
sia dall'istanza:
cellulare tel = new cellulare();
tel.calcolaCaratteriRimanenti();
MA sendSMS puoi usarlo solo se hai un'istanza della classe, perchï¿œ non ï¿œ 
statico.
Enrico

 cellulare telefonino=new cellulare;
Convenzione vuole che i nomi di classe siano maiuscoli. Inoltre, 
l'invocazione del costruttore vuole le parentesi:
new Cellulare();
Ciao.