الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما وظيفة الدالة equals

بدأه island في 11 فبراير 2012 · 5 رد · 1,544 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بعد السلام والتحيه

اريد الاستفسار عن وظيفه الداله equals عند المقارنه بين كائنات وليس نصوص

فاذا كان لدينا كلاس اسمه ToyClass

وفيه متغيرين

private String name;

private int number;

وتم استدعاء دالة equals لكن البارميترا بتاعها من نوع كلاس اوبجكت كما في الكود



public static void changer(ToyClass aParameter)
{
aParameter.name = "Hot Shot";
aParameter.number = 42;
}


public boolean equals(ToyClass otherObject)
{
return ( (name.equals(otherObject.name))
&& (number == otherObject.number) );
}

فما هو الفرق بين المتغير name قبل الدالة equals وبين المتغير otherObject.name الذي بين الاقواس كـ argument

؟

كود الداله main


public static void main(String[] args)
{
ToyClass anObject = new ToyClass("Mr. Cellophane", 0);
System.out.println(anObject);
System.out.println(
"Now we call changer with anObject as argument.");
ToyClass.changer(anObject);

اتمنى التوضيح الله يكرمكم

تم تعديل هذه المشاركة بواسطة island في 11 فبراير 2012 في 21:35

#2
اقتباس

فما هو الفرق بين المتغير name قبل الدالة equals وبين المتغير otherObject.name الذي بين الاقواس كـ argument

المتغير name قبل كلمة equals يتم الاستعاضة عنه بالاسم الخاص بالكائن الذى تم استدعاء الدالة منه

مثال

ToyClass object1 = new ToyClass("class_one",1);

ToyClass object2 = new ToyClass("class_two",2);

if(object1.equals(object2){
System.out.println("the same");
}

الان بما ان الاستدعاء تم من الكائن الاول object1.equal() اذا يتم الاستعاضة عن name بالاسم للكائن الاول وهو "class_one"

وبما ان مابين الاقواس هو الكائن الثانى object2 اذا يتم الاستعاضة باسمه "class_two" عن المتغير الثانى فى عملية المقارنة

المسمى otherObject.name

ويصبح الكود كالتالى

return("class_one".equals("class_two") && 1 == 2);

اظن الامور اصبحت واضحة الان

بالتوفيق

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 11 فبراير 2012 في 23:24

1


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#3

بالاضافة لما ذكره أخي محمد، تعريف الدالة equals لديك غير صحيح، فالدالة تستقبل Object (ما قمت به هو overloading للequals) ، ومن الأفضل تزويد الدالة بال@Override Annotation حتى يصحح لك المترجم أي عملية Override ليست بصحيحة،

أيضاً لا بد من مراعاه شروط اعادة تعريف الدالة Equals تحسباً لأي خطأ ناجم عن استدعاء الدالة بكائن من نوع أخر ، أو بnull بدلاً من الكائن ، مثال لدالة equal مكتملة:

	@Override
    public boolean equals(Object obj) {
        if ( obj == this)
            return true;

        if ( ! (obj instanceof ToyClass ) )
            return false;

        ToyClass  toy = (ToyClass ) obj ;
        return toy.name.equals(this.name) 
                && name.number == this.number;
    }

بالتوفيق،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 12 فبراير 2012 في 07:30

1

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#4
MOHAMED FATHEI كتب:

المتغير name قبل كلمة equals يتم الاستعاضة عنه بالاسم الخاص بالكائن الذى تم استدعاء الدالة منه

مثال

ToyClass object1 = new ToyClass("class_one",1);

ToyClass object2 = new ToyClass("class_two",2);

if(object1.equals(object2){
System.out.println("the same");
}

الان بما ان الاستدعاء تم من الكائن الاول object1.equal() اذا يتم الاستعاضة عن name بالاسم للكائن الاول وهو "class_one"

وبما ان مابين الاقواس هو الكائن الثانى object2 اذا يتم الاستعاضة باسمه "class_two" عن المتغير الثانى فى عملية المقارنة

المسمى otherObject.name

ويصبح الكود كالتالى

return("class_one".equals("class_two") && 1 == 2);

اظن الامور اصبحت واضحة الان

بالتوفيق

نعم وضحت

شكرا جزاك الله خير يا طيب

Wajdy Essam كتب:

بالاضافة لما ذكره أخي محمد، تعريف الدالة equals لديك غير صحيح، فالدالة تستقبل Object (ما قمت به هو overloading للequals) ، ومن الأفضل تزويد الدالة بال@Override Annotation حتى يصحح لك المترجم أي عملية Override ليست بصحيحة،

أيضاً لا بد من مراعاه شروط اعادة تعريف الدالة Equals تحسباً لأي خطأ ناجم عن استدعاء الدالة بكائن من نوع أخر ، أو بnull بدلاً من الكائن ، مثال لدالة equal مكتملة:

	@Override
    public boolean equals(Object obj) {
        if ( obj == this)
            return true;

        if ( ! (obj instanceof ToyClass ) )
            return false;

        ToyClass  toy = (ToyClass ) obj ;
        return toy.name.equals(this.name) 
                && name.number == this.number;
    }

بالتوفيق،

شكرا استاذي Wajdy Essam

ولكن كيف عرفت انه overloading

وذا ممكن توضح كلامك اكثر فمازلت في طور تعلم هذه اللغة

وجزاك الله خير

#5

لأن أي كلاس تكتبه يكون ابن للكلاس Object حتى ولو لم تكتب extends Object .. الObject يحتوي على بعض من الدوال أهمها هي equals و hashcode و toString .. في الغالب تحتاج لاعادة تعريف هذه الدوال في الvalue classes اي التي تمثل قيمة او مفهوم يمكن مساواته مع أخر..

في الغالب ايضاً اذا قمت بتعريف احداهم عليك بتعريف البقية فسوف تستفيد من الtoString لطباعه الكائن مباشره ، وايضاً من الhashcode اذا كنت تستخدم hash map .

الأن بما أن الدالة موجودة في الكلاس Object فيمكنك اعادة استخدامها مجدداً Override وبالطبع يجب ان تكون بنفس الSignature (الArguments وال Expcetion lists اذا كان هناك)

وجود مفاهيم جديدة أمر مفيد لك ، حتى تبحث أكثر ، فهناك الكثير .. فقط ابحث واسأل عن ما صعب عليك ، والشباب فيهم البركة،

بالتوفيق،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6
Wajdy Essam كتب:

لأن أي كلاس تكتبه يكون ابن للكلاس Object حتى ولو لم تكتب extends Object .. الObject يحتوي على بعض من الدوال أهمها هي equals و hashcode و toString .. في الغالب تحتاج لاعادة تعريف هذه الدوال في الvalue classes اي التي تمثل قيمة او مفهوم يمكن مساواته مع أخر..

في الغالب ايضاً اذا قمت بتعريف احداهم عليك بتعريف البقية فسوف تستفيد من الtoString لطباعه الكائن مباشره ، وايضاً من الhashcode اذا كنت تستخدم hash map .

الأن بما أن الدالة موجودة في الكلاس Object فيمكنك اعادة استخدامها مجدداً Override وبالطبع يجب ان تكون بنفس الSignature (الArguments وال Expcetion lists اذا كان هناك)

وجود مفاهيم جديدة أمر مفيد لك ، حتى تبحث أكثر ، فهناك الكثير .. فقط ابحث واسأل عن ما صعب عليك ، والشباب فيهم البركة،

بالتوفيق،

شكرا جزيلا استاذي مازالت اكتشف كل يوم شي جديدا في الجافا

بارك الله فيك

مواضيع مشابهة