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


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

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

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

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

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

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

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

18 68
oop

18 ответов:

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

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

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

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

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

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

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

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

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

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

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

   /*We still need to add methods*/

}

теперь каждая категория имеет поведение, например категория собака имеет поведение коры,принести,катать и т. д... , Аналогично нашей категории человека также может иметь определенное поведение,например, когда мы просим наших человека как вас зовут / возраст/вес / рост? Он должен дать нам свое имя / возраст / вес / рост, поэтому в 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;
    }
}

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

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

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

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

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

давайте продолжим нашу историю, мы создали нашего первочеловека, теперь мы можем спросить его имя, возраст, рост, вес, вот как мы это делаем в 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*/
   }
}  

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

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

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

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

вывод:

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

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

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

Спасибо

enter image description here

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

  • std (instance) - > Student Object (right)
  • std1 (экземпляр) - > объект Student (слева)
  • std2 (экземпляр) - > объект студента (слева)
  • std3 (экземпляр) - > нет объекта (null)

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

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

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

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

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

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

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

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

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

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

"класс описывает набор объектов, называемых его экземплярами.- Xerox learning Research Group, "система Smalltalk-80", журнал Byte том 06 номер 08, p39, 1981.

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

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

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

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

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

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

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

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

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

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

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

Как :

class1 obj;

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

class1 obj=new class1 ();

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