2013-10-20 8 views
6

करने के लिए एक स्थिर संदर्भ नहीं कर सकता यह जावा में मेरी पहली कार्यक्रम है और मैं इस समस्या इस त्रुटि को समझने के लिए आ रही हैंजावा गैर स्थिर क्षेत्र

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

और

एक स्थिर संदर्भ नहीं कर सकते गैर स्थैतिक विधि *

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करने के लिएक्या आप मुझे कोई सुझाव दे सकते हैं? मैं एंड्रॉइड पर सैंडिड पर कोडिंग कर रहा हूं

उत्तर

17

आप एक स्थिर विधि के भीतर से उदाहरण विधियों और फ़ील्ड को कॉल कर रहे हैं, ऐसा कुछ नहीं किया जा सकता है क्योंकि उदाहरण फ़ील्ड और विधियां किसी ऑब्जेक्ट के बिना मौजूद नहीं हैं, और अंदर मुख्य विधि this ऑब्जेक्ट नहीं है। आपको इसके बजाय कक्षा का एक उदाहरण बनाना होगा, और फिर उदाहरण पर विधियों को कॉल करना होगा।

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; 
    } 

} 

अन्य समस्याओं के बहुत सारे, ...

  • आप वर्ग क्षेत्रों सीधे, कुछ है कि नहीं किया जाना चाहिए पहुँच बना रहे हैं। इसके बजाए, फ़ील्ड निजी होनी चाहिए और फ़ील्ड प्राप्त करने, सेट करने और सेट करने के लिए आपको गेटर्स/सेटर्स/कन्स्ट्रक्टर पैरामीटर का उपयोग करना चाहिए।
  • आपका कोड यह बहुत मुश्किल पढ़ने और समझने में बनाने इंडेंट नहीं की गई है।

इस साइट खोज करें के रूप में यह एक ही प्रश्न पूछा गया है और एक gabizillion बार उत्तर दिया, और सबसे अधिक संभावना है कि वहाँ एक जवाब वहाँ बाहर है कि मेरा तुलना में काफी बेहतर है। यदि पाया जाता है, तो यह प्रश्न डुप्लिकेट के रूप में बंद होना चाहिए।


संपादित
आप राज्य:

मैं समझ में नहीं आया "इसके बजाय, फ़ील्ड निजी होना चाहिए और आप getters/setters/contructor मापदंडों का उपयोग करना चाहिए प्राप्त करने के लिए, सेट और सेट खेत।" मुझे निजी फ्लोट c_cfr() लिखना चाहिए?

आपका क्षेत्र हैं:

float r; 
float area; 
float cfr; 

यह वास्तव में एक क्षेत्र नहीं है, लेकिन एक स्थिर है: अंतिम डबल अनुकरणीय = 3.14;

और बदला जा सकता है/सुधार बस Math.PI. का उपयोग करके

आपका क्षेत्रों के लिए बदल दिया जाना चाहिए:

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

और आप केवल उन्हें सार्वजनिक मनुष्य और सेटर तरीके के माध्यम से पहुंच जाना चाहिए, और केवल अगर बिल्कुल जरूरी।

+0

ठीक है, इसलिए मुझे कक्षा में ऑब्जेक्ट बनाने की आवश्यकता है जहां मुझे वर्ग में घोषित स्वामित्व और विधियों का उपयोग करना है, है ना? – Mitro

+0

@AlessioMTX: उत्तर देने के लिए संपादित देखें। आपको मुख्य विधि के अंदर सेर्चियो प्रकार का एक चर बनाना होगा और इसे एक नया सर्चियो ऑब्जेक्ट असाइन करना होगा, और फिर आप इस चर के तरीकों को बंद कर सकते हैं। ऑब्जेक्ट सृजन पर आपकी पाठ्यपुस्तक के अध्यायों में यह सब अच्छी तरह से समझाया जाना चाहिए। कृपया एक नज़र डालें। –

+0

ठीक है धन्यवाद, यह एक बेवकूफ त्रुटि थी, लेकिन मुझे आपके जैसे स्पष्टीकरण की आवश्यकता है। मैंने कोड तय किया है, इसलिए अब पढ़ना आसान है, हालांकि सही नहीं है। – Mitro

0

सरल फिक्स प्रत्येक विधि के सामने स्थिर शब्द रखना है।यह एक सार्वभौमिक स्थैतिक सत्य परिधि = 2pi * आर है आपका सर्कल मेरे सर्कल (सर्कल के दोनों उदाहरणों) से बड़ा हो सकता है लेकिन क्षेत्र को खोजने के लिए एक सूत्र

0

c_cfr() और c_area() गैर स्थैतिक विधियां हैं आप सीधे स्थिर मुख्य विधि से कॉल करने की कोशिश कर रहे हैं। या तो विधियों को c_cfr() और c_area() को स्थिर के रूप में भी बनाएं या ऑब्जेक्ट संदर्भ का उपयोग करके उन्हें एक्सेस करें।

संबंधित मुद्दे