जावा में घोषणा और परिभाषा के बीच अंतर क्या है?


81

मैं दो शब्दों के बीच बहुत भ्रमित हूँ। मैंने स्टैकओवरफ़्लो पर जाँच की और C ++ के लिए एक समान प्रश्न है, लेकिन जावा के लिए नहीं।

क्या कोई जावा के लिए दो शब्दों के बीच का अंतर समझा सकता है?


2
घोषणा न्यूनतम आवश्यक है इसलिए अन्य कोड इसे कॉल कर सकते हैं या इसे संदर्भित कर सकते हैं। जब आप अन्य कोड संकलित कर रहे हैं तो यह आपकी न्यूनतम आवश्यकता है। परिभाषा कुछ करने के लिए आवश्यक है, इसे केवल एक बार संकलित किया जाना है (प्रति कॉलर एक बार नहीं)
पीटर लॉरी

1
के माध्यम से यादगार: de-finite, fin = end, "इसे समाप्त करने के लिए"; de-clare, clarus = clear, "इसे स्पष्ट करने के लिए"। घोषणा अस्तित्व, प्रकार और नाम को स्पष्ट करती है। परिभाषा "वास्तविक कार्य" कोड है जिसके बाद आप "इसके बारे में बात करना" समाप्त कर सकते हैं। उन्होंने भाषा-अज्ञेय का उपयोग किया है इसलिए आपके प्रश्न का अर्थ है, इन सामान्य अवधारणाओं का जावा का उपयोग क्या है।
n611x007

जवाबों:


99

वैचारिक अंतर सरल है:

  • घोषणा : आप घोषणा कर रहे हैं कि कुछ मौजूद है, जैसे कि एक वर्ग, फ़ंक्शन या चर। आप इस बारे में कुछ भी नहीं कहते हैं कि वह वर्ग या कार्य कैसा दिखता है, आप बस यह कहते हैं कि यह मौजूद है।

  • परिभाषा : आप परिभाषित करते हैं कि किसी चीज़ को कैसे लागू किया जाता है, जैसे कि एक वर्ग, फ़ंक्शन या चर, यानी आप कहते हैं कि यह वास्तव में क्या है।

जावा में , दोनों के बीच थोड़ा अंतर है, और औपचारिक रूप से, एक घोषणा में न केवल पहचानकर्ता शामिल है, बल्कि इसकी परिभाषा भी है। यहाँ मैं विस्तार से शब्दों की व्याख्या व्यक्तिगत रूप से कर रहा हूँ:

  • कक्षाएं : जावा वास्तव में सी / सी ++ के रूप में घोषणाओं और परिभाषाओं को अलग नहीं करता है (हेडर और सीपीपी फ़ाइलों में)। आप उन्हें उस बिंदु पर परिभाषित करते हैं जहां आप उन्हें घोषित करते हैं।

  • कार्य : जब आप एक इंटरफ़ेस (या एक सार वर्ग) लिख रहे हैं, तो आप कह सकते हैं कि आप इसे परिभाषित किए बिना एक फ़ंक्शन की घोषणा कर रहे हैं। साधारण कार्य हालांकि, हमेशा सही घोषित किए जाते हैं जहां वे घोषित किए जाते हैं। यदि आप चाहें तो फंक्शन की बॉडी को इसकी परिभाषा के रूप में देखें।

  • चर : एक चर घोषणा इस तरह दिख सकती है:

    int x;
    

    (आप घोषित कर रहे हैं कि एक चर xमौजूद है और टाइप है int) या तो यह एक स्थानीय चर या सदस्य क्षेत्र है। जावा में, परिभाषितx करने के लिए कोई जानकारी नहीं बची है , सिवाय संभव है कि यह किन मूल्यों को रखेगा, जो इसे असाइनमेंट द्वारा निर्धारित किया जाता है।

यहां बताया गया है कि मैं शर्तों का कैसे उपयोग करता हूं:

abstract class SomeClass {                // class decl.
                                          //                           \
    int x;                                // variable decl.            |
                                          //                           |
    public abstract void someMethod();    // function decl.            |
                                          //                           |
    public int someOtherMethod() {        // function decl.            |
                                          //                           | class
        if (Math.random() > .5)           // \                         | def.
            return x;                     //  |  function definition   |
        else                              //  |                        |
            return -x;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /

दुर्भाग्य से, यह JLS द्वारा समर्थित नहीं है। जेएलएस के अनुसार, एक वर्ग घोषणा वर्ग के शरीर को सम्मिलित करता है। और विधियों और निर्माणकर्ताओं पर भी यही बात लागू होती है।
स्टीफन सी

सही। एक औपचारिक दृष्टिकोण से, मैं पूरी तरह से आपके साथ सहमत हूं (सार / इंटरफ़ेस विधियों के मामले को छोड़कर)।
एरियोब

मेरा मानना ​​है कि यह जावास्क्रिप्ट पर भी लागू होता है, है ना? शायद एक जेएस टैग जोड़ा जाना चाहिए।
ग्रिफिन

कोड के पहचानकर्ताओं के अनुसार javac, कक्षा की घोषणाएं कक्षा की परिभाषा का पर्याय लगती हैं। उदाहरण के लिए विचार करें public void visitClassDef(JCClassDecl tree)
ऐयोबेब

@Griffin - बुरा विचार। सवाल विशेष रूप से जावा के बारे में है।
स्टीफन सी।

28

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

मेरा प्रमाण यह है कि शब्द "घोषणा" जेएलएस तालिका में सामग्री और सूचकांक में कई बार दिखाई देता है, लेकिन "परिभाषा" शब्द भी प्रकट नहीं होता है।

इसलिए, जब आप किसी को जावा के संदर्भ में "परिभाषा" शब्द का उपयोग करते हुए देखते हैं, तो वे या तो इसे गैर-तकनीकी अर्थ में उपयोग कर रहे हैं, या वे अपनी शब्दावली के साथ मैला हो रहे हैं।

बाद के मामले में, उनका मतलब वही हो सकता है जो तकनीकी शब्द "घोषणा" के समान है, या उनका मतलब कुछ और हो सकता है। और अगर उनका मतलब कुछ और है, तो आपको उनसे पूछने की जरूरत है कि उनका क्या मतलब है। अगर उन्होंने इसे परिभाषित किया है ... पर्याप्त रूप से उचित है, लेकिन यह मानक शब्दावली नहीं है।


उत्तर जो कि "परिभाषा" बताता है, उस बिंदु को संदर्भित करता है जिस पर चर को आरंभीकृत किया जाता है, विशेष रूप से सहायक नहीं है ... जावा के संदर्भ में। जावा में, एक वैरिएबल का प्रारंभ या तो घोषणा के बिंदु पर होता है, या बाद के असाइनमेंट में होता है। बाद के मामले में, कोई विशेष शब्द का उपयोग नहीं किया जाता है ... असाइनमेंट और / या आरंभीकरण के अलावा ... की आवश्यकता होती है। कोई निर्दिष्ट बिंदु नहीं है जिस पर चर के लिए भंडारण आवंटित किया गया है। वास्तव में, संभावना यह है कि घोषणा के पूरा होने से पहले चर के लिए स्थान आवंटित किया जाता है।


JLS कल्पना में जावा में "परिभाषा" शब्द का उपयोग नहीं किया गया है, इसकी आवश्यकता नहीं है।

  • चूंकि जावा सदस्यों को किसी भी क्रम में घोषित करने की अनुमति देता है, इसलिए "आगे की घोषणा" की कोई आवश्यकता नहीं है। यही वह संदर्भ है जहां दो अवधारणाओं के बीच अंतर करना आवश्यक है।
  • जावा में एक चर के लिए आवश्यक स्टैक स्पेस एक संकलन समय स्थिर है, इसलिए स्टैक ऑफसेट गणना संकलन समय पर होती है। (याद रखें कि जावा में, एक सरणी ढेर ऑब्जेक्ट का संदर्भ है ... और केवल संदर्भ स्टैक फ़्रेम में रखा गया है)।
  • जिस तरह से जावा किसी फ़ील्ड या वैरिएबल की "परिभाषा के बिना परिभाषा" को संभालता है, उसे एक "घोषणा" बिंदु की आवश्यकता नहीं होती है। यदि किसी चर का प्रारंभ आवश्यक है, तो यह स्रोत कोड में कई बिंदुओं पर हो सकता है।

(जावा में एकमात्र स्थान जहाँ उन्होंने घोषणा बनाम परिभाषा का उपयोग किया हो सकता है, सार विधियों में है। सिवाय इसके कि अगर उन्होंने किया था, तो एक नियमित रूप से घोषणा को परिभाषा के रूप में संदर्भित करना होगा ... संगति के लिए ... और वह भ्रामक होगा। इसलिए वे "अमूर्त" को एक अमूर्त पद्धति की घोषणा कहते हैं।)

C और C ++ इन बातों को अलग ढंग से संभाल, और इसलिए करते हैं की जरूरत है अलग "घोषणा" और उनके तकनीकी विवरण में "परिभाषा" शर्तों। मेरी "सूर्य शब्दावली" परिभाषाएं हैं कि वे C / C ++ -centric हैं।


7

से सूर्य शब्दकोष के परिभाषाएँ:

घोषणा: एक बयान जो एक पहचानकर्ता को स्थापित करता है और उसके साथ विशेषताओं को जोड़ता है, आवश्यक रूप से इसके भंडारण (डेटा के लिए) को जलाए बिना या कार्यान्वयन प्रदान करता है (विधियों के लिए)।

परिभाषा: एक घोषणा जो भंडारण (डेटा के लिए) को संग्रहीत करती है या कार्यान्वयन (विधियों के लिए) प्रदान करती है।

मैं जिस तरह से सूर्य शब्दावली पढ़ता हूं वह इस तरह होगी:

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

4
1) JLS दूसरे कथन का वर्णन करने के लिए "परिभाषा" शब्द का उपयोग नहीं करता है। सिंथेटिक, यह एक असाइनमेंट है। शब्दार्थ में इसे "इनिशियलाइज़िंग" वेरिएबल के रूप में वर्णित किया गया है। 2) दूसरा कथन एक घोषणा नहीं है, इसलिए यह एक परिभाषा नहीं हो सकती ... "परिभाषा: एक घोषणा कि ..." । 3) लिंक टूट गया है ...
स्टीफन C

मैंने लिंक को ठीक करने के लिए एक संपादन का प्रस्ताव रखा। सवाल और जवाब जेएलएस के बारे में कुछ नहीं कहते हैं।
मैथ्यू

4

1. घोषणा का अर्थ है एक primitive or Object reference variable, लेकिन क्रमशः मूल्य या वस्तु के असाइनमेंट के साथ नहीं।

उदाहरण के लिए:

          int x;   // declaration of x of type int

          Cat myCat;  //  declaration of myCat an Object of type Cat

2. डिफिकेशन तब होता है जब हम उन्हें मान या ऑब्जेक्ट असाइन करते हैं।

         int x = 5;

         Cat myCat = new Cat();

3. मेथड के मामले में, इस तरह ...

public abstract void go();       // Method Declaration (Abstract method)

   public void go(){               // Method Defination

            // Your code      

    }

1
यह शब्दावली JLS द्वारा समर्थित नहीं है।
स्टीफन सी।

1
@ कुमार विवेक मित्र - यदि डिफिकेशन "int x = 5" है, तो डिफिनेशन और इन्टिलेशन के बीच क्या अंतर होगा?
खान

@SSK इनिशियलाइज़ेशन डिफिनेशन है और इसके विपरीत ..... आपकी जाँच आपके संदेह को दूर करने के बजाय एक चुनौती के रूप में प्रतीत होती है ... इसलिए अगली बार "कृपया" जोड़ें
कुमार विवेक मित्र

यूपी ... कैथी सिएरा और बर्ट बेट्स द्वारा हेड फर्स्ट जावा सीरीज़ देखें
कुमार विवेक मित्रा

2

मुझे लगता है कि मैं इस प्रश्न को कुछ इस तरह समझा सकता हूं:

निम्नलिखित परिदृश्य के बारे में सोचो:

आपकी फर्म में सॉफ्टवेयर इंजीनियर का एक नया पद खाली है। इसका मतलब यह है कि जिस व्यक्ति को आपने इस पद को भरने के लिए चुना है, वह एक सॉफ्टवेयर इंजीनियर होगा, (आप इस पद के लिए कोई मार्केटिंग आदमी नहीं चुन सकते हैं)। तो इस पोस्ट को बनाना घोषणा के समान है।

अब जब आप परिभाषित करते हैं कि इस पद वाला व्यक्ति क्या कर सकता है / नहीं कर सकता है, उसके पास कौन से अधिकारी हैं, उसकी सीमाएँ क्या हैं, तो इसे परिभाषा कहा जाता है।

इसलिए कह रहे हैं

SoftwareEngineer se;

डिक्लेरेशन का मतलब;

तथा

class SoftwareEngineer {

// define role and responsibilities
}

मतलब परिभाषा। आशा है कि यह आपकी मदद करता है।


2

Java भाषा केवल घोषणा शब्द को परिभाषित करती है जो परिभाषा का उपयोग नहीं करती है।

घोषणा:

class A{}// class declaration

String str;// variable declaration

0

घोषणा : एक बयान जो एक पहचानकर्ता को स्थापित करता है और उसके साथ विशेषताओं को जोड़ता है, आवश्यक रूप से इसके भंडारण (डेटा के लिए) को जलाए बिना या कार्यान्वयन प्रदान करता है (विधियों के लिए)।

         or

         1. Declaration means creating a primitive or Object reference variable, 
         but with no assignment of value or object respectively..

परिभाषा : एक घोषणा जो भंडारण (डेटा के लिए) को संग्रहीत करती है या कार्यान्वयन (विधियों के लिए) प्रदान करती है।

        or

         Defination is when we assign values or Object to them.

**Ex:** 
List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

-1
  1. किसी वस्तु या आदिम के लिए

घोषणा : किसी वस्तु या आदिम के प्रकार को निर्दिष्ट करना

परिभाषा : किसी वस्तु या आदिम का मूल्य निर्दिष्ट करना

  1. एक विधि के लिए

घोषणा : एक विधि के हस्ताक्षर निर्दिष्ट करना

परिभाषा : एक विधि के कार्यान्वयन को निर्दिष्ट करना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.