Java Zeiger als Methodenparameter

H

Housechen

Gast
Hi!

Mir ist heute im Unterricht etwas merkwürdiges aufgefallen, daher kurze Frage an euch.

Hatte ´ne Klasse "GUI", geerbt von Frame mit dem Object "result".
Wollte eine "sichere Methode" beim dequeuen benutzen, die mir anzeigt, ob die Warteschlange nicht doch leer ist, wurde von den TryParse-Methoden aus .net "inspiriert".
In der Klasse "Warteschlange" daher dieses Gerüst:

Code:
public boolean advanceddequeue (Object result)
{
    if(leer())
    {
        return false;
    }else{
        result=eintrag;
        return true;
    }
}

So brachte mir das übergebene Objekt bzw. der Zeiger von "result" immer null als Wert heraus, wenn ich aber bei return true" einen Breakpoint gesetzt habe, zeigte er mir beim result in der Methode "eintrag" an, result in der GUI blieb allerdings auf null.

Folgendes funktioniert aber:

Code:
public boolean advanceddequeue (GUI gui)
{
    if(leer())
    {
        return false;
    }else{
        gui.result=eintrag;
        return true;
    }
}

result war in beiden Fällen ein String.

Woran liegt das?
Es interessiert mich einfach wie Sau seit dieser Stunde und ich will´s einfach unbedingt wissen.

Meine Vermutung: String wird hier, obwohl es eigentlich ein Objekt ist, wie eine Variable alla int usw., bei denen nur der Wert weitergegeben wird und nicht die Adresse, behandelt.
Wenn ja bzw. allgemein: Wie könnte ich dies umgehen?

Vielen Dank im Voraus!
 
Was du der Methode Übergibst, ist eine Referenz auf das Objekt.

Unmittelbar zu Beginn des Methodenaufrufs hat die Referenz (Pointer) "result" denselben Inhalt (Adresse) wie die Referenz, die du der Methode übergeben hast. Wenn du innerhalb der Methode der Referenz einen anderen Wert zuweist, dann zeigt diese Referenz eben auf ein anderes Objet. Die übergebene Referenz bleibt davon selbstverständlich unberührt :)

Wenn du über die Referenz "result" unbedingt einen String zurückgeben willst, dann könntest du beispielsweise vor dem Aufruf deiner Methode einen StringBuffer anlegen (result = new StringBuffer(""). In deiner Methode machst du dann sowas wie "result.append("eintrag")". (Mit "normalen" String's funtionierts nicht - Stichwort Stringpool ;) )
 
Zuletzt bearbeitet:
Naja... grundsätzlich werde in Java NIE Objekte übergeben, sondern immer nur Referenzen darauf. Eine Referenz ist im Grunde genommen nichts anderes als bswp. ein Integer, dessen Wert (Inhalt) einer Adresse auf ein Objekt irgendwo im Heap entspricht.

Egal ob du jetzt einen primitiven Datentyp oder eine Referenz übergibst - in der Methode wird immer eine entsprechende Variable erstellt und der Wert der übergebenen Variablen dieser zugewiesen. Mit Strings hat das also wenig zu tun :)

Falls Dir das immer noch nicht ganz klar ist, dann googlest du am besten danach - da gibts garantiert massenhaft wunderbare verstädnliche(re) Erklärungen :)
 
BaLLeRTroeTe schrieb:
Naja... grundsätzlich werde in Java NIE Objekte übergeben, sondern immer nur Referenzen darauf. Eine Referenz ist im Grunde genommen nichts anderes als bswp. ein Integer, dessen Wert (Inhalt) einer Adresse auf ein Objekt irgendwo im Heap entspricht.

Ja ich weiß, das wollte ich ja auch ausnutzen.
Nur weiß ich jetzt nicht was explizit der Grund dafür ist, dass das Erste nicht funktioniert, das Zweite aber schon.
 
Also. Angenommen, deine Referenz "result" der GUI-Klasse hat den Wert 0xAFFE. Jetzt übergibst du diese Refernez der Methode:

Code:
public boolean advanceddequeue (Object a)
{
...
}

Code:
advanceddequeue (result);

Die Referenz "a" in der Methode hat nun ebenfalls den Wert 0xAFFE.

Angenommen, die Referenz "eintrag" hat die Adresse 0x1337.
Du weist nun deiner Referenz "a" den Wert 0x1337 zu.

Code:
...
        a=eintrag;
...

Siehst du hier die Referenz "result" von außerhalb irgendwo?
Die bleibt selbstverständlich unverändert :)

Im zweiten Fall:
Code:
public boolean advanceddequeue (GUI gui)
...
        gui.result=eintrag;
        return true;
...
}

du übergibst nun eine Referenz auf ein Objekt und veränderst nicht dessen Referenz, sondern ein Attribut dieses Objekts.

Zeichne Dir einfach mal auf (ein Blatt Papier), welche Referenz wann wohin zeigt, und welche du davon "umbiegst" ;)
 
Achso so meintest du das, kk.

Und wie kann ich result allgemein so übergeben, dass in das result so geschrieben wird, wie ich es im 2. Beispiel funktioniert, nur ohne Übergabe der GUI?
 
In C(++) Wäre sowas einfach per Pointer auf Pointer realisierbar :p

Ansonsten hab ich meinen Vorschlag bereits in meinem ersten Post geschrieben...
 
Ich weiß ich bräuchte/will aber ´ne Allgemeinlösung für/mit Object. Wüsste gerne, ob man sowas in Java realisieren könnte.

Und schonmal vielen, vielen Dank!
 
Du kannst an die Funktion ein Array des Objekts übergeben. In diesem Array kannst du den Wert dann speichern.
 
Cyba_Mephisto schrieb:
Ich weiß ich bräuchte/will aber ´ne Allgemeinlösung für/mit Object. Wüsste gerne, ob man sowas in Java realisieren könnte.
Nein kann man nicht. Die Parameterübergabe erfolgt in Java immer „by value“, das heißt die „Referenz“ wird vor der Übergabe an die Funktion kopiert. Du kannst das mit einem Array oder einem Dummy-Referenz-Objekt umgehen.
Code:
class Reference {
public Object pointer;
}
...
public boolean advanceddequeue (Reference result)
    ...
    result.pointer = "Nö"

@BaLLeRTroeTe: In C++ löst man das indem man eine Referenz nimmt.
 

Ähnliche Themen

Zurück
Oben