Я знаю, что такого рода вопросы задавали и раньше , но я все еще чувствую, что ответ слишком неоднозначен для меня (и, соответственно, для некоторых / большинства новичков), чтобы понять.
Я пытался научить себя более широким концепциям программирования, чем процедурное и базовое ООП. Я понимаю конкретные концепции ООП (вы создаете класс, который имеет данные (члены) и функции (методы), а затем создаете экземпляр этого класса во время выполнения, чтобы действительно делать что-то в этом роде).
Я думаю, что понимаю, что такое класс ( своего рода проектная схема для экземпляра, который будет создан по его подобию во время компиляции ). Но если это так, то что такое объект? Я также знаю, что в языках, основанных на прототипах, это может еще больше испортить ситуацию, но, возможно, именно поэтому в моем сознании должно быть четкое различие между объектом и экземпляром.
Помимо этого, я борюсь с понятиями «объект» и «экземпляр». Многие ресурсы, которые я прочитал (включая ответы на SO), говорят, что они в основном одинаковы, и что разница заключается в семантике. Другие говорят, что между ними есть настоящая концептуальная разница.
Могут ли эксперты в SO помочь новичку в этот момент «ага», чтобы продвинуться вперед в мире ООП?
Примечание: это не домашнее задание, я не хожу в школу, но я думаю, что это поможет людям, которым нужна помощь с домашним заданием.
Ответы:
Чертеж дизайна дома похож на описание класса. Все дома, построенные по этому проекту, являются объектами этого класса. Данный дом - это экземпляр.
источник
Дело в том, что объектно-ориентированное программирование часто вызывает путаницу, создавая разрыв между философской стороной разработки и реальной механической работой компьютера. Я попытаюсь противопоставить вам эти два:
Основная концепция ООП такова: Класс >> Объект >> Экземпляр.
Класс = проект. Объект - это реальная вещь, построенная по «чертежу» (например, дом). Экземпляр - это виртуальная копия (но не реальная копия) объекта.
Более техническое объяснение «экземпляра» состоит в том, что это «ссылка на память» или ссылочная переменная. Это означает, что «экземпляр» - это переменная в памяти, которая толькоимеет в себе адрес памяти объекта. Объект, к которому он обращается, - это тот же объект, экземпляр которого называется «экземпляром». Если у вас много экземпляров объекта, на самом деле у вас просто много переменных в разных местах в вашей памяти, которые имеют в себе один и тот же точный адрес памяти - все они являются адресами одного и того же точного объекта. Вы никогда не сможете «изменить» экземпляр, хотя похоже, что вы можете это сделать в своем коде. На самом деле, когда вы «меняете» экземпляр, вы меняете непосредственно исходный объект. В электронном виде процессор проходит через одно дополнительное место в памяти (ссылочная переменная / экземпляр), прежде чем он изменяет данные исходного объекта.
Это процесс: процессор >> расположение памяти экземпляра >> расположение памяти исходного объекта.
Обратите внимание, что не имеет значения, какой экземпляр вы используете - конечный результат всегда будет одинаковым. ВСЕ экземпляры будут продолжать сохранять ту же самую точную информацию в своих ячейках памяти - адрес памяти объекта - и только объект будет изменяться.
Отношения между классом и объектом немного более запутаны, хотя с философской точки зрения их легче всего понять (чертеж >> дом). Если объект - это реальные данные, которые хранятся где-то в памяти, что такое «класс»? Получается, что механически объект является точной копией класса. Таким образом, класс - это просто еще одна переменная где-то еще в памяти, которая содержит ту же точную информацию, что и объект. Обратите внимание на разницу между отношениями:
Объект - это копия класса. Экземпляр - это переменная, которая содержит адрес в памяти объекта.
Вы также можете иметь несколько объектов одного и того же класса, а затем несколько экземпляров каждого из этих объектов. В этих случаях набор экземпляров каждого объекта эквивалентен по значению, но экземпляры между объектами - нет. Например:
Пусть класс A Из класса A пусть Object1, Object2 и Object3.
// Object1 имеет то же точное значение, что и object2 и object3, но находится в разных местах памяти.
из Object1 >> let obj1_Instance1, obj1_Instace2, obj1_Instance3
// все эти экземпляры также эквивалентны по значению и находятся в разных местах памяти. Их значения = Object1.MemoryAddress.
и т.п.
Когда вы начинаете знакомить с типами, все становится еще сложнее. Вот пример использования типов из C #:
// предполагаем, что класс Person существует Person john = new Person ();
Собственно, этот код легче проанализировать, если разбить его на две части:
Говоря техническим языком, первая строка 'объявляет переменную типаЧеловек. Но что это значит?? Общее объяснение состоит в том, что теперь у меня есть пустая переменная, которая может содержать только объект Person. Но постойте - это пустая переменная! В этой ячейке памяти переменных нет ничего. Оказывается, «типы» механически бессмысленны. Типы изначально были изобретены как способ управления данными и ничего больше. Даже когда вы объявляете примитивные типы, такие как int, str, chr (без инициализации), внутри компьютера ничего не происходит. Этот странный синтаксический аспект программирования является частью того, что люди понимают, что классы являются планом объектов. ООП стали еще более запутанными с типами с типами делегатов, обработчиками событий и т. Д. Я бы попытался не зацикливаться на них слишком много и просто помню, что все они неправильные.
Вторая строка также немного сбивает с толку, потому что она выполняет сразу две вещи:
Правая часть "new Person ()" оценивается первой. Он создает новую копию класса Person, то есть создает новый объект.
После этого вычисляется левая часть "john =". Он превращает john в ссылочную переменную, давая ей адрес в памяти объекта, который был только что создан в правой части той же строки.
Если вы хотите стать хорошим разработчиком, важно понимать, что никакая компьютерная среда никогда не работает на основе философских идеалов. Компьютеры даже не настолько логичны - они на самом деле просто большой набор проводов, склеенных вместе с использованием базовых логических схем (в основном NAND и OR).
источник
Слово класса происходит от классификации ( A Категория , в которую кладется что - то ), теперь мы все слышали , что класс подобен Blueprint, но что это означает в точности? Это означает, что класс содержит описание определенной категории ( я хотел бы показать разницу между классом, объектом и экземпляром на примере с использованием Java, и я бы попросил читателей визуализировать его как рассказ во время чтения, и если вы не знакомы с java, не имеет значения ) Итак, давайте начнем с создания Category под названием HumanBeing , чтобы программа на Java выразила это следующим образом
Теперь, какие атрибуты есть у HumanBeing в целом: Имя , Возраст , Рост , Вес, а пока давайте ограничим себя этими четырьмя атрибутами, давайте добавим их в нашу категорию
Теперь у каждой категории есть поведение, например, у категории « Собака» есть поведение: лаять, приносить, катиться и т. Д.. Точно так же наша категория HumanBeing также может иметь определенное поведение, например, когда мы спрашиваем нашего HumanBeing, как вас зовут / возраст / вес / высота? Он должен дать нам свое имя / возраст / вес / рост, поэтому в java мы делаем это следующим образом
Теперь мы добавили поведение в нашу категорию HumanBeing , поэтому мы можем запросить его имя, возраст, рост, вес, но у кого вы спросите эти данные, потому что
class HumanBeing
это всего лишь категория, это план, например, архитектор делает план на документ здания, который он хочет построить, теперь мы не можем продолжать жить в чертеже ( его описании здания ), мы можем жить в здании только после того, как оно будет построено Итак, здесь нам нужно создать человеческое существо из нашей категории, которое мы описали выше, так как это сделать в JavaТеперь в приведенном выше примере мы создали нашего первого человека с именем возраст, рост, вес, так что же именно происходит в приведенном выше коде? . Мы создаем экземпляр нашей категории HumanBeing, т.е. создается объект нашего класса.
Случай 1: объект и экземпляр кажутся синонимами
Позвольте мне немного уточнить, когда мы говорим, что
HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);
объект нашей категории создается в памяти кучи, и ему выделяется некоторый адрес, и онfirstHuman
содержит ссылку на этот адрес, теперь этот объект Объект HumanBeing, а также экземпляр HumanBeing . Здесь кажется, что Объекты и Экземпляр - это синонимы, повторюсь, они не синонимыДавайте продолжим нашу историю, мы создали нашего первого человека, теперь мы можем спросить его имя, возраст, рост, вес, вот как мы это делаем в Java
Итак, у нас есть первый человек, и давайте переместим перо, дав нашему первому человеку некоторую квалификацию, давайте сделаем его Доктором, поэтому нам нужна категория под названием Доктор и дадим нашему Доктору какое-то поведение, поэтому в java мы делаем следующее
Здесь мы использовали концепцию наследования, которая привносит некоторую возможность повторного использования в коде, каждый доктор всегда будет первым человеком, поэтому у доктора будут имя, возраст, вес, рост, которые будут унаследованы от HumanBeing, вместо того, чтобы писать его снова, обратите внимание, что мы только что написали описание врача, которого еще не создали, поэтому давайте создадим Доктора в нашем
class Birth
Случай 2: Объект и Экземпляр не являются синонимами
В приведенном выше коде мы можем визуализировать, что мы создаем экземпляр нашей категории Doctor и воплощаем его в жизнь, т.е. мы просто создаем объект категории Doctor , поскольку мы уже знаем, что объекты создаются в куче памяти и
firstDoctor
содержит ссылку на этот объект в куче;Этот конкретный объект
firstDoctor
выглядит следующим образом (обратите внимание, чтоfirstDoctor
содержит ссылку на объект, а не сам объект)firstDoctor
является объектомclass Doctor
и экземпляром Aclass Doctor
firstDoctor
это не объектclass HumanBeing
Но Экземплярclass HumanBeing
Таким образом, конкретный объект может быть экземпляром определенного класса, но он не обязательно должен быть объектом данного класса.
Заключение:
Пример из реального мира будет следующим: мы вначале рождаемся как люди, поэтому представляем нас как объект человека, теперь, когда мы вырастаем, мы берем на себя ответственность, изучаем новые навыки и играем разные роли в жизни. Пример Сын, брат, дочь, отец. , теперь мама Что мы на самом деле? Мы можем сказать, что мы объекты человека, но экземпляры брата, дочери и т. д.
надеюсь, это поможет
Благодарю вас
источник
Объекты - это вещи в памяти, а экземпляры - это вещи, которые ссылаются на них. На картинке выше:
источник
Объект - это экземпляр класса (для языков на основе классов).
Я думаю, что это самое простое объяснение, которое я могу придумать.
источник
Класс определяет объект. Во многих языках можно пойти еще дальше и сказать, что интерфейс определяет общие атрибуты и методы между объектами.
Объект - это то, что может представлять что-то в реальном мире. Когда вы хотите, чтобы объект действительно представлял что-то в реальном мире, этот объект должен быть создан. Создание экземпляра означает, что вы должны определить характеристики (атрибуты) этого конкретного объекта, обычно через конструктор.
После того, как вы определили эти характеристики, у вас теперь есть экземпляр объекта.
Надеюсь, это проясняет ситуацию.
источник
«Класс описывает набор объектов, называемых его экземплярами». - Исследовательская группа Xerox, «Система Smalltalk-80», Byte Magazine Volume 06 Number 08, p39, 1981.
источник
Что такое объект?
Объект - это экземпляр класса. Лучше всего понять объект, найдя вокруг себя примеры реального мира. Ваш стол, ваш ноутбук, ваша машина - все это хорошие примеры объектов из реального мира.
Объекты реального мира имеют две общие характеристики: все они имеют состояние и поведение. Люди также являются хорошим примером объекта. У людей есть состояние / атрибуты - имя, рост, вес и поведение - ходьба, бег, разговор, сон, код: P.
Что такое класс?
Класс - это план или шаблон, который описывает детали объекта. Эти детали а именно
имя атрибуты / состояние операций / методов
Рассмотрим приведенный выше пример, поля
speed
иgear
будут представлять состояние объекта и методовchangeGear
,speedUp
а такжеapplyBrakes
определить поведение объекта автомобиля с внешним миром.Рекомендации:
источник
Я думаю, что важно отметить, что обычно есть две вещи. План и копии. Люди склонны называть эти разные вещи; классы, объекты, экземпляры - это лишь некоторые из названий, которые люди используют для них. Важно то, что есть чертеж и его копии - вне зависимости от названий. Если у вас уже есть понимание этих двоих, просто избегайте других вещей, которые вас сбивают с толку.
источник
Давайте сравним яблоки с яблоками. Все мы знаем, что такое яблоко. На что это похоже. Какой у него вкус. Это класс. Это определение вещи. Это то, что мы знаем о предмете.
А теперь иди и найди яблоко. Это пример. Мы это видим. Мы можем попробовать это. Мы можем что-то с этим делать. Это то, что у нас есть.
Класс = Что мы о чем-то знаем. Определение.
Объект / Экземпляр = Что-то, что соответствует тому определению, которое у нас есть и с которым мы можем что-то делать.
источник
В некоторых случаях термин «объект» может использоваться для описания экземпляра, но в других случаях он используется для описания ссылки на экземпляр. Термин «экземпляр» относится только к фактическому экземпляру.
Например, список можно описать как коллекцию объектов, но на самом деле он содержит ссылки на экземпляры объектов.
источник
Мне всегда нравилась идея, которая приравнивает определение класса к определению «абстрактного типа данных» . То есть, когда вы определяете класс, вы определяете новый тип «чего-то», его представление типа данных в терминах примитивов и других «чего-то» и его поведение в терминах функций и / или методов. (Извините за общность и формализм)
Всякий раз, когда вы определяете класс, вы открываете новую возможность для определения определенных сущностей с его свойствами и поведением, когда вы создаете экземпляр и / или создаете из него конкретный объект, вы фактически материализуете эту возможность.
Иногда термины «объект» и «экземпляры» взаимозаменяемы. Некоторые пуристы ООП будут утверждать, что все является объектом, я не буду жаловаться, но в реальном мире ООП мы, разработчики, используем две концепции:
источник
Объектно-ориентированное программирование - системная метафора которая помогает вам организовать знания, необходимые для обработки вашей программы, таким образом, чтобы облегчить вам разработку вашей программы. Когда вы выбираете программирование с использованием ООП, вы берете свои ООП-гуги и решаете, что вы будете видеть проблему реального мира как множество объектов, взаимодействующих между собой, отправляя сообщения. Вместо того, чтобы видеть парня за рулем машины, вы видите парня, отправляющего сообщение машине, указывающее, что он хочет, чтобы машина делала. Автомобиль - это большой объект, и он будет реагировать на это сообщение, отправив сообщение своему двигателю или колесу, чтобы иметь возможность правильно отреагировать на то, что водитель сказал ему сделать в сообщении, и т. Д.
После того, как вы создали системную метафору и видите всю реальность как объекты, отправляющие сообщения, вы решаете поместить все то, что вы видите, что имеет отношение к вашей проблемной области, на ПК. Здесь вы замечаете, что есть много парней, управляющих разными картами, и бессмысленно программировать поведение каждой из них по отдельности, потому что все они ведут себя одинаково ... Итак, вы можете сказать две вещи:
Затем вы начинаете вводить в компьютер информацию о том, как ведут себя все драйверы (или как ведет себя первый драйвер, и чем второй и третий отличаются от этого), и через некоторое время у вас есть программа, и вы используете код для создайте три драйвера, которые являются моделью, которую вы используете внутри этого ПК, чтобы ссылаться на драйверы, которые вы видели в реальном мире. Те 3 драйвера, которые вы создали внутри ПК, являются экземплярами либо прототипа (на самом деле первый - прототип, первый может быть самим прототипом в зависимости от того, как вы моделируете вещи), либо созданного вами класса. Разница между экземпляром и объектом заключается в том, что объект - это метафора, которую вы используете в реальном мире. Вы выбираете видеть парня и машину как объекты (было бы неправильно сказать, что вы видите их как экземпляры), взаимодействующие между собой. И затем вы используете это как вдохновение для создания своего кода. Экземпляр существует в вашей программе только после того, как вы создали прототип или класс. «Объекты» существуют вне ПК, потому что это отображение, которое вы используете для объединения реального мира с программой. Он объединяет парня с экземпляром драйвера, который вы создали на ПК. Таким образом, объект и экземпляр чрезвычайно связаны, но они не совсем одно и то же (экземпляр - это «нога» объекта в программе, а другая «нога» находится в реальном мире).
источник
Думаю, лучший ответ уже дан.
Классы - это чертежи, а объекты - здания, или примеры этого чертежа тоже помогли мне.
Иногда мне хочется думать, что классы - это шаблоны (как в MS Word), а объекты - это документы, которые используют этот шаблон.
источник
Расширение одного из ранее приведенных примеров в этой теме ...
Рассмотрим сценарий - существует требование, чтобы в районе было построено 5 домов для жилых целей. Все 5 домов имеют общую строительную архитектуру. Строительная архитектура - это класс . Дом - это объект . Каждый дом, в котором живут люди, - это экземпляр .
источник