2015-09-05 11 views
5

अमूर्त वर्ग का उपयोग करके ऑब्जेक्ट बनाने का कोई तरीका नहीं है। लेकिन अज्ञात आंतरिक वर्ग का उपयोग करते समय निम्नलिखित कोड को चलाने के लिए संभव है। और न केवल start() विधि सुलभ नहीं है, इसलिए किसी भी संकलन त्रुटि के बिना निम्नलिखित प्रोग्राम चलाने का कारण क्या है और start() विधि तक पहुंचने के लिए तंत्र क्या है।क्या अज्ञात आंतरिक वर्ग और तंत्र का उपयोग करके अमूर्त वर्ग को तत्काल करना संभव है

abstract class Vehicle{ 
     abstract void park(); 
    } 

    class Demo{ 
     public static void main(String args[]){ 
      Vehicle v1=new Vehicle(){ 
       int speed; 
       void park(){ 
        System.out.println("Parking for cars..."); 
       } 
       void start(){ 
        System.out.println("Start..."); 
       } 
      }; 
      v1.park(); 
     } 
    } 

उत्तर

6

कोड के निम्नलिखित भाग (कोड 2) पर विचार करें।

abstract class Vehicle{ 
    abstract void park(); 
} 

class Demo{ 
    static class Car extends Vehicle { 
     int speed; 
     void park(){ 
       System.out.println("Parking for cars..."); 
     } 
    } 

    public static void main(String args[]){ 
     Vehicle v1=new Car(); 
     v1.park(); 
    } 
} 

यह कोई आश्चर्य की बात नहीं है कि कोड का पिछला भाग कोई कंपाइलर त्रुटि नहीं देता है।
कार विस्तारित वाहन और कार अमूर्त नहीं है। इसलिए आप इसे तुरंत चालू कर सकते हैं।

देखते हैं जब कोड 2 संकलित पर क्या होता है:

javac *.java 
list .class files 
Demo$Car.class Demo.class Vehicle.class 

और यह जब प्रश्न में कोड (कोड 1) संकलित किया गया है तो:

javac *.java 
list .class files 
Demo$1.class Demo.class Vehicle.class 

हम एक ही मिलता है सिवाय हम कोड 1 में डेमो $ 1. क्लास प्राप्त करते हैं और कोड 2 में डेमो $ Car.class प्राप्त करते हैं।
ऐसा इसलिए होता है क्योंकि कोड 1 वास्तव में वाहन से विरासत में प्राप्त कक्षा बना रहा है। एक तथाकथित अज्ञात वर्ग। कक्षा का कोई नाम नहीं है (*) लेकिन यह अभी भी एक पूर्ण श्रेणी है जो वाहन से विरासत में आता है और तुरंत तत्काल किया जा सकता है जैसे कार को तत्काल किया जा सकता है।

इस कोड:

Vehicle v1=new Vehicle(){ 

वर्ग वाहन की एक वस्तु instantiating नहींहै। यह उस वर्ग की वस्तु को तत्काल कर रहा है जो वाहन से विरासत में है जिसका कोई नाम नहीं है।

(*) असल में इसका नाम है। इसका नाम "डेमो में 1" उर्फ ​​डेमो $ 1 है। JVM को इसे चलाने में सक्षम होने के लिए एक नाम की आवश्यकता है, आप केवल जेवीएम को यह बताए बिना कुछ चलाने के लिए नहीं बता सकते कि उसे क्या चलाना है। नाम वह है जो कक्षा के लिए एक सैंटैक्टिक रूप से वैध नाम नहीं है; कक्षा को 1 के रूप में नामित नहीं कर सकता है। यह डेसिन द्वारा है क्योंकि यह सुनिश्चित करता है कि बेनामी वर्ग के नाम सामान्य श्रेणी के नामों से संघर्ष नहीं करेंगे।

+0

आप शामिल करना चाहते हैं कि आपके टर्मिनल कमांड केवल * निक्स सिस्टम के लिए हैं। –

+0

ठीक है, यह स्पष्ट करेगा। यद्यपि जेवीके के साथ किसी भी मंच पर जावैक आम है। –

4

यह सार वर्गों में बिल्कुल सही विचार है। आप अमूर्त वर्ग को कम नहीं कर सकते हैं, लेकिन आप इसके उप-वर्ग को स्थापित कर सकते हैं जो अमूर्त तरीकों को लागू करता है। इस तरह के उप वर्गों ठोस वर्ग, या अनाम वर्गों की तरह तुम यहाँ किया जा सकता है, तो यह कोड के लिए कोई कारण नहीं संकलित करने के लिए नहीं

1

Anonymous class मतलब है कि आप अपने Demo में स्थानीय class घोषित किया है। बेनामी क्लास अभिव्यक्ति है जो अमूर्त तरीकों का कार्यान्वयन कर सकती है। मुख्य रूप से अज्ञात वर्ग interface या abstractclass का स्थानीय कार्यान्वयन है जिसमें अमूर्त विधियों के कार्यान्वयन और अमूर्त वर्ग के अमूर्त तरीकों के कार्यान्वयन के समान होना चाहिए। तो, संक्षेप में आप अज्ञात वर्ग के साथ abstract कक्षा को तुरंत चालू कर सकते हैं।

यहां, आप वास्तव में आवश्यक कार्यान्वयन के साथ अपने Demo में अज्ञात वर्ग के रूप में अपनी पूरी कक्षा Vehicle घोषित कर रहे हैं। यहाँ ध्यान दें कि आप Demo वर्ग जो Demo में एक गुमनाम वर्ग और अपने Vehicle के कार्यान्वयन है संकलन के बाद Demo$1.class फ़ाइल होगा।

1

हालांकि आप नए वाहन() लिख रहे हैं लेकिन यह वाहन वर्ग का उदाहरण नहीं बना रहा है। यह वाहन के उप प्रकार का एक उदाहरण बना रहा है जिसका नाम

1

अमूर्त वर्ग का उपयोग करके वस्तु बनाने का कोई तरीका नहीं है। लेकिन अज्ञात आंतरिक वर्ग का उपयोग करते समय निम्नलिखित कोड को चलाने के लिए संभव है। किसी भी संकलन त्रुटि के बिना प्रोग्राम के बाद runinng का कारण क्या है।

कोड चलाता है क्योंकि आप नहीं हैं abstract class से सीधे एक वस्तु instantiating। जब आप abstract class या interface से एक गुमनाम वर्ग बनाने आप वास्तव में एक नया वर्ग पैदा कर रहे विस्तार/abstract class या interface को लागू करने।

यह वास्तव में महत्वपूर्ण नहीं है कि आप एक आंतरिक कक्षा का उपयोग कर रहे हैं या नहीं।


संक्षेप में, जब आप एक अनाम वर्ग बनाने के लिए, यह नया "बेनाम" वर्ग जो फैली सार वर्ग instantiated हो जाता है!

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