Fachhochschule Südwestfalen - Homepage von Peter Ziesche
Fachhochschule Südwestfalen - Homepage von Peter Ziesche
Fachhochschule Südwestfalen - Homepage von Peter Ziesche
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Einführung in die Programmierung<br />
Sommersemester 2005 – 2. Semester<br />
Das Beispiel aus der Übung<br />
Eine wichtige Aufgabe bei der Entwicklung einer Anwendung ist die Ermittlung der relevanten<br />
Daten. Eine Anwendung bildet Entitäten (z.B. Personen, Autos) der realen Welt in Software ab.<br />
Diese Entitäten haben in der Realität praktisch unendlich viele Eigenschaften. Für die<br />
Anwendung ist immer nur ein kleiner Teil dieser Eigenschaften wichtig.<br />
Für eine Kundenverwaltung sind z.B. folgende Eigenschaften wichtig:<br />
Name, Vorname, Adresse, Kunden-Nummer, Typ (Privat- oder Geschäftskunde)<br />
Ein konkreter Kunde, z.B. Tina Meier, wird in Java durch ein Objekt dargestellt. Für jeden<br />
Kunden wird existiert ein separates Objekt. Das Objekt repräsentiert den Kunden und speichert<br />
die relevanten Eigenschaften.<br />
Alle Kunden haben, obwohl es sich um individuelle Menschen handelt, aus Sicht der<br />
Kundenverwaltung die gleichen Eigenschaften. Um nicht für jeden Kunden getrennt diese<br />
Eigenschaften beschreiben zu müssen, entwickelt man eine Schablone, in der die gemeinsamen<br />
Eigenschaften aller Kunden beschrieben sind. Diese Schablone wird in Java Klasse genannt.<br />
Alle Kunden-Objekte werden mit Hilfe der einheitlichen Schablone (Klasse) erzeugt, haben also<br />
alle die gleichen Eigenschaften. Jedes Kunden-Objekt hat aber individuelle Werte für die<br />
einzelnen Eigenschaften. Jeder Kunde hat einen Namen, aber dieser Name ist bei jedem Kunden<br />
anders.<br />
public class Kunde<br />
{<br />
String Name;<br />
String Vorname;<br />
String Adresse;<br />
int KundenNr;<br />
boolean IstFirmenkunde;<br />
}<br />
<strong>Fachhochschule</strong> <strong>Südwestfalen</strong><br />
<strong>Peter</strong> <strong>Ziesche</strong><br />
E-Mail: mail@peterziesche.de<br />
Anstelle <strong>von</strong> „Eigenschaft“ werden auch die Begriffe „Attribut“, „Merkmal“ oder „Feld“ (Javaspezifisch)<br />
verwendet. Die entsprechenden englischen Begriffe lauten „property“, „attribute“,<br />
„feature“ und „field“. Eigenschaften sind in Java Variablen, die zu einer Klasse gehören. Wie<br />
bei Variablen üblich, haben sie immer einen Typ. Ergibt an, welche Werte in der Eigenschaft<br />
gespeichert werden können.<br />
Von der Klasse Kunde können Objekte erzeugt und die Eigenschaften mit Werten gefüllt<br />
werden. Anschließend können die Kundendaten auf dem Bildschirm angezeigt werden. Dies<br />
erfolgt am besten in der main()-Methode, mit der jedes Java-Programm startet. Die main()-<br />
Methode kann in die Klasse Kunde geschrieben werden oder alternativ in einer anderen Klasse<br />
stehen.
public static void main( String[] args )<br />
{<br />
//erstes Kundenobjekt anlegen<br />
Kunde kunde1 = new Kunde();<br />
kunde1.Name = "Meier";<br />
kunde1.Vorname = "Tina";<br />
kunde1.Adresse = "Markstr.";<br />
kunde1.KundenNr = 312416;<br />
kunde1.IstFirmenkunde = false;<br />
}<br />
//zweites Kundenobjekt anlegen<br />
Kunde kunde2 = new Kunde();<br />
kunde2.Name = "Schmidt";<br />
kunde2.Vorname = "Thomas";<br />
kunde2.Adresse = "Wittener Str.";<br />
kunde2.KundenNr = 468256;<br />
kunde2.IstFirmenkunde = true;<br />
//Kundendaten ausgeben<br />
System.out.println( "Kunde: " + kunde1.Vorname +<br />
" " + kunde1.Name );<br />
System.out.println( "Kunde: " + kunde2.Vorname +<br />
" " + kunde2.Name );<br />
Der lesende oder schreibende Zugriff auf die Eigenschaften eines Objekts erfolgt in Java und in<br />
vielen anderen objektorientierten Programmiersprachen über die Punkt-Notation:<br />
Objekt.Eigenschaft = Wert (schreibender Zugriff)<br />
Objekt.Eigenschaft (lesender Zugriff)<br />
Durch die Ausführung der main()-Methode werden im Arbeitsspeicher des Rechners Objekte<br />
angelegt. Die prinzipielle Struktur sieht so aus (die Namen der Objekte sind willkürlich<br />
gewählt):<br />
:Kunde<br />
Name = "Meier"<br />
Vorname = "Tina"<br />
Adresse = "Markstr."<br />
KundenNr = 312416<br />
Ist Firmenkunde = false<br />
:Kunde<br />
Name = "Schmidt"<br />
Vorname = "Thomas"<br />
Adresse = "Wittener Str."<br />
KundenNr = 468256<br />
Ist Firmenkunde = true<br />
kunde1 kunde2<br />
Die beiden lokalen Variablen kunde1 und kunde2 haben als Typ die Klasse Kunde. Sie sind<br />
Referenz-Variablen, d.h. sie enthalten keine Werte, sondern den Speicherort eines Objekts. Alle<br />
Variablen, die als Typ eine Klasse haben, sind in Java Referenz-Variablen. Über sie kann mit<br />
der Punkt-Notation auf die Eigenschaften des referenzierten Objekts zugegriffen werden. Eine<br />
Variable, deren Typ keine Klasse ist, z.B. int, heißt einfache Variable oder Wert-Variable. Sie<br />
speichert direkt einen Wert. Da die Eigenschaften einer Klasse Variablen sind, gilt auch für sie<br />
die Unterteilung in einfache Eigenschaften und Referenz-Eigenschaften.<br />
Neben Eigenschaften können Klassen auch Methoden enthalten. Für die Klasse Kunde soll eine<br />
Methode erhalten, die die Anschrift des Kunden zurückliefert.
String getAnschrift()<br />
{<br />
String anschrift;<br />
if( IstFirmenkunde )<br />
{<br />
anschrift = „Firma\n“;<br />
}<br />
else<br />
{<br />
anschrift = "Herr/Frau";<br />
}<br />
anschrift = anschrift + Vorname + „ „ + Name + „\n“;<br />
anschrift = anschrift + Adresse;<br />
}<br />
return anschrift;<br />
Die Methode hat den Typ String (Zeichenkette), d.h. sie muss als Ergebnis einen String<br />
zurückliefern. Dazu wertet sie zunächst die Eigenschaft IstFirmenkunde aus und definiert<br />
die Anschrift unterschiedlich für Firmen- und Privatkunden. Die anderen Eigenschaften für die<br />
Anschrift werden an die Anschrift angehängt (Fachausdruck: konkateniert). Das Steuerzeichen<br />
\n innerhalb einer Zeichenkette steht für einen Zeilenumbruch.<br />
Die Methode getAnschrift() kann, da sie zur Klasse Kunde gehört, direkt auf die<br />
Eigenschaften der Klasse zugreifen. Sie können wie lokale Variablen benutzt werden. Das<br />
Lesen und Schreiben der Eigenschaften erfolgt unabhängig <strong>von</strong> einem konkreten Objekt. Erst<br />
beim Aufruf der Methode wird festgelegt, <strong>von</strong> welchem Objekt die Eigenschaften verwendet<br />
werden sollen, also <strong>von</strong> welchem Kunden die Anschrift ausgegeben werden soll.<br />
System.out.println( "Anschrift: " + kunde1.getAnschrift() );<br />
System.out.println( "Anschrift: " + kunde2.getAnschrift() );<br />
Die Anwendung zur Kundenverwaltung soll nun so erweitert werden, dass auch Produkte und<br />
Verkäufe verwaltet werden können. Dazu werden zwei weitere Klassen geschrieben.<br />
public class Produkt<br />
{<br />
int ProduktNr;<br />
String Bezeichnung;<br />
}<br />
public class Verkauf<br />
{<br />
Kunde Kaeufer;<br />
Produkt Artikel;<br />
int Anzahl;<br />
}<br />
Die Klasse Produkt hat zwei Eigenschaften, beide haben einfache Typen (String und int).<br />
Ein Verkauf speichert neben der Anzahl der verkauften Artikel die Information, welcher Kunde<br />
welches Produkt gekauft hat. Die beiden Eigenschaften Kaeufer und Artikel haben als<br />
Typen die Klasse Kunde bzw. die Klasse Produkt. Sie sind Referenz-Eigenschaften.
Als Beispiel sollen ein Auto als Produkt und zwei Verkäufe erzeugt werden. Die Kunden Tina<br />
Meier soll ein Auto kaufen, der Kunde Thomas Schmidt fünf Autos. Der folgende Code gehört<br />
in die main()-Methode.<br />
Produkt auto = new Produkt();<br />
auto.ProduktNr = 3579;<br />
auto.Bezeichnung = "Auto";<br />
Verkauf v1 = new Verkauf();<br />
v1.Kaeufer = kunde1;<br />
v1.Artikel = auto;<br />
v1.Anzahl = 1;<br />
Verkauf v2 = new Verkauf();<br />
v2.Kaeufer = kunde2;<br />
v2.Artikel = auto;<br />
v2.Anzahl = 5;<br />
Nach der Ausführung dieser Anweisungen ergibt sich folgendes Bild im Speicher:<br />
:Kunde<br />
Name = "Meier"<br />
Vorname = "Tina"<br />
Adresse = "Markstr."<br />
KundenNr = 312416<br />
Ist Firmenkunde = false<br />
v1<br />
:Kunde<br />
Name = "Schmidt"<br />
Vorname = "Thomas"<br />
Adresse = "Wittener Str."<br />
KundenNr = 468256<br />
Ist Firmenkunde = true<br />
kunde1 kunde2<br />
:Verkauf<br />
Kaeufer =<br />
Artikel =<br />
Anzahl = 1<br />
:Produkt<br />
auto<br />
ProduktNr = 3579<br />
Bezeichnung = "Auto"<br />
Auf ein Objekt können mehrere Referenz-Variablen gleichzeitig zeigen. Auf das Produkt-<br />
Objekt zeigen z.B. die lokale Variable auto und die beiden Eigenschaften v1.Artikel und<br />
v2.Artikel. Alle Referenzen sind gleichwertig. Das Abfragen oder Verändern einer<br />
Eigenschaft kann über irgendeine der Referenzen erfolgen. Um die Bezeichnung des Produkts<br />
auszugeben, sind die drei folgenden Zeilen gleichermaßen geeignet:<br />
System.out.println( auto.Bezeichnung );<br />
System.out.println( v1.Artikel.Bezeichnung );<br />
System.out.println( v2.Artikel.Bezeichnung );<br />
:Verkauf<br />
Kaeufer =<br />
Artikel =<br />
Anzahl = 1<br />
Wie man sieht, lässt sich der Zugriff auf Eigenschaften mit der Punkt-Notation beliebig oft<br />
hintereinander ausführen. Die Variable v1 zeigt auf ein Objekt. Über die Punkt-Notation wird<br />
auf die Eigenscahft Artikel zugegriffen. Dieses ist eine Referenz auf ein Produkt-Objekt.<br />
Also kann durch nochmalige Anwendung der Punkt-Notation auf die Eigenschaften des<br />
Produkts zugegriffen werden.<br />
Das Objekt und seine Eigenschaften sind nur einmal im Speicher vorhanden. Eine Veränderung<br />
<strong>von</strong> Eigenschaften über eine Referenz ist also anschließend <strong>von</strong> allen Referenzen aus sichtbar.<br />
Die folgenden Zeilen geben einmal Auto und einmal Porsche auf dem Bildschirm aus:<br />
v2
System.out.println( v2.Artikel.Bezeichnung );<br />
v1.Artikel.Bezeichnung = "Porsche";<br />
System.out.println( auto.Bezeichnung );<br />
Manipulation <strong>von</strong> Referenzen<br />
Referenz-Eigenschaften kann ein neuer Wert zugewiesen werden. Sie zeigen dann auf ein<br />
anderes Objekt. Der zweite Verkauf soll z.B. statt <strong>von</strong> Tina Meier <strong>von</strong> Thomas Schmidt getätigt<br />
werden. In der main()-Methode kann man einfach schreiben:<br />
v1.Kaeufer = kunde2;<br />
Dadurch werden die beiden Objekte nicht verändert. Es wird nur die Referenz-Eigenschaft<br />
Kaeufer verändert. Sie zeigt auf ein anderes Objekt. Das Speicherbild sieht danach wie folgt<br />
aus:<br />
:Kunde<br />
Name = "Meier"<br />
Vorname = "Tina"<br />
Adresse = "Markstr."<br />
KundenNr = 312416<br />
Ist Firmenkunde = false<br />
v1<br />
:Kunde<br />
Name = "Schmidt"<br />
Vorname = "Thomas"<br />
Adresse = "Wittener Str."<br />
KundenNr = 468256<br />
Ist Firmenkunde = true<br />
kunde1 kunde2<br />
:Verkauf<br />
Kaeufer =<br />
Artikel =<br />
Anzahl = 1<br />
:Produkt<br />
auto<br />
ProduktNr = 3579<br />
Bezeichnung = "Porsche"<br />
v2<br />
:Verkauf<br />
Kaeufer =<br />
Artikel =<br />
Anzahl = 1