2011-03-30 8 views
25

हैलो मैं जावा के लिए नया हूं, मुझे यह त्रुटि मेरे उत्पादन कार्यकर्ता वर्ग में मिल रही है। मेरा उत्पादन कार्यकर्ता कन्स्ट्रक्टर स्पष्ट रूप से एक और कन्स्ट्रक्टर का आह्वान करता है। मुझे नहीं पता क्या करना है?।जावा। लागू सुपर कन्स्ट्रक्टर कर्मचारी() अनिर्धारित है। स्पष्ट रूप से एक और कन्स्ट्रक्टर

import java.util.Date; 

public class Employee 
{ 
     private String name, number; 
     private Date date; 

     public Employee(String name, String number, Date date) 
     { 
      setName(name); 
      setNumber(number); 
      setDate(date); 
     } 

     public void setName(String n) 
     { 
      name = n; 
     } 
     public void setNumber(String n) 
     { 
      number = n; 
      // you can check the format here for correctness 
     } 
     public void setDate(Date d) 
     { 
      date = d; 
     } 

     public String getName() 
     { 
      return name; 
     } 
     public String getNumber() 
     { 
      return number; 
     } 
     public Date getDate() 
     { 
      return date; 
     } 
} 



public class ProductionWorker extends Employee 
{ 
     private int shift; 
     private double hourlyrate; 
     // error is here (Implicit super constructor Employee() is undefined. Must explicitly invoke another constructor). 
     public ProductionWorker(int shift, double hourlyrate) 
     { 
      setShift(shift); 
      setHourlyPayRate(hourlyrate); 
     } 

     public void setShift(int s) 
     { 
      shift = s; 
     } 
     public void setHourlyPayRate(double rate) 
     { 
      hourlyrate = rate; 
     } 

     public int getShift() 
     { 
      return shift; 
     } 
     public double getHourlyPayRate() 
     { 
      return hourlyrate; 
     } 
} 
+0

अपने कर्मचारी वर्ग में एक डिफ़ॉल्ट निर्माता डाल दिया। 'सार्वजनिक कर्मचारी() {}' – user489041

उत्तर

27

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

तो, आपके मामले में, आप या तो माता-पिता में डिफ़ॉल्ट कन्स्ट्रक्टर को लागू कर सकते हैं या कक्षा में किसी भी निर्माता को सीधे कॉल कर सकते हैं।

+0

इस सार्वजनिक कर्मचारी (स्ट्रिंग प्रति घंटा, स्ट्रिंग शिफ्ट) जैसे डिफ़ॉल्ट कन्स्ट्रक्टर { \t शिफ्ट = ""; \t घंटेबद्ध = ""; } – user659658

+0

नहीं, एक डिफ़ॉल्ट कन्स्ट्रक्टर का अर्थ पैरामीटर के बिना एक निर्माता है, जैसे कि सार्वजनिक कर्मचारी() {} –

+0

मैंने ऐसा किया और अभी भी वही त्रुटि प्राप्त हुई। – user659658

3

ProductionWorkerEmployee फैली हुई है, इस प्रकार यह कहा जाता है कि यह एक कर्मचारी की सभी योग्यताएं है। इसे पूरा करने के लिए, जावा प्रत्येक कन्स्ट्रक्टर की पहली पंक्ति में स्वचालित रूप से super(); कॉल डालता है, आप इसे मैन्युअल रूप से रख सकते हैं लेकिन आमतौर पर यह आवश्यक नहीं है। आपके मामले में, यह आवश्यक है क्योंकि super(); पर कॉल को इस तथ्य के कारण स्वचालित रूप से नहीं रखा जा सकता है कि कर्मचारी के निर्माता के पास पैरामीटर हैं।

आपको या तो अपने Employee कक्षा में एक डिफ़ॉल्ट कन्स्ट्रक्टर को परिभाषित करने की आवश्यकता है, या उत्पादन वर्कर में कन्स्ट्रक्टर की पहली पंक्ति में super('Erkan', 21, new Date()); पर कॉल करें।

+0

इसका पैरामीटर प्रकारों से कोई लेना देना नहीं है। अभिभावक वर्ग कन्स्ट्रक्टर को एक स्पष्ट कॉल आवश्यक है क्योंकि अभिभावक के पास नो-एर्ग कन्स्ट्रक्टर नहीं है। –

+0

@Isaac, सहमत और संपादित धन्यवाद .. –

+0

अन्य ने गलत जवाब दिया, आपके पास 'सार्वजनिक कर्मचारी() {} जैसी कोई डिफ़ॉल्ट रचनाकार नहीं है; आपको केवल अपनी सुपर क्लास के रचनाकारों को कॉल करने की आवश्यकता है। अपने बच्चों के निर्माता के अंदर। इस तरह: 'सार्वजनिक उत्पादन कार्यकर्ता (int shift, double hourlyrate) { \t \t सुपर (नाम, संख्या, दिनांक); सेटशफ्ट (शिफ्ट); setHourlyPayRate (Hourlyrate); } ' –

2

किसी भी समय अभिभावक वर्ग के कन्स्ट्रक्टर को एक स्पष्ट कॉल की आवश्यकता होती है जब अभिभावक वर्ग में कोई तर्क-तर्क कन्स्ट्रक्टर नहीं होता है। आप या तो अभिभावक वर्ग में कोई तर्क-तर्क कन्स्ट्रक्टर जोड़ सकते हैं या स्पष्ट रूप से अपने बच्चे वर्ग में अभिभावक वर्ग कन्स्ट्रक्टर को कॉल कर सकते हैं।

8

जैसा कि अन्य ने पहले से ही उल्लेख किया है कि आपको अपने Employee कक्षा में एक डिफ़ॉल्ट कन्स्ट्रक्टर public Employee(){} प्रदान करना होगा।

क्या होता है कि संकलक स्वचालित रूप से किसी भी वर्ग के लिए बिना किसी तर्क के डिफॉल्ट कन्स्ट्रक्टर प्रदान करता है। यदि आपकी कक्षा में कोई स्पष्ट सुपरक्लास है, तो उसके पास Object का एक अंतर्निहित सुपरक्लास है, जो में कोई तर्क-तर्क निर्माता नहीं है। इस मामले में आप अपनी कक्षा Employee में एक कन्स्ट्रक्टर घोषित कर रहे हैं इसलिए आप भी नो-तर्क कन्स्ट्रक्टर प्रदान कर सकते हैं।

कहा करने के बाद कि Employee वर्ग इस तरह दिखना चाहिए:

आपका वर्ग कर्मचारी

import java.util.Date; 

public class Employee 
{ 
     private String name, number; 
     private Date date; 

     public Employee(){} // No-argument Constructor 

     public Employee(String name, String number, Date date) 
     { 
      setName(name); 
      setNumber(number); 
      setDate(date); 
     } 

     public void setName(String n) 
     { 
      name = n; 
     } 
     public void setNumber(String n) 
     { 
      number = n; 
      // you can check the format here for correctness 
     } 
     public void setDate(Date d) 
     { 
      date = d; 
     } 

     public String getName() 
     { 
      return name; 
     } 
     public String getNumber() 
     { 
      return number; 
     } 
     public Date getDate() 
     { 
      return date; 
     } 
} 

यहाँ जावा ओरेकल ट्यूटोरियल है - Providing Constructors for Your Classes अध्याय। इसके माध्यम से जाओ और आप के बारे में एक स्पष्ट विचार होगा कि क्या हो रहा है।

0

हाल ही में मेरी कंप लैब में यह समस्या थी। यह आसान है और एरकन ने इसका सही उत्तर दिया। बस super("the name of your subclass") डाल दें ताकि आपकी समस्या के संबंध में - super("ProductionWorker); आपके subclass' कन्स्ट्रक्टर की पहली पंक्ति के रूप में।

0

यह समस्या तब भी आ सकती है जब आपके पास आपके निर्माता तुरंत कॉल सुपर नहीं है।

तो यह काम करेगा:

public Employee(String name, String number, Date date) 
    { 
    super(....) 
    } 

लेकिन यह ऐसा नहीं करेंगे:

public Employee(String name, String number, Date date) 
    { 
    // an example of *any* code running before you call super. 
    if (number < 5) 
    { 
     number++; 
    } 

    super(....) 
    } 

कारण 2 उदाहरण में विफल रहता है, क्योंकि जावा फोन implicitely कोशिश कर रहा है

super(name,number,date) 

आपके कन्स्ट्रक्टर में पहली पंक्ति के रूप में .... तो जावा नहीं देखता है कि आपको बाद में कंकड़ में सुपर जाने का आह्वान हुआ है uctor। यह अनिवार्य रूप ऐसा करने की कोशिश करता है:

public Employee(String name, String number, Date date) 
    { 
    super(name, number, date); 

    if (number < 5) 
    { 
     number++; 
    } 

    super(....) 
    } 

तो समाधान है बहुत आसान ... बस अपने सुपर कॉल करने से पहले कोड डाल नहीं ;-) आप सुपर को कॉल करने से पहले कुछ प्रारंभ करने की जरूरत है, एक और निर्माता में कर, और उसके बाद वर्ष निर्माता फोन ... की तरह इस उदाहरण pulled from this StackOverflow post में:

public class Foo 
{ 
    private int x; 

    public Foo() 
    { 
     this(1); 
    } 

    public Foo(int x) 
    { 
     this.x = x; 
    } 
} 
संबंधित मुद्दे