2013-07-09 5 views
5

मेरे पास एक प्रोग्राम है जो चिड़ियाघर है और चिड़ियाघर में जानवरों के ब्रांच किए गए उपसमूह हैं जो सरीसृप हैं। जब मैं एक समान विधि करता हूं तो मुख्य प्रोग्राम संकलित करता है और यह चलता है। मैं उलझन में हूं कि जब जावा वस्तुओं की तुलना कर रहा है और विशेष रूप से int या स्ट्रिंग नहीं है तो जावा कैसे बराबर विधि का उपयोग करने के बारे में जानता है?बराबर विधि वस्तुओं के साथ काम करता है? यदि हां, तो कैसे?

public class Zoo { 

    public static void main(String[]args) { 
     Animal a=new Animal("Bob"); 
     Reptile komodo= new Reptile("Snakey"); 
     komodo.bask(); 
     a.size=3; 
     komodo.size=5; 
     System.out.println(a); 
     System.out.println(komodo); 
     Turtle t= new Turtle("Slowy"); 
     t.hide(); 
     t.size=6; 
     t.numlegs=4; 
     System.out.println(t); 
     System.out.println(t.equals(komodo)); 
    } 
} 

public class Animal { 
    public String name; 

    public boolean equals(Animal other) { 
     return other.size==this.size; 
    } 

    public Animal(String s) { 
     name=s; 
    } 
    public void setName(String n) { 
     this.name=n; 
    } 
    public void eat(String meal) { 
     System.out.println("chump chump yummy "+meal); 
    } 
    public int size; 

    public String toString() { 
     return "I am "+name+" and I'm "+size+" cm long"; 
    } 

} 

public class Reptile extends Animal { 

    public Reptile(String n) { 
     super(n); 
     numlegs=0; 
    } 
    public Reptile(String n, int l) { 
     super(n); 
     numlegs=l; 
    } 

    public void bask() { 
     System.out.println("basking..."); 
    } 
    public String toString() { 
     return super.toString()+numlegs+" legs"; 
    } 

    public int numlegs; 
} 
public class Turtle extends Reptile { 

    public Turtle(String n) { 
     super (n,4); 
     shellColor="Brown"; 
    } 
    public void hide() { 
     System.out.println("you cant see me"); 
    } 
    public String toString() { 
     return super.toString()+" and my shell is"+ shellColor; 
    } 
    public String shellColor; 

    public void bask() { 
     super.bask(); 
     System.out.println("turtle is basking..."); 
    } 

} 

उत्तर

11

आप Object#equals विधि को ओवरराइड नहीं कर रहे हैं, लेकिन इसे ओवरलोड कर रहे हैं।

public boolean equals(Animal other) 

विधि का एक अच्छा अधिभावी instanceof ऑपरेटर का उपयोग किया जाएगा: अपने विधि घोषणा में आप Object के बजाय Animal प्रकार का उपयोग करें। एक उदाहरण दिखा रहे हैं:

@Override 
public boolean equals(Object other) { 
    if(other instanceof Animal) { 
     Animal otherAnimal = (Animal)other; 
     //comparison logic... 
    } 
    return false; 
} 

विषय पर और जानकारी:

+0

+1 में सुझाव दिया पहले और सही ;-) स्थान बनाने के लिए की जरूरत है। –

+0

पीएस। एक अच्छी ओवरराइडिंग विधि भी एनोटेटेड की जानी चाहिए .-)। –

+0

@LuiggiMendoza upvote बहुत तेज़ और सही होने के लिए –

2

कैसे जावा जानता वस्तुओं की तुलना करने के लिए कैसे पर अपने प्रश्न के लिए, आप की जरूरत है बराबर विधि को ओवरराइड करें

public boolean equals(Object other){ 
    // return true or false based on your logic 

    } 

तुलना करते समय, विधि का बराबर उपयोग किया जाता है। आप इस अच्छे ट्यूटोरियल को देख सकते हैं जो बराबर विधि के महत्व को समझाता है।

http://www.thejavageek.com/2013/06/26/what-is-the-significance-of-equals-method-in-java/

इसके अलावा, केवल अधिभावी के बराबर होती है पर्याप्त यदि आप संग्रह में वस्तुओं का उपयोग कर रहे उन उपयोग हैशिंग नहीं है। आप हर वर्ग Object वर्ग चुपचाप विरासत

http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/

+0

ऑब्जेक्ट में सदस्य का आकार नहीं है। –

+0

हां सर, इसे संपादित किया गया :) –

+0

+1 ओवरराइडिंग हैशिंग का उल्लेख करने के लिए +1, मैं कहूंगा कि बराबर ओवरराइड होने पर हैश को हमेशा ओवरराइड किया जाना चाहिए अन्यथा अनुबंध टूट गया है। एक अच्छा आईडीई आपके लिए नया हैश उत्पन्न करेगा –

0

पर एक अच्छा ट्यूटोरियल मिल जाएगा। और Object कक्षा में equals विधि है। इसलिए किसी भी वर्ग तो बराबरी विधि पर हावी नहीं होता अगर यह doc

से Object.equals.

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

Object.equals

public boolean equals(Object obj) { 
    return (this == obj); 
} 

के स्रोत कोड से तो अगर किसी भी वस्तु यह बराबर का खुद का कार्यान्वयन है तो equals विधि बस अगर वस्तु संदर्भ में ही है या नहीं की जाँच करेगा नहीं है।

तो एक वांछित परिणाम प्राप्त के बराबर होती है से आप अपने खुद के द्वारा लागू करने के लिए के रूप में alread अन्य जवाब

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