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

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

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

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

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

Могут ли эксперты здесь в SO помочь новичкам иметь этот "ага" момент для продвижения вперед в мире ООП?

Еще раз спасибо.

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

Ответ 1

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

Ответ 2

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

Основная концепция OOP заключается в следующем: Класс → Объект → Экземпляр.

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

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

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

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

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

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

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

Пусть класс А Из класса A укажите Object1, Object2 и Object3.

//Object1 имеет то же точное значение, что и object2 и object3, но находится в разных местах в памяти.

из Object1 → let obj1_Instance1, obj1_Instace2, obj1_Instance3

//все эти экземпляры также эквивалентны по значению и в разных местах в памяти. Их значения = Object1.MemoryAddress.

и др.

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

//предполагаем, что класс Person существует Человек john = new Person();

На самом деле, этот код легче анализировать, если вы разбиваете его на две части:

Person john;
john = new Person();

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

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

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

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

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

Ответ 3

Слово Класс относится к Классификации (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);    
  }
}

Теперь в приведенном выше примере мы создали нашего первого человека с именем age height weight, так что же происходит в вышеупомянутом коде?, Мы Создаем нашу категорию HumanBeing i.e Создан объект нашего класса

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

Случай 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*/
   }
}  

Здесь мы использовали концепцию Inheritance, которая привносит некоторую возможность повторного использования в код, каждый Доктор всегда будет первым человеком HumanBeing, поэтому у Доктора будут имя, возраст, вес, высота, которые будут наследуйте от 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: объект и экземпляр не являются синонимами
В приведенном выше коде мы можем представить себе, что мы Создаем нашу категорию Доктора и воплощаем его в жизнь, т.е. Мы просто создаем объект категории <Доктоp > . Как мы уже знаем Объект создан в памяти кучи, а firstDoctor содержит ссылку на этот объект в куче;

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

  • firstDoctor Объект class Doctor И Экземпляр A class Doctor
  • firstDoctor Не объект class HumanBeingНо Экземпляр class HumanBeing

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

Вывод:

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

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

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

Спасибо

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Объект реального мира разделяет две характеристики, все они имеют состояние и поведение. Люди также являются хорошим примером объекта, у нас есть состояние/атрибуты - имя, высота, вес и поведение - ходить, бегать, разговаривать, спать, код: 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 определяют поведение объекта Car с внешним миром.

Ссылки:

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

Позволяет сравнить яблоки с яблоками. Мы все знаем, что такое яблоко. На что это похоже. На что он похож. Это класс. Это определение вещи. Это то, что мы знаем о чем-то.

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

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

Object/Instance = Что-то, что соответствует этому определению, которое мы имеем и можем делать с помощью.

Ответ 12

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

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

Ответ 13

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

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

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

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

Ответ 14

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

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

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

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

Ответ 15

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

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

Ответ 16

Объект: когда мы создаем объект, какая-то память занимает этот объект Пример: Test t = new Test();//здесь t является объектом класса Test

Экземпляр: когда мы объявляем экземпляр отдельной памяти, этот объект не занят Пример: Test t;//здесь t - это экземпляр класса Test

Ответ 17

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

Ответ 18

Для меня существует небольшая разница между объектом и экземпляром

Вроде:

class1 obj;

здесь, obj - это экземпляр класса 1, который занимает стек памяти

class1 obj = new class1();

в этом случае obj является объектом класса 1 и занимает память кучи