2012-08-22 12 views
26

जावाडोक का उल्लेख है कि ऑब्जेक्ट क्लास में सार्वजनिक नो-एर्ग कन्स्ट्रक्टर है। लेकिन ऑब्जेक्ट के स्रोत कोड में इसमें कोई स्पष्ट कन्स्ट्रक्टर नहीं है। तो जाहिर है कि संकलक ने इसके लिए एक उत्पन्न किया है। हालांकि, अगर कोई कन्स्ट्रक्टर वापस लौटने वाला है (जैसा कि नीचे दिखाया गया है) कॉल कॉल स्टैक ट्रेस देखता है, तो मुझे उस निशान में Object.<init> पर कोई कॉल दिखाई नहीं दे रहा है।जावा: ऑब्जेक्ट क्लास में एक कन्स्ट्रक्टर है?

तो सवाल यह है कि ऑब्जेक्ट क्लास में डिफॉल्ट कन्स्ट्रक्टर होता है क्योंकि डॉक्टर कहते हैं? यदि हां, तो मैं इसे कॉल स्टैक ट्रेस में क्यों नहीं देख सकता?

public ConTest() 
{ 
    new Throwable().printStackTrace(); 
} 

परिणाम:

java.lang.Throwable 
    at ConTest.<init>(ConTest.java:8) 
    at ConTest.main(ConTest.java:16) 
+1

http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html से हम्म सभी वर्गों कम से कम एक निर्माता है। यदि कोई वर्ग स्पष्ट रूप से किसी को घोषित नहीं करता है, तो जावा कंपाइलर स्वचालित रूप से नो-तर्क कन्स्ट्रक्टर प्रदान करता है, जिसे डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है। यदि कक्षा में कोई अन्य माता-पिता नहीं है तो यह ऑब्जेक्ट कन्स्ट्रक्टर को डिफ़ॉल्ट करता है। – MimiEAM

+1

क्या एक से अधिक उत्तरों को स्वीकार करना संभव है? क्योंकि मैं नीचे दिए गए सभी 4 उत्तरों को स्वीकार करना चाहता हूं। – shrini1000

उत्तर

24

सुपर कंस्ट्रक्टर्स उप/आधार कंस्ट्रक्टर्स से पहले चलाए जा रहे हैं। आपके उदाहरण में ऑब्जेक्ट का कन्स्ट्रक्टर पहले ही चलाया जा चुका है जब new Throwable().printStackTrace() निष्पादित किया जाता है।

एक अपने कोड की अधिक स्पष्ट संस्करण:

public ConTest() 
{ 
    super(); 
    new Throwable().printStackTrace(); // you will not see super() (Object.<init>) in this stack trace. 
} 
6

आप स्टैक ट्रेस में दिखाई नहीं देता है क्योंकि यह पहले से ही बुलाया गया था है। अपवाद आपके कोड में फेंक दिया गया है।

आपका कोड लिखने के बराबर है:

public ConTest() { 
    super(); // this will call the Object constructor 
    new Throwable().printStackTrace(); 
} 
6

आप स्टैक ट्रेस में यह दिखाई नहीं देता क्योंकि सुपर वर्ग के निर्माता अपने new Throwable().printStackTace() कॉल करने से पहले कहा जाता है। वास्तव में संकलक क्या बनाता है निम्नलिखित है।

public ConTest() 
{ 
    super(); // This is the call to the base class constructor 
    new Throwable().printStackTrace(); // already back from the base class constructor 
} 
2

सुपर (ऊपर सुझाए गए के रूप में) निर्माता में और विधि अधिक जानकारी के लिए पहली कॉल है here

जब आप एक वर्ग संकलन, जावा कम्पाइलर प्रत्येक निर्माता के लिए एक उदाहरण प्रारंभ विधि बनाता है आप कक्षा के स्रोत कोड में घोषित करें। हालांकि कन्स्ट्रक्टर एक विधि नहीं है, उदाहरण प्रारंभिक विधि है। यह एक नाम, <init>, एक वापसी प्रकार, शून्य, और पैरामीटर है कि निर्माता जहाँ से वह जेनरेट हुआ था

5

हाँ, वस्तु वर्ग के रूप में दस्तावेज़ का कहना है एक डिफ़ॉल्ट निर्माता है के मापदंडों से मेल खाते हैं का एक सेट है।

आपको लगता है कि आप इसे कमांड प्रॉम्प्ट में -c प्रतियोगिता javap का उपयोग करके जाँच कर सकते हैं आप इसे वस्तु वर्ग डिफ़ॉल्ट निर्माता (कॉल कर रहा है देख सकते हैं कर) नीचे में के insted पता के रूप में है कोड के रेखा नहीं: 1

C:\stackdemo>javap -c ConTest 
Compiled from "ConTest.java" 
public class ConTest extends java.lang.Object{ 
public ConTest(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: new  #2; //class java/lang/Throwable 
    7: dup 
    8: invokespecial #3; //Method java/lang/Throwable."<init>":()V 
    11: invokevirtual #4; //Method java/lang/Throwable.printStackTrace:()V 
    14: return 

public static void main(java.lang.String[]); 
    Code: 
    0: new  #5; //class ConTest 
    3: dup 
    4: invokespecial #6; //Method "<init>":()V 
    7: astore_1 
    8: return 

} 

धन्यवाद

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