Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Unterschied zwischen Referenz auf Objekt/Instanz von Objekt
Hi!
Mal ne allgemeine Frage:
Macht es einen Unterschied, wenn ich dem Konstruktor einer Klasse die Referenz auf eine andere Klasse übergebe ODER von der eigentlich zu referenzierenden Klasse stattdessen einfach eine Instanz bilde, um auf methoden, usw. zugreifen zu können?
also quasi statt:
Klasse klasse;
public andereKlasse(Klasse classe)
{
klasse = classe;
}
->
public andereKlasse(Klasse classe)
{
Klasse klasse = new Klasse();
}
ja das hat große auswirkungen. denn wenn sich im ersten fall die instanz classe ändert, dann hat das auch auswirkungen auf andereKlasse (oh man, deine namensgebung ist echt ungeschickt ).
im zweiten fall ist der parameter im konstruktor dann auch total sinnlos, weil du ihn ja gar nicht liest. du erzeugst ein neues objekt, das bedeutet, dass wenn sich im zweiten fall classe ändert, hat das keinerlei auswirkungen auf andereKlasse.
Ich hab nur den Titel gelesen und zu mir gesagt: "Da is was faul." :wink:
Also: Eine Klasse ist der Bauplan für ein Objekt. Alles was in der Klasse "auf dem Papier" steht, wird bei Instanziierung "zum Leben erweckt" bzw. in die "reale Welt" geholt.
Objekt und Instanz ist ein und das selbe.
Eine Referenz auf ein Objekt ist eine Art Zeiger auf eine Speicheradresse in der VM. An dieser Speicheradresse befindet sich das Objekt, auf welches die Referenz zeigt.
Das stimmt so nicht! Nach Smalltalk wo das mit den " Klassen " angefangen hat ist ein Objekt eine Klasse und ein Modul eine Instanz diese NAmensgebung ist sehr dumm da man in Smalltalk damals noch nicht von Klassen sprach!
Am besten erklärt wird es erklärt durch Klasse und Instanz. Und da hat L-ectron-X vollkommen recht eine Klasse ist der Bauplan und eine Instanz ist eine gebaute existierende Klasse.
Wenn du also eine Instanz übergibst dann kannst du diese dort von wo du sie übergibst bereits genutzt haben. Instanzierst du erst in der aufgerufenen bzw. Instanzierten Klasse dann kannst du die Methoden der neu erstellten Klasse auch nur dort nutzen. Ich empfehle hier mal ien buch zum Thema Objektoreitierung das erklärt den Mist ganz gut. Nach einer gewissen Zeit als JAVA Programmierer ist man damit so vertraut das man sich darüber keine Gedanken macht!
hey!
die grundlagen der OOP sind mir klar. ich kenne den unterschied zwischen klasse und objekt.
ich hatte leider bei dem code snippet einen fehler eingebaut.
mit dem ersten schnipsel möchte ich eine referenz auf das objekt klasse erstellen, damit ich in der klasse andereKlasse auf sie zugreifen kann.
Code:
Klasse klasse;
public andereKlasse(Klasse classe)
{
klasse = classe;
}
im zweiten schnipsel erstelle ich eine neue instanz der klasse Klasse.
die frage die sich mir nun stellt ist, ob ich nun auch auf die instanz der klasse, also auf das objekt klasse zugreifen kann, als ob ich eine referenz darauf übergeben hätte!
Code:
public andereKlasse()
{
Klasse klasse = new Klasse();
}
was mich auch interessieren würde, wäre, wieso man die referenz dem konstruktor so komisch übergeben muss.
wieso reicht nicht einfach das deklarieren der instanzvariable klasse(ist das richtig formuliert?), um dann auf das objekt zuzugreifen.
Ich verstehe nicht so recht, was Du willst! Folgende Alternativen stehen Dir zu wahl. Welche Du nimmst kommt auf deinen Anwendungsfall an:
Code:
//Klasse als Instanzvariable; Objekt wird in Klasse1 erzeugt.
class Klasse1 {
Klasse klasse;
public Klasse1() {
this.klasse = new Klasse();
}
}
//Klasse als Instanzvariable; Objekt wird irgendwo anders erzeugt.
class Klasse2 {
Klasse klasse;
public Klasse2( Klasse klasse ) {
this.klasse = klasse;
}
}
//Objekt wird in Klasse3 erzeugt und ist nur im Konstruktor verfügbar.
class Klasse3 {
public Klasse3() {
Klasse klasse = new Klasse();
}
}
Wenn du also eine Instanz übergibst dann kannst du diese dort von wo du sie übergibst bereits genutzt haben. Instanzierst du erst in der aufgerufenen bzw. Instanzierten Klasse dann kannst du die Methoden der neu erstellten Klasse auch nur dort nutzen. Ich empfehle hier mal ien buch zum Thema Objektoreitierung das erklärt den Mist ganz gut. Nach einer gewissen Zeit als JAVA Programmierer ist man damit so vertraut das man sich darüber keine Gedanken macht!
die frage die sich mir nun stellt ist, ob ich nun auch auf die instanz der klasse, also auf das objekt klasse zugreifen kann, als ob ich eine referenz darauf übergeben hätte!
Code:
public andereKlasse()
{
Klasse klasse = new Klasse();
}
Nein, kannst du nicht.
Zunächst erst mal ist es ein völlig neues, eigenes Objekt, welches außerdem nur innerhalb des Konstruktors sichtbar ist. Wenn es auch in anderen Methoden deiner Klasse verfügbar sein soll, musst du es als Argument einer anderen Methode übergeben.
dyn hat gesagt.:
wieso reicht nicht einfach das deklarieren der instanzvariable klasse(ist das richtig formuliert?), um dann auf das objekt zuzugreifen.
Weil eine Instanzvariable eines benutzerdefinierten Datentyps immer den Wert null bei Deklaration erhält. Im weiteren Programmverlauf könnte sie ohne Definition bzw. Initialisierung nicht benutzt werden.
Es wird vom Compiler lediglich Platz für ein Objekt des Typs im Speicher reserviert.