2011-07-02 11 views
10

जावा में, मैं अमूर्त कक्षाओं के उदाहरण नहीं बना सकता। तो निम्नलिखित कोड के बारे में चीख ग्रहण क्यों नहीं करता है?जावा: सार कक्षाओं में अंतिम चर

public abstract class FooType { 
    private final int myvar; 

    public FooType() { 
     myvar = 1; 
    } 
} 
+0

आपको ऐसा क्यों लगता है कि इसे पहली जगह "चीखना" चाहिए? – aps

+0

महत्वपूर्ण जगह के नीचे @ लाल रेखाएं (कन्स्ट्रक्टर में असाइनमेंट, या कन्स्ट्रक्टर स्वयं) – imacake

उत्तर

13

कोड ठीक है, अंतिम चर FooType के निर्माता में प्रारंभ किया गया है।

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

यदि आपके पास एक निर्माता में super(...) पर कोई स्पष्ट कॉल नहीं है, तो जावा कंपाइलर इसे स्वचालित रूप से जोड़ देगा। इसलिए यह सुनिश्चित किया जाता है कि विरासत श्रृंखला में प्रत्येक वर्ग के एक निर्माता को बुलाया जाता है।

0

आप फूटाइप के ठोस उप-वर्ग बना सकते हैं और उनके पास माइवर नामक अंतिम क्षेत्र होगा।

बीटीडब्ल्यू: ए public एक अमूर्त वर्ग में कन्स्ट्रक्टर protected जैसा ही है क्योंकि इसे केवल उप-वर्ग से ही बुलाया जा सकता है।

आपका संदेह क्या है?

+0

आह, यही कारण है कि ग्रहण इसे खाता है। देखें, मैं स्थिर संदर्भ में एक आइकन लाइब्रेरी बनाना चाहता था। लेकिन मैं डिस्क से लोड करना चाहता था, इसलिए मैं एक बार में अंतिम और स्थिर का उपयोग नहीं कर सकता। – imacake

+0

सुनिश्चित नहीं है कि समस्या क्या है। आप किसी ऑब्जेक्ट का संदर्भ बना सकते हैं जिसे आप डिस्क स्थिर और अंतिम से लोड करते हैं। –

3

आपके पास गैर-सारणी कक्षाओं में सार तत्वों में समृद्ध वर्गों, विधियों, गुणों, सब कुछ हो सकते हैं। आप कक्षा को तुरंत चालू नहीं कर सकते हैं। तो इस कोड के साथ कुछ भी गलत नहीं है।

एक पाने वर्ग में आप निर्माता फोन और अंतिम गुण सेट कर सकते हैं: अगर आप सुपर(), यह वैसे भी संकलक द्वारा सम्मिलित किया जाएगा के लिए एक कॉल निर्दिष्ट नहीं करते

public class Foo extends FooType 
{ 
    public Foo() 
    { 
    super(); // <-- Call constructor of FooType 
    } 
} 

0

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

0

नहीं, आप सार कक्षा के अंदर अंतिम चर घोषित नहीं कर सकते हैं। उदाहरण के नीचे जांचें।

public abstract class AbstractEx { 
    final int x=10; 
    public abstract void AbstractEx(); 
} 

public class newClass extends AbstractEx{ 

    public void AbstractEx(){ 
     System.out.println("abc"); 
     } 
    } 

public class declareClass{ 
    public static void main(String[] args) { 
     AbstractEx obj = new newClass(); 
     obj.AbstractEx(); 
     // System.out.println(x); 
    } 
} 

इस कोड सही चलाता है और के रूप में

एबीसी

उत्पादन का उत्पादन लेकिन अगर हम के

println (एक्स) टिप्पणी प्रतीक को दूर;

यह त्रुटि उत्पन्न करेगा।

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