Różnica między klasami, obiektami i instancjami


Odpowiedzi:


86

Java (i każdy inny język programowania) jest modelowana pod względem typów i wartości . Na poziomie teoretycznym wartość jest reprezentacją pewnej ilości informacji, a typ to zbiór wartości. Kiedy mówimy, że wartość X jest instancją typu Y, to po prostu mówimy, że X jest członkiem zbioru wartości, który jest typem Y.

To właśnie oznacza termin „instancja”: opisuje związek, a nie rzecz.

System typów języka programowania Java obsługuje dwa rodzaje typów: typy pierwotne i typy referencyjne . Typy referencyjne są dalej podzielone na klasy i typy tablic . Java obiekt jest przykładem typu odniesienia.

Obiekt jest instancją klasy lub tablicą. ( JLS 4.3.1 )

To jest pogląd teoretyczny typu.

W praktyce większość programistów Java traktuje słowa „instancja” i „obiekt” jako synonimy. (I to dotyczy mnie, więc staram się coś szybko wyjaśnić.) Większość programistów używa słowa „wartość” zamiast „instancja” w odniesieniu do instancji typu pierwotnego.


3
Naprawdę doceniam twoją odpowiedź, i prawie ją otrzymałem, jeszcze jedno pytanie. Mówimy - „Za każdym razem, gdy kompilator trafi w konstruktor z argumentem 0, tworzy instancję klasy.”. W tym kontekście, co tak naprawdę jest stworzone jako instancja lub obiekt? Chyba obiekt i używamy słowa „instancja” jako synonimu. Ale byłoby miło, gdybyś lepiej to potwierdził.
Pranjut

3
@Ryan: Zasadniczo tak: tworzy obiekt, który jest instancją danej klasy. (Należy jednak pamiętać, że cytowane zdanie mówi o „instancji klasy”, a nie tylko o „instancji” ... więc autor nie używa tutaj synonimu „instancja”).
Stephen C

1
@RuneFS - „modelowanie”, o którym mówię, nie dotyczy reprezentacji. To jest teoretyczne. Tak, w niektórych językach istnieją obiekty, które oznaczają typy, a nawet umożliwiają wyliczenie wszystkich wystąpień typu. Ale te właściwości raczej wzmacniają ogólne „modelowanie” niż je unieważniają.
Stephen C

1
@RuneFS - Nie ... mówię o „teorii typów”. To gałąź matematyki. Jest niezależny od technologii używanej do uruchamiania programów. Teoria typów najbliższa obliczeniom to rachunek lambda. (Jeśli jesteś zainteresowany, spróbuj zdobyć kopię „Typów i języków programowania” Benjamina C. Pierce'a.)
Stephen C

1
Popełniasz ten sam błąd, co user2390183. Traktujesz zmienne jako „nazwy”. Oni nie są. Zmienne to „obiekty referencyjne”, które zawierają odniesienia do obiektów. Obiekty nie mają wewnętrznych nazw. Odniesienia są najbliższe „nazwie” obiektu, z wyjątkiem tego, że nie mają stałej reprezentacji. (GC może przesuwać obiekt, który zmienia wzorzec bitów używany do reprezentowania odniesienia.)
Stephen C

96

Klasa jest plan, który używasz do tworzenia obiektów . Obiekt jest instancją klasy - to konkretna „rzecz” utworzona przy użyciu określonej klasy. Zatem „obiekt” i „instancja” to to samo, ale słowo „instancja” wskazuje na związek obiektu z jego klasą.

Łatwo to zrozumieć, patrząc na przykład. Załóżmy na przykład, że masz klasę House. Twój własny dom jest przedmiotem i przykładem klasy House. Dom twojej siostry to kolejny obiekt (kolejna klasa 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();

Klasa Houseopisuje pojęcie tego, czym jest dom, i istnieją konkretne, konkretne domy, które są obiektami i przykładami klasy House.

Uwaga: w Javie jest to dokładnie to samo, co we wszystkich językach programowania obiektowego.


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 i myCar są obiektami myHouse jest instancją House (odnosi Object-myHouse do swojego Class-House) myCar jest instancją Car. Czy to prawda, zobacz powyższą odpowiedź użytkownika2390183, czy jest poprawna, czy nie?
Suraj Jain

29

Klasa jest w zasadzie definicją i zawiera kod obiektu. Obiekt jest instancją klasy

na przykład jeśli powiesz

String word = new String();

klasa jest klasą String, która opisuje słowo obiektu (instancji).

Kiedy klasa jest deklarowana, nie jest przydzielana żadna pamięć, więc klasa jest tylko szablonem.

Po zadeklarowaniu obiektu klasy alokowana jest pamięć.


Czy chodziło Ci o to, że obiekty i instancje są takie same?
Pranjut

Dzięki David za link. Z tematów, które otrzymałem. Wszystkie rzeczy ze świata rzeczywistego, które mają stan i zachowanie, można nazwać „przedmiotem”. A do klasyfikacji tych obiektów używamy klasy (klasa to plan, z którego tworzone są poszczególne obiekty). I mówi, że obiektami klasy są instancje. A teraz niech ktoś mi powie, jakie są różnice między obiektem a instancją? Czy to oznacza, że ​​obiekt tak naprawdę nie istnieje w kontekście programowania, a instancja reprezentuje w nim obiekt?
Pranjut

@Mustafa: Przepraszam, że zaprzeczam, ale według JLS tablica jest również obiektem w Javie. Przekonasz się, że JLS w ogóle nie definiuje terminu „instancja”. Zobacz moją odpowiedź.
Stephen C

@Ryan: Zobacz moją odpowiedź dotyczącą różnicy między „instancją” a „obiektem”. Odpowiedź i komentarz @ Mustafy są (IMO) mylące.
Stephen C

@mustafabar - "Gdy deklarowana jest klasa, nie jest przydzielana żadna pamięć, więc klasa jest tylko szablonem." - I to też nie jest prawda. Pamięć jest przydzielana (przynajmniej) do reprezentowania staticzmiennych klasy. (A także innych rzeczy, które są związane z tożsamością typu klasy.)
Stephen C,

13

Podoba mi się wyjaśnienie Jespera w kategoriach laika

Improwizując przykłady z odpowiedzi Jespera,

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 i myCar to obiekty

myHouse jest instancją House (odnosi Object-myHouse do swojego Class-House) myCar jest instancją Car

w skrócie

„myHouse jest wystąpienie z klasy Domu”, który jest taki sam jak powiedzenie „myHouse to obiekt z typu dom”


6

Klasa to typ danych, ten typ służy do tworzenia obiektów.

  • Instancja jest logiczna, ale obiekt jest fizyczny oznacza, że ​​zajmuje trochę pamięci.

  • Możemy stworzyć instancję dla klasy abstrakcyjnej, jak również dla interfejsu, ale nie możemy stworzyć
    dla nich obiektu.

  • Obiekt jest instancją klasy, a instancja oznacza reprezentatywną dla klasy, tj. Obiekt.

  • Instancja odnosi się do odwołania do obiektu.

  • Obiekt faktycznie wskazuje na adres pamięci tej instancji.

  • Nie możesz przesuwać instancji przez warstwy, ale możesz przesuwać obiekt nad warstwami

  • Nie możesz przechowywać instancji, ale możesz przechowywać obiekt

  • Pojedynczy obiekt może mieć więcej niż jedną instancję.

  • Instancja będzie miała zarówno definicję klasy, jak i definicję obiektu, podczas gdy tak jak w obiekcie będzie miała tylko definicję obiektu.

Składnia obiektu:

 Classname var=new Classname();

Ale na przykład kreacja zwraca tylko wskaźnik odnoszący się do obiektu, składnia jest następująca:

 Classname varname;

3

W Javie obiekty są tworzone w pamięci sterty. Wymagają one odniesienia do wskazania i użycia w naszej aplikacji. Odniesienie zawiera lokalizację w pamięci obiektu, z którym możemy korzystać z obiektów w naszej aplikacji. Krótko mówiąc, odniesienie to nic innego jak nazwa zmiennej, która przechowuje adres obiektu, którego instancja została utworzona w miejscu pamięci.

An instanceto termin ogólny oznaczający object. FYI, Objectto klasa.

Na przykład,

Class A{

}

A ref = new A();

W powyższym fragmencie kodu ref jest odniesieniem do obiektu klasy A wygenerowanego na stercie.


3

Szczerze mówiąc, definicje bloga Alfreda czuję się bardziej komfortowo :

Obiekt : obiekty świata rzeczywistego mają dwie główne cechy, stan i zachowanie. Człowiek ma stan (imię, wiek) i zachowanie (bieganie, spanie). Samochód posiada stan (aktualna prędkość, aktualny bieg) i zachowanie (hamowanie, zmiana biegu). Obiekty oprogramowania są koncepcyjnie podobne do obiektów świata rzeczywistego: również składają się ze stanu i powiązanego zachowania. Obiekt przechowuje swój stan w polach i ujawnia swoje zachowanie za pomocą metod.

Klasa : to „szablon” / „plan” używany do tworzenia obiektów. Zasadniczo klasa składa się z pola, pola statycznego, metody, metody statycznej i konstruktora. Pole służy do przechowywania stanu klasy (np .: nazwa obiektu Studenta). Metoda służy do reprezentowania zachowania klasy (np. W jaki sposób obiekt Studenta ma się podnieść). Konstruktor służy do tworzenia nowej instancji klasy.

Instancja : instancja to unikatowa kopia klasy reprezentującej obiekt. Po utworzeniu nowej instancji klasy maszyna JVM przydzieli przestrzeń pamięci dla tej instancji klasy.

Biorąc pod uwagę następny przykład:

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);
    }
}

W przypadku 1 istnieją dwie instancje klasy Person, ale obie reprezentują ten sam obiekt.

W przypadku 2 istnieją dwie instancje klasy Person, ale każda instancja reprezentuje inny obiekt.

Zatem klasa, obiekt i instancja to dwie różne rzeczy. Obiekt i instancja nie są synonimami, jak sugeruje odpowiedź wybrana jako prawidłowa odpowiedź.


2

Jeśli masz program modelujący samochody, masz klasę reprezentującą samochody, więc w Kodzie możesz powiedzieć:

Car someCar = new Car();

someCar jest teraz instancją klasy Car. Jeśli program jest używany w warsztacie, a someCar reprezentuje Twój samochód w ich systemie, to Twój samochód jest obiektem.

Tak więc Car to klasa, która może reprezentować dowolny samochód w świecie rzeczywistym. SomeCar jest instancją klasy Car, a niektóreCare reprezentuje jeden przedmiot z prawdziwego życia (twój samochód)

jednak instancja i przedmiot są bardzo często używane wymiennie, jeśli chodzi o omawianie kodowania


1
Ściśle mówiąc someCarjest to odniesienie do instancji samochodu. Sama instancja nie ma nazwy.
Joachim Sauer

2

Każdy rodzaj danych przechowywanych i przetwarzanych przez komputer jest w swojej najbardziej podstawowej reprezentacji wierszem bitów. Sposób, w jaki te bity są interpretowane, odbywa się za pomocą typów danych. Typy danych mogą być prymitywne lub złożone. Prymitywne typy danych to na przykład int lub double. Mają określoną długość i określony sposób interpretacji. W przypadku liczby całkowitej zwykle pierwszy bit jest używany na znak, pozostałe są używane jako wartość.

Złożone typy danych mogą być połączeniami pierwotnych i innych złożonych typów danych i nazywane są w języku Java „Klasą”.

Można zdefiniować złożony typ danych PeopleName składający się z dwóch ciągów znaków o nazwie imię i nazwisko. Każdy ciąg w Javie to inny złożony typ danych. Zwracane ciągi znaków są (prawdopodobnie) zaimplementowane przy użyciu pierwotnego typu danych char, dla którego Java wie, ile bitów zajmuje do przechowywania i jak je zinterpretować.

Kiedy tworzysz wystąpienie typu danych, otrzymujesz obiekt, a Twoje komputery rezerwują dla niego trochę pamięci i zapamiętują jego lokalizację oraz nazwę tego wystąpienia. Wystąpienie PeopleName w pamięci zajmie miejsce dwóch zmiennych typu String oraz trochę więcej na potrzeby księgowości. Liczba całkowita w Javie zajmuje 32 bity.

Złożone typy danych mogą mieć przypisane metody. Metody mogą wykonywać akcje na swoich argumentach lub na wystąpieniu typu danych, z którego wywołujesz tę metodę. Jeśli masz dwa wystąpienia PeopleName o nazwie p1 i p2 i wywołujesz metodę p1.getFirstName (), zwykle zwraca ona imię pierwszej osoby, ale nie imię drugiej osoby.


2

Koncepcja klas i obiektów polega na hermetyzowaniu logiki w pojedynczej jednostce programowania. Klasy to plany, z których tworzone są obiekty.

Oto przykład klasy reprezentującej samochód:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Można tworzyć instancje tego obiektu wóz tak:

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

Wziąłem przykład z tego samouczka


2

Klasa : Struktura

Przedmiot : Manifestacja fizyczna

Instancja : każdy obiekt utworzony z klasy

Odniesienie : adres obiektu


1

Klasa

  • Ma istnienie logiczne, tzn. Podczas tworzenia nie jest przydzielane żadne miejsce w pamięci.

  • To zbiór obiektów.

  • Klasa może być traktowana jako plan tworzenia obiektów.

    • Jest tworzony za pomocą słowa kluczowego class

    • Klasa definiuje metody i składowe danych, które będą posiadane przez Objects.


Obiekt

  • Ma istnienie fizyczne, tj. Przestrzeń pamięci jest przydzielana podczas jej tworzenia.

  • Jest to instancja klasy.

  • Obiekt jest unikalną jednostką, która zawiera elementy składowe danych i funkcje składowe razem w języku OOP.

    • Jest tworzony za pomocą nowego słowa kluczowego

    • Obiekt określa implementacje metod i wartości, które będą posiadane przez członków danych w klasie.


1
Miejsce może zostać przydzielone podczas „tworzenia” klasy. Miejsce jest wymagane dla wszystkich zmiennych statycznych zdefiniowanych przez klasę. (A „logiczne” kontra „fizyczne” to rozciąganie, ponieważ reprezentacja obiektu jest tylko pomocą wzorców bitowych w niektórych urządzeniach pamięci.)
Stephen C

@StephenC jaka może być inna różnica?

Zobacz moją odpowiedź. Na to pytanie nie można odpowiedzieć, mówiąc tylko o różnicach.
Stephen C

0

Klasa to plan potrzebny do wykonania obiektu (= instancji).

Różnica między przedmiotem a instancją polega na tym, że obiekt jest rzeczą, a instancja jest relacją.

Innymi słowy, instancja opisuje relację obiektu do klasy, z której obiekt został utworzony.


-1

Definicja „Obiekt jest instancją klasy” jest koncepcyjnie błędna, ale poprawna zgodnie z implementacją. W rzeczywistości funkcje obiektowe są zaczerpnięte z prawdziwego życia, aby skupić umysł programisty od mniej do więcej. W prawdziwym życiu zajęcia mają na celu zarządzanie obiektem, np. My, ludzie, mamy kastę, religię, narodowość i wiele więcej. Te kasty, religia, narodowość są klasami i nie istnieją bez ludzi. Ale w implementacji nie ma obiektów bez klas. Obiekt - obiekt to dyskretna jednostka posiadająca dobrze zdefiniowany atrybut. Tutaj dyskretne oznacza coś, co czyni go wyjątkowym od innych. Dobrze zdefiniowany atrybut ma sens w pewnym kontekście. Class- Klasyfikacja obiektów mających pewne wspólne zachowanie lub obiekty pewnego wspólnego typu.


-1

Chociaż powyższe odpowiedzi są poprawne, innym sposobem myślenia o klasach i obiektach byłoby użycie przykładów z prawdziwego świata: klasa o nazwie Animal może zawierać obiekty takie jak Kot, Pies lub Ryba. Przedmiot z tytułem Biblii należałby do klasy Book, itd. Klasy są ogólne, przedmioty są szczegółowe. Ten przykład myślowy pomógł mi, gdy uczyłem się języka Java.


Tak ... ale analogie też mogą być mylące. Jeśli Animaljest to klasa i Catinstancja, czym jest moja kotka „Puszysta”?
Stephen C

-2

Klasa to szablon lub typ. Obiekt jest instancją klasy.

Na przykład:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet jest klasą, a newTweet jest przedmiotem tej klasy.


To tylko słowa. Właściwie nie wyjaśniasz, co znaczą te słowa. (I faktycznie, klasy Java NIE zachowują się jak szablony, ani w prawdziwym życiu, ani w taki sposób, jak w językach takich jak Javascript, Python, Ruby itp.)
Stephen C
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.