Разница между объектом и экземпляром


83

Я знаю, что такого рода вопросы задавали и раньше , но я все еще чувствую, что ответ слишком неоднозначен для меня (и, соответственно, для некоторых / большинства новичков), чтобы понять.

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

Я думаю, что понимаю, что такое класс ( своего рода проектная схема для экземпляра, который будет создан по его подобию во время компиляции ). Но если это так, то что такое объект? Я также знаю, что в языках, основанных на прототипах, это может еще больше испортить ситуацию, но, возможно, именно поэтому в моем сознании должно быть четкое различие между объектом и экземпляром.

Помимо этого, я борюсь с понятиями «объект» и «экземпляр». Многие ресурсы, которые я прочитал (включая ответы на SO), говорят, что они в основном одинаковы, и что разница заключается в семантике. Другие говорят, что между ними есть настоящая концептуальная разница.

Могут ли эксперты в SO помочь новичку в этот момент «ага», чтобы продвинуться вперед в мире ООП?

Примечание: это не домашнее задание, я не хожу в школу, но я думаю, что это поможет людям, которым нужна помощь с домашним заданием.


1
Интересно, не хотите ли вы добавить несколько дополнительных вопросов, например: «Все ли экземпляры являются объектами?» , и, "все ли объекты экземпляры?" Если оба «да», то мы можем подтвердить, что они одинаковы.
WesternGun

Как только вы создаете экземпляр класса (используя new), этот экземпляр становится объектом. Объект - это то, что может соответствовать принципам инкапсуляции, полиморфизма, абстракции объектно-ориентированного программирования и реальной вещи, с которой программа взаимодействует, чтобы использовать члены экземпляра, определенные в классе. Объект содержит члены экземпляра (нестатические члены). Таким образом, экземпляр класса - это объект. Слово «экземпляр» используется, когда вы говорите о происхождении, откуда он родился, это будет более понятно, если вы скажете «экземпляр класса» по сравнению с «объект класса»
p_champ

Ответы:


131

Чертеж дизайна дома похож на описание класса. Все дома, построенные по этому проекту, являются объектами этого класса. Данный дом - это экземпляр.


6
Кроме того, есть улица из моего родного города, которая имеет немного местной славы, потому что здесь восемь одинаковых кирпичных домов подряд (до того, как возникла концепция «жилищного строительства»). Так что я могу это очень хорошо визуализировать. «Класс» - вот что придумал архитектор. Готовые дома являются «объектами», потому что все они построены одинаково. Каждый дом является «экземпляром», потому что с тех пор к ним (и может и дальше) относиться по-разному [теперь у одного есть запасной путь: o (].
TCCV

16
Статические методы подобны коммунальным службам, которыми пользуются все дома.
WOPR

2
Но разве дом, построенный по чертежу, не является экземпляром?
Hot Licks

1
Это означает, что первая память, занимаемая определением класса, - это экземпляр. в то время как все созданные объекты называются объектами.
Хафиз Шехбаз Али

6
Разве объект и экземпляр не одно и то же?
Правин Кумар

42

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

Основная концепция ООП такова: Класс >> Объект >> Экземпляр.

Класс = проект. Объект - это реальная вещь, построенная по «чертежу» (например, дом). Экземпляр - это виртуальная копия (но не реальная копия) объекта.

Более техническое объяснение «экземпляра» состоит в том, что это «ссылка на память» или ссылочная переменная. Это означает, что «экземпляр» - это переменная в памяти, которая толькоимеет в себе адрес памяти объекта. Объект, к которому он обращается, - это тот же объект, экземпляр которого называется «экземпляром». Если у вас много экземпляров объекта, на самом деле у вас просто много переменных в разных местах в вашей памяти, которые имеют в себе один и тот же точный адрес памяти - все они являются адресами одного и того же точного объекта. Вы никогда не сможете «изменить» экземпляр, хотя похоже, что вы можете это сделать в своем коде. На самом деле, когда вы «меняете» экземпляр, вы меняете непосредственно исходный объект. В электронном виде процессор проходит через одно дополнительное место в памяти (ссылочная переменная / экземпляр), прежде чем он изменяет данные исходного объекта.

Это процесс: процессор >> расположение памяти экземпляра >> расположение памяти исходного объекта.

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

Отношения между классом и объектом немного более запутаны, хотя с философской точки зрения их легче всего понять (чертеж >> дом). Если объект - это реальные данные, которые хранятся где-то в памяти, что такое «класс»? Получается, что механически объект является точной копией класса. Таким образом, класс - это просто еще одна переменная где-то еще в памяти, которая содержит ту же точную информацию, что и объект. Обратите внимание на разницу между отношениями:

Объект - это копия класса. Экземпляр - это переменная, которая содержит адрес в памяти объекта.

Вы также можете иметь несколько объектов одного и того же класса, а затем несколько экземпляров каждого из этих объектов. В этих случаях набор экземпляров каждого объекта эквивалентен по значению, но экземпляры между объектами - нет. Например:

Пусть класс 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 john;
john = new Person();

Говоря техническим языком, первая строка 'объявляет переменную типаЧеловек. Но что это значит?? Общее объяснение состоит в том, что теперь у меня есть пустая переменная, которая может содержать только объект Person. Но постойте - это пустая переменная! В этой ячейке памяти переменных нет ничего. Оказывается, «типы» механически бессмысленны. Типы изначально были изобретены как способ управления данными и ничего больше. Даже когда вы объявляете примитивные типы, такие как int, str, chr (без инициализации), внутри компьютера ничего не происходит. Этот странный синтаксический аспект программирования является частью того, что люди понимают, что классы являются планом объектов. ООП стали еще более запутанными с типами с типами делегатов, обработчиками событий и т. Д. Я бы попытался не зацикливаться на них слишком много и просто помню, что все они неправильные.

Вторая строка также немного сбивает с толку, потому что она выполняет сразу две вещи:

Правая часть "new Person ()" оценивается первой. Он создает новую копию класса Person, то есть создает новый объект.

После этого вычисляется левая часть "john =". Он превращает john в ссылочную переменную, давая ей адрес в памяти объекта, который был только что создан в правой части той же строки.

Если вы хотите стать хорошим разработчиком, важно понимать, что никакая компьютерная среда никогда не работает на основе философских идеалов. Компьютеры даже не настолько логичны - они на самом деле просто большой набор проводов, склеенных вместе с использованием базовых логических схем (в основном NAND и OR).


32

Слово класса происходит от классификации ( A Категория , в которую кладется что - то ), теперь мы все слышали , что класс подобен Blueprint, но что это означает в точности? Это означает, что класс содержит описание определенной категории ( я хотел бы показать разницу между классом, объектом и экземпляром на примере с использованием Java, и я бы попросил читателей визуализировать его как рассказ во время чтения, и если вы не знакомы с java, не имеет значения ) Итак, давайте начнем с создания Category под названием HumanBeing , чтобы программа на Java выразила это следующим образом

class HumanBeing{ 
   /*We will slowly build this category*/ 
}

Теперь, какие атрибуты есть у HumanBeing в целом: Имя , Возраст , Рост , Вес, а пока давайте ограничим себя этими четырьмя атрибутами, давайте добавим их в нашу категорию

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight; 

   /*We still need to add methods*/

}

Теперь у каждой категории есть поведение, например, у категории « Собака» есть поведение: лаять, приносить, катиться и т. Д.. Точно так же наша категория HumanBeing также может иметь определенное поведение, например, когда мы спрашиваем нашего HumanBeing, как вас зовут / возраст / вес / высота? Он должен дать нам свое имя / возраст / вес / рост, поэтому в java мы делаем это следующим образом

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight;  

    public HumanBeing(String Name,int Age,float Height,float Weight){
       this.Name = Name;
       this.Age  = Age;
       this.Height = Height;
       this.Weight = Weight;
    }

    public String getName(){
      return this.Name;
    }

    public int getAge(){
      return this.age;
    }

    public float getHeight(){
      return this.Height;
    }

    public float getWeight(){
      return this.Weight;
    }
}

Теперь мы добавили поведение в нашу категорию HumanBeing , поэтому мы можем запросить его имя, возраст, рост, вес, но у кого вы спросите эти данные, потому что class HumanBeingэто всего лишь категория, это план, например, архитектор делает план на документ здания, который он хочет построить, теперь мы не можем продолжать жить в чертеже ( его описании здания ), мы можем жить в здании только после того, как оно будет построено Итак, здесь нам нужно создать человеческое существо из нашей категории, которое мы описали выше, так как это сделать в Java

class Birth{
  public static void main(String [] args){
    HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);    
  }
}

Теперь в приведенном выше примере мы создали нашего первого человека с именем возраст, рост, вес, так что же именно происходит в приведенном выше коде? . Мы создаем экземпляр нашей категории HumanBeing, т.е. создается объект нашего класса.

Примечание: объект и экземпляр не являются синонимами. В некоторых случаях кажется, что объект и экземпляр являются синонимами, но это не так, я приведу оба случая.

Случай 1: объект и экземпляр кажутся синонимами
Позвольте мне немного уточнить, когда мы говорим, что HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90); объект нашей категории создается в памяти кучи, и ему выделяется некоторый адрес, и он firstHumanсодержит ссылку на этот адрес, теперь этот объект Объект HumanBeing, а также экземпляр HumanBeing . Здесь кажется, что Объекты и Экземпляр - это синонимы, повторюсь, они не синонимы

Давайте продолжим нашу историю, мы создали нашего первого человека, теперь мы можем спросить его имя, возраст, рост, вес, вот как мы это делаем в Java

class Birth{
  public static void main(String [] args){
    HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);
    System.out.println(firstHuman.getName());
    System.out.println(firstHuman.getAge());
    ...
    ...  
  }
}

Итак, у нас есть первый человек, и давайте переместим перо, дав нашему первому человеку некоторую квалификацию, давайте сделаем его Доктором, поэтому нам нужна категория под названием Доктор и дадим нашему Доктору какое-то поведение, поэтому в java мы делаем следующее

class Doctor extends HumanBeing{
   public Doctor(String Name,int Age,float Height,float Weight){
      super(Name,Age,Height,Weight);
   }
   public void doOperation(){
    /* Do some Operation*/ 
   }

   public void doConsultation(){
    /* Do so Consultation*/
   }
}  

Здесь мы использовали концепцию наследования, которая привносит некоторую возможность повторного использования в коде, каждый доктор всегда будет первым человеком, поэтому у доктора будут имя, возраст, вес, рост, которые будут унаследованы от HumanBeing, вместо того, чтобы писать его снова, обратите внимание, что мы только что написали описание врача, которого еще не создали, поэтому давайте создадим Доктора в нашемclass Birth

class Birth{
  public static void main(String [] args){
    Doctor firstDoctor = new Doctor("Strange",40,6,80);
    .......
    .......
    /*Assume some method calls , use of behaviour*/
    .......
    .......    
  }
}

Случай 2: Объект и Экземпляр не являются синонимами
В приведенном выше коде мы можем визуализировать, что мы создаем экземпляр нашей категории Doctor и воплощаем его в жизнь, т.е. мы просто создаем объект категории Doctor , поскольку мы уже знаем, что объекты создаются в куче памяти и firstDoctorсодержит ссылку на этот объект в куче;

Этот конкретный объект firstDoctorвыглядит следующим образом (обратите внимание, что firstDoctorсодержит ссылку на объект, а не сам объект)

  1. firstDoctorявляется объектомclass Doctor и экземпляром Aclass Doctor
  2. firstDoctorэто не объектclass HumanBeing Но Экземплярclass HumanBeing

Таким образом, конкретный объект может быть экземпляром определенного класса, но он не обязательно должен быть объектом данного класса.

Заключение:

Объект называется экземпляром определенной категории, если он удовлетворяет всем характеристикам этой конкретной категории.

Пример из реального мира будет следующим: мы вначале рождаемся как люди, поэтому представляем нас как объект человека, теперь, когда мы вырастаем, мы берем на себя ответственность, изучаем новые навыки и играем разные роли в жизни. Пример Сын, брат, дочь, отец. , теперь мама Что мы на самом деле? Мы можем сказать, что мы объекты человека, но экземпляры брата, дочери и т. д.

надеюсь, это поможет

Благодарю вас


5
... и почему у нас всего 3 голоса за этот ответ?
Pratik Ambani

13

введите описание изображения здесь

Объекты - это вещи в памяти, а экземпляры - это вещи, которые ссылаются на них. На картинке выше:

  • std (экземпляр) -> Студенческий объект (справа)
  • std1 (экземпляр) -> Студенческий объект (слева)
  • std2 (экземпляр) -> Студенческий объект (слева)
  • std3 (экземпляр) -> нет объекта (null)

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

Итак, экземпляр - это указатель на объект? (экземпляр == переменная с адресом памяти?)
Стано

6
Чыонг, ваш ответ неверен и сбивает с толку. Фактически, экземпляр - это объект, производный от объекта базового класса. Экземпляр == объект. Эта терминология хорошо объясняется, например, в том или ином ответе.
Stano

@jww: Изображение является ссылкой на math.hws.edu/javanotes/c5/objectsInHeap.png, которое сейчас имеет номер 404. Предположительно, оно было видно в момент публикации .
Мэтт Берланд

6

Объект - это экземпляр класса (для языков на основе классов).

Я думаю, что это самое простое объяснение, которое я могу придумать.


1
Я согласен с тем, что ваше объяснение примерно соответствует тому, как я читал, но в Интернете есть много записей, в которых проводится различие между ними. Я не знаю, нельзя ли ответить на этот вопрос, не имея в виду язык (вау, мета-вопрос, этот вопрос - класс, который нельзя использовать без его создания с помощью языка, лол).
TCCV

6

Класс определяет объект. Во многих языках можно пойти еще дальше и сказать, что интерфейс определяет общие атрибуты и методы между объектами.

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

После того, как вы определили эти характеристики, у вас теперь есть экземпляр объекта.

Надеюсь, это проясняет ситуацию.


Я думаю, это в основном то, что сказал Джо. Поправьте меня если я ошибаюсь.
TCCV

3
Выше Джо говорит, что все дома, построенные по проекту, являются объектами. Правда. И он говорит, что данный дом - это пример. Правда. Но все дома являются экземплярами, и данный дом также является объектом. Он имел значение там, где его не было. В коде необходимо различать объект и экземпляр в момент его создания. Мы говорим, что он создается, когда он действительно построен. Часто возникает вопрос: не забыли ли вы создать экземпляр объекта? т.е. если вы забыли вызвать конструктор после объявления объекта.
Derek Litz

1
ах, это хорошее различие. Другими словами, экземпляр - это объект, который был построен (то есть, конструктор был вызван).
TCCV

3

«Класс описывает набор объектов, называемых его экземплярами». - Исследовательская группа Xerox, «Система Smalltalk-80», Byte Magazine Volume 06 Number 08, p39, 1981.


2

Что такое объект?

Объект - это экземпляр класса. Лучше всего понять объект, найдя вокруг себя примеры реального мира. Ваш стол, ваш ноутбук, ваша машина - все это хорошие примеры объектов из реального мира.

Объекты реального мира имеют две общие характеристики: все они имеют состояние и поведение. Люди также являются хорошим примером объекта. У людей есть состояние / атрибуты - имя, рост, вес и поведение - ходьба, бег, разговор, сон, код: P.

Что такое класс?

Класс - это план или шаблон, который описывает детали объекта. Эти детали а именно

имя атрибуты / состояние операций / методов

class Car 
{
    int speed = 0;
    int gear = 1;

    void changeGear(int newGear)
    {
        gear = newGear;
    }

    void speedUp(int increment) 
    {
        speed = speed + increment;
    }

    void applyBrakes(int decrement) 
    {
        speed = speed - decrement;
    }
}

Рассмотрим приведенный выше пример, поля speedи gearбудут представлять состояние объекта и методов changeGear, speedUpа такжеapplyBrakes определить поведение объекта автомобиля с внешним миром.

Рекомендации:


1

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


0

Давайте сравним яблоки с яблоками. Все мы знаем, что такое яблоко. На что это похоже. Какой у него вкус. Это класс. Это определение вещи. Это то, что мы знаем о предмете.

А теперь иди и найди яблоко. Это пример. Мы это видим. Мы можем попробовать это. Мы можем что-то с этим делать. Это то, что у нас есть.

Класс = Что мы о чем-то знаем. Определение.

Объект / Экземпляр = Что-то, что соответствует тому определению, которое у нас есть и с которым мы можем что-то делать.


0

В некоторых случаях термин «объект» может использоваться для описания экземпляра, но в других случаях он используется для описания ссылки на экземпляр. Термин «экземпляр» относится только к фактическому экземпляру.

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


Итак, в этом случае ссылка - это просто заполнитель, содержащий ссылку на экземпляр? Где ссылка может быть чем-то вроде адреса памяти?
TCCV

0

Мне всегда нравилась идея, которая приравнивает определение класса к определению «абстрактного типа данных» . То есть, когда вы определяете класс, вы определяете новый тип «чего-то», его представление типа данных в терминах примитивов и других «чего-то» и его поведение в терминах функций и / или методов. (Извините за общность и формализм)

Всякий раз, когда вы определяете класс, вы открываете новую возможность для определения определенных сущностей с его свойствами и поведением, когда вы создаете экземпляр и / или создаете из него конкретный объект, вы фактически материализуете эту возможность.

Иногда термины «объект» и «экземпляры» взаимозаменяемы. Некоторые пуристы ООП будут утверждать, что все является объектом, я не буду жаловаться, но в реальном мире ООП мы, разработчики, используем две концепции:

  1. Класс: образец абстрактного типа данных, из которого вы можете наследовать другие ADT и создавать объекты.
  2. Объекты: также называемые экземплярами, представляют собой конкретные примеры структур данных и функций, представленных данным абстрактным типом данных.

0

Объектно-ориентированное программирование - системная метафора которая помогает вам организовать знания, необходимые для обработки вашей программы, таким образом, чтобы облегчить вам разработку вашей программы. Когда вы выбираете программирование с использованием ООП, вы берете свои ООП-гуги и решаете, что вы будете видеть проблему реального мира как множество объектов, взаимодействующих между собой, отправляя сообщения. Вместо того, чтобы видеть парня за рулем машины, вы видите парня, отправляющего сообщение машине, указывающее, что он хочет, чтобы машина делала. Автомобиль - это большой объект, и он будет реагировать на это сообщение, отправив сообщение своему двигателю или колесу, чтобы иметь возможность правильно отреагировать на то, что водитель сказал ему сделать в сообщении, и т. Д.

После того, как вы создали системную метафору и видите всю реальность как объекты, отправляющие сообщения, вы решаете поместить все то, что вы видите, что имеет отношение к вашей проблемной области, на ПК. Здесь вы замечаете, что есть много парней, управляющих разными картами, и бессмысленно программировать поведение каждой из них по отдельности, потому что все они ведут себя одинаково ... Итак, вы можете сказать две вещи:

  • Все эти парни ведут себя одинаково, поэтому я создам класс под названием Driver, который будет указывать, кто из всех драйверов в мире ведет себя одинаково, потому что все они ведут себя одинаково. (И вы используете ООП на основе классов)
  • Или вы могли бы сказать Эй! Второй водитель ведет себя так же, как и первый водитель, за исключением того, что ему нравится ехать немного быстрее. И третий водитель ведет себя так же, как первый водитель, за исключением того, что ему нравится зигзагообразно двигаться. (И вы используете ООП на основе прототипов).

Затем вы начинаете вводить в компьютер информацию о том, как ведут себя все драйверы (или как ведет себя первый драйвер, и чем второй и третий отличаются от этого), и через некоторое время у вас есть программа, и вы используете код для создайте три драйвера, которые являются моделью, которую вы используете внутри этого ПК, чтобы ссылаться на драйверы, которые вы видели в реальном мире. Те 3 драйвера, которые вы создали внутри ПК, являются экземплярами либо прототипа (на самом деле первый - прототип, первый может быть самим прототипом в зависимости от того, как вы моделируете вещи), либо созданного вами класса. Разница между экземпляром и объектом заключается в том, что объект - это метафора, которую вы используете в реальном мире. Вы выбираете видеть парня и машину как объекты (было бы неправильно сказать, что вы видите их как экземпляры), взаимодействующие между собой. И затем вы используете это как вдохновение для создания своего кода. Экземпляр существует в вашей программе только после того, как вы создали прототип или класс. «Объекты» существуют вне ПК, потому что это отображение, которое вы используете для объединения реального мира с программой. Он объединяет парня с экземпляром драйвера, который вы создали на ПК. Таким образом, объект и экземпляр чрезвычайно связаны, но они не совсем одно и то же (экземпляр - это «нога» объекта в программе, а другая «нога» находится в реальном мире).


0

Думаю, лучший ответ уже дан.

Классы - это чертежи, а объекты - здания, или примеры этого чертежа тоже помогли мне.

Иногда мне хочется думать, что классы - это шаблоны (как в MS Word), а объекты - это документы, которые используют этот шаблон.


0

Расширение одного из ранее приведенных примеров в этой теме ...

Рассмотрим сценарий - существует требование, чтобы в районе было построено 5 домов для жилых целей. Все 5 домов имеют общую строительную архитектуру. Строительная архитектура - это класс . Дом - это объект . Каждый дом, в котором живут люди, - это экземпляр .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.