2010-11-18 17 views
42

मैं थोड़ी देर के लिए जावा लिख ​​दिया गया है, और आज मैं निम्नलिखित घोषणा का सामना करना पड़ा:जावा सरणी तर्क घोषणा वाक्यविन्यास "..." कैसे काम करता है?

public static void main(String... args) { 

} 

नोट "डॉट डॉट डॉट" सरणी घोषणा में, बजाय सामान्य ब्रैकेट []। स्पष्ट रूप से यह काम करता है। असल में मैंने एक छोटा परीक्षण लिखा और सत्यापित किया कि यह काम करता है। इसलिए, मैंने जावा व्याकरण को यह देखने के लिए खींच लिया कि तर्क घोषणा का यह वाक्यविन्यास कहां है, लेकिन कुछ भी नहीं मिला।

तो विशेषज्ञों के लिए, यह कैसे काम करता है? क्या यह व्याकरण का हिस्सा है? साथ ही, जब मैं इस तरह की फ़ंक्शन घोषित कर सकता हूं, तो मैं इस तरह के फ़ंक्शन के शरीर के भीतर एक सरणी घोषित नहीं कर सकता।

वैसे भी, क्या आप इस दस्तावेज़ के किसी भी स्थान के बारे में जानते हैं। यह जिज्ञासा है, और शायद इसमें निवेश किए जाने के लायक नहीं है, लेकिन मैं फंस गया था।

+1

यह भी मानें कि http://stackoverflow.com/questions/315846/why-null-cast/315853#315853 –

उत्तर

25

चेक बाहर Java Language Specification, Third Edition, Chapter 8 (Classes):

public static void main(String... args); 
main("this", "is", "multiple", "strings"); 

के समान है। इसमें डुबकी है:

यदि अंतिम औपचारिक पैरामीटर टाइप टी के एक परिवर्तनीय धर्मार्थ पैरामीटर है, तो इसे टी [] के औपचारिक पैरामीटर को परिभाषित करने के लिए माना जाता है। विधि तब एक परिवर्तनीय धैर्य विधि है। अन्यथा, यह एक निश्चित धैर्य विधि है। एक परिवर्तनीय धर्मार्थ विधि के आमंत्रण औपचारिक मानकों की तुलना में अधिक वास्तविक तर्क अभिव्यक्ति हो सकता है। सभी वास्तविक तर्क भाव कि चर arity पैरामीटर का मूल्यांकन किया जाएगा पूर्ववर्ती औपचारिक पैरामीटर और परिणाम एक सरणी है कि विधि मंगलाचरण (§15.12.4.2) को दे दिया जाएगा में संग्रहीत के अनुरूप नहीं है।

असल में, किसी भी विधि कॉल के अंतिम पैरामीटर में T... हो सकता है। यदि ऐसा है, तो इसे T[] में परिवर्तित कर दिया गया है।

तो बुनियादी तौर पर, क्या आप के पुनरुत्पादन का एक आधुनिक तरीका है और अधिक परंपरागत

String[] args 
+1

इसके अलावा, यह भी दिया गया है कि सरणी पैरामीटर और varargs का हस्ताक्षर अलग है, यह कैसे काम करता है? – hexafraction

3

इसे वैराडिक तर्क कहा जाता है: एक फ़ंक्शन जो आपको जितना चाहें उतना (शून्य सहित) तर्क लेता है। उदाहरण के लिए, main("string1", "string2", "string3")main({"string1", "string2", "string3"}) के समान है यदि मुख्य को void main(String...args) के रूप में घोषित किया गया है।

देखें http://www.java-tips.org/blog/java-se/varargs-%E2%80%93-java-50-addition.html

28

मेरा मानना ​​है कि यह जावा 1.5 में लागू किया गया था। वाक्यविन्यास आपको सरणी के बजाए तर्कों की अल्पविराम से अलग सूची के साथ एक विधि को कॉल करने की अनुमति देता है।

public static void main(String[] args); 
main(new String[] {"this", "is", "multiple", "strings"}); 

http://today.java.net/article/2004/04/13/java-tech-using-variable-arguments http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

+1

धन्यवाद तुलना के लिए! – Antonio

21

यह varargs

सरल अवधि में है इसकी

public setMembers(Member[] members); 

तरह Member के Array उपयोग करने के लिए:

आम तौर पर एपीआई डिज़ाइन करते समय यह उपयोग करना अच्छा होता है जब तर्क की संख्या तय नहीं होती है। इस के मानक एपीआई से

उदाहरण String.format(String format,Object... args)

भी देखें

3

इसका मतलब है कि आप setMembers() विधि को शून्य या अधिक Member वस्तुओं पारित कर सकते हैं है। सेट मेम्बरर्स विधि में, members में सरणी अर्थशास्त्र होगा।

6

यह तथाकथित varargs वाक्यविन्यास है। विधि निकाय में, आप members पैरामीटर को पढ़ सकते हैं क्योंकि यह एक सरणी था - वास्तव में, यह/केवल 'सरणी' है।

हालांकि, जादू बिट विधि को कॉल करने में है। नई varargs वाक्य रचना के साथ तथापि

setMembers(new Members[] {member1, member2, member3}); 

, आप स्पष्ट रूप से अब और सरणी बनाने की जरूरत नहीं है, और आप पास कर सकते हैं:: इससे पहले कि varargs वाक्य रचना पेश किया गया था, तो आप विधि तो जैसे एक सा फोन होता

setMembers(member1, member2, member3); 

इसका मतलब यह है कि varargs तर्क को विधि में अंतिम तर्क होना चाहिए। इस तरह कुछ ऐसा नहीं है:

void setMembers(Member ... members, String memberType); 

संक्षेप में: यह वास्तव में सिंटेक्टिक चीनी का थोड़ा सा है। मैं जावा कंपाइलर की आंतरिक कार्यप्रणाली पर कोई विशेषज्ञ नहीं हूं, लेकिन मुझे पूरा यकीन है कि varargs पैरामीटर को स्वीकार करने वाली विधियों को कॉल करने वाले विधियों को उन तरीकों से पुनर्निर्मित किया जाता है जो दिए गए प्रकार की सरणी बनाते हैं।

2

Variable arguments। 0 या अधिक स्ट्रिंग तर्क हो सकता है।

फ़ंक्शन स्ट्रिंग्स की सरणी के रूप में पैरामीटर तक पहुंच सकता है।

+1

ठीक है मुझे लगता है कि मैं इसकी तरह समझ गया: स्ट्रिंग x = "हाय" स्ट्रिंग वाई = "आप" प्रिंटस्ट्रिंग (x, y); सार्वजनिक शून्य प्रिंटस्ट्रिंग (स्ट्रिंग ... बधाई) { (int x = 0; x Winter

+1

हां, सटीक होना "हाय आप "। आप "के लिए (स्ट्रिंग एस: नमस्कार) ..." का भी उपयोग कर सकते हैं जो बेहतर दिखता है :) –

0

इसका मतलब है कि विधि स्ट्रिंग तर्कों की एक चर संख्या को स्वीकार करती है। तर्कों को एक सरणी के रूप में माना जाता है और इसलिए उन्हें पारित क्रम में, सब्सक्रिप्शन द्वारा एक्सेस किया जाता है।

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