Liste P: Programmieren mit Java WS 2001/2002 Prof. Dr. V. Turau FH Wiesbaden Kapitel 3: Klassen und Objekte Folie 25 : Beispiel: Klasse Rechteck package fhw; public class Rechteck { private int länge, breite; public Rechteck(int l, int b) { länge = l; breite = b; } public int getFläche() { return länge * breite; } Folie 26 : Beispiel: Klasse Rechteck (Forts.) public static void main(String[] a) { Rechteck r1 = new Rechteck(4,3); Rechteck r2 = new Rechteck(2,3); System.out.println("Fläche r1: " + r1.getFläche()); System.out.println("Fläche r2: " + r2.getFläche()); } } Übersetzung: javac -d classes fhw/Rechteck.java Ausführung: java fhw.Rechteck Fläche r1: 12 Fläche r2: 6 Folie 27 : Typen und Werte Jede Variable hat einen Typ. Zulässige Typen sind: Primitive Typen Array-Typen Klassen-Typen Interface-Typen Zulässige Werte sind: Primitive Werte Referenzen Folie 28 : Primitive Typen Typname Speicherplatz Wertebereich Default-Wert byte 8 Bit -128.....127 (byte)0 short 16 Bit -215.....215-1 (short)0 int 32 Bit -231.....231-1 0 long 64 Bit -263.....263-1 0L float 32 Bit IEEE 754 floating-point 0.0f double 64 Bit IEEE 754 floating-point 0.0d char 16 Bit Unicode ’\u0000’ true, false false boolean Folie 29 : Primitive Typen Primitive Werte sind keine Objekte Es gibt keine Referenzen auf primitive Werte Die von C her bekannten Operatoren stehen zur Verfügung Für jeden primitiven Typ gibt es im Paket java.lang auch eine Klasse (z.B. Integer, Float etc.) Beispiel: Die Klasse Float Float.MAX_VALUE static float parseFloat(String s) Folie 30 : Klassenvereinbarung Folie 31 : Instanz- und Klassenvariablen Instanzvariablen: Jede Instanz einer Klasse hat eigene Werte für jede Instanzvariable Die Werte der Instanzvariablen eines Objektes beschreiben den Zustand des Objektes Klassenvariablen: Klassenvariablen heißen auch statische Variablen Schlüsselwort static Eine Instanzvariable hat pro Klasse einen Wert Die Werte der Klassenvariablen beschreiben Eigenschaften der Klasse Folie 32 : Instanz- und Klassenvariablen (Beispiel) public class Mitarbeiter { public static int anzahl; public String name; public Mitarbeiter(String n) { anzahl++; name = n; } public static void main(String[] a) { Mitarbeiter m1 = new Mitarbeiter("Schmidt"); Mitarbeiter m1 = new Mitarbeiter("Bender"); // m1.anzahl==m1.anzahl=Mitarbeiter.anzahl==2 // m1.name=="Schmidt" m2.name=="Bender" } } Folie 33 : Konstruktoren Bei der Erzeugung eines Objektes werden die Instanzvariablen initialisiert Werden keine Werte angegeben, so bekommen Variablen Defaultwerte zugewiesen (Defaultwert für Referenzen: null) Klassenvariablen werden schon beim Laden der Klasse initialisiert Objekte müssen immer mit Konstruktoren erzeugt werden Konstruktoren haben den gleichen Namen wie die Klasse Java hat eine automatische Freispeicherverwaltung (Garbage Collection), d.h. keine Destruktoren Folie 34 : Konstruktoren (Beispiel) public class Rechteck { public int länge, breite; public static void main(String[] a) { Rechteck r = new Rechteck(); // r.länge = r.breite = 0 } } Der Konstruktor ohne Argumente heißt Defaulkonstruktor Wird kein eigener Konstruktor vereinbart, so stellt Java folgenden Defaultkonstruktor zur Verfügung: public Klassenanme() { super();} Folie 35 : Konstruktoren Benutzer können eigene Konstruktoren vereinbaren Konstruktoren können beliebig viele Parameter haben, sie haben keinen Rückgabetyp public class Rechteck { public int länge, breite; public Rechteck(int l, int b) { länge = l; breite = b; } public static void main(String[] a) { Rechteck r = new Rechteck(); // falsch!! } } Folie 36 : Konstruktoren Konstruktoren können andere Konstruktoren der Klasse aufrufen Konstruktoren sollten keinen redundaten Code enthalten public class Rechteck { public int länge, breite; public String farbe; public Rechteck(int l, int b, String f) { länge = l; breite = b; farbe = f; } public Rechteck(int l, int b) { this(l, b, "blau"); } } Folie 37 : Konstruktoren Konstruktor aufrufen: der Oberklasse: super(Parameter,..) der eigenen Klasse: this(Parameter,..) Diese Aufrufe müssen als erstes in einem Konstruktor erfolgen public class Rechteck { public int länge, breite; public Rechteck(int l, int b, String f) { länge = l; super(); //falsch!! } } Folie 38 : Konstruktoren Objekte entstehen nur durch Konstruktoren Implizite Aufrufe von Konstruktoren gibt es nicht public class Rechteck { public static void main(String[] s) { Rechteck r; //r hat keinen Wert r.getFläche(); //falsch!! Rechteck r2 = 3; //falsch!! } } Folie 39 : Methoden Methoden implementieren die Funktionalität einer Klasse Die enthaltenen Anweisungen verändern den Zustand eines Objektes Instanzvariablen einer Klassen sollten nicht nach außen sichtbar sein Methoden zum Lesen/Schreiben von Instanzvariablen anbieten Zugriffsmethoden Folie 40 : Methoden (Beispiel) public class Rechteck { protected int länge, breite; public int getLänge() { return länge; } public void setLänge(int länge) { this.länge = länge; } public int getBreite() { return breite; } ... Folie 41 : Zugriffsmethoden Namen von Zugriffsmethoden durch Java-Namenskonventionen festgelegt Variable name mit Typ T: Lesemethode: public T getName() Schreibmethode: public void setName(T name) Boolsche-Variable name: public boolean isName() Feldvariable name vom Typ T[]: public T getName(int i) public T[] getName() public void setName(int i, T t) Folie 42 : Aufruf von Methoden referenz.methodenName(Param1, Param2..) Voraussetzung: ist Instanz einer Klasse, welche eine Methode mit Namen methodenName implementiert, deren Parameteranzahl und -typen mit den Aufrufparametern übereinstimmt. Signatur einer Methode Die Anweisungen in methodenNamen werden für das Objekt referenz ausgeführt Call-by-Value referenz Folie 43 : Aufruf von Methoden (Beispiel) public class Rechteck { public static void main(String[] a) { setBreite(4); // falsch, wer ist Empfänger? R r1 = new Rechteck(3,4); R r2 = new Rechteck(); r1.setLänge(2); r2.setLänge(r1.getLänge()); } } Folie 44 : Aufruf von Methoden (Beispiel) public class Rechteck { ..... public halbiere() { this.setBreite(getBreite()/2); this.setLänge(getLänge()/2); } //Dies ist gleichbedeutent mit: public halbiere() { breite /= 2; länge /= 2; } Folie 45 : Aufruf von Methoden (Beispiel) public class Rechteck { ..... //Kürzere Schreibweise public halbiere() { setBreite(getBreite()/2); setLänge(getLänge()/2); } Wird kein Empfänger explizit angegeben, so ist this der Empfänger In statischen Methoden gibt es kein this!! Folie 46 : Aufruf von Methoden (Beispiel) package java.util; public class Stack extends Vector { public Object pop() { int len = size(); Object obj = peek(); removeElementAt(len - 1); return obj; } ... Folie 47 : Überladen von Methoden Haben zwei Methoden einer Klasse den gleichen Namen, aber unterschiedliche Parameterlisten, so heißt die Methode überladen. Beispiel aus der Klasse java.awt.Container Component add(Component comp) Component add(Component comp, int i) void add(Component comp, Object constraints) void add(Component comp, Object constraints, int i) Component add(String name, Component comp) In Java können Operatoren nicht überladen werden. Folie 48 : Klassenmethoden Klassenmethoden werden nicht im Kontext eines Objektes ausgeführt Sie haben Zugriff auf Klassenvariablen Sie haben keinen Zugriff auf this Aufruf: Klassenname.methodenName(...) referenz.methodenName(...) (aufgerufen referenz) wird die Klassenmethode der Klasse von Folie 49 : Die Klassenmethode main public static void main(String[] a) Sie wird bei Programmstart von der Laufzeitungebung aufgerufen, der Parameter a enthält die Kommandozeilenparameter Beispiel: java fhw.Beispiel a 42 Honey a[0] = "a", a[1] = "42", a[1] = "Honey" Unterschied zu C: int main(int argc, char **argv) Was ist argv[0]? Warum braucht man argc in Java nicht? Folie 50 : Die Klassenmethode main Beliebter Fehler: public class Rechteck { public static void main(String[] a) { setBreite(4); // falsch, wer ist Empfänger? } } In Klassenmethoden gibt es kein this, d.h. Instanzmethoden müssen explizit an Objekt geschickt werden! Folie 51 : Verwendung von Klassenmethoden (Beispiel) package java.lang; public final class Math { public static final double E = 2.7182818284590452; public static final double PI = 3.141592653589793; public static int abs(int a) { return (a < 0) ? -a : a; } public static native double sqrt(double a); ... Verwendung: double w = Math.sqrt(Math.E); Folie 52 : Felder Felder sind in Java Objekte Vereinbarung: int[] x; Verwendung: x = new int[4]; Initialisierung: String[] s = {"Köln", Hamburg", "Ulm"}; Mehrdimensionale Felder Beispiel: int arr[][] = new int[4][5]; Beispiel: Dreiecksmatrix: int arr[][] = new int[4][]; for (int i = 0; i < 4; i++) arr[i] = new int[i + 1]; Folie 53 : Felder Alle Felder haben eine Instanzvariable length Anwendung: public static void main(String[] a) { for (int i = 0; i < a.length; i++) System.out.println( "Parameter " + i + ": " + a[i]); } Beliebter Fehler: String[] a = ...; a.lenth(); String a = ...; a.length;