2011-12-27 3 views
16

Недавно интервьюер попросил определить разницу между объектами и примитивами. Казалось, что странный вопрос, учитывая, что все языки начинаются с примитива. Как бы вы ответили на этот вопрос?объект против примитива

Следует также отметить, что это интервью предназначалось для разработки на начальном этапе разработки, поэтому язык (я полагаю), на который он ссылался, был JavaScript.

+2

Вы упомянули, что вы предполагаете, что интервьюер имел в виду JavaScript. Я думаю, вы должны были попросить его просто быть уверенным - не следует догадываться о том, что он спрашивает, когда простой вопрос должен был бы это разъяснить. –

+1

Хороший совет, определяющий то, что он получал, помогло бы. –

ответ

30

Примитив - это тип данных, который не состоит из других типов данных и не может быть разбит дальше. Это похоже на атомы в сценарии программирования. Я говорю атом, потому что атом является основной единицей материи, и нет ничего, что может быть получено из нее.

Я имею в виду, что int в C не может быть разбит на более мелкие данные. С другой стороны, объект можно рассматривать как молекулу, состоящую из более чем одного примитивного типа. Например, string входит в стандартную библиотеку C++; однако он является объектом и состоит из меньших типов данных внутри и содержит методы.

Важно отметить, что не все объектно-ориентированные языки основаны на классах (например, Javascript). Вы не можете определить класс в Javascript, поэтому объект здесь совсем другой. Несмотря на то, что все в Javascript является объектом (Ruby также), объект Number действительно является оберткой для внутреннего примитива.

7

С Java перспектива:

  1. Примитив не состоит из других типов данных. Где в качестве объекта может быть и вообще есть.
  2. Примитивы передаются по значению, то есть копия самого примитива . Если для объектов копия ссылки передается, не сам объект.
  3. Примитивы являются независимыми типами данных, то есть для них нет иерархии/суперкласса . В то время как каждый объект является потомком класса «Объект».
  4. Каждый объект имеет собственные методы по умолчанию, которые он наследует от объекта класса (например, toString(), clone(), wait(), notify(), notifyAll() и т. Д.). У примитивов нет никакого метода , связанного с самим собой.
  5. Примитивы неизменяемы, они могут использоваться как таковые без каких-либо специальных забот . В то время как для объектов требуется особая осторожность, они по умолчанию не являются неизменными по умолчанию: .
  6. С объектами есть два типа копий: мелкие и глубокие. Там - существенная разница между ними. Поэтому выбор зависит от , как мы их намерены использовать. С примитивами нет такой разницы, все по умолчанию имеет только глубокую копию.