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

Что такое класс, объект и экземпляр в Java?


person Pranjut    schedule 01.08.2009    source источник
comment
Проверьте следующую ссылку   -  person Pushkarraj Pujari    schedule 19.09.2017


Ответы (16)


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

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

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

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

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

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

person Stephen C    schedule 01.08.2009
comment
Я очень ценю ваш ответ, сэр, и я почти получил его, просто еще один вопрос. Мы говорим: всякий раз, когда компилятор обращается к конструктору аргумента 0, он создает экземпляр класса. В этом контексте, что на самом деле создается экземпляром или объектом? Я предполагаю, что это объект, и мы используем слово instance как синоним, но было бы любезно, если вы лучше это подтвердите. - person Pranjut; 02.08.2009
comment
@Ryan: В основном да: он создает объект, который является экземпляром рассматриваемого класса. (Но обратите внимание, что в цитируемом предложении говорится об экземпляре класса, а не просто об экземпляре ... поэтому автор на самом деле не использует здесь экземпляр в качестве синонима.) - person Stephen C; 02.08.2009
comment
в контексте Java (и некоторых других языков) ваше теоретическое объяснение является правильным. - однако есть формулировки, которые противоречили бы вашему ведущему утверждению. Simula происхождение OO было бы одним, но есть и другие. Существует несколько языков, в которых типы представляют собой объекты и, следовательно, являются значениями. Например, тип объекта в JS - это значение - person Rune FS; 06.04.2015
comment
@RuneFS - моделирование, о котором я говорю, не о репрезентации. Это теоретически. Да, в некоторых языках есть объекты, обозначающие типы или даже позволяющие перечислить все экземпляры типа. Но эти свойства дополняют общее моделирование, а не делают его недействительным. - person Stephen C; 07.04.2015
comment
@StephenC ну, в этом случае это должны быть данные и операции, поскольку современные вычисления построены на архитектуре фон Неймана, которая не имеет типов - person Rune FS; 07.04.2015
comment
@RuneFS - Нет ... Я говорю о теории типов. Это раздел математики. Он не зависит от технологии, используемой для запуска программ. Ближайшая теория типов к вычислениям - это лямбда-исчисление. (Если вам интересно, попробуйте получить копию Типов и языков программирования Бенджамина С. Пирса.) - person Stephen C; 07.04.2015
comment
Я никогда не встречал значений только в терминах и типах теории типов, но я встречал значения и типы, когда говорил о разных парадигмах и разных системах типов, что меня смущало. - person Rune FS; 07.04.2015
comment
Сэр, вы можете сказать мне, правильный ли ответ пользователя 2390183 ниже, мне понравился его ответ, и я просто хочу подтвердить, что я прав или нет ›? - person Suraj Jain; 25.12.2016
comment
@SurajJain - Это вроде как правильно, хотя есть пара вещей, которые могут быть прочитаны неправильно. Например, утверждение, что myHouse является экземпляром, технически неверно. Фактически, myHouse - это переменная, которая ссылается на экземпляр House. - person Stephen C; 25.12.2016
comment
Так что поправьте меня, если я ошибаюсь, я понимаю, что класс - это определение или шаблон, тип проекта, например, если я создам класс Human, я бы в нем имел его элементы как Height, weight и так далее, Теперь, если Я делаю объект с именем suraj ссылкой на экземпляр класса person. Точно так же у меня может быть класс house, а myhouse относится к домашнему экземпляру. Итак, myhouse и suraj - объекты, а дом и человек - классы. Но myhouse относится к экземпляру «дом», а suraj относится к экземпляру house. - person Suraj Jain; 25.12.2016
comment
Оба являются объектами, разница только в отношении к классу, то есть экземпляру. - person Suraj Jain; 25.12.2016
comment
Вы делаете ту же ошибку, что и user2390183. Вы обрабатываете переменные как имена. Они не. Переменные - это держатели ссылок, которые содержат ссылки на объекты. У объектов нет собственных имен. Ссылки - это самое близкое к имени объекта, за исключением того, что они не имеют постоянного представления. (GC может перемещать объект, который изменяет битовый шаблон, используемый для представления ссылки.) - person Stephen C; 26.12.2016
comment
Я не думаю, что имеет смысл говорить, что экземпляр - это не вещь, только потому, что это экземпляр of чего-то. Очевидно instanceof - это отношение между двумя вещами, но не имеет смысла говорить, что X является экземпляром Y, если экземпляр не является вещью, которой может быть X. Подумайте: дом - это вещь, даже если это дом из кирпичей или домик из карт. - person kaya3; 02.03.2020
comment
Ваше мнение учтено :-) Смело голосуйте за чужой ответ .... или напишите свой. Но заметьте, что я не основываю свои аргументы на аналогии с другими английскими словами. Я основываю его на концепциях теории типов. Правда, довольно коряво. - person Stephen C; 02.03.2020

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

Это легко понять, если вы посмотрите на пример. Например, предположим, что у вас есть класс 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 это точно так же, как и во всех объектно-ориентированных языках программирования.

person Jesper    schedule 28.09.2009
comment
myHouse и myCar - это объекты. myHouse - это экземпляр House (связывает Object-myHouse с его Class-House). myCar - это экземпляр Car. Это правда, пожалуйста, посмотрите ответ пользователя 2390183 выше, правильно это или нет? - person Suraj Jain; 25.12.2016

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

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

String word = new String();

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

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

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

person mustafabar    schedule 01.08.2009
comment
Вы имели в виду, что объекты и экземпляры одинаковы? - person Pranjut; 01.08.2009
comment
Спасибо, Дэвид за ссылку. Из тем, которые я получил, это Любые вещи реального мира, которые имеют состояние и поведение, могут быть названы объектами. И для классификации этих объектов мы используем класс (класс - это план, из которого создаются отдельные объекты). В нем говорится, что объекты класса являются экземплярами. Теперь, пожалуйста, скажите мне, в чем разница между объектом и экземпляром? Означает ли это, что объект на самом деле не существует в контексте программирования, а экземпляр представляет в нем объект? - person Pranjut; 01.08.2009
comment
@Mustafa: Простите, что противоречу вам, но согласно JLS, массив также является объектом в Java. И вы обнаружите, что JLS вообще не определяет термин «экземпляр». Смотрите мой ответ. - person Stephen C; 01.08.2009
comment
@Ryan: См. Мой ответ о различии между экземпляром и объектом. Ответ и комментарий @ Мустафы (ИМО) вводят в заблуждение. - person Stephen C; 02.08.2009
comment
@mustafabar - Когда класс объявлен, память не выделяется, поэтому класс - это просто шаблон. - И это тоже неверно. Память выделяется (как минимум) для static переменных класса. (И для других вещей, которые связаны с идентичностью типа класса.) - person Stephen C; 25.12.2016

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

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

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 - это объект типа House. "

person user2390183    schedule 20.10.2013

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

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

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

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

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

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

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

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

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

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

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

 Classname var=new Classname();

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

 Classname varname;
person SwatiKothari    schedule 12.04.2013

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

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

Например,

Class A{

}

A ref = new A();

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

person Arun    schedule 09.07.2013

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

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

Класс: это «шаблон» / «план», который используется для создания объектов. По сути, класс будет состоять из поля, статического поля, метода, статического метода и конструктора. Поле используется для хранения состояния класса (например: имя объекта Student). Метод используется для представления поведения класса (например, как объект 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, но каждый экземпляр представляет отдельный объект.

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

person Carlos Casallas    schedule 31.01.2018

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

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

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

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

person Abishek M    schedule 13.06.2019
comment
Объекты в реальном мире являются физическими. Объекты в компьютерной программе не являются физическими. (Их нельзя трогать. Они не подчиняются законам физики. И так далее. И даже битовые шаблоны в памяти являются представлениями объектов ... а не настоящими объектами Java.) - person Stephen C; 08.05.2021

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

Car someCar = new Car();

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

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

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

person Rune FS    schedule 01.08.2009
comment
Строго говоря, someCar - это ссылка на экземпляр Car. Сам экземпляр не имеет имени. - person Joachim Sauer; 28.09.2009

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

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

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

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

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

person Kage    schedule 28.09.2009

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

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

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Вы можете создать экземпляры объекта "Автомобиль" следующим образом:

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

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

person filip_j    schedule 15.11.2014

Класс

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

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

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

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

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


Объект

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

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

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

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

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

person Community    schedule 20.05.2016
comment
Пространство может быть выделено при создании класса. Пространство требуется для любых статических переменных, определенных классом. (И логическое против физического растягивает его, поскольку представление объекта - это только битовые шаблоны, помогающие в некотором устройстве памяти.) - person Stephen C; 25.12.2016
comment
@StephenC, в чем может быть еще разница? - person ; 25.12.2016
comment
Смотрите мой ответ. На этот вопрос нельзя правильно ответить, просто говоря о различиях. - person Stephen C; 25.12.2016

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

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

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

person Yoji Yamamoto    schedule 28.03.2019

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

person Gaurav Kathuria    schedule 10.01.2016

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

person kurdtpage    schedule 02.03.2016
comment
Да ... но аналогии тоже могут сбивать с толку. Если Animal является классом, а Cat - экземпляром, какой у меня пушистый кот, киска? - person Stephen C; 25.12.2016
comment
Фактически, в реальном мире (и в теории типов) Animal обозначает набор всех животных, а Cat обозначает набор всех кошек. Cat является подмножеством Animal, а не экземпляром Animal. - person Stephen C; 24.12.2020

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

Например:

public class Tweet {

}

Tweet newTweet = new Tweet();

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

person Gagan    schedule 04.09.2016
comment
Это просто слова. На самом деле вы не объясняете, что означают эти слова. (И на самом деле классы Java НЕ ведут себя как шаблоны ни в реальной жизни, ни так, как в таких языках, как Javascript, Python, Ruby и т. Д.) - person Stephen C; 25.09.2016