Різниця між класами, об’єктами та екземплярами


Відповіді:


86

Java (та будь-яка інша мова програмування) моделюється з точки зору типів та значень . На теоретичному рівні значення є поданням деякого кванту інформації, а тип - набором значень. Коли ми говоримо, що значення X є екземпляром типу Y, ми просто говоримо, що X є членом набору значень, що є типом Y.

Отже, це те, що насправді означає термін "екземпляр": він описує стосунки, а не річ.

Система типів мови програмування Java підтримує два типи типів, примітивні типи та посилальні типи . Посилальні типи далі поділяються на класи та типи масивів . Об'єкт Java - це екземпляр посилального типу.

Об'єкт - це екземпляр класу або масив. ( JLS 4.3.1 )

Це теоретичний погляд на тип.

На практиці більшість розробників Java розглядають слова "екземпляр" та "об'єкт" як синоніми. (І це включає мене, тоді я намагаюся щось швидко пояснити.) І більшість розробників використовують слово "значення", а не "екземпляр", щоб посилатися на екземпляр примітивного типу.


3
Я дуже ціную вашу відповідь, сер, і я майже отримав її, ще одне запитання. Ми говоримо: "Щоразу, коли компілятор потрапляє в конструктор аргументів 0, він створює екземпляр класу.". У цьому контексті, що насправді створюється екземпляром чи об'єктом? Я вгадую об’єкт, і ми використовуємо слово "екземпляр" як синонім. Але це було б добре, якщо б ви краще підтвердили його.
Pranjut

3
@Ryan: В основному так: це створення Об'єкта, який є екземпляром відповідного Класу. (Але зауважте, що в цитованому реченні сказано "екземпляр класу", а не просто "екземпляр" ... тому автор насправді не використовує тут "екземпляр" як синонім.)
Стівен С,

1
@RuneFS - "моделювання", про яке я кажу, не стосується репрезентації. Це теоретично. Так, в деяких мовах є об’єкти, які позначають типи або навіть які дозволяють перерахувати всі екземпляри типу. Але ці властивості збільшують загальне "моделювання", а не анулюють його.
Stephen C

1
@RuneFS - Ні ... Я говорю про "теорію типу". Це розділ математики. Це не залежить від технології, яка використовується для запуску програм. Найближча до обчислень теорія типу - це лямбда-числення. (Якщо вам цікаво, спробуйте дістати копію "Типів та мов програмування" Бенджаміна С. Пірса.)
Стівен С

1
Ви робите ту ж помилку, що і user2390183. Ви обробляєте змінні як "імена". Вони не. Змінні - це "власники посилань", які містять посилання на об'єкти. Об'єкти не мають власних назв. Посилання - це найближче до "імені" об'єкта, за винятком того, що вони не мають постійного подання. (GC може переміщати об'єкт, який змінює бітовий шаблон, що використовується для представлення посилання.)
Стівен С

96

Клас являє собою план , який можна використовувати для створення об'єктів . Об'єкт є екземпляром класу - це конкретна "річ", яку ви створили за допомогою певного класу. Отже, 'object' і 'instance' - це одне і те ж, але слово 'instance' вказує на зв'язок об'єкта з його класом.

Це легко зрозуміти, якщо поглянути на приклад. Наприклад, припустимо, у вас є клас 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();
Suraj Jain

myHouse та myCar - це об’єкти, які myHouse є екземпляром House (пов’язує Object-myHouse зі своїм Class-House) myCar є екземпляром Car. Чи це правда, будь ласка, перегляньте наведену вище відповідь користувача2390183, це правильно чи ні?
Suraj Jain

29

Клас в основному є визначенням і містить код об'єкта. Об'єкт - це екземпляр класу

наприклад, якщо ви скажете

String word = new String();

клас - це клас String, який описує об'єкт (екземпляр) слова.

Коли оголошено клас, пам'ять не виділяється, тому клас є лише шаблоном.

Коли оголошено об'єкт класу, виділяється пам'ять.


Ви мали на увазі, що об’єкти та екземпляри однакові?
Pranjut

Дякую Девіду за посилання. З тем, які я отримав, кожен реальний світ, що має стан і поведінку, можна назвати "об'єктом". І для класифікації цих об’єктів ми використовуємо клас (A клас - це план, з якого створюються окремі об’єкти). І це говорить, що об’єкти класу є екземплярами. Тепер, будь ласка, скажіть мені, у чому різниця між об’єктом та екземпляром? Чи означає це, що об’єкт насправді не існує в контексті програмування, а екземпляр представляє об’єкт у ньому?
Pranjut

@Mustafa: Мені шкода, що я вам суперечу, але згідно з JLS, масив також є об'єктом у Java. І ви виявите, що JLS взагалі не визначає термін "екземпляр". Дивіться мою відповідь.
Стівен С

@Ryan: Дивіться мою відповідь щодо різниці між "екземпляром" та "об'єктом". Відповідь і коментар Мустафи є (IMO) оманливими.
Stephen C

@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 зі своїм Класним будинком) myCar - екземпляр Car

коротко

«Myhouse є екземпляром з класу House» , який є таким же , як кажуть «Myhouse це об'єкт з типу будинку»


6

Клас - тип даних, Ви використовуєте цей тип для створення об’єкта.

  • Екземпляр є логічним, а об’єкт - фізичним, що займає деяку пам’ять.

  • Ми можемо створити екземпляр для абстрактного класу, а також для інтерфейсу, але ми не можемо створити
    об’єкт для них.

  • Об'єкт є екземпляром класу, а екземпляр означає представника класу, тобто об'єкта.

  • Екземпляр відноситься до посилання на об'єкт.

  • Об'єкт фактично вказує на адресу пам'яті цього екземпляра.

  • Ви не можете передати екземпляр по шарах, але можете передати об’єкт по шарах

  • Ви не можете зберегти екземпляр, але можете зберегти об’єкт

  • В одному об’єкті може бути більше одного екземпляра.

  • Екземпляр матиме як визначення класу, так і визначення об’єкта, де, як і в об’єкті, він матиме лише визначення об’єкта.

Синтаксис об’єкта:

 Classname var=new Classname();

Але, наприклад, створення, воно повертає лише вказівник, що посилається на об'єкт, синтаксис:

 Classname varname;

3

У Java об'єкти породжуються в купі пам'яті. Вони вимагають вказівки та використання в нашому додатку. Посилання містить місце пам’яті об’єкта, за допомогою якого ми можемо використовувати об’єкти у нашому додатку. Коротко посиланням є не що інше, як ім'я змінної, яка зберігає адресу об'єкта, інстанційовану в розташуванні пам'яті.

An instance- загальний термін для object. FYI, Objectце клас.

Наприклад,

Class A{

}

A ref = new A();

Для наведеного вище фрагмента коду ref - це посилання на об’єкт класу A, згенерований у купі.


3

Чесно кажучи, мені зручніше з визначеннями блогу Альфреда :

Об’єкт : об’єкти реального світу мають 2 основні характеристики, стан та поведінку. Людина має стан (ім’я, вік) та поведінку (біг, сон). Автомобіль має стан (поточну швидкість, поточну передачу) та поведінку (натискання гальма, перемикання передач). Об'єкти програмного забезпечення концептуально подібні до об'єктів реального світу: вони теж складаються із стану та пов'язаної з ними поведінки. Об'єкт зберігає свій стан у полях і виставляє свою поведінку за допомогою методів.

Клас : це “шаблон” / “проект”, який використовується для створення об’єктів. По суті, клас волі складається з поля, статичного поля, методу, статичного методу та конструктора. Поле використовується для збереження стану класу (наприклад: ім'я об'єкта 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, це посилання на екземпляр автомобіля. Сам екземпляр не має імені.
Йоахім Зауер,

2

Будь-який тип даних, який ваш комп'ютер зберігає та обробляє, у своєму основному поданні являє собою ряд бітів. Спосіб інтерпретації цих бітів здійснюється за допомогою типів даних. Типи даних можуть бути примітивними або складними. Примітивні типи даних - наприклад, int або double. Вони мають певну довжину та конкретний спосіб інтерпретації. У випадку цілого числа, як правило, перший біт використовується для знака, інші - для значення.

Складні типи даних можуть бути комбінаціями примітивних та інших складних типів даних і в Java називаються "Класом".

Ви можете визначити складний тип даних PeopleName, що складається з двох рядків, що називаються ім’ям та прізвищем. Кожен рядок у Java - це інший складний тип даних. Рядки у відповідь (можливо) реалізовані з використанням примітивного типу даних char, для якого Java знає, скільки бітів вони беруть для зберігання та як їх інтерпретувати.

Коли ви створюєте екземпляр типу даних, ви отримуєте об'єкт, і ваші комп'ютери резервують для нього трохи пам'яті і запам'ятовують його розташування та ім'я цього екземпляра. Екземпляр PeopleName в пам'яті займе простір двох змінних String плюс трохи більше для ведення бухгалтерії. Ціле число займає 32 біти в Java.

Складні типи даних можуть мати призначені їм методи. Методи можуть виконувати дії над своїми аргументами або над екземпляром типу даних, з якого ви викликаєте цей метод. Якщо у вас є два екземпляри 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, яка тоді може бути інша різниця?

Дивіться мою відповідь. Відповісти на це питання неможливо, просто говорячи про відмінності.
Стівен С

0

Клас - це проект, необхідний для створення об'єкта (= екземпляра).

Різниця між об’єктом та екземпляром полягає в тому, що об’єкт - це річ, а екземпляр - це відношення.

Іншими словами, екземпляр описує відношення об’єкта до класу, з якого створений об’єкт.


-1

Визначення "Об'єкт є екземпляром класу" є концептуально неправильним, але правильним відповідно до реалізації. Насправді об'єктно-орієнтовані особливості взяті з реального життя, щоб зосередити розум програміста від більшого до меншого. У реальному житті класи призначені для управління об'єктом. Наприклад, ми, люди, маємо касту, релігію, національність та багато іншого. Ці склади, релігія, національність є класами і не існують без людей. Але в реалізації не існує об'єктів без класів. Об'єкт - Об'єкт - це дискретна сутність, що має якийсь чітко визначений атрибут. Тут дискретне означає щось, що робить його унікальним серед інших. Добре визначений атрибут має сенс у певному контексті. Клас - Класифікація об’єктів, що мають спільну поведінку, або об’єктів загального типу.


-1

Незважаючи на те, що наведені вище відповіді є вірними, іншим способом мислення щодо класів та об'єктів є використання прикладів із реального світу: Клас на ім'я Тварина може містити такі предмети, як Кіт, Собака чи Риба. Об'єкт із назвою Біблія буде класом "Книга" тощо. Класи загальні, об'єкти специфічні. Цей приклад думки допоміг мені, коли я вивчав Java.


Так ... але аналогії також можуть заплутати. Якщо Animalце клас і Catє екземпляром, який мій домашній котик-кицька «Пухнастий»?
Стівен С,

-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.