java.lang.object o = 1 ؛ // لماذا هذا الترجمة؟
-
23-09-2019 - |
سؤال
كنت أقوم بإجراء واحدة من اختبارات جافا على الإنترنت وطرحت هذا السؤال:
س: أشر إلى المهمة الصحيحة:
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;
لن يجمع.
للحصول على أقصى استفادة من تجربة التعلم هذه ، يجب أن تكون على دراية بها Object
'س getClass()
طريقة. بإضافة 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.