كم من أسئلة جافا الأساسية الأربعة التي يمكنك قولها؟
1. استخدام == الرمز
أولاً ، انظر إلى رمز أكثر إثارة للاهتمام
عدد صحيح A = 1000 ، ب = 1000 ؛ عدد صحيح C = 100 ، د = 100 ؛ public void mrun (اسم السلسلة النهائية) {new RunNable () {public void run () {system.out.println (name) ؛ }} ؛ } system.out.println (a == b) ؛ system.out.println (c == d) ؛ إذا تمكنت من الحصول على الإجابة الصحيحة على هذا السؤال وفهم المبدأ. هذا يعني أن أساسياتك على ما يرام. إذا كانت إجابتك صحيحة وصحيح ، فسيكون مؤسستك غير موجودة.
أولاً ، نشر الإجابة ، وقم بتشغيل الكود ، وسنصبح صحيحًا. نحن نعلم أن == يقارن مراجع الكائنين. ABCD هنا كلا الكائنات التي تم إنشاؤها حديثًا. من الناحية النظرية ، ينبغي إدخال خطأ. هذا هو الشيء المثير للاهتمام حول هذا السؤال. سواء كان هذا هو سؤال المقابلة أو منطقة مناقشة المنتدى ، فإن معدل ظهور هذا السؤال مرتفع للغاية. المبدأ بسيط للغاية. دعونا نلقي نظرة على فئة integer.java وسوف تفهمها.
القيمة الثابتة العامة الثابتة (int i) {return i> = 128 || أنا <-128؟ عدد صحيح جديد (i): small_values [i + 128] ؛ } / ** * ذاكرة التخزين المؤقت للحالات المستخدمة بواسطة {link integer#valueof (int)} و coxing auto * / integer النهائي الثابت [] small_values = integer [256] ؛ ثابت {for (int i = -128 ؛ i <128 ؛ i ++) {small_values [i+128] = new integer (i) ؛ }} عندما نعلن عدد صحيح C = 100 ؛. في هذا الوقت ، سيتم تنفيذ عملية الملاكمة التلقائية. بعبارة ذلك ببساطة ، فهذا يعني تحويل نوع البيانات الأساسي إلى كائن عدد صحيح ، وتحويله إلى كائن عدد صحيح هو طريقة القيمة المسمى. يمكنك أن ترى أن -128-127 مخبأة في عدد صحيح. التفسير الرسمي هو أن الأرقام الصغيرة تستخدم بشكل متكرر ، لذلك من أجل تحسين الأداء ، يتم تخزين الأرقام بينهما. هذا هو السبب في أن الإجابة على هذا السؤال خاطئة وذات. عندما تكون قيمة كائن عدد صحيح معلن بين -128-127 ، يتم الرجوع إلى نفس الكائن ، وبالتالي فإن النتيجة صحيحة.
2. سلسلة
ثم انظر إلى الكود
السلسلة S1 = "ABC" ؛ السلسلة S2 = "ABC" ؛ السلسلة S3 = سلسلة جديدة ("ABC") ؛ System.out.println (S1 == S2) ؛ System.out.println (S1 == S3) ؛ دعونا نخمن ما هي الإجابة على هذا السؤال؟
وفقًا لبناء بناء الجملة == ، أولاً وقبل كل شيء ، S1 و S2 و S3 هي ثلاثة كائنات مختلفة. الحس السليم ، سيكون كل الإخراج خطأ. ومع ذلك ، فإن نتائج تشغيل البرنامج صحيحة بالفعل وكاذبة. الإخراج الثاني خطأ مفهوم ، والمخرج الأول صحيح هو محير مرة أخرى. نحن نعلم أنه يتم تخصيص بعض متغيرات النوع الأساسي والمتغيرات المرجعية للكائن في ذاكرة مكدس الوظيفة ، بينما يتم تخزين كائنات ومصفوفات جديدة في ذاكرة الكومة. ومع ذلك ، بالإضافة إلى ذلك ، هناك منطقة أخرى تسمى حمام سباحة ثابت. كما نريد عادة السلسلة S1 = "ABC" ؛ ، يتم تخزين قيمة كائن السلسلة المعلن في تجمع ثابت. عندما نقوم بإنشاء كائن مثل String S1 = "ABC" ، يتم تخزين "ABC" في البركة الثابتة (تسمى أيضًا تجمع السلسلة). عندما نقوم بإنشاء سلسلة مرجعية S2 = "ABC" ، فإن الطبقة الأساسية Java ستعطي الأولوية للعثور على ما إذا كانت "ABC" موجودة في التجمع الثابت. إذا كان موجودًا ، فدع S2 يشير إلى هذه القيمة ، ولن أعيد إنشائها. إذا لم يكن هناك تجمع ثابت ، فسيتم إنشاؤه وإضافته إلى حمام السباحة. لهذا السبب تكون الإجابات صحيحة وكاذبة.
3. الكلمة الرئيسية النهائية <br /> دعونا نلقي نظرة على قطعة من الكود
public void mrun (اسم السلسلة النهائية) {new RunNable () {public void run () {try {thread.sleep (1000) ؛ } catch (interruptedException e) {// todo catch catch e.printstacktrace () ؛ } system.out.println (name) ؛ } }.يبدأ()؛ } أعتقد أن الجميع كتب الكثير من هذا النوع من الكود. عندما تصل الفئات الداخلية إلى المتغيرات المحلية ، فإنها تحتاج إلى إضافة معدل نهائي قبل المتغيرات المحلية ، وإلا فإن المترجم سيبلغ عن خطأ. عادة ما نفعل الشيء نفسه. حسنًا ، السؤال الثاني هو ، لماذا إضافة المعدل النهائي؟ أعتقد أن معظم أصدقائي لم يفكروا أبدًا في هذه القضية. كلما استخدموها ، ما عليك سوى إضافته مباشرة ولم يتحقق أبدًا في المبادئ. هذا ليس مرغوبًا فيه لمبرمج ممتاز. يجب ألا نعرف الحقيقة فحسب ، بل السبب أيضًا.
الآن دعنا نحلل لماذا تحتاج إلى إضافة الكلمة الرئيسية النهائية. بادئ ذي بدء ، تكون دورة حياة الطبقة الداخلية على مستوى العضو ، في حين أن دورة حياة المتغيرات المحلية في هيئة الطريقة. وبعبارة أخرى ، سيحدث هذا الموقف. عند تنفيذ طريقة MRUN ، سيتم تشغيل الخيط الجديد وسوف ينام الخيط الجديد لثانية واحدة. سيستمر مؤشر الترابط الرئيسي في التنفيذ ، ويتم تنفيذ MRUN ، وينتهي دورة حياة السمة. بعد ثانية واحدة ، يتم تنفيذ syetem.out.printth (الاسم). ومع ذلك ، في هذا الوقت ، مات الاسم ولم يعد في الذاكرة. Java هو القضاء على هذا الخطأ وتتطلب بدقة المتغيرات المحلية في الفئات الداخلية لتعديل الكلمات الرئيسية النهائية. بعد تعديل المتغير المحلي بواسطة Final ، سيتم الاحتفاظ بالنسخة المتماثلة المحلية في الذاكرة. عندما تصل الفئة الداخلية ، يتم الوصول إليها بالفعل. هذا مثل جعل دورة حياة متغير محلي أطول. بعد كل شيء ، كان مهندس Java هو الذي ملأ هذه الحفرة لنا مقدمًا ، وإلا أتساءل عن عدد الأصدقاء الذين يقلقون بشأن المتغيرات المحلية الداخلية.
4. عدد صحيح و int
انظر إلى الكود التالي
عدد صحيح A = عدد صحيح جديد (1000) ؛ int b = 1000 ؛ عدد صحيح C = عدد صحيح جديد (10) ؛ عدد صحيح D = عدد صحيح جديد (10) ؛ system.out.println (a == b) ؛ system.out.println (c == d) ؛
هذا السؤال هو متابعة للسؤال الأول. إذا تمكنت من الحصول على إجابة على هذا السؤال بسرعة ، فهناك تهنئة ، حتى لو كنت قد أتقنت وظيفة المقارنة == بشكل أكثر شمولية.
الكشف عن الإجابة الصحيحة: صحيح ، خطأ
كثير من الأصدقاء في حيرة بعد رؤية هذه الإجابة. دعنا نتحدث عن الثاني أولاً. وفقًا للسؤال الأول ، ألم يتخطى العدالة الداخلية -128-127؟ يجب أن يكون هذا صحيحًا ، ولكن إذا نظرت عن كثب ، يتم إنشاء عدد صحيح هنا ، وليس استخدام ذاكرة التخزين المؤقت ، وبالتالي فإن النتيجة خاطئة. الآن دعونا نرى لماذا أول واحد صحيح مرة أخرى؟ بادئ ذي بدء ، فإن القيمة هنا هي 1000 ، والتي بالتأكيد لا علاقة لها بذاكرة التخزين المؤقت INTEGER كما نعرفها. نظرًا لأنه لا علاقة له بذاكرة التخزين المؤقت ، A هو الكائن من الجديد ، يجب أن تكون الإدخال خاطئة. ولكن لاحظ أن B هو نوع int هنا. عندما تقارن int و integer == ، ستقوم Java تلقائيًا بإلغاء عدد صحيح ، أي تحويل عدد صحيح إلى نوع int ، وبالتالي تتم مقارنة قيمة نوع int هنا ، وبالتالي تكون النتيجة صحيحة.
بعد إجراء بعض الأسئلة بشكل صحيح ، اسرع وتحقق من الإغفالات وملء الفجوات وفقًا لمستوى الاختبار الخاص بك!