سؤال

كنت أقوم بإجراء واحدة من اختبارات جافا على الإنترنت وطرحت هذا السؤال:

س: أشر إلى المهمة الصحيحة:

Long l = 1; 
Double d = 1;
Integer i = 1;
String s = 1;
Object o = "1";
System.out.println(o);
o = 1;
System.out.println(o);

يرجى تجربة ذلك بنفسك قبل أن تذهب إلى أبعد من ذلك.

حسنًا ، أستطيع أن أخبرك أنني أخطأت ، لقد بحثت عنها ووجدت:

//Long l = 1; //cannot widen and then box
Long ll = 1L;//no need to widen, just box
//Double d = 1;//cannot widen and then box
Double dd = 1d;//no need to widen, just box
Integer i = 1;//no need to widen, just box
//String s = 1;//cannot do implicit casting here

Object o = "1";//this compiles and is just plain weird 
System.out.println(o);//output is 1
o = 1;//this also compiles and is also weird 
System.out.println(o);//output is 1

هل يمكن لأحد أن يخبر لماذا:

Object o = 1; و Object o = "1";

ترجمة وإخراج 1 في كلتا الحالتين ، هذا محير لي.

شكرا جزيلا

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

المحلول

"1" هو مثيل لفئة السلسلة ، والسلسلة هي فئة فرعية لفئة الكائن في Java (مثل أي فئة أخرى). 1 محاصر في عدد صحيح ، وهو مستمد أيضًا من كائن.

نصائح أخرى

لان "1" هو مثال على أ String, ومنذ 1.5 1 هو التلقائي بملحق إلى Integer; ؛ كلا النوعين من أنواع فرعية من Object. قبل تقديم Autoboxing ، Object o = 1; لن يجمع.

للحصول على أقصى استفادة من تجربة التعلم هذه ، يجب أن تكون على دراية بها ObjectgetClass() طريقة. بإضافة System.out.println(o.getClass().getName()), ، يمكنك أيضًا طباعة اسم الفصل الذي أشار إليه الكائن o ينتمي إلى. في حالتك ، هم java.lang.String(Object) "1") و java.lang.Integer(Object) 1).

فقط للإنجاز ، أود أن أذكر أنه يمكنك الآن القيام به أيضًا Object o = false;.

حسنًا ، الحالة الأولى "1" هي أ String حرفي ، لذلك فئة فرعية من الكائن ، وبالتالي يمكن تعيينها. كسلسلة ، فإن إخراج 1 بسيط نسبيا.

في الحالة الثانية ، يحدث التفاف التلقائي. Integer هي فئة فرعية من الكائن ، وبالتالي يمكن تعيينها. وبالمثل ، فإن إخراج 1 ثم منطقي تمامًا.

هذا بسبب o من النوع Object. كل كائن ، في جافا ، يمتد الفصل Object. لذلك ... عندما تقول Object o = 1, ، يتحول 1 إلى من int ل Integer, وهو أمر Object. وبالمثل ، "1" هو أ String وهو Object. في كلتا الحالتين ، الاتصال System.out.println على Object يستدعي Objectس toString طريقة. في كلتا الحالتين ، سيتم طباعة 1.

يمكنك وضع Object o = anything; أين anything هل أي كائن لأن جميع الفئات مستمدة من Object صف دراسي. إنه يعمل مع Primitives بسبب ميزة Autoboxing التي جاءت في Java 1.5.

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