web-dev-qa-db-de.com

Was sind Klassen, Referenzen und Objekte?

Ich programmiere seit 2 Jahren Java und anscheinend bin ich auf ein Problem gestoßen, bei dem ich Klasse, Referenz und ein Objekt nicht mehr verstehen und unterscheiden konnte (ich verstehe nicht, warum ich diese Konzepte vergessen habe). 

Kommen wir zu dem Problem, das heißt, dass ich nicht sicher bin, ob eine Klasse oder ein Verweis gleich sind, obwohl ich bereits eine Idee habe, was Objekt ist. 

Kann jemand auf eine nette und verständliche und vollständige Weise unterscheiden, was Klassen, Referenzen und Objekte sind? 

Ich weiß nur, dass die Klasse eher einer Vorlage für ein Objekt ähnelt (Entwurf eines Hauses, in dem die Klasse der Entwurf ist und das Haus ein Objekt ist).

46
user962206

Wenn Sie gerne Metaphern aufnehmen:

  • ein class ist wie der Bauplan eines Hauses. Mit diesem Bauplan können Sie beliebig viele Häuser bauen.
  • jedes Haus, das Sie bauen (oder instanziieren, in OO), ist ein Objekt, auch bekannt als Instanz.
  • natürlich hat jedes Haus auch eine Adresse. Wenn Sie jemandem mitteilen möchten, wo sich das Haus befindet, geben Sie ihm eine Karte mit der darauf angegebenen Adresse. Diese Karte ist Referenz des Objekts.
  • Wenn Sie das Haus besuchen wollen, schauen Sie sich die Adresse an, die auf der Karte steht. Dies wird als Dereferenzierung bezeichnet.

Sie können diese Referenz beliebig oft kopieren, aber es gibt nur ein Haus - Sie kopieren nur die Karte, auf der sich die Adresse befindet, nicht das Haus selbst.

In Java können Sie nicht direkt auf Objekte zugreifen, Sie können nur Referenzen verwenden. Java kopiert oder ordnet Objekte nicht zu. Sie können jedoch Variablen kopieren und Referenzen zuweisen, sodass sie sich auf dasselbe Objekt beziehen. Java-Methoden sind immer pass-by-value, der Wert kann jedoch die Referenz eines Objekts sein. Wenn ich also

Foo myFoo = new Foo();     // 1
callBar(myFoo);            // 2
myFoo.doSomething()        // 4

void callBar(Foo foo) {
    foo = new Foo();       // 3
}

Dann schauen wir mal was passiert.

  1. In Zeile 1 geschieht Folgendes: new Foo() weist die JVM an, ein neues Haus mit dem Bauplan Foo zu bauen. Die JVM führt dies aus und gibt einen Verweis auf das Haus zurück. Sie kopieren diese Referenz dann in myFoo. Dies ist im Grunde so, als würde man einen Bauunternehmer bitten, ein Haus zu bauen. Er tut es und sagt Ihnen dann die Adresse des Hauses; Sie schreiben diese Adresse auf.
  2. In Zeile 2 geben Sie diese Adresse an eine andere Methode, callBar. Springen wir als Nächstes zu dieser Methode.
  3. Hier haben wir eine Referenz Foo foo. Java ist pass-by-value, daher ist foo in callBar ein copy der myFoo-Referenz. Stellen Sie sich vor, Sie geben callBar eine ganz eigene Karte mit der Adresse des Hauses. Was macht callBar mit dieser Karte? Es fordert, dass ein neues Haus gebaut wird, und verwendet dann die Karte, die Sie ihm gegeben haben, um die Adresse des neuen Hauses zu schreiben. Beachten Sie, dass callBar jetzt nicht zum ersten Haus gelangen kann (dem, das wir in Zeile 1 gebaut haben), aber dieses Haus ist unverändert durch die Tatsache, dass eine Karte, auf der sich früher die Adresse befand, jetzt die Adresse eines anderen Hauses hat .
  4. In der ersten Methode dereferenzieren wir myFoo, um eine Methode darauf aufzurufen (doSomething()). Dies ist, als würde man die Karte betrachten, zum Haus gehen, dessen Adresse auf der Karte steht, und dann etwas in diesem Haus tun. Beachten Sie, dass unsere Karte mit der Adresse von myFoo durch die Methode callBar nicht geändert wird. Denken Sie daran, dass wir callBar eine copy unserer Referenz gegeben haben.

Die ganze Sequenz würde ungefähr so ​​aussehen:

  1. Bitten Sie die JVM, ein Haus zu bauen. Es tut und gibt uns die Adresse. Wir kopieren diese Adresse auf eine Karte mit dem Namen myFoo.
  2. Wir rufen callBar auf. Bevor wir dies tun, kopieren wir die Adresse, die in myfoo geschrieben ist, auf eine neue Karte, die wir callBar geben. Es nennt diese Karte foo.
  3. callBar fragt die JVM nach einem anderen Haus. Es erstellt es und gibt die Adresse des neuen Hauses zurück. callBar kopiert diese Adresse auf die von uns angegebene Karte.
  4. Zurück in der ersten Methode betrachten wir unsere ursprüngliche, unveränderte Karte. Gehen Sie zu dem Haus, dessen Adresse auf unserer Karte steht. und dort etwas tun.
119
yshavit

Wenn Sie codieren, bauen Sie eine 

Instanz (Vorkommen, Kopie)

von einem 

Objekt 

von einem besagten 

Klasse

und behalte ein

referenz

um es, so können Sie seine Methoden aufrufen.

Außerdem einige OOP - Grundlagen: Klassen , Objekt , Instanz und Referenz .

12
Marcelo

In dem Buch "Thinking in Java" von Bruce Eckel wurde es perfekt beschrieben:

"Sie können sich einen Fernseher (das Objekt) und eine Fernbedienung (die Referenz) vorstellen. Solange Sie diese Referenz halten, haben Sie eine Verbindung zum Fernseher, aber wenn jemand sagt:" Kanal wechseln "oder" Senken " die Lautstärke “, was Sie manipulieren, ist die Referenz, die wiederum das Objekt verändert. Wenn Sie sich im Raum bewegen und trotzdem den Fernseher steuern möchten, nehmen Sie die Fernbedienung/Referenz mit, nicht den Fernseher.

Die Fernbedienung kann auch ohne Fernseher stehen. Das heißt, nur weil Sie eine Referenz haben, bedeutet das nicht notwendigerweise, dass ein Objekt damit verbunden ist. Wenn Sie also ein Wort oder einen Satz enthalten möchten, erstellen Sie einen String-Verweis:

String s;

Hier haben Sie jedoch nur die Referenz erstellt, kein Objekt. Wenn Sie sich zu diesem Zeitpunkt entschlossen haben, eine Nachricht an s zu senden, wird eine Fehlermeldung angezeigt, da s nicht an irgendetwas angehängt ist (es gibt kein Fernsehgerät). Sicherer ist es daher, eine Referenz immer dann zu initialisieren, wenn Sie sie erstellen:

String s = "asdf";

Hierbei wird jedoch eine spezielle Java-Funktion verwendet: Zeichenfolgen können mit in Anführungszeichen gesetztem Text initialisiert werden. Normalerweise müssen Sie eine allgemeinere Art der Initialisierung für Objekte verwenden.

Wenn Sie eine Referenz erstellen, möchten Sie diese mit einem neuen Objekt verbinden. Im Allgemeinen tun Sie dies mit dem neuen Operator. Das Schlüsselwort new sagt: "Mache mir ein neues Objekt". Im vorigen Beispiel können Sie also Folgendes sagen:

String s = new String("asdf");

Dies bedeutet nicht nur „Make me a new String“, sondern gibt auch Informationen dazu, wie Sie den String erstellen, indem Sie eine anfängliche Zeichenfolge angeben. Natürlich enthält Java eine Vielzahl von gebrauchsfertigen Typen zusätzlich zu String. Wichtiger ist, dass Sie Ihre eigenen Typen erstellen können. In der Tat ist das Erstellen neuer Typen die grundlegende Aktivität bei der Java-Programmierung. "

6
Farbod

Angenommen, Sie schreiben dort zwei Codezeilen:

Engine app1 = new Engine(); //LINE 1

Engine app2  = app1; //LINE 2

In Zeile 1 ist Engine eine Klasse , es ist im Grunde eine Blaupause.

new Engine () ist die Instanz , die auf dem Heap erstellt wird.

Sie referenzieren diese Instanz , indem Sie in Ihrem Code app1 und app2 verwenden.

App1 und app2 sind also die Referenzen .

3
Sunny Gupta

Wenn Sie ein Objekt erstellen, geschieht hinter der Szene, dass ein Speicherplatz für das Objekt reserviert ist. Dies könnte überall in der großen, großen Speicherlandschaft sein; Es liegt an dem Betriebssystem und dem Compiler, und Sie haben keine Kontrolle darüber, wo er endet.

Fragen Sie sich, wie verwenden Sie das Objekt, wenn Sie nicht wissen, wo es sich in Erinnerung befindet? Wie können Sie einen Wert daraus lesen, wenn Sie nicht wissen, wo dieser Wert gespeichert ist? Dies ist, was Referenzen für Sie tun. Sie sind eine Möglichkeit, mit dem Objekt in Kontakt zu bleiben. Es ist eine kleine Schnur, die am Ballon befestigt ist und als Referenz dient.

Sie verwenden den Verweis, um zu sagen "Ich möchte jetzt dieses Objekt!" Berühren, oder "Ich möchte einen Wert aus diesem Objekt lesen!".

2
Supr

Klasse ist eine Vorlage, du hast recht. Es ist etwas Wissen über die Datenstruktur. Objekt ist diese Strukturinstanz im Speicher. Referenz ist eine Speicheradresse dieser Instanz.

Wenn Sie mit Object den Java-Bezeichner meinen, ist Object die Basisklasse für alle komplexen Java-Klassen.

1
Dims

Klasse: Struktur oder BluePrint

Objekt: Physische Manifestation

Referenz: Adresse des Objekts

1
Abishek M

Object ist die Laufzeitdarstellung der Class-Definition. Und der Name, mit dem Sie das Objekt verwenden heißt reference (da es auf den tatsächlichen Objektstandort im Speicher verweist)

beispiel

MyClass ref = new MyClass();

MyClass ist (enthält) die Klasse Definition.

new MyClass () erstellt ein Objekt für diese Klasse (nur während der Ausführung ausgeführt, daher Laufzeitdarstellung)

ref ist der Name, den Sie für die Bearbeitung des Klassenobjekts verwenden, ist die Referenz .

0
Nrj

Class: Wird verwendet, um eine Entität in einer Programmumgebung zu definieren.

Jede Entität im wirklichen Leben, die mindestens eine property und eine entsprechende behaviour hat, kann als Klasse betrachtet werden. Nehmen wir ein Beispiel für ein Car , es hat eine Eigenschaft accelerator, die dem Auto hilft, sich zu bewegen und seine Geschwindigkeit zu kontrollieren. Das entsprechende Verhalten ist acceleration, das direkt proportional zu dem auf das Gaspedal angewendeten Push ist.

class Car {
    private String tier;
    private String tierFriction;
    private double weight;
    private double gasFedToEngine;
}

Die obige Klasse zeigt einige Eigenschaften eines Autos, von denen seine Beschleunigung abhängt. Das Verhalten (method in the class) hängt immer von der Eigenschaft (den Funktionen) (global attribute(s) of the class) ab. Wenn Sie nun mehr Details wünschen, können Sie Tier als andere Entität definieren. Die Definition sieht dann so aus

class Tier {
    private String tierMaterial;
    private String tierFriction;
    private double weight;
    private double tierDiameter;
}

class Car {
    private Tier tier;  // getting all properties of Tier here itself
    private double weight;
    private double gasFedToEngine;
}

Object: Wird verwendet, um verschiedene Varianten einer Entität zu definieren und Datenmanipulationen separat an ihnen durchzuführen.

Jetzt haben wir eine Einheit für unser Programm definiert, sagen wir, wir haben einen Showroom mit Gebrauchtwagen und Autos verschiedener Unternehmen. So wird jedes Auto zu einer object unserer Entität. Objekte können Audi, Nissan, Ferrari usw. sein. Nach dem Öffnen des Ausstellungsraums fügen wir dementsprechend Autos hinzu

static List<Car> showroomCars = new ArrayList<Car>();
public boolean addCarToShowroom() {
    Car carNissan = new Car();  // always creates a new objects and allocates some memory in heap
    carNissan.setName("Nissan");
    carNissan.setColor(RED);
    carNissan.setWeight(300);
    showroomCars.add(carNissan);

    Car carAudi = new Car();
    carAudi.setName("Audi");
    carAudi.setColor(BLACK);
    carAudi.setWeight(270);
    showroomCars.add(carAudi);
}

Nun werden dem Showroom zwei neue Autos hinzugefügt, eines von Nissan und ein anderes von Audi, die jeweils ihre eigenen spezifischen Attributwerte haben. 

Class gibt nur eine Definition, die Manipulation wird an Object vorgenommen. Um eine Klasse zu manipulieren, sollte das Objekt erstellt werden. Jedes Mal, wenn ein Objekt für eine Klasse erstellt wird, werden alle nicht-statischen (Instanz-) Variablen mit ihren jeweiligen Standardwerten in den Speicher geladen.

Referenz: Zum Adressieren eines Objekts

Wenn wir Car carAudi = new Car(); sagen, definieren wir ein neues Objekt für Car, und diesem Objekt wird ein Speicherplatz zugewiesen. Die Referenzvariable carAudi enthält die Speicheradresse dieses Objekts. Auf das Objekt wird nie direkt vom Benutzer zugegriffen, auch nicht auf dessen Speicherort. An dieser Stelle hat die Referenzvariable eine Bedeutung. Sie speichert das hexadecimal-Format des Speicherorts. Wenn wir Änderungen an einem Objekt vornehmen möchten, machen Sie dies mit Hilfe der Referenz nicht direkt.

Ein Objekt kann eine beliebige Anzahl von Referenzen haben, aber eine Referenz kann immer nur auf ein Objekt zeigen.

class Car {
    void test() {
        Car car1 = new Car();  // (1)
        Car car2 = new Car();  // (2)
        car2 = car1;
        /** 
         Says that car2 should point to where car1 points, so now both points to first object of Car
         But for this car2 has to loose its current object-(2), making it an Abandoned object (An object with no active reference from the stack).
        **/
    }
}
0
Arun Sudhakaran

========== Klasse und Objekt ===========

Klasse => ex: Person (eher Phantasie)

Objekt => ex: John, Mike (echte Person)

============ Referenz =============

ex:

Fernsehen tv1; - (Fernsehen ist eine Klasse, TV1 ist eine Fernbedienung ohne Fernsehen)

Fernsehen tv2 = neues Fernsehen (); - (Jetzt hat tv2 Fernbedienung einen Fernseher)

tv1 = tv2; - (Jetzt können tv1 und tv2 dasselbe Fernsehgerät steuern)

Fernsehen tv3 = neues Fernsehen (); - (tv3 ist eine neue Fernbedienung mit neuem Fernseher)

0
Tsasaa