2013-03-02 3 views
12

मुझे इस कारण के बारे में कुछ भ्रम है कि हम .equals विधि को ओवरराइड करते हैं।हमें जावा में बराबर() विधि को ओवरराइड क्यों करना है?

उदाहरण के लिए:

Test test1 = new Test(3); 
Test test2 = new Test(3); 

// The if comparison statement do same thing 
// which the overridden `.equals()` method does. 

if(test1.equals(test2)){ 
    System.out.println("test1 and test2 are ture in .equal"); 
} 

// Override .equals method. 

public boolean equals(Object object) { 
    if(object instanceof Test && ((Test)object).getValue() == this.t) { 
     return true; 
    } else { 
     return false; 
    } 
} 

मुझे समझ नहीं आता क्यों हम .equals() विधि ओवरराइड करने के लिए किया है।

+1

'test1.equals (test2) 'के सभी सदस्य चर की तुलना करके इसे काम करने के लिए इसे ओवरराइड करने की आवश्यकता है, जैसा कि आप उम्मीद करते हैं कि आप इसे ओवरराइड नहीं करते हैं। –

+6

नोट: यदि आप 'बराबर() ' – exexzian

उत्तर

19

यह आपके सवाल का जवाब देने के लिए पर्याप्त होना चाहिए: http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html

equals() विधि समानता के लिए दो वस्तुओं तुलना करता है और true रिटर्न अगर वे बराबर हैं। Object कक्षा में प्रदान की गई विधि पहचान ऑपरेटर (==) का उपयोग यह निर्धारित करने के लिए करती है कि दो ऑब्जेक्ट बराबर हैं या नहीं। आदिम डेटा प्रकारों के लिए, यह सही परिणाम देता है। वस्तुओं के लिए, हालांकि, यह नहीं है। equals()Object द्वारा प्रदान की गई विधि परीक्षण करता है कि ऑब्जेक्ट संदर्भ समान हैं-यानी, यदि तुलना की गई वस्तुएं एक ही वस्तु हैं।

यह जांचने के लिए कि समकक्ष (समान जानकारी युक्त) के अर्थ में दो वस्तुएं बराबर हैं, तो आपको equals() विधि ओवरराइड करना होगा।

(आंशिक बोली -। उदाहरण के माध्यम से पढ़ने के लिए क्लिक करें)

+0

_ ओवरराइड कर रहे हैं तो आपको' हैशकोड()' ओवरराइड करना होगा ऑब्जेक्ट क्लास में प्रदान की गई बराबर() विधि पहचान ऑपरेटर (==) का उपयोग यह निर्धारित करने के लिए करती है कि दो ऑब्जेक्ट बराबर हैं या नहीं। आदिम डेटा प्रकारों के लिए, यह सही परिणाम देता है। वस्तुओं के लिए, हालांकि, यह नहीं है। जिसका अर्थ है, हम बेहतर रूप से '==' के लिए जाते हैं यदि हमें 'बराबर()' विधि को ओवरराइड करने की आवश्यकता नहीं मिलती है। क्या मैं सही हूँ ? –

2

आपके प्रश्न का उत्तर करने के लिए, सबसे पहले मैं दृढ़ता से Documentation को देख सिफारिश करेंगे।

बराबर() विधि को ओवरराइड किए बिना, यह "==" जैसा कार्य करेगा। जब आप वस्तुओं पर "==" ऑपरेटर का उपयोग करते हैं, तो यह केवल यह देखने के लिए जांच करता है कि क्या वे पॉइंटर्स एक ही ऑब्जेक्ट को संदर्भित करते हैं। यदि उनके सदस्यों में एक ही मूल्य नहीं है।

हम अपने कोड को साफ रखने के लिए ओवरराइड करते हैं, और ऑब्जेक्ट में अगर कथन से तुलनात्मक तर्क को अमूर्त करते हैं। इसे अच्छी प्रथा माना जाता है और जावा के भारी ऑब्जेक्ट ओरिएंटेड दृष्टिकोण का लाभ उठाता है।

36

लेख Override equals and hashCode in Java से:

डिफ़ॉल्ट कार्यान्वयन बराबर का() वर्ग java.lang.Object द्वारा प्रदान की स्मृति स्थान और केवल वापसी सच तुलना करता है, तो दो संदर्भ चर एक ही स्मृति स्थान ओर इशारा करते हैं यानी अनिवार्य रूप से वे एक ही वस्तु हैं।

जावा सिफारिश की गई है करने के लिए ओवरराइड और hashCode विधि अगर समानता जा रहा है तार्किक ढंग से या के माध्यम से कुछ व्यापार तर्क से परिभाषित करने की बराबर है: उदाहरण: जावा मानक पुस्तकालय में

कई वर्गों यह जैसे को ओवरराइड करता है स्ट्रिंग बराबर ओवरराइड करता है, यदि दो स्ट्रिंग ऑब्जेक्ट्स की सामग्री बिल्कुल ठीक होती है, तो बराबर ओवरराइड() विधि सही होती है

इंटीजर रैपर क्लास ओवरराइड संख्यात्मक तुलना आदि करने के बराबर होती है।

3

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

4

.equals() कक्षाओं को ओवरराइड होने तक अधिकांश कक्षाओं के लिए एक बुद्धिमान तुलना नहीं करता है। यदि यह किसी (उपयोगकर्ता) वर्ग के लिए परिभाषित नहीं है, तो यह == जैसा ही व्यवहार करता है।

संदर्भ: http://www.leepoint.net/notes-java/data/expressions/22compareobjects.html http://www.leepoint.net/data/expressions/22compareobjects.html

1

Object.equals() विधि चेकों वस्तु नहीं आदिम डेटा प्रकार या वस्तु मूल्य (आदिम डेटा का आवरण वर्ग वस्तु, सरल आदिम डेटा प्रकार (बाइट, लघु, int की केवल संदर्भ , लंबा आदि))। इसलिए जब हम आदिम डेटा प्रकार के आधार पर वस्तु की तुलना करते हैं तो हमें बराबर() विधि को ओवरराइड करना होगा।

2

मुझे आपको एक उदाहरण दें जो मुझे बहुत उपयोगी लगता है।

आप संदर्भ के बारे में एक पुस्तक के पृष्ठ संख्या के रूप में सोच सकते हैं। मान लीजिए अब आपके पास दो पृष्ठ ए और बी नीचे हैं।

बुकपेज ए = getSecondPage();

बुकपेज बी = getThirdPage();

इस मामले में, एक == बी आपको झूठा दे देगा। पर क्यों? कारण यह है कि == क्या कर रहा है पृष्ठ संख्या की तुलना करना है। तो, भले ही इन दो पृष्ठों पर सामग्री बिल्कुल वही है, फिर भी आप झूठी होंगी।

लेकिन यदि आप सामग्री की तुलना करना चाहते हैं तो हम क्या करेंगे?

उत्तर अपने स्वयं के बराबर विधि लिखना है और निर्दिष्ट करना है कि आप वास्तव में क्या तुलना करना चाहते हैं।

2

डिफ़ॉल्ट रूप से .equals() का उपयोग करने के लिए == पहचान फ़ंक्शन का उपयोग करता है जो स्पष्ट रूप से उदाहरण परीक्षण 1 और test2 के समान काम नहीं करता है। == केवल int या स्ट्रिंग जैसे आदिम डेटा प्रकारों के साथ काम करता है। तो आपको टेस्ट क्लास

+0

जब भी कक्षा बनाई जाती है और तुलना की जाएगी तो बराबर विधि को ओवरराइड करने के लिए यह अच्छा अभ्यास माना जाता है। – user1559897

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