Der Unterschied zwischen Klassen, Objekten und Instanzen


Antworten:


84

Java (und jede andere Programmiersprache) wird in Bezug auf Typen und Werte modelliert . Auf der theoretischen Ebene ist ein Wert eine Darstellung für ein Informationsquantum, und ein Typ ist eine Menge von Werten. Wenn wir sagen, dass Wert X eine Instanz vom Typ Y ist, sagen wir einfach, dass X ein Mitglied der Wertemenge ist, die vom Typ Y ist.

Das ist es also, was der Begriff "Instanz" wirklich bedeutet: Er beschreibt eine Beziehung, keine Sache.

Das Typsystem der Programmiersprache Java unterstützt zwei Arten von Typen, primitive Typen und Referenztypen . Die Referenztypen sind weiter in Klassen und Array-Typen unterteilt . Ein Java- Objekt ist eine Instanz eines Referenztyps.

Ein Objekt ist eine Klasseninstanz oder ein Array. ( JLS 4.3.1 )

Das ist die typentheoretische Sichtweise.

In der Praxis behandeln die meisten Java-Entwickler die Wörter "Instanz" und "Objekt" als Synonyme. (Und das schließt mich ein, dann versuche ich, etwas schnell zu erklären.) Und die meisten Entwickler verwenden das Wort "Wert" anstelle von "Instanz", um auf eine Instanz eines primitiven Typs zu verweisen.


2
Ich schätze Ihre Antwort sehr, Sir, und ich habe sie fast verstanden, nur noch eine Frage. Wir sagen: "Immer wenn der Compiler den 0-Argument-Konstruktor trifft, erstellt er eine Instanz einer Klasse." Was ist in diesem Zusammenhang wirklich eine Instanz oder ein Objekt? Ein Objekt, denke ich, und wir verwenden das Wort "Instanz" als Synonym. Aber es wäre nett, wenn Sie es besser bestätigen würden.
Pranjut

2
@ Ryan: Grundsätzlich ja: Es wird ein Objekt erstellt, das eine Instanz der betreffenden Klasse ist. (Beachten Sie jedoch, dass der zitierte Satz "Instanz einer Klasse" und nicht nur "Instanz" sagt. Der Autor verwendet hier also nicht "Instanz" als Synonym.)
Stephen C

1
@RuneFS - Bei der "Modellierung", von der ich spreche, geht es nicht um Repräsentation. Es ist theoretisch. Ja, in einigen Sprachen gibt es Objekte, die Typen bezeichnen oder sogar die Aufzählung aller Instanzen eines Typs ermöglichen. Diese Eigenschaften erweitern jedoch die generische "Modellierung", anstatt sie ungültig zu machen.
Stephen C

1
@RuneFS - Nein ... ich spreche von "Typentheorie". Es ist ein Zweig der Mathematik. Es ist unabhängig von der Technologie, mit der Programme ausgeführt werden. Die der Berechnung am nächsten kommende Typentheorie ist die Lambda-Rechnung. (Wenn Sie interessiert sind, versuchen Sie, eine Kopie von "Typen und Programmiersprachen" von Benjamin C. Pierce zu bekommen.)
Stephen C

1
Sie machen den gleichen Fehler wie user2390183. Sie behandeln Variablen als "Namen". Sie sind nicht. Variablen sind "Referenzinhaber", die Verweise auf Objekte enthalten. Objekte haben keine intrinsischen Namen. Die Referenzen kommen einem "Namen" für ein Objekt am nächsten, außer dass sie keine konstante Darstellung haben. (Der GC kann ein Objekt verschieben, das das zur Darstellung der Referenz verwendete Bitmuster ändert.)
Stephen C

92

Eine Klasse ist eine Blaupause, mit der Sie Objekte erstellen . Ein Objekt ist ein Instanz einer Klasse - es ist eine konkrete Sache, die Sie mit einer bestimmten Klasse erstellt haben. "Objekt" und "Instanz" sind also dasselbe, aber das Wort "Instanz" gibt die Beziehung eines Objekts zu seiner Klasse an.

Dies ist leicht zu verstehen, wenn Sie sich ein Beispiel ansehen. Angenommen, Sie haben eine Klasse House. Ihr eigenes Haus ist ein Objekt und eine Instanz der Klasse House. Das Haus Ihrer Schwester ist ein anderes Objekt (eine andere Instanz der Klasse 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();

Die Klasse Housebeschreibt das Konzept, was ein Haus ist, und es gibt bestimmte konkrete Häuser, die Objekte und Instanzen der Klasse sind House.

Hinweis: Dies ist in Java genau das gleiche wie in allen objektorientierten Programmiersprachen.


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 und myCar sind Objekte myHouse ist eine Instanz von House (bezieht Object-myHouse auf sein Klassenhaus) myCar ist eine Instanz von Car. Ist das wahr, siehe die obige Antwort von user2390183 ist es richtig oder nicht?
Suraj Jain

29

Eine Klasse ist im Grunde eine Definition und enthält den Code des Objekts. Ein Objekt ist eine Instanz einer Klasse

Zum Beispiel, wenn Sie sagen

String word = new String();

Die Klasse ist die String-Klasse, die das Objektwort (Instanzwort) beschreibt.

Wenn eine Klasse deklariert wird, wird kein Speicher zugewiesen, sodass die Klasse nur eine Vorlage ist.

Wenn das Objekt der Klasse deklariert wird, wird Speicher zugewiesen.


Meinten Sie, dass Objekte und Instanzen gleich sind?
Pranjut

Danke David für den Link. Aus den Themen, die ich erhalten habe, können alle Dinge der realen Welt, die Zustand und Verhalten haben, als "Objekt" bezeichnet werden. Und um diese Objekte zu klassifizieren, verwenden wir die Klasse (Eine Klasse ist die Blaupause, aus der einzelne Objekte erstellt werden). Und es heißt, dass die Objekte der Klasse Instanzen sind. Bitte sagen Sie mir jetzt jemand, was die Unterschiede zwischen Objekt und Instanz sind. Bedeutet dies, dass das Objekt im Kontext der Programmierung nicht wirklich existiert und die Instanz das Objekt darin darstellt?
Pranjut

@Mustafa: Es tut mir leid, Ihnen zu widersprechen, aber laut JLS ist ein Array auch ein Objekt in Java. Und Sie werden feststellen, dass das JLS den Begriff "Instanz" überhaupt nicht definiert. Siehe meine Antwort.
Stephen C

@ Ryan: Siehe meine Antwort für die Unterscheidung zwischen "Instanz" und "Objekt". @ Mustafas Antwort und Kommentar sind (IMO) irreführend.
Stephen C

@mustafabar - "Wenn eine Klasse deklariert wird, wird kein Speicher zugewiesen, sodass die Klasse nur eine Vorlage ist." - Und das stimmt auch nicht. Der Speicher wird zugewiesen, um (mindestens) die staticVariablen der Klasse darzustellen . (Und auch für andere Dinge, die mit der Typidentität der Klasse zusammenhängen.)
Stephen C

12

Ich mag Jespers Erklärung in Laienbegriffen

Durch das Improvisieren von Beispielen aus Jespers Antwort

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 und myCar sind Objekte

myHouse ist eine Instanz von House (bezieht Object-myHouse auf das Class-House) myCar ist eine Instanz von Car

Zusamenfassend

"myHouse ist eine Instanz von Class House", was gleichbedeutend ist mit "myHouse ist ein Objekt vom Typ House".


6

Klasse ist Datentyp. Mit diesem Typ erstellen Sie ein Objekt.

  • Die Instanz ist logisch, aber das Objekt ist physisch. Das Mittel belegt etwas Speicher.

  • Wir können eine Instanz sowohl für die abstrakte Klasse als auch für die Schnittstelle erstellen, aber wir können kein
    Objekt für diese erstellen .

  • Objekt ist eine Instanz der Klasse und Instanz bedeutet repräsentativ für die Klasse, dh Objekt.

  • Instanz bezieht sich auf die Referenz eines Objekts.

  • Das Objekt zeigt tatsächlich auf die Speicheradresse dieser Instanz.

  • Sie können keine Instanz über die Ebenen übergeben, aber Sie können das Objekt über die Ebenen übergeben

  • Sie können keine Instanz speichern, aber Sie können ein Objekt speichern

  • Ein einzelnes Objekt kann mehr als eine Instanz haben.

  • Die Instanz hat sowohl die Klassendefinition als auch die Objektdefinition, wobei sie wie im Objekt nur die Objektdefinition hat.

Syntax des Objekts:

 Classname var=new Classname();

Bei der Erstellung wird beispielsweise nur ein Zeiger zurückgegeben, der auf ein Objekt verweist. Die Syntax lautet:

 Classname varname;

3

In Java werden die Objekte im Heapspeicher erzeugt. Diese erfordern, dass in unserer Anwendung darauf hingewiesen und verwendet wird. Die Referenz enthält den Speicherort des Objekts, mit dem wir die Objekte in unserer Anwendung verwenden können. Kurz gesagt, eine Referenz ist nichts anderes als ein Name der Variablen, in der die Adresse des an einem Speicherort instanziierten Objekts gespeichert ist.

An instanceist ein allgemeiner Begriff für object. Zu Ihrer Information, Objectist eine Klasse.

Beispielsweise,

Class A{

}

A ref = new A();

Für das obige Codefragment ist ref die Referenz für ein Objekt der Klasse A, das auf einem Heap generiert wurde.


3

Ehrlich gesagt fühle ich mich mit Alfred-Blog- Definitionen wohler :

Objekt : Objekte der realen Welt haben zwei Hauptmerkmale: Zustand und Verhalten. Menschen haben Zustand (Name, Alter) und Verhalten (Laufen, Schlafen). Auto hat Zustand (aktuelle Geschwindigkeit, aktueller Gang) und Verhalten (Bremse betätigen, Gang wechseln). Softwareobjekte ähneln konzeptionell realen Objekten: Auch sie bestehen aus Zustand und verwandtem Verhalten. Ein Objekt speichert seinen Status in Feldern und macht sein Verhalten durch Methoden verfügbar.

Klasse : ist eine „Vorlage“ / „Blaupause“, mit der Objekte erstellt werden. Grundsätzlich besteht eine Klasse aus Feld, statischem Feld, Methode, statischer Methode und Konstruktor. Das Feld wird verwendet, um den Status der Klasse zu speichern (z. B. Name des Schülerobjekts). Die Methode wird verwendet, um das Verhalten der Klasse darzustellen (z. B. wie ein Student-Objekt aufsteht). Der Konstruktor wird verwendet, um eine neue Instanz der Klasse zu erstellen.

Instanz : Eine Instanz ist eine eindeutige Kopie einer Klasse, die ein Objekt darstellt. Wenn eine neue Instanz einer Klasse erstellt wird, weist die JVM dieser Klasseninstanz einen Speicherraum zu.

Angesichts des nächsten Beispiels:

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

Für Fall 1 gibt es zwei Instanzen der Klasse Person, aber beide Instanzen repräsentieren dasselbe Objekt.

Für Fall 2 gibt es zwei Instanzen der Klasse Person, aber jede Instanz repräsentiert ein anderes Objekt.

Klasse, Objekt und Instanz sind also verschiedene Dinge. Objekt und Instanz sind keine Synonyme, wie in der als richtige Antwort ausgewählten Antwort vorgeschlagen.


2

Wenn Sie ein Programm haben, das Autos modelliert, haben Sie eine Klasse, um Autos darzustellen, also könnten Sie im Code sagen:

Car someCar = new Car();

someCar ist jetzt eine Instanz der Klasse Car. Wenn das Programm in einer Reparaturwerkstatt verwendet wird und das someCar Ihr Auto in seinem System darstellt, ist Ihr Auto das Objekt.

Auto ist also eine Klasse, die jedes reale Auto darstellen kann. SomeCar ist eine Instanz der Car-Klasse und someCare repräsentiert ein reales Objekt (Ihr Auto).

Instanz und Objekt werden jedoch sehr oft synonym verwendet, wenn es um die Diskussion der Codierung geht


1
Genau genommen someCarbezieht sich dies auf eine Car-Instanz. Die Instanz selbst hat keinen Namen.
Joachim Sauer

2

Jede Art von Daten, die Ihr Computer speichert und verarbeitet, ist in seiner grundlegendsten Darstellung eine Reihe von Bits. Die Art und Weise, wie diese Bits interpretiert werden, erfolgt über Datentypen. Datentypen können primitiv oder komplex sein. Primitive Datentypen sind beispielsweise int oder double. Sie haben eine bestimmte Länge und eine bestimmte Art der Interpretation. Bei einer Ganzzahl wird normalerweise das erste Bit für das Vorzeichen verwendet, die anderen für den Wert.

Komplexe Datentypen können Kombinationen aus primitiven und anderen komplexen Datentypen sein und werden in Java als "Klasse" bezeichnet.

Sie können den komplexen Datentyp PeopleName definieren, der aus zwei Zeichenfolgen besteht, die als Vor- und Nachname bezeichnet werden. Jeder String in Java ist ein anderer komplexer Datentyp. Im Gegenzug werden Zeichenfolgen (wahrscheinlich) mit dem primitiven Datentyp char implementiert, für den Java weiß, wie viele Bits sie speichern und wie sie zu interpretieren sind.

Wenn Sie eine Instanz eines Datentyps erstellen, erhalten Sie ein Objekt, und Ihr Computer reserviert Speicher dafür und merkt sich dessen Speicherort und den Namen dieser Instanz. Eine Instanz von PeopleName im Speicher belegt den Platz der beiden String-Variablen sowie etwas mehr für die Buchhaltung. Eine Ganzzahl belegt in Java 32 Bit.

Komplexen Datentypen können Methoden zugewiesen werden. Methoden können Aktionen für ihre Argumente oder für die Instanz des Datentyps ausführen, von dem aus Sie diese Methode aufrufen. Wenn Sie zwei Instanzen von PeopleName mit den Namen p1 und p2 haben und eine Methode p1.getFirstName () aufrufen, wird normalerweise der Vorname der ersten Person zurückgegeben, nicht jedoch der der zweiten Person.


2

Das Konzept hinter Klassen und Objekten besteht darin, die Logik in einer einzigen Programmiereinheit zu kapseln. Klassen sind die Blaupausen, aus denen Objekte erstellt werden.

Hier ein Beispiel einer Klasse, die ein Auto darstellt:

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

Sie können Instanzen des Objekts Car folgendermaßen erstellen :

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

Ich habe das Beispiel aus diesem Tutorial genommen


2

Klasse : Struktur

Objekt : Körperliche Manifestation

Instanz : Jedes aus einer Klasse erstellte Objekt

Referenz : Adresse des Objekts


1

Klasse

  • Es hat eine logische Existenz, dh es wird kein Speicherplatz zugewiesen, wenn es erstellt wird.

  • Es ist eine Reihe von Objekten.

  • Eine Klasse kann als Blaupause zum Erstellen von Objekten angesehen werden.

    • Es wird mit dem Schlüsselwort class erstellt

    • Eine Klasse definiert die Methoden und Datenelemente, über die Objekte verfügen.


Objekt

  • Es hat physische Existenz, dh Speicherplatz wird zugewiesen, wenn es erstellt wird.

  • Es ist eine Instanz einer Klasse.

  • Ein Objekt ist eine eindeutige Entität, die Datenelemente und Elementfunktionen zusammen in der OOP-Sprache enthält.

    • Es wird mit einem neuen Schlüsselwort erstellt

    • Ein Objekt gibt die Implementierungen der Methoden und die Werte an, über die die Datenelemente in der Klasse verfügen.


1
Speicherplatz kann zugewiesen werden, wenn eine Klasse "erstellt" wird. Der Speicherplatz wird für alle statischen Variablen benötigt, die von der Klasse definiert werden. (Und "logisch" versus "physisch" dehnt es aus, da eine Objektdarstellung nur Bitmuster sind, die in einigen Speichergeräten helfen.)
Stephen C

@StephenC was könnte dann der andere Unterschied sein?

Siehe meine Antwort. Diese Frage kann nicht richtig beantwortet werden, indem nur über Unterschiede gesprochen wird.
Stephen C

0

Eine Klasse ist eine Blaupause, die benötigt wird, um ein Objekt (= Instanz) zu erstellen.

Der Unterschied zwischen einem Objekt und einer Instanz besteht darin, dass ein Objekt eine Sache und eine Instanz eine Beziehung ist.

Mit anderen Worten beschreibt die Instanz die Beziehung eines Objekts zu der Klasse, aus der das Objekt erstellt wurde.


-1

Die Definition "Objekt ist eine Instanz einer Klasse" ist konzeptionell falsch, aber gemäß Implementierung korrekt. Tatsächlich werden die objektorientierten Merkmale aus dem wirklichen Leben übernommen, um den Geist des Programmierers von mehr auf weniger zu fokussieren. Im wirklichen Leben sind Klassen darauf ausgelegt, das Objekt zu verwalten. Zum Beispiel haben wir Menschen eine Kaste, Religion, Nationalität und vieles mehr. Diese Besetzungen, Religion, Nationalität sind die Klassen und existieren ohne Menschen nicht. In der Implementierung gibt es jedoch keine Objekte ohne Klassen. Objekt - Objekt ist eine diskrete Entität mit einem genau definierten Attribut. Diskret bedeutet hier etwas, das es einzigartig macht. Gut definierte Attribute sind in manchen Zusammenhängen sinnvoll. Klasse - Klassifizierung von Objekten mit einem gemeinsamen Verhalten oder Objekten eines gemeinsamen Typs.


-1

Während die obigen Antworten richtig sind, besteht eine andere Möglichkeit, über Klassen und Objekte nachzudenken, darin, Beispiele aus der realen Welt zu verwenden: Eine Klasse mit dem Namen Tier kann Objekte wie Katze, Hund oder Fisch enthalten. Ein Objekt mit einem Bibeltitel wäre ein Klassenbuch usw. Klassen sind allgemein, Objekte sind spezifisch. Dieses Gedankenbeispiel hat mir geholfen, als ich Java lernte.


Ja ... aber Analogien können auch verwirrend sein. Wenn Animales sich um eine Klasse und Cateine Instanz handelt, was ist meine Haustier-Pussy-Katze "Fluffy"?
Stephen C

-2

Klasse ist eine Vorlage oder ein Typ. Ein Objekt ist eine Instanz der Klasse.

Beispielsweise:

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet ist eine Klasse und newTweet ist ein Objekt der Klasse.


Das sind nur Worte. Sie erklären nicht wirklich, was die Wörter bedeuten. (Und tatsächlich verhalten sich Java-Klassen NICHT wie Vorlagen, weder im wirklichen Leben noch so, wie dies in Sprachen wie Javascript, Python, Ruby usw. der Fall ist.)
Stephen C
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.