Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
weil die Methoden dort für das Objekt und nicht statisch definiert sind,
die entscheindende Frage ist also eher, warum die Methoden nicht statisch definiert sind,
ein häufiger Grund sind Exemplarvariablen/ Klassenattribute,
wenn du 10 oder 100 unterschiedliche Personen mit jeweils eigenen Namen im Programm vorhalten willst,
dann brauchst du unterschiedliche Objekte/ Datenträger (wie Seiten in einem Buch),
und wenn du mit diesen arbeiten willst, brauchst du entsprechende Methoden
Objekte "musst" Du gar nicht erstellen. Du kannst stattdessen auch die Methoden an den Klassen selbst aufrufen, sofern diese Methoden nicht auf Objektattribute, sondern höchstens auf Klassenattribute zugreifen. Auf Objektattribute kannst Du nur dann zugreifen, wenn Du ein Objekt erstellt hast, auf das sich die Methode dann beziehen kann; die Methode erhält dieses Objekt dann implizit als Referenz, die sich dann "this" schimpft. Klassenmethoden erhalten diese Referenz nicht.
Eine solche Klasse ohne Objektattribute und -methoden entspricht einem einem Modul in Pascal, Modula oder ANSI C. Ein Modul ist eine Definition von Daten plus Funktionen, die auf den Wertebereichen arbeiten, die die Datendefinitionen darstellen. Die Datendefinitionen sind üblicherweise eine Anzahl von Records, die Funktionen haben dann einen oder mehrere dieser Records als Parametertypen. Üblicherweise ist nur ein Teil eines Moduls als "Schnittstelle" nach außen sichtbar, d.h. es gibt auch so etwas wie Kapselung. Ein Personenmodul würde man so benutzen, dass man zunächst Speicher für die Daten reserviert, etwa als globale Variable, als lokale Variable oder in extra dafür allokiertem Speicher, und dann Funktionen aus diesem Modul mit einer Referenz auf diesen reservierten Speicher aufruft.
Code:
#include "person.h" /* Enthält Definition der Daten in Form von typedef struct tPerson {...} Person;
und void geburtstagsfunktion(Person *); */
...
Person *person;
person = (Person*) malloc (sizeof(Person)); /* Fehlerbehandlung vergessen!! ;) */
person->name = "Doofmann";
person->geburtsjahr = 1954;
geburtstagsfunktion(person);
Die Verwendung von Objekten statt Modulen denkt das grundlegende Konzept, Daten und Funktionen (Attribute und Methoden) zusammen zu behandeln, einfach zu Ende. Im modulorientierten Beispiel kann man natürlich genau so mit Personen arbeiten, wie mit Objekten auch, ob Person[100] 100 Klassen oder 100 Records bezeichnet, und ob ich die Funktionen mit implizitem Verweis darauf (this) oder mit explizitem (als Paramter) aufrufe, ist egal.
In einer objektorientierten Sprache wird man natürlich immer Objekte verwenden, und nicht künstlich Module definieren, es sei denn, das Objekte so unhandlich werden, dass Klassenmethoden besser geeignet sind. Vgl. Funktionen wie Integer.parseString() oder Konstanten von Klassen, static final int KONSTANTE=3.
Interessant wird die Verwendung von Objekten *statt Modulen/Klassenmethoden*, wenn es an Vererbung geht, was dann z.B. die Fälle abdeckt:
- Das Verhalten zweier Typen ist ähnlich, aber nicht gleich. Mit Modulen kann man eine neue Funktion schreiben, die das andere Verhalten implementiert, oder eine existierende Funktion parametrisieren, die ihr Verhalten anhand des Paramters ändert. Das Problem ist, dass der aufrufende davon wissen muss. Objekte hingegen wissen das selbst.
- Die Datendefinitionen zweier Typen sind ähnlich, aber nicht gleich. Man kann beide Varianten in den Datendefinitionen des Moduls unterbringen, und das jeweils andere ungenutzt lassen, oder ein Modul definieren, dass das andere benutzt. Es gilt das gleiche wie vorher: der Aufrufende muss wissen, womit er umgeht. Objekte wissen das selbst.
Dieses "es selbst wissen" hängt, im Fall von Methoden, als Tabelle von Funktionen am Objekt selbst, d.h. wenn ich das Objekt übergebe, übergebe ich nicht nur die Daten, sondern auch das Verhalten. Im Prinzip geht das natürlich auch mit prozeduralen Sprachen (Zeiger auf Funktionen), aber das ist so unhandlich, gefährlich und beängstigend, dass das eigentlich nur Kernel-Programmierer benutzen. Objektorientierte Sprachen machen diese Funktion erst zugänglich.
Die besonderen Eigenschaften objektorientierter Sprachen ergeben sich aus der durch das "es selbst wissen" gewonnenen Flexibilität. In einer List können alle "listbaren" Objekte unabhängig von ihrem Typ gespeichert werden. In einer List<T> können beliebige T-Typen oder von T abgeleitete Typen typsicher gespeichert werden. Methoden, die Person erwarten, funktionieren auch noch, wenn ich Mama oder Papa übergebe.
Du sollst Objekte verwenden, damit später Deine Methoden nicht geändert werden müssen, wenn ihr Verhalten leicht geändert werden soll, oder Daten oder Methoden hinzu kommen.
So, ich glaube, jetzt kannst Du Deine Bücher weiterlesen