JShell एक संपूर्ण एप्लिकेशन को संकलित और चलाने के बिना शेल वातावरण में कोड स्निपेट चलाने के लिए एक कमांड-लाइन टूल है। JShell Java 9 में एक नई सुविधा है। JShell का उपयोग किसी एप्लिकेशन को विकसित करते समय कोड स्निपेट का परीक्षण और डीबग करने के लिए किया जा सकता है। JShell इनपुट एक पूर्ण कोड स्निपेट के रूप में होना चाहिए। हमने JShell को दो लेखों के साथ पेश किया, "NetBeans 9.0 में Java 9 में JShell का उपयोग करना, भाग 1," और "NetBeans 9.0, भाग 2 में Java 9 में JShell का उपयोग करना," जिसमें हमने import चलाने पर चर्चा की। कथन, घोषित करना और चर का उपयोग करना, स्ट्रिंग . की तुलना करना s, और चल रहे बयान। इस निरंतरता लेख में, हम जावा विधियों के लिए स्निपेट चलाएंगे। इस लेख में निम्नलिखित भाग हैं:
- पर्यावरण की स्थापना
- तरीकों का उपयोग करना
- विधि परिभाषा को संशोधित करना
- विधि ओवरलोडिंग
- किसी विधि का संदर्भ देना
- सूचीबद्ध करने के तरीके
- शीर्ष-स्तरीय विधि घोषणाओं में संशोधक की अनुमति नहीं है
- निष्कर्ष
पर्यावरण की स्थापना
नेटबीन को डाउनलोड और इंस्टॉल करें, जैसा कि पिछले लेख में चर्चा की गई है। टूल>जावा प्लेटफॉर्म शेल खोलें . का चयन करके JShell लॉन्च करें , जैसा चित्र 1 में दिखाया गया है।
चित्र 1: टूल्स>जावा प्लेटफॉर्म शेल खोलें
तरीकों का उपयोग करना
एक विधि JShell में घोषित किया गया है जैसे कि यह जावा एप्लिकेशन में है, कुछ अंतरों के साथ, जिनकी चर्चा इस खंड में भी की गई है। उदाहरण के तौर पर, एक विधि घोषित करें triple(int) यह एक int . लेता है तर्क और एक int . देता है मूल्य।
int triple(int i) { return i*3; }
JShell में कोड स्निपेट चलाएँ और एक विधि बन जाती है।
[10]-> int triple(int i) { return i*3; } | created method triple(int)
ट्रिपल method विधि का आह्वान करें एक int . के साथ तर्क के रूप में मान।
triple(1)
तर्क मान तीन गुना और लौटाया जाता है।
[11]-> triple(1) | $13 ==> 3 [12]->
इस विधि में रिटर्न प्रकार और पैरामीटर हैं लेकिन कोई एक्सेस संशोधक नहीं है जैसे कि सार्वजनिक , निजी , या संरक्षित . ऐसा इसलिए है क्योंकि शीर्ष-स्तरीय विधि घोषणा, सभी शीर्ष-स्तरीय घोषणाओं के रूप में, परोक्ष रूप से सार्वजनिक है। शीर्ष-स्तरीय विधि घोषणा में किसी भी एक्सेस संशोधक को अनदेखा किया जाता है। निम्नलिखित सभी विधि घोषणाएँ पूर्ववर्ती विधि घोषणा के बराबर हैं।
[1]-> private int triple(int i){ return 3*i; } | created method triple(int) [2]-> protected int triple(int i){ return 3*1; } | replaced method triple(int) [3]-> public int triple(int i){ return 3*i; } | replaced method triple(int) [4]->
JShell संकलन-समय त्रुटियों को प्रदर्शित करता है, यदि कोई हो। उदाहरण के तौर पर, वापसी प्रकार की विधि को ट्रिपल . बनाएं स्ट्रिंग . के रूप में और एक त्रुटि संदेश प्रदर्शित होता है।
[10]-> String triple(int i) { return i*3; } | Error: | incompatible types: int cannot be converted to java.lang.String | return i*3; | ^-^
विधि परिभाषा को संशोधित करना
एक आउटपुट संदेश जो जावा एप्लिकेशन द्वारा उत्पन्न नहीं होगा और इस खंड में पहले से ही दो बार सूचीबद्ध है, "प्रतिस्थापित विधि ..." है। संदेश इंगित करता है कि एक विधि परिभाषा को संशोधित किया गया है। एक विधि घोषणा और अन्य घोषणाओं को बदलने/संशोधित करने का प्रावधान परीक्षण की सुविधा के लिए है।
एक नई विधि को परिभाषित किए बिना किसी विधि को संशोधित करने या बदलने के लिए, विधि हस्ताक्षर, जो कि विधि के नाम और विधि मापदंडों द्वारा निर्धारित किया जाता है, जिसमें मापदंडों की संख्या और उनके प्रकार और क्रम शामिल हैं, को संशोधित नहीं किया जाना चाहिए। उदाहरण के तौर पर, एक विधि घोषित करें hello वापसी प्रकार के साथ शून्य और एक स्ट्रिंग पैरामीटर टाइप करें।
[4]-> void hello(String s){ } | created method hello(String)
इसके बाद, वही विधि घोषित करें नमस्ते वापसी प्रकार के साथ स्ट्रिंग , एक स्ट्रिंग टाइप पैरामीटर, और रिटर्न स्टेटमेंट। नमस्ते . के लिए पिछली विधि घोषणा बदल दिया जाता है।
[5]-> String hello(String s){ return "Hello " + s; } | replaced method hello(String) [6]->
विधि का आह्वान करें hello(String) और दूसरी विधि परिभाषा "हैलो जॉन" संदेश को आउटपुट करने के लिए लागू की जाती है।
[6]-> hello("John") | $5 ==> "Hello John" [7]->
मेथड तर्कों को मेथड इनवोकेशन में जोड़ा जाता है, यदि आवश्यक हो, जैसा कि निम्नलिखित स्निपेट में है।
[7]-> hello("John"+" & "+"Johnny") | $22 ==> "Hello John & Johnny" [8]->
किसी विधि को संशोधित करने के पिछले उदाहरण में, हमने वापसी प्रकार void . को बदल दिया है स्ट्रिंग . के साथ . किसी विधि को बदलने के लिए रिटर्न को संशोधित करने की आवश्यकता नहीं है। एक उदाहरण के रूप में, एक विधि परिभाषित करें hello इस प्रकार है।
[15]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
इसके बाद, केवल रिटर्न को संशोधित करें बयान। विधि hello(String,String) बदल दिया जाता है।
[16]-> String hello(String str1, String str2){ return "Hello"+str1+str2; } | replaced method hello(String,String)
एक विधि कोड स्निपेट चलाने के एक अन्य उदाहरण के रूप में, एक विधि परिभाषित करें hello(String str1, String str2) वापसी प्रकार के साथ स्ट्रिंग[] ।
[17]-> String[] hello(String str1, String str2){ return new String[]{str1,str2}; } | created method hello(String,String)
एक सरणी वापस करने के लिए दो तर्कों के साथ विधि को आमंत्रित करें।
[18]-> hello("John","Michael") | $39 ==> String[2] { "John", "Michael" }
विधि ओवरलोडिंग
जावा एप्लिकेशन की तरह ही एक विधि को अतिभारित किया जा सकता है। एक विधि घोषित करें hello(String s) ।
[1]-> String hello(String s){ return "Hello " + s; } | created method hello(String)
संदेश को आउटपुट करने के लिए विधि का आह्वान करें।
[2]-> hello("John") | $1 ==> "Hello John"
एक अलग विधि घोषित करें hello(String,String) ।
[3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String)
संदेश को आउटपुट करने के लिए विधि का आह्वान करें।
[5]-> hello("Hello"," John") | $16 ==> "Hello John"
किसी विधि का अग्रेषित संदर्भ बनाना
JShell एक विधि के संदर्भ को आगे बढ़ाने का समर्थन करता है। एक अग्रेषित संदर्भ एक ऐसी विधि का आह्वान करता है जिसे अभी तक परिभाषित नहीं किया गया है। एक विधि घोषित करें मुख्य(स्ट्रिंग) जो एक विधि का संदर्भ देता है hello(String) , जिसे अभी तक परिभाषित नहीं किया गया है। विधि मुख्य(स्ट्रिंग) बनाया जाता है लेकिन इसे विधि hello(String) . तक लागू नहीं किया जा सकता है परिभाषित किया गया है।
[1]-> String main(String str){ return "Hello "+hello(str); } | created method main(String), however, it cannot be invoked until | method hello(java.lang.String) is declared
आह्वान विधि मुख्य(स्ट्रिंग) और एक संदेश आउटपुट प्राप्त करता है, यह दर्शाता है कि इसे लागू नहीं किया जा सकता है।
[2]-> main("Michael") | attempted to call method main(String) which cannot be invoked | until method hello(java.lang.String) is declared
विधि घोषित करें hello(String) जिसका संदर्भ main(String) . द्वारा दिया गया है ।
[3]-> String hello(String name){ return name; } | created method hello(String)
इसके बाद, विधि मुख्य(स्ट्रिंग) का आह्वान करें फिर से और इसे लागू किया जाता है।
[4]-> main("Michael") | $1 ==> "Hello Michael"
";" यदि शीर्ष-स्तरीय चर घोषणाओं और विधि घोषणाओं में जोड़ा नहीं गया है जो प्रति पंक्ति एक जोड़े जाते हैं, तो निहित रूप से जोड़ा जाता है। लेकिन ";" एक विधि के भीतर बयानों में निहित नहीं है। उदाहरण के तौर पर, निम्न विधि घोषित करें और एक त्रुटि आउटपुट हो जाती है।
[1]-> int average(int i,int j){ return (i+j)/2 } | Error: | ';' expected
सूचीबद्ध करने के तरीके
किसी दिए गए JShell सत्र में परिभाषित विधियाँ /विधियों . के साथ सूचीबद्ध हैं आज्ञा। प्रदर्शित करने के लिए, कुछ विधियों को परिभाषित करें।
[1]-> int triple(int i) { return i*3; } | created method triple(int) [2]-> String hello(String s){ return "Hello" + s; } | created method hello(String) [3]-> String hello(String str1, String str2){ return str1+str2; } | created method hello(String,String) [4]-> int average(int i,int j){ return (i+j)/0; } | created method average(int,int)
/विधियों को चलाएँ कमांड, और जोड़े गए सभी तरीके सूचीबद्ध हो जाते हैं।
[5]-> /methods | printf (String,Object...)void | triple (int)int | hello (String)String | hello (String,String)String | average (int,int)int [5]->
शीर्ष-स्तरीय विधि घोषणाओं में संशोधक की अनुमति नहीं है
जबकि संशोधक सार्वजनिक , निजी , और संरक्षित शीर्ष-स्तरीय विधि घोषणाओं को अनदेखा किया जाता है और सार्वजनिक पहुंच के साथ एक विधि परिभाषा बनाई जाती है, कुछ अन्य संशोधकों को अनदेखा नहीं किया जाता है और शीर्ष-स्तरीय विधि घोषणा में अनुमति नहीं दी जाती है। शीर्ष स्तर पर इन संशोधकों की अनुमति नहीं है क्योंकि इनका एक निश्चित संदर्भ में महत्व है और JShell के संदर्भ में उपयुक्त नहीं है, जो कि कोड स्निपेट का परीक्षण करना है।
संशोधक स्थिर किसी वर्ग या इंटरफ़ेस के संदर्भ में किसी विधि के साथ उपयोग किए जाने पर इसका महत्व है, लेकिन शीर्ष स्तर पर नहीं। उदाहरण के तौर पर, निम्न विधि घोषणा को चलाएं जिसमें स्थिर . शामिल है ।
[1]-> static String hello(String name){ return "Hello "+name; } | Warning: | Modifier 'static' not permitted in top-level declarations, | ignored | static String hello(String name){ | ^----^ | created method hello(String)
स्थिर संशोधक को नजरअंदाज कर दिया जाता है, एक चेतावनी आउटपुट होती है, लेकिन एक विधि बन जाती है। विधि लागू की जा सकती है।
[2]-> hello("John") | $1 ==> "Hello John" [3]->
इसी तरह, संशोधक अंतिम विधि घोषणा या किसी अन्य घोषणा में शीर्ष स्तर पर कोई महत्व नहीं है, क्योंकि JShell को कोड स्निपेट को गतिशील रूप से चलाने और एक विधि (या चर, या वर्ग) घोषित करने के लिए डिज़ाइन किया गया है अंतिम स्निपेट को अपरिवर्तनीय बना देगा। उदाहरण के तौर पर, अंतिम . जोड़ें एक विधि के लिए संशोधक। फाइनल संशोधक को नजरअंदाज कर दिया जाता है, एक चेतावनी उत्पन्न होती है, और विधि परिभाषा अंतिम . के बिना बनाई जाती है ।
[2]-> final int triple(int i){ return 3*i; } | Warning: | Modifier 'final' not permitted in top-level declarations, | ignored | final int triple(int i){ | ^---^ | created method triple(int)
विधि का आह्वान करें और यह परिणाम आउटपुट करता है।
[3]-> triple(5) | $1 ==> 15 [4]->
कुछ अन्य संशोधकों को भी शीर्ष स्तर पर अनुमति नहीं है, चाहे वह किसी विधि या किसी अन्य घोषणा में हो। जबकि संशोधक स्थिर और अंतिम अनदेखा किया जाता है और एक विधि परिभाषा बनाई जाती है, संशोधक सार और मूल एक शीर्ष-स्तरीय विधि में त्रुटि उत्पन्न होती है और एक विधि नहीं बनती है।
[1]-> abstract String hello(String s){ return "Hello "+s; } | Error: | Modifier 'abstract' not permitted in top-level declarations | abstract String hello(String s){ | ^------^ [1]-> [1]-> native String hello(String s){ return "Hello "+s; } | Error: | Modifier 'native' not permitted in top-level declarations | native String hello(String s){ | ^----^
संशोधक डिफ़ॉल्ट और सिंक्रनाइज़ एक शीर्ष-स्तरीय विधि घोषणा या किसी अन्य घोषणा में भी अनुमति नहीं है और एक त्रुटि उत्पन्न करते हैं।
निष्कर्ष
इस लेख में, हमने JShell में जावा विधियों के लिए चल रहे कोड स्निपेट्स पर चर्चा की। बाद के लेख में, हम जावा कक्षाओं, इंटरफेस और सरणियों के लिए चल रहे कोड स्निपेट पर चर्चा करेंगे।