2014-07-25 9 views
7

मैंने जावा में इस सरल वर्ग को अपनी कुछ विशेषताओं का परीक्षण करने के लिए लिखा था।जावा "शून्य" और "गैर शून्य" कन्स्ट्रक्टर

public class class1 { 
    public static Integer value=0; 
    public class1() { 
     da(); 
    } 
    public int da() { 
     class1.value=class1.value+1; 
     return 5; 
    } 
    public static void main(String[] args) { 
     class1 h = new class1(); 
     class1 h2 = new class1(); 
     System.out.println(class1.value); 
    } 
} 

उत्पादन होता है:

लेकिन इस कोड में:

public class class1 { 
    public static Integer value=0; 
    public void class1() { 
     da(); 
    } 
    public int da() { 
     class1.value=class1.value+1; 
     return 5; 
    } 
    public static void main(String[] args) { 
     class1 h = new class1(); 
     class1 h2 = new class1(); 
     System.out.println(class1.value); 
    } 
} 

इस कोड के उत्पादन में है:

तो क्यों नहीं, जब मैं निर्माता विधि घोषणा में void उपयोग करते हैं, वर्ग के स्थिर क्षेत्र किसी भी अधिक परिवर्तन नहीं करता है?

+9

वह दूसरा एक निर्माता नहीं है। यह सिर्फ एक तरीका है जो एक वर्ग को अपनी कक्षा के साथ साझा करना होता है। – murgatroid99

+1

क्योंकि यह अब एक कन्स्ट्रक्टर नहीं है। –

+4

इस तरह के प्रश्न पर उत्तर [जावा में रचनाकारों का रिटर्न प्रकार क्यों नहीं है] (http://stackoverflow.com/questions/6801500/why-do-constructors-in-java-not-have-a-return- प्रकार) एक महान कारण देता है। – Doswell

उत्तर

30

जावा में, निर्माता एक विधि नहीं है। इसमें केवल कक्षा का नाम और एक विशिष्ट दृश्यता है। अगर यह घोषणा करता है कि कुछ लौटाता है, तो यह एक निर्माता नहीं है, भले ही यह घोषित न हो कि void लौटाता है। यहां अंतर ध्यान दें:

public class SomeClass { 
    public SomeClass() { 
     //constructor 
    } 
    public void SomeClass() { 
     //a method, NOT a constructor 
    } 
} 

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

+2

यह तर्क दिया जा सकता है कि एक कन्स्ट्रक्टर एक विधि का एक विशेष मामला है जिसका उपयोग ऑब्जेक्ट के उदाहरण को आरंभ करने के लिए किया जाता है, क्योंकि यह रचनात्मक समर्थन के 99% का अनुक्रमिक रूप से समर्थन करता है। – Makoto

+0

इस तरह के भ्रम से बचने के लिए विधि नामकरण सम्मेलनों [जेएलएस में] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html) का पालन करने का एक और अच्छा कारण है। – azurefrog

+0

@ जावा में जावा, [एक कन्स्ट्रक्टर विशेष रूप से ऐसा कुछ है जो एक विधि की तरह दिखता है लेकिन एक विधि नहीं है] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8 .html # jls-8.8)। – chrylis

5

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

1

परिभाषा द्वारा निर्माता में शून्य का उपयोग करने से यह अब कन्स्ट्रक्टर नहीं बन जाता है। कन्स्ट्रक्टर विशेष रूप से कोई वापसी प्रकार नहीं है। जबकि शून्य शब्द की सख्त भावना में कोई मूल्य नहीं लौटाता है, फिर भी इसे रिटर्न प्रकार माना जाता है।

दूसरे उदाहरण (जहां आप शून्य का उपयोग करते हैं) में, आपको कॉल करने के तरीके के लिए h.class1() करना होगा क्योंकि यह अब निर्माता नहीं है। या आप शून्य को हटा सकते हैं।

0

यह तर्कसंगत रूप से जावा में एक डिज़ाइन दोष है।

class MyClass { 

    // this is a constructor 
    MyClass() {...} 

    // this is an instance method 
    void MyClass() {...} 

} 

पूरी तरह से कानूनी। शायद नहीं होना चाहिए, लेकिन है।

आपके उदाहरण में, कक्षा 1() कभी भी कॉल नहीं किया जा रहा है, क्योंकि यह एक निर्माता नहीं है। इसके बजाए, डिफ़ॉल्ट कन्स्ट्रक्टर बुलाया जा रहा है।

सुझाव: जावा नामकरण सम्मेलनों के साथ स्वयं को परिचित करें। कक्षा के नाम अपरकेस से शुरू होना चाहिए।

+0

'MyClass x = नया MyClass(); x.MyClass(); 'पूरी तरह से मान्य। – Cerbrus

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