2012-10-21 13 views
7

कोई क्यों समझा सकता है यह काम करता है।जावा में पैरामीटर्स के साथ तरीके

मेरे पास ग्रहण में 2 कक्षाएं हैं। एक क्लास "कार" कहा जाता है निम्नलिखित कोड शामिल ..

public class Car { 
    public void printOut(String variable1){ 
     System.out.println("Hello " +variable1); 
    } 
} 

और एक अन्य वर्ग है, जो जहाँ मेरे 'मुख्य' है, "घर" कहा जाता है, इसके अंदर कोड

import java.util.Scanner; 

class House { 
    public static void main(String args[]){ 
     Scanner input = new Scanner(System.in); 
     Car carObject = new Car(); 

     System.out.println("Enter name here: "); 
     String variable2 = input.nextLine(); 

     carObject.printOut(variable2); 
    } 
} 
है

जब मैं कोड चलाता हूं, यह काम करता है, यह लिखता है "यहां नाम दर्ज करें" और जब मैं इसे टाइप करता हूं, तो यह कहता है कि "हैलो" नाम "

मेरा प्रश्न है, 'variable1' और 'variable2 करें' 'एक दूसरे से कोई संबंध है, इसके अलावा वे स्ट्रिंग क्लास दोनों हैं।

क्योंकि मैं उलझन में हूं कि कोड सही तरीके से क्यों संकलित करता है।

मेरे लिए ऐसा लगता है कि वेरिएबल 1 को चर 2 के साथ कोई सहसंबंध नहीं है, भले ही वे स्ट्रिंग क्लास दोनों हों, ऐसा लगता है कि वे कभी एक दूसरे के साथ बातचीत नहीं करते हैं, और variable1 का उपयोग " हाउस "कक्षा बिल्कुल, फिर भी यह अभी भी जो कुछ भी मैंने दर्ज किया है उसे संकलित करना जानता है। ऐसा लगता है कि 'variable1' को 'variable2' द्वारा प्रतिस्थापित किया गया है और जो भी variable2 शामिल है, वह मुद्रित हो जाता है। विधि

उत्तर

3

कक्षा Car में विधि परिभाषा जब आप इसका उपयोग करते हैं तो प्रोटोटाइप की तरह होती है।क्या आपने कभी 'ब्लैक बॉक्स' के साथ गणित में कार्यों को पढ़ाया है? आप एक संख्या में डालते हैं, और आउटपुट प्राप्त करते हैं। तो, आप 3 दर्ज करते हैं, यदि फ़ंक्शन f (x) = Xx2 है, तो आउटपुट 6 होगा। विधि को कॉल करने से पहले, var2 var1 से बिल्कुल अलग है। विधि में हालांकि, var2 पास हो गया है और विधि में उपयोग किए जाने वाले सभी var1s को प्रतिस्थापित करता है। चिंता न करें, जब मैंने जावा

+0

बहुत बहुत धन्यवाद, यह पूरी तरह से समझ में आता है, मुझे बस 'क्यों' के बारे में निश्चित नहीं था। मुझे पता था कि यह कैसे काम करता है सिर्फ यह नहीं पता था कि क्यों। आपके लिए धन्यवाद, और हर किसी के जवाब, मुझे यह मिल गया। आप लोग रॉक करते हैं। –

+1

कोई चिंता नहीं, बस सबसे अच्छा जवाब स्वीकार करने के लिए याद रखें (संकेत, संकेत) :) – imulsion

0

Variable2 मूल्य variable1 में ले जाया जाएगा। परिवर्तनीय 2 विधि तर्क के रूप में पारित किया गया है। इसके अलावा कोई संबंध नहीं है। परिवर्तनीय 2 केवल स्थानीय के लिए स्थानीय है, variable1 केवल प्रिंट करने के लिए स्थानीय है। वैरिएबल 1 को कॉलिंग विधि से मूल्य की अपेक्षा करने वाले फ़ंक्शन पैरामीटर के रूप में सोचें। मतलब आप प्रिंटऑट में किसी भी स्ट्रिंग को पारित कर सकते हैं।

उदाहरण carObject.printOut("Toyota") के लिए आप मैं प्रिंटआउट में एक चर लेकिन एक कठिन कोडित स्ट्रिंग

1

variable2 में संदर्भ बस variable2 में नकल बुलाया जाएगा बुला जबकि

+0

धन्यवाद lews, यह मदद करता है। –

0

वे बिल्कुल एक जैसे हैं गुजर नहीं कर रहा हूँ के रूप में आप प्रिंटआउट() विधि को variable2 पारित देख सकते हैं। variable1 विधि के पैरामीटर के लिए सिर्फ एक नाम है।

+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। –

0

कॉलर या कैली के परिवर्तनीय नामों का कोई प्रभाव नहीं पड़ता है। आपके पास orange नामक एक चर पैरामीटर हो सकता है और दूसरा helicopter ऐसा ही होगा। महत्वपूर्ण बात यह है कि उनके पास एक ही प्रकार होना चाहिए (यहां String)।

कॉलर चर की सामग्री विधि को पारित की जाती है, चाहे दोनों चर के नाम से कोई फर्क नहीं पड़ता।

+0

बहुत बहुत धन्यवाद। यह मुझे बहुत मदद करता है। –

0

variable1 वास्तव में एक चर नहीं है, यह चर का एक नाम है जो विधि को पारित किया जाएगा। आपको इस नाम की आवश्यकता होगी क्योंकि आप इसे कुछ तरीकों के लिए अपनी विधि में उपयोग कर रहे हैं। तो जब आप variable2 पास करते हैं, जो अब वास्तव में एक चर है, तो आप इसे variable1 के नाम से विधि में देखते हैं। उम्मीद है की यह मदद करेगा।

+0

धन्यवाद, समझ में आता है। –

+0

@FacelessVoid, आपका स्वागत है! – Egor

0

जावा पैरामीटर में हमेशा मूल्य से पारित किया जाता है। यदि आप किसी ऑब्जेक्ट को पास करते हैं तो यह मूल ऑब्जेक्ट संदर्भ को इंगित करता है और आप मूल ऑब्जेक्ट को संशोधित कर सकते हैं।

+0

सहायता के लिए धन्यवाद। –

3

शुरू किया, तो वे इसे प्राप्त नहीं कर पाए क्योंकि आप variable2 को Car.printOut विधि में पास कर रहे हैं। एक पल के लिए इस समानता की कल्पना करें: आप जानते हैं कि कमांड पर गणित होमवर्क कैसे करें। आप एक ऑब्जेक्ट हैं, जिसे FacelessVoid कहा जाता है और आपके पास doHomework नामक एक विधि है। doHomeworkWork प्रकार का एक पैरामीटर लेता है। असली दुनिया में, मेरे पास काम का एक बॉक्स होगा, और मैं आपके डेस्क पर काम के बॉक्स को डंप कर दूंगा। जो कुछ भी मैं बॉक्स पर लिखता हूं वह आपके लिए कोई फर्क नहीं पड़ता है, लेकिन बॉक्स की सामग्री आपके डेस्क पर डंप हो जाती है, जहां आप उसे जो कुछ भी चाहते हैं उसे कॉल कर सकते हैं।

यह आपके कोड में क्या हो रहा है: आपके पास variable2 नामक एक स्ट्रिंग है, और इसकी सामग्री printOut के अंदर variable1 में "डंप" हो जाती है। हालांकि ध्यान दें कि स्ट्रिंग वास्तव में आपकी विधि में dumped नहीं मिलती है, एक संदर्भ कॉपी हो जाता है। तो यह वही वस्तु है, इसे सिर्फ कुछ अलग कहा जाता है।

+0

धन्यवाद, अच्छी व्याख्या। –

+0

अस्वीकार्य क्यों? –

0

कोई रिलायंस v1 और v2 नहीं है। जब आप Hous क्लास से car.printOut() विधि को कॉल करते हैं, तो यह मान के रूप में ढेर करने के लिए v2 को धक्का देता है। car.printOut() विधि स्टैक से v1 चर के लिए यह मान पॉप करें। इसलिए आप किसी भी नाम का उपयोग कर सकते हैं।

इसके अतिरिक्त, जब आप printOut() पर v1 के मान को बदलते हैं, v2 नहीं बदलेगा।

0

दूसरों अच्छा जवाब दे दिया है, लेकिन सिर्फ अपने शब्दावली सही पाने के लिए, variable1 कहा जाता है एक "formal parameter" जबकि variable2 वास्तविक पैरामीटर, यह भी "कथन" विधि printOut को पारित कर दिया के रूप में बुलाया है। यह महसूस करना आसान होगा कि जब आप तर्कों के चारों ओर गुज़रने की बात आते हैं तो आप सिर्फ नामों के साथ खेल रहे हैं। आंत स्तर पर, यह सिर्फ नाम से सामानों को संदर्भित करने के बजाय डेटा स्थानों के साथ खेल रहा है।

1

variable2 संदर्भ स्मृति में कहीं भी एक स्ट्रिंग के लिए संदर्भ है। स्ट्रिंग कहां है यह जानने के लिए वेरिएबल 2 में मान जावा द्वारा उपयोग किया जाता है। उदाहरण के लिए:

variable2     memory location 1100 
[1100]  ------>   "hello" 

variable1 स्मृति में कहीं भी एक स्ट्रिंग का संदर्भ है। जब आप फ़ंक्शन को कॉल करते हैं, तो चर 2 में मान (इस मामले में 1100) चर 1 में रखा गया है।

variable1     memory location 1100 
[1100]  ------>   "hello" 

तो फ़ंक्शन वेरिएबल 1 का उपयोग कर चर 2 संदर्भों को स्ट्रिंग पा सकता है, क्योंकि स्ट्रिंग का स्थान दोनों में निहित है। या एक और तरीका रखो, वे दोनों एक ही स्ट्रिंग का संदर्भ देते हैं।

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