Klassen Objekt der Klasse String

proteus

Mitglied
Hallo Zusammen,

Ich bin neu in diesem Forum und möchte erstmal alle recht herzlich begrüssen und mich im Voraus für die Mühe bedanken, die ihr euch macht.

Ich bin gerade dabei mich in die Programmiersprache Java einzuarbeiten. Dabei erstelle ich eine Zusammenfassung des gelernten, denn was ich in eigenen Worten ausdrücken kann, habe ich auch verstanden 🙂

So, nun zu meiner Frage:

In folgendem Beispiel wird ein neues Objekt str definiert.


Java:
class Demo
{
  public static void main ( String[] args )
  {
    String str ;

    str = new String( "Ein Stringobjekt erzeugen" );
  }
}


Was genau bewirkt in Zeile 7 "new String" ? Ist die Variable str nicht schon automatisch der Klasse java.lang.String zugewiesen, da dies schon in Zeile 5 definiert wurde?

Wenn Zeile 7 zu

Code:
str = "Ein Stringobjekt erzeugen" ;

geändert wird, bekomme ich genau dieselbe Ausgabe.

Hoffe, dass mir das jemand erklären kann.

Schöne Grüsse
 
Hallo Zusammen,

Ich bin neu in diesem Forum und möchte erstmal alle recht herzlich begrüssen und mich im Voraus für die Mühe bedanken, die ihr euch macht.
Wow, das ist ja mal ein schöner erster Post. Herzlich Willkommen! 🙂

Was genau bewirkt in Zeile 7 "new String" ? Ist die Variable str nicht schon automatisch der Klasse java.lang.String zugewiesen, da dies schon in Zeile 5 definiert wurde?
Du musst unterscheiden zwischen Objekt und Variable. "str" ist eine Variable. Und zwar eine lokale Variable, d.h. sie hat bei ihrer Deklaration noch keinen Wert. Das "String" bei der Deklaration sagt nur aus, dass du Strings darin abspeichern kannst (und nicht z.B. Zahlen oder sonst etwas).
new String() ist ein Konstruktor-Aufruf, der ein String-Objekt erzeugt. Dieses Objekt speicherst du in der Variable ab*

*Stimmt so nicht wirklich. Du speicherst eigentlich nur eine Referenz, aber das würde an dieser Stelle zu weit gehen.

Wenn Zeile 7 zu
Code:
str = "Ein Stringobjekt erzeugen" ;
geändert wird, bekomme ich genau dieselbe Ausgabe.

Das ist eine Eigenart von Strings: Du kannst sie ohne Konstruktor erzeugen. Auch hier gibt es einen kleinen aber feinen Unterschied (Stichwort: String Constant Pool), der für den Anfang für dich erstmal nicht so wichtig ist.

edit: Natürlich kann ich dir das alles noch genauer erklären, falls gewünscht. Aber für's erste würde es imho reichen wenn du den Unterschied zwischen einer Variablen-Deklaration und der Erzeugung eines Objekts und Zuweisung zu der Variablen verstehst.
 
Wow, vielen Dank für die vielen Antworten.....

Du musst unterscheiden zwischen Objekt und Variable. "str" ist eine Variable. Und zwar eine lokale Variable, d.h. sie hat bei ihrer Deklaration noch keinen Wert. Das "String" bei der Deklaration sagt nur aus, dass du Strings darin abspeichern kannst (und nicht z.B. Zahlen oder sonst etwas).

Ok, um nochmals sicher zu stellen, dass ich das jetzt richtig verstehe.

Code:
String str;
sagt nur, dass die Variable "str" eine Zeichnkette sein darf, soweit noch klar

Code:
str = "Ein Stringobjekt erzeugen" ;
weist der Variable "str" den Wert "Ein Stringobjekt erzeugen" zu. Soweit immer noch klar.

Code:
str = new String( "Ein Stringobjekt erzeugen" ) ;
In diesem Beispiel wird erst wirklich ein Objekt erzeugt, welches der Variable "str" zugewiesen wird. Respektive wird eine Referenz zur Klasse java.lang.String hergestellt.

Der Unterschied wäre dann, dass mit "new String" ein Objekt erzeugt wird, welches Daten und Mehoden enthalten kann. Mit "String str;" jedoch nur definiert wird, dass es sich um eine Zeichenkette handelt. Ist das richtig so?

Das ganze würde dann bedeuten, dass dieses Beispiel nicht gerade gut ist um die Erzeugung eines Objektes darzustellen, da "String" sowieso ein Spezialfall ist und ohne Konstruktor erzeugt werden kann.

new String() findest du kaum in ernsthaften Lehrbüchern, oder doch?
ist also weitgehend nutzlos bei Strings, erstellt eine Kopie

Ich arbeite mit einem Tutorial und einem Buch:

Java Tutorial:
Java Tutorial interaktiv - Programmieren lernen mit Java

Java ist auch eine Insel:
Galileo Computing :: Java ist auch eine Insel –

Java ist auch eine Insel ist ein wirklich gutes Buch, jedoch für den Einstieg viel zu komplex. Wenn man noch nie zuvor etwas mit einer Programmiersprache zu tun hatte, ist es damit fast nicht machbar.
Das Tutorial ist sehr gut, da es alles von Anfang an sehr verständlich erklärt und man auch nicht gleich mit Informationen überladen wird. (Jedoch befindet sich dieses Beispiel darin 🙂 )
 
Code:
str = "Ein Stringobjekt erzeugen" ;
weist der Variable "str" den Wert "Ein Stringobjekt erzeugen" zu. Soweit immer noch klar.

Code:
str = new String( "Ein Stringobjekt erzeugen" ) ;
In diesem Beispiel wird erst wirklich ein Objekt erzeugt, welches der Variable "str" zugewiesen wird. Respektive wird eine Referenz zur Klasse java.lang.String hergestellt.

Java hat die Spezialität, dass mit "..." im Code ein neues Stringobjekt erzeugt wird. Im zweiten Fall wird einfach noch ein neues Objekt erstellt. Es macht überhaupt keinen Unterschied.
Siehe Post von hdi:
Das ist eine Eigenart von Strings: Du kannst sie ohne Konstruktor erzeugen. Auch hier gibt es einen kleinen aber feinen Unterschied (Stichwort: String Constant Pool), der für den Anfang für dich erstmal nicht so wichtig ist.
Man soll in Java (in den Normalfällen) [c]new String(...)[/c] nicht verwenden. Siehe "String Constant Pool".
 
> Das ganze würde dann bedeuten, dass dieses Beispiel nicht gerade gut ist um die Erzeugung eines Objektes darzustellen, da "String" sowieso ein Spezialfall ist und ohne Konstruktor erzeugt werden kann.

absolut, wobei das nur der Compiler in besonderer Schreibweise erlaubt und ersetzt,
kein Java-mäßig gibt es da eher keine Sonderstellung, eine Klasse ist eine Klasse und String noch relativ normal

Arrays sind noch schlimmere Sonder-Klassen..
 
Code:
String str;
sagt nur, dass die Variable "str" eine Zeichnkette sein darf, soweit noch klar
Genau. Im Falle von lokalen Variablen ist da noch nix drin, d.h. du kannst auch nicht lesend darauf zugreifen bevor du nicht etwas zugewiesen hast. Bei Klassen- oder Instanz-Variablen ist der Wert anfangs "null", was mehr oder weniger auch nichts ist.


Der Unterschied wäre dann, dass mit "new String" ein Objekt erzeugt wird, welches Daten und Mehoden enthalten kann. Mit "String str;" jedoch nur definiert wird, dass es sich um eine Zeichenkette handelt. Ist das richtig so?
Nein, beide Varianten erzeugen ein String-Objekt. Der Unterschied liegt darin dass bei der Direkt-Erzeugung ohne Konstruktor der String Constant Pool (bitte googlen) herangezogen wird, und bei Verwendung des Konstruktors auf jeden Fall ein neues Objekt erzeugt wird.

edit: ups sorry, verlesen. Ich dachte du meintest str = "Text". Ja wie gesagt, String str; ist nur eine Variablen-Deklartion, kein String-Wert bzw -Objekt.


Das ganze würde dann bedeuten, dass dieses Beispiel nicht gerade gut ist um die Erzeugung eines Objektes darzustellen, da "String" sowieso ein Spezialfall ist und ohne Konstruktor erzeugt werden kann.
Ja, genau. Strings sind spezielle Objekte in vielerlei Hinsicht. Besser du übst das ganze mit einer eigenen einfachen Klasse.


Java ist auch eine Insel ist ein wirklich gutes Buch, jedoch für den Einstieg viel zu komplex. Wenn man noch nie zuvor etwas mit einer Programmiersprache zu tun hatte, ist es damit fast nicht machbar.
Das Tutorial ist sehr gut, da es alles von Anfang an sehr verständlich erklärt und man auch nicht gleich mit Informationen überladen wird. (Jedoch befindet sich dieses Beispiel darin 🙂 )
Schau mal in meine Signatur..
 
Zuletzt bearbeitet:

Zurück
Oben