# Unterschied zwischen Referenz auf Objekt/Instanz von Objekt



## dyn (5. Sep 2005)

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


?? sorry für eventuelle syntaxfehler!


----------



## byte (5. Sep 2005)

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.


----------



## L-ectron-X (5. Sep 2005)

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.


----------



## TRunKX (6. Sep 2005)

> Objekt und Instanz ist ein und das selbe.



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!


----------



## dyn (6. Sep 2005)

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.


```
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!


```
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.


```
Klasse klasse;
```


----------



## Sky (6. Sep 2005)

Ich verstehe nicht so recht, was Du willst! Folgende Alternativen stehen Dir zu wahl. Welche Du nimmst kommt auf deinen Anwendungsfall an:
	
	
	
	





```
//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();
  }
}
```


----------



## dyn (6. Sep 2005)

> 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!



Aaah, danke, das hatte ich quasi überlesen. Das erklärt ja den Unterschied. Danke!


----------



## L-ectron-X (6. Sep 2005)

dyn hat gesagt.:
			
		

> 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!
> 
> 
> ```
> ...


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.


----------



## TRunKX (6. Sep 2005)

L-ectron-X zustimm!


----------



## dyn (6. Sep 2005)

ah. ok! vor allem der hinweis, dass diese instanzvariablen immer den wert null bekommen ist doch mal sehr hilfreich!
danke!


----------

