Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Java: String Objekt (https://www.delphipraxis.net/137568-java-string-objekt.html)

Antigo 23. Jul 2009 15:02


Java: String Objekt
 
Hi,
schreibe am Montag ne Klausur in Objekt Orientierter Programmieren in Java und kenne leider kein Java Forum, hoffentlich kann mir trotzdem jemand weiterhelfen.

Es geht um folgendes. Methodenaufrufe sind in Java ja ausschließlich Call by Value. Da bis auf die elementaren Datentypen alle Datentypen Objekte sind und man bei einem Methodenaufruf daher immer eine Referenzvariable übergibt hat man im Prinzip dann aber doch Call by Reference und kann in einer Methode ein Objekt so verändern, dass ausserhalb der Methode die Änderungen auch wirksam sind (da man ja auf dem Objekt arbeitet).

So jetzt gehört String aber nicht zu den elementaren Datentypen, sondern ist eine Klasse. Deshalb dachte ich eigentlich, wenn ich einen String an eine Methode übergebe und ihn dort verändere, so ändere ich ja etwas am String Objekt und wenn ich jetzt ausserhalb der Methode darauf zugreife sind die Änderungen dort ebenso wirksam gewesen.

Hab das ganze dann einmal mit der Standard String Klasse, und einmal mit einer eigenen ausprobiert:

Delphi-Quellcode:
class MyString{
   String str;
}

public class Test {
   
   static void manipulate(String a){
      a="LOL";
   }
   
   static void manipulate(MyString a){
      a.str="LOL";
   }
   
   public static void main(String[] args){
      String test=new String("Hallo");
         manipulate(test);
      System.out.println(test);
      
      MyString test1=new MyString();
      test1.str="Hallo";
      manipulate(test1);
   System.out.println(test1.str);
   }
}
Nur ist es so, dass das erste println "Hallo" ausgibt, das zweite aber wie erwartet "LOL". Kann mir jemand diese Sonderstellung des String Objektes erklären?


edit: Ich glaub ich habs schon gefunden. Mit a="LOL"; erzeuge ich ja ein neues String Objekt auf das die Referenzvariable a zeigt. Diese ist aber nur eine Kopie der Referenzvariable die auf Test zeigt (Call by Value eben), so dass sich ausserhalb der Methode natürlich nichts verändert.
Hatte das ganze auch mit a.concat("..."); probiert, also dem String etwas anzuhängen versucht, aber wie ich grad gelesen hab wird dabei auch nur ein neuer String zurückgegeben und nicht der alte verändert.

Toll wie es manchmal hilft sein Problem in nem Forum zu posten nur um es dann 2 Minuten später selbst zu lösen ;)

fkerber 23. Jul 2009 15:31

Re: Java: String Objekt
 
Hi!

Deine Erklärung trifft es an sich ganz gut.
Als weiteres Stichwort für Google o.ä. sei gesagt: String in Java ist immutable

Auch hier könntest du noch nachlesen (allgemein sehr gut für Java-Fragen):
http://openbook.galileocomputing.de/...sel_04_002.htm


Grüße, Frederic

mjustin 23. Jul 2009 15:49

Re: Java: String Objekt
 
Das hier erzeugt unnötige String Objekte:
Delphi-Quellcode:
String test=new String("Hallo");
ein paar Zeilen weiter ist es dann aber richtig gemacht, der Java-Compiler erkennt Strings im Quelltext einfach an den Anführungszeichen:
Delphi-Quellcode:
test1.str="Hallo";
Siehe z.B. in "Effective Java" oder unter http://stackoverflow.com/questions/3...ew-stringsilly

Cheers,


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz