Standard Erzeugen einer Klasse aus der Klassenbibliothek

Objektorientierte Programmiersprache auf Basis einer virtuellen Maschine (https://www.oracle.com/java/)
paul1234
Beiträge: 13
Registriert: Di Jun 02, 2015 6:16 am

Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von paul1234 » Di Jun 16, 2015 7:37 am

hallo,
ich arbeite mich gerade durch das Buch 'Java ist auch eine Insel'. Und da stoße ich auf ein Verständnisproblem:
im Absatz '3.4.1 Ein Exemplar einer Klasse mit dem new-Operator anlegen' wird eine Klasse (Point) aus der Standartbibliothek benutzt.
Meine Frage: ich gehe mal davon aus dass man diese Klasse nicht überschreiben bzw. verändern darf/kann. Also müßte man eine eigene abgeleitete Klasse erzeugen, die dann einen anderen Namen erhalten muß. In dem Beispiel wird aber der in der Standartbibliothek verwendet:

Code: Alles auswählen

new java.awt.Point();
Sehe ich das falsch?
ok, dann mal weiter: was mich dann weiter verwirrt: unter Punkt 3.4.3 steht dann:
Deklariere die Variable p vom Typ java.awt.Point. Die Variable p nimmt anschließend die Referenz von dem neuen Objekt auf, das mit new angelegt wurde.

Code: Alles auswählen

java.awt.Point p;
p = new java.awt.Point();
Zeile 1 deute ich so: abgeleitete neue Klasse p von java.awt.Point
Zeile 2: neues Objekt p (mit dem gleichen Namen wie in Zeile 1?) von Klasse p?

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von mfro » Di Jun 16, 2015 8:26 am

Du mußt dir den Unterschied zwischen Klassen und Objekten klarmachen. Eine Klasse ist zunächst nur eine Definition eines "Rahmens" bzw. einer "Behandlungsvorschrift" für ein Objekt. Mithilfe dieses "Rahmens" kann man beliebig viele Instanzen von Objekten anlegen (=instanzieren), die alle gleich funktionieren.

Code: Alles auswählen

java.awt.Point p;
Das hier erzeugt noch keine Instanz (=Objekt). Du definierst lediglich eine Variable p, die ein Objekt der Klasse java.awt.Point referenzieren (speichern) kann. Das Objekt gibt es zu diesem Zeitpunkt im Programm noch nicht (p enthält hier lediglich "null", referenziert also nichts).

Code: Alles auswählen

p = new java.awt.Point();
Das hier erzeugt (=instanziert) ein Objekt (=eine Instanz) der Klasse java.awt.Point und legt die Referenz darauf in der Variable p ab. Du kannst dieses Objekt nicht "direkt" anfassen, sondern immer nur indirekt über seine Referenz (=p).

Mit abgeleiteten Klassen hat das nichts zu tun.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

paul1234
Beiträge: 13
Registriert: Di Jun 02, 2015 6:16 am

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von paul1234 » Di Jun 16, 2015 8:30 am

Aber wieso kann man für beide (Variable + Objekt) den gleichen Namen ('p') benutzen? Es sind doch 2 verschiedene Dinge

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von mfro » Di Jun 16, 2015 11:22 am

paul1234 hat geschrieben:Aber wieso kann man für beide (Variable + Objekt) den gleichen Namen ('p') benutzen? Es sind doch 2 verschiedene Dinge
Die Variable enthält die Referenz auf das Objekt. Die erste Zeile ist nur die Definition der Variablen, die zweite die Zuweisung der Referenz. Falls es für dich einfacher zu verstehen ist, das kann man auch in einer Zeile hinschreiben (für Java macht das keinen Unterschied):

Code: Alles auswählen

java.awt.Point p = new java.awt.Point();
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von Xin » Di Jun 16, 2015 4:34 pm

paul1234 hat geschrieben:
Deklariere die Variable p vom Typ java.awt.Point. Die Variable p nimmt anschließend die Referenz von dem neuen Objekt auf, das mit new angelegt wurde.

Code: Alles auswählen

java.awt.Point p;
p = new java.awt.Point();
Zeile 1 deute ich so: abgeleitete neue Klasse p von java.awt.Point
Zeile 2: neues Objekt p (mit dem gleichen Namen wie in Zeile 1?) von Klasse p?
Hmm... p ist ein Name für etwas etwas Speicherplatz, wo man sich merkt, wo ein java.awt.Point stehen könnte. Da steht nicht der Punkt, sondern nur die Info, wo man den Punkt im Computer findet.
In dem Moment ist da aber noch keine Info, welchen Punkt Du meinst.
Mit new java.awt.Point(); erzeugst Du einen neuen Punkt und dieser Ausdruck ("new java.awt.Point()") liefert die Position des neuen Points zurück. Diese Position merkst Du Dir dann an dem Speicherplatz, den Du im Programm "p" genannt hast.

Der Klassenname vor "p" besagt, dass der Name "p" auf einen Punkt zeigt und nicht etwa auf eine Linie.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paul1234
Beiträge: 13
Registriert: Di Jun 02, 2015 6:16 am

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von paul1234 » Di Jun 16, 2015 5:11 pm

hm, ich denke, ich habe mein Verständnisproblem nicht richtig rüber gebracht. So wie ich das bisher kenne:
1. Klasse definieren
2. Objekt definieren u. deklarieren
3. Prozeduren u. Funktionen für das Objekt definieren u. deklarieren
ist dieser zeitliche Ablauf bei Java anders? An welcher stelle definiere ich namentlich ein Objekt?
Das hier eine Referenz zur Speicherreservierung für das Objekt gemacht wird bzw. gemacht werden muß, ist mir schon klar. Aber was ist mit meinem 2.Punkt? Referenz u. Objekt sind doch 2 verschiedene Sachen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von Xin » Di Jun 16, 2015 5:24 pm

paul1234 hat geschrieben:hm, ich denke, ich habe mein Verständnisproblem nicht richtig rüber gebracht. So wie ich das bisher kenne:
1. Klasse definieren
2. Objekt definieren u. deklarieren
3. Prozeduren u. Funktionen für das Objekt definieren u. deklarieren
ist dieser zeitliche Ablauf bei Java anders? An welcher stelle definiere ich namentlich ein Objekt?
Naja, üblicherweise arbeitest Du ja nicht nur mit einem Objekt. Die Idee objektorientierter Programmierung ist ja eher, dass die Objekte miteinander interagieren.

Nehmen wir an, dass Du nur ein kleines Programm hast. Dann gibt's quasi gar kein Objekt, sondern nur die Deklaration der Klasse mit der statischen Funktion main(), die dann alle statischen Funktionen aufrufen kann.

java.awt.point() musst Du ja nicht mehr als Klasse definieren. Die klasse holst Du Dir ja von java ins Programm via using, require, oder was immer in Java das #include ersetzt - ich hab's vergessen.

Prozeduren und Funktionen für eine Klasse nennt man "Methoden" und die definierst Du da, wo die Klasse auch definiert wird.
paul1234 hat geschrieben:Das hier eine Referenz zur Speicherreservierung für das Objekt gemacht wird bzw. gemacht werden muß, ist mir schon klar. Aber was ist mit meinem 2.Punkt? Referenz u. Objekt sind doch 2 verschiedene Sachen
Die Ableitungen funktionieren ähnlich wie in C++ (vielleicht schreibst Du ein wenig von Deinem Background, damit man eventuell nachvollziehen kann, in welche Richtung Du denkst und wie man Dich auf den richtigen Weg bringt. Prozeduren klingt etwas nach Pascal!?)

Code: Alles auswählen

class MyPoint : java.awt.Point
{
  public void meineMethode(void) {}
};
Ansonsten muss ich Dich bitten, genauer zu erklären, was Du vor hast. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paul1234
Beiträge: 13
Registriert: Di Jun 02, 2015 6:16 am

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von paul1234 » Di Jun 16, 2015 8:03 pm

Xin hat geschrieben:vielleicht schreibst Du ein wenig von Deinem Background, damit man eventuell nachvollziehen kann, in welche Richtung Du denkst und wie man Dich auf den richtigen Weg bringt. Prozeduren klingt etwas nach Pascal!?)
paul1234 hat geschrieben:fast richtig: VB + VB.Net-> FI Anwendungsentwickler. mache das aber seit 9 Jahren nur noch neben bei. Jetzt, mit etwas mehr Zeit will ich wieder mehr tun
Xin hat geschrieben:Ansonsten muss ich Dich bitten, genauer zu erklären, was Du vor hast. :-)
durch das Buch 'Java ist auch eine Insel' bin ich auf dieses Verständnisproblem gestoßén. Mir ist schon klar, dass in diesem Beispiel eine vorhandene Klassenbibliothek benutzt wird u. darum geht es eigentlich nicht. Sondern darum, ob es einen Unterschied im Programmcode zwischen 'Objekt' u. 'Refernz' gibt.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von Xin » Di Jun 16, 2015 10:31 pm

paul1234 hat geschrieben:
Xin hat geschrieben:Ansonsten muss ich Dich bitten, genauer zu erklären, was Du vor hast. :-)
durch das Buch 'Java ist auch eine Insel' bin ich auf dieses Verständnisproblem gestoßén. Mir ist schon klar, dass in diesem Beispiel eine vorhandene Klassenbibliothek benutzt wird u. darum geht es eigentlich nicht. Sondern darum, ob es einen Unterschied im Programmcode zwischen 'Objekt' u. 'Refernz' gibt.
Hier kann ich mit einem klaren Vielleicht antworten :-)
Aber hier ist schon ein wenig die Frage, wie man Objekt definiert und wie man man Java verstehen möchte.
Ein Objekt ist eigentlich ein Datenobjekt. In Java unterscheidet man zwischen Primitiven und Klasseninstanzen, die sich unterschiedlich verhalten. Aber auch eine Referenz ist ein quasi ein Datum - also auch ein Objekt.
Objekt ist also ein recht schwammiger Begriff. Häufig wird Objekt mit Klasseninstanz gleichgesetzt.

Ein Primitiv ist ein Objekt, das grundsätzlich kopiert wird. Das sind vorrangig char, int und double.

Eine Klasseninstanz ist ein Objekt, dass nicht kopiert wird, sondern auf das man nur eine Referenz speichern kann. Das ist schon alleine deswegen notwendig, damit der Garbage-Collector Dir nicht verraten muss, wo das Objekt eigentlich liegt.

Jeder Identifier (Variablenname) ist also entweder ein kopiertes Primitiv oder eine zu kopierende Referenz, aber niemals eine Klasseninstanz.

Da eine Referenz in Java aber nur auf eine Klasseninstanz, was häufig als Objekt bezeichnet wird, zeigen kann oder eben nicht (Null-Pointer), könnte man eine Referenz in Java auch als optionales Objekt bezeichnen. Entweder zeigt die Referenz auf ein Objekt, dann ist es das Ding, was dem Objekt entspricht oder es ist ein Null-Zeiger, der eben dem Null-Objekt entspricht, welches signalisiert, dass das Objekt ungültig ist.
Entsprechend ist die Unterscheidung in Java durchaus deutlich, aber in der täglichen Anwendung von Java eigentlich semantisch unerheblich, weil es die keine Alternative gibt, an Klasseninstanzen/Objekte zuzugreifen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paul1234
Beiträge: 13
Registriert: Di Jun 02, 2015 6:16 am

Re: Standard Erzeugen einer Klasse aus der Klassenbibliothek

Beitrag von paul1234 » Mi Jun 17, 2015 5:49 am

ok, ich denke mal ich hab's begriffen. auch wenn der ursprüngliche Threadtitel nicht optimal gewählt wurde. Oder ich hätte dann irgend wann einen neuen Thread mit dem Titel 'Erschaffung + Benutzung von Objekten' aufmachen müssen.
mit gerafft meine ich:
¹.

Code: Alles auswählen

ClassA xyz
//definiert ein Objekt (eine Ableitung von Klasse 'ClassA' mit dem Namen 'xyz'
2.

Code: Alles auswählen

ClassA xyz = new ClassA();
//hier wird aus dem Objekt eine Refernzvariable, die auf den Speicherort der Daten, die das Objekt erhält, zeigt
ist das so jetzt ok? Und sind euch Situationen bekannt, in denen es zwar zur Ableitung eines Objektes (1.), aber nicht zur Initialisierung der Referenzvariablen (2.) kommt?
Gruß paul!

Antworten