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


Ответы:


86

Java (и любой другой язык программирования) моделируется в терминах типов и значений . На теоретическом уровне значение - это представление некоторого количества информации, а тип - это набор значений. Когда мы говорим, что значение X является экземпляром типа Y, мы просто говорим, что X является членом набора значений, который является типом Y.

Вот что на самом деле означает термин «экземпляр»: он описывает отношения, а не вещь.

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

Объект - это экземпляр класса или массив. ( JLS 4.3.1 )

Это теоретический взгляд на типы.

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


3
Я очень ценю ваш ответ, сэр, и я почти получил его, просто еще один вопрос. Мы говорим: «Каждый раз, когда компилятор обращается к конструктору аргумента 0, он создает экземпляр класса». В этом контексте что на самом деле создается экземпляром или объектом? Я предполагаю, что это объект, и мы используем слово «экземпляр» как синоним. Но было бы любезно, если вы лучше это подтвердите.
Пранджут 02

3
@Ryan: В основном да: он создает объект, который является экземпляром рассматриваемого класса. (Но обратите внимание, что в процитированном предложении говорится «экземпляр класса», а не просто «экземпляр» ... поэтому автор на самом деле не использует здесь «экземпляр» в качестве синонима.)
Стивен К.

1
@RuneFS - "моделирование", о котором я говорю, не о представлении. Это теоретически. Да, в некоторых языках есть объекты, которые обозначают типы или даже позволяют перечислить все экземпляры типа. Но эти свойства дополняют общее «моделирование», а не делают его недействительным.
Stephen C

1
@RuneFS - Нет ... Я говорю о "теории типов". Это раздел математики. Он не зависит от технологии, используемой для запуска программ. Ближайшая теория типов к вычислениям - это лямбда-исчисление. (Если вам интересно, попробуйте получить копию "Типов и языков программирования" Бенджамина С. Пирса.)
Стивен Си,

1
Вы делаете ту же ошибку, что и user2390183. Вы обрабатываете переменные как «имена». Они не. Переменные - это «держатели ссылок», которые содержат ссылки на объекты. У объектов нет внутренних имен. Ссылки - это самое близкое к «имени» объекта, за исключением того, что они не имеют постоянного представления. (ГХ может перемещать объект, который изменяет битовый шаблон, используемый для представления ссылки.)
Стивен С.

96

Класс представляет собой план , который можно использовать для создания объектов . Объект - это экземпляр класса - это конкретная «вещь», которую вы создали с помощью определенного класса. Итак, «объект» и «экземпляр» - это одно и то же, но слово «экземпляр» указывает на отношение объекта к его классу.

Это легко понять, если посмотреть на пример. Например, предположим, что у вас есть класс House. Ваш собственный дом - это объект и экземпляр класса House. Дом вашей сестры - это еще один объект (еще один экземпляр класса House).

// Class House describes what a house is
class House {
    // ...
}

// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();

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

Примечание. В Java это точно так же, как и во всех объектно-ориентированных языках программирования.


class House { // blue print for House Objects } class Car { // blue print for Instances of Class Car } House myHouse = House new(); Car myCar = Car new();
Сурадж Джайн,

myHouse и myCar - это объекты, myHouse - это экземпляр House (связывает Object-myHouse с его Class-House) myCar - это экземпляр Car. Это правда, пожалуйста, посмотрите ответ пользователя 2390183, это правильно или нет?
Сурадж Джайн,

29

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

например, если вы скажете

String word = new String();

класс - это класс String, который описывает слово объекта (экземпляра).

Когда класс объявлен, память не выделяется, поэтому класс - это просто шаблон.

Когда объект класса объявляется, выделяется память.


Вы имели в виду, что объекты и экземпляры одинаковы?
Пранджут, 01

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

@Mustafa: Прошу прощения, что противоречу вам, но согласно JLS, массив также является объектом в Java. И вы обнаружите, что JLS вообще не определяет термин «экземпляр». Смотрите мой ответ.
Stephen C

@Ryan: См. Мой ответ о различии между «экземпляром» и «объектом». Ответ и комментарий @ Мустафы (ИМО) вводят в заблуждение.
Стивен С.

@mustafabar - «Когда класс объявлен, память не выделяется, поэтому класс - это просто шаблон». - И это тоже неправда. Память выделяется (как минимум) для представления staticпеременных класса. (И для других вещей, которые связаны с идентичностью типа класса.)
Стивен С.

13

Мне нравится объяснение Джеспера в терминах непрофессионала

Импровизируя примеры из ответа Джеспера,

class House {
// blue print for House Objects
}

class Car {
// blue print for Instances of Class Car 
}

House myHouse = new House();
Car myCar = new Car();

myHouse и myCar - объекты

myHouse - это экземпляр House (связывает Object-myHouse с его Class-House) myCar - это экземпляр Car

короче говоря

«Myhouse является экземпляром из класса House» , который является таким же , как говорят «Myhouse это объект из типа дома»


6

Класс - это тип данных. Этот тип используется для создания объекта.

  • Экземпляр является логическим, но объект является физическим, поэтому он занимает некоторую память.

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

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

  • Экземпляр относится к ссылке на объект.

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

  • Вы не можете передавать экземпляр по слоям, но вы можете передавать объект по слоям

  • Вы не можете сохранить экземпляр, но можете сохранить объект

  • У одного объекта может быть более одного экземпляра.

  • Экземпляр будет иметь как определение класса, так и определение объекта, тогда как, как и в объекте, он будет иметь только определение объекта.

Синтаксис объекта:

 Classname var=new Classname();

Но для создания экземпляра он возвращает только указатель, относящийся к объекту, синтаксис:

 Classname varname;

3

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

An instance- это общий термин для object. К вашему сведению, Objectэто класс.

Например,

Class A{

}

A ref = new A();

Для приведенного выше фрагмента кода ref является ссылкой на объект класса A, созданный в куче.


3

Честно говоря, мне удобнее определения блога Альфреда :

Объект : объекты реального мира имеют две основные характеристики: состояние и поведение. У человека есть состояние (имя, возраст) и поведение (бег, сон). У автомобиля есть состояние (текущая скорость, текущая передача) и поведение (включение тормоза, переключение передачи). Программные объекты концептуально похожи на объекты реального мира: они также состоят из состояния и связанного поведения. Объект сохраняет свое состояние в полях и раскрывает свое поведение с помощью методов.

Класс : это «шаблон» / «план», который используется для создания объектов. По сути, класс будет состоять из поля, статического поля, метода, статического метода и конструктора. Поле используется для хранения состояния класса (например: имя объекта Student). Метод используется для представления поведения класса (например: как объект Студент встанет). Конструктор используется для создания нового экземпляра класса.

Экземпляр : экземпляр - это уникальная копия класса, представляющего объект. Когда создается новый экземпляр класса, JVM выделяет место памяти для этого экземпляра класса.

Рассмотрим следующий пример:

public class Person {
    private int id;
    private String name;
    private int age;

    public Person (int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id != other.id)
            return false;
        return true;
    }

    public static void main(String[] args) {
        //case 1
        Person p1 = new Person(1, "Carlos", 20);
        Person p2 = new Person(1, "Carlos", 20);

        //case 2
        Person p3 = new Person(2, "John", 15);
        Person p4 = new Person(3, "Mary", 17);
    }
}

В случае 1 есть два экземпляра класса Person, но оба экземпляра представляют один и тот же объект.

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

Итак, класс, объект и экземпляр - разные вещи. Объект и экземпляр не являются синонимами, как предлагается в ответе, выбранном как правильный.


2

Если у вас есть программа, которая моделирует автомобили, у вас есть класс для представления автомобилей, поэтому в коде вы можете сказать:

Car someCar = new Car();

someCar теперь является экземпляром класса Car. Если программа используется в ремонтной мастерской, а someCar представляет вашу машину в своей системе, то объектом является ваша машина.

Итак, Car - это класс, который может представлять любую машину реального мира, someCar - это экземпляр класса Car, а someCare - один объект реальной жизни (ваш автомобиль).

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


1
Строго говоря someCar, это отсылка к экземпляру Car. Сам экземпляр не имеет имени.
Joachim Sauer

2

Любой вид данных, которые хранит и обрабатывает ваш компьютер, в основном представляет собой ряд битов. То, как эти биты интерпретируются, осуществляется через типы данных. Типы данных могут быть примитивными или сложными. К примитивным типам данных относятся, например, int или double. У них есть определенная длина и особый способ интерпретации. В случае целого числа обычно первый бит используется для знака, остальные - для значения.

Сложные типы данных могут представлять собой комбинации примитивных и других сложных типов данных и в Java называются «классом».

Вы можете определить сложный тип данных PeopleName, состоящий из двух строк, называемых именем и фамилией. Каждая строка в Java - это еще один сложный тип данных. Взамен строки (вероятно) реализованы с использованием примитивного типа данных char, для которого Java знает, сколько бит они берут для хранения и как их интерпретировать.

Когда вы создаете экземпляр типа данных, вы получаете объект, и ваши компьютеры резервируют для него некоторую память и запоминают его местоположение и имя этого экземпляра. Экземпляр PeopleName в памяти займет место двух переменных String плюс немного больше для бухгалтерского учета. В Java целое число занимает 32 бита.

Сложные типы данных могут иметь назначенные им методы. Методы могут выполнять действия со своими аргументами или с экземпляром типа данных, из которого вы вызываете этот метод. Если у вас есть два экземпляра PeopleName с именами p1 и p2 и вы вызываете метод p1.getFirstName (), он обычно возвращает имя первого человека, но не имя второго человека.


2

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

Вот пример класса, представляющего автомобиль:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Вы можете создавать экземпляры этого объекта Car , как это:

Car audi = new Car();
Car toyota = new Car();

Я взял пример из этого урока


2

Класс : Структура

Объект : физическое воплощение

Экземпляр : каждый объект, созданный из класса

Ссылка : Адрес объекта


1

Класс

  • Он имеет логическое существование, т. Е. При его создании не выделяется место в памяти.

  • Это набор предметов.

  • Класс можно рассматривать как образец для создания объектов.

    • Он создается с использованием ключевого слова class

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


Объект

  • Он имеет физическое существование, т.е. пространство памяти выделяется при его создании.

  • Это экземпляр класса.

  • Объект - это уникальная сущность, которая содержит элементы данных и функции-члены вместе на языке ООП.

    • Он создается с использованием нового ключевого слова

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


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

@StephenC, в чем может быть еще разница?

Смотрите мой ответ. На этот вопрос нельзя правильно ответить, просто говоря о различиях.
Stephen C

0

Класс - это план, необходимый для создания объекта (= экземпляра).

Разница между объектом и экземпляром в том, что объект - это вещь, а экземпляр - это отношение.

Другими словами, instance описывает отношение объекта к классу, из которого этот объект был создан.


-1

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


-1

Хотя приведенные выше ответы верны, другой способ размышления о классах и объектах - использовать примеры из реального мира: класс с именем Animal может содержать такие объекты, как Cat, Dog или Fish. Объект с названием «Библия» относится к классу «Книга» и т. Д. Классы являются общими, объекты - конкретными. Этот мысленный пример помог мне, когда я изучал Java.


Да ... но аналогии тоже могут сбивать с толку. Если Animalэто класс и Catэкземпляр, то что это за моя домашняя кошка "Пушистый"?
Stephen C

-2

Класс - это шаблон или тип. Объект - это экземпляр класса.

Например:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet - это класс, а newTweet - это объект класса.


Это просто слова. На самом деле вы не объясняете, что означают эти слова. (И на самом деле классы Java НЕ ведут себя как шаблоны ни в реальной жизни, ни так, как в таких языках, как Javascript, Python, Ruby и т. Д.)
Стивен К.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.