2013-10-20 22 views
6

questo è il mio primo programma in Java e sto avendo problemi a capire questo erroreJAVA non possono fare un riferimento statico al campo non statico

Cannot make a static reference to the non-static field * 

e

può non fare un riferimento statico il metodo non statico *

public class Cerchio{ 

    float r; 
    float area; 
    float cfr; 
    final double pi = 3.14; 

    public static void main(String[] args){ 
     System.out.println("CIRCLE PROGRAM\n"); 
     r = 5; 
     c_cfr(); 
     c_area(); 
     System.out.ptintln("The cir is: " + cfr); 
     System.out.println("The area is: " + area); 
    } 

    float c_cfr(){ 
     cfr =(float)(2 * pi * r); //casting 
     return cfr; 
    } 

    float c_area(){ 
     area = (float)(pi * (r*r)); 
     return area; 
    } 

} 

errors Potete darmi qualche suggerimento? Sto codificando su SandIDE su Android

risposta

17

Si stanno chiamando metodi e campi di istanza da un metodo statico, qualcosa che non può essere eseguito perché campi e metodi di istanza non esistono senza un oggetto e all'interno del metodo principale non c'è l'oggetto this. È necessario invece creare un'istanza della classe e quindi chiamare i metodi sull'istanza.

public class Cerchio{ 

    float r; 
    float area; 
    float cfr; 
    final double pi = 3.14; 

    public static void main(String[] args){ 
    System.out.println("CIRCLE PROGRAM\n"); 

    Cerchio cerchio = new Cerchio(); 
    cerchio.r = 5; 
    cerchio.c_cfr(); 
    cerchio.c_area(); 
    System.out.ptintln("The cir is: " + cerchio.cfr); 
    System.out.println("The area is: " + cerchio.area); 
    } 

    float c_cfr(){ 
    cfr =(float)(2 * pi * r); //casting 
    return cfr; 
    } 

    float c_area(){ 
    area = (float)(pi * (r*r)); 
    return area; 
    } 

} 

Un sacco di altri problemi, ...

  • si sta accedendo campi di classe direttamente, cosa che non dovrebbe essere fatto. Invece, i campi dovrebbero essere privati ​​e dovresti usare i parametri getter/setter/contructor per ottenere, impostare e impostare i campi.
  • Il tuo codice non è interessato e rende molto difficile la lettura e la comprensione.

Si prega di cercare questo sito come questa stessa domanda è stata fatta e ha risposto a tempi di gabizillion, e molto probabilmente c'è una risposta là fuori che è molto meglio della mia. Se trovato, questa domanda dovrebbe essere chiusa come duplicato.


Modifica
È stato:

non ho capito "Invece, i campi dovrebbero essere privati ​​e si dovrebbe utilizzare getter/setter/parametri contructor per ottenere, impostare e impostare i campi." Dovrei scrivere float privato c_cfr()?

I suoi campi sono:

float r; 
float area; 
float cfr; 

Questo in realtà non è un campo, ma una costante: finale doppia pi = 3.14;

e può essere sostituito/migliorato semplicemente utilizzando Math.PI.

I suoi campi dovrebbe essere cambiata a:

private float r; 
private float area; 
private float cfr; 

e si dovrebbe accedervi solo tramite metodi getter e setter pubblici, e solo se assolutamente necessario.

+0

Ok, quindi ho bisogno di creare l'oggetto nella classe in cui devo usare le proprietà e i metodi dichiarati nella classe, giusto? – Mitro

+0

@AlessioMTX: vedi modifica per rispondere. Devi creare una variabile di tipo Cerchio all'interno del metodo principale e assegnargli un nuovo oggetto Cerchio, e quindi puoi chiamare metodi fuori da questa variabile. Questo dovrebbe essere ben spiegato nei capitoli del tuo libro di testo sulla creazione di oggetti. Per favore guarda. –

+0

Ok grazie, è stato un errore stupido, ma ho bisogno di una spiegazione come la tua. Ho corretto il codice, quindi ora è facile da leggere, anche se non è corretto. – Mitro

0

La soluzione semplice consiste nel mettere la parola static di fronte a ciascun metodo.È una circonferenza della verità statica universale = 2pi * r il tuo cerchio può essere più grande del mio cerchio (entrambe le istanze del cerchio) ma per trovare l'area c'è una formula

0

c_cfr() e c_area() sono metodi non statici che stai provando a chiamare direttamente dal metodo principale statico. Rendi anche i metodi c_cfr() e c_area() come statici o accedici utilizzando il riferimento all'oggetto.

Problemi correlati