java.lang.Объект o = 1;//почему это компилируется?

StackOverflow https://stackoverflow.com/questions/2346624

  •  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 вызывает Objects toString способ.В обоих случаях он выведет 1.

Вы можете положить Object o = anything; где anything является любым объектом, потому что все классы являются производными от Object класс.Он работает с примитивами из-за функции автоматической упаковки, которая появилась в java 1.5.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top