Referenztypen

Status
Nicht offen für weitere Antworten.

umbcan72

Neues Mitglied
Hallo zusammen,

nach langer Programmiererei in C/C++, widme ich mich jetzt der Programmierung mit JAVA.

Vorab, was es mit Referenztypen auf sich hat, und das es in Java nur "Call by value" gibt, habe ich verstanden.
Allerdings habe ich einige Schwierigkeiten, es in JAVA umzusetzen.

Ein Codebeispiel:

Code:
public class HelloJava5
{
    public static void main(String[] args)
        {
            String string_a = new String("Blume ");
            String string_b = string_a;

            System.out.println(string_a);
            System.out.println(string_b);

            System.out.println("-------");

            string_a = "Baum";

            System.out.println(string_a);
            System.out.println(string_b);
        }
}

Was ich erreichen möchte, ist das string_b genau wie string_a eine Referenz auf ein String-Objekt ist, und zwar dem, das den Wert "Blume " hat. Das heißt, egal, ob ich string_a oder string_b als Referenz heranziehe, eine Manipulation sollte immer nur auf ein und das gleiche Objekt stattfinden und egal ob ich string_a oder string_b ausgebe, ich möchte, dass immer das gleiche ausgegeben wird. Das klappt in meinem Beispiel allerdings nicht. Es sieht vielmehr so aus, als dass string_b eine Kopie von string_a ist. Was mache ich falsch?
Ein ähnliches Problem habe ich auch mit den Typen Byte, Integer, etc. als Argumente für eine Methode, die das Objekt selber manipulieren soll. Es sind ja keine primitiven Typen, sonder sog. Wrapper für byte, integer, etc. Somit würde ich erwarten, das das Argument immer die Referenz auf mein eigentliches Objekt ist und ich dieses auch innerhalb der Methode manipulieren kann.

Ich würde mich sehr über eine Antwort freuen

Gruß

Umberto
 

Marco13

Top Contributor
Was ich erreichen möchte, ist das string_b genau wie string_a eine Referenz auf ein String-Objekt ist, und zwar dem, das den Wert "Blume " hat.
Ja, und dieses Objekt ändert sich nicht. Nie. Wenn du
string_a = "Baum";
schreibst, dann zeigt string_a auf ein anderes ("neues") Objekt, aber zeigt string_b nach wie vor auf das (unveränderte) "Blume".

Theoretisch könnte man einen einelementigen String[]-Array verwenden, oder sowas machen wie
Code:
class StringContainer 
{
    private String string;
    // set/get-Methoden...
}
aber das ist KEINE Empfehlung :noe: Die Empfehlung lautet: Überleg' dir eine andere Lösung (und wenn's nicht klappt, beschreib' genauer, was du erreichen willst)
 

umbcan72

Neues Mitglied
Hallo zusammen,

zunächst einmal vielen Dank für die schnellen Antworten.

Es geht in dem Beispiel nicht um eine bestimmte Aufgabe, die ich lösen muß, sondern um Grundsätzliches.
String ist ja kein primitiver Typ, sondern ein Referenztyp. Mit dem "new" bekpmme ich ja eine Referenz auf das String Objekt. Und ohne Probleme kann ich mir ja auch eine zweite Referenz auf das gleiche Objekt erzeugen.
Ich möchte über eine Referenz das Objekt verändern und diese Änderung auch über die andere Referenz sehen.
Das ist mein Anliegen.

Gruß

Umberto
 

mahe

Aktives Mitglied
Gerade das ist mit Strings etwas blöde. Das String-Objekt kann man nämlich nicht mehr ändern wenn es mal angelegt ist. Wenn man ein Objekt allerdings über seine Methoden beeinflusst sehen dies selbstverständlich sämtliche Referenzen.

Z.B. mit einem StringBuffer geht das ganz einfach:
Code:
    public static void main(String[] args)
        {
            StringBuffer string_a = new StringBuffer("Blume ");
            StringBuffer string_b = string_a;

            System.out.println(string_a);
            System.out.println(string_b);

            System.out.println("-------");

            string_a.delete(0, string_a.length());
            string_a.append("Baum");

            System.out.println(string_a);
            System.out.println(string_b);
        }
 

tfa

Top Contributor
didjitalist hat gesagt.:
einfache antwort: geht mit primitiven nicht. und java.lang.String verhält sich genau wie ein primitiv.
Schlechte Antwort. Das hat überhaupt nichts miteinander zu tun!
 
S

SlaterB

Gast
'überhaupt nichts' ist genauso übertrieben wie der Vergleich vorher,

Unveränderlichkeit ist ein wesentliches gemeinsames Merkmal und sehr bedeutend für das hier erfragte Verhalten,
 

didjitalist

Bekanntes Mitglied
was umbcan72 grundsätzlich versucht ist, referenzen zu erzeugen und das unterstützt java schlicht nicht. man kann höchstens den zustand eines objekts verändern, was sich auf pointer auf dieses objekts natürlich auch auswirkt.

java kennt für alle primitive zwar wrapper klassen, aber diese wrapper sind alle final und immutable, verhalten sich also nach aussen genau wie primitive. und java.lang.String verhält sich ebenso.

dass java.lang.String sich wie ein primitiv verhält war erklärtes ziel der java entwickler.
 

tfa

Top Contributor
Die Ursache der Unveränderbarkeit von String und primitiven Typen haben wirklich nichts miteinander zu tun, ebenso wie ein grüner Frosch mit einem grünen Auto nichts zu tun hat.
 
S

SlaterB

Gast
kann man nicht bestreiten,
interessant ist übrigens auch die Sicht, dass die Ursache völlig egal sein kann,
die Sprache Java ist ja nur Syntax, könnte auch völlig anders implementiert sein, mit Objekten für int & Co. ;)

die Wirkung im Programm ist an mancher Stelle wichtiger
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben