Hallo,
ich bin Java-Anfänger und kapiere eine Sache nicht, die auch nirgends richtig erklärt wird. Also, die typische Deklaration und Erzeugung eines Objekts:
Was mir nicht in den Kopf will, ist, dass man zweimal den Namen der Klasse angeben muss. Das kommt mir wie doppelte, redundante Information vor, und das kann doch nicht sein. Gut, ich weiss, dass das eigentlich zwei Schritte auf einmal sind, erstens Deklaration der Variablen fury:
und zweitens die Erzeugung des Objekts und Zuweisung zur Variablen fury:
Aber wenn die Variable sowieso nur einen Verweis auf den Speicherplatz des Objektes enthält (also nichts als eine Speicheradresse) und nie das Objekt (bzw. dessen Daten und Methoden) selber, wozu muss der Compiler/Interpreter dann wissen, von welchem Typ die Variable sein muss, also von welcher Klasse ihr später ein Objekt zugewiesen werden wird? Wozu muss ich das bei Deklaration der Variablen angeben? Es würde doch reichen, wenn es einen Universaltyp gäbe, der für alle Variablen gelten würde, die ein Objekt zugewiesen bekommen. Beispielsweise ein Typ "Object" oder "Instance" oder wie auch immer. Dieser Typ Variablen müsste doch nur imstande sein, eine Speicheradresse für die jeweiligen Objekte aufzunehmen. Ich meine, warum haben die Erfinder von Java das nicht so gemacht?
Irgendjemand wird jetzt sagen, Pferd() ist ja nicht die Klasse, sondern der Konstruktor, also ich muss einmal die Klasse angeben und einmal den Konstruktor, nicht zweimal dieselbe Information. Aber das ist spitzfindig, weil der Konstruktor sowieso immer so heisst wie die Klasse. Man hätte Java ja auch so konstruieren können, dass man die zwei Klammern weglassen kann. Letztlich muss ich zweimal den Klassennamen angeben.
Und dann gleich noch eine Frage in diesem Zusammenhang:
Jemand hat mir erzählt, es wäre auch folgendes möglich:
wobei ich nur Zugriff auf die Methoden der abstrakten Klasse AbstractTier hätte, nicht auf die von Pferd. Ist das richtig, und wenn ja, was soll so was? Ich dachte, man definiert Klassen gerade dann als abstrakt, wenn ich keine Objekte davon zulassen will!?
Gibt es einen speziellen Namen für so eine Anweisung?
Danke für die kommenden hilfreichen Antworten.
ich bin Java-Anfänger und kapiere eine Sache nicht, die auch nirgends richtig erklärt wird. Also, die typische Deklaration und Erzeugung eines Objekts:
Java:
Pferd fury = new Pferd();
Was mir nicht in den Kopf will, ist, dass man zweimal den Namen der Klasse angeben muss. Das kommt mir wie doppelte, redundante Information vor, und das kann doch nicht sein. Gut, ich weiss, dass das eigentlich zwei Schritte auf einmal sind, erstens Deklaration der Variablen fury:
Java:
Pferd fury;
und zweitens die Erzeugung des Objekts und Zuweisung zur Variablen fury:
Java:
fury = new Pferd();
Aber wenn die Variable sowieso nur einen Verweis auf den Speicherplatz des Objektes enthält (also nichts als eine Speicheradresse) und nie das Objekt (bzw. dessen Daten und Methoden) selber, wozu muss der Compiler/Interpreter dann wissen, von welchem Typ die Variable sein muss, also von welcher Klasse ihr später ein Objekt zugewiesen werden wird? Wozu muss ich das bei Deklaration der Variablen angeben? Es würde doch reichen, wenn es einen Universaltyp gäbe, der für alle Variablen gelten würde, die ein Objekt zugewiesen bekommen. Beispielsweise ein Typ "Object" oder "Instance" oder wie auch immer. Dieser Typ Variablen müsste doch nur imstande sein, eine Speicheradresse für die jeweiligen Objekte aufzunehmen. Ich meine, warum haben die Erfinder von Java das nicht so gemacht?
Irgendjemand wird jetzt sagen, Pferd() ist ja nicht die Klasse, sondern der Konstruktor, also ich muss einmal die Klasse angeben und einmal den Konstruktor, nicht zweimal dieselbe Information. Aber das ist spitzfindig, weil der Konstruktor sowieso immer so heisst wie die Klasse. Man hätte Java ja auch so konstruieren können, dass man die zwei Klammern weglassen kann. Letztlich muss ich zweimal den Klassennamen angeben.
Und dann gleich noch eine Frage in diesem Zusammenhang:
Jemand hat mir erzählt, es wäre auch folgendes möglich:
Java:
AbstractTier fury = new Pferd();
wobei ich nur Zugriff auf die Methoden der abstrakten Klasse AbstractTier hätte, nicht auf die von Pferd. Ist das richtig, und wenn ja, was soll so was? Ich dachte, man definiert Klassen gerade dann als abstrakt, wenn ich keine Objekte davon zulassen will!?
Gibt es einen speziellen Namen für so eine Anweisung?
Danke für die kommenden hilfreichen Antworten.