2012-07-30 12 views
5

मैं कुछ कोड में आया और इसके एक निश्चित पहलू को समझ नहीं पाया हालांकि मैंने कुछ व्यापक खोज की है!जावा में कक्षा के नाम के आसपास ब्रांड्स का उपयोग क्यों किया जाता है?

मेरा प्रश्न है: कक्षाओं को कभी-कभी निम्नलिखित कोड में ब्रांड्स के भीतर क्यों घोषित किया जाता है?

public class Animal { 

    public static void hide() { 
     System.out.println("The hide method in Animal."); 
    } 

    public void override() { 
     System.out.println("The override method in Animal."); 
    } 
} 

public class Cat extends Animal { 

    public static void hide() { 
     System.out.println("The hide method in Cat."); 
    } 

    public void override() { 
     System.out.println("The override method in Cat."); 
    } 

    public static void main(String[] args) { 
     Cat myCat = new Cat(); 
     Animal myAnimal = (Animal)myCat; 
     myAnimal.hide(); 
     myAnimal.override(); 
    } 
} 

जहाँ मेरा फोकस विशेष रूप से कोड की इस पंक्ति पर है:

  Animal myAnimal = (Animal)myCat; 

मेरा मानना ​​है कि यह इस तथ्य से कोई लेना देना है कि कुछ एक वर्ग एक और फैली हुई है लेकिन अनिश्चित क्या वर्ग कोष्ठक में परिभाषित कर रहा हूँ का प्रतीक है।

इस पर किसी भी मदद की सराहना की जाती है। पहले ही, आपका बहुत धन्यवाद।

+0

यह एक टाइपकास्ट है लेकिन इस मामले में टाइपकास्ट आवश्यक नहीं है - चूंकि 'बिल्ली' एक उप-प्रकार का पशु है। जब आप उप-प्रकार को सुपर-टाइप असाइन करना चाहते हैं, तो टाइपकास्ट आवश्यक हैं। बिल्ली बिल्ली = (बिल्ली) कुछ अनंत; '। यदि आप ऐसा करते हैं तो आपको यह सुनिश्चित करना होगा कि वेरिएबल में या तो 'बिल्ली' या उप-प्रकार का 'बिल्ली' निहित है, उदा। 'exampleof' का उपयोग कर। अन्यथा जावा 'क्लासकास्ट अपवाद' फेंक देगा।इस विशेष मामले में –

+0

, चूंकि बिल्ली पशु को बढ़ाती है और मेरा एनीमल पहले से ही पशु है, तो आपको myCat को पशु में डालने की आवश्यकता नहीं है। तो, पशु myAnimal = myCat; काम किया होगा – Shark

+0

ब्रैकेट '[]' - ब्रेसेस '{}' - ब्रांड्स '()' - "कोण ब्रैकेट" '<>' –

उत्तर

8

जो आप देख रहे हैं वह कंपाइलर को बताने के लिए एक कलाकार है जो बिल्ली को एक पशु को सौंपना ठीक है।

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

7

यह एक कास्ट है - myCat वेरिएबल Cat का प्रकार बेस क्लास Animal पर डाला जा रहा है।

इसका मतलब है कि इसे Animal माना जा सकता है।

यह जावा में inheritance का मूल कार्य है।


रूप @Sebastian Koppehelcommented, इस मामले में डाली की जरूरत है नहीं - (प्रकार Animal का) myAnimal चर किसी भी प्रकार कि Animal लागू करता है स्वीकार कर सकते हैं।

+1

और विरासत की यह मूलभूत विशेषता का अर्थ है कि इस उदाहरण में कास्ट * अनावश्यक * है। जब आपको पता होता है कि ऑब्जेक्ट किसी निश्चित वर्ग का है, तो आपको casts की आवश्यकता है लेकिन संकलक कुछ कारणों से नहीं जान सकता है। इस मामले में संकलक इसे जानता है और कलाकार केवल वाक्य रचनात्मक चीनी है। –

+0

तो तथ्य यह है कि 'बिल्ली' 'पशु' को बढ़ाता है, कास्टिंग व्यर्थ बनाता है? अर्थात। क्या वही काम करता है? – Sidz

+0

@ Sadiq_S86 - अनिवार्य रूप से, हां। कलाकार की जरूरत नहीं है। – Oded

0

आप स्पष्ट रूप से संकलक/रनटाइम की गारंटी दे रहे हैं कि आप जिस बिल्ली संदर्भ प्रकार को पार कर रहे हैं वह पशु का प्रकार है। जावा में, इसे कास्टिंग कहा जाता है।

रनटाइम अगर इस अनुबंध को सम्मानित नहीं किया जाता है (इसका मतलब है कि बिल्ली और पशु के बीच कोई संबंध परिभाषित नहीं है) तो आपको ClassCastException मिलेगा।

1

हालांकि कोड सही आउटपुट उत्पन्न करता है, अगर आपको ऑब्जेक्ट को मूल वर्ग में डालना है और फिर मूल वर्ग की स्थिर विधि को कॉल करना है, तो कक्षाओं को बेहतर तरीके से डिज़ाइन करने की आवश्यकता हो सकती है। जावा में विरासत सामान्य तरीकों और क्षेत्रों तक पहुंच प्रदान करना है। अगर किसी को अभिभावक वर्ग में एक स्थैतिक विधि को कोड करने की आवश्यकता होती है और उसे बाल वर्गों की वस्तु का उपयोग करके कॉल किया जाता है, तो माता-पिता और बाल वर्ग के बीच संबंध स्पष्ट कट नहीं होता है।

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