Deklaration und Definition

icarus2

Top Contributor
Huhu

Das scheint jetzt vielleicht eine etwas merkwürdige Frage zu sein, aber ein Thread in einem anderen Forum hat mich gerade verwirrt.

Da hat einer folgendes gesagt:

Java:
String name;    // Hiermit definierst du eine Reference (vom Typ String). 

name = "hallo"; // Hiermit definierst du ein Objekt (vom Typ String), und lässt dann die Reference darauf verweisen.

Ist das korrekt? :-/
 
Kann man so sagen, wobei das beim String ein wenig komplizierter ist.
Beim zweiten würde ich aber eher sagen: Hiermit erstellst du ein Objekt...
 
Hmm, für mich ist das erste eine Deklaration. Aber ich bin auf einmal unsicher geworden, weil man Strings ja nicht mit 'new' erzeugt.
 
muss man bei String nicht..
aber du darfst das machen:

Code:
String s = new String("hallo");

String s; deklariert eine variable von typ String
s = "hallo"; die referenz s von typ string zeigt auf einen String.. ich glaube mann kan auch sagen dass die referenz s auf die anfangs adresse eines char-arrays zeigt...
 
Ich glaube, eine Unterscheidung zwischen Deklaration und Definition macht nur Sinn, wenn dort ein Unterschied besteht (wie etwa bei C, mit Funktionsdeklarationen in Headerfiles und den Definitionen in den C files). In Java heißen die Dinger eigentlich "Variable Declaration Statements".


Die Formulierung dass bei
String s = "Hallo";
ein Objekt erstellt wird, ist ein bißchen fragwürdig. Strings sin da ein bißchen diffizil: Das String-Objekt wird dort nicht "erzeugt". Es ist vielmehr schon da. Strings liegen in einem Pool, und der wird... glaubich... schon vom ClassLoader gefüllt...(bei letzterem bin ich nicht 100% sicher, aber ... wo sonst?)
 
Die Formulierung dass bei
String s = "Hallo";
ein Objekt erstellt wird, ist ein bißchen fragwürdig. Strings sin da ein bißchen diffizil: Das String-Objekt wird dort nicht "erzeugt". Es ist vielmehr schon da. Strings liegen in einem Pool, und der wird... glaubich... schon vom ClassLoader gefüllt...(bei letzterem bin ich nicht 100% sicher, aber ... wo sonst?)

ja? das würde mich aber mal genauer interessieren. afaik liegt nur jedes stringliteral im pool, welches zur Laufzeit der jvm schomal erzeugt wurde (vorausgesetzt es existiert eine referenz bzw der gc hat noch die finger davon gelassen). deshalb ist es auch imho besser strings immer mit literalen zu instanziieren, weil bei "new String();" diese optimierung der jvm nicht mehr gegeben ist.
 
ja? das würde mich aber mal genauer interessieren. afaik liegt nur jedes stringliteral im pool, welches zur Laufzeit der jvm schomal erzeugt wurde.

Ja, wie schon angedeutet, bei diesem Punkt bin ich mir nicht 100% sicher - allgemein eben die Frage, wie und wo der String-Pool verwaltet wird - und im speziellen, wie festgestellt wird, was daraus wieder gelöscht werden kann, und ob konstante Strings (die so im Classfile stehen) dort überhaupt wieder rausgelöscht werden. Jedenfalls stehen die konstanten Strings ja im Classfile, und wenn das einmal geladen ist, wird da mit Sicherheit kein String wieder rausgelöscht. Im Stringpool steht dann (ganz wild spekuliert und grob forumliert) vermutlich nur eine Referenz auf den String, der eh schon im runtime constant pool der Class-Daten liegt... vermutlich ... das müßte man sich mal genauer ansehen....
 

Zurück
Oben