मैंने कहीं पढ़ा है कि हम एक इंटरफ़ेस को प्रारंभ नहीं कर सकते, उदाहरण के लिए:

interface MyInterface{};

और निम्नलिखित कोड निश्चित रूप से अवैध है:

MyInterface m = new MyInterface();

और जैसा कि मुझे याद है कि मैंने जो पाठ पढ़ा है, उसने कहा: क्योंकि new कीवर्ड का उपयोग कक्षा के सदस्यों के लिए स्मृति आवंटित करने के लिए किया जाता है; इसलिए इंटरफ़ेस के मामले में, हमारे पास केवल अमूर्त कार्य हैं, इसलिए इंटरफ़ेस में आवंटित करने के लिए कुछ भी नहीं है; इसलिए, एक इंटरफ़ेस प्रारंभ करना निषिद्ध है।

ठीक है, यह मुझे समझ में आता है।

लेकिन अमूर्त वर्ग के मामले में, हमें अमूर्त कार्यों, गैर-अमूर्त कार्यों के साथ-साथ सामान्य चर को घोषित करने और परिभाषित करने की अनुमति है; तो हमें एक अमूर्त वर्ग को आरंभ करने की अनुमति क्यों नहीं है? और उसके कारण, मैं सोच रहा था कि एक अमूर्त वर्ग में कब और कैसे चर, यदि कोई हो, स्मृति आवंटित की जाती है?

6
ipkiss 7 सितंबर 2011, 18:11

10 जवाब

सबसे बढ़िया उत्तर

कोई भी वस्तु कभी भी एक अमूर्त वर्ग का "सिर्फ" उदाहरण नहीं होती है - यह हमेशा एक ठोस वर्ग का उदाहरण होता है। अन्यथा आप अमूर्त विधियों को कॉल कर सकते हैं ... और कॉल करने के लिए कोई कार्यान्वयन नहीं होगा।

एक अमूर्त वर्ग में वेरिएबल्स को उसी तरह आवंटित किया जाता है जैसे किसी अन्य वर्ग के वेरिएबल जो प्रारंभ किए जा रहे वास्तविक वर्ग के सुपरक्लास होते हैं - वे अन्य वर्गों के चर के साथ "साथ" रहते हैं पदानुक्रम, मूल रूप से।

संपादित करें: स्पष्ट करने के लिए, यह एक वैचारिक सीमा है जितना कि एक कार्यान्वयन। एक अमूर्त वर्ग आमतौर पर में अमूर्त विधियाँ होती हैं, जो इसे सार बनाने का कारण है। अमूर्त तरीकों की बात यह है कि कॉल करने वाले को संकलन-समय की जाँच करने की अनुमति मिलती है कि विधि वहाँ होगी, भले ही अमूर्त वर्ग कार्यान्वयन प्रदान न करे। वीएम यह सुनिश्चित करता है कि "जस्ट" एब्स्ट्रैक्ट क्लासेस के इंस्टेंटेशन को रोककर एक कार्यान्वयन है

अब अमूर्त वर्ग भी का उपयोग तात्कालिकता को रोकने के लिए किया जा सकता है, भले ही कोई सार विधि न हो - मूल रूप से एक अमूर्त वर्ग का मूल बिंदु यह है कि यह वह है जो नहीं सीधे तत्काल हो; केवल ठोस उपवर्गों को तत्काल किया जा सकता है।

15
Jon Skeet 7 सितंबर 2011, 18:38

जब आप कहते हैं "प्रारंभ करें" तो आपका वास्तव में दो अलग-अलग चीजों का मतलब है: आवंटन और निर्माण। आवंटन वस्तु के लिए स्मृति प्राप्त करने की प्रक्रिया है; निर्माण वस्तु को स्वयं जीवन में लाने की प्रक्रिया है।

जैसा कि आप ठीक से देखते हैं, आपके इंटरफ़ेस वर्ग को स्मृति की आवश्यकता नहीं है। लेकिन वह बात नहीं है। एक अमूर्त वर्ग को बनाया नहीं जा सकता क्योंकि यह है... ठीक है, सार। सार प्रकार का कोई ऑब्जेक्ट नहीं है। और इंटरफेस अमूर्त हैं।

एक मर्सिडीज को एक अमूर्त कार के रूप में सोचें। आप एक मर्सिडीज खरीद सकते हैं, लेकिन आप एक अमूर्त कार नहीं खरीद सकते - इसका अर्थ अर्थ नहीं है। कोई भी कार जो आप कल्पना कर सकते हैं वह एक ठोस प्रकार की होनी चाहिए।


संपादित करें: यह विचार करना उपयोगी हो सकता है क्यों एक वर्ग सार हो सकता है:

  • क्योंकि इसे abstract class घोषित किया गया है। यह डिक्री द्वारा इसे अमूर्त फ्लैट-आउट बनाता है, कोई कारण नहीं दिया गया।

  • क्योंकि इसमें अमूर्त सदस्य कार्य हैं: सदस्य फ़ंक्शन लागू नहीं किया गया है, और एक ठोस, व्युत्पन्न वर्ग को कार्यान्वयन प्रदान करना चाहिए।

  • क्योंकि इसे interface घोषित किया गया है: यह नैतिक रूप से "सभी सदस्य कार्य सार हैं, और कोई सदस्य ऑब्जेक्ट नहीं हैं" के बराबर है। (इसके लिए एक अलग कीवर्ड होने से इंटरफेस को सिंगल इनहेरिटेंस की सीमाओं को दरकिनार करने की अनुमति मिलती है।)

5
Kerrek SB 7 सितंबर 2011, 19:42

यह एक अमूर्त वर्ग की बात है: अन्य वर्गों के लिए आधार वर्ग होना। इसे विशेष रूप से तत्काल नहीं के लिए डिज़ाइन किया गया है।

अधिकांश अमूर्त वर्गों में अमूर्त विधियाँ होती हैं, जिनका कार्यान्वयन नहीं होता है। यदि आप अमूर्त वर्ग को तुरंत चालू करते हैं तो आप इस तरह की विधि को कैसे बुलाएंगे?

जब आप एक अमूर्त वर्ग के उपवर्ग का एक नया उदाहरण बनाने के लिए new का उपयोग करते हैं, तो आधार सार वर्ग के लिए आवश्यक स्मृति भी आवंटित की जाएगी।

3
dlev 7 सितंबर 2011, 18:14

एक सार वर्ग एक ऐसा वर्ग है जो अभी तक समाप्त नहीं हुआ है और आम तौर पर इसमें अमूर्त सदस्य होते हैं (हालांकि यह अनिवार्य नहीं है)। तो आप एक अमूर्त वर्ग को तुरंत चालू नहीं कर सकते हैं। यह भाषा द्वारा परिभाषित किया गया है।

3
Petar Minchev 7 सितंबर 2011, 18:14

एक अमूर्त वर्ग एक ऐसा वर्ग है जिसे अमूर्त घोषित किया जाता है - यह हो सकता है या हो सकता है अमूर्त विधियों को शामिल न करें। सार कक्षाओं को तत्काल नहीं किया जा सकता, लेकिन उन्हें उपवर्गित किया जा सकता है।

यदि किसी वर्ग में अमूर्त विधियाँ शामिल हैं, तो कक्षा को ही सार घोषित किया जाना चाहिए।

http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

1
Michael 7 सितंबर 2011, 18:14

अमूर्त वर्ग पूर्ण नहीं हैं। उनके पास अमूर्त विधियां हैं, जिन्हें लागू नहीं किया जाता है। यदि आप उनमें से किसी एक का आह्वान करने का प्रयास करते हैं तो क्या होगा?

अमूर्त वर्ग' चर ठोस तात्कालिक वर्ग द्वारा स्मृति पर स्थित होते हैं।

1
amit 7 सितंबर 2011, 18:14

एक अमूर्त वर्ग में चर आवंटित किए जाते हैं जब new कीवर्ड का उपयोग उस वर्ग पर किया जाता है जो extends अमूर्त वर्ग है।

इसलिए यदि आपके पास अपनी अमूर्त कक्षा का विस्तार करने वाली कक्षा नहीं है तो उन्हें कभी आवंटित नहीं किया जाता है।

0
Farmor 7 सितंबर 2011, 18:13

जब आप किसी वर्ग को तत्काल करते हैं, तो आप कक्षा के कई पहलुओं के लिए स्मृति आवंटित कर रहे हैं, जिसमें विधियों के लिए एक क्षेत्र शामिल है (यह इससे काफी अधिक शामिल है)। अमूर्त वर्गों में कुछ विधियों की परिभाषा नहीं होती है, इसलिए हम वास्तविक विधियों के लिए संकेत नहीं दे सकते।

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

0
tafoo85 7 सितंबर 2011, 18:15

शायद कुछ कोड के साथ एक उदाहरण उपयोगी हो सकता है।

abstract class AC{
    abstract public void m();
}

class Main{
    public static void main(String[] a){
        AC obj = new AC();
        obj.m();  /* Nothing to execute. */
    }
}

इसलिए इस व्यवहार को प्रतिबंधित किया जाना चाहिए।

0
Captain Giraffe 7 सितंबर 2011, 18:21

वैसे, भले ही आपका इंटरफ़ेस खाली हो, आपको एक खाली कार्यान्वयन प्रदान करना होगा:

सीरियल करने योग्य एक्स = नया सीरियल करने योग्य () {};

एक अमूर्त वर्ग के लिए भी खाली घुंघराले ब्रेसिज़ की आवश्यकता होगी। मैं हालांकि इन निर्माणों की आवश्यकता का सामना करने के बारे में नहीं सोच सकता।

0
Ustaman Sangat 7 सितंबर 2011, 18:22