Programmieren mit JAVA Teil III Hauptbestandteile der Sprache • • • • • • • • • Token Typen Ausdrücke und Operatoren Anweisungen Klassen Methoden Schnittstellen Pakete Variablen 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; } 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 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 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 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); } } 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 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.: public class Auto Auto meinKombi; meinKombi = new Auto(); Auto meinKombi = new Auto(); { public String name; public int erstzulassung; public int leistung; } 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 public class Auto • Bsp.: meinKombi.name = "Mercedes 600"; meinKombi.erstzulassung = 1972; meinKombi.leistung = 250; { public String name; public int erstzulassung; public int leistung; } 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); 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 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 */ } 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 1999 - erstzulassung; } } 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? 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()); } } • 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 1999 - erstzulassung; } public void printAlter(int wieoft) { while (wieoft-- > 0) { System.out.println("Alter = " + alter()); } } int a = 3; auto.printAlter(a); auto.printAlter(a); } 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. 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; 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; 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 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); } mehrere Konstruktoren public class Auto public String public int public int { name; erstzulassung; 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; } } 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 Weiter: • • • • • • • Vererbung Attribute von Klassen, Methoden und Variablen Klassen mit static-Elementen Abstrakte Klassen und Methoden Interfaces Spezielle Klassen ...