Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmieren mit JAVA

Ähnliche Präsentationen


Präsentation zum Thema: "Programmieren mit JAVA"—  Präsentation transkript:

1 Programmieren mit JAVA
Teil III

2 Hauptbestandteile der Sprache
Token Typen Ausdrücke und Operatoren Anweisungen Klassen Methoden Schnittstellen Pakete Variablen Token: sind die Bestandteile des Java-Quellcodes,die sich in logische Einheiten zerlegen lassen und gültigen Arten zuordnen lassen (Bezeichner, Schlüsselwörter, Literale, Operatoren, Trennzeichen Typ gibt an, wie ein einfaches Objekt im Speicher des Computers dargestellt wird. (Wertebereich) Ausdrücke drücken einen Wert entweder direkt oder durch Berechnung aus oder sind Kontrollausdrücke zur Ablaufsteuerung des Programms. Bestehen aus Operanten, Operatoren und anderen Ausdrücken. Anweisungen sind Kontrollfluß oder Ausnahmeanweisungen und werden der Reihe nach ausgeführt. (Block, Deklaration, Ausdruck, Auswahl, Iteration, Sprung...) Weiter geht’s mit den Klassen in Java...

3 Klassen Eine Klassendefinition in Java wird durch das Schlüsselwort class eingeleitet. Anschließend folgt innerhalb von geschweiften Klammern eine beliebige Anzahl an Variablen- und Methodendefinitionen. Das folgende Listing ist ein Beispiel für eine einfache Klassendefinition: public class Auto { public String name; public int erstzulassung; public int leistung; } Diese Klasse enthält keine Methoden, sondern lediglich die Variablen name, erstzulassung und leistung. Eine solche methodenlose Klassendefinition entspricht dem Konzept des Verbunddatentyps aus C oder PASCAL (struct bzw. record). Die innerhalb einer Klasse definierten Variablen wollen wir im folgenden (analog zu C++) als Membervariablen bezeichnen.

4 Klasse - Deklaration Syntax:
[modifiers] class NeueKlasse [extends NamederSuperklasse] [implements NamederSchnittstelle] 4 Eigenschaften einer Klasse können in der Deklaration definiert werden: Modifier Klassenname Superklasse Schnittstellen

5 Klasse - Modifier keinen (freundliche Klasse)
können nur von Objekten eines Paketes genutzt werden public alle Objekte können auf diese Klasse zugreifen final kann nicht mehr abgeleitet werden (haben keine Subklassen) abstract von dieser Klasse wird nie eine Instanz benötigt und kann auch keine bilden, sie dient zu allgemeinen Verweisen

6 Klasse - Klassenname jede Klasse muss einen eigenen Namen haben
Regel für den Namen siehe Token man sollte sprechende Klassennamen verwenden der Name sollte mit einem Großbuchstaben beginnen, der Rest Kleinbuchstaben hat der Name mehrere Wörter, so darf kein Leerzeichen dazwischen sein Bsp.: MeineNeueKlasse

7 Klasse - Superklassen mit dem Schlüsselwort extends spezifiziert man die Klasse, auf welche die neue Klasse aufbaut die Superklasse wird durch die neue Klasse erweitert (Vererbung) Bsp.: import java.awt.Graphics; public class HelloJavaApplet extends java.applet.Applet { public void paint(Graphics g) { g.drawString("Hello Java!",5,25); }

8 Klasse - Schnittstelle
statt Mehrfachvererbung gibt es das Schnittstellenkonzept Objekte können eine beliebige Zahl davon implementieren sind Sammlungen von Methodennamen ohne konkrete Definition deshalb muss jede nichtabstrakte Klasse alle in der Schnittstelle deklarierten Methoden überschreiben

9 Objekte Um von einer Klasse ein Objekt anzulegen, muß eine Variable vom Typ der Klasse deklariert werden und ihr mit Hilfe des new-Operators ein neu erzeugtes Objekt zugewiesen werden Bsp.: Auto meinKombi; meinKombi = new Auto(); public class Auto { public String name; public int erstzulassung; public int leistung; } Die erste Anweisung ist eine normale Variablendeklaration, (Java kennt 3 Variablen: Klassenvariable, Instanzvariable und lokale Variable)wie sie aus Kapitel 4 bekannt ist. Anstelle eines primitiven Typs wird hier der Typname einer zuvor definierten Klasse verwendet. Im Unterschied zu primitiven Datentypen wird die Objektvariable meinKombi als Referenz gespeichert. Die zweite Anweisung generiert mit Hilfe des new-Operators eine neue Instanz der Klasse Auto und weist sie der Variablen meinKombi zu. In Java wird jede selbstdefinierte Klasse mit Hilfe des new-Operators instanziert. Mit Ausnahme von Strings und Arrays, bei denen der Compiler auch Literale zur Objekterzeugung zur Verfügung stellt, gilt dies auch für alle vordefinierten Klassen der Java-Klassenbibliothek. Deklaration und Instanzerzeugung kann man bei primitiven Variablen kombinieren. Auto meinKombi = new Auto();

10 Objekte Nach der Initialisierung haben alle Variablen des Objekts zunächst Standardwerte Referenztypen haben den Standardwert null, die Standardwerte der primitiven Typen können V2 entnommen werden Der Zugriff auf sie erfolgt mit Hilfe der Punktnotation Objekt.Variable Bsp.: meinKombi.name = "Mercedes 600"; meinKombi.erstzulassung = 1972; meinKombi.leistung = 250; public class Auto { public String name; public int erstzulassung; public int leistung; }

11 Objekte auch der lesende Zugriff erfolgt mit Hilfe der Punktnotation
Bsp.: System.out.println("Name : "+meinKombi.name); System.out.println("Zugelassen..: "+meinKombi.erstzulassung); System.out.println("Leistung....: "+meinKombi.leistung);

12 Methoden Methoden definieren das Verhalten von Objekten
Sie werden innerhalb einer Klassendefinition angelegt Sie haben Zugriff auf alle Variablen des Objekts Methoden sind das Pendant zu den Funktionen anderer Programmiersprachen Sie arbeiten aber immer nur mit den Variablen des aktuellen Objekts In Java gibt es keine globalen Methoden wie auch keine globale Variablen

13 Methoden - Syntax [Modifier] /* private, protected, public, static, final */ Typ Name([Parameter]) /*Typ des Rückgabewerts der Funktion, ihr Name und eine optionale Parameterliste */ { Anweisung; /* Methodenrumpf=Liste der Anweisungen, die das Verhalten der Methode festlegen */ }

14 Methode - Beispiel Beispielklasse Auto um eine Methode zur Berechnung des Alters des Auto-Objekts erweitert: public class Auto { public String name; public int erstzulassung; public int leistung; public int alter() return erstzulassung; }

15 Methode - Aufruf Der Aufruf einer Methode erfolgt ähnlich der Verwendung einer Instanzvariablen in Punktnotation Zur Unterscheidung von einem Variablenzugriff müssen zusätzlich die Parameter der Methode in Klammern angegeben werden, selbst wenn die Liste leer ist Bsp.: Auto golf1 = new Auto(); golf1.erstzulassung = 1990; System.out.println(golf1.alter()); Welcher Wert wird ausgegeben? Wie an der Definition von alter zu erkennen ist, darf eine Methode auf die Instanzvariablen ihrer Klasse zugreifen, ohne die Punktnotation zu verwenden. Das funktioniert deshalb, weil der Compiler alle nicht in Punktnotation verwendeten Variablen x, die nicht lokale Variablen sind, auf das Objekt this bezieht und damit als this.x interpretiert. Bei this handelt es sich um einen Zeiger, der beim Anlegen eines Objekts automatisch generiert wird. this ist eine Referenzvariable, die auf das aktuelle Objekt zeigt und dazu verwendet wird, die eigenen Methoden und Instanzvariablen anzusprechen. Der this-Zeiger ist auch explizit verfügbar und kann wie eine ganz normale Objektvariable verwendet werden. Er wird als versteckter Parameter an jede nicht-statische Methode übergeben. Die Methode alter hätte also auch so geschrieben werden können: public int alter() { return this.erstzulassung; }

16 Methoden - Parameter Eine Methode kann mit Parametern definiert werden
Jeder formale Parameter besteht aus einem Typnamen und dem Namen des Parameters Mehrere Parameter sind durch Kommata zu trennen Bsp.: public void printAlter(int wieoft) { while (wieoft-- > 0) { System.out.println("Alter = " + alter()); } } Alle Parameter werden in Java per call by value übergeben. Beim Aufruf einer Methode wird also der aktuelle Wert in die Parametervariable kopiert und an die Methode übergeben. Veränderungen der Parametervariablen innerhalb der Methode bleiben lokal und wirken sich nicht auf den Aufrufer aus. Das folgende Beispiel definiert eine Methode printAlter, die das Alter des Autos insgesamt wieoft mal auf dem Bildschirm ausgibt:

17 Wie oft wird in diesem Programm das Alter des Autos ausgegeben
Wie oft wird in diesem Programm das Alter des Autos ausgegeben? public class Auto { public int erstzulassung; Auto meinAuto = new Auto(); meinAuto.erstzulassung = 1990; public int alter() { return erstzulassung; } public void printAlter(int wieoft) { while (wieoft-- > 0) { System.out.println("Alter = " + alter()); } } int a = 3; auto.printAlter(a); auto.printAlter(a); }

18 Methoden - Übergabe von Objekten
Die Methode erhält keine Kopie, sondern arbeitet mit dem Originalobjekt Sollen Objekte kopiert werden, so muss dies explizit durch Aufruf der Methode clone der Klasse Object erfolgen.

19 Methoden - Rückgabe Jede Methode in Java ist typisiert
Der Typ einer Methode wird zum Zeitpunkt der Definition festgelegt und bestimmt den Typ des Rückgabewerts Dieser kann von einem beliebigen primitiven Typ, einem Objekttyp oder vom Typ void sein Die Methoden vom Typ void haben gar keinen Rückgabewert und dürfen nicht in Ausdrücken verwendet werden Hat eine Methode einen Rückgabewert, so kann sie mit Hilfe der return-Anweisung einen Wert an den Aufrufer zurückgeben Syntax: return Ausdruck; Wenn die return Anweisung ausgeführt wird, führt dies zum Beenden der Methode, und der Wert des angegebenen Ausdrucks wird an den Aufrufer zurückgegeben. Der Ausdruck muß dabei zuweisungskompatibel zum Typ der Funktion sein. Die in Kapitel 5 erläuterte Datenflußanalyse sorgt dafür, daß hinter der return-Anweisung keine unerreichbaren Anweisungen stehen und daß jeder mögliche Ausgang einer Funktion mit einem return versehen ist. Der in C beliebte Fehler, die return-Anweisung einer Funktion zu vergessen und damit einen undefinierten Rückgabewert zu erzeugen, kann in Java nicht auftreten.

20 Methoden - Überladen In Java ist es erlaubt, innerhalb einer Klasse zwei unterschiedliche Methoden mit demselben Namen zu definieren Der Compiler unterscheidet die verschiedenen Varianten anhand der Anzahl und Typisierung der Parameter Überladen von Methoden ist dann sinnvoll, wenn die gleichnamigen Methoden auch eine vergleichbare Funktionalität haben Bsp.: public int alter(String titel) { int alter = alter(); System.out.println(titel+alter); return alter; } Es ist also nicht erlaubt, zwei Methoden mit exakt demselben Namen und identischer Parameterliste zu definieren. Dabei werden auch zwei Methoden, die sich nur durch den Typ ihres Rückgabewertes unterscheiden, als gleich angesehen. Eine typische Anwendung von überladenen Methoden besteht in der Simulation von variablen Parameterlisten (die als Feature direkt in Java nicht zur Verfügung stehen). Auch, um eine Funktion, die bereits an vielen verschiedenen Stellenim Programm aufgerufen wird, um einen weiteren Parameter zu erweitern, ist es nützlich, diese Funktion zu überladen, um nicht alle Aufrufstellen anpassen zu müssen. Innerhalb dieser Methode wird der Name alter in drei verschiedenen Bedeutungen verwendet. Erstens ist alter der Name der Methode selbst. Zweitens wird die lokale Variable alter definiert, um drittens den Rückgabewert der parameterlosen alter-Methode aufzunehmen. Der Compiler kann die Namen in allen drei Fällen unterscheiden, denn er arbeitet mit der Signatur der Methode. Unter der Signatur einer Methode versteht man ihren internen Namen. Dieser setzt sich aus dem nach außen sichtbaren Namen plus codierter Information über die Reihenfolge und Typen der formalen Parameter zusammen. Die Signaturen zweier gleichnamiger Methoden sind also immer dann unterscheidbar, wenn sie sich wenigstens in einem Parameter voneinander unterscheiden.

21 Methoden - Konstruktoren
Konstruktoren sind spezielle Methoden, die bei der Initialisierung von Objekten aufgerufen werden. ~ werden als Methoden ohne Rückgabewert definiert, die den Namen der Klasse erhalten, zu der sie gehören Konstruktoren dürfen eine beliebige Anzahl an Parametern haben und können überladen werden Soll ein Objekt unter Verwendung eines parametrisierten Konstruktors instanziert werden, so sind die Argumente wie bei einem Methodenaufruf in Klammern nach dem Namen des Konstruktors anzugeben Nicht expliziet eingehen auf Default-Konstruktoren (Klasse hat überhaupt keinen Konstruktor) Verkettung von Konstruktoren (Spart Quelltext wenn man in einem Konstruktor einen anderen Aufruft)

22 Methoden - Konstruktoren
Bsp.: public class Auto { public String name; public int erstzulassung; public int leistung; public Auto(String name) { this.name = name; } Auto dasAuto = new Auto("Porsche 911"); System.out.println(dasAuto.name); } In diesem Fall wird zunächst Speicher für das Auto-Objekt beschafft und dann der Konstruktor aufgerufen. Dieser initialisiert seinerseits die Instanzvariable name mit dem übergebenen Argument "Porsche 911". Der nachfolgende Aufruf schreibt dann diesen Text auf den Bildschirm. Explizite Konstruktoren werden immer dann eingesetzt, wenn zur Initialisierung eines Objektes besondere Aufgaben zu erledigen sind. Es ist dabei durchaus gebräuchlich, Konstruktoren zu überladen und mit unterschiedlichen Parameterlisten auszustatten. Beim Ausführen der new-Anweisung wählt der Compiler anhand der aktuellen Parameterliste den passenden Konstruktor und ruft ihn mit den angegebenen Argumenten auf.

23 mehrere Konstruktoren
public class Auto { public String name; public int erstzulassung; public int leistung; public Auto(String name){ this.name = name; } public Auto(String name, int erstzulassung, int leistung) { this.name = name; this.erstzulassung = erstzulassung; this.leistung = leistung; } } Wir wollen das vorige Beispiel um einen Konstruktor erweitern, der alle Instanzvariablen initialisiert Wie können hier verschiedene Autoobjekte mit unterschiedlichen Parameterlisten im Konstruktoraufruf iniziert werden? 001 Auto dasAuto = new Auto("Porsche 911"); 002 System.out.println(dasAuto.name); 001 Auto dasAuto = new Auto("Porsche 911", 1995, 250); 003 System.out.println(dasAuto.erstzulassung); 004 System.out.println(dasAuto.leistung); Es ist dabei durchaus gebräuchlich, Konstruktoren zu überladen und mit unterschiedlichen Parameterlisten auszustatten. Beim Ausführen der new-Anweisung wählt der Compiler anhand der aktuellen Parameterliste den passenden Konstruktor und ruft ihn mit den angegebenen Argumenten auf.

24 Methoden - Destruktoren
Destruktoren werden unmittelbar vor dem Zerstören eines Objekts aufgerufen Ein Destruktor wird als geschützte parameterlose Methode mit dem Namen finalize definiert Syntax: protected void finalize() { ... } Da Java über ein automatisches Speichermanagement verfügt, kommt den Destruktoren eine viel geringere Bedeutung zu als in anderen objektorientierten Sprachen Tatsächlich garantiert die Sprachspezifikation nicht, daß ein Destruktor überhaupt aufgerufen wird. Wenn er aber aufgerufen wird, so erfolgt dies nicht, wenn die Lebensdauer des Objektes endet, sondern dann, wenn der Garbage Collector den für das Objekt reservierten Speicherplatz zurückgibt. Dies kann unter Umständen nicht nur viel später der Fall sein (der Garbage Collector läuft ja als asynchroner Hintergrundprozeß), sondern auch gar nicht. Wird nämlich das Programm beendet, bevor der Garbage Collector das nächste Mal aufgerufen wird, werden auch keine Destruktoren aufgerufen. Selbst wenn Destruktoren aufgerufen werden, ist die Reihenfolge oder der Zeitpunkt ihres Aufrufs undefiniert. Der Einsatz von Destruktoren in Java sollte also mit der nötigen Vorsicht erfolgen.

25 Weiter: Vererbung Attribute von Klassen, Methoden und Variablen
Klassen mit static-Elementen Abstrakte Klassen und Methoden Interfaces Spezielle Klassen ...


Herunterladen ppt "Programmieren mit JAVA"

Ähnliche Präsentationen


Google-Anzeigen