Instanzen, Referenzen und Collections

Status
Nicht offen für weitere Antworten.
M

makkes

Gast
Guten Abend Allerseits !

Eigentlich programmiere ich schon seit fast drei Jahren immer wieder mal mit Java. Im Moment stehe ich aber *völlig* auf dem Schlauch. Ich mache gerade eine Erfahrung, die mein ganzes Weltbild in Sachen OO auf den Kopf stellt. Ich hoffe es ist ein Syntaxfehler. lol.

Folgender Code:

Java:
import java.util.ArrayList;

class Test{
	public static void main(String args[]){
		ArrayList<String> name = new ArrayList<String>();
		String fname = "FOO";
		String lname = "BAR";
		name.add(fname);
		name.add(lname);
		fname="JOHN";
		lname="DOE";
		System.out.println(name.get(0)+ " " +name.get(1));
	}
}

erzeugt die Ausgabe:

Java:
FOO BAR

sollte aber doch nach aller Theorie - nach der Java grundsätzlich mit Referenzen arbeitet erzeugen:

Java:
JOHN DOE

Oder objektorientiert gedacht, ändere ich doch die Stringinstanzen fname und lname, was sich dann auch in der Liste niederschlagen müsste.
In Ruby wäre es so:

Java:
name = "FOO"
array = [name]
name = "JOHN"
puts array
==> ["FOO"]

Was sinnvoll ist, da durch name = "JOHN" ein NEUES Objekt (Chararray) an die Variable name gebunden wird.
der Aufruf "JOHN" erzeugt das Chararray. Schreibe ich in Ruby stattdessen:

Java:
name = "FOO"
array = [name]
name[0..name.length]=""
name.concat("JOHN")       
puts array
==> ["JOHN"]

Passiert das Erwartete.

name[0..name.length]="" -- >löscht die Zeichen *im bestehenden* Chararray.

name.concat("JOHN") --> hängt an das jetzt leere Chararray die Zeichen JOHN. Intern wird dabei ein neues Array mit dem Inhalt JOHN erzeugt, durch concat werden diese 4 Chars aber wieder ins erste Array gepackt. Sinnvoll also. Etwas undurchsichtig, aber konsequent.

Ich dachte dann ich könnte mal probieren:
anstatt
Java:
fname="JOHN";
lname="DOE";

zu schreiben
Java:
fname.replace(fname,"JOHN");
lname.replace(lname,"DOE");

das gibt aber auch zurück:
Java:
FOO BAR


Verwirrt, durcheinander ? Ich auch !
 

Templon

Bekanntes Mitglied
Das liegt daran, dass du einfach die lokalen Referenzen "umbiegst". Dies beinflusst die Referenzen in der Liste nicht. Diese zeigen immer noch auf das erste Objekt. Hier noch ein wenig Code zur veranschaulichung:

[Java]
import java.util.ArrayList;

class Test{
public static void main(String args[]){
ArrayList<MyDataType> list = new ArrayList<MyDataType>();

MyDataType first = new MyDataType(10);
MyDataType second = new MyDataType(15);

list.add(first);
list.add(second);

first.setValue(100);
second.setValue(115);

first = new MyDataType(1000);
second = new MyDataType(1015);

System.out.println(list.get(0)+ " " +list.get(1));

// gibt nicht 1000 1015 aus sondern 100 115
}
}

class MyDataType {
private int value;

public MyDataType(int value) {
super();
this.value = value;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

@Override
public String toString() {
return String.valueOf(value);
}
}
[/Java]

[...]
zu schreiben
Java:
fname.replace(fname,"JOHN");
lname.replace(lname,"DOE");

Strings sind immutable, du musst folgendes schreiben:

Java:
fname = fname.replace(fname,"JOHN");
lname = lname.replace(lname,"DOE");

Das wiederum "biegt" aber wieder nur die lokalen Referenzen um. Also könntest du folgendes machen:

Java:
name.set(0, "John");
name.set(1, "Doe");
 
Zuletzt bearbeitet:
M

makkes

Gast
Hm. Ich hätte das so nicht erwartet. Aber nun gut.
Witzigerweise ist mir trotz einiger Projekte die ich in Java schon gemacht habe, dieser Sachverhalt noch nie aufgefallen. Im Regelfall kommen eben eher Konstrukte wie in Deinem Beispiel vor.
Ich wollte jetzt nur eben was testen, und war recht überrascht.

Danke auf jeden Fall !

Was macht eigentlich der super()-Konstruktor in Deinem Bsp? Den Object-Konstruktor aufrufen?
 

Marco13

Top Contributor
Hm ... Strings sind da aber schon Sonderfälle... Es sind zwar "normale" Objekte, werden aber Sprachintern gesondert behandelt. D.h. sowas...
Java:
        ArrayList<String> name = new ArrayList<String>();
        String fname = "FOO";
        name.add(fname);
        fname="JOHN";
bewirkt NICHT, dass "der String, der vorher 'FOO' enthielt, danach 'JOHN' enthält" - das geht schon nicht, weil Strings nicht veränderbar sind. Was dort steht ist von der Bedeutung her eher sowas wie
Java:
        ArrayList<String> name = new ArrayList<String>();
        String fname = "FOO";
        name.add(fname);
        fname= new String("JOHN"); // Ein neuer String
Man sollte Strings aber nicht mit "new String" erstellen - wie gesagt, das ist ein Sonderfall....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Referenzen zu Instanzen einer Klasse im Array Java Basics - Anfänger-Themen 8
G Speicherung von Referenzen auf Instanzen Java Basics - Anfänger-Themen 5
G Instanzen und Referenzen Java Basics - Anfänger-Themen 5
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
C Was machen mit nicht mehr verwendeten Instanzen ? Java Basics - Anfänger-Themen 18
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
M Alle Instanzen einer Klasse ansprechen Java Basics - Anfänger-Themen 4
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
Z Was habe ich davon mit einem Datentyp verschiedene Instanzen zu haben? Java Basics - Anfänger-Themen 6
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
S Direkt Instanzen anlegen Java Basics - Anfänger-Themen 1
K Variablen Instanzen gleich aber warum ? Java Basics - Anfänger-Themen 3
D Instanzen durch Methode Java Basics - Anfänger-Themen 14
W Zugriff auf Instanzen von Klassen Java Basics - Anfänger-Themen 8
S aus Text Datei Instanzen erzeugen, so richtig? Java Basics - Anfänger-Themen 4
O Liste aller Instanzen einer Klasse Java Basics - Anfänger-Themen 18
H Klassen Instanzen mit anderen Klassen erzeugen Java Basics - Anfänger-Themen 5
B Enum: Instanzen Java Basics - Anfänger-Themen 10
M Instanzen vergleichen? Java Basics - Anfänger-Themen 12
H Klassen, Konstruktoren, Instanzen etc Java Basics - Anfänger-Themen 6
W Instanzen, Klassen Java Basics - Anfänger-Themen 2
C Vectorarrays und Instanzen Java Basics - Anfänger-Themen 10
S alle instanzen einer klasse löschen Java Basics - Anfänger-Themen 18
C OOP Instanzen ansprechen Java Basics - Anfänger-Themen 3
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
B Zugriff auf Variablen in nicht bekannten Instanzen Java Basics - Anfänger-Themen 6
R mit klassen-instanzen arbeiten in packages Java Basics - Anfänger-Themen 10
A Mehrere Instanzen einer eigenen Klasse in einem Array Java Basics - Anfänger-Themen 5
W mehrere (numerierte) Instanzen erzeugen Java Basics - Anfänger-Themen 3
M Dynamisch Instanzen erstellen. Java Basics - Anfänger-Themen 4
N Instanzen von beliebigen Klassen aus dem Filesystem erzeugen Java Basics - Anfänger-Themen 7
M Problem mit Instanzen von JLabel Java Basics - Anfänger-Themen 4
E Vermeiden,dass mehrere Instanzen eines Java-Programms laufen Java Basics - Anfänger-Themen 2
V mehrere Instanzen gleicher Name möglich? Java Basics - Anfänger-Themen 3
E instanzen von Klassen erzeugen Java Basics - Anfänger-Themen 2
H Instanzen erzeugen und Methoden aufrufen Java Basics - Anfänger-Themen 5
L verschiedene JPanel-Instanzen erstellen Java Basics - Anfänger-Themen 8
K Eindeutige Instanzen von einem Objekt Java Basics - Anfänger-Themen 13
T Wo Daten ablegen für mehrere Servlet-Instanzen? Java Basics - Anfänger-Themen 2
G Instanzen in einem Feld erzeugen Java Basics - Anfänger-Themen 9
J Instanzen dynamisch erzeugen Java Basics - Anfänger-Themen 8
T Instanzen von abstrakten Klassen? Java Basics - Anfänger-Themen 14
D Instanzen einer Klasse Java Basics - Anfänger-Themen 6
G alle Instanzen einer Klasse serialisieren Java Basics - Anfänger-Themen 4
Silver-Blue mehrere Instanzen einer Klasse, trotz Random immer das Selbe Java Basics - Anfänger-Themen 7
W Instanzen herunterzählen Java Basics - Anfänger-Themen 7
S Instanzen Java Basics - Anfänger-Themen 4
G wenn auch schon oft gefragt (Konstruktor , Instanzen , usw) Java Basics - Anfänger-Themen 6
K Hab ich dass so richtig erklärt (Objekte und Referenzen)? Java Basics - Anfänger-Themen 5
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
B JaxB - Unique Name updaten / Referenzen in XML Java Basics - Anfänger-Themen 0
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
B JaxB - Referenzen erstellen? Java Basics - Anfänger-Themen 2
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
B Datenbank: Entity mit vielen Referenzen? Ansatz so ok? Java Basics - Anfänger-Themen 8
scratchy1 Referenzen Java Basics - Anfänger-Themen 32
O Referenzen Java Basics - Anfänger-Themen 2
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
A Variablen Referenzen Java Basics - Anfänger-Themen 6
A GUI-Bedienelemente mit Zeiger/Referenzen-Array veralten Java Basics - Anfänger-Themen 4
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
F Referenzen zwischen Methoden Java Basics - Anfänger-Themen 5
T Klassen Referenzen auf Klassen / Objekte Java Basics - Anfänger-Themen 5
J OOP Ein Fahrrad - zwei Besitzer: Zwei Referenzen auf ein Objekt Java Basics - Anfänger-Themen 43
K Collections Auf Referenzen in ArrayList zugreifen? Java Basics - Anfänger-Themen 3
B ArrayList.clear - Daten in allen Referenzen weg Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
C OOP Referenzen-Problem Java Basics - Anfänger-Themen 3
N Referenzen Problem Java Basics - Anfänger-Themen 2
K Referenzen - 2ter Versuch Java Basics - Anfänger-Themen 17
C Referenzen in Java Java Basics - Anfänger-Themen 11
J Referenzen vergleichen Java Basics - Anfänger-Themen 8
M Referenzen verschieben Java Basics - Anfänger-Themen 2
J Mehrere Referenzen auf ein Objekt Java Basics - Anfänger-Themen 6
M Referenzen Java Basics - Anfänger-Themen 11
G Netzwerk: RMI Objekt-Referenzen Java Basics - Anfänger-Themen 2
I clone() und Referenzen Java Basics - Anfänger-Themen 25
A Referenzen zu festen Werten machen? Java Basics - Anfänger-Themen 5
F Referenzen Java Basics - Anfänger-Themen 7
H Problem mit Events bzw. Referenzen Java Basics - Anfänger-Themen 4
M Zugriff auf Textfelder über Referenzen? Java Basics - Anfänger-Themen 3
F ArrayList! Pointer, Referenzen! Java Basics - Anfänger-Themen 4
K Verständnisfrage Collection, ArrayList und Referenzen Java Basics - Anfänger-Themen 4
H Begriff: Objekt enthält Referenzen Java Basics - Anfänger-Themen 3
J Referenzen Java Basics - Anfänger-Themen 5
P HashSet und Referenzen Java Basics - Anfänger-Themen 9
T Referenzen. Java Basics - Anfänger-Themen 5
Z Referenzen in LinkedList Java Basics - Anfänger-Themen 3
F Referenzen in Java - Fehlerpotenzial ! Java Basics - Anfänger-Themen 5
G array auf null-referenzen überprüfen ! Java Basics - Anfänger-Themen 9
G Referenzen Java Basics - Anfänger-Themen 5
U Sortierung in collections testen Java Basics - Anfänger-Themen 11
X Collections.sort als Lambda Java Basics - Anfänger-Themen 14
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben