Що таке клас, об'єкт та екземпляр у Java?
Відповіді:
Java (та будь-яка інша мова програмування) моделюється з точки зору типів та значень . На теоретичному рівні значення є поданням деякого кванту інформації, а тип - набором значень. Коли ми говоримо, що значення X є екземпляром типу Y, ми просто говоримо, що X є членом набору значень, що є типом Y.
Отже, це те, що насправді означає термін "екземпляр": він описує стосунки, а не річ.
Система типів мови програмування Java підтримує два типи типів, примітивні типи та посилальні типи . Посилальні типи далі поділяються на класи та типи масивів . Об'єкт Java - це екземпляр посилального типу.
Об'єкт - це екземпляр класу або масив. ( JLS 4.3.1 )
Це теоретичний погляд на тип.
На практиці більшість розробників Java розглядають слова "екземпляр" та "об'єкт" як синоніми. (І це включає мене, тоді я намагаюся щось швидко пояснити.) І більшість розробників використовують слово "значення", а не "екземпляр", щоб посилатися на екземпляр примітивного типу.
user2390183
. Ви обробляєте змінні як "імена". Вони не. Змінні - це "власники посилань", які містять посилання на об'єкти. Об'єкти не мають власних назв. Посилання - це найближче до "імені" об'єкта, за винятком того, що вони не мають постійного подання. (GC може переміщати об'єкт, який змінює бітовий шаблон, що використовується для представлення посилання.)
Клас являє собою план , який можна використовувати для створення об'єктів . Об'єкт є екземпляром класу - це конкретна "річ", яку ви створили за допомогою певного класу. Отже, '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();
Клас в основному є визначенням і містить код об'єкта. Об'єкт - це екземпляр класу
наприклад, якщо ви скажете
String word = new String();
клас - це клас String, який описує об'єкт (екземпляр) слова.
Коли оголошено клас, пам'ять не виділяється, тому клас є лише шаблоном.
Коли оголошено об'єкт класу, виділяється пам'ять.
static
змінних класу. (І щодо інших речей, які також пов’язані з типовою ідентичністю класу.)
Мені подобається пояснення Джеспера неспеціалістами
Імпровізуючи приклади з відповіді Джеспера,
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 це об'єкт з типу будинку»
Клас - тип даних, Ви використовуєте цей тип для створення об’єкта.
Екземпляр є логічним, а об’єкт - фізичним, що займає деяку пам’ять.
Ми можемо створити екземпляр для абстрактного класу, а також для інтерфейсу, але ми не можемо створити
об’єкт для них.
Об'єкт є екземпляром класу, а екземпляр означає представника класу, тобто об'єкта.
Екземпляр відноситься до посилання на об'єкт.
Об'єкт фактично вказує на адресу пам'яті цього екземпляра.
Ви не можете передати екземпляр по шарах, але можете передати об’єкт по шарах
Ви не можете зберегти екземпляр, але можете зберегти об’єкт
В одному об’єкті може бути більше одного екземпляра.
Екземпляр матиме як визначення класу, так і визначення об’єкта, де, як і в об’єкті, він матиме лише визначення об’єкта.
Синтаксис об’єкта:
Classname var=new Classname();
Але, наприклад, створення, воно повертає лише вказівник, що посилається на об'єкт, синтаксис:
Classname varname;
У Java об'єкти породжуються в купі пам'яті. Вони вимагають вказівки та використання в нашому додатку. Посилання містить місце пам’яті об’єкта, за допомогою якого ми можемо використовувати об’єкти у нашому додатку. Коротко посиланням є не що інше, як ім'я змінної, яка зберігає адресу об'єкта, інстанційовану в розташуванні пам'яті.
An instance
- загальний термін для object
. FYI, Object
це клас.
Наприклад,
Class A{
}
A ref = new A();
Для наведеного вище фрагмента коду ref - це посилання на об’єкт класу A, згенерований у купі.
Чесно кажучи, мені зручніше з визначеннями блогу Альфреда :
Об’єкт : об’єкти реального світу мають 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, але кожен екземпляр являє собою інший об’єкт.
Отже, клас, об’єкт та екземпляр - це різні речі. Об'єкт та екземпляр не є синонімами, як пропонується у відповіді, вибраній як правильна відповідь.
Якщо у вас є програма, яка моделює автомобілі, у вас є клас для представлення автомобілів, тому в коді ви можете сказати:
Car someCar = new Car();
someCar тепер є екземпляром класу Car. Якщо програма використовується в ремонтному майстерні, і someCar представляє ваш автомобіль в їх системі, тоді ваш автомобіль є об’єктом.
Отже, Car - це клас, який може представляти будь-який автомобіль у реальному світі. SomeCar є екземпляром класу Car, а someCare - один об’єкт реального життя (ваш автомобіль)
однак екземпляр та об'єкт дуже часто використовуються як взаємозамінні, коли йдеться про обговорення кодування
someCar
, це посилання на екземпляр автомобіля. Сам екземпляр не має імені.
Будь-який тип даних, який ваш комп'ютер зберігає та обробляє, у своєму основному поданні являє собою ряд бітів. Спосіб інтерпретації цих бітів здійснюється за допомогою типів даних. Типи даних можуть бути примітивними або складними. Примітивні типи даних - наприклад, int або double. Вони мають певну довжину та конкретний спосіб інтерпретації. У випадку цілого числа, як правило, перший біт використовується для знака, інші - для значення.
Складні типи даних можуть бути комбінаціями примітивних та інших складних типів даних і в Java називаються "Класом".
Ви можете визначити складний тип даних PeopleName, що складається з двох рядків, що називаються ім’ям та прізвищем. Кожен рядок у Java - це інший складний тип даних. Рядки у відповідь (можливо) реалізовані з використанням примітивного типу даних char, для якого Java знає, скільки бітів вони беруть для зберігання та як їх інтерпретувати.
Коли ви створюєте екземпляр типу даних, ви отримуєте об'єкт, і ваші комп'ютери резервують для нього трохи пам'яті і запам'ятовують його розташування та ім'я цього екземпляра. Екземпляр PeopleName в пам'яті займе простір двох змінних String плюс трохи більше для ведення бухгалтерії. Ціле число займає 32 біти в Java.
Складні типи даних можуть мати призначені їм методи. Методи можуть виконувати дії над своїми аргументами або над екземпляром типу даних, з якого ви викликаєте цей метод. Якщо у вас є два екземпляри PeopleName, які називаються p1 і p2, і ви викликаєте метод p1.getFirstName (), він зазвичай повертає перше ім'я першої особи, але не друге.
Концепція класів та об'єктів полягає в інкапсулюванні логіки в єдиний блок програмування. Класи - це схеми створення об’єктів.
Ось приклад класу, що представляє Автомобіль:
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();
Я взяв приклад із цього підручника
Він має логічне існування, тобто при його створенні не виділяється простір пам'яті.
Це сукупність об’єктів.
Клас може розглядатися як план створення об'єктів.
Він створюється за допомогою ключового слова class
Клас визначає методи та члени даних, якими будуть володіти об’єкти.
Він має фізичне існування, тобто простір пам’яті виділяється при його створенні.
Це екземпляр класу.
Об'єкт - це унікальна сутність, що містить члени даних та функції членів разом мовою ООП.
Він створюється за допомогою нового ключового слова
Об'єкт визначає реалізацію методів і значень, якими будуть володіти члени даних у класі.
Клас - це проект, необхідний для створення об'єкта (= екземпляра).
Різниця між об’єктом та екземпляром полягає в тому, що об’єкт - це річ, а екземпляр - це відношення.
Іншими словами, екземпляр описує відношення об’єкта до класу, з якого створений об’єкт.
Визначення "Об'єкт є екземпляром класу" є концептуально неправильним, але правильним відповідно до реалізації. Насправді об'єктно-орієнтовані особливості взяті з реального життя, щоб зосередити розум програміста від більшого до меншого. У реальному житті класи призначені для управління об'єктом. Наприклад, ми, люди, маємо касту, релігію, національність та багато іншого. Ці склади, релігія, національність є класами і не існують без людей. Але в реалізації не існує об'єктів без класів. Об'єкт - Об'єкт - це дискретна сутність, що має якийсь чітко визначений атрибут. Тут дискретне означає щось, що робить його унікальним серед інших. Добре визначений атрибут має сенс у певному контексті. Клас - Класифікація об’єктів, що мають спільну поведінку, або об’єктів загального типу.
Незважаючи на те, що наведені вище відповіді є вірними, іншим способом мислення щодо класів та об'єктів є використання прикладів із реального світу: Клас на ім'я Тварина може містити такі предмети, як Кіт, Собака чи Риба. Об'єкт із назвою Біблія буде класом "Книга" тощо. Класи загальні, об'єкти специфічні. Цей приклад думки допоміг мені, коли я вивчав Java.
Animal
це клас і Cat
є екземпляром, який мій домашній котик-кицька «Пухнастий»?
Клас - це шаблон або тип. Об'єкт є екземпляром класу.
Наприклад:
public class Tweet {
}
Tweet newTweet = new Tweet();
Tweet - це клас, а newTweet - об’єкт класу.