2016-09-20 6 views
6

यह वास्तव में प्राथमिक प्रश्न हो सकता है लेकिन यह मुझे जावा जावा सीखने के इस चरण में पहेली करता है। मैं कोड का निम्न भाग मिल गया है:एक विधि के भीतर से किसी ऑब्जेक्ट पर एक विधि को कॉल करना

package com.soti84; 

    import java.util.ArrayList; 

    public class InvokeMethod { 

    public static void main(String[] args) { 

    ArrayList<String> exams= new ArrayList<String>(); 
    exams.add("Java"); 
    exams.add("C#");  

    }   

    } 

अगर मैं लाइन है कि ArrayList वस्तु और विधि के बाहर उस वस्तु पर कॉल को दर्शाता है, लाइन है कि बनाता है वस्तु ठीक है पर जोड़ने के लिए कदम() ऑब्जेक्ट पर विधि कॉल की अनुमति नहीं है। ऐसा क्यों है?

package com.soti84; 

    import java.util.ArrayList; 

    public class InvokeMethod { 
    ArrayList<String> exams= new ArrayList<String>(); 
    exams.add("Java"); 
    exams.add("C#");  

    public static void main(String[] args) { 

    } 

    } 

धन्यवाद।

+0

[? क्या एक प्रारंभ ब्लॉक है] (http://stackoverflow.com/questions/3987428/what-is -न-प्रारंभिक-ब्लॉक) – blackpen

उत्तर

3

आप बस उस कोड को विधियों के बाहर नहीं कर सकते हैं। यदि आप ऐसा करना चाहते हैं तो आपको प्रारंभकर्ता ब्लॉक या स्थैतिक ब्लॉक की आवश्यकता होगी।

public class InvokeMethod { 
    ArrayList<String> exams= new ArrayList<String>(); 
    { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

अब जब आप कोई उदाहरण बनाते हैं तो वह ब्लॉक निष्पादित होगा। यदि आपका चर स्थिर था, तो आप उस ब्लॉक को स्थिर बना सकते हैं (बस उस ब्लॉक से पहले static जोड़ें)। आपकी कक्षा शुरू होने पर स्टेटिक ब्लॉक निष्पादित होगा। जब आप एक आबादी वाले स्थिर सूची/मानचित्र की आवश्यकता होती है तो वे ब्लॉक काफी सुविधाजनक हो सकते हैं। संभोग, प्रोग्रामिंग में सुविधाजनक सब कुछ शायद एक बुरा अभ्यास है, और यहां वही है, उन ब्लॉकों को कुछ लोगों द्वारा फेंक दिया जाता है, वे काफी खतरनाक हो सकते हैं और मुश्किल से खोजने वाली बग (ज्यादातर निष्पादन के आदेश के बारे में) का कारण बन सकते हैं।

+0

संपूर्ण उत्तरों के लिए सभी (और विशेष रूप से व्हाट्स) धन्यवाद। – soti84

0

क्योंकि "आप इसे समारोह/विधि बाहर से कॉल कर रहे हैं" है कि

ArrayList<String> exams= new ArrayList<String>(); 

रेखा से ऊपर है कि आप एक वस्तु की संपत्ति के रूप में यह घोषणा कर रहे हैं। जिसका अर्थ है कि आप इसे केवल विधि के अंदर ही एक्सेस कर सकते हैं।

आप में निम्नलिखित जगह जा रहे हैं अपने मुख्य

exams.add("Java"); 
exams.add("C#"); 

हालांकि आप विधि के बाहर "परीक्षा" घोषित कर दिया यह ठीक काम करना चाहिए।

1

दो उदाहरणों में आप दो पूरी तरह से अलग-अलग चीजों को प्राप्त करने की कोशिश कर रहे हैं।

पहले उदाहरण में आप ArrayList को main विधि के अंदर घोषित करते हैं, इसलिए सूची का दायरा केवल यह तरीका होगा। संलग्न कक्षा में ArrayList के साथ बिल्कुल कोई संबंध नहीं है।

दूसरे में आप कक्षा में exams नामक डेटा सदस्य बनाने का प्रयास करते हैं। इसका मतलब है कि इस वर्ग के हर उदाहरण की अपनी सूची होगी।

तत्वों के अतिरिक्त काम नहीं करते हैं, क्योंकि "तरीकों से बाहर" केवल घोषणा और प्रारंभिकता हो सकती है।

public class InvokeMethod { 
    ArrayList<String> exams = new ArrayList<String>(); 
    { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

    public static void main(String[] args) { 
    } 
} 

या, वर्ग के निर्माता:

public class InvokeMethod { 
    ArrayList<String> exams = new ArrayList<String>(); 

    public InvokeMethod() { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

    public static void main(String[] args) { 

    } 
} 

नोट: कि ठीक करने के लिए, आप एक initialization block उपयोग कर सकते हैं तुम भी का एक उदाहरण के माध्यम से main विधि से इस सूची को प्राप्त कर सकते हैं InvokeMethod वर्ग:

public class InvokeMethod { 
    ArrayList<String> exams = new ArrayList<String>(); 

    public InvokeMethod() { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

    public static void main(String[] args) { 
     InvokeMethod invokeMethod = new InvokeMethod(); 
     System.out.println(invokeMethod.exams.toString()); 
     invokeMethod.exams.add("Delphi"); 
     System.out.println(invokeMethod.exams.toString()); 
    } 
} 

प्रिंट होगा
[Java, C#] 
[Java, C#, Delphi] 
0

Java language specification के अनुसार, कक्षा निकाय घोषणा में इंस्टेंस प्रारंभकर्ता है लेकिन विधि आमंत्रण नहीं है। तो अपने उदाहरण ArrayList<String> exams= new ArrayList<String>(); में वर्ग शरीर के अंदर की अनुमति है लेकिन नहीं exams.add("Java");

JLS अंश:

ClassBody: 
    { ClassBodyDeclarationsopt } 

ClassBodyDeclarations: 
    ClassBodyDeclaration 
    ClassBodyDeclarations ClassBodyDeclaration 

ClassBodyDeclaration: 
    ClassMemberDeclaration 
    InstanceInitializer 
    StaticInitializer 
    ConstructorDeclaration 

ClassMemberDeclaration: 
    FieldDeclaration 
    MethodDeclaration 
    ClassDeclaration       
    InterfaceDeclaration 
    ;  
संबंधित मुद्दे