2013-08-04 3 views
1

В соответствии с этим ответом hereМожет Java примитивы считать световые объекты

как Java объекты и примитивы идут на кучу. Итак, с точки зрения JVM, существуют объекты и примитивы, за исключением того, что объекты занимают больше места на куче? По сути, примитивы - это только «светлые» объекты?

+3

Примитивы не являются объектами, даже на уровне JVM. –

ответ

7

Java-примитивы не являются «легкими объектами». Это примитивы. Они не могут быть объектами в двух очень важных направлениях: они не могут попасть в объекты Collection, и у них нет методов.

Они также не попадают в кучу, за исключением полей реального объекта Java. Вы не можете сделать new int. Заметим также, что при объявлении локальной переменной, имеющей примитивный тип, переменная возникает. Когда вы объявляете локальную переменную типа объекта, все, что вы получаете, является ссылкой на объект, но оно установлено на null, и объект объявленного типа не выделяется простым объявлением переменной.

Обратите внимание, что autoboxing немного стирает различие, но различие, безусловно, существует.

+0

«не переходите в кучу, за исключением полей реального объекта Java». Даже тогда можно было бы утверждать, что они не идут в кучу, они просто часть структуры, представляющей объект (который, оказывается, находится в куче). – Thilo

+0

@Thilo - я пытался сказать, что примитив Java (по отдельности) не может быть выделен из кучи, а также пытается избежать указания того, что примитивное поле объекта каким-то образом выделено из другой памяти, чем сам объект (когда объект выделен). –

+2

Это хорошая фраза: примитивное поле хранится как часть объекта, который он содержит. Является ли это на куче (которое в текущей Java всегда бывает) или нет, несущественно. В отличие от полей объектов, где только ссылка хранится как часть объекта, а содержимое распределяется отдельно. – Thilo

1

Здесь немного путаницы. Вопрос, на который вы ссылаетесь в своем вопросе, говорит, что примитивы внутри объект может находиться в куче. Примитивы не могут быть в куче сами по себе.

У вас не может быть int, на который ссылается как объект, к нему обращаются напрямую, не будучи «разыменованным».

1

Вы экстраполируете тот факт, что примитивы могут находиться в куче (как часть других объектов), чтобы заключить, что они могут быть легкими объектами. Совокупность примитивов составляет состояние объекта. Они не являются объектами сами по себе.

Примитивы просто имеют значение. У них нет состояния и поведения, подобного объектам. Они не обладают наследованием, полиморфизмом и т. Д. Они не ведут себя как сущности, а как свои атрибуты.

+2

У примитива действительно есть состояние: его текущее значение. –

+0

@TedHopp, там разница в степени. Вряд ли можно было бы сказать: «Каково состояние int i, когда петля выходит?» или «значение приложения испортилось». Они не взаимозаменяемы и различны семантически. –

+0

Я не думаю, что есть какая-то смысловая разница. В конце концов, состояние объекта представляет собой не что иное, как сбор текущих значений (состояний) его полей. (Это включает состояния всех объектов, на которые ссылаются. Можно обсуждать, включены ли поля «переходные», но принцип один и тот же.) Первобытное поле, безусловно, может быть в коррумпированном состоянии. Если код находился посредине, скажем, обмениваясь байтами, а также выполнял какую-то другую работу, и был прерван (скажем, исключением), примитив можно разумно сказать, чтобы он находился в поврежденном состоянии. –

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