2009-02-04 18 views
10

मैं एक वर्ग है कि एक और वर्ग से विरासत पर काम कर रहा हूँ, लेकिन मैं एक संकलक त्रुटि कह "प्रतीक निर्माता खाता नहीं खोजा जा सका()" हो रही है। असल में मैं क्या करने की कोशिश कर रहा हूँ एक वर्ग InvestmentAccount जो खाते से फैली हुई है बनाते हैं - खाता वापस लेने/पैसे जमा करने और InvestmentAccount समान है, लेकिन संतुलन एक शेयर की कीमत का निर्धारण कैसे साथ शेयरों में संग्रहीत किया जाता है के लिए तरीकों के साथ एक संतुलन पकड़ करने के लिए है कई शेयर जमा किए जाते हैं या एक विशेष राशि के साथ वापस ले लिया जाता है। यहाँ पहली कुछ पंक्तियों (चारों ओर जहां संकलक समस्या ने बताया) उपवर्ग InvestmentAccount की है:विरासत - "प्रतीक निर्माता नहीं खोजा जा सका"

public class InvestmentAccount extends Account 
{ 
    protected int sharePrice; 
    protected int numShares; 
    private Person customer; 

    public InvestmentAccount(Person customer, int sharePrice) 
    { 
     this.customer = customer; 
     sharePrice = sharePrice; 
    } 
    // etc... 

व्यक्ति वर्ग एक और फ़ाइल (Person.java) में आयोजित किया जाता है। वहाँ है किसी भी कारण है कि संकलक सिर्फ खाता वर्ग से खाता के लिए प्रतीक निर्माता पढ़ने नहीं है

public class Account 
{ 
    private Person customer; 
    protected int balanceInPence; 

    public Account(Person customer) 
    { 
     this.customer = customer; 
     balanceInPence = 0; 
    } 
    // etc... 

: अब यहाँ सुपर क्लास खाता की पहली कुछ पंक्तियों है? या क्या मुझे निवेश खाते के भीतर खाते के लिए एक नया कन्स्ट्रक्टर परिभाषित करने की आवश्यकता है, जो इसे सबकुछ प्राप्त करने के लिए कहता है?

धन्यवाद

उत्तर

25

InvestmentAccount रों निर्माता में उपयोग super(customer)

जावा, केवल निर्माता Account है कॉल करने के लिए पता नहीं कैसे कर सकते हैं क्योंकि यह एक खाली निर्माता नहीं है। आप केवल super() को छोड़ सकते हैं यदि आपकी बेस क्लास में खाली कंसक्टर है।

बदलें

public InvestmentAccount(Person customer, int sharePrice) 
{ 
     this.customer = customer; 
     sharePrice = sharePrice; 
} 

public InvestmentAccount(Person customer, int sharePrice) 
{ 
     super(customer); 
     sharePrice = sharePrice; 
} 

है कि काम करेंगे।

+0

मैं नियम के रूप में मैं हमेशा अपने निर्माता में सुपर() कॉल कर दिया जब लागू .. – eljenso

1

आप अगर आधार वर्ग एक डिफ़ॉल्ट निर्माता (कोई तर्क के साथ एक) नहीं है स्पष्ट रूप से आधार वर्ग के निर्माता कॉल करने के लिए की है।

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

public InvestmentAccount(Person customer, int sharePrice) { 
    super(customer); 
    sharePrice = sharePrice; 
} 

और उपवर्ग का एक उदाहरण चर के रूप में customer को फिर से परिभाषित नहीं है!

1

कॉल सुपर() विधि। यदि आप खाता (व्यक्ति) कन्स्ट्रक्टर को कॉल करना चाहते हैं, तो कथन सुपर (ग्राहक) का उपयोग करें; इसके अलावा इस अपने InvestmentAccount में पहली बयान होना चाहिए निर्माता

+0

नहीं "होना चाहिए" लेकिन "करना है"। – Bombe

1

या तो Account वर्ग में एक डिफ़ॉल्ट निर्माता को परिभाषित:

public Account() {} 

या InvestmentAccount निर्माता में super(customer) कहते हैं।

2

आप सुपर क्लास निर्माता आह्वान करने के लिए, नहीं तो जावा पता नहीं होगा क्या निर्माता आप उपवर्ग सुपर क्लास पर निर्माण करने के लिए बुला रहे हैं की है।

public class InvestmentAccount extends Account { 
    protected int sharePrice; 
    protected int numShares; 
    private Person customer; 

    public InvestmentAccount(Person customer, int sharePrice) { 
     super(customer); 
     this.customer = customer; 
     sharePrice = sharePrice; 
    } 
} 
संबंधित मुद्दे