Разница между объектом и экземпляром - PullRequest
74 голосов
/ 24 июля 2010

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

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

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

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

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

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

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

Ответы [ 18 ]

121 голосов
/ 24 июля 2010

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

37 голосов
/ 11 февраля 2013

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

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

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

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

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

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

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

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

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

Пусть класс А Из класса 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();

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

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

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

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

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

24 голосов
/ 13 марта 2017

Слово Класс происходит от Классификация ( A Категория , в которую что-то вставлено ), Теперь мы все слышали, что Класс похож на Светокопию, но что это значит?Это означает, что Class содержит описание конкретной категории, ( Я хотел бы показать разницу между Class, Object и Instance на примере использования Java, и я бы попросил читателей визуализировать его следующим образом:история при ее чтении, и если вы не знакомы с java, не имеет значения ) Итак, давайте начнем с make 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, поэтому у доктора будет имя, возраст, вес, рост, которые будут унаследованы от 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 И Экземпляр A class Doctor
  2. firstDoctor - это Не объект class HumanBeing Но Экземпляр class HumanBeing

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

Вывод:

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

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

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

Спасибо

13 голосов
/ 24 июля 2010

enter image description here

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

  • std (экземпляр) -> Объект ученика (справа)
  • std1 (экземпляр) -> Объект ученика (слева)
  • std2 (экземпляр) -> Объект ученика (слева)
  • std3 (экземпляр) -> нет объекта (ноль)
5 голосов
/ 24 июля 2010

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

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

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

Надеюсь, что это очищаетвсе наверх.

5 голосов
/ 24 июля 2010

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

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

2 голосов
/ 04 сентября 2015

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

2 голосов
/ 12 апреля 2014

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

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

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

Ссылки:

1 голос
/ 03 сентября 2015

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

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

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

1 голос
/ 24 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...