java.lang.Object o = 1; // почему это компилируется? - PullRequest
5 голосов
/ 27 февраля 2010

Я проводил один из этих онлайн-тестов 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 ]

9 голосов
/ 27 февраля 2010

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

3 голосов
/ 27 февраля 2010

Поскольку "1" является экземпляром String, а поскольку 1,5 1 автоматически упаковывается в Integer; оба типа являются подтипами Object. До того, как был введен автобокс, 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 голос
/ 27 февраля 2010

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

1 голос
/ 27 февраля 2010

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

1 голос
/ 27 февраля 2010

Ну, первый регистр "1" является литералом String, поэтому подкласс объекта, следовательно, присваивается ему. В виде строки вывод 1 относительно прост.

Во втором случае происходит автобокс. Integer - это подкласс объекта, следовательно, присваиваемый ему. Аналогично, вывод 1 имеет смысл.

...