जावा एक कंस्ट्रक्टर में एक इंट्री इनिशियलाइज़ करता है


90

मेरे पास एक वर्ग है और उस कक्षा में मेरे पास यह है:

 //some code
 private int[] data = new int[3];
 //some code

फिर मेरे निर्माता में:

public Date(){
    data[0] = 0;
    data[1] = 0;
    data[2] = 0;
}

अगर मैं ऐसा करता हूं, तो सब कुछ ठीक है। डिफ़ॉल्ट डेटा मान आरंभ किए जाते हैं, लेकिन यदि मैं इसके बजाय ऐसा करता हूं:

public Date(){
    int[] data = {0,0,0};
}

इसे कहते हैं:

Local variable hides a field

क्यों?

कंस्ट्रक्टर के अंदर एक सरणी को इनिशियलाइज़ करने का सबसे अच्छा तरीका क्या है?


मुझे आशा है कि आप चर के दायरे की अवधारणा से अवगत होंगे? आपके चर के dataबाद "//some code"पूरी कक्षा का एक क्षेत्र है। जबकि dataकंस्ट्रक्टर में वेरिएबल कंस्ट्रक्टर के अंदर एक स्कोप है। और एक बार जब कंस्ट्रक्टर किया जाता है, तो चर नष्ट हो जाएगा। और dataकंस्ट्रक्टर के अंदर का वेरिएबल भी वैरिएबल को क्लास में इसी नाम से छिपाता है। यह त्रुटि का औचित्य सिद्ध करता हैLocal variable hides a field
नवीन बाबू

जवाबों:


180
private int[] data = new int[3];

यह पहले से ही आपके सरणी तत्वों को 0. को आरंभीकृत करता है। आपको फिर से निर्माता में दोहराने की आवश्यकता नहीं है।

आपके निर्माता में यह होना चाहिए:

data = new int[]{0, 0, 0};

हाँ। यह एकमात्र तरीका था जिसने मुझे अनुमति दी। सिर्फ डेटा डालना; कहा कि "इसका बयान नहीं"। धन्यवाद
Favolas

क्या वह data=new int[3]डिफाल्ट कंस्ट्रक्टर में उपयोग नहीं कर सकता है Date()?
18

7

आप या तो कर सकते हैं:

public class Data {
    private int[] data;

    public Data() {
        data = new int[]{0, 0, 0};
    }
}

जो dataकंस्ट्रक्टर में इनिशियलाइज़ करता है, या:

public class Data {
    private int[] data = new int[]{0, 0, 0};

    public Data() {
        // data already initialised
    }
}

जो dataकंस्ट्रक्टर में कोड निष्पादित होने से पहले आरंभ करता है।


मुझे डेटा = नया int [] {0,0,0} डालना होगा; कंस्ट्रक्टर के अंदर। अगर मैं कंस्ट्रक्टर में कोड से पहले केवल डेटा डालकर आरंभ करता हूं; अंदर कंस्ट्रक्टर ने मुझे "एक स्टेटमेंट नहीं" त्रुटि दी
फेवोलस

यदि सरणी में मिलियन से अधिक तत्व हैं .. तो आप पहले कोड का उपयोग करना चाहते हैं और public Data() throws Error {यदि OutOfMemoryErrorफेंका जाए तो लाइन को बदल सकते हैं।
निक

4

ऐसा इसलिए है, क्योंकि कंस्ट्रक्टर में, आपने एक विशेषता के रूप में एक ही नाम के साथ एक स्थानीय चर घोषित किया।

एक पूर्णांक सरणी आवंटित करने के लिए जिसे सभी तत्वों को शून्य से आरंभ किया जाता है, इसे निर्माता में लिखें:

data = new int[3];

एक पूर्णांक सरणी को आवंटित करने के लिए जिसमें अन्य प्रारंभिक मान हैं, इस कोड को कंस्ट्रक्टर में डालें:

int[] temp = {2, 3, 7};
data = temp;

या:

data = new int[] {2, 3, 7};

4

बस क्यों नहीं

public Date(){
    data = new int[]{0,0,0};
}

कारण आपको त्रुटि के कारण है int[] data = ... एक नया चर घोषित किया और क्षेत्र को छुपाता हैdata

हालांकि यह ध्यान दिया जाना चाहिए कि सरणी की सामग्री पहले से ही 0 (डिफ़ॉल्ट मान int) के लिए आरंभिक है


1

अपने निर्माता में आप एक और अंतर सरणी बना रहे हैं:

 public Date(){
  int[] data = {0,0,0};
  }

इसे इस्तेमाल करे:

 data = {0,0,0};

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

यदि आपके पास स्थानीय रूप से घोषित सरणी है, हालांकि आपको प्रत्येक तत्व को इनिशियलाइज़ करना होगा।


0

सबसे अच्छा तरीका है कि आप कोई भी प्रारंभिक बयान न लिखें। ऐसा इसलिए है क्योंकि अगर आप int a[]=new int[3]डिफ़ॉल्ट रूप से जावा में, सरणी के सभी मानों को लिखते हैं a[0], a[1]और a[2]इसे आरंभीकृत किया जाता है 0! किसी क्षेत्र को छिपाने वाले स्थानीय चर के बारे में, निष्कर्ष पर आने के लिए अपना पूरा कोड पोस्ट करें।

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