2015-10-10 11 views
5

मुझे लगता है कि मैं इस विषय को समझना शुरू कर रहा हूं, लेकिन पूरी तरह से नहीं। किसी को इस उदाहरण पर मुझे समझा सकता है:सरल उदाहरण पर पॉलीमोर्फिज्म

Cow cow = new Whale(); 
System.out.println(cow.getName()); 

और इस:

Whale whale = new Whale(); 

println (व्हेल

public class Solution 
{ 
    public static void main(String[] args) 
    { 
     Cow cow = new Whale(); 

     System.out.println(cow.getName()); 
    } 

    public static class Cow 
    { 
     public String getName() 
     { 
      return "Im cow"; 
     } 
    } 

    public static class Whale extends Cow 
    { 
     public String getName() { 
      return "Im whale"; 
     } 
    } 
} 

क्या फर्क जब यह कहा जाता है। getName());

मेरे पास एक ही आउटपुट होगा, लेकिन किस मामले में या शायद हमें गाय वर्ग के तरीकों को कॉल करना चाहिए, और जब व्हेल क्लास बनें। क्षमा करें अगर मैंने बहुत बेवकूफ या बहुत सरल उदाहरण दिया है। मुझे आशा है कि आप जो कहना चाहते हैं उसे कम करें। अग्रिम धन्यवाद।

उत्तर

3

यह अच्छा सवाल है पॉलिमॉर्फिज्म को समझें। मुझे यकीन है कि व्हेल चाहिए गाय फैली नहीं कर रहा हूँ;), लेकिन मैं आपको अलग संरचना का एक सा दिखा सकते हैं:

public class Solution { 
    public static void main(String[] args) { 
     Animal animal1 = new Cow(); 
     Animal animal2 = new Whale(); 

     ArrayList<Animal> myAnimals = new ArrayList<Animal>(); 
     myAnimals.add(animal1); 
     myAnimals.add(animal2); 
     //show all my animals 
     for (Animal animal : arrayList) { 
      System.out.println(animal.getName()); 

     } 


    } 


    public static class Animal { 
     public String getName() { 
      return "Im general animal"; 
     } 
    } 

    public static class Cow extends Animal { 
     public String getName() { 
      return "Im cow"; 
     } 
    } 

    public static class Whale extends Animal { 
     public String getName() { 
      return "Im whale"; 
     } 
    } 
} 

ऊपर के उदाहरण में मैं पशु वर्ग जो गाय और व्हेल के लिए बढ़ा दी है बनाया। मैं अपने जानवरों की सूची बना सकता हूं और उन्हें नाम प्रदर्शित कर सकता हूं। आपके उदाहरण में गाय गाय = नया व्हेल() के लिए ऑब्जेक्ट बनाने में कोई अंतर नहीं है; और व्हेल व्हेल = नया व्हेल(); क्या यह आपके लिए स्पष्ट है?

+0

जीप। अब यह और अधिक स्पष्ट रूप से। मेरे साथ तुलना में बहुत अच्छा उदाहरण। धन्यवाद – TyLeR

1

Cow cow = new Whale() का उपयोग करते समय, ऑब्जेक्ट Whale की तरह बनाया गया है लेकिन केवल Cow विधियों तक पहुंच है।

उदाहरण के लिए

, यदि आप अपने Whale वर्ग के लिए पद्धति जोड़ें:

public int getDeepestDive() { 
    // some code 
} 

इस कोड काम करेगा:

Whale whale = new Whale(); 
System.out.println(whale.getDeepestDive()); 

इस कोड को आपको बता देंगे Cow एक विधि कहा जाता है यह नहीं है कि getDeepestDive():

Cow whale = new Whale(); 
System.out.println(whale.getDeepestDive()); 
1

आपके उदाहरण में आपने Whale को Cow पर एक उदाहरण असाइन किया था। हालांकि वस्तु अभी भी Whale है। यही कारण है कि आप एक ही आउटपुट प्राप्त करते हैं।

public static class Whale extends Cow { 
    public String getName() { 
    return "Im whale"; 
    } 
    public void submerge() { 
    System.out.println("Hunting submarines"); 
    } 
} 

एक विधि ओवरराइड करना हमेशा वस्तु के प्रकार है कि जब तक स्पष्ट मजबूर (एक कलाकारों के साथ) अन्यथा करने के लिए instantiated है पर विधि कॉल करेंगे: अब इस Whale वर्ग पर विचार करें। हालांकि इस नए Whale कार्यान्वयन में एक नई विधि है जिसे Cow पर परिभाषित नहीं किया गया है। इसलिए आप कॉल कर सकते हैं:

Whale whale = new Whale(); 
whale.submerge(); 

लेकिन तुम नहीं लिख सकते हैं:

Cow mascaradedWhale = new Whale(); 
mascaradedWhale.submerge(); 

दूसरे उदाहरण में आप, विधि कॉल पर एक संकलन त्रुटि प्राप्त होगी के रूप में इस विधि वर्ग Cow पर परिभाषित नहीं है।

1

या हो सकता है अंतर है जब आप एक विधि है कि गायों प्रक्रियाओं बनाने और अधिक समझ में आता हो जाएगा, के एक है कि सभी गायों, व्हेल, कुत्तों, घोड़ों के नाम जमा करता है, आदि

इस विधि की जरूरत नहीं है मान लीजिए व्हेल या गाय के किसी अन्य उप-वर्ग के बारे में जानें। फिर भी यह काम करना चाहिए। उदाहरण:

public static List<String> collectNames(List<Cow> cows) 
{ 
     return cows.stream().map(c -> c.getName()).collect(Collectors.toList()); 
} 

और मुझे यकीन नहीं है कि व्हेल गाय का विस्तार क्यों करती है। यदि यह सच है तो हमें इसे एनजी चैनल पर देखना चाहिए। एक और अधिक उचित उदाहरण हो सकता है:

पशु -> गाय, कुत्ते, बिल्ली, व्हेल

व्यक्ति -> छात्र, चालक, डेवलपर आदि

+0

मैं सिर्फ गाय से व्हेल बनाना चाहता था))। बीजी एनजी को एक ईमेल लिखते हैं, जैसे ही यह टीवी पर आता है, बीमार आपको पता है)) – TyLeR

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