Я делал один из этих тестов 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
- это экземпляр класса Integer, который также является производным от Object.
Поскольку «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;
.
Итак, первый случай «1» - это литерал String
, то есть подкласс объекта, следовательно, ему можно присвоить. В виде строки вывод 1 относительно прост.
Во втором случае происходит автоматическая упаковка. Целое число
является подклассом объекта и, следовательно, может быть ему присвоено. Точно так же вывод 1 имеет смысл.
Это потому, что o
имеет тип Object
. Каждый объект в java расширяет класс Object
. Итак ... когда вы говорите Object o = 1
, он преобразует 1 из int
в Integer
, который является Object
. Точно так же «1» - это Строка
, которая является Объектом
. В обоих случаях вызов System.out.println
для объекта
вызывает метод Object
s toString
. В обоих случаях он напечатает 1.
Вы можете указать Object o = something;
где something
- это любой объект, потому что все классы являются производными от Класс объекта
. Он работает с примитивами из-за функции автобокса, которая появилась в java 1.5.