java.lang.Объект o = 1;//почему это компилируется?
-
23-09-2019 - |
Вопрос
Я проводил один из таких онлайн-тестов Java, и мне задали этот вопрос:
Q:Укажите правильное назначение:
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"
является экземпляром класса String, а String является подклассом класса Object в Java (как и любой другой класс). 1
заключен в целое число, которое также является производным от Object .
Другие советы
Потому что "1"
является экземпляром String
, и начиная с 1.5 1
автоматически упаковывается в Integer
;оба типа являются подтипами Object
.До того, как была введена автоматическая упаковка, Object o = 1;
не будет компилироваться.
Чтобы получить максимальную отдачу от этого учебного процесса, вы должны знать о Object
's getClass()
способ.Путем добавления System.out.println(o.getClass().getName())
, вы также можете вывести имя класса , на который ссылается объект с помощью o
принадлежит кому.В вашем случае это java.lang.String
(для (Object) "1"
) и java.lang.Integer
(для (Object) 1
).
Просто для завершения я должен упомянуть, что теперь вы также можете делать Object o = false;
.
Что ж, первый случай "1" - это String
литерал, то есть подкласс object, следовательно, присваиваемый ему.Как строка, она выводит значение 1 относительно просто.
Во втором случае происходит автоматическая блокировка. Integer
является подклассом object, следовательно, может быть присвоен ему.Аналогично, вывод 1 тогда имеет смысл.
Это происходит потому, что o
относится к типу Object
.Каждый объект в java расширяет класс Object
.Итак...когда ты говоришь Object o = 1
, он преобразует 1 в из int
Для Integer
, который является Object
.Аналогично, "1" - это String
который является Object
.В обоих случаях вызов System.out.println
на одном Object
вызывает Object
s toString
способ.В обоих случаях он выведет 1.
Вы можете положить Object o = anything;
где anything
является любым объектом, потому что все классы являются производными от Object
класс.Он работает с примитивами из-за функции автоматической упаковки, которая появилась в java 1.5.