java.lang. Возразите o = 1;//, почему это компилирует?

Я делал один из этих тестов 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 в обоих случаях, это является озадачивающим меня.

Большое спасибо

5
задан Ramo 27 February 2010 в 10:43
поделиться

5 ответов

"1" является экземпляром класса String, а String является подклассом класса Object в Java (как и любой другой класс). 1 - это экземпляр класса Integer, который также является производным от Object.

9
ответ дан 18 December 2019 в 11:55
поделиться

Поскольку «1» является экземпляром String , а с 1.5 1 ] автоматически упаковывается в Целое число ; оба типа являются подтипами Object . До появления автобокса Object o = 1; не компилировался.

Чтобы получить максимальную отдачу от этого обучения, вы должны знать о методе getClass () объекта Object . Добавив System.out.println (o.getClass (). GetName ()) , вы также можете вывести имя класса, которому принадлежит объект, на который ссылается o . В вашем случае это java.lang.String (для (Object) «1» ) и java.lang.Integer (для ( Объект) 1 ).

В завершение, я должен упомянуть, что теперь вы также можете делать Object o = false; .

3
ответ дан 18 December 2019 в 11:55
поделиться

Итак, первый случай «1» - это литерал String , то есть подкласс объекта, следовательно, ему можно присвоить. В виде строки вывод 1 относительно прост.

Во втором случае происходит автоматическая упаковка. Целое число является подклассом объекта и, следовательно, может быть ему присвоено. Точно так же вывод 1 имеет смысл.

1
ответ дан 18 December 2019 в 11:55
поделиться

Это потому, что o имеет тип Object . Каждый объект в java расширяет класс Object . Итак ... когда вы говорите Object o = 1 , он преобразует 1 из int в Integer , который является Object . Точно так же «1» - это Строка , которая является Объектом . В обоих случаях вызов System.out.println для объекта вызывает метод Object s toString . В обоих случаях он напечатает 1.

1
ответ дан 18 December 2019 в 11:55
поделиться

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

1
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: