2016-11-13 3 views
-3
Integer ki=new Integer("50"); 
System.out.println(ki);//Here I would expect to print the objects name something like [email protected] but this didn't happen. 
ki=3;//Here I would expect an error but this actually works. 

Когда System.out.println (ki);, выполненный тогда 50, появился в консоли, но когда я печатаю другие объекты, некоторые вещи, такие как [email protected], появляются, почему появилось 50 вместо чего-то вроде [email protected]?Почему можно напечатать «правильно» объект Integer в java?

Я, хотя ki, является типом Integer, поэтому, когда я назначаю примитивное значение 3, я должен получить ошибку, но почему?

+2

узнать о боксе и Autoboxing: http://beginnersbook.com/2014/09/java-autoboxing-and-unboxing-with-examples/ –

+2

Вы должны пройти через Java чтобы по крайней мере познакомиться с основной семантикой языка. –

+0

@AndrewLi, к сожалению, ответ в этом сообщении не был действительно полезным. – xlxs

ответ

11

У вас есть два отдельных вопроса: там

System.out.println(ki);//Here I would expect to print the objects name something like [email protected] but this didn't happen. 

Поскольку Integer overrides toString. Его реализация:

public String toString() { 
    return String.valueOf(value); 
} 

Хм ... или потому, что println(int) exists on PrintStream.

Нет, это вызов System.out.println(Object), который затем использует объект toString. Это связано с тем, что (как сообщает specification) правило состоит в том, чтобы сначала попытаться найти соответствующую подпись без автоматического (un) бокса и без varargs; затем просто с автоматическим (un) боксом, затем, наконец, с обоими.

ki=3;//Here I would expect an error but this actually works. 

Это из-за autoboxing: компилятор Java вставляет код, необходимый, чтобы взять эту примитивную 3 и создать Integer экземпляр для него. Байткод он на самом деле излучает это делает:

ki = Integer.valueOf(3); 
+0

Если im correct Integer - это последний класс. Могут ли методы финальных классов переоценить? – xlxs

+0

@xlxs: Вы правы, что это «final», и нет, конечный класс состоит в том, что он не может быть подклассифицирован; поскольку только подклассы могут переопределять методы, методы последнего класса нельзя переопределить. 'Integer' переопределяет' toString' объекта 'Object' (' Number' находится между ними, но не переопределяет 'toString'), но' toString' 'Integer' не может быть переопределен, потому что он не может быть подклассы. –

+0

Спасибо за помощь :) – xlxs

Смежные вопросы