04.08.2013 Aufrufe

Fachhochschule Südwestfalen - Homepage von Peter Ziesche

Fachhochschule Südwestfalen - Homepage von Peter Ziesche

Fachhochschule Südwestfalen - Homepage von Peter Ziesche

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!