2015-06-06 4 views
12

मुझे पता है कि this(...) किसी अन्य निर्माता से कक्षा के एक निर्माता को कॉल करने के लिए उपयोग किया जाता है। लेकिन क्या हम इसके लिए new का उपयोग कर सकते हैं?जावा में किसी अन्य निर्माता को कॉल करने के लिए कक्षा के निर्माता के अंदर "नया" उपयोग किया जा सकता है?

प्रश्न पर अधिक स्पष्ट होने के लिए, लाइन -2 मान्य है? यदि यह है (जैसा कि संकलक शिकायत नहीं करता है), आउटपुट nullHello क्यों नहीं है?

class Test0 { 
    String name; 

    public Test0(String str) { 
     this.name= str; 
    } 

    public Test0() { 
     //this("Hello"); // Line-1 
     new Test0("Hello"){}; // Line-2 
    } 

    String getName(){ 
     return name; 
    } 
} 

public class Test{ 
    public static void main(String ags[]){ 
     Test0 t = new Test0(); 
     System.out.println(t.getName()); 
    } 
} 
+1

क्यों आप ऐसा करना चाहते हैं? –

+1

@ लुटज़ हॉर्न मैंने कहीं ऐसा कोड देखा और मैं इसके पीछे मौलिक समझना चाहता हूं। – Dexter

+3

क्या आप वाकई एक ही अर्थपूर्ण के साथ कोड हैं? यह कोड संकलित करता है लेकिन यह इस तरह समझ में नहीं आता है। –

उत्तर

25

यह मान्य है, लेकिन यह एक पूरी तरह अलगTest0 की है कि निर्माता के अंदर उदाहरण (खासतौर पर Test0 की एक अनाम उपवर्ग का एक उदाहरण) बनाने के है, और यह कहीं भी इस्तेमाल नहीं किया जा रहा है। वर्तमान उदाहरण में अभी भी क्षेत्र namenull पर सेट है।

public Test0() { 
    // this creates a different instance in addition to the current instance 
    new Test0("Hello"){}; 
} 

ध्यान दें कि अगर आप कोई तर्क निर्माता के साथ new ऑपरेटर कहते हैं, आप एक StackOverflowError मिलेगा।

+9

के साथ ग्रहण विचार का उपयोग किया असल में, यह 'test0' का एक उदाहरण नहीं बना रहा है, लेकिन' test0' के अज्ञात उप-वर्ग का है। (यह इस मामले में कुछ भी नहीं बदलता है, क्योंकि ऑब्जेक्ट को किसी भी तरह से फेंक दिया जाता है।) –

+0

@ पालो एबरमान वास्तव में मुझे याद आया। – manouti

5

लाइन 2 मान्य कथन है। यही कारण है कि संकलक ने कोई त्रुटि नहीं दिखायी। लेकिन वहां आप एक अज्ञात वस्तु बना रहे हैं। कन्स्ट्रक्टर से बाहर निकलने के तुरंत बाद यह गायब हो जाएगा। इसलिए मूल्य अभी भी शून्य है क्योंकि इसके लिए कुछ भी असाइन नहीं किया गया था।

new Test0("Hello"){}; 

ऊपर की रेखा टेस्ट 0 कक्षा का एक अज्ञात उदाहरण बनाएगी और नाम वैरिएबल को हैलो का मान सौंपेगी। लेकिन चूंकि आप बनाए गए अज्ञात उदाहरण का जिक्र नहीं कर रहे हैं, इसलिए यह तत्काल बाद से गायब हो जाएगा। तो फिर भी आपने उस उदाहरण के नाम वैरिएबल को एक मान असाइन नहीं किया है जो विशेष कोड सेगमेंट को कॉल करता है।

public Test0() 
{ 
    this("Hello"); 
} 
6

आपको क्या करने की कोशिश कर रहे हैं कोड से पूरा किया जाता है में है तुम बाहर टिप्पणी की टेस्ट 0 का नया उदाहरण "हैलो" नाम के साथ लेकिन इसका कभी भी उपयोग नहीं करें।

public Test() { 

    new Test0("hello") // nothing is referencing this new object 
} 

आप बस किसी अन्य निर्माता के अंदर एक वस्तु बनाते हैं लेकिन इसका पहले कन्स्ट्रक्टर कॉल द्वारा उत्पन्न होने वाले उदाहरण पर कोई प्रभाव नहीं पड़ेगा।

+1

मुझे यकीन है कि पूछताछ पहले से ही जानता है। –

3

क्योंकि आप एक बनाने के लिए: इसलिए नाम null

स्मृति ऐसा

enter image description here

3

आप कर सकते हैं लेकिन new का परिणाम कन्स्ट्रक्टर के अंत में समाप्त हो जाएगा। विशेष रूप से, t.namenull होगा।

this("Hello") का उपयोग करें।

3

नाम आवृत्ति चर है। इंस्टेंस वैरिएबल ऑब्जेक्ट-विशिष्ट हैं।

नए टेस्ट 0 ("हैलो") के साथ; आप टेस्ट 0 का एक नया उदाहरण बना रहे हैं।

यदि आप टी करना चाहते हैं।getName() वापसी "हैलो" [मेरा मतलब है वस्तु के क्षेत्र मूल्य स्वतंत्र], स्थिर करने के लिए name क्षेत्र बदलने के लिए:

static String name; 
+1

यह एक बुरी सलाह है - एक कन्स्ट्रक्टर से स्थैतिक चर में हेरफेर करने का कोई कारण नहीं है। (इसके अलावा, इसका मतलब यह होगा कि ** सभी ** उदाहरण एक ही मूल्य साझा करते हैं।) –

+1

मुझे खेद है ... कोई सलाह नहीं दे रहा है। यह एक परीक्षण कार्यक्रम है और इंस्टेंस, स्थिर भेदभाव को हाइलाइट करने का प्रयास किया। – Rajesh

0

आप के माध्यम से code..Since नीचे नई कीवर्ड का उपयोग करके उत्पादन प्रदर्शित कर सकते हैं यू यहाँ public Test0(){new Test("Hello){};" का इस्तेमाल किया है {} ब्रेसिज़ महत्वपूर्ण नहीं हैं .. इसलिए जब test0() कन्स्ट्रक्टर कहा जाता है ... इस कन्स्ट्रक्टर के अंदर test0(args); को पहले कन्स्ट्रक्टर में बीटी कहा जा रहा है जिसे आपने प्रदर्शित आउटपुट नहीं दिया है .. कहीं भी आपका "हैलो" प्रदर्शित होगा .. इसलिए बस

संपादित करें

`

public test0(String str) 
{ 
this.name=str; 
System.out.println(str); 
}` 

और तुम उर output..See वांछित मेरी नीचे कोड होगा ..

class test01{ 
public test01(String str) 
{System.out.println(str); 
    } 
public test01(){ 

    new test01("Print"); 
} 
}public class Const { 
public static void main(String args[]) 
{test01 t = new test01(); 

    //System.out.println(t.getName()); 
    }} 

इस कोड को यू दे देंगे के उत्पादन के लिए आवश्यक स्ट्रिंग

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