Java Frage zur Argumentübergabe

violentviper

Lt. Commander
Registriert
Mai 2008
Beiträge
1.838
Hallo,
ich hab eine Java Verständnisfrage zu der Argumentübergabe bei folgendem Beispielcode.

Code:
public class StringBuilder {
	
	public static void puts ( Object o ) {
	String str = o.toString ();
	System.out.println ( str.length() + " : " + str);
    }

    public static void main (String... args) {

	
	StringBuilder s1 = new StringBuilder ();

	
	puts ( s1 );

	
	puts ( "Capacity " + s1.capacity()  );                                               // Hier ist das was ich nicht verstehe
        puts( "Capacity" + "Gedöns" + "Nochmehr Gedöns"+ 1337  + s1.capacity() );           //^^

	}

Warum kann man in Zeile 18 und 19, mehrere Argumente übergeben, obwohl die selbstgeschriebene Methode puts doch nur ein Argument o vom Typ Object besitzt? Hier kommt jedoch kein Fehler, ich kann beliebig viele andere Argumente mit reinschreiben.

Liegt das an dem Object ?

Habe ich so noch nie gesehen und finde auf die schnelle auch nichts dazu.
 
Zuletzt bearbeitet:
Du übergibst ja auch nur ein Argument. Die zeichenketten werden als erstes verbunden (das macht der + Operator) und dann ist nur noch eine Zeichenkette übrig die übergeben wird. Also ist es auch nur ein Objekt/Argument das übergeben wird. Mehrere Argumente würden man mit Komma trennen

Stells dir mathematisch vor: das in der Klammer wird zuerst gemacht. Wenn das abgeschlossen ist wird das Ergebnis (hier EINE Zeichenkette) an die Methode übergeben
 
Im Endeffekt setzt du ein Stringobjekt als Übergabeparameter ein.
Das + dient sozusagen als "concat" und alles wird aneinandergehängt.

Ups, zu spät! Wurde ja bereits gesagt :)
 
ach ja das was soares gesagt hat ist falsch, hat mit deinem Code nichts zu tun
 
Wie rg88 schon beschrieben hat, wird mit dem "+" ein einziger String erstellt, der dann als Argument übergeben wird. Also übergibst du nicht "mehrere" Strings, sondern nur einen einzigen (der dann natürlich von der Methode akzeptiert wird).
 
rg88 schrieb:
Du übergibst ja auch nur ein Argument. Die zeichenketten werden als erstes verbunden (das macht der + Operator) und dann ist nur noch eine Zeichenkette übrig die übergeben wird. Also ist es auch nur ein Objekt/Argument das übergeben wird. Mehrere Argumente würden man mit Komma trennen

Stells dir mathematisch vor: das in der Klammer wird zuerst gemacht. Wenn das abgeschlossen ist wird das Ergebnis (hier EINE Zeichenkette) an die Methode übergeben


Danke, nun kann ich es nachvollziehen.
Ich habe es gerade noch mal der Verständnis halber getestet, mit einem "," bringt er mir dann den "gewünschten" Fehler.
 
Sobald du ein "+" drin hast, wird alles was folgt zum String gewandelt.
Einige schreiben auch öfter mal

"" + 123

um etwas zum String zu machen. Gilt also nicht nur bei puts.

Lerneffekt:
Bei vielen + sollte man aber einen Buffer nehmen, da Strings aufwändig sind und jedes mal umkopiert werden müssen ! Man kann einen kurzen String nicht einfach in einen längeren umwandeln, man erstellt einen großen wo beide reinpassen und kopiert den Kram dort rein.
 
Zuletzt bearbeitet von einem Moderator:
rob- schrieb:
Lerneffekt:
Bei vielen + sollte man aber einen Buffer nehmen, da Strings aufwändig sind und jedes mal umkopiert werden müssen ! Man kann einen kurzen String nicht einfach in einen längeren umwandeln, man erstellt einen großen wo beide reinpassen und kopiert den Kram dort rein.

Das machen die heutigen Java-Compiler automatisch. Siehe auch: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1

To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression.

Der Oracle Java 7 Compiler beispielsweise wandelt alle +-Konkatenationen in ein StringBuilder-Konstrukt um. StringBuffer werden eigtl. nur noch benötigt, wenn synchronized eine Rolle spielt. Siehe Doku von StringBuilder:

This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.
 
Zurück
Oben