سؤال

لذلك لقد اشتريت كتاب "Java for dummies" الطبعة الرابعة، ويجب أن أقول أنه ربما يكون أفضل 30 دولارا قضيته على أي وقت مضى على كتاب. أنا لست جديدا في الترميز، أنا في الواقع لائقة إلى حد ما في ذلك إذا قلت ذلك بنفسي.

ومع ذلك، لقد صادفت خطا من التعليمات البرمجية التي تلمسها الخلط:

public void setName(String n)
{
     if(!n.equals(""))
     {
          name = n;
     }
}

سؤالي يأتي في السطر الثالث، إذا كان ("! n. Alequales (" ")) ... أعرف كيف حال عمل الحلقات (أي: إذا كان ذلك (هذا == ذلك) {do الاشياء})، لكنني لم ير! n. المساكن ("") إعداد من قبل. يمكن لأي شخص شرح ذلك لي؟

ملاحظة: فقط لرمي في تخمين. هل هو نفسه:

public void setName(String n)
{
     if(n != "")
     {
          name = n
     }
}

أعتقد أنها مجرد وسيلة للتأكد من أنه إذا لم يكتب المستخدم باسم (أي. myAccount.setname = ""؛) لا يرتكب خطأ ويعمل مثل العادي، لكنني لم أكن متأكدا وبعد

شكرا مقدما للمساعدة!

تحرير: تغيير "myAccount.name =" "؛" إلى "myaccount.setname =" "؛"، آسف على الارتباك.

شكرا: يذهب إلى Asaph، نقدر الجواب! لنفسك لوكاس أاردفارك، أجاب كذلك، ولكن أجاب أساف تعليق التحقق الخاص بي في إجابته الخاصة أولا، وذلك بفضل الجميع!

هل كانت مفيدة؟

المحلول

if(!n.equals(""))
{
     name = n;
}

يعني إذا كانت N ليست سلسلة فارغة، قم بتعيين قيمتها إلى الاسم.

في Java، يحتوي كل كائن على طريقة تساوي (كائن س) لاختبار المساواة مع كائن آخر. عادة ما يتم استخدام المشغل == لمقارنة البدائيات. يمكن استخدامه أيضا لمقارنة الأشياء ل "التشابه". بمعنى آخر. الكائنتين في الواقع نفس الحالة. يأتي هذا في متناول يدي لأنواع ثابتة مثل السلاسل وجميع مغلفة الكائنات لأنواع بدائية مثل عدد صحيح وطويل.

نصائح أخرى

في جاوة، تكون السلاسل غير قابلة للتطبيق ولكن غير متدرب، لذلك إذا كان ("== N) قد يكون أو لا يكون صحيحا لسلسلة أخرى التي" ". المساواة (ن) صحيح.

فقط للخلط بينك أكثر، وهذا هو رمز سيء، وسوف تحصل على nullpointerexception إذا دعا مع null كما الحجة. يجب أن تكون مكتوبة بأنها "". المساواة (ن)

تساوي الطريقة () تقارن محتويات السلتيين. the == و! = يخبرك المشغلون ما إذا كانت كائنات السلسلة هي نفس الكائن أم لا. اثنين من سلاسل مختلفة مع نفس المحتويات، وبالتالي يساوي () لبعضها البعض، قد لا تزال! = لبعضها البعض. على الرغم من أن السلاسل ليست قابلة للتغيير، إلا أنها تساعد على فهم الفرق من خلال تخيل أن السلاسل قابلة للتغيير، ثم يساوي () تعني "هي نفسها حاليا" و == تعني "سيكون دائما نفس الشيء".

القاعدة الآمنة هي دائما استخدام المساواة () إلا إذا كنت متأكدا من كلتا السلاسل interned.. وبعد نقلا عن:

يتبع ذلك لأي سلاسل S و T، S.intern () == T.Intern () صحيح إذا وفقط إذا كان S.Aquals (T) صحيحا.

يتم إتتالية جميع السلاسل الحرفية وتعبيرات ثابتة ذات قيمة ثابتة.

النظر في هذا:

String a="";
String b="";

كل من A و B هي كائنات سلسلة، ولكل منها تخصيص الذاكرة الخاصة به وبالتالي عنوان فريد من نوعه. أ و ب هي في عناوين مختلفة. عند رمز التعبير المنطقي

a == b

أنت تقارن عناوين الكائنات وليس محتوياتها. لمقارنة المحتويات، يجب عليك استخدام طريقة Quites Equals () سلسلة.

يحتوي كائن على موقع مادي في الذاكرة، وهو أمر فريد من نوعه لكل كائن - لا يمكن أن تحتوي كائنتان مميزان على نفس عنوان الذاكرة - ومحتوياتها أو قيمتها. the == المشغل يقارن عناوين الكائنات؛ عند رمزك A == B، تسأل عما إذا كانت A و B هي أسماء مستعرضة لنفس الكائن - هل تشير A إلى نفس الموقع الفعلي. يسأل A. المساواة (ب) عما إذا كانت الكائنتين، أينما كانت، لها نفس القيمة.

هذا معقد إلى حد ما بواسطة مترجم "Interning"، حيث قد يكتشف المحول البرمجي عند ترجمة الوقت أن اثنين من الثابت لديهم نفس القيمة وإعادة استخدام نفس الكائن، ولكن هذا لن يكون صحيحا بالنسبة للقيم التي تم إنشاؤها في وقت التشغيل.

طريقة equals() سوف يعود أ boolean القيمة التي تنص على أن الكائن الذي يتم تمريره هو "يساوي" الكائن الذي يصنع المكالمة. يمكن تجاوز طريقة "المساواة إلى" في الفصول إلى إجراء اختبار خاص بها. في حالة String, ، الاختبار هو ما إذا كانت قيمة السلسلة الأصلية هي نفس قيمة تمثيل سلسلة الكائن الذي يتم تمريره فيه.

لأنها ترجع منطقية، يمكنك نفي القيمة مع !, ، لذلك الاختبار هو "هي طريقة الأسلوب ليست سلسلة فارغة؟" نعم؟ ثم تعيينها لدينا name عامل.

== سوف اختبار دائما ما إذا كان الكائن على اليسار هو نفس الكائن على اليمين، كما يقارن المراجع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top