Discussion:
Zeiger in Java
(zu alt für eine Antwort)
Martin Feltes
2004-05-06 07:27:32 UTC
Permalink
Hallo,
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Ich brauche diese für einen Vortrag in der Schule.
Vielen Dank schonmal...
mfg,
Martin Feltes
Stefan Matthias Aust
2004-05-06 07:30:04 UTC
Permalink
Post by Martin Feltes
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Ich brauche diese für einen Vortrag in der Schule.
Gerne. Es gibt keine Zeiger (so wie man sie z.B. in C kennt) in Java.
(Und nein, ich antworte jetzt nicht auf die Diskussion "Aber Objekte
werden doch über Referenzen implementiert und die sind doch auch wie
Zeiger" denn sie sind es nicht, da man etwa keinen "&" oder "*"-Operator
für Zeiger in Java hat)


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Tor-Einar Jarnbjo
2004-05-06 08:28:05 UTC
Permalink
Post by Stefan Matthias Aust
werden doch über Referenzen implementiert und die sind doch auch wie
Zeiger" denn sie sind es nicht, da man etwa keinen "&" oder "*"-Operator
für Zeiger in Java hat)
Und man hat in C keine Strings, da man keinen +-Operator hat, um Strings
aneinanderzuhängen?

Sogar im "offiziellen" Java-Sprachgebrauch wird ja wirr umeinander über
Referenzen und Zeiger in der gleichen Bedeutung gesprochen. Es gibt z.B.
Reference-Klassen, um Referenzen abzubilden, aber eine NullPointerException
um zu melden, dass versucht wurde einen Null-Zei... eeh -Referenz(?)
aufzulösen.

Gruß, Tor
Stefan Matthias Aust
2004-05-06 08:44:22 UTC
Permalink
Post by Tor-Einar Jarnbjo
Und man hat in C keine Strings, da man keinen +-Operator hat, um Strings
aneinanderzuhängen?
Es gibt keinen String-Datentyp in C. Das ist von dem +-Operator
unabhängig. An dem &-Operator lässt sich bei Zeigern nur am einfachsten
deren Semantik festmachen.
Post by Tor-Einar Jarnbjo
Sogar im "offiziellen" Java-Sprachgebrauch wird ja wirr umeinander über
Referenzen und Zeiger in der gleichen Bedeutung gesprochen.
So what. Die NullPointerException hat einen falschen Namen. Das sollte
doch wohl hinlänglich bekannt sein. In C# heißt das Gegenstück glaube
ich NullReferenceException und eigentlich wäre es eine
MissingObjectException.


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Oliver Hittmeyer
2004-05-06 14:04:36 UTC
Permalink
Post by Stefan Matthias Aust
Post by Tor-Einar Jarnbjo
Und man hat in C keine Strings, da man keinen +-Operator hat, um
Strings aneinanderzuhängen?
Es gibt keinen String-Datentyp in C. Das ist von dem +-Operator
unabhängig. An dem &-Operator lässt sich bei Zeigern nur am einfachsten
deren Semantik festmachen.
Post by Tor-Einar Jarnbjo
Sogar im "offiziellen" Java-Sprachgebrauch wird ja wirr umeinander
über Referenzen und Zeiger in der gleichen Bedeutung gesprochen.
So what. Die NullPointerException hat einen falschen Namen. Das sollte
doch wohl hinlänglich bekannt sein. In C# heißt das Gegenstück glaube
ich NullReferenceException und eigentlich wäre es eine
MissingObjectException.
bye
so what - wann lernen die Leutz, dass "Zeiger (nicht) haben" und
"Zeigerarithmetik (nicht) haben" zweierlei Dinge sind...

Java hat Zeiger, denn eine Referenz ist (ganz grundlegend nichts anders
naemlich eine (Platzhalter-)Variable (wohl um die 4Byte [32bit]), welche
auf eine bestimmte Speicheraddresse zeigt/referenziert/verweist (Punkt).

Was Java nicht hat ist Zeigerarithmetik - aber das wurde ja auch gar
nicht gefragt
Stefan Matthias Aust
2004-05-06 14:53:41 UTC
Permalink
Post by Oliver Hittmeyer
Java hat Zeiger, denn eine Referenz ist
Nein. So kann man das implementieren und vielleicht hat eine
JVM-Implementation zeiger benutzt, aber die Sprache Java hat keine Zeiger.

Und als Beispiel, dass man es nicht mit Zeigern implementieren muss...

Woran glauben wir überhaupt zu erkennen, dass Java Referenzen benutzt?
Ich kann ein und das selbe Objekt in mehrere Variablen packen und wenn
ich das in einer Variablen "referenzierte" Objekt ändere, dann hat es
sich auch in der anderen geändert. Wir vermuten daher, das beide
Variablen das selbe identische Objekt enthalten, also das selbe Objekt
referenzieren. Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.

Dies ist aber nur eine mögliche Sichtweise. Variablen kann man
genausogut als Namen für Objekte auffassen. Somit kann ich einem Objekt
mehrere Namen geben und es unter diesen verschiedenen Namen ansprechen.
Funktioniert auch mit Menschen: "Susi" und "Schnuckelmäuschen" wären
zwei mögliche Namen für die selbe Person. Sind das Referenzen auf
Menschen? Würde man so nicht nennen.

Die zweite Sichtweise halte ich für die bessere und würde daher immer
Sagen, es gibt weder Zeiger noch Referenzen, sondern nur Objekte.


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Oliver Hittmeyer
2004-05-06 15:11:38 UTC
Permalink
Post by Stefan Matthias Aust
Post by Oliver Hittmeyer
Java hat Zeiger, denn eine Referenz ist
Nein. So kann man das implementieren und vielleicht hat eine
JVM-Implementation zeiger benutzt, aber die Sprache Java hat keine Zeiger.
machen wir uns doch nichts vor:

ich verwende (z.B. unter C) einen Zeiger, um auf ein beliebiges
Konstrukt (z.B.) ein Objekt an einer anderen Speicheraddresse zu
verweisen...

ich verwende unter Java eine Referenz, um auf ein Objekt an einer
anderen Speicheraddresse zu verweisen...

Zeiger und Referenzen sind also eigentlich "Verweise"...

und jetzt kommt mir noch der Handler in den Sinn (Referenz? Zeiger?)
welchen ich benoetige um ein beliebiges Konstrukt zu "handeln"...

der Rest ist einfaches Naming
Post by Stefan Matthias Aust
Und als Beispiel, dass man es nicht mit Zeigern implementieren muss...
Woran glauben wir überhaupt zu erkennen, dass Java Referenzen benutzt?
Ich kann ein und das selbe Objekt in mehrere Variablen packen und wenn
ich das in einer Variablen "referenzierte" Objekt ändere, dann hat es
sich auch in der anderen geändert. Wir vermuten daher, das beide
Variablen das selbe identische Objekt enthalten, also das selbe Objekt
referenzieren.
Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.
im obigen Falle (zwei Referenzen auf dasselbe Object) empfehle ich
Dir aber eher die equals()-Methode, sonst kriegst Du naemlich false


...und wenn ich zwei Zeiger(-Variablen) auf dieselbe Speicherstelle
verweisen lasse, und anschliessend die Speicheraddresse veränder
(sprich: einen Wert hinschreiben), dann kriege ich mit *zeigervariable
ueber _beide_ Zeiger die Änderung mit

so what - wo ist das Argument?
Post by Stefan Matthias Aust
Dies ist aber nur eine mögliche Sichtweise. Variablen kann man
genausogut als Namen für Objekte auffassen. Somit kann ich einem Objekt
mehrere Namen geben und es unter diesen verschiedenen Namen ansprechen.
Funktioniert auch mit Menschen: "Susi" und "Schnuckelmäuschen" wären
zwei mögliche Namen für die selbe Person. Sind das Referenzen auf
Menschen? Würde man so nicht nennen.
ich steig da nicht durch?? - wenn wir Objekten Namen geben, dann sollte
man das doch nicht ueber die Variablen-Namen machen sondern vielleicht
ueber Person.name bzw. Person.spitzname;
Post by Stefan Matthias Aust
Die zweite Sichtweise halte ich für die bessere und würde daher immer
Sagen, es gibt weder Zeiger noch Referenzen, sondern nur Objekte.
die zweite Sichtweise halte ich "im Sinne der Objektorientierung" fuer
misslungen - bei der prozeduralen Programmierung fuer geeignet...

Fakt ist allerdings, dass Dir selbst Java den Zugriff direkt auf Objekte
nicht gestattet - dafuer gibts naemlich die Handler, aeh Referenzen,
aeh Zeiger


Gruss
michael paap
2004-05-06 15:53:09 UTC
Permalink
Post by Oliver Hittmeyer
im obigen Falle (zwei Referenzen auf dasselbe Object) empfehle ich
Dir aber eher die equals()-Methode, sonst kriegst Du naemlich false
Nein. Wie Kommst Du denn darauf?

Gruß,
Michael
--
Die Adresse im From existiert, wird aber nicht gelesen. Daher:
Sollte ausnahmsweise eine Mail-Antwort auf ein Posting vonnöten sein,
bitte folgende Adresse verwenden: newsreply@<Absender-Domain>.
Patrick Roemer
2004-05-06 16:23:41 UTC
Permalink
Post by Oliver Hittmeyer
ich verwende unter Java eine Referenz, um auf ein Objekt an einer
anderen Speicheraddresse zu verweisen...
Wieso 'Speicheradresse'? Davon ist in der JLS nirgends die Rede, und
selbst, wenn man davon ausgeht, dass ein Objekt an einer solchen sitzt,
gibt es keine Moeglichkeit, das unabhaengig von einer bestimmten
VM-Implementierung zu betrachten, also z.B. diese Adresse herauszufinden
oder die Form, in der das Objekt dort abgelegt ist, zu analysieren. Das
Konzept gibt es schlicht in Java nicht.
Post by Oliver Hittmeyer
Post by Stefan Matthias Aust
Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.
im obigen Falle (zwei Referenzen auf dasselbe Object) empfehle ich
Dir aber eher die equals()-Methode, sonst kriegst Du naemlich false
Nein.
Post by Oliver Hittmeyer
Post by Stefan Matthias Aust
Dies ist aber nur eine mögliche Sichtweise. Variablen kann man
genausogut als Namen für Objekte auffassen. Somit kann ich einem Objekt
mehrere Namen geben und es unter diesen verschiedenen Namen ansprechen.
Funktioniert auch mit Menschen: "Susi" und "Schnuckelmäuschen" wären
zwei mögliche Namen für die selbe Person. Sind das Referenzen auf
Menschen? Würde man so nicht nennen.
ich steig da nicht durch?? - wenn wir Objekten Namen geben, dann sollte
man das doch nicht ueber die Variablen-Namen machen sondern vielleicht
ueber Person.name bzw. Person.spitzname;
'Objektbenennungen' sind einfach eine moegliche abstrakte Sichtweise auf
Referenzen, die ohne so Sachen wie Speicheradressen auskommt.

String a="foo";
String b=a;

Eine Sichtweise: Zwei Zeiger, die auf dieselbe Speicherstelle verweisen.
Andere Sichtweise: Ein Objekt mit zwei Namen.

boolean x=(a==b);

Eine Sichtweise: Die Werte zweier Zeiger werden verglichen. Da sie auf
dieselbe Speicherstelle verweisen, kommt true raus.
Andere Sichtweise: Zwei benannte Objekte werden verglichen. Da es sich
bei beiden um dasselbe Objekt handelt, kommt true raus.

Die andere Sichtweise funktioniert wunderbar und kommt auch sehr bequem
mit der Parameteruebergabe klar, wo bei der ersten Sichtweise erst mal
'Referenzen werden by value und nicht by reference uebergeben'
abgefruehstueckt werden muss.

Viele Gruesse,
Patrick
Oliver Hittmeyer
2004-05-06 16:43:24 UTC
Permalink
Post by Patrick Roemer
Post by Oliver Hittmeyer
ich verwende unter Java eine Referenz, um auf ein Objekt an einer
anderen Speicheraddresse zu verweisen...
Wieso 'Speicheradresse'? Davon ist in der JLS nirgends die Rede, und
selbst, wenn man davon ausgeht, dass ein Objekt an einer solchen sitzt,
gibt es keine Moeglichkeit, das unabhaengig von einer bestimmten
VM-Implementierung zu betrachten, also z.B. diese Adresse herauszufinden
oder die Form, in der das Objekt dort abgelegt ist, zu analysieren. Das
Konzept gibt es schlicht in Java nicht.
Post by Oliver Hittmeyer
Post by Stefan Matthias Aust
Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.
im obigen Falle (zwei Referenzen auf dasselbe Object) empfehle ich
Dir aber eher die equals()-Methode, sonst kriegst Du naemlich false
Nein.
*upsas* - hab ich mich doch hinreissen lassen :(

natuerlich 'Nein' - ist aber "doof", schliesslich habe ich
mit a = new Object(); b = a zwei verschiedene Referenzen, die halt
auf das selbe Objekt zeigen/referenzieren...verweisen

also sollte eigentlich (a == b) -> false sein...
nur a.equals(b) waere rein logisch true

Gruss
michael paap
2004-05-06 17:06:25 UTC
Permalink
Post by Oliver Hittmeyer
natuerlich 'Nein' - ist aber "doof", schliesslich habe ich
mit a = new Object(); b = a zwei verschiedene Referenzen, die halt
auf das selbe Objekt zeigen/referenzieren...verweisen
also sollte eigentlich (a == b) -> false sein...
nur a.equals(b) waere rein logisch true
Nein. Und das ist auch nicht doof.

Der Operator == deint genau dazu, festzustellen, ob zwei Referenzen
dasselbe Objekt referenzieren und zu nichts anderem. Equals hat eine
ganz andere Aufgabe, es erlaubt, zwei Objekte auf eine "Gleichheit" zu
prüfen, die vom Programmierer festgelegt wurde.

Wozu sollte denn auch ein Operator gut sein, der in dem von Dir
genannten Fall "false" liefert? Wann sollte der denn "true" liefern?

Gruß,
Michael
--
Die Adresse im From existiert, wird aber nicht gelesen. Daher:
Sollte ausnahmsweise eine Mail-Antwort auf ein Posting vonnöten sein,
bitte folgende Adresse verwenden: newsreply@<Absender-Domain>.
Patrick Roemer
2004-05-06 17:14:24 UTC
Permalink
Post by Oliver Hittmeyer
Post by Oliver Hittmeyer
Post by Stefan Matthias Aust
Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.
im obigen Falle (zwei Referenzen auf dasselbe Object) empfehle ich
Dir aber eher die equals()-Methode, sonst kriegst Du naemlich false
[...]
Post by Oliver Hittmeyer
natuerlich 'Nein' - ist aber "doof", schliesslich habe ich
mit a = new Object(); b = a zwei verschiedene Referenzen, die halt
auf das selbe Objekt zeigen/referenzieren...verweisen
Referenzen sind in Java aber nun mal transparent - sie haben keinerlei
Eigenschaften, ausser eben der, dass sie (automatisch) dereferenziert
werden. Sie kommen zwar in der Sprachspezifikation vor, sind aber keine
fassbaren Entitaeten der Sprache an sich. Warum (und wie) sollte man
etwas nicht fassbares vergleichen wollen?

Man betrachtet eben nur Objekte, die identisch/'dasselbe'('==') oder
'nur' semantisch gleich('equals') sein koennen. Wie die Objektidentitaet
im ersten Fall realisiert ist, kann (und sollte IMO) mir als
Javaprogrammierer schnurz sein.

Der Punkt ist ja eben, dass die Betrachtung von Referenzen oder gar
Zeigern die ganze Sache viel komplizierter macht, ohne dass man
irgendeinen Mehrwert dadurch erhaelt. Das ist sowas wie der
Java-'Aether': Wenn man es nicht nachweisen kann und es einem eh nix
bringt, sollte man sich auch von dieser Vorstellung loesen und ein
anderes (einfacheres) Modell nutzen.

Die Sicht der 'benannten Objekte' reicht IMO fuer alle
Java-'Standardsituationen'. Wenn man auf Basis der JLS diskutieren will,
kommt man nicht umhin, Referenzen zu betrachten, wie sie in der Spec
beschrieben werden, allerdings kann man sie oft genug einfach mit
Objekten gleichsetzen. Auch noch Zeiger mit ins Spiel zu bringen,
stiftet IMO nur Verwirrung und bringt keinen Nutzen, im Gegenteil.

Viele Gruesse,
Patrick
Sönke Müller-Lund
2004-05-06 19:18:04 UTC
Permalink
Post by Oliver Hittmeyer
Post by Stefan Matthias Aust
Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.
im obigen Falle (zwei Referenzen auf dasselbe Object) empfehle ich
Dir aber eher die equals()-Methode, sonst kriegst Du naemlich false
Hittmeyer, Sie sind raus!
;)

Sönke
--
"Wer so gut sein will wie MS, hat einfach keinen Ehrgeiz"
("Tyler Durden" am 26. März 2003 18:13 im Heise Forum)
Oliver Hittmeyer
2004-05-07 05:32:46 UTC
Permalink
Post by Sönke Müller-Lund
Post by Oliver Hittmeyer
Post by Stefan Matthias Aust
Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.
im obigen Falle (zwei Referenzen auf dasselbe Object) empfehle ich
Dir aber eher die equals()-Methode, sonst kriegst Du naemlich false
Hittmeyer, Sie sind raus!
;)
Sönke
'Blödsinn! Setzten! Sechs!' hast Du vergessen :)
Wanja Gayk
2004-05-07 16:21:01 UTC
Permalink
Stefan Matthias Aust said...
Post by Stefan Matthias Aust
Post by Oliver Hittmeyer
Java hat Zeiger, denn eine Referenz ist
Nein. So kann man das implementieren und vielleicht hat eine
JVM-Implementation zeiger benutzt, aber die Sprache Java hat keine Zeiger.
Könnte man sich vielleicht darauf einigen, dass eine Referenz ein
abstrakter Zeiger ist? Bzw. ein Zeiger eine mögliche Implementation
einer Referenz?

Wie man es auch dreht und wendet: am Ende liegen in der physischen
Maschine ab Speicheradresse XY Daten die zu dem entsprechenden Objekt
gehören. An die Daten muss ich ran kommen, sprich: am Ende läuft es doch
zwangsläufig auf einen oder ein Bündel von Zeigern hinaus.
In Java abstrahiert man allerdings von diesem Zeigermodell und man
bekommt: -> eine Referenz.

Gruß,
-Wanja-
--
At a funeral, the Real Programmer is the one saying "Poor George. And he
almost had the sort routine working before the coronary."
[http://www.pbm.com/~lindahl/real.programmers.html]
Stefan Matthias Aust
2004-05-08 08:20:48 UTC
Permalink
Post by Wanja Gayk
Könnte man sich vielleicht darauf einigen, dass eine Referenz ein
abstrakter Zeiger ist? Bzw. ein Zeiger eine mögliche Implementation
einer Referenz?
Wären wir uns hier einig über die Definition der Begriffe, wäre diese
ganze Diskussion nicht entstanden :)
Post by Wanja Gayk
Wie man es auch dreht und wendet: am Ende liegen in der physischen
Maschine ab Speicheradresse XY Daten die zu dem entsprechenden Objekt
gehören.
Und das ist meiner Meinung nach für die Diskussion unerheblich.
Letztlich sind alles nur Bits, denen der Prozessor eine Bedeutung
zuordnet. So kommt man nicht weiter. Der Trick IMHO ist gerade, die
Abstraktionsstufe zu wahren - und da haben bei Java IMHO
Speicheradressen nichts zu suchen. Wer immer nur eine mögliche
Implementierung sieht, kann sich den Weg für Alternativen und das "big
picture" verbauen.


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
M. Baumgartner
2004-05-09 14:31:37 UTC
Permalink
Post by Stefan Matthias Aust
Woran glauben wir überhaupt zu erkennen, dass Java Referenzen benutzt?
Ich kann ein und das selbe Objekt in mehrere Variablen packen und wenn
ich das in einer Variablen "referenzierte" Objekt ändere, dann hat es
sich auch in der anderen geändert. Wir vermuten daher, das beide
Variablen das selbe identische Objekt enthalten, also das selbe Objekt
referenzieren. Es gibt in Java den "=="-Operator, mit dem man zwei
Objekte(deren Referenzen) auf Identität prüfen kann.
Dies ist aber nur eine mögliche Sichtweise. Variablen kann man
genausogut als Namen für Objekte auffassen. Somit kann ich einem Objekt
mehrere Namen geben und es unter diesen verschiedenen Namen ansprechen.
Funktioniert auch mit Menschen: "Susi" und "Schnuckelmäuschen" wären
zwei mögliche Namen für die selbe Person. Sind das Referenzen auf
Menschen? Würde man so nicht nennen.
Diese stark abstrahierte Sichtweise widerspricht IMHO aber der Semantik,
die für "Objektnamen" in Java gilt. In der realen Welt werden Namen
üblichweise einem Objekt, beispielsweise einer Person, zugewiesen, um es
ansprechen zu können. Niemand würde auf die Idee kommen, den Namen als
gegeben zu betrachten und zu sagen: Name x, ab jetzt bezeichnest du
Objekt y.
Genau so passiert es aber in Java:

Typ1 name1 = new Object(); ODER
Typ2 name2 = some existing object;

Hier wird die Zuweisung eines Objektes an eine Referenz ganz bewußt in
den Vordergrund gestellt. Man kann über die Verwendung des "="-Zeichens
für Zuweisungen streiten, manche empfehlen ":=". Doch selbst bei "="
wird niemand abstreiten, daß der linken Seite etwas zugewiesen wird, was
auf der rechten Seite steht. Also erfolgt eine Zuweisung des Objekts an
den Namen und nicht die Vergabe eines Namens für ein Objekt, wie man in
dieser Semantik erwarten würde. Und genau das spricht meiner Auffassung
nach für die Referenz-Semantik und gegen die "Nominalsemantik".
Ansonsten hätte wohl eher eine Darstellung wie etwa:

new Object() of Typ1 as name1;
existing object of Typ2 as name2;

gewählt werden können, um die Namensgebung zu unterstreichen. Natürlich
ist es auch eine Frage des Geschmacks, wie man die Syntax gestaltet. Sie
wurde als Zugeständnis an die C++-Umsteiger so gewählt. Allerdings
sollte sie nicht der Semantik entgegenlaufen.

Markus
Stefan Ram
2004-05-09 15:02:48 UTC
Permalink
Post by M. Baumgartner
Diese stark abstrahierte Sichtweise widerspricht IMHO aber der Semantik,
die für "Objektnamen" in Java gilt.
In Java können Variablen benannt werden, aber nicht Objekte.
Post by M. Baumgartner
Typ1 name1 = new Object();
(...) Hier wird die Zuweisung eines Objektes an eine Referenz
ganz bewußt in den Vordergrund gestellt.
"name1" ist der Name einer Variablen eines Referenztyps. Der
Wert des rechtseitigen Ausdrucks wird nicht dem Namen, sondern
dieser Variablen zugewiesen.

Eine etwas bessere Annäherung an eine Objektbenennung
erhieltest Du, wenn Du "final" verwendet hättest.
Post by M. Baumgartner
wurde als Zugeständnis an die C++-Umsteiger so gewählt. Allerdings
sollte sie nicht der Semantik entgegenlaufen.
(Die Verwendung von "Semantik", wenn wohl "Bedeutung" gemeint
ist, fällt mir in letzter Zeit immer mehr auf.)
M. Baumgartner
2004-05-09 15:26:08 UTC
Permalink
Post by Stefan Ram
Post by M. Baumgartner
Diese stark abstrahierte Sichtweise widerspricht IMHO aber der Semantik,
die für "Objektnamen" in Java gilt.
In Java können Variablen benannt werden, aber nicht Objekte.
Genau um diese Frage ging es in dieser Diskussion. Und ich stimme mit
dir in dieser Aussage auch überein. Wenn du in meinem Posting
anderslautende Aussagen findest, sind sie aus dem Zusammenhang gerissen
oder durch ungünstige Wortwahl von mir entstanden.
Post by Stefan Ram
(Die Verwendung von "Semantik", wenn wohl "Bedeutung" gemeint
ist, fällt mir in letzter Zeit immer mehr auf.)
Kommt wohl daher, weil das im englischen Sprachgebrauch durchaus üblich
ist ("semantics"). Ich unterscheide kaum mehr zwischen Englisch und
Deutsch, wenn es sich ohnehin um Fremdwörter (im engeren Sinn) handelt,
die weder aus dem Deutschen noch aus dem Englischen stammen.

Markus
Stefan Ram
2004-05-09 16:00:14 UTC
Permalink
Post by M. Baumgartner
Post by Stefan Ram
(Die Verwendung von "Semantik", wenn wohl "Bedeutung" gemeint
ist, fällt mir in letzter Zeit immer mehr auf.)
Kommt wohl daher, weil das im englischen Sprachgebrauch durchaus üblich
ist ("semantics"). Ich unterscheide kaum mehr zwischen Englisch und
Deutsch, wenn es sich ohnehin um Fremdwörter (im engeren Sinn) handelt,
die weder aus dem Deutschen noch aus dem Englischen stammen.
"Semantik" hat im Deutschen in der Informatik schon eine
spezifische Bedeutung, so daß es für mich dann gelegentlich so
klingt, als sagte jemand "Psychologie" für "Psyche".
Stefan Matthias Aust
2004-05-09 15:25:43 UTC
Permalink
Post by M. Baumgartner
Diese stark abstrahierte Sichtweise widerspricht IMHO aber der Semantik,
die für "Objektnamen" in Java gilt. In der realen Welt werden Namen
üblichweise einem Objekt, beispielsweise einer Person, zugewiesen, um es
ansprechen zu können. Niemand würde auf die Idee kommen, den Namen als
gegeben zu betrachten und zu sagen: Name x, ab jetzt bezeichnest du
Objekt y.
Ich sehe da keinen Widerspruch. Nehmen wir ein Wartezimmer. Dort wird
immer "der Nächste" aufgefordert, zum Arzt zu gehen. Immer ein anderes
Patientenobjekt, aber immer der selbe Name.

Ich stimme dir jedoch zu, dass die Idee der Namen nicht so sehr zu
Variablen passt. Auf diese sollte man eh aber so weit wie möglich
verzichten, und "finale Variablen" oder eben konstante Namen benutzen.
Eine funktionale Sprache unterscheidet hier sauber zwischen Werten und
Variablen, meist kann man werte durch etwas wie

val a = ....

binden. Das hat jetzt die Semantik, das dem Ausdruck "..." der Name "a"
zugewiesen wird und wo immer "a" benutzt wird, eigentlich "..." gemeint
ist. Diese Sichtweise kann man IMHO auch auf den Fall ausdehnen, dass
"a" eben variabel bzw. nur lokal konstant ist.
Post by M. Baumgartner
new Object() of Typ1 as name1;
existing object of Typ2 as name2;
Im ursprünglichen Basic hieß es

let a = ...

wahrscheinlich abgeleitet von Lisps

(let ((a ...) ...) ...)

Syntaxform. Oder in Logo

make "a ...

was ich alles als Varianten obiger Syntax sehe. Ob nun der Name links
oder rechts steht (Beta ist eine der wenigen Sprachen die ich kenne, wo
er wohl rechts steht) ist Geschmacksfrage.


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Stefan Ram
2004-05-09 16:24:55 UTC
Permalink
Post by Stefan Matthias Aust
Im ursprünglichen Basic hieß es
let a = ...
Das sah oft auch so aus:

LET A = ...
Post by Stefan Matthias Aust
wahrscheinlich abgeleitet von Lisps
(let ((a ...) ...) ...)
Also, wenn schon, dann höchstens von /LISP/s "LET", aber
selbst da bin ich mir nicht sicher, ob das "LET" nicht erst
Mitte der 60er Jahre mit MACLISP oder LISP 1.5 aufkam.
Stefan Ram
2004-05-09 20:12:59 UTC
Permalink
Post by Stefan Ram
Also, wenn schon, dann höchstens von /LISP/s "LET", aber
selbst da bin ich mir nicht sicher, ob das "LET" nicht erst
Mitte der 60er Jahre mit MACLISP oder LISP 1.5 aufkam.
Ich konnte immer noch keine genaue Datierung finden, aber
hier ein Hinweis, daß "let" nicht von Anfang an in LISP
war:

"However, calls to explicit lambda expressions were very
useful in the old days of Lisp, before the special form
let was invented. At that time, they were the only way to
bind and initialize local variables."

http://www.gnu.org/software/emacs/elisp-manual/html_node/elisp_163.html

[02:17] <tcmd> i'ts an example of Lisp 1.0
[02:18] <rydis> With let? Are you sure?
[02:18] <rydis> (Not that I'd really know.)
[02:19] <tcmd> why not?
[02:19] <tcmd> i just copy/pasted it from the book anyway, so...
[02:20] <tcmd> aaaaaaaaaahhhhhhhhh!
[02:20] <rydis> tcmd: Because LET was invented when people
got fed up with using LAMBDA to create local variables.
[02:20] Action: tcmd finally got it

http://216.239.57.104/search?q=cache:vengeance.et.tudelft.nl/~smoke/logs/lisp/lisp.24Sep2003

BASIC wurde wohl 1964 veröffentlicht, aber die Arbeit daran
wurde ja schon in den Jahren davor (1959?) begonnen.

Und MUSEN bedeutet "let x be 3" im Englischen einfach so viel
wie "Sei x gleich 3.", beispielsweise:

"Let X be a topological space and let x, y e X ... "

http://www.maths.bath.ac.uk/~feb/math0040/exam-01.pdf

Daher ergibt sich das "LET" von BASIC auch zwanglos aus der
englischen Sprache, ohne daß unbedingt LISP als Vorbild nötig
ist.
Stefan Matthias Aust
2004-05-09 20:56:10 UTC
Permalink
Post by Stefan Ram
Ich konnte immer noch keine genaue Datierung finden, aber
hier ein Hinweis, daß "let" nicht von Anfang an in LISP
Das war wohl zu leicht dahingesagt. Ich sehe eine große Chance, dass
das "let" einfach aus dem "sei X ein ..." aus der typischen
mathematischen Sprechweise übernommen wurde. Weder Lisp 1.0 (1958) noch
Lisp 1.5 (1959) hatten - so wie ich das eben überflogen habe - eine
LET-Syntaxform. Scheme (1975) hatte es. Dazwischen lagen MacLisp
(1974) und Interlisp (1978) sowie kurz danach NIL (a New Implementation
of Lisp, 1979). Maclisp war übrigens das Vorbild für Emacs-Lisp. Es
hatte erstmals Macros und damit war es bis zum let zumindest nur noch
ein ganz kurzer weg. Es muss aber in den 15 Jahren zwischen Lisp 1.5
und MacLisp noch was gegeben haben... mensch Java ist noch nicht mal 15
Jahre alt und wie hat sich das verändert? Viele Sprachen werden noch
nicht einmal so alt...

Stefan
Frank Buss
2004-05-09 21:11:56 UTC
Permalink
Post by Stefan Matthias Aust
mensch Java ist noch nicht mal 15
Jahre alt und wie hat sich das verändert? Viele Sprachen werden noch
nicht einmal so alt...
Also soviel hat sich Java doch bis 1.4 nicht geändert. Inner-classes sind
im Laufe der Zeit dazugekommen, wenn ich mich recht erinnere und ein paar
andere Details. Mit 1.5 kommen zwar ein paar weitere Features hinzu, die
aber zugunsten von Bytecode-Abwärtskompatibilität leider nur halbherzig
sind und die Sprache unnötig verkomplizieren.
--
Frank Buß, ***@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Stefan Matthias Aust
2004-05-10 06:47:19 UTC
Permalink
Post by Frank Buss
andere Details. Mit 1.5 kommen zwar ein paar weitere Features hinzu, die
aber zugunsten von Bytecode-Abwärtskompatibilität leider nur halbherzig
sind und die Sprache unnötig verkomplizieren.
Verkomplizieren ja - aber unnötig? Wäre es auch einfacher gegangen?


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Frank Buss
2004-05-10 11:02:53 UTC
Permalink
Post by Stefan Matthias Aust
Verkomplizieren ja - aber unnötig? Wäre es auch einfacher gegangen?
Ich meinte speziell Generics. Autoboxing, enums und static import finde
ich gut gelungen, aber bei Generics stimme ich mit den meisten Postern
in diesem Thread überein:

http://groups.google.de/groups?threadm=c5r0ig%244uk57%241%40ID-88757.news.uni-berlin.de

daß es Java zu sehr verkompliziert, gemessen an dem minimalen Vorteil,
den es bietet. So z.B. auch die Einschränkung, schon bei der Definition des
Generics angeben zu müssen, mit welchen Templateparameter man denn gedenkt,
ein Template zu instantiieren:

http://www.mindview.net/WebLog/log-0050

Oder das man keine einfachen Datentypen als Templateparameter angeben
kann und andere Einschränkungen, die man in C++ mit Templates nicht hat.
Wenn man schon so eine etwas gewöhnungsbedürftige Syntax einführt, dann
sollte die auch einen größeren Nutzen haben.
--
Frank Buß, ***@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de
Mick Krippendorf
2004-05-06 15:46:16 UTC
Permalink
Post by Oliver Hittmeyer
Java hat Zeiger, denn eine Referenz ist (ganz grundlegend nichts
anders naemlich eine (Platzhalter-)Variable (wohl um die 4Byte
[32bit]), welche auf eine bestimmte Speicheraddresse
zeigt/referenziert/verweist (Punkt).
Der Witz bei dieser Diskussion - der im Übrigen von fast keinem erkannt
zu weden scheint - ist, dass Worte wie "Zeiger", "Referenz", etc. eine
spezifische Bedeutung immer nur relativ zu einer gegebenen
Programmiersprache haben. Und wenn es mir einfiele, eine JVM in Prolog
zu bauen oder beim Schreiner eine Turingmaschine zimmern zu lassen und
meine Java-Programme mit dem Locher in deren Band stanze oder meine
Java-Programme in Kombinatorische Logik (wo es überhaupt keine Variablen
gibt) zu übersetzen, dann könnte ich mit Deiner o.s. Erklärung nur
insofern etwas anfangen, wie ich dazu in der Lage wäre, sie als
metasprachliche Äußerungen in Bezug auf solche Maschinen zu
interpretieren, wobei ich dann wahrscheinlich zu Aussagen gelangen würde
wie "Mit 'Variable' meint er ..." und "mit 'Speicheradresse' meint er
...".

Sofern ich mich allerdings nur auf die jeweils gegebenen
Sprachdefinitionen beziehe gibt es freilich in C/C++ Zeiger, in Java
aber nicht. Referenzen gibt es in beiden Sprachen, aber es ist jeweils
unterschiedliches damit gemeint. Jedenfalls ist die Antwort "In Java
gibt es keine Zeiger" unter Beachtung von Javas Sprachdefinition
wahrscheinlich völlig korrekt. Allerdings nicht auf die Frage "Gibt es
in Java etwas vergleichbares wie Zeiger in C/C++?". Da wäre die
Gegenfrage angezeigt "Was meinen sie mit 'Zeiger'? Gehört dazu auch
Zeigerarithmetik?" Wie Sankt Ludwig Wittgenstein immer sagte: "Die
Bedeutung eines Wortes ist sein Gebrauch in der Sprache" (§43PU)


Gruß,
Mick.

PS @ SMA: Du hast neulich mal nach Literaturempfehlungen gefragt:
Wittgenstein, Ludwig, "Tractatus logico-philosophicus: Werkausgabe Band
1", Suhrkamp, Frankfurt a.M., 1984, sei hiermit empfohlen. Aber Obacht:
es gibt von Suhrkamp auch das Traktat einzeln als dünnes rotes Büchlein,
das meine ich nicht, sondern das dicke dunkelblaue, wo auch die
"Philosophischen Untersuchungen" drin stehen. Letztere sind nicht nur
für Philosophen, Mathematiker, Logiker und Linguisten interessant,
sondern für alle, die sich mit Weltbeschreibung und -erzeugung
beschäftigen, also auch für Software-Entwickler und -Analytiker, da
darin einige Gedanken entwickelt werden, die die aus dem Gebrauch der
Sprache resultierende ontologische Relativität verdeutlichen. So eine
Art Verflüssigung tradierter ontologischer Verknorpelungen war bei mir
das Resultat. Nicht, dass ich meinte, jeder müsse Philosoph werden - to
each his own - aber, wie man hier in München sagt: Fia den, deas mog, is
as hägste.
Martin Heibel
2004-05-06 19:36:07 UTC
Permalink
Post by Stefan Matthias Aust
Gerne. Es gibt keine Zeiger (so wie man sie z.B. in C kennt) in Java.
Es gibt Zeiger, so wie man sie in Pascal kennt in Java.

Gute Nacht,
Martin
Andreas Schröter
2004-05-06 07:49:23 UTC
Permalink
Post by Martin Feltes
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Natürlich gibt es Zeiger in Java. Jede Objektreferenz ist einer. Man kann
sie nur nicht wie in C oder C++ manipulieren. Nur auf null setzen oder auf
ein Objekt zeigen lassen.

Mehr kann man darüber auch schon nicht mehr sagen. Für ein Referat wirds
wohl kaum reichen!

Andreas
Ortwin Glück
2004-05-06 08:15:59 UTC
Permalink
Post by Andreas Schröter
Natürlich gibt es Zeiger in Java. Jede Objektreferenz ist einer.
Na dann für mal operationen auf deinem 'Zeiger' aus. Es gibt keine
Zeigerarithmetik in Java und damit macht der Begriff 'Zeiger' für
Referenzen keinen Sinn mehr.
Andreas Schröter
2004-05-06 08:17:23 UTC
Permalink
Post by Ortwin Glück
Post by Andreas Schröter
Natürlich gibt es Zeiger in Java. Jede Objektreferenz ist einer.
Na dann für mal operationen auf deinem 'Zeiger' aus. Es gibt keine
Zeigerarithmetik in Java und damit macht der Begriff 'Zeiger' für
Referenzen keinen Sinn mehr.
Wie ich sagte: "Man kann nur nichts mit ihnen machen".

Ein Auto, das nicht mehr fährt, ist ja auch noch ein Auto!

Andreas
Joachim Arrasz
2004-05-06 08:22:33 UTC
Permalink
Hi,
Post by Andreas Schröter
Wie ich sagte: "Man kann nur nichts mit ihnen machen".
sagtest du das? Du sagtest doch mehr :-)
Post by Andreas Schröter
Ein Auto, das nicht mehr fährt, ist ja auch noch ein Auto!
aber nur solange die Menschen in dem Land wissen, was ein Auto ist bzw war.

Wenn du nun aber in einem Land bist, das Autos in unsrem sinne nicht
kennt, dann ist das Auto nur noch ein Fortbewegungsmittel... und so
sollte man das in Java auch ansehen. Es tut was, wie das ist egal, und
das es egal ist, das ist gut so.

Gruss Achim

P.S nur meine subjektive Meinung
--
Dipl. Inf.(FH) Joachim Arrasz - ***@synyx.de
<a href="www.synyx.de">Synyx oHG</a> Opensource Solutions - OpenCMS
Solution Provider
76131 Karlsruhe
Hubert Partl
2004-05-06 09:27:22 UTC
Permalink
Post by Joachim Arrasz
Post by Andreas Schröter
Ein Auto, das nicht mehr fährt, ist ja auch noch ein Auto!
Wenn du nun aber in einem Land bist, das Autos in unsrem sinne nicht
kennt, dann ist das Auto nur noch ein Fortbewegungsmittel
Dazu fällt mir eine Geschichte ein, aus der Zeit, als der Personal
Computer (= persönliche Rechner) nur ein Berechnungsmittel war:

- - forwarded article - - -
Post by Joachim Arrasz
Newsgroups: alt.politics.datahighway
Date: Thu, 11 Nov 1993 04:34:47 GMT
Subject: Gilder's Article 3 - Issaquah Miracle
Explaining the magic of networks, Bookey asks you to imagine
a car plumped down in the jungle. Checking it out, you might
find it a very useful piece of equipment indeed. A multipurpose
wonder, it would supply lights, bedding, radio communications,
tape player, heat, air conditioning, a shield against arrows and
bullets, and a loud horn to frighten away fierce animals. In awe
of the features of this machine, you might never realize that the
real magic of a car comes in conjunction with asphalt.

For the first 10 years of the personal computer era,
according to Bookey, we have used our computers like cars in the
jungle. We have plumbed their powers for processing words and
numbers. All too often, home computers have ended up in the
closet unused. We have often failed to recognize that most of
the magic of computing stems from the exponential benefits of
interconnection.

- - end of forwarded article - - -

(Gibt es diesen Artikel eigentlich in Google, oder haben die
erst später als ich mit dem Archivieren begonnen? :-)
--
Hubert Partl ***@mail.boku.ac.at
ZID BOKU Wien http://homepage.boku.ac.at/partl/
~~~~~~~~an~der~schoenen~blauen~Donau~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Paul Ebermann
2004-05-06 11:26:19 UTC
Permalink
Post by Hubert Partl
Dazu fällt mir eine Geschichte ein, aus der Zeit, als der Personal
- - forwarded article - - -
Post by Joachim Arrasz
Newsgroups: alt.politics.datahighway
Date: Thu, 11 Nov 1993 04:34:47 GMT
Subject: Gilder's Article 3 - Issaquah Miracle
[...]
Post by Hubert Partl
- - end of forwarded article - - -
(Gibt es diesen Artikel eigentlich in Google, oder haben die
erst später als ich mit dem Archivieren begonnen? :-)
http://groups.google.com/groups?selm=213%40pcs.win.net


Paul
Wanja Gayk
2004-05-06 11:17:51 UTC
Permalink
Andreas Schröter said...
Post by Andreas Schröter
Post by Ortwin Glück
Post by Andreas Schröter
Natürlich gibt es Zeiger in Java. Jede Objektreferenz ist einer.
Na dann für mal operationen auf deinem 'Zeiger' aus. Es gibt keine
Zeigerarithmetik in Java und damit macht der Begriff 'Zeiger' für
Referenzen keinen Sinn mehr.
Wie ich sagte: "Man kann nur nichts mit ihnen machen".
Ein Auto, das nicht mehr fährt, ist ja auch noch ein Auto!
Bestenfalls ist es ein MOBIL, denn AUTOonom ist es nicht mehr :-).

Gruß,
-Wanja-
--
At a funeral, the Real Programmer is the one saying "Poor George. And he
almost had the sort routine working before the coronary."
[http://www.pbm.com/~lindahl/real.programmers.html]
Stefan Matthias Aust
2004-05-06 11:48:17 UTC
Permalink
Post by Wanja Gayk
Bestenfalls ist es ein MOBIL, denn AUTOonom ist es nicht mehr :-).
MOBIL ist es aber gerade nicht mehr, wenn es nicht fährt. Also eher ein .


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Wanja Gayk
2004-05-07 16:05:29 UTC
Permalink
Stefan Matthias Aust said...
Post by Stefan Matthias Aust
Post by Wanja Gayk
Bestenfalls ist es ein MOBIL, denn AUTOonom ist es nicht mehr :-).
MOBIL ist es aber gerade nicht mehr, wenn es nicht fährt. Also eher ein .
Du kannst es noch schieben oder abschleppen, also ist es noch mobil, nur
halt nicht autonom mobil :-)

Gruß,
-Wanja-
--
At a funeral, the Real Programmer is the one saying "Poor George. And he
almost had the sort routine working before the coronary."
[http://www.pbm.com/~lindahl/real.programmers.html]
Anastasios Tsitlakidis
2004-05-06 13:59:03 UTC
Permalink
Post by Wanja Gayk
Post by Andreas Schröter
Post by Ortwin Glück
Post by Andreas Schröter
Natürlich gibt es Zeiger in Java. Jede Objektreferenz ist einer.
Na dann für mal operationen auf deinem 'Zeiger' aus. Es gibt keine
Zeigerarithmetik in Java und damit macht der Begriff 'Zeiger' für
Referenzen keinen Sinn mehr.
Wie ich sagte: "Man kann nur nichts mit ihnen machen".
Ein Auto, das nicht mehr fährt, ist ja auch noch ein Auto!
Bestenfalls ist es ein MOBIL, denn AUTOonom ist es nicht mehr :-).
Nenne mir ein Wort und ich erkläre Dir, daß es griechischen Ursprungs
ist: "auto" kommt aus dem griechischen und heißt "Selbst", "mobilos"
heißt bewegend, folglich heißt es "Selbstbeweger" und nicht
Selbstversorger. Und noch "Hi!" in dclj!
Michael Rauscher
2004-05-06 16:07:39 UTC
Permalink
Post by Anastasios Tsitlakidis
Nenne mir ein Wort und ich erkläre Dir, daß es griechischen Ursprungs
ist
Na dann: Semmelknödel und Wolpertinger

Gruß
Michael
Anastasios Tsitlakidis
2004-05-07 10:22:13 UTC
Permalink
Post by Michael Rauscher
Post by Anastasios Tsitlakidis
Nenne mir ein Wort und ich erkläre Dir, daß es griechischen Ursprungs
ist
Na dann: Semmelknödel und Wolpertinger
War ein Insiderwitz an Kollege Brix.
Alexander Reifinger
2004-05-07 12:07:33 UTC
Permalink
Post by Anastasios Tsitlakidis
Post by Michael Rauscher
Post by Anastasios Tsitlakidis
Nenne mir ein Wort und ich erkläre Dir, daß es griechischen Ursprungs
ist
Na dann: Semmelknödel und Wolpertinger
War ein Insiderwitz an Kollege Brix.
Mei, ist halt ein Zitat aus "Big fat greek wedding".
--
Servus,
Alexander Reifinger
Wanja Gayk
2004-05-07 16:06:50 UTC
Permalink
Anastasios Tsitlakidis said...
Post by Anastasios Tsitlakidis
Post by Wanja Gayk
Post by Andreas Schröter
Ein Auto, das nicht mehr fährt, ist ja auch noch ein Auto!
Bestenfalls ist es ein MOBIL, denn AUTOonom ist es nicht mehr :-).
Nenne mir ein Wort und ich erkläre Dir, daß es griechischen Ursprungs
ist: "auto" kommt aus dem griechischen und heißt "Selbst", "mobilos"
heißt bewegend, folglich heißt es "Selbstbeweger" und nicht
Selbstversorger. Und noch "Hi!" in dclj!
/me spendiert Taso eine virtuelle Flasche Wyndex.

Gruß,
-Wanja-
--
At a funeral, the Real Programmer is the one saying "Poor George. And he
almost had the sort routine working before the coronary."
[http://www.pbm.com/~lindahl/real.programmers.html]
Anastasios Tsitlakidis
2004-05-12 09:22:31 UTC
Permalink
Post by Wanja Gayk
Post by Anastasios Tsitlakidis
Post by Wanja Gayk
Post by Andreas Schröter
Ein Auto, das nicht mehr fährt, ist ja auch noch ein Auto!
Bestenfalls ist es ein MOBIL, denn AUTOonom ist es nicht mehr :-).
Nenne mir ein Wort und ich erkläre Dir, daß es griechischen Ursprungs
ist: "auto" kommt aus dem griechischen und heißt "Selbst", "mobilos"
heißt bewegend, folglich heißt es "Selbstbeweger" und nicht
Selbstversorger. Und noch "Hi!" in dclj!
/me spendiert Taso eine virtuelle Flasche Wyndex.
"Windex" mit "i" bitte!

michael paap
2004-05-06 09:57:23 UTC
Permalink
Post by Martin Feltes
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Ich brauche diese für einen Vortrag in der Schule.
Oh, fein. Da hole ich doch gleich Popcorn und lasse Andree Grosse aus
meinem Filter.

Gruß,
Michael
--
Die Adresse im From existiert, wird aber nicht gelesen. Daher:
Sollte ausnahmsweise eine Mail-Antwort auf ein Posting vonnöten sein,
bitte folgende Adresse verwenden: newsreply@<Absender-Domain>.
Sönke Müller-Lund
2004-05-06 09:58:34 UTC
Permalink
Post by Martin Feltes
Hallo,
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Du siehst, es gibt verschiedene "Wahrheiten" zu diesem Thema. Ich
unterrichte seit über einem Jahr Java in meinem Betrieb und habe noch
niemals den Begriff "Zeiger" bzgl. Java benötigt. Man kann zwar darauf
beharren, dass es Zeiger in Java gibt, aber die Ansicht "Referenzen sind
eigentlich Zeiger" bringt überhaupt keine Vorteile.

Sönke
--
"Wer so gut sein will wie MS, hat einfach keinen Ehrgeiz"
("Tyler Durden" am 26. März 2003 18:13 im Heise Forum)
Paul Ebermann
2004-05-06 11:31:20 UTC
Permalink
Post by Martin Feltes
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Ich brauche diese für einen Vortrag in der Schule.
Neben dem Standpunkt von SMA (Es gibt keine Zeiger)
gibt es noch den entgegengesetzten:

Es gibt nur Zeiger.

Man kann Objekte nur mittels Zeigern
verwenden, weiterreichen, Methoden auf
ihnen aufrufen, ...

An die Objekte selbst kommt man gar
nicht ran.

Daher könnte man diese Zeiger mit den
Objekten, auf die sie zeigen, identifizieren.

(Und primitive Werte kann man - wenn man will -
als Zeiger auf bestimmte Konstante Objekte
auffassen.)


(Und man kann mit Java-Zeigern keine Zeiger-Arithmetik
betreiben, wie man das aus anderen Sprachen gewohnt
ist.)


Paul
Stefan Matthias Aust
2004-05-06 11:53:17 UTC
Permalink
Post by Paul Ebermann
Neben dem Standpunkt von SMA (Es gibt keine Zeiger)
Es gibt nur Zeiger.
Sehe ich anders. Jetzt hast du A einfach nur B genannt, ohne etwas zu
ändern. Da du gerade die Zeiger-Eigenschaft - eine Adresse eines
beliebigen Speicherbereichs zu sein - aufgibt, verwirrt das Wort nur.

Ich könnte ansonsten auch sagen. Es gibt keine autonom handelnden
Menschen, das sind alles nur Marionetten, die von Worlaxs gesteuert
werden. Und mittels der Strippen kann ein Mensch essen, trinken und so
tun als wenn er lebt. Da ich weder die Strippen noch die Worlaxs
wahrnehmen kann, ist es müsig, so eine komplizierende Definition
einzuführen.
Post by Paul Ebermann
(Und man kann mit Java-Zeigern keine Zeiger-Arithmetik
betreiben, wie man das aus anderen Sprachen gewohnt
ist.)
Zeiger machen nur Sinn, wenn es auch einen Hauptspeicher gibt, in den
die beliebig zeigen können. Genau das gibt es bei Java nicht. Dort
gibt es nur einen Objektspeicher. Und das Argument in ( ) ist IMHO
genau das entscheidene.


bye
--
Stefan Matthias Aust // "Zweifel sind der Ansporn des Denkens..." -U
Sven Köhler
2004-05-06 12:34:15 UTC
Permalink
Post by Stefan Matthias Aust
Zeiger machen nur Sinn, wenn es auch einen Hauptspeicher gibt, in den
die beliebig zeigen können. Genau das gibt es bei Java nicht. Dort
gibt es nur einen Objektspeicher. Und das Argument in ( ) ist IMHO
genau das entscheidene.
Das ist IMHO aber äquivalent dazu, dass die Referenzen immer nur auf
null oder ein Objekt zeigen können und es keine Zeigerarithmetik gibt.
Martin Heibel
2004-05-06 19:50:25 UTC
Permalink
Post by Stefan Matthias Aust
Post by Paul Ebermann
Neben dem Standpunkt von SMA (Es gibt keine Zeiger)
Es gibt nur Zeiger.
Sehe ich anders. Jetzt hast du A einfach nur B genannt, ohne etwas zu
ändern. Da du gerade die Zeiger-Eigenschaft - eine Adresse eines
beliebigen Speicherbereichs zu sein - aufgibt, verwirrt das Wort nur.
Es gibt z.B. in OODBMS das Konzept der Object-ID, die ein Objekt eindeutig
identifiziert. Seltsamerweise findet es niemand verwirrend, das so zu
sehen, dass die ID auf das Objekt verweist (=zeigt).
Post by Stefan Matthias Aust
Ich könnte ansonsten auch sagen. Es gibt keine autonom handelnden
Menschen, das sind alles nur Marionetten, die von Worlaxs gesteuert
werden. Und mittels der Strippen kann ein Mensch essen, trinken und so
tun als wenn er lebt. Da ich weder die Strippen noch die Worlaxs
wahrnehmen kann, ist es müsig, so eine komplizierende Definition
einzuführen.
Das ist keine Definition, sonder eine komplexe und zu mindest theoretisch
veri-/falsifizierbare Behauptung. Die Pointer-Sichtweise vereinfacht das
Verständnis dessen, was in einem Java-Programm vor sich geht. Dann kommt
man auch nicht auf so dämliche Ideen, wie die von dem Trottel, der hier
gestern oder so meinte durch casten eine Typwandlung durchführen zu können.
Post by Stefan Matthias Aust
Zeiger machen nur Sinn, wenn es auch einen Hauptspeicher gibt, in den
die beliebig zeigen können.
Du willst uns die ganze Zeit beweisen, wie toll Du abstrahieren kannst und
jetzt zeigst Du, dass Du es nicht kannst. Der Hauptspeicher eines
C-Programms kann auf der physikalischen Ebene beliebig fragmentiert sein.
Auf Grund der Address-Translation aktueller CPUs könnten zwei aus
Programmsicht aufeinanderfolgende Adressen sonstwo im Speicher liegen. Also
ist auch diese Sichtweise eine rein theoretische. Es ist ein Modell, das zu
funktionieren hat, mehr nicht.
Post by Stefan Matthias Aust
Genau das gibt es bei Java nicht.
Doch. Es gibt einen Stack und einen Heap, denn beide können überlaufen.
Post by Stefan Matthias Aust
Dort gibt es nur einen Objektspeicher.
Das wäre auch nur eine Sonderform des Hauptspeichers. Aber wo sind denn die
armen int, float, ect. abgelegt, wenn es nur *Objekt*-Speicher gibt?
Post by Stefan Matthias Aust
Und das Argument in ( ) ist IMHO
genau das entscheidene.
Nö, siehe Pascal.

Pointer sind ein rein Theoretisches Konstrukt, das nichts mit einer
speziellen Programmiersprache zu tun hat. Alles, was sich wie ein Pointer
verhält ist einer. Und: nein, Pointerarithmetik ist keine
Grundvoraussetzung für Pointer. Ein Pointer ist ein Verweis auf Daten, der
auch ungültig (null) sein kann und dessen "Wert" man ändern kann (sofern er
nicht explizit als konstant markiert wurde), mehr nicht.

Gute Nacht,
Martin
Patrick Roemer
2004-05-06 21:32:23 UTC
Permalink
Post by Martin Heibel
Die Pointer-Sichtweise vereinfacht das
Verständnis dessen, was in einem Java-Programm vor sich geht.
Ansichtssache.
Post by Martin Heibel
Ein Pointer ist ein Verweis auf Daten, der
auch ungültig (null) sein kann und dessen "Wert" man ändern kann (sofern er
nicht explizit als konstant markiert wurde), mehr nicht.
Wenn man googelt, gewinnt man eher den Eindruck, dass die meisten mehr
oder minder sprachunabhaengigen Definitionen von Pointer zumindest ein
adressierbares Medium, und, implizit oder explizit, Zugriff auf die
enthaltene Adressinformation im Rahmen der Sprache einschliessen. Und
das waere auch mein Verstaendnis dieses Begriffs. Mag sein, dass Deine
Definition die 'korrektere' ist, aber wer entscheidet das, und wem
huelfe das, wenn die andere Deutung nun mal verbreiteter ist?

Zielgruppe von Java waren und sind zunaechst C/C++-Programmierer. Und da
ist es IMO durchaus sinnvoll, zu sagen: Pointer, wie ihr sie kennt, gibt
es hier nicht, wir haben da ein etwas anderes Konzept, das nennen wir
Reference. Weniger sinnvoll ist es, dass Sun selber die Begriffe gerne
mal munter durcheinanderwuerfelt.

Viele Gruesse,
Patrick
Paul Ebermann
2004-05-07 00:14:02 UTC
Permalink
Post by Martin Heibel
Post by Stefan Matthias Aust
Zeiger machen nur Sinn, wenn es auch einen Hauptspeicher gibt, in den
die beliebig zeigen können.
[...]
Post by Martin Heibel
Post by Stefan Matthias Aust
Genau das gibt es bei Java nicht.
Doch. Es gibt einen Stack und einen Heap, denn beide können überlaufen.
Post by Stefan Matthias Aust
Dort gibt es nur einen Objektspeicher.
Das wäre auch nur eine Sonderform des Hauptspeichers. Aber wo sind denn die
armen int, float, ect. abgelegt, wenn es nur *Objekt*-Speicher gibt?
_In_ den Objekten, nicht separat davon daneben.
(Außerdem vielleicht noch in lokalen Variablen.)

Das ist ja gerade der Unterschied zwischen Primitiven und
Objekten - auf erstere kann man nicht zeigen, da sie keine
Objekt-Nummer haben.

Eine andere Sichtweise wäre es, primitive als Zeiger auf
konstante Objekte imaginärer Klassen zu interpretieren.
(Diese "Klassen" sind leider keine Subklassen von java.lang.Object,
und haben auch keine Methoden - dafür sind ein paar
Operatoren definiert.)

Es ist dann 12 der Zeiger auf das Zwölf-Objekt (davon gibt
es genau eines in der VM).


Paul
Paul Ebermann
2004-05-06 21:01:48 UTC
Permalink
Post by Stefan Matthias Aust
Post by Paul Ebermann
Neben dem Standpunkt von SMA (Es gibt keine Zeiger)
Es gibt nur Zeiger.
Sehe ich anders.
Du siehst nicht, dass es den Standpunkt gibt?

Oder willst du nur sagen, dass du nicht mit diesem
Standpunkt übereinstimmst? (Das hatte ich mir schon
gedacht - schließlich ist er "entgegengesetzt zu
deinem Standpunkt".)

(Wir hatten diese Diskussion doch schon häufig
genug ...)
Post by Stefan Matthias Aust
Jetzt hast du A einfach nur B genannt, ohne etwas zu
ändern. Da du gerade die Zeiger-Eigenschaft - eine Adresse eines
beliebigen Speicherbereichs zu sein - aufgibt, verwirrt das Wort nur.
Wir sollten uns vor einer solchen Diskussion mal
auf eine Definition von "Zeiger" einigen.

Was heißt denn "beliebiger Speicherbereich",
was heißt "Adresse"?
Post by Stefan Matthias Aust
Ich könnte ansonsten auch sagen. Es gibt keine autonom handelnden
Menschen, das sind alles nur Marionetten, die von Worlaxs gesteuert
werden. Und mittels der Strippen kann ein Mensch essen, trinken und so
tun als wenn er lebt.
Klingt doch gut :-)
Post by Stefan Matthias Aust
Da ich weder die Strippen noch die Worlaxs
wahrnehmen kann, ist es müsig, so eine komplizierende Definition
einzuführen.
Dafür brauchst du dann ein Konzept wie "Referenz".
Post by Stefan Matthias Aust
Post by Paul Ebermann
(Und man kann mit Java-Zeigern keine Zeiger-Arithmetik
betreiben, wie man das aus anderen Sprachen gewohnt
ist.)
Zeiger machen nur Sinn, wenn es auch einen Hauptspeicher gibt, in den
die beliebig zeigen können. Genau das gibt es bei Java nicht. Dort
gibt es nur einen Objektspeicher.
Dafür kann ein Zeiger beliebig auf ein Objekt
dieses Objektspeichers zeigen.
(Wenn der Zeiger nicht vom Typ java.lang.Object
ist, muss sein Typ noch zur Klasse des gezeigten
Objektes passen.)

Stell dir einen Zeiger einfach als "Objektnummer" vor.
Post by Stefan Matthias Aust
Und das Argument in ( ) ist IMHO
genau das entscheidene.
Ich bekomme langsam eine Vorstellung von deiner
Definition von "Zeiger". Könntest du die trotzdem
mal aufschreiben?


Paul
Patrick Roemer
2004-05-07 11:56:21 UTC
Permalink
Post by Paul Ebermann
Ich bekomme langsam eine Vorstellung von deiner
Definition von "Zeiger". Könntest du die trotzdem
mal aufschreiben?
Ich bin zwar nicht SMA, habe aber gerade 2 Cent ueber.

In wirklich allen Definitionen von Pointer, die ich gefunden habe, ist
von einer Adresse die Rede. Ein Pointer verweist demnach auf eine
diskrete Stelle in einem adressierbaren Medium. Das finde ich schon
weitaus konkreter, als 'ein Verweis auf Daten'. Und ist bei Java
References so nicht gegeben.

In manchen Definitionen wird dann noch explizit gefordert, dass man auf
die Adresse als eigenstaendigen Wert zugreifen koennen sollte. Das
wuerde vom 'Bauchgefuehl' her auch zu meiner Definition gehoeren und
geht in Java auch nicht.

Wenn man das einmal hat, liegen explizite Dereferenzierbarkeit,
Arithmetik und das Wissen um die Struktur der referenzierten Daten im
Speichermedium zwar nahe, wuerden fuer mich aber nicht zwingend
dazugehoeren.

Viele Gruesse,
Patrick
Sven Köhler
2004-05-06 12:31:11 UTC
Permalink
Post by Martin Feltes
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Ich brauche diese für einen Vortrag in der Schule.
Würde dir das Thema so gegeben? Mit dem Wort "Zeiger" im Titel?
Sehr lustig.

Also: Es gibt keine Zeiger in Java. Es gibt nur Referenzen auf Objekte.
Natürlich verstecken sich hinter Referenzen irgentwelche Zeiger, aber
der punkt ist, dass es keine Zeigerarithmetik wie in C gibt. D.h.
entweder habe ich so einen Zeiger bzw. eine Referenz auf ein Objekt,
oder ich habe keine - sprich den null-Pointer oder die null-Referenz.
Ich kann die Referenz auch nicht kaputt machen, indem ich sie ändere
(z.B. 3byte addiere oder sowas).
Darüberhinaus zeigt eine Referenz immer auf ein gültiges Objekt. In C
kann ein Objekt ja löschen, obwohl ich noch zig Referenzen darauf habe.

Habe ich also in Java eine Refernz !=null, so habe ich eine Referenz auf
ein gültiges Objekt. In C kann ein Zeiger sonstwohin zeigen und man muss
aufpassen das man keine Zeiger benutzt die nicht mehr gültig sind.
Cybernd
2004-05-06 12:43:37 UTC
Permalink
Verwirrung in diversen Beiträgen
Wir beginnen mit einer Begriffsdefinition:
Zeiger: irgendetwas mit einer phsyischen Adresse als Ziel
Referenz: irgendetwas mit der virtuellen Einheit hinter der physischen
Adresse als Ziel

(Fraglich ob die Definition nachvollziehbar ist)

Maybe anders:

Ziel vom Zeiger: Hardwareadresse Nr. 7324324
Ziel der Referenz: Instanz Nr. 233424 die wiederum zufällig auf der
Hardwareadresse Nr 7324324 zu finden ist.

Somit gibt es in Java keine Zeiger sondern nur Referenzen. Punkt
Anfangsfrage somit mit "Gibt keine Zeiger" beantwortbar.

Wieso bin ich der Meinung? Ganz einfach: Die interne Repräsentation der
Referenz geht mich einfach nichts an ;o) Wobei mir kein Weg einfallen
würde die Referenz andes als über Zeiger abzubilden ...

Ist ungefähr wie die Frage: Wie groß ist denn mein Objekt im Speicher?
Antwort: Blubb keine Ahnung. Frag mal die Programmierer der von dir
Benutzten VM, die könnten das in dem Falle wissen. Auf ner anderen
Plattform / VM ists nämlich eventuell einfach anders.

Wieso geht mich im übrigen die Hardwaradresse in der Referenz nix an? Na
wer weiß denn schon was meine VM so treibt. Vielleicht hat sie ja gerade
vor 10 Sekunden den Speicher defragmentiert und somit das Objekt auf
eine andere Hardwareadresse verschoben. Dürfte sie ja (Machen das
eigentlich einige VMs?).

Referenzen sind also eine Abstraktionsebene von den Zeigern entfernt.
Thats all ;o)

Vielleicht definiert aber auch jemand von euch die Begriffe Referenzen
und Zeiger einfach anders. Tja dann würde auch die Antwort eine andere
werden. Somit müsste also der Ursprungsposter zuerst den Begriff Zeiger
präszise definieren um überhaupt eine Antwort zu ermöglichen.

(Einige der hier verwendeten Beispiele / Metaphern habe ich mir gerade
vorhin aus den Fingern gesaugt, also nicht allzu genau nehmen, thx)

cybi aka Neuhauser Bernhard
Oliver Hittmeyer
2004-05-06 14:20:07 UTC
Permalink
Post by Cybernd
Verwirrung in diversen Beiträgen
Zeiger: irgendetwas mit einer phsyischen Adresse als Ziel
Referenz: irgendetwas mit der virtuellen Einheit hinter der physischen
Adresse als Ziel
(Fraglich ob die Definition nachvollziehbar ist)
aaaaahh... nix Hardwareaddresse: die Zeiger unter C, C++ (was noch?)
zeigen auch nur auf virtuelle Addressen, die vom Betriebssystem
vorgegeben werden...
Post by Cybernd
Ziel vom Zeiger: Hardwareadresse Nr. 7324324
Ziel der Referenz: Instanz Nr. 233424 die wiederum zufällig auf der
Hardwareadresse Nr 7324324 zu finden ist.
Somit gibt es in Java keine Zeiger sondern nur Referenzen. Punkt
Anfangsfrage somit mit "Gibt keine Zeiger" beantwortbar.
ebent nicht - siehe oben
Cybernd
2004-05-06 14:28:39 UTC
Permalink
Post by Oliver Hittmeyer
aaaaahh... nix Hardwareaddresse: die Zeiger unter C, C++ (was noch?)
zeigen auch nur auf virtuelle Addressen, die vom Betriebssystem
vorgegeben werden...
Achja und wie oft geschieht es das bei c / c++ diese Referenzen sich
wärend der Laufzeiten ändern? Gar nicht? Kanns etwa doch sein das hier
ein Unterschied zur VM in Java besteht?

Ich ändere einfach meine Argumentation ab, kein Problem:

Ziel vom Zeiger: Vom OS vergebene virtuelle Adresse
Ziel der Referenz: Instanz hinter einer der vorhin erwähnten Adresse

Du kannst es drehen oder wenden wie du es willst. Es bleibt dennoch das
gleiche Problem: Referenzen sind eine Abstraktionsebene weiter vom
Speicher entfernt als der Zeiger selbst.

cybi
Michael Heinold
2004-05-06 15:15:38 UTC
Permalink
Post by Cybernd
Post by Oliver Hittmeyer
aaaaahh... nix Hardwareaddresse: die Zeiger unter C, C++ (was noch?)
zeigen auch nur auf virtuelle Addressen, die vom Betriebssystem
vorgegeben werden...
Achja und wie oft geschieht es das bei c / c++ diese Referenzen sich
wärend der Laufzeiten ändern? Gar nicht? Kanns etwa doch sein das hier
ein Unterschied zur VM in Java besteht?
Ziel vom Zeiger: Vom OS vergebene virtuelle Adresse
Ziel der Referenz: Instanz hinter einer der vorhin erwähnten Adresse
Du kannst es drehen oder wenden wie du es willst. Es bleibt dennoch das
gleiche Problem: Referenzen sind eine Abstraktionsebene weiter vom
Speicher entfernt als der Zeiger selbst.
cybi
hi,

nur so als kleiner einwurf:
um es genau zu nehmen hat der x86 prozessor (welche anderen das noch
kennen weiß ich nun nicht) oder ein andere chip auf dem board einen
adressumsetzungsmechanismus in hardware implementiert. das betriebssystem
hat nun eine tabelle mit einer realen und einer für die anwendung
verwendeten adresse. ich wage mich dunkel zu erinnern, dass solch eine
adressetabelle für jeden adressraum den ein betriebssystem generiert,
existiert.
und damit das ganze noch flott über die bühne läuft eben die genannte
hardware implementierung.

gruß michael
Cybernd
2004-05-06 15:55:31 UTC
Permalink
Hi again

(leises Fluchen da Thunderbird gerade sein Profil ins Nirvana beförderte)

Zum Thema "Lookuptable" der Adressen: (Darf ich doch einfach als Lookup
umschreiben oder? ;o) Gegeben sei eine Lookuptable hinter den Zeigern in
C als auch hinter den physischen Objekten in Java. So hat man dennoch
bei der Referenz in Java wieder eine Abstraktionsebene mehr. Mag sein
das jetzt sich die Adresse in der Lookuptable (wo auch immer die im
Prozessor liegen mag) ändert. Das kann sie ja auch in Java.

Ich bezweichne also Lookuptable jetzt als Hardwareadresse. Denn man
nimmt eine physische Adresse dieser Lookuptable und verwendet diese nun
als Adresse.

Ist ja nun belanglos ob dahinter eine Auflösung stattfindet oder nicht.
Könnte ja auch eine Lookuptable hinter einer Lookuptable hinter der
wahren Adresse sein => Die Applikation sollte das ja gar nicht erst
mitkriegen.

Bei Java kann nunmal der referenzinterne Zeiger aus so einem Mechanismus
bestehen. Zusätzlich ist aber noch die Abstraktion der Referenz
vorhanden wodurch die VM hier noch einmal innerhalb dieser VM mit dem
Speicher rumwurschteln kann wie es Ihr selbst beliebt. Unabhängig vom
momentanen Betriebssystem bzw. den Möglichkeiten der Hardware denn die
VM selbst spezifiziert ja Ihre eigene Speicherverwaltung.

Ich hoffe du verstehst worauf ich hinaus will. Bekomme nämlich schon
einen leichten Knoten in meinen Gedankengängen und ich bin mir dessen
bewußt das ichs ziemlich unsauber / kryptisch Erkläre ..

cybi
Michael Heinold
2004-05-06 16:35:07 UTC
Permalink
ich versteh schon worauf du hinauswillst und will da auch nix dagegen
sagen!

java referenz -> vm lookup -> wer weiß ob noch ein bs lookup, nehme es
aber mal an, die vm ist ja letztlich auch wieder eine anwendung mit
eigenem adressraum -> ram

c++ zeiger -> bs lookup -> ram

kann man nicht aber einfach die definition (zumindest bei c++ und java) so
halten:

referenz und zeiger besitzen grundsätzlich die eigenschaft auf etwas zu
verweisen (meinetwegen speicher oder lookup oder sonstwas)

nur die referenz hat dann wieder andere eigenschaften als der zeiger.

der zeiger kann zeigerarithmetik und die referenz hat dafür die stärke
einen wert oder null zu besitzen und keine irgendwie abstruse
speicherstelle (0xcdcdcdcd ms vc++). sie ermöglicht damit keine
fehlgeleiteten speicherzugriffe sondern wirft sauber eine
nullpointer(referenz)exception aus.

beide haben somit unterschiedliche methoden die gleiche eigenschaft des
verweisens (auf was auch immer).

was nun aber eine sprache hat (zeiger oder referenz) geben IMHO letztlich
die programmierer vor. vielleicht steht ja auch was in der wikipedia, aber
da komm ich momentan nicht ran...

gruß

michael
Patrick Roemer
2004-05-06 17:17:18 UTC
Permalink
Post by Michael Heinold
was nun aber eine sprache hat (zeiger oder referenz) geben IMHO letztlich
die programmierer vor. vielleicht steht ja auch was in der wikipedia, aber
da komm ich momentan nicht ran...
Ist vielleicht einfach bei Dir nicht darstellbar, weil Grossbuchstaben
verwendet werden? ;)

| Ein Pointer ist in der Programmierung eine Variable, die auf eine
| Speicheradresse zeigt.
|
| Pointer kommen vor allem in maschinennahen Programmiersprachen vor,
| wie z.B. Assembler, C oder C++, während man in vielen
| objektorientierten Programmiersprechen wie Java oder Eiffel auf diese
| Art der Variablen verzichtet. Man verwendet sie, um auf andere
| Variablen oder Funktionen zu verweisen, wobei man bei Pointern immer
| zwischen zwei Zugriffsverfahren unterscheidet: einmal auf die im
| Pointer gespeicherte Speicheradresse und einmal auf den Wert oder die
| Funktion unter der gespeicherten Adresse.

Hier nimmt man also als Kriterien fuer 'Zeigerheit', dass auf eine
Speicheradresse verwiesen wird, und dass man diese im Kontext der
Sprache auslesen kann. Beides trifft in Java nicht zu.

Viele Gruesse,
Patrick
Michael Heinold
2004-05-06 17:30:52 UTC
Permalink
Post by Patrick Roemer
Ist vielleicht einfach bei Dir nicht darstellbar, weil Grossbuchstaben
verwendet werden? ;)
nö passt schon, hat irgendwie mit unserem router zu tun... mit den
grossbuchstaben nichts :) (immerhin gehts ja weiter zu de.wikipedia.org
nur da stoppt es).
für die großschreibung bin ich einfach zu faul. Aber wenn es als gute
Gepflogenheit gilt, dann pass ich mich gerne an, Übung schadet ja nicht ;)!

Gruß

Michael
Bernhard Schandl
2004-05-06 15:41:35 UTC
Permalink
Post by Cybernd
Post by Oliver Hittmeyer
aaaaahh... nix Hardwareaddresse: die Zeiger unter C, C++ (was noch?)
zeigen auch nur auf virtuelle Addressen, die vom Betriebssystem
vorgegeben werden...
Achja und wie oft geschieht es das bei c / c++ diese Referenzen sich
wärend der Laufzeiten ändern? Gar nicht? Kanns etwa doch sein das hier
ein Unterschied zur VM in Java besteht?
Sie können sich ändern (wenn z.B. das OS die Applikation in einen
anderen Speicherbereich verschiebt), du (als Programm(ierer))
merkst es nur nicht. Wie in Java.
Post by Cybernd
Ziel vom Zeiger: Vom OS vergebene virtuelle Adresse
Ziel der Referenz: Instanz hinter einer der vorhin erwähnten Adresse
Du kannst es drehen oder wenden wie du es willst. Es bleibt dennoch das
gleiche Problem: Referenzen sind eine Abstraktionsebene weiter vom
Speicher entfernt als der Zeiger selbst.
Das führt uns auf die Diskussion zurück, was eine VM ist und was
nicht. Aber da halt ich mich raus ;-)

lg, Bernhard
Martin Heibel
2004-05-06 20:14:58 UTC
Permalink
Post by Cybernd
Verwirrung in diversen Beiträgen
Die Du jetzt noch zu steigern versuchst?
Post by Cybernd
Zeiger: irgendetwas mit einer phsyischen Adresse als Ziel
Referenz: irgendetwas mit der virtuellen Einheit hinter der physischen
Adresse als Ziel
Mein erster Kontakt mit Zeiger und Referenz war vor langer, langer Zeit bei
Pascal. Da gab es die Referenz im "Call by reference", sie war eine Art
"impliziter" Zeiger, dessen Ziel sich nicht ändern konnte. Zeiger konnten
auf Daten zeigen oder leer (war das nil?) sein. Mit Adressen hat das gar
nichts zu tun.

Ooooops ... dann gibt es ja in Java nur Zeiger!

Aber generell war man sich in Fachkreisen (das ist weit weg von hier)
bereits damals einig, dass "Zeiger" und "Referenz" nur zwei Worte für das
selbe Konstrukt sind.
Post by Cybernd
(Fraglich ob die Definition nachvollziehbar ist)
Sie ist einfach nur willkürlich und deshalb irrelevant.
Post by Cybernd
Wieso bin ich der Meinung? Ganz einfach: Die interne Repräsentation der
Referenz geht mich einfach nichts an ;o)
Die interne Repräsentation eines Zeigers geht Dich nicht mal in C/C++ was
an, also wo ist der Unterschied?
Post by Cybernd
Ist ungefähr wie die Frage: Wie groß ist denn mein Objekt im Speicher?
Antwort: Blubb keine Ahnung. Frag mal die Programmierer der von dir
Benutzten VM, die könnten das in dem Falle wissen. Auf ner anderen
Plattform / VM ists nämlich eventuell einfach anders.
Was weiß ich über die Objektgröße in C++? Selbst der sizeof-Operator kann
mir für die gleiche Klasse bei verschiedenen Compilern oder sogar bei
verschiedenen Konfigurationen des selben Compilers verschiedene Werte
zurückgeben und die sind nur vielfache von sizeof(char), was per Definition
1 ist, aber wieviele Bit so ein char hat, weiß ich auch nicht.
Post by Cybernd
Wieso geht mich im übrigen die Hardwaradresse in der Referenz nix an? Na
wer weiß denn schon was meine VM so treibt. Vielleicht hat sie ja gerade
vor 10 Sekunden den Speicher defragmentiert und somit das Objekt auf
eine andere Hardwareadresse verschoben. Dürfte sie ja (Machen das
eigentlich einige VMs?).
Du weißt schon, dass eine PM (physical machine) das selbe tut? Und wenn Dein
C-Programm unter VM-Ware läuft, dann...
Post by Cybernd
Referenzen sind also eine Abstraktionsebene von den Zeigern entfernt.
Thats all ;o)
Im Quellcode sieht das alles gleich aus, also wo bitte ist der
Abstraktionsunterschied?
Post by Cybernd
Vielleicht definiert aber auch jemand von euch die Begriffe Referenzen
und Zeiger einfach anders. Tja dann würde auch die Antwort eine andere
werden. Somit müsste also der Ursprungsposter zuerst den Begriff Zeiger
präszise definieren um überhaupt eine Antwort zu ermöglichen.
Weißt Du, was der Unterschied zwischen Informatikern und Computer
benutzenden Spielkindern ist? Erstere sind nahezu ausgestorben.

Gruß,
Martin
michael paap
2004-05-06 20:26:26 UTC
Permalink
Post by Martin Heibel
Aber generell war man sich in Fachkreisen (das ist weit weg von hier)
und
Post by Martin Heibel
Weißt Du, was der Unterschied zwischen Informatikern und Computer
benutzenden Spielkindern ist? Erstere sind nahezu ausgestorben.
und
Post by Martin Heibel
Dann kommt
man auch nicht auf so dämliche Ideen, wie die von dem Trottel, der hier
gestern oder so meinte durch casten eine Typwandlung durchführen zu können.
und
Post by Martin Heibel
Du willst uns die ganze Zeit beweisen, wie toll Du abstrahieren kannst
Brrr. Versuchst Du hier A.G. Konkurrenz zu machen? Ich mein... wenn
*ich* schon finde, dass Deine Beiträge ziemlich vom hohen Ross dessen,
der über die letztendlich gültige Erkenntnis verfügt, herab klingen,
dann ist das ganz schön bedenklich. ;-)

Liegt es am Thema, an Dir oder an meiner Wahrnehmung?

Gruß,
Michael
--
Die Adresse im From existiert, wird aber nicht gelesen. Daher:
Sollte ausnahmsweise eine Mail-Antwort auf ein Posting vonnöten sein,
bitte folgende Adresse verwenden: newsreply@<Absender-Domain>.
Martin Heibel
2004-05-07 17:42:45 UTC
Permalink
Post by michael paap
Post by Martin Heibel
Aber generell war man sich in Fachkreisen (das ist weit weg von hier)
Hier Antworten IMHO zu viele Leute, die selbst keine Ahnung haben.
Post by michael paap
und
Post by Martin Heibel
Weißt Du, was der Unterschied zwischen Informatikern und Computer
benutzenden Spielkindern ist? Erstere sind nahezu ausgestorben.
Gerade diese Diskussion beweist, dass es hier mehr um die Darstellung der
eigenen Meinung geht, als darum dem armen OP zu helfen, der mit den Teilen
meines Postings, die Du Dir zu kommentieren gespart hast, vermutlich mehr
anfangen kann, als mit dem rest dieses Threads.
Post by michael paap
und
Post by Martin Heibel
Dann kommt
man auch nicht auf so dämliche Ideen, wie die von dem Trottel, der hier
gestern oder so meinte durch casten eine Typwandlung durchführen zu können.
Wenn man in realen Software-Projekten die Folgen dessen, was solche Leute
verbrechen, mitbekommt, dann findet man "Trottel" noch nett.
Post by michael paap
und
Post by Martin Heibel
Du willst uns die ganze Zeit beweisen, wie toll Du abstrahieren kannst
Brrr. Versuchst Du hier A.G. Konkurrenz zu machen?
Ich will niemandem Konkurrenz machen, das habe ich gar nicht nötig.
Post by michael paap
Ich mein... wenn
*ich* schon finde, dass Deine Beiträge ziemlich vom hohen Ross dessen,
der über die letztendlich gültige Erkenntnis verfügt, herab klingen,
dann ist das ganz schön bedenklich. ;-)
Im Gegensatz zu den anderen Leuten, die in diesem Thread ihre Meinung zum
besten geben, verweise ich immerhin einigermaßen auf die Quellen meines
Wissens. Vor dem Posten (ok, das konntest Du nicht wissen) habe ich mich
mit Hilfe von Google noch mal informiert, was man so an Informationen über
das Thema findet und fand das was ich gelernt habe bestätigt.

Leute wie Cybernd geben hier nur das wieder, was sie sich vermutlich selbst
aus dem Alltagsjargon der Programmierszene (dazu muss man leider auch einen
Großteil der professionellen SW-Entwicklung zählen) zusammengereimt haben.
Post by michael paap
Liegt es am Thema, an Dir oder an meiner Wahrnehmung?
Es liegt 1. an mir, weil ich mir manchmal Luft machen muss, aber Ihr solltet
echt froh sein, dass sich hier gelegentlich noch jemand rumtreibt, der
Ahnung hat, denn viele gute Leute posten hier nicht (im Vergleich z.B. zu
de.comp.lang.iso-c++).

2. liegt es auch an Deiner Wahrnehmung, weil Du scheinbar denkst, dass meine
fachlichen Ausführungen irrelevant sind (Du hast keine davon kommentiert),
weil ich einen Ton anschlage, der Dir nicht gefällt. Aber der Ton ist IMO
durchaus angemessen, wenn man bedenkt, was dem OP hier zugemutet wird, der
vermutlich keinen Schritt weiter ist als vor seiner Anfrage hier, denn alle
nützlichen Aussagen wurden so heftig attackiert, dass er wohl kaum wissen
dürfte, was er nun glauben soll.

Übrigens: wenn A die Wahrheit hinausbrüllt und B eine Lüge flüstert ist B
nicht im Recht, denn nicht "Wer schreit hat unrecht", sondern wer lügt -
egal in welcher Lautstärke.

Also beweise mir, dass ich inhaltlich unrecht habe und nehme auch die
(dezenten) Beschimpfungen zurück.

Gruß,
Martin
michael paap
2004-05-07 20:18:13 UTC
Permalink
Post by Martin Heibel
Post by michael paap
Brrr. Versuchst Du hier A.G. Konkurrenz zu machen?
Ich will niemandem Konkurrenz machen, das habe ich gar nicht nötig.
Sieht so aus, als überträfest Du ihn mühelos, ja.
Post by Martin Heibel
Es liegt 1. an mir, weil ich mir manchmal Luft machen muss, aber Ihr solltet
echt froh sein, dass sich hier gelegentlich noch jemand rumtreibt, der
Ahnung hat, denn viele gute Leute posten hier nicht (im Vergleich z.B. zu
de.comp.lang.iso-c++).
Was haben wir hier nur gemacht, bevor Du eingeschlagen bist?
Post by Martin Heibel
Also beweise mir, dass ich inhaltlich unrecht habe und nehme auch die
(dezenten) Beschimpfungen zurück.
Ab einem gewissen Grad von Pöbelei und
sich-für-den-Nabel-der-Welt-und-den-Hüter-aller-Wahrheit-Haltens ist
imho ein Posting unabhängig vom vielleicht vorhandenen sachlichen Gehalt
nicht lesenswert.

Aber viel Spaß noch.
Michael
--
Die Adresse im From existiert, wird aber nicht gelesen. Daher:
Sollte ausnahmsweise eine Mail-Antwort auf ein Posting vonnöten sein,
bitte folgende Adresse verwenden: newsreply@<Absender-Domain>.
Cybernd
2004-05-07 20:28:10 UTC
Permalink
Blub
Ist dir schon jemals in den Sinn gekommen das Begriffe durchaus geprägt
werden können? Das vielleicht ein Begriff nach jahrelanger Benutzung
einer großen Community in einem speziellen Kontext durchaus mit einer
spezifischeren Bedeutung belegt werden um eine präzisere Aussage zu treffen?

Wenn nicht, dann bedeutet wohl der Begriff Zeiger nicht einmal das sich
dahinter Daten bzw. physikalische Adressen verbergen können. Und ja das
Wort Zeiger entstand aller Wahrscheinlichkeit schon lange vor der
Prägung durch die IT. Wieso also glaubst du nun das die gesammte IT
genau diese eine Definition annehmen müsse? Könnte es nicht sein das im
Kontext einer spezifischen Community durchaus aufgrund von dortigen
Gegebenheiten eine andere Prägung stattgefunden haben könnte?

Ach nein richtig. Es gibt zu wenig Java Programmierer als das man einen
Begriff in dieser klitzekleinen Community mit einer speziellen für Java
gültigen Prägung versehen könnte. War wohl dumm von sun den Begriff
Referenz zu wählen. Sie hätten besser ein neues Wort erfinden sollen.

cybi
Cybernd
2004-05-06 21:10:48 UTC
Permalink
[snip]
*schmunzel*

cybi
Oliver Hittmeyer
2004-05-06 14:08:13 UTC
Permalink
Post by Martin Feltes
Hallo,
kann mir jemand Informationen zum Thema "Zeiger in Java" geben?
Ich brauche diese für einen Vortrag in der Schule.
Vielen Dank schonmal...
mfg,
Martin Feltes
Java hat Zeiger, denn eine Referenz ist (ganz grundlegend) nichts anders
als eine (Platzhalter-)Variable (wohl um die 4Byte [32bit] gross),
welche auf eine bestimmte Speicheraddresse zeigt/referenziert/verweist,
an welcher das eigentliche Objekt (beliebig gross) 'liegt'

Was Java nicht hat ist Zeigerarithmetik - mit welcher man mehr/weniger
schön (und mehr/weniger sicher) 'Schindluder' treiben kann um direkt
auf den Speicheraddressen zu lesen/schreiben

Gruss
Patrick Roemer
2004-05-06 15:48:59 UTC
Permalink
Post by Oliver Hittmeyer
Java hat Zeiger, denn eine Referenz ist (ganz grundlegend) nichts anders
als eine (Platzhalter-)Variable (wohl um die 4Byte [32bit] gross),
welche auf eine bestimmte Speicheraddresse zeigt/referenziert/verweist,
an welcher das eigentliche Objekt (beliebig gross) 'liegt'
Du hast also ein Ding, dessen Wert Du nicht auslesen kannst, das Du
nicht explizit dereferenzieren kannst (bzw. das gar nicht verwendet
werden kann, ohne automatisch und transparent dereferenziert zu werden),
mit dem Du keine Zeigerarithmetik betreiben kannst, und zu dem Du vor
allem auch keine Aussage dazu treffen kannst, was da eigentlich 'liegt':
Die interne Repraesentation von Objekten ist der VM-Implementierung
voellig freigestellt. Mit diesen Informationen ist die Diskussion, ob
eine Java-Referenz 'objektiv' ein Zeiger ist, IMO so sinnvoll wie die
darueber, ob das Geraeusch eines fallenden Baumes im Wald lauter ist,
wenn niemand zuhoert.

Was ein Zeiger oder eine Referenz ist, haengt schlicht von der
betrachteten Sprache ab. Um es mit der IMO ganz vernuenftigen
FOLDOC-Definition zu sagen: 'An address, from the point of view of a
programming language. [...] The terms "pointer" and "reference" are
generally interchangable although particular programming languages often
differentiate these two in subtle ways.'

Wie sieht es also in der speziellen Programmiersprache Java aus? In der
JLS kommt der Begriff 'Pointer' ein einziges mal vor:

| The reference values (often just references) are pointers to these
| objects, and a special null reference, which refers to no object.

Ich wuerde hier sagen, dass man aufgrund der eher 'flapsigen' Verwendung
des Begriffs unterstellen kann, dass allgemein 'Verweis' und nicht
'Adresse' gemeint ist. Aber auch wenn man dieser Interpretation nicht
folgen will: Was ist denn dann die Nullreferenz? Offenbar doch kein
Pointer, oder?

In der VM-Spec (die sich ja nun auch nicht mehr mit der Sprache, sondern
mit der Implementierung ihrer Laufzeitumgebung befasst), heisst es:

| Values of type reference can be thought of as pointers to objects.

Kann man sich so vorstellen, muss aber wohl nicht - insbesondere, wenn
spaeter darauf hingewiesen wird, dass je nach Implementierung noch ein
'Handle' dazwischenliegen kann.

Wenn man ansonsten bei Sun sucht, findet man zwar oefter sprachliche
Inkonsistenzen (NPE wurde ja schon angesprochen), aber auch deutliche
Aussagen wie 'Because there are no pointers in Java, [...]', 'Thus, Java
has no pointer data types.', 'Java technology has no pointers. Instead,
all references to allocated storage, which in practice means all
references to an object, are through symbolic "handles".', usw. usf.

Viele Gruesse,
Patrick
Martin Heibel
2004-05-07 19:46:52 UTC
Permalink
Post by Patrick Roemer
Du hast also ein Ding, dessen Wert Du nicht auslesen kannst,
Ein "Zeiger" *zeigt* auf etwas. Wie er das tut hängt vom Kontext ab. Eine
Adresse ist nur eine mögliche Implementierung für einen Zeiger und diese
kann man auch nur dann auslesen, wenn das die Programmiersprache erlaubt.
Post by Patrick Roemer
das Du
nicht explizit dereferenzieren kannst (bzw. das gar nicht verwendet
werden kann, ohne automatisch und transparent dereferenziert zu werden),
Automatisch und transaprent? Ich muss ganz explizit einen '.' schreiben,
damit das passiert.
Post by Patrick Roemer
mit dem Du keine Zeigerarithmetik betreiben kannst,
Eine Spezialität von Low-Level-Sprachen wie Assembler und C/C++. Die darauf
basiert, dass man sehr viele Details der internen Repräsentation fest
definiert hat.
Post by Patrick Roemer
und zu dem Du vor
Doch: ein Objekt.
Post by Patrick Roemer
Die interne Repraesentation von Objekten ist der VM-Implementierung
voellig freigestellt.
Das ist mir aber als Programmierer völig egal, denn ich habe einen Zeiger,
der auf ein Objekt zeigt, außer dem Sonderfall null (s.unten).
Post by Patrick Roemer
Was ein Zeiger oder eine Referenz ist, haengt schlicht von der
betrachteten Sprache ab. Um es mit der IMO ganz vernuenftigen
FOLDOC-Definition zu sagen: 'An address, from the point of view of a
programming language. [...] The terms "pointer" and "reference" are
generally interchangable although particular programming languages often
differentiate these two in subtle ways.'
Ja, z.B. C/C++ und Pascal, bei denen eine Referenz nach ihrer
Initialisierung das "Objekt", auf das sie zeigt nicht wechseln und nicht
null/nil/0 sein darf, während ein Zeiger all das kann.
Post by Patrick Roemer
Wie sieht es also in der speziellen Programmiersprache Java aus? In der
| The reference values (often just references) are pointers to these
| objects, and a special null reference, which refers to no object.
Ich wuerde hier sagen, dass man aufgrund der eher 'flapsigen' Verwendung
des Begriffs unterstellen kann, dass allgemein 'Verweis' und nicht
'Adresse' gemeint ist.
"Pointer" = "Zeiger", also "zeigt" er auf etwas, also "verweist" er auf
etwas. Du argumentierst gerade für die Gegenseite.
Post by Patrick Roemer
Aber auch wenn man dieser Interpretation nicht
folgen will: Was ist denn dann die Nullreferenz? Offenbar doch kein
Pointer, oder?
Was ein Glück, dass es in C (da gibt es doch Pointer, oder?) keine
Null-Pointer gibt. Da ein Pointer sein Ziel zur Laufzeit ändern kann, kann
es ohne weiteres Bedarf für den Sonderfall geben dass er gerade auf
"Nichts" verweist. Das Standardanfängerbeispiel für die Benutzung von
Pointern ist die Verkettete Liste, da ist es unerlässlich, einen
definierten Null-Pointer zu haben, da dieser das Ende der Liste markiert.
Post by Patrick Roemer
In der VM-Spec (die sich ja nun auch nicht mehr mit der Sprache, sondern
| Values of type reference can be thought of as pointers to objects.
Kann man sich so vorstellen, muss aber wohl nicht - insbesondere, wenn
spaeter darauf hingewiesen wird, dass je nach Implementierung noch ein
'Handle' dazwischenliegen kann.
Auch ein Handle ist ein Pointer, oder warum heißen die Smart-Pointer in der
C++-Standard-Library auto_*ptr*? Das sind auch Handles. Und was ist mit dem
"Counted *Pointer*"-Idiom? Und schreibt der C++-Standard vor, dass Pointer
Speicheradressen beinhalten? Ich glaube nicht, es wird auch nur das
Verhalten definiert.
Post by Patrick Roemer
Wenn man ansonsten bei Sun sucht, findet man zwar oefter sprachliche
Inkonsistenzen (NPE wurde ja schon angesprochen), aber auch deutliche
Aussagen wie 'Because there are no pointers in Java, [...]', 'Thus, Java
has no pointer data types.', 'Java technology has no pointers. Instead,
all references to allocated storage, which in practice means all
references to an object, are through symbolic "handles".', usw. usf.
Java wurde offensichtlich daraufhin entwickelt, gut bei C++-Entwicklern
anzukommen, da man damit auf eine große Entwicklergemeinde zurückgreifen
konnte, ohne die der Erfolg dieser Sprache nicht zustandegekommen wäre. Da
man bei C++ mit "Pointer" etwas ganz spezielles Verbindet, was ganz
spezielle Probleme mit sich bringt ("dangling pointers"), ist auch die
Dokumentation oft so formuliert, dass die diesbezüglichen Unterschiede
zwischen C++ und Java herausgestrichen werden. Korrekt wären Formulierungen
wie 'Java technology has no pointers like C++.', was aber nicht gerade sehr
lesbar ist.

Bei der Diskussion hier sollte man einmal sehen, was das abstrakte Konstrukt
"Pointer" eigentlich ist, und prüfen, ob sich die Referenzen in Java so
verhalten, dass sie darauf passen. Was dann hinter den Kulissen des
Quellcodes passiert ist dabei völlig egal.

Aus meiner Erinnerung (Praktisch Informatik, Uni Mannheim, 1987) sinngemäß:

- Ein Pointer zeigt auf Daten
- Als Sonderfall kann er auch "nil" sein, dann zeigt er auf nichts
- Mehrere Pointer können auf das selbe Datum zeigen
- Wenn man ein Datum über einen Pointer ändert, sind die Änderungen über
alle Pointer, die darauf zeigen sichtbar

Die Darstellung, die wir damals hatten, waren Kästchen für die Daten, Punkte
für die Pointer und vom Punkt weg einen Pfeil, der auf das referenzierte
Datum zeigt, wenn der Pointer nicht nil ist.

Mit Adressen hat das erst mal nix zu tun und Pointer-Arithmetik kam dabei
auch nicht vor (Beispiele wurden alle in Standard(!)-Pascal programmiert).
Erst beim Kontakt mit C (außerhalb des Studiums) kamen
Implementierungsdetails zum Vorschein wie das, dass Pointer Adressen
speichern.

Gruß,
Martin
Patrick Roemer
2004-05-07 22:14:13 UTC
Permalink
Post by Martin Heibel
Post by Patrick Roemer
Du hast also ein Ding, dessen Wert Du nicht auslesen kannst,
Ein "Zeiger" *zeigt* auf etwas. Wie er das tut hängt vom Kontext ab. Eine
Adresse ist nur eine mögliche Implementierung für einen Zeiger und diese
kann man auch nur dann auslesen, wenn das die Programmiersprache erlaubt.
Das ist Deine Definition. Dass das eine moegliche gueltige ist, ist
klar. Auf die 'Quellen Deines Wissens' hast Du IIRC ja bestenfalls sehr
vage verwiesen.

Ich habe bisher fast ausschliesslich Definitionen gefunden, die
zumindest den Begriff der Adresse beinhalten. (Und tendiere selber eher
zur abstrakteren von diesen, naemlich der, die ich aus FOLDOC zitiert
habe: Die setzt zwar prinzipiell die Begriffe Zeiger und Referenz
gleich, verweist aber darauf, dass es jeweils auf den Kontext der
betrachteten Sprache ankommt, was nun wirklich gemeint ist.)
Post by Martin Heibel
Post by Patrick Roemer
| The reference values (often just references) are pointers to these
| objects, and a special null reference, which refers to no object.
Ich wuerde hier sagen, dass man aufgrund der eher 'flapsigen' Verwendung
des Begriffs unterstellen kann, dass allgemein 'Verweis' und nicht
'Adresse' gemeint ist.
"Pointer" = "Zeiger", also "zeigt" er auf etwas, also "verweist" er auf
etwas. Du argumentierst gerade für die Gegenseite.
Nein. Du drehst es nur, wie es Dir passt. Ich interpretiere das so, dass
der normalsprachliche 'Verweis' gemeint ist, und nicht der Fachterminus
'Pointer'. Letzterer findet sich auch in den Dictionaries, in denen ich
jetzt noch mal nachgesehen habe, als '[comp.] Adressenverweis' oder als
'[Computers] an identifier giving the location in storage of something
of interest, as a data item, table or subroutine'. Du behauptest, auch
der Fachterminus bedeute nicht viel weiter als 'Verweis', ohne
Bezugnahme auf ein adressierbares Medium. Diese Behauptung in der
Diskussion als Voraussetzung anzunehmen, ist nicht wirklich hilfreich.
Post by Martin Heibel
Post by Patrick Roemer
| Values of type reference can be thought of as pointers to objects.
Kann man sich so vorstellen, muss aber wohl nicht - insbesondere, wenn
spaeter darauf hingewiesen wird, dass je nach Implementierung noch ein
'Handle' dazwischenliegen kann.
Auch ein Handle ist ein Pointer, oder warum heißen die Smart-Pointer in der
C++-Standard-Library auto_*ptr*?
Die VM-Spec spricht von Java, nicht von C++. Und im Kontext der VM ist
mit 'Handle' etwas anderes gemeint, als ein Pointer, naemlich ein
Verbund von zwei (ja, hier tatsaechlich) Pointern.
Post by Martin Heibel
Java wurde offensichtlich daraufhin entwickelt, gut bei C++-Entwicklern
anzukommen, da man damit auf eine große Entwicklergemeinde zurückgreifen
konnte, ohne die der Erfolg dieser Sprache nicht zustandegekommen wäre. Da
man bei C++ mit "Pointer" etwas ganz spezielles Verbindet, was ganz
spezielle Probleme mit sich bringt ("dangling pointers"), ist auch die
Dokumentation oft so formuliert, dass die diesbezüglichen Unterschiede
zwischen C++ und Java herausgestrichen werden. Korrekt wären Formulierungen
wie 'Java technology has no pointers like C++.', was aber nicht gerade sehr
lesbar ist.
Genau das ist aber im Java- (und trivialerweise im C++-)Kontext mit
'Pointer' gemeint. Das ist nicht besonders gluecklich, genau wie es
ungluecklich ist, dass der Begriff 'Referenz' auch anders belegt ist,
als jemand, der von C/C++ kommt, es erwartet. Aber so ist es nun mal.
Post by Martin Heibel
- Ein Pointer zeigt auf Daten
- Als Sonderfall kann er auch "nil" sein, dann zeigt er auf nichts
- Mehrere Pointer können auf das selbe Datum zeigen
- Wenn man ein Datum über einen Pointer ändert, sind die Änderungen über
alle Pointer, die darauf zeigen sichtbar
Wenn ich nach '"praktische informatik" pointer definition' google, finde
ich auch hauptsaechlich Definitionen, die in irgendeiner Form das
Konzept der Adresse beinhalten. Was von den ersten zehn Treffern noch am
ehesten an Deine Sichtweise herankaeme, waere:

| Ein Zeiger ist eine Groesse, deren Wert keine Zahl und kein Zeichen
| oder irgendein anderes Datum ist, sondern ein Verweis auf einen
| Knoten.

Advantage Heibel. Aber zwei Zeilen weiter:

| Der Wert einer Variablen vom Typ Zeiger ist also nichts anderes als
| eine Adresse. Da jedoch vielen Informatikern "Adresse" ein zu
| hardwarenaher Begriff ist (und Zeiger auch nicht unbedingt als
| Adressen verwirklicht zu sein brauchen), sprechen sie lieber von
| Referenz oder Verweis als von Zeiger und Adresse.

Klingt mir zwar leicht verwirrt, aber das Java-Wording waere demgemaess
wohl schon wieder das angemessenere, oder?

Und nun?

Viele Gruesse,
Patrick
Martin Troeger
2004-05-08 06:28:05 UTC
Permalink
Post by Patrick Roemer
Post by Martin Heibel
- Ein Pointer zeigt auf Daten
- Als Sonderfall kann er auch "nil" sein, dann zeigt er auf nichts
- Mehrere Pointer können auf das selbe Datum zeigen
- Wenn man ein Datum über einen Pointer ändert, sind die Änderungen über
alle Pointer, die darauf zeigen sichtbar
Wenn ich nach '"praktische informatik" pointer definition' google, finde
ich auch hauptsaechlich Definitionen, die in irgendeiner Form das
Konzept der Adresse beinhalten. Was von den ersten zehn Treffern noch am
| Ein Zeiger ist eine Groesse, deren Wert keine Zahl und kein Zeichen
| oder irgendein anderes Datum ist, sondern ein Verweis auf einen
| Knoten.
| Der Wert einer Variablen vom Typ Zeiger ist also nichts anderes als
| eine Adresse. Da jedoch vielen Informatikern "Adresse" ein zu
| hardwarenaher Begriff ist (und Zeiger auch nicht unbedingt als
| Adressen verwirklicht zu sein brauchen), sprechen sie lieber von
| Referenz oder Verweis als von Zeiger und Adresse.
Na ich kann ja mal noch den Text aus dem Informatik-Duden (ohne Wertung)
zum Besten geben, den ich mir zu Beginn meines Studiums mal zugelegt habe,
mir aber bisher noch nicht so richtig von Nutzen war:

| Zeiger (engl. pointer, Synonyme: Verweis, Referenz): Eine Variable vom
| Datentyp "Zeiger" kann als Werte Bezeichner von anderen Objekten annehmen
| [...] In einer Assembler-Sprache sind die Bezeichner der Objekte Adressen
| des Speichers, sie stehen daher dem Programierer in Form von Zahlen zur
| Verfügung. In höheren Programmiersprachen sind die Bezeichner der Objekte
| nicht direkt zugünglich [...] Soll eine Zeigervariable keinen Bezeichner
| als Wert besitzen, so erhält sie den konstanen Wert nil (in PASCAL; in
| anderen Programiersprachen auch none oder null).

Grüße, Martin
Patrick Roemer
2004-05-08 12:27:16 UTC
Permalink
Post by Martin Troeger
Na ich kann ja mal noch den Text aus dem Informatik-Duden (ohne Wertung)
zum Besten geben, den ich mir zu Beginn meines Studiums mal zugelegt habe,
| Zeiger (engl. pointer, Synonyme: Verweis, Referenz): Eine Variable vom
| Datentyp "Zeiger" kann als Werte Bezeichner von anderen Objekten annehmen
| [...] In einer Assembler-Sprache sind die Bezeichner der Objekte Adressen
| des Speichers, sie stehen daher dem Programierer in Form von Zahlen zur
| Verfügung. In höheren Programmiersprachen sind die Bezeichner der Objekte
| nicht direkt zugünglich [...] Soll eine Zeigervariable keinen Bezeichner
| als Wert besitzen, so erhält sie den konstanen Wert nil (in PASCAL; in
| anderen Programiersprachen auch none oder null).
Ah, das ist doch mal was. Die Variante mit dem 'Bezeichner' hatte ich
noch nicht, das liegt auf der Abstraktionsskala nett zwischen 'Verweis
auf Daten' und 'Adresse'. Mit der Definition koennte ich mich
prinzipiell auch anfreunden.

Ich habe gerade mal bei xipolis[1] geschaut, was die Konkurrenz sagt:

| Pointer [dt. Zeiger]: ( Verweis, Zeiger, Referenz ), in der
| Programmierung und Informatik eine ->Variable, welche die
| ->Adresse ...
(Brockhaus Computer und Informationstechnologie)

Der Vollstaendigkeit halber und wie ueblich bei diesem Verlag ausser
Konkurrenz:

| Pointer: Bezeichnung für eine Variable, die auf die Adresse einer
| anderen Variablen verweist.
(M+T Computerlexikon)

Viele Gruesse,
Patrick

[1] Fuer die vollstaendigen Artikel muesste man sich fuer so einen
Click'n'Pay-Kram anmelden, was ich mir dann doch lieber sparen wollte.
Wanja Gayk
2004-05-08 14:11:41 UTC
Permalink
Patrick Roemer said...
Post by Patrick Roemer
| Pointer: Bezeichnung für eine Variable, die auf die Adresse einer
| anderen Variablen verweist.
(M+T Computerlexikon)
Sowas kenne ich auch unter der Bezeichnung "Vektor" z.B. bei indirekten
Sprüngen von der 6502: jmp($1000) "springt an die Adresse, die im Vektor
an der Adresse $1000 steht".
Man möchte denken, dass das genau das ist, was das Lexikon einen
"Pointer" nennt, weil das eine indirekte Adressierung ist. Das
interessante daran ist, dass solche Vektoren auch im ROM zu finden sind
und demnach *nicht* Variabel, dennoch *zeigen* sie auf die Zieladresse,
ist also ein Zeiger oder auf Englisch: "Pointer".
Pointer so zu definieren, wie es das M+T Lexikon tut (nämlich als
Variable) ist IMHO doch sehr stark eingeschränkt und nicht
zweckdienlich. Indirekte Adressierung findet nun mal über einen Pointer
statt, es wäre entsprechend Unsinn, einen Indirekten Sprungbefehl nur
dann als Sprung über einen Pointer zu bezeichnen, wenn letzterer
variabel ist, über was springt der Sprung dann im Fall einer konstanten
Indirektion? Ist doch Unsinn da eine zweite Nomenklatur zu suchen.
Zu sagen, man adressiert ein Datum über einen "konstanten Pointer" würde
man anhand des M+T Computerlexikons so lesen: "Man adressiert über eine
konstante Variable, die auf die Adresse einer anderen Variablen
verweist".
Das ist schon aus 2 Gründen völliger Unsinn:
Erstens: es gibt keine konstante Variable, sowas nennt man Konstante und
eine Konstante kann per Definition nicht variabel sein. Pointer können
aber, siehe oben, konstant sein und ein Pointer hört mit dem pointen
nicht auf, nur weil er sich nicht ändert.
Zweitens: Was, wenn dieser Pointer auf eine andere Konstante zeigt? Ist
er kein Pointer mehr, nur weil das, worauf er zeigt sich nicht ändert?
Natürlich ist das völlig Banane, denn der Pointer hört mit dem pointen
nicht auf, weil das, worauf er pointet konstant statt variabel ist.
Einen anderen Namen für diese Fälle zu suchen, wäre sowieso ziemlicher
Unsinn.
Fazit: Diese Definition kannst du getrost vergessen.

Gruß,
-Wanja-
p.s.: Man verzeihe mir mein Denglisch, aber in dem Kontext hielt ich es
für angemessen.
--
At a funeral, the Real Programmer is the one saying "Poor George. And he
almost had the sort routine working before the coronary."
[http://www.pbm.com/~lindahl/real.programmers.html]
Patrick Roemer
2004-05-08 15:01:53 UTC
Permalink
Post by Wanja Gayk
Post by Patrick Roemer
| Pointer: Bezeichnung für eine Variable, die auf die Adresse einer
| anderen Variablen verweist.
(M+T Computerlexikon)
[...]
Post by Wanja Gayk
Fazit: Diese Definition kannst du getrost vergessen.
Jepp. Deswegen nur 'der Vollstaendigkeit halber und wie ueblich bei
diesem Verlag ausser Konkurrenz'. ;)

Viele Gruesse,
Patrick
Wanja Gayk
2004-05-08 20:04:10 UTC
Permalink
Patrick Roemer said...
Post by Patrick Roemer
Post by Wanja Gayk
Post by Patrick Roemer
| Pointer: Bezeichnung für eine Variable, die auf die Adresse einer
| anderen Variablen verweist.
(M+T Computerlexikon)
[...]
Post by Wanja Gayk
Fazit: Diese Definition kannst du getrost vergessen.
Jepp. Deswegen nur 'der Vollstaendigkeit halber und wie ueblich bei
diesem Verlag ausser Konkurrenz'. ;)
Nun ja.. der Verlag hatte durchaus mal ein paar Highlights..
Ich erinnere mich da dunkel an GigaCAD+ von 1986. Ist nur schlappe 18
Jahre her :-).

Gruß,
-Wanja-
--
At a funeral, the Real Programmer is the one saying "Poor George. And he
almost had the sort routine working before the coronary."
[http://www.pbm.com/~lindahl/real.programmers.html]
Loading...